From b1cefa94e5d4a16cce2ba6773ab94f0594fdcd5a Mon Sep 17 00:00:00 2001 From: Labrys of Knossos Date: Mon, 28 Nov 2022 05:59:32 -0500 Subject: [PATCH] Update vendored windows libs --- libs/win/autocommand/__init__.py | 27 + libs/win/autocommand/autoasync.py | 142 + libs/win/autocommand/autocommand.py | 70 + libs/win/autocommand/automain.py | 59 + libs/win/autocommand/autoparse.py | 333 ++ libs/win/autocommand/errors.py | 23 + libs/win/bin/enver.exe | Bin 93044 -> 107873 bytes libs/win/bin/find-symlinks.exe | Bin 93071 -> 107900 bytes libs/win/bin/gclip.exe | Bin 93056 -> 107885 bytes libs/win/bin/mklink.exe | Bin 93049 -> 107878 bytes libs/win/bin/pclip.exe | Bin 93060 -> 107889 bytes libs/win/bin/xmouse.exe | Bin 93054 -> 107883 bytes libs/win/bugs/environ-api-wierdness.py | 39 + libs/win/bugs/find_target_path.py | 69 + libs/win/bugs/multi_os_libc.py | 21 + libs/win/bugs/vista-symlink-islink-bug.py | 29 + .../wnetaddconnection2-error-on-64-bit.py | 20 + libs/win/importlib_metadata/__init__.py | 17 - libs/win/importlib_metadata/_hooks.py | 148 - libs/win/importlib_metadata/api.py | 146 - .../win/importlib_metadata/docs/changelog.rst | 57 - libs/win/importlib_metadata/docs/conf.py | 180 - libs/win/importlib_metadata/docs/index.rst | 53 - libs/win/importlib_metadata/docs/using.rst | 133 - libs/win/importlib_metadata/tests/test_api.py | 44 - .../win/importlib_metadata/tests/test_main.py | 121 - libs/win/importlib_metadata/tests/test_zip.py | 42 - libs/win/importlib_metadata/version.txt | 1 - libs/win/importlib_resources/__init__.py | 36 + libs/win/importlib_resources/_adapters.py | 170 + libs/win/importlib_resources/_common.py | 207 + libs/win/importlib_resources/_compat.py | 108 + libs/win/importlib_resources/_itertools.py | 35 + libs/win/importlib_resources/_legacy.py | 120 + libs/win/importlib_resources/abc.py | 170 + .../py.typed} | 0 libs/win/importlib_resources/readers.py | 120 + libs/win/importlib_resources/simple.py | 106 + .../tests/__init__.py | 0 libs/win/importlib_resources/tests/_compat.py | 32 + libs/win/importlib_resources/tests/_path.py | 50 + .../tests/data01}/__init__.py | 0 .../tests/data01/binary.file | Bin 0 -> 4 bytes .../tests/data01/subdirectory}/__init__.py | 0 .../tests/data01/subdirectory/binary.file | Bin 0 -> 4 bytes .../tests/data01/utf-16.file | Bin 0 -> 44 bytes .../tests/data01/utf-8.file | 1 + .../tests/data02/__init__.py | 0 .../tests/data02/one/__init__.py | 0 .../tests/data02/one/resource1.txt | 1 + .../tests/data02/two/__init__.py | 0 .../tests/data02/two/resource2.txt | 1 + .../tests/namespacedata01/binary.file | Bin 0 -> 4 bytes .../tests/namespacedata01/utf-16.file | Bin 0 -> 44 bytes .../tests/namespacedata01/utf-8.file | 1 + .../tests/test_compatibilty_files.py | 102 + .../tests/test_contents.py | 43 + .../importlib_resources/tests/test_files.py | 112 + .../importlib_resources/tests/test_open.py | 81 + .../importlib_resources/tests/test_path.py | 64 + .../importlib_resources/tests/test_read.py | 76 + .../importlib_resources/tests/test_reader.py | 133 + .../tests/test_resource.py | 260 ++ .../importlib_resources/tests/update-zips.py | 53 + libs/win/importlib_resources/tests/util.py | 167 + .../tests/zipdata01/__init__.py | 0 .../tests/zipdata01/ziptestdata.zip | Bin 0 -> 876 bytes .../tests/zipdata02/__init__.py | 0 .../tests/zipdata02/ziptestdata.zip | Bin 0 -> 698 bytes libs/win/incubator/replace-file.py | 10 + libs/win/incubator/trace-symlink.py | 22 + libs/win/inflect/__init__.py | 3991 +++++++++++++++++ libs/win/inflect/py.typed | 0 libs/win/jaraco.classes-1.5-py3.6-nspkg.pth | 1 - .../jaraco.collections-1.6.0-py3.7-nspkg.pth | 1 - .../win/jaraco.functools-1.20-py3.6-nspkg.pth | 1 - .../jaraco.structures-1.1.2-py3.6-nspkg.pth | 1 - libs/win/jaraco.text-1.10.1-py3.6-nspkg.pth | 1 - libs/win/jaraco.ui-1.6-py3.6-nspkg.pth | 1 - libs/win/jaraco.windows-3.9.2-py3.7-nspkg.pth | 1 - libs/win/jaraco/classes/ancestry.py | 107 +- libs/win/jaraco/classes/meta.py | 79 +- libs/win/jaraco/classes/properties.py | 217 +- libs/win/jaraco/collections.py | 1574 ++++--- libs/win/jaraco/context.py | 253 ++ libs/win/jaraco/functools.py | 774 ++-- libs/win/jaraco/structures/binary.py | 237 +- libs/win/jaraco/text.py | 452 -- libs/win/jaraco/text/Lorem ipsum.txt | 2 + libs/win/jaraco/text/__init__.py | 622 +++ libs/win/jaraco/text/layouts.py | 25 + libs/win/jaraco/text/show-newlines.py | 33 + libs/win/jaraco/text/strip-prefix.py | 21 + libs/win/jaraco/text/to-dvorak.py | 6 + libs/win/jaraco/text/to-qwerty.py | 6 + libs/win/jaraco/ui/cmdline.py | 115 +- libs/win/jaraco/ui/editor.py | 171 +- libs/win/jaraco/ui/input.py | 36 +- libs/win/jaraco/ui/menu.py | 56 +- libs/win/jaraco/ui/progress.py | 227 +- libs/win/jaraco/windows/api/clipboard.py | 8 +- libs/win/jaraco/windows/api/credential.py | 58 +- libs/win/jaraco/windows/api/environ.py | 6 +- libs/win/jaraco/windows/api/event.py | 23 +- libs/win/jaraco/windows/api/filesystem.py | 307 +- libs/win/jaraco/windows/api/inet.py | 246 +- libs/win/jaraco/windows/api/library.py | 6 +- libs/win/jaraco/windows/api/memory.py | 28 +- libs/win/jaraco/windows/api/message.py | 33 +- libs/win/jaraco/windows/api/net.py | 28 +- libs/win/jaraco/windows/api/power.py | 40 +- libs/win/jaraco/windows/api/privilege.py | 121 +- libs/win/jaraco/windows/api/process.py | 8 +- libs/win/jaraco/windows/api/security.py | 167 +- libs/win/jaraco/windows/api/shell.py | 69 +- libs/win/jaraco/windows/api/system.py | 8 +- libs/win/jaraco/windows/api/user.py | 4 +- libs/win/jaraco/windows/batch.py | 39 + libs/win/jaraco/windows/clipboard.py | 305 +- libs/win/jaraco/windows/cred.py | 14 +- libs/win/jaraco/windows/dpapi.py | 198 +- libs/win/jaraco/windows/environ.py | 398 +- libs/win/jaraco/windows/error.py | 121 +- libs/win/jaraco/windows/eventlog.py | 68 +- .../win/jaraco/windows/filesystem/__init__.py | 726 ++- .../jaraco/windows/filesystem/backports.py | 192 +- libs/win/jaraco/windows/filesystem/change.py | 370 +- libs/win/jaraco/windows/inet.py | 178 +- libs/win/jaraco/windows/lib.py | 24 +- libs/win/jaraco/windows/memory.py | 36 +- libs/win/jaraco/windows/mmap.py | 105 +- libs/win/jaraco/windows/msie.py | 86 +- libs/win/jaraco/windows/msvc.py | 37 + libs/win/jaraco/windows/net.py | 37 +- libs/win/jaraco/windows/power.py | 88 +- libs/win/jaraco/windows/privilege.py | 190 +- libs/win/jaraco/windows/registry.py | 24 +- libs/win/jaraco/windows/reparse.py | 45 +- libs/win/jaraco/windows/security.py | 99 +- libs/win/jaraco/windows/services.py | 417 +- libs/win/jaraco/windows/shell.py | 14 +- libs/win/jaraco/windows/timers.py | 105 +- libs/win/jaraco/windows/timezone.py | 408 +- libs/win/jaraco/windows/ui.py | 4 +- libs/win/jaraco/windows/user.py | 18 +- libs/win/jaraco/windows/util.py | 21 +- libs/win/jaraco/windows/vpn.py | 28 +- libs/win/jaraco/windows/xmouse.py | 120 +- libs/win/more_itertools/__init__.py | 8 +- libs/win/more_itertools/__init__.pyi | 2 + libs/win/more_itertools/more.py | 2766 ++++++++++-- libs/win/more_itertools/more.pyi | 674 +++ libs/win/more_itertools/py.typed | 0 libs/win/more_itertools/recipes.py | 484 +- libs/win/more_itertools/recipes.pyi | 110 + libs/win/more_itertools/tests/test_more.py | 2074 --------- libs/win/more_itertools/tests/test_recipes.py | 616 --- libs/win/{path.py => path/__init__.py} | 1271 +++--- libs/win/path/__init__.pyi | 483 ++ libs/win/path/classes.py | 27 + libs/win/path/classes.pyi | 8 + libs/win/path/masks.py | 85 + libs/win/path/masks.pyi | 5 + libs/win/path/matchers.py | 59 + libs/win/path/matchers.pyi | 28 + libs/win/path/py.typed | 0 libs/win/path/py37compat.py | 125 + libs/win/path/py37compat.pyi | 17 + libs/win/pydantic/__init__.cp37-win_amd64.pyd | Bin 0 -> 34304 bytes libs/win/pydantic/__init__.py | 131 + .../_hypothesis_plugin.cp37-win_amd64.pyd | Bin 0 -> 154112 bytes libs/win/pydantic/_hypothesis_plugin.py | 386 ++ .../annotated_types.cp37-win_amd64.pyd | Bin 0 -> 67072 bytes libs/win/pydantic/annotated_types.py | 72 + .../class_validators.cp37-win_amd64.pyd | Bin 0 -> 183296 bytes libs/win/pydantic/class_validators.py | 342 ++ libs/win/pydantic/color.cp37-win_amd64.pyd | Bin 0 -> 224256 bytes libs/win/pydantic/color.py | 494 ++ libs/win/pydantic/config.cp37-win_amd64.pyd | Bin 0 -> 79360 bytes libs/win/pydantic/config.py | 192 + .../pydantic/dataclasses.cp37-win_amd64.pyd | Bin 0 -> 182272 bytes libs/win/pydantic/dataclasses.py | 479 ++ .../datetime_parse.cp37-win_amd64.pyd | Bin 0 -> 96256 bytes libs/win/pydantic/datetime_parse.py | 248 + .../win/pydantic/decorator.cp37-win_amd64.pyd | Bin 0 -> 134144 bytes libs/win/pydantic/decorator.py | 264 ++ .../pydantic/env_settings.cp37-win_amd64.pyd | Bin 0 -> 169472 bytes libs/win/pydantic/env_settings.py | 346 ++ .../error_wrappers.cp37-win_amd64.pyd | Bin 0 -> 117248 bytes libs/win/pydantic/error_wrappers.py | 162 + libs/win/pydantic/errors.cp37-win_amd64.pyd | Bin 0 -> 184320 bytes libs/win/pydantic/errors.py | 646 +++ libs/win/pydantic/fields.cp37-win_amd64.pyd | Bin 0 -> 391168 bytes libs/win/pydantic/fields.py | 1247 +++++ libs/win/pydantic/generics.py | 364 ++ libs/win/pydantic/json.cp37-win_amd64.pyd | Bin 0 -> 69632 bytes libs/win/pydantic/json.py | 112 + libs/win/pydantic/main.cp37-win_amd64.pyd | Bin 0 -> 385024 bytes libs/win/pydantic/main.py | 1109 +++++ libs/win/pydantic/mypy.cp37-win_amd64.pyd | Bin 0 -> 325632 bytes libs/win/pydantic/mypy.py | 850 ++++ libs/win/pydantic/networks.cp37-win_amd64.pyd | Bin 0 -> 248320 bytes libs/win/pydantic/networks.py | 736 +++ libs/win/pydantic/parse.cp37-win_amd64.pyd | Bin 0 -> 50176 bytes libs/win/pydantic/parse.py | 66 + libs/win/pydantic/py.typed | 0 libs/win/pydantic/schema.cp37-win_amd64.pyd | Bin 0 -> 346624 bytes libs/win/pydantic/schema.py | 1153 +++++ libs/win/pydantic/tools.cp37-win_amd64.pyd | Bin 0 -> 64000 bytes libs/win/pydantic/tools.py | 92 + libs/win/pydantic/types.cp37-win_amd64.pyd | Bin 0 -> 354816 bytes libs/win/pydantic/types.py | 1187 +++++ libs/win/pydantic/typing.cp37-win_amd64.pyd | Bin 0 -> 200704 bytes libs/win/pydantic/typing.py | 602 +++ libs/win/pydantic/utils.cp37-win_amd64.pyd | Bin 0 -> 305152 bytes libs/win/pydantic/utils.py | 841 ++++ .../pydantic/validators.cp37-win_amd64.pyd | Bin 0 -> 265216 bytes libs/win/pydantic/validators.py | 765 ++++ libs/win/pydantic/version.cp37-win_amd64.pyd | Bin 0 -> 53760 bytes libs/win/pydantic/version.py | 38 + libs/win/scripts/watch-changes.py | 35 + libs/win/six.py | 952 ---- libs/win/test_path.py | 1258 ------ libs/win/typing_extensions.py | 2209 +++++++++ libs/win/zipp/__init__.py | 381 ++ libs/win/zipp/py310compat.py | 12 + 226 files changed, 33472 insertions(+), 11882 deletions(-) create mode 100644 libs/win/autocommand/__init__.py create mode 100644 libs/win/autocommand/autoasync.py create mode 100644 libs/win/autocommand/autocommand.py create mode 100644 libs/win/autocommand/automain.py create mode 100644 libs/win/autocommand/autoparse.py create mode 100644 libs/win/autocommand/errors.py create mode 100644 libs/win/bugs/environ-api-wierdness.py create mode 100644 libs/win/bugs/find_target_path.py create mode 100644 libs/win/bugs/multi_os_libc.py create mode 100644 libs/win/bugs/vista-symlink-islink-bug.py create mode 100644 libs/win/bugs/wnetaddconnection2-error-on-64-bit.py delete mode 100644 libs/win/importlib_metadata/__init__.py delete mode 100644 libs/win/importlib_metadata/_hooks.py delete mode 100644 libs/win/importlib_metadata/api.py delete mode 100644 libs/win/importlib_metadata/docs/changelog.rst delete mode 100644 libs/win/importlib_metadata/docs/conf.py delete mode 100644 libs/win/importlib_metadata/docs/index.rst delete mode 100644 libs/win/importlib_metadata/docs/using.rst delete mode 100644 libs/win/importlib_metadata/tests/test_api.py delete mode 100644 libs/win/importlib_metadata/tests/test_main.py delete mode 100644 libs/win/importlib_metadata/tests/test_zip.py delete mode 100644 libs/win/importlib_metadata/version.txt create mode 100644 libs/win/importlib_resources/__init__.py create mode 100644 libs/win/importlib_resources/_adapters.py create mode 100644 libs/win/importlib_resources/_common.py create mode 100644 libs/win/importlib_resources/_compat.py create mode 100644 libs/win/importlib_resources/_itertools.py create mode 100644 libs/win/importlib_resources/_legacy.py create mode 100644 libs/win/importlib_resources/abc.py rename libs/win/{importlib_metadata/docs/__init__.py => importlib_resources/py.typed} (100%) create mode 100644 libs/win/importlib_resources/readers.py create mode 100644 libs/win/importlib_resources/simple.py rename libs/win/{importlib_metadata => importlib_resources}/tests/__init__.py (100%) create mode 100644 libs/win/importlib_resources/tests/_compat.py create mode 100644 libs/win/importlib_resources/tests/_path.py rename libs/win/{importlib_metadata/tests/data => importlib_resources/tests/data01}/__init__.py (100%) create mode 100644 libs/win/importlib_resources/tests/data01/binary.file rename libs/win/{more_itertools/tests => importlib_resources/tests/data01/subdirectory}/__init__.py (100%) create mode 100644 libs/win/importlib_resources/tests/data01/subdirectory/binary.file create mode 100644 libs/win/importlib_resources/tests/data01/utf-16.file create mode 100644 libs/win/importlib_resources/tests/data01/utf-8.file create mode 100644 libs/win/importlib_resources/tests/data02/__init__.py create mode 100644 libs/win/importlib_resources/tests/data02/one/__init__.py create mode 100644 libs/win/importlib_resources/tests/data02/one/resource1.txt create mode 100644 libs/win/importlib_resources/tests/data02/two/__init__.py create mode 100644 libs/win/importlib_resources/tests/data02/two/resource2.txt create mode 100644 libs/win/importlib_resources/tests/namespacedata01/binary.file create mode 100644 libs/win/importlib_resources/tests/namespacedata01/utf-16.file create mode 100644 libs/win/importlib_resources/tests/namespacedata01/utf-8.file create mode 100644 libs/win/importlib_resources/tests/test_compatibilty_files.py create mode 100644 libs/win/importlib_resources/tests/test_contents.py create mode 100644 libs/win/importlib_resources/tests/test_files.py create mode 100644 libs/win/importlib_resources/tests/test_open.py create mode 100644 libs/win/importlib_resources/tests/test_path.py create mode 100644 libs/win/importlib_resources/tests/test_read.py create mode 100644 libs/win/importlib_resources/tests/test_reader.py create mode 100644 libs/win/importlib_resources/tests/test_resource.py create mode 100644 libs/win/importlib_resources/tests/update-zips.py create mode 100644 libs/win/importlib_resources/tests/util.py create mode 100644 libs/win/importlib_resources/tests/zipdata01/__init__.py create mode 100644 libs/win/importlib_resources/tests/zipdata01/ziptestdata.zip create mode 100644 libs/win/importlib_resources/tests/zipdata02/__init__.py create mode 100644 libs/win/importlib_resources/tests/zipdata02/ziptestdata.zip create mode 100644 libs/win/incubator/replace-file.py create mode 100644 libs/win/incubator/trace-symlink.py create mode 100644 libs/win/inflect/__init__.py create mode 100644 libs/win/inflect/py.typed delete mode 100644 libs/win/jaraco.classes-1.5-py3.6-nspkg.pth delete mode 100644 libs/win/jaraco.collections-1.6.0-py3.7-nspkg.pth delete mode 100644 libs/win/jaraco.functools-1.20-py3.6-nspkg.pth delete mode 100644 libs/win/jaraco.structures-1.1.2-py3.6-nspkg.pth delete mode 100644 libs/win/jaraco.text-1.10.1-py3.6-nspkg.pth delete mode 100644 libs/win/jaraco.ui-1.6-py3.6-nspkg.pth delete mode 100644 libs/win/jaraco.windows-3.9.2-py3.7-nspkg.pth create mode 100644 libs/win/jaraco/context.py delete mode 100644 libs/win/jaraco/text.py create mode 100644 libs/win/jaraco/text/Lorem ipsum.txt create mode 100644 libs/win/jaraco/text/__init__.py create mode 100644 libs/win/jaraco/text/layouts.py create mode 100644 libs/win/jaraco/text/show-newlines.py create mode 100644 libs/win/jaraco/text/strip-prefix.py create mode 100644 libs/win/jaraco/text/to-dvorak.py create mode 100644 libs/win/jaraco/text/to-qwerty.py create mode 100644 libs/win/jaraco/windows/batch.py create mode 100644 libs/win/jaraco/windows/msvc.py create mode 100644 libs/win/more_itertools/__init__.pyi create mode 100644 libs/win/more_itertools/more.pyi create mode 100644 libs/win/more_itertools/py.typed create mode 100644 libs/win/more_itertools/recipes.pyi delete mode 100644 libs/win/more_itertools/tests/test_more.py delete mode 100644 libs/win/more_itertools/tests/test_recipes.py rename libs/win/{path.py => path/__init__.py} (53%) create mode 100644 libs/win/path/__init__.pyi create mode 100644 libs/win/path/classes.py create mode 100644 libs/win/path/classes.pyi create mode 100644 libs/win/path/masks.py create mode 100644 libs/win/path/masks.pyi create mode 100644 libs/win/path/matchers.py create mode 100644 libs/win/path/matchers.pyi create mode 100644 libs/win/path/py.typed create mode 100644 libs/win/path/py37compat.py create mode 100644 libs/win/path/py37compat.pyi create mode 100644 libs/win/pydantic/__init__.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/__init__.py create mode 100644 libs/win/pydantic/_hypothesis_plugin.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/_hypothesis_plugin.py create mode 100644 libs/win/pydantic/annotated_types.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/annotated_types.py create mode 100644 libs/win/pydantic/class_validators.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/class_validators.py create mode 100644 libs/win/pydantic/color.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/color.py create mode 100644 libs/win/pydantic/config.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/config.py create mode 100644 libs/win/pydantic/dataclasses.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/dataclasses.py create mode 100644 libs/win/pydantic/datetime_parse.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/datetime_parse.py create mode 100644 libs/win/pydantic/decorator.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/decorator.py create mode 100644 libs/win/pydantic/env_settings.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/env_settings.py create mode 100644 libs/win/pydantic/error_wrappers.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/error_wrappers.py create mode 100644 libs/win/pydantic/errors.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/errors.py create mode 100644 libs/win/pydantic/fields.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/fields.py create mode 100644 libs/win/pydantic/generics.py create mode 100644 libs/win/pydantic/json.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/json.py create mode 100644 libs/win/pydantic/main.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/main.py create mode 100644 libs/win/pydantic/mypy.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/mypy.py create mode 100644 libs/win/pydantic/networks.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/networks.py create mode 100644 libs/win/pydantic/parse.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/parse.py create mode 100644 libs/win/pydantic/py.typed create mode 100644 libs/win/pydantic/schema.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/schema.py create mode 100644 libs/win/pydantic/tools.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/tools.py create mode 100644 libs/win/pydantic/types.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/types.py create mode 100644 libs/win/pydantic/typing.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/typing.py create mode 100644 libs/win/pydantic/utils.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/utils.py create mode 100644 libs/win/pydantic/validators.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/validators.py create mode 100644 libs/win/pydantic/version.cp37-win_amd64.pyd create mode 100644 libs/win/pydantic/version.py create mode 100644 libs/win/scripts/watch-changes.py delete mode 100644 libs/win/six.py delete mode 100644 libs/win/test_path.py create mode 100644 libs/win/typing_extensions.py create mode 100644 libs/win/zipp/__init__.py create mode 100644 libs/win/zipp/py310compat.py diff --git a/libs/win/autocommand/__init__.py b/libs/win/autocommand/__init__.py new file mode 100644 index 00000000..73fbfca6 --- /dev/null +++ b/libs/win/autocommand/__init__.py @@ -0,0 +1,27 @@ +# Copyright 2014-2016 Nathan West +# +# This file is part of autocommand. +# +# autocommand is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# autocommand is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with autocommand. If not, see . + +# flake8 flags all these imports as unused, hence the NOQAs everywhere. + +from .automain import automain # NOQA +from .autoparse import autoparse, smart_open # NOQA +from .autocommand import autocommand # NOQA + +try: + from .autoasync import autoasync # NOQA +except ImportError: # pragma: no cover + pass diff --git a/libs/win/autocommand/autoasync.py b/libs/win/autocommand/autoasync.py new file mode 100644 index 00000000..688f7e05 --- /dev/null +++ b/libs/win/autocommand/autoasync.py @@ -0,0 +1,142 @@ +# Copyright 2014-2015 Nathan West +# +# This file is part of autocommand. +# +# autocommand is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# autocommand is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with autocommand. If not, see . + +from asyncio import get_event_loop, iscoroutine +from functools import wraps +from inspect import signature + + +async def _run_forever_coro(coro, args, kwargs, loop): + ''' + This helper function launches an async main function that was tagged with + forever=True. There are two possibilities: + + - The function is a normal function, which handles initializing the event + loop, which is then run forever + - The function is a coroutine, which needs to be scheduled in the event + loop, which is then run forever + - There is also the possibility that the function is a normal function + wrapping a coroutine function + + The function is therefore called unconditionally and scheduled in the event + loop if the return value is a coroutine object. + + The reason this is a separate function is to make absolutely sure that all + the objects created are garbage collected after all is said and done; we + do this to ensure that any exceptions raised in the tasks are collected + ASAP. + ''' + + # Personal note: I consider this an antipattern, as it relies on the use of + # unowned resources. The setup function dumps some stuff into the event + # loop where it just whirls in the ether without a well defined owner or + # lifetime. For this reason, there's a good chance I'll remove the + # forever=True feature from autoasync at some point in the future. + thing = coro(*args, **kwargs) + if iscoroutine(thing): + await thing + + +def autoasync(coro=None, *, loop=None, forever=False, pass_loop=False): + ''' + Convert an asyncio coroutine into a function which, when called, is + evaluted in an event loop, and the return value returned. This is intented + to make it easy to write entry points into asyncio coroutines, which + otherwise need to be explictly evaluted with an event loop's + run_until_complete. + + If `loop` is given, it is used as the event loop to run the coro in. If it + is None (the default), the loop is retreived using asyncio.get_event_loop. + This call is defered until the decorated function is called, so that + callers can install custom event loops or event loop policies after + @autoasync is applied. + + If `forever` is True, the loop is run forever after the decorated coroutine + is finished. Use this for servers created with asyncio.start_server and the + like. + + If `pass_loop` is True, the event loop object is passed into the coroutine + as the `loop` kwarg when the wrapper function is called. In this case, the + wrapper function's __signature__ is updated to remove this parameter, so + that autoparse can still be used on it without generating a parameter for + `loop`. + + This coroutine can be called with ( @autoasync(...) ) or without + ( @autoasync ) arguments. + + Examples: + + @autoasync + def get_file(host, port): + reader, writer = yield from asyncio.open_connection(host, port) + data = reader.read() + sys.stdout.write(data.decode()) + + get_file(host, port) + + @autoasync(forever=True, pass_loop=True) + def server(host, port, loop): + yield_from loop.create_server(Proto, host, port) + + server('localhost', 8899) + + ''' + if coro is None: + return lambda c: autoasync( + c, loop=loop, + forever=forever, + pass_loop=pass_loop) + + # The old and new signatures are required to correctly bind the loop + # parameter in 100% of cases, even if it's a positional parameter. + # NOTE: A future release will probably require the loop parameter to be + # a kwonly parameter. + if pass_loop: + old_sig = signature(coro) + new_sig = old_sig.replace(parameters=( + param for name, param in old_sig.parameters.items() + if name != "loop")) + + @wraps(coro) + def autoasync_wrapper(*args, **kwargs): + # Defer the call to get_event_loop so that, if a custom policy is + # installed after the autoasync decorator, it is respected at call time + local_loop = get_event_loop() if loop is None else loop + + # Inject the 'loop' argument. We have to use this signature binding to + # ensure it's injected in the correct place (positional, keyword, etc) + if pass_loop: + bound_args = old_sig.bind_partial() + bound_args.arguments.update( + loop=local_loop, + **new_sig.bind(*args, **kwargs).arguments) + args, kwargs = bound_args.args, bound_args.kwargs + + if forever: + local_loop.create_task(_run_forever_coro( + coro, args, kwargs, local_loop + )) + local_loop.run_forever() + else: + return local_loop.run_until_complete(coro(*args, **kwargs)) + + # Attach the updated signature. This allows 'pass_loop' to be used with + # autoparse + if pass_loop: + autoasync_wrapper.__signature__ = new_sig + + return autoasync_wrapper diff --git a/libs/win/autocommand/autocommand.py b/libs/win/autocommand/autocommand.py new file mode 100644 index 00000000..097e86de --- /dev/null +++ b/libs/win/autocommand/autocommand.py @@ -0,0 +1,70 @@ +# Copyright 2014-2015 Nathan West +# +# This file is part of autocommand. +# +# autocommand is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# autocommand is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with autocommand. If not, see . + +from .autoparse import autoparse +from .automain import automain +try: + from .autoasync import autoasync +except ImportError: # pragma: no cover + pass + + +def autocommand( + module, *, + description=None, + epilog=None, + add_nos=False, + parser=None, + loop=None, + forever=False, + pass_loop=False): + + if callable(module): + raise TypeError('autocommand requires a module name argument') + + def autocommand_decorator(func): + # Step 1: if requested, run it all in an asyncio event loop. autoasync + # patches the __signature__ of the decorated function, so that in the + # event that pass_loop is True, the `loop` parameter of the original + # function will *not* be interpreted as a command-line argument by + # autoparse + if loop is not None or forever or pass_loop: + func = autoasync( + func, + loop=None if loop is True else loop, + pass_loop=pass_loop, + forever=forever) + + # Step 2: create parser. We do this second so that the arguments are + # parsed and passed *before* entering the asyncio event loop, if it + # exists. This simplifies the stack trace and ensures errors are + # reported earlier. It also ensures that errors raised during parsing & + # passing are still raised if `forever` is True. + func = autoparse( + func, + description=description, + epilog=epilog, + add_nos=add_nos, + parser=parser) + + # Step 3: call the function automatically if __name__ == '__main__' (or + # if True was provided) + func = automain(module)(func) + + return func + + return autocommand_decorator diff --git a/libs/win/autocommand/automain.py b/libs/win/autocommand/automain.py new file mode 100644 index 00000000..6cc45db6 --- /dev/null +++ b/libs/win/autocommand/automain.py @@ -0,0 +1,59 @@ +# Copyright 2014-2015 Nathan West +# +# This file is part of autocommand. +# +# autocommand is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# autocommand is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with autocommand. If not, see . + +import sys +from .errors import AutocommandError + + +class AutomainRequiresModuleError(AutocommandError, TypeError): + pass + + +def automain(module, *, args=(), kwargs=None): + ''' + This decorator automatically invokes a function if the module is being run + as the "__main__" module. Optionally, provide args or kwargs with which to + call the function. If `module` is "__main__", the function is called, and + the program is `sys.exit`ed with the return value. You can also pass `True` + to cause the function to be called unconditionally. If the function is not + called, it is returned unchanged by the decorator. + + Usage: + + @automain(__name__) # Pass __name__ to check __name__=="__main__" + def main(): + ... + + If __name__ is "__main__" here, the main function is called, and then + sys.exit called with the return value. + ''' + + # Check that @automain(...) was called, rather than @automain + if callable(module): + raise AutomainRequiresModuleError(module) + + if module == '__main__' or module is True: + if kwargs is None: + kwargs = {} + + # Use a function definition instead of a lambda for a neater traceback + def automain_decorator(main): + sys.exit(main(*args, **kwargs)) + + return automain_decorator + else: + return lambda main: main diff --git a/libs/win/autocommand/autoparse.py b/libs/win/autocommand/autoparse.py new file mode 100644 index 00000000..0276a3fa --- /dev/null +++ b/libs/win/autocommand/autoparse.py @@ -0,0 +1,333 @@ +# Copyright 2014-2015 Nathan West +# +# This file is part of autocommand. +# +# autocommand is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# autocommand is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with autocommand. If not, see . + +import sys +from re import compile as compile_regex +from inspect import signature, getdoc, Parameter +from argparse import ArgumentParser +from contextlib import contextmanager +from functools import wraps +from io import IOBase +from autocommand.errors import AutocommandError + + +_empty = Parameter.empty + + +class AnnotationError(AutocommandError): + '''Annotation error: annotation must be a string, type, or tuple of both''' + + +class PositionalArgError(AutocommandError): + ''' + Postional Arg Error: autocommand can't handle postional-only parameters + ''' + + +class KWArgError(AutocommandError): + '''kwarg Error: autocommand can't handle a **kwargs parameter''' + + +class DocstringError(AutocommandError): + '''Docstring error''' + + +class TooManySplitsError(DocstringError): + ''' + The docstring had too many ---- section splits. Currently we only support + using up to a single split, to split the docstring into description and + epilog parts. + ''' + + +def _get_type_description(annotation): + ''' + Given an annotation, return the (type, description) for the parameter. + If you provide an annotation that is somehow both a string and a callable, + the behavior is undefined. + ''' + if annotation is _empty: + return None, None + elif callable(annotation): + return annotation, None + elif isinstance(annotation, str): + return None, annotation + elif isinstance(annotation, tuple): + try: + arg1, arg2 = annotation + except ValueError as e: + raise AnnotationError(annotation) from e + else: + if callable(arg1) and isinstance(arg2, str): + return arg1, arg2 + elif isinstance(arg1, str) and callable(arg2): + return arg2, arg1 + + raise AnnotationError(annotation) + + +def _add_arguments(param, parser, used_char_args, add_nos): + ''' + Add the argument(s) to an ArgumentParser (using add_argument) for a given + parameter. used_char_args is the set of -short options currently already in + use, and is updated (if necessary) by this function. If add_nos is True, + this will also add an inverse switch for all boolean options. For + instance, for the boolean parameter "verbose", this will create --verbose + and --no-verbose. + ''' + + # Impl note: This function is kept separate from make_parser because it's + # already very long and I wanted to separate out as much as possible into + # its own call scope, to prevent even the possibility of suble mutation + # bugs. + if param.kind is param.POSITIONAL_ONLY: + raise PositionalArgError(param) + elif param.kind is param.VAR_KEYWORD: + raise KWArgError(param) + + # These are the kwargs for the add_argument function. + arg_spec = {} + is_option = False + + # Get the type and default from the annotation. + arg_type, description = _get_type_description(param.annotation) + + # Get the default value + default = param.default + + # If there is no explicit type, and the default is present and not None, + # infer the type from the default. + if arg_type is None and default not in {_empty, None}: + arg_type = type(default) + + # Add default. The presence of a default means this is an option, not an + # argument. + if default is not _empty: + arg_spec['default'] = default + is_option = True + + # Add the type + if arg_type is not None: + # Special case for bool: make it just a --switch + if arg_type is bool: + if not default or default is _empty: + arg_spec['action'] = 'store_true' + else: + arg_spec['action'] = 'store_false' + + # Switches are always options + is_option = True + + # Special case for file types: make it a string type, for filename + elif isinstance(default, IOBase): + arg_spec['type'] = str + + # TODO: special case for list type. + # - How to specificy type of list members? + # - param: [int] + # - param: int =[] + # - action='append' vs nargs='*' + + else: + arg_spec['type'] = arg_type + + # nargs: if the signature includes *args, collect them as trailing CLI + # arguments in a list. *args can't have a default value, so it can never be + # an option. + if param.kind is param.VAR_POSITIONAL: + # TODO: consider depluralizing metavar/name here. + arg_spec['nargs'] = '*' + + # Add description. + if description is not None: + arg_spec['help'] = description + + # Get the --flags + flags = [] + name = param.name + + if is_option: + # Add the first letter as a -short option. + for letter in name[0], name[0].swapcase(): + if letter not in used_char_args: + used_char_args.add(letter) + flags.append('-{}'.format(letter)) + break + + # If the parameter is a --long option, or is a -short option that + # somehow failed to get a flag, add it. + if len(name) > 1 or not flags: + flags.append('--{}'.format(name)) + + arg_spec['dest'] = name + else: + flags.append(name) + + parser.add_argument(*flags, **arg_spec) + + # Create the --no- version for boolean switches + if add_nos and arg_type is bool: + parser.add_argument( + '--no-{}'.format(name), + action='store_const', + dest=name, + const=default if default is not _empty else False) + + +def make_parser(func_sig, description, epilog, add_nos): + ''' + Given the signature of a function, create an ArgumentParser + ''' + parser = ArgumentParser(description=description, epilog=epilog) + + used_char_args = {'h'} + + # Arange the params so that single-character arguments are first. This + # esnures they don't have to get --long versions. sorted is stable, so the + # parameters will otherwise still be in relative order. + params = sorted( + func_sig.parameters.values(), + key=lambda param: len(param.name) > 1) + + for param in params: + _add_arguments(param, parser, used_char_args, add_nos) + + return parser + + +_DOCSTRING_SPLIT = compile_regex(r'\n\s*-{4,}\s*\n') + + +def parse_docstring(docstring): + ''' + Given a docstring, parse it into a description and epilog part + ''' + if docstring is None: + return '', '' + + parts = _DOCSTRING_SPLIT.split(docstring) + + if len(parts) == 1: + return docstring, '' + elif len(parts) == 2: + return parts[0], parts[1] + else: + raise TooManySplitsError() + + +def autoparse( + func=None, *, + description=None, + epilog=None, + add_nos=False, + parser=None): + ''' + This decorator converts a function that takes normal arguments into a + function which takes a single optional argument, argv, parses it using an + argparse.ArgumentParser, and calls the underlying function with the parsed + arguments. If it is not given, sys.argv[1:] is used. This is so that the + function can be used as a setuptools entry point, as well as a normal main + function. sys.argv[1:] is not evaluated until the function is called, to + allow injecting different arguments for testing. + + It uses the argument signature of the function to create an + ArgumentParser. Parameters without defaults become positional parameters, + while parameters *with* defaults become --options. Use annotations to set + the type of the parameter. + + The `desctiption` and `epilog` parameters corrospond to the same respective + argparse parameters. If no description is given, it defaults to the + decorated functions's docstring, if present. + + If add_nos is True, every boolean option (that is, every parameter with a + default of True/False or a type of bool) will have a --no- version created + as well, which inverts the option. For instance, the --verbose option will + have a --no-verbose counterpart. These are not mutually exclusive- + whichever one appears last in the argument list will have precedence. + + If a parser is given, it is used instead of one generated from the function + signature. In this case, no parser is created; instead, the given parser is + used to parse the argv argument. The parser's results' argument names must + match up with the parameter names of the decorated function. + + The decorated function is attached to the result as the `func` attribute, + and the parser is attached as the `parser` attribute. + ''' + + # If @autoparse(...) is used instead of @autoparse + if func is None: + return lambda f: autoparse( + f, description=description, + epilog=epilog, + add_nos=add_nos, + parser=parser) + + func_sig = signature(func) + + docstr_description, docstr_epilog = parse_docstring(getdoc(func)) + + if parser is None: + parser = make_parser( + func_sig, + description or docstr_description, + epilog or docstr_epilog, + add_nos) + + @wraps(func) + def autoparse_wrapper(argv=None): + if argv is None: + argv = sys.argv[1:] + + # Get empty argument binding, to fill with parsed arguments. This + # object does all the heavy lifting of turning named arguments into + # into correctly bound *args and **kwargs. + parsed_args = func_sig.bind_partial() + parsed_args.arguments.update(vars(parser.parse_args(argv))) + + return func(*parsed_args.args, **parsed_args.kwargs) + + # TODO: attach an updated __signature__ to autoparse_wrapper, just in case. + + # Attach the wrapped function and parser, and return the wrapper. + autoparse_wrapper.func = func + autoparse_wrapper.parser = parser + return autoparse_wrapper + + +@contextmanager +def smart_open(filename_or_file, *args, **kwargs): + ''' + This context manager allows you to open a filename, if you want to default + some already-existing file object, like sys.stdout, which shouldn't be + closed at the end of the context. If the filename argument is a str, bytes, + or int, the file object is created via a call to open with the given *args + and **kwargs, sent to the context, and closed at the end of the context, + just like "with open(filename) as f:". If it isn't one of the openable + types, the object simply sent to the context unchanged, and left unclosed + at the end of the context. Example: + + def work_with_file(name=sys.stdout): + with smart_open(name) as f: + # Works correctly if name is a str filename or sys.stdout + print("Some stuff", file=f) + # If it was a filename, f is closed at the end here. + ''' + if isinstance(filename_or_file, (str, bytes, int)): + with open(filename_or_file, *args, **kwargs) as file: + yield file + else: + yield filename_or_file diff --git a/libs/win/autocommand/errors.py b/libs/win/autocommand/errors.py new file mode 100644 index 00000000..25706073 --- /dev/null +++ b/libs/win/autocommand/errors.py @@ -0,0 +1,23 @@ +# Copyright 2014-2016 Nathan West +# +# This file is part of autocommand. +# +# autocommand is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# autocommand is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with autocommand. If not, see . + + +class AutocommandError(Exception): + '''Base class for autocommand exceptions''' + pass + +# Individual modules will define errors specific to that module. diff --git a/libs/win/bin/enver.exe b/libs/win/bin/enver.exe index 3999307b493ff9c780ae1ee04ef0b14b00fe5afb..238225bca28f6bf754db8f4b5cbad1278d16959d 100644 GIT binary patch literal 107873 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 B^`HO% literal 93044 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 diff --git a/libs/win/bin/gclip.exe b/libs/win/bin/gclip.exe index 0c4805e1a7b0eb51fbf9223c3caf9a8befe987e3..b9b6c928da09fa74c0c842155a3cfb5023b062b8 100644 GIT binary patch literal 107885 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 a;H4&bP`VnE>>rd$!r(+E;8M5f_dfv^#w#TN diff --git a/libs/win/bin/mklink.exe b/libs/win/bin/mklink.exe index 5d477820ea38c619f6db3f782e5ec9b2dab7895a..eca54539916570b03da02feea27c7c53527e1e09 100644 GIT binary patch literal 107878 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 VT@6Osj}j$8a1;|zbtzEq`4?mhEqDL` diff --git a/libs/win/bin/pclip.exe b/libs/win/bin/pclip.exe index 3c3e8b48cc0b84dff4a23c07c26e2b5245ec2ae0..9e8bb32c10d38b7109a5655bb59901b67eea5bc0 100644 GIT binary patch literal 107889 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 diff --git a/libs/win/bin/xmouse.exe b/libs/win/bin/xmouse.exe index 4b7c018e2a07a0621643ee198cff91e8e893fb77..bd19cbb251d0b63f10aa94fe0da2fd3d853cb6f3 100644 GIT binary patch literal 107883 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 orig_wd = os.getcwd() + >>> os.chdir('c:\\windows') # so we know what the working directory is + + >>> findpath('d:\\') + 'd:\\' + + >>> findpath('d:\\', 'c:\\windows') + 'd:\\' + + >>> findpath('\\bar', 'd:\\') + 'd:\\bar' + + >>> findpath('\\bar', 'd:\\foo') # fails with '\\bar' + 'd:\\bar' + + >>> findpath('bar', 'd:\\foo') + 'd:\\foo\\bar' + + >>> findpath('bar\\baz', 'd:\\foo') + 'd:\\foo\\bar\\baz' + + >>> findpath('\\baz', 'd:\\foo\\bar') # fails with '\\baz' + 'd:\\baz' + + Since we're on the C drive, findpath may be allowed to return + relative paths for targets on the same drive. I use abspath to + confirm that the ultimate target is what we expect. + >>> os.path.abspath(findpath('\\bar')) + 'c:\\bar' + + >>> os.path.abspath(findpath('bar')) + 'c:\\windows\\bar' + + >>> findpath('..', 'd:\\foo\\bar') + 'd:\\foo' + + >>> findpath('..\\bar', 'd:\\foo') + 'd:\\bar' + + The parent of the root directory is the root directory. + >>> findpath('..', 'd:\\') + 'd:\\' + + restore the original working directory + >>> os.chdir(orig_wd) + """ + return os.path.normpath(os.path.join(start, target)) + + +def main(): + import sys + + if sys.argv[1:]: + print(findpath(*sys.argv[1:])) + else: + import doctest + + doctest.testmod() + + +if __name__ == '__main__': + main() diff --git a/libs/win/bugs/multi_os_libc.py b/libs/win/bugs/multi_os_libc.py new file mode 100644 index 00000000..b1443122 --- /dev/null +++ b/libs/win/bugs/multi_os_libc.py @@ -0,0 +1,21 @@ +from ctypes import CDLL, c_char_p + + +def get_libc(): + libnames = ('msvcrt', 'libc.so.6') + for libname in libnames: + try: + return CDLL(libname) + except WindowsError: + pass + except OSError: + pass + raise RuntimeError("Unable to find a suitable libc (tried %s)" % libnames) + + +getenv = get_libc().getenv +getenv.restype = c_char_p + +# call into your linked module here + +print('new value is', getenv('FOO')) diff --git a/libs/win/bugs/vista-symlink-islink-bug.py b/libs/win/bugs/vista-symlink-islink-bug.py new file mode 100644 index 00000000..a8e8f010 --- /dev/null +++ b/libs/win/bugs/vista-symlink-islink-bug.py @@ -0,0 +1,29 @@ +import os +import sys + +try: + from jaraco.windows.filesystem import symlink +except ImportError: + # a dirty reimplementation of symlink from jaraco.windows + from ctypes import windll + from ctypes.wintypes import LPWSTR, DWORD, BOOLEAN + + CreateSymbolicLink = windll.kernel32.CreateSymbolicLinkW + CreateSymbolicLink.argtypes = (LPWSTR, LPWSTR, DWORD) + CreateSymbolicLink.restype = BOOLEAN + + def symlink(link, target, target_is_directory=False): + """ + An implementation of os.symlink for Windows (Vista and greater) + """ + target_is_directory = target_is_directory or os.path.isdir(target) + CreateSymbolicLink(link, target, target_is_directory) + + +assert sys.platform in ('win32',) +os.makedirs(r'.\foo') +assert os.path.isdir(r'.\foo') + +symlink(r'.\foo_sym', r'.\foo') +assert os.path.isdir(r'.\foo_sym') +assert os.path.islink(r'.\foo_sym') # fails diff --git a/libs/win/bugs/wnetaddconnection2-error-on-64-bit.py b/libs/win/bugs/wnetaddconnection2-error-on-64-bit.py new file mode 100644 index 00000000..e7c7a756 --- /dev/null +++ b/libs/win/bugs/wnetaddconnection2-error-on-64-bit.py @@ -0,0 +1,20 @@ +# reported at http://social.msdn.microsoft.com/Forums/en-US/wsk/thread/f43c2faf-3df3-4f11-9f5e-1a9101753f93 +from win32wnet import WNetAddConnection2, NETRESOURCE + +resource = NETRESOURCE() +resource.lpRemoteName = r'\\aoshi\users' +username = 'jaraco' +res = WNetAddConnection2(resource, UserName=username) +print('first result is', res) +res = WNetAddConnection2(resource, UserName=username) +print('second result is', res) + +""" +Output is: + +first result is None +Traceback (most recent call last): + File ".\wnetaddconnection2-error-on-64-bit.py", line 7, in + res = WNetAddConnection2(resource, UserName=username) +pywintypes.error: (1219, 'WNetAddConnection2', 'Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. Disconnect all previous connections to the server or shared resource and try again.') +""" diff --git a/libs/win/importlib_metadata/__init__.py b/libs/win/importlib_metadata/__init__.py deleted file mode 100644 index f594c6f7..00000000 --- a/libs/win/importlib_metadata/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -from .api import distribution, Distribution, PackageNotFoundError # noqa: F401 -from .api import metadata, entry_points, resolve, version, read_text - -# Import for installation side-effects. -from . import _hooks # noqa: F401 - - -__all__ = [ - 'metadata', - 'entry_points', - 'resolve', - 'version', - 'read_text', - ] - - -__version__ = version(__name__) diff --git a/libs/win/importlib_metadata/_hooks.py b/libs/win/importlib_metadata/_hooks.py deleted file mode 100644 index 1fd62698..00000000 --- a/libs/win/importlib_metadata/_hooks.py +++ /dev/null @@ -1,148 +0,0 @@ -from __future__ import unicode_literals, absolute_import - -import re -import sys -import itertools - -from .api import Distribution -from zipfile import ZipFile - -if sys.version_info >= (3,): # pragma: nocover - from contextlib import suppress - from pathlib import Path -else: # pragma: nocover - from contextlib2 import suppress # noqa - from itertools import imap as map # type: ignore - from pathlib2 import Path - - FileNotFoundError = IOError, OSError - __metaclass__ = type - - -def install(cls): - """Class decorator for installation on sys.meta_path.""" - sys.meta_path.append(cls) - return cls - - -class NullFinder: - @staticmethod - def find_spec(*args, **kwargs): - return None - - # In Python 2, the import system requires finders - # to have a find_module() method, but this usage - # is deprecated in Python 3 in favor of find_spec(). - # For the purposes of this finder (i.e. being present - # on sys.meta_path but having no other import - # system functionality), the two methods are identical. - find_module = find_spec - - -@install -class MetadataPathFinder(NullFinder): - """A degenerate finder for distribution packages on the file system. - - This finder supplies only a find_distribution() method for versions - of Python that do not have a PathFinder find_distribution(). - """ - search_template = r'{name}(-.*)?\.(dist|egg)-info' - - @classmethod - def find_distribution(cls, name): - paths = cls._search_paths(name) - dists = map(PathDistribution, paths) - return next(dists, None) - - @classmethod - def _search_paths(cls, name): - """ - Find metadata directories in sys.path heuristically. - """ - return itertools.chain.from_iterable( - cls._search_path(path, name) - for path in map(Path, sys.path) - ) - - @classmethod - def _search_path(cls, root, name): - if not root.is_dir(): - return () - normalized = name.replace('-', '_') - return ( - item - for item in root.iterdir() - if item.is_dir() - and re.match( - cls.search_template.format(name=normalized), - str(item.name), - flags=re.IGNORECASE, - ) - ) - - -class PathDistribution(Distribution): - def __init__(self, path): - """Construct a distribution from a path to the metadata directory.""" - self._path = path - - def read_text(self, filename): - with suppress(FileNotFoundError): - with self._path.joinpath(filename).open(encoding='utf-8') as fp: - return fp.read() - return None - read_text.__doc__ = Distribution.read_text.__doc__ - - -@install -class WheelMetadataFinder(NullFinder): - """A degenerate finder for distribution packages in wheels. - - This finder supplies only a find_distribution() method for versions - of Python that do not have a PathFinder find_distribution(). - """ - search_template = r'{name}(-.*)?\.whl' - - @classmethod - def find_distribution(cls, name): - paths = cls._search_paths(name) - dists = map(WheelDistribution, paths) - return next(dists, None) - - @classmethod - def _search_paths(cls, name): - return ( - item - for item in map(Path, sys.path) - if re.match( - cls.search_template.format(name=name), - str(item.name), - flags=re.IGNORECASE, - ) - ) - - -class WheelDistribution(Distribution): - def __init__(self, archive): - self._archive = archive - name, version = archive.name.split('-')[0:2] - self._dist_info = '{}-{}.dist-info'.format(name, version) - - def read_text(self, filename): - with ZipFile(_path_to_filename(self._archive)) as zf: - with suppress(KeyError): - as_bytes = zf.read('{}/{}'.format(self._dist_info, filename)) - return as_bytes.decode('utf-8') - return None - read_text.__doc__ = Distribution.read_text.__doc__ - - -def _path_to_filename(path): # pragma: nocover - """ - On non-compliant systems, ensure a path-like object is - a string. - """ - try: - return path.__fspath__() - except AttributeError: - return str(path) diff --git a/libs/win/importlib_metadata/api.py b/libs/win/importlib_metadata/api.py deleted file mode 100644 index 41942a39..00000000 --- a/libs/win/importlib_metadata/api.py +++ /dev/null @@ -1,146 +0,0 @@ -import io -import abc -import sys -import email - -from importlib import import_module - -if sys.version_info > (3,): # pragma: nocover - from configparser import ConfigParser -else: # pragma: nocover - from ConfigParser import SafeConfigParser as ConfigParser - -try: - BaseClass = ModuleNotFoundError -except NameError: # pragma: nocover - BaseClass = ImportError # type: ignore - - -__metaclass__ = type - - -class PackageNotFoundError(BaseClass): - """The package was not found.""" - - -class Distribution: - """A Python distribution package.""" - - @abc.abstractmethod - def read_text(self, filename): - """Attempt to load metadata file given by the name. - - :param filename: The name of the file in the distribution info. - :return: The text if found, otherwise None. - """ - - @classmethod - def from_name(cls, name): - """Return the Distribution for the given package name. - - :param name: The name of the distribution package to search for. - :return: The Distribution instance (or subclass thereof) for the named - package, if found. - :raises PackageNotFoundError: When the named package's distribution - metadata cannot be found. - """ - for resolver in cls._discover_resolvers(): - resolved = resolver(name) - if resolved is not None: - return resolved - else: - raise PackageNotFoundError(name) - - @staticmethod - def _discover_resolvers(): - """Search the meta_path for resolvers.""" - declared = ( - getattr(finder, 'find_distribution', None) - for finder in sys.meta_path - ) - return filter(None, declared) - - @property - def metadata(self): - """Return the parsed metadata for this Distribution. - - The returned object will have keys that name the various bits of - metadata. See PEP 566 for details. - """ - return email.message_from_string( - self.read_text('METADATA') or self.read_text('PKG-INFO') - ) - - @property - def version(self): - """Return the 'Version' metadata for the distribution package.""" - return self.metadata['Version'] - - -def distribution(package): - """Get the ``Distribution`` instance for the given package. - - :param package: The name of the package as a string. - :return: A ``Distribution`` instance (or subclass thereof). - """ - return Distribution.from_name(package) - - -def metadata(package): - """Get the metadata for the package. - - :param package: The name of the distribution package to query. - :return: An email.Message containing the parsed metadata. - """ - return Distribution.from_name(package).metadata - - -def version(package): - """Get the version string for the named package. - - :param package: The name of the distribution package to query. - :return: The version string for the package as defined in the package's - "Version" metadata key. - """ - return distribution(package).version - - -def entry_points(name): - """Return the entry points for the named distribution package. - - :param name: The name of the distribution package to query. - :return: A ConfigParser instance where the sections and keys are taken - from the entry_points.txt ini-style contents. - """ - as_string = read_text(name, 'entry_points.txt') - # 2018-09-10(barry): Should we provide any options here, or let the caller - # send options to the underlying ConfigParser? For now, YAGNI. - config = ConfigParser() - try: - config.read_string(as_string) - except AttributeError: # pragma: nocover - # Python 2 has no read_string - config.readfp(io.StringIO(as_string)) - return config - - -def resolve(entry_point): - """Resolve an entry point string into the named callable. - - :param entry_point: An entry point string of the form - `path.to.module:callable`. - :return: The actual callable object `path.to.module.callable` - :raises ValueError: When `entry_point` doesn't have the proper format. - """ - path, colon, name = entry_point.rpartition(':') - if colon != ':': - raise ValueError('Not an entry point: {}'.format(entry_point)) - module = import_module(path) - return getattr(module, name) - - -def read_text(package, filename): - """ - Read the text of the file in the distribution info directory. - """ - return distribution(package).read_text(filename) diff --git a/libs/win/importlib_metadata/docs/changelog.rst b/libs/win/importlib_metadata/docs/changelog.rst deleted file mode 100644 index f8f1fedc..00000000 --- a/libs/win/importlib_metadata/docs/changelog.rst +++ /dev/null @@ -1,57 +0,0 @@ -========================= - importlib_metadata NEWS -========================= - -0.7 (2018-11-27) -================ -* Fixed issue where packages with dashes in their names would - not be discovered. Closes #21. -* Distribution lookup is now case-insensitive. Closes #20. -* Wheel distributions can no longer be discovered by their module - name. Like Path distributions, they must be indicated by their - distribution package name. - -0.6 (2018-10-07) -================ -* Removed ``importlib_metadata.distribution`` function. Now - the public interface is primarily the utility functions exposed - in ``importlib_metadata.__all__``. Closes #14. -* Added two new utility functions ``read_text`` and - ``metadata``. - -0.5 (2018-09-18) -================ -* Updated README and removed details about Distribution - class, now considered private. Closes #15. -* Added test suite support for Python 3.4+. -* Fixed SyntaxErrors on Python 3.4 and 3.5. !12 -* Fixed errors on Windows joining Path elements. !15 - -0.4 (2018-09-14) -================ -* Housekeeping. - -0.3 (2018-09-14) -================ -* Added usage documentation. Closes #8 -* Add support for getting metadata from wheels on ``sys.path``. Closes #9 - -0.2 (2018-09-11) -================ -* Added ``importlib_metadata.entry_points()``. Closes #1 -* Added ``importlib_metadata.resolve()``. Closes #12 -* Add support for Python 2.7. Closes #4 - -0.1 (2018-09-10) -================ -* Initial release. - - -.. - Local Variables: - mode: change-log-mode - indent-tabs-mode: nil - sentence-end-double-space: t - fill-column: 78 - coding: utf-8 - End: diff --git a/libs/win/importlib_metadata/docs/conf.py b/libs/win/importlib_metadata/docs/conf.py deleted file mode 100644 index c87fc4f2..00000000 --- a/libs/win/importlib_metadata/docs/conf.py +++ /dev/null @@ -1,180 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# flake8: noqa -# -# importlib_metadata documentation build configuration file, created by -# sphinx-quickstart on Thu Nov 30 10:21:00 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = ['sphinx.ext.autodoc', - 'sphinx.ext.doctest', - 'sphinx.ext.intersphinx', - 'sphinx.ext.coverage', - 'sphinx.ext.viewcode'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = 'importlib_metadata' -copyright = '2017-2018, Jason Coombs, Barry Warsaw' -author = 'Jason Coombs, Barry Warsaw' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '0.1' -# The full version, including alpha/beta/rc tags. -release = '0.1' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'default' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# This is required for the alabaster theme -# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars -html_sidebars = { - '**': [ - 'relations.html', # needs 'show_related': True theme option to display - 'searchbox.html', - ] -} - - -# -- Options for HTMLHelp output ------------------------------------------ - -# Output file base name for HTML help builder. -htmlhelp_basename = 'importlib_metadatadoc' - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'importlib_metadata.tex', 'importlib\\_metadata Documentation', - 'Brett Cannon, Barry Warsaw', 'manual'), -] - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'importlib_metadata', 'importlib_metadata Documentation', - [author], 1) -] - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'importlib_metadata', 'importlib_metadata Documentation', - author, 'importlib_metadata', 'One line description of project.', - 'Miscellaneous'), -] - - - - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = { - 'python': ('https://docs.python.org/3', None), - } diff --git a/libs/win/importlib_metadata/docs/index.rst b/libs/win/importlib_metadata/docs/index.rst deleted file mode 100644 index 21da1ed6..00000000 --- a/libs/win/importlib_metadata/docs/index.rst +++ /dev/null @@ -1,53 +0,0 @@ -=============================== - Welcome to importlib_metadata -=============================== - -``importlib_metadata`` is a library which provides an API for accessing an -installed package's `metadata`_, such as its entry points or its top-level -name. This functionality intends to replace most uses of ``pkg_resources`` -`entry point API`_ and `metadata API`_. Along with ``importlib.resources`` in -`Python 3.7 and newer`_ (backported as `importlib_resources`_ for older -versions of Python), this can eliminate the need to use the older and less -efficient ``pkg_resources`` package. - -``importlib_metadata`` is a backport of Python 3.8's standard library -`importlib.metadata`_ module for Python 2.7, and 3.4 through 3.7. Users of -Python 3.8 and beyond are encouraged to use the standard library module, and -in fact for these versions, ``importlib_metadata`` just shadows that module. -Developers looking for detailed API descriptions should refer to the Python -3.8 standard library documentation. - -The documentation here includes a general :ref:`usage ` guide. - - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - using.rst - changelog.rst - - -Project details -=============== - - * Project home: https://gitlab.com/python-devs/importlib_metadata - * Report bugs at: https://gitlab.com/python-devs/importlib_metadata/issues - * Code hosting: https://gitlab.com/python-devs/importlib_metadata.git - * Documentation: http://importlib_metadata.readthedocs.io/ - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - - -.. _`metadata`: https://www.python.org/dev/peps/pep-0566/ -.. _`entry point API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points -.. _`metadata API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#metadata-api -.. _`Python 3.7 and newer`: https://docs.python.org/3/library/importlib.html#module-importlib.resources -.. _`importlib_resources`: https://importlib-resources.readthedocs.io/en/latest/index.html -.. _`importlib.metadata`: TBD diff --git a/libs/win/importlib_metadata/docs/using.rst b/libs/win/importlib_metadata/docs/using.rst deleted file mode 100644 index 2af6c822..00000000 --- a/libs/win/importlib_metadata/docs/using.rst +++ /dev/null @@ -1,133 +0,0 @@ -.. _using: - -========================== - Using importlib_metadata -========================== - -``importlib_metadata`` is a library that provides for access to installed -package metadata. Built in part on Python's import system, this library -intends to replace similar functionality in ``pkg_resources`` `entry point -API`_ and `metadata API`_. Along with ``importlib.resources`` in `Python 3.7 -and newer`_ (backported as `importlib_resources`_ for older versions of -Python), this can eliminate the need to use the older and less efficient -``pkg_resources`` package. - -By "installed package" we generally mean a third party package installed into -Python's ``site-packages`` directory via tools such as ``pip``. Specifically, -it means a package with either a discoverable ``dist-info`` or ``egg-info`` -directory, and metadata defined by `PEP 566`_ or its older specifications. -By default, package metadata can live on the file system or in wheels on -``sys.path``. Through an extension mechanism, the metadata can live almost -anywhere. - - -Overview -======== - -Let's say you wanted to get the version string for a package you've installed -using ``pip``. We start by creating a virtual environment and installing -something into it:: - - $ python3 -m venv example - $ source example/bin/activate - (example) $ pip install importlib_metadata - (example) $ pip install wheel - -You can get the version string for ``wheel`` by running the following:: - - (example) $ python - >>> from importlib_metadata import version - >>> version('wheel') - '0.31.1' - -You can also get the set of entry points for the ``wheel`` package. Since the -``entry_points.txt`` file is an ``.ini``-style, the ``entry_points()`` -function returns a `ConfigParser instance`_. To get the list of command line -entry points, extract the ``console_scripts`` section:: - - >>> cp = entry_points('wheel') - >>> cp.options('console_scripts') - ['wheel'] - -You can also get the callable that the entry point is mapped to:: - - >>> cp.get('console_scripts', 'wheel') - 'wheel.tool:main' - -Even more conveniently, you can resolve this entry point to the actual -callable:: - - >>> from importlib_metadata import resolve - >>> ep = cp.get('console_scripts', 'wheel') - >>> resolve(ep) - - - -Distributions -============= - -While the above API is the most common and convenient usage, you can get all -of that information from the ``Distribution`` class. A ``Distribution`` is an -abstract object that represents the metadata for a Python package. You can -get the ``Distribution`` instance:: - - >>> from importlib_metadata import distribution - >>> dist = distribution('wheel') - -Thus, an alternative way to get the version number is through the -``Distribution`` instance:: - - >>> dist.version - '0.31.1' - -There are all kinds of additional metadata available on the ``Distribution`` -instance:: - - >>> d.metadata['Requires-Python'] - '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' - >>> d.metadata['License'] - 'MIT' - -The full set of available metadata is not described here. See PEP 566 for -additional details. - - -Extending the search algorithm -============================== - -Because package metadata is not available through ``sys.path`` searches, or -package loaders directly, the metadata for a package is found through import -system `finders`_. To find a distribution package's metadata, -``importlib_metadata`` queries the list of `meta path finders`_ on -`sys.meta_path`_. - -By default ``importlib_metadata`` installs a finder for packages found on the -file system. This finder doesn't actually find any *packages*, but it cany -find the package's metadata. - -The abstract class :py:class:`importlib.abc.MetaPathFinder` defines the -interface expected of finders by Python's import system. -``importlib_metadata`` extends this protocol by looking for an optional -``find_distribution()`` ``@classmethod`` on the finders from -``sys.meta_path``. If the finder has this method, it takes a single argument -which is the name of the distribution package to find. The method returns -``None`` if it cannot find the distribution package, otherwise it returns an -instance of the ``Distribution`` abstract class. - -What this means in practice is that to support finding distribution package -metadata in locations other than the file system, you should derive from -``Distribution`` and implement the ``load_metadata()`` method. This takes a -single argument which is the name of the package whose metadata is being -found. This instance of the ``Distribution`` base abstract class is what your -finder's ``find_distribution()`` method should return. - - -.. _`entry point API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points -.. _`metadata API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#metadata-api -.. _`Python 3.7 and newer`: https://docs.python.org/3/library/importlib.html#module-importlib.resources -.. _`importlib_resources`: https://importlib-resources.readthedocs.io/en/latest/index.html -.. _`PEP 566`: https://www.python.org/dev/peps/pep-0566/ -.. _`ConfigParser instance`: https://docs.python.org/3/library/configparser.html#configparser.ConfigParser -.. _`finders`: https://docs.python.org/3/reference/import.html#finders-and-loaders -.. _`meta path finders`: https://docs.python.org/3/glossary.html#term-meta-path-finder -.. _`sys.meta_path`: https://docs.python.org/3/library/sys.html#sys.meta_path diff --git a/libs/win/importlib_metadata/tests/test_api.py b/libs/win/importlib_metadata/tests/test_api.py deleted file mode 100644 index 82c61f51..00000000 --- a/libs/win/importlib_metadata/tests/test_api.py +++ /dev/null @@ -1,44 +0,0 @@ -import re -import unittest - -import importlib_metadata - - -class APITests(unittest.TestCase): - version_pattern = r'\d+\.\d+(\.\d)?' - - def test_retrieves_version_of_self(self): - version = importlib_metadata.version('importlib_metadata') - assert isinstance(version, str) - assert re.match(self.version_pattern, version) - - def test_retrieves_version_of_pip(self): - # Assume pip is installed and retrieve the version of pip. - version = importlib_metadata.version('pip') - assert isinstance(version, str) - assert re.match(self.version_pattern, version) - - def test_for_name_does_not_exist(self): - with self.assertRaises(importlib_metadata.PackageNotFoundError): - importlib_metadata.distribution('does-not-exist') - - def test_for_top_level(self): - distribution = importlib_metadata.distribution('importlib_metadata') - self.assertEqual( - distribution.read_text('top_level.txt').strip(), - 'importlib_metadata') - - def test_entry_points(self): - parser = importlib_metadata.entry_points('pip') - # We should probably not be dependent on a third party package's - # internal API staying stable. - entry_point = parser.get('console_scripts', 'pip') - self.assertEqual(entry_point, 'pip._internal:main') - - def test_metadata_for_this_package(self): - md = importlib_metadata.metadata('importlib_metadata') - assert md['author'] == 'Barry Warsaw' - assert md['LICENSE'] == 'Apache Software License' - assert md['Name'] == 'importlib-metadata' - classifiers = md.get_all('Classifier') - assert 'Topic :: Software Development :: Libraries' in classifiers diff --git a/libs/win/importlib_metadata/tests/test_main.py b/libs/win/importlib_metadata/tests/test_main.py deleted file mode 100644 index 381e4dae..00000000 --- a/libs/win/importlib_metadata/tests/test_main.py +++ /dev/null @@ -1,121 +0,0 @@ -from __future__ import unicode_literals - -import re -import sys -import shutil -import tempfile -import unittest -import importlib -import contextlib -import importlib_metadata - -try: - from contextlib import ExitStack -except ImportError: - from contextlib2 import ExitStack - -try: - import pathlib -except ImportError: - import pathlib2 as pathlib - -from importlib_metadata import _hooks - - -class BasicTests(unittest.TestCase): - version_pattern = r'\d+\.\d+(\.\d)?' - - def test_retrieves_version_of_pip(self): - # Assume pip is installed and retrieve the version of pip. - dist = importlib_metadata.Distribution.from_name('pip') - assert isinstance(dist.version, str) - assert re.match(self.version_pattern, dist.version) - - def test_for_name_does_not_exist(self): - with self.assertRaises(importlib_metadata.PackageNotFoundError): - importlib_metadata.Distribution.from_name('does-not-exist') - - def test_new_style_classes(self): - self.assertIsInstance(importlib_metadata.Distribution, type) - self.assertIsInstance(_hooks.MetadataPathFinder, type) - self.assertIsInstance(_hooks.WheelMetadataFinder, type) - self.assertIsInstance(_hooks.WheelDistribution, type) - - -class ImportTests(unittest.TestCase): - def test_import_nonexistent_module(self): - # Ensure that the MetadataPathFinder does not crash an import of a - # non-existant module. - with self.assertRaises(ImportError): - importlib.import_module('does_not_exist') - - def test_resolve(self): - entry_points = importlib_metadata.entry_points('pip') - main = importlib_metadata.resolve( - entry_points.get('console_scripts', 'pip')) - import pip._internal - self.assertEqual(main, pip._internal.main) - - def test_resolve_invalid(self): - self.assertRaises(ValueError, importlib_metadata.resolve, 'bogus.ep') - - -class NameNormalizationTests(unittest.TestCase): - @staticmethod - def pkg_with_dashes(site_dir): - """ - Create minimal metadata for a package with dashes - in the name (and thus underscores in the filename). - """ - metadata_dir = site_dir / 'my_pkg.dist-info' - metadata_dir.mkdir() - metadata = metadata_dir / 'METADATA' - with metadata.open('w') as strm: - strm.write('Version: 1.0\n') - return 'my-pkg' - - @staticmethod - @contextlib.contextmanager - def site_dir(): - tmpdir = tempfile.mkdtemp() - sys.path[:0] = [tmpdir] - try: - yield pathlib.Path(tmpdir) - finally: - sys.path.remove(tmpdir) - shutil.rmtree(tmpdir) - - def setUp(self): - self.fixtures = ExitStack() - self.addCleanup(self.fixtures.close) - self.site_dir = self.fixtures.enter_context(self.site_dir()) - - def test_dashes_in_dist_name_found_as_underscores(self): - """ - For a package with a dash in the name, the dist-info metadata - uses underscores in the name. Ensure the metadata loads. - """ - pkg_name = self.pkg_with_dashes(self.site_dir) - assert importlib_metadata.version(pkg_name) == '1.0' - - @staticmethod - def pkg_with_mixed_case(site_dir): - """ - Create minimal metadata for a package with mixed case - in the name. - """ - metadata_dir = site_dir / 'CherryPy.dist-info' - metadata_dir.mkdir() - metadata = metadata_dir / 'METADATA' - with metadata.open('w') as strm: - strm.write('Version: 1.0\n') - return 'CherryPy' - - def test_dist_name_found_as_any_case(self): - """ - Ensure the metadata loads when queried with any case. - """ - pkg_name = self.pkg_with_mixed_case(self.site_dir) - assert importlib_metadata.version(pkg_name) == '1.0' - assert importlib_metadata.version(pkg_name.lower()) == '1.0' - assert importlib_metadata.version(pkg_name.upper()) == '1.0' diff --git a/libs/win/importlib_metadata/tests/test_zip.py b/libs/win/importlib_metadata/tests/test_zip.py deleted file mode 100644 index 7bdf55a9..00000000 --- a/libs/win/importlib_metadata/tests/test_zip.py +++ /dev/null @@ -1,42 +0,0 @@ -import sys -import unittest -import importlib_metadata - -try: - from contextlib import ExitStack -except ImportError: - from contextlib2 import ExitStack - -from importlib_resources import path - - -class BespokeLoader: - archive = 'bespoke' - - -class TestZip(unittest.TestCase): - def setUp(self): - # Find the path to the example.*.whl so we can add it to the front of - # sys.path, where we'll then try to find the metadata thereof. - self.resources = ExitStack() - self.addCleanup(self.resources.close) - wheel = self.resources.enter_context( - path('importlib_metadata.tests.data', - 'example-21.12-py3-none-any.whl')) - sys.path.insert(0, str(wheel)) - self.resources.callback(sys.path.pop, 0) - - def test_zip_version(self): - self.assertEqual(importlib_metadata.version('example'), '21.12') - - def test_zip_entry_points(self): - parser = importlib_metadata.entry_points('example') - entry_point = parser.get('console_scripts', 'example') - self.assertEqual(entry_point, 'example:main') - - def test_missing_metadata(self): - distribution = importlib_metadata.distribution('example') - self.assertIsNone(distribution.read_text('does not exist')) - - def test_case_insensitive(self): - self.assertEqual(importlib_metadata.version('Example'), '21.12') diff --git a/libs/win/importlib_metadata/version.txt b/libs/win/importlib_metadata/version.txt deleted file mode 100644 index eb49d7c7..00000000 --- a/libs/win/importlib_metadata/version.txt +++ /dev/null @@ -1 +0,0 @@ -0.7 diff --git a/libs/win/importlib_resources/__init__.py b/libs/win/importlib_resources/__init__.py new file mode 100644 index 00000000..34e3a995 --- /dev/null +++ b/libs/win/importlib_resources/__init__.py @@ -0,0 +1,36 @@ +"""Read resources contained within a package.""" + +from ._common import ( + as_file, + files, + Package, +) + +from ._legacy import ( + contents, + open_binary, + read_binary, + open_text, + read_text, + is_resource, + path, + Resource, +) + +from .abc import ResourceReader + + +__all__ = [ + 'Package', + 'Resource', + 'ResourceReader', + 'as_file', + 'contents', + 'files', + 'is_resource', + 'open_binary', + 'open_text', + 'path', + 'read_binary', + 'read_text', +] diff --git a/libs/win/importlib_resources/_adapters.py b/libs/win/importlib_resources/_adapters.py new file mode 100644 index 00000000..ea363d86 --- /dev/null +++ b/libs/win/importlib_resources/_adapters.py @@ -0,0 +1,170 @@ +from contextlib import suppress +from io import TextIOWrapper + +from . import abc + + +class SpecLoaderAdapter: + """ + Adapt a package spec to adapt the underlying loader. + """ + + def __init__(self, spec, adapter=lambda spec: spec.loader): + self.spec = spec + self.loader = adapter(spec) + + def __getattr__(self, name): + return getattr(self.spec, name) + + +class TraversableResourcesLoader: + """ + Adapt a loader to provide TraversableResources. + """ + + def __init__(self, spec): + self.spec = spec + + def get_resource_reader(self, name): + return CompatibilityFiles(self.spec)._native() + + +def _io_wrapper(file, mode='r', *args, **kwargs): + if mode == 'r': + return TextIOWrapper(file, *args, **kwargs) + elif mode == 'rb': + return file + raise ValueError( + "Invalid mode value '{}', only 'r' and 'rb' are supported".format(mode) + ) + + +class CompatibilityFiles: + """ + Adapter for an existing or non-existent resource reader + to provide a compatibility .files(). + """ + + class SpecPath(abc.Traversable): + """ + Path tied to a module spec. + Can be read and exposes the resource reader children. + """ + + def __init__(self, spec, reader): + self._spec = spec + self._reader = reader + + def iterdir(self): + if not self._reader: + return iter(()) + return iter( + CompatibilityFiles.ChildPath(self._reader, path) + for path in self._reader.contents() + ) + + def is_file(self): + return False + + is_dir = is_file + + def joinpath(self, other): + if not self._reader: + return CompatibilityFiles.OrphanPath(other) + return CompatibilityFiles.ChildPath(self._reader, other) + + @property + def name(self): + return self._spec.name + + def open(self, mode='r', *args, **kwargs): + return _io_wrapper(self._reader.open_resource(None), mode, *args, **kwargs) + + class ChildPath(abc.Traversable): + """ + Path tied to a resource reader child. + Can be read but doesn't expose any meaningful children. + """ + + def __init__(self, reader, name): + self._reader = reader + self._name = name + + def iterdir(self): + return iter(()) + + def is_file(self): + return self._reader.is_resource(self.name) + + def is_dir(self): + return not self.is_file() + + def joinpath(self, other): + return CompatibilityFiles.OrphanPath(self.name, other) + + @property + def name(self): + return self._name + + def open(self, mode='r', *args, **kwargs): + return _io_wrapper( + self._reader.open_resource(self.name), mode, *args, **kwargs + ) + + class OrphanPath(abc.Traversable): + """ + Orphan path, not tied to a module spec or resource reader. + Can't be read and doesn't expose any meaningful children. + """ + + def __init__(self, *path_parts): + if len(path_parts) < 1: + raise ValueError('Need at least one path part to construct a path') + self._path = path_parts + + def iterdir(self): + return iter(()) + + def is_file(self): + return False + + is_dir = is_file + + def joinpath(self, other): + return CompatibilityFiles.OrphanPath(*self._path, other) + + @property + def name(self): + return self._path[-1] + + def open(self, mode='r', *args, **kwargs): + raise FileNotFoundError("Can't open orphan path") + + def __init__(self, spec): + self.spec = spec + + @property + def _reader(self): + with suppress(AttributeError): + return self.spec.loader.get_resource_reader(self.spec.name) + + def _native(self): + """ + Return the native reader if it supports files(). + """ + reader = self._reader + return reader if hasattr(reader, 'files') else self + + def __getattr__(self, attr): + return getattr(self._reader, attr) + + def files(self): + return CompatibilityFiles.SpecPath(self.spec, self._reader) + + +def wrap_spec(package): + """ + Construct a package spec with traversable compatibility + on the spec/loader/reader. + """ + return SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader) diff --git a/libs/win/importlib_resources/_common.py b/libs/win/importlib_resources/_common.py new file mode 100644 index 00000000..9f19784d --- /dev/null +++ b/libs/win/importlib_resources/_common.py @@ -0,0 +1,207 @@ +import os +import pathlib +import tempfile +import functools +import contextlib +import types +import importlib +import inspect +import warnings +import itertools + +from typing import Union, Optional, cast +from .abc import ResourceReader, Traversable + +from ._compat import wrap_spec + +Package = Union[types.ModuleType, str] +Anchor = Package + + +def package_to_anchor(func): + """ + Replace 'package' parameter as 'anchor' and warn about the change. + + Other errors should fall through. + + >>> files('a', 'b') + Traceback (most recent call last): + TypeError: files() takes from 0 to 1 positional arguments but 2 were given + """ + undefined = object() + + @functools.wraps(func) + def wrapper(anchor=undefined, package=undefined): + if package is not undefined: + if anchor is not undefined: + return func(anchor, package) + warnings.warn( + "First parameter to files is renamed to 'anchor'", + DeprecationWarning, + stacklevel=2, + ) + return func(package) + elif anchor is undefined: + return func() + return func(anchor) + + return wrapper + + +@package_to_anchor +def files(anchor: Optional[Anchor] = None) -> Traversable: + """ + Get a Traversable resource for an anchor. + """ + return from_package(resolve(anchor)) + + +def get_resource_reader(package: types.ModuleType) -> Optional[ResourceReader]: + """ + Return the package's loader if it's a ResourceReader. + """ + # We can't use + # a issubclass() check here because apparently abc.'s __subclasscheck__() + # hook wants to create a weak reference to the object, but + # zipimport.zipimporter does not support weak references, resulting in a + # TypeError. That seems terrible. + spec = package.__spec__ + reader = getattr(spec.loader, 'get_resource_reader', None) # type: ignore + if reader is None: + return None + return reader(spec.name) # type: ignore + + +@functools.singledispatch +def resolve(cand: Optional[Anchor]) -> types.ModuleType: + return cast(types.ModuleType, cand) + + +@resolve.register +def _(cand: str) -> types.ModuleType: + return importlib.import_module(cand) + + +@resolve.register +def _(cand: None) -> types.ModuleType: + return resolve(_infer_caller().f_globals['__name__']) + + +def _infer_caller(): + """ + Walk the stack and find the frame of the first caller not in this module. + """ + + def is_this_file(frame_info): + return frame_info.filename == __file__ + + def is_wrapper(frame_info): + return frame_info.function == 'wrapper' + + not_this_file = itertools.filterfalse(is_this_file, inspect.stack()) + # also exclude 'wrapper' due to singledispatch in the call stack + callers = itertools.filterfalse(is_wrapper, not_this_file) + return next(callers).frame + + +def from_package(package: types.ModuleType): + """ + Return a Traversable object for the given package. + + """ + spec = wrap_spec(package) + reader = spec.loader.get_resource_reader(spec.name) + return reader.files() + + +@contextlib.contextmanager +def _tempfile( + reader, + suffix='', + # gh-93353: Keep a reference to call os.remove() in late Python + # finalization. + *, + _os_remove=os.remove, +): + # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try' + # blocks due to the need to close the temporary file to work on Windows + # properly. + fd, raw_path = tempfile.mkstemp(suffix=suffix) + try: + try: + os.write(fd, reader()) + finally: + os.close(fd) + del reader + yield pathlib.Path(raw_path) + finally: + try: + _os_remove(raw_path) + except FileNotFoundError: + pass + + +def _temp_file(path): + return _tempfile(path.read_bytes, suffix=path.name) + + +def _is_present_dir(path: Traversable) -> bool: + """ + Some Traversables implement ``is_dir()`` to raise an + exception (i.e. ``FileNotFoundError``) when the + directory doesn't exist. This function wraps that call + to always return a boolean and only return True + if there's a dir and it exists. + """ + with contextlib.suppress(FileNotFoundError): + return path.is_dir() + return False + + +@functools.singledispatch +def as_file(path): + """ + Given a Traversable object, return that object as a + path on the local file system in a context manager. + """ + return _temp_dir(path) if _is_present_dir(path) else _temp_file(path) + + +@as_file.register(pathlib.Path) +@contextlib.contextmanager +def _(path): + """ + Degenerate behavior for pathlib.Path objects. + """ + yield path + + +@contextlib.contextmanager +def _temp_path(dir: tempfile.TemporaryDirectory): + """ + Wrap tempfile.TemporyDirectory to return a pathlib object. + """ + with dir as result: + yield pathlib.Path(result) + + +@contextlib.contextmanager +def _temp_dir(path): + """ + Given a traversable dir, recursively replicate the whole tree + to the file system in a context manager. + """ + assert path.is_dir() + with _temp_path(tempfile.TemporaryDirectory()) as temp_dir: + yield _write_contents(temp_dir, path) + + +def _write_contents(target, source): + child = target.joinpath(source.name) + if source.is_dir(): + child.mkdir() + for item in source.iterdir(): + _write_contents(child, item) + else: + child.open('wb').write(source.read_bytes()) + return child diff --git a/libs/win/importlib_resources/_compat.py b/libs/win/importlib_resources/_compat.py new file mode 100644 index 00000000..8d7ade08 --- /dev/null +++ b/libs/win/importlib_resources/_compat.py @@ -0,0 +1,108 @@ +# flake8: noqa + +import abc +import os +import sys +import pathlib +from contextlib import suppress +from typing import Union + + +if sys.version_info >= (3, 10): + from zipfile import Path as ZipPath # type: ignore +else: + from zipp import Path as ZipPath # type: ignore + + +try: + from typing import runtime_checkable # type: ignore +except ImportError: + + def runtime_checkable(cls): # type: ignore + return cls + + +try: + from typing import Protocol # type: ignore +except ImportError: + Protocol = abc.ABC # type: ignore + + +class TraversableResourcesLoader: + """ + Adapt loaders to provide TraversableResources and other + compatibility. + + Used primarily for Python 3.9 and earlier where the native + loaders do not yet implement TraversableResources. + """ + + def __init__(self, spec): + self.spec = spec + + @property + def path(self): + return self.spec.origin + + def get_resource_reader(self, name): + from . import readers, _adapters + + def _zip_reader(spec): + with suppress(AttributeError): + return readers.ZipReader(spec.loader, spec.name) + + def _namespace_reader(spec): + with suppress(AttributeError, ValueError): + return readers.NamespaceReader(spec.submodule_search_locations) + + def _available_reader(spec): + with suppress(AttributeError): + return spec.loader.get_resource_reader(spec.name) + + def _native_reader(spec): + reader = _available_reader(spec) + return reader if hasattr(reader, 'files') else None + + def _file_reader(spec): + try: + path = pathlib.Path(self.path) + except TypeError: + return None + if path.exists(): + return readers.FileReader(self) + + return ( + # native reader if it supplies 'files' + _native_reader(self.spec) + or + # local ZipReader if a zip module + _zip_reader(self.spec) + or + # local NamespaceReader if a namespace module + _namespace_reader(self.spec) + or + # local FileReader + _file_reader(self.spec) + # fallback - adapt the spec ResourceReader to TraversableReader + or _adapters.CompatibilityFiles(self.spec) + ) + + +def wrap_spec(package): + """ + Construct a package spec with traversable compatibility + on the spec/loader/reader. + + Supersedes _adapters.wrap_spec to use TraversableResourcesLoader + from above for older Python compatibility (<3.10). + """ + from . import _adapters + + return _adapters.SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader) + + +if sys.version_info >= (3, 9): + StrPath = Union[str, os.PathLike[str]] +else: + # PathLike is only subscriptable at runtime in 3.9+ + StrPath = Union[str, "os.PathLike[str]"] diff --git a/libs/win/importlib_resources/_itertools.py b/libs/win/importlib_resources/_itertools.py new file mode 100644 index 00000000..cce05582 --- /dev/null +++ b/libs/win/importlib_resources/_itertools.py @@ -0,0 +1,35 @@ +from itertools import filterfalse + +from typing import ( + Callable, + Iterable, + Iterator, + Optional, + Set, + TypeVar, + Union, +) + +# Type and type variable definitions +_T = TypeVar('_T') +_U = TypeVar('_U') + + +def unique_everseen( + iterable: Iterable[_T], key: Optional[Callable[[_T], _U]] = None +) -> Iterator[_T]: + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen: Set[Union[_T, _U]] = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element diff --git a/libs/win/importlib_resources/_legacy.py b/libs/win/importlib_resources/_legacy.py new file mode 100644 index 00000000..b1ea8105 --- /dev/null +++ b/libs/win/importlib_resources/_legacy.py @@ -0,0 +1,120 @@ +import functools +import os +import pathlib +import types +import warnings + +from typing import Union, Iterable, ContextManager, BinaryIO, TextIO, Any + +from . import _common + +Package = Union[types.ModuleType, str] +Resource = str + + +def deprecated(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + warnings.warn( + f"{func.__name__} is deprecated. Use files() instead. " + "Refer to https://importlib-resources.readthedocs.io" + "/en/latest/using.html#migrating-from-legacy for migration advice.", + DeprecationWarning, + stacklevel=2, + ) + return func(*args, **kwargs) + + return wrapper + + +def normalize_path(path: Any) -> str: + """Normalize a path by ensuring it is a string. + + If the resulting string contains path separators, an exception is raised. + """ + str_path = str(path) + parent, file_name = os.path.split(str_path) + if parent: + raise ValueError(f'{path!r} must be only a file name') + return file_name + + +@deprecated +def open_binary(package: Package, resource: Resource) -> BinaryIO: + """Return a file-like object opened for binary reading of the resource.""" + return (_common.files(package) / normalize_path(resource)).open('rb') + + +@deprecated +def read_binary(package: Package, resource: Resource) -> bytes: + """Return the binary contents of the resource.""" + return (_common.files(package) / normalize_path(resource)).read_bytes() + + +@deprecated +def open_text( + package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict', +) -> TextIO: + """Return a file-like object opened for text reading of the resource.""" + return (_common.files(package) / normalize_path(resource)).open( + 'r', encoding=encoding, errors=errors + ) + + +@deprecated +def read_text( + package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict', +) -> str: + """Return the decoded string of the resource. + + The decoding-related arguments have the same semantics as those of + bytes.decode(). + """ + with open_text(package, resource, encoding, errors) as fp: + return fp.read() + + +@deprecated +def contents(package: Package) -> Iterable[str]: + """Return an iterable of entries in `package`. + + Note that not all entries are resources. Specifically, directories are + not considered resources. Use `is_resource()` on each entry returned here + to check if it is a resource or not. + """ + return [path.name for path in _common.files(package).iterdir()] + + +@deprecated +def is_resource(package: Package, name: str) -> bool: + """True if `name` is a resource inside `package`. + + Directories are *not* resources. + """ + resource = normalize_path(name) + return any( + traversable.name == resource and traversable.is_file() + for traversable in _common.files(package).iterdir() + ) + + +@deprecated +def path( + package: Package, + resource: Resource, +) -> ContextManager[pathlib.Path]: + """A context manager providing a file path object to the resource. + + If the resource does not already exist on its own on the file system, + a temporary file will be created. If the file was created, the file + will be deleted upon exiting the context manager (no exception is + raised if the file was deleted prior to the context manager + exiting). + """ + return _common.as_file(_common.files(package) / normalize_path(resource)) diff --git a/libs/win/importlib_resources/abc.py b/libs/win/importlib_resources/abc.py new file mode 100644 index 00000000..23b6aeaf --- /dev/null +++ b/libs/win/importlib_resources/abc.py @@ -0,0 +1,170 @@ +import abc +import io +import itertools +import pathlib +from typing import Any, BinaryIO, Iterable, Iterator, NoReturn, Text, Optional + +from ._compat import runtime_checkable, Protocol, StrPath + + +__all__ = ["ResourceReader", "Traversable", "TraversableResources"] + + +class ResourceReader(metaclass=abc.ABCMeta): + """Abstract base class for loaders to provide resource reading support.""" + + @abc.abstractmethod + def open_resource(self, resource: Text) -> BinaryIO: + """Return an opened, file-like object for binary reading. + + The 'resource' argument is expected to represent only a file name. + If the resource cannot be found, FileNotFoundError is raised. + """ + # This deliberately raises FileNotFoundError instead of + # NotImplementedError so that if this method is accidentally called, + # it'll still do the right thing. + raise FileNotFoundError + + @abc.abstractmethod + def resource_path(self, resource: Text) -> Text: + """Return the file system path to the specified resource. + + The 'resource' argument is expected to represent only a file name. + If the resource does not exist on the file system, raise + FileNotFoundError. + """ + # This deliberately raises FileNotFoundError instead of + # NotImplementedError so that if this method is accidentally called, + # it'll still do the right thing. + raise FileNotFoundError + + @abc.abstractmethod + def is_resource(self, path: Text) -> bool: + """Return True if the named 'path' is a resource. + + Files are resources, directories are not. + """ + raise FileNotFoundError + + @abc.abstractmethod + def contents(self) -> Iterable[str]: + """Return an iterable of entries in `package`.""" + raise FileNotFoundError + + +class TraversalError(Exception): + pass + + +@runtime_checkable +class Traversable(Protocol): + """ + An object with a subset of pathlib.Path methods suitable for + traversing directories and opening files. + + Any exceptions that occur when accessing the backing resource + may propagate unaltered. + """ + + @abc.abstractmethod + def iterdir(self) -> Iterator["Traversable"]: + """ + Yield Traversable objects in self + """ + + def read_bytes(self) -> bytes: + """ + Read contents of self as bytes + """ + with self.open('rb') as strm: + return strm.read() + + def read_text(self, encoding: Optional[str] = None) -> str: + """ + Read contents of self as text + """ + with self.open(encoding=encoding) as strm: + return strm.read() + + @abc.abstractmethod + def is_dir(self) -> bool: + """ + Return True if self is a directory + """ + + @abc.abstractmethod + def is_file(self) -> bool: + """ + Return True if self is a file + """ + + def joinpath(self, *descendants: StrPath) -> "Traversable": + """ + Return Traversable resolved with any descendants applied. + + Each descendant should be a path segment relative to self + and each may contain multiple levels separated by + ``posixpath.sep`` (``/``). + """ + if not descendants: + return self + names = itertools.chain.from_iterable( + path.parts for path in map(pathlib.PurePosixPath, descendants) + ) + target = next(names) + matches = ( + traversable for traversable in self.iterdir() if traversable.name == target + ) + try: + match = next(matches) + except StopIteration: + raise TraversalError( + "Target not found during traversal.", target, list(names) + ) + return match.joinpath(*names) + + def __truediv__(self, child: StrPath) -> "Traversable": + """ + Return Traversable child in self + """ + return self.joinpath(child) + + @abc.abstractmethod + def open(self, mode='r', *args, **kwargs): + """ + mode may be 'r' or 'rb' to open as text or binary. Return a handle + suitable for reading (same as pathlib.Path.open). + + When opening as text, accepts encoding parameters such as those + accepted by io.TextIOWrapper. + """ + + @property + @abc.abstractmethod + def name(self) -> str: + """ + The base name of this object without any parent references. + """ + + +class TraversableResources(ResourceReader): + """ + The required interface for providing traversable + resources. + """ + + @abc.abstractmethod + def files(self) -> "Traversable": + """Return a Traversable object for the loaded package.""" + + def open_resource(self, resource: StrPath) -> io.BufferedReader: + return self.files().joinpath(resource).open('rb') + + def resource_path(self, resource: Any) -> NoReturn: + raise FileNotFoundError(resource) + + def is_resource(self, path: StrPath) -> bool: + return self.files().joinpath(path).is_file() + + def contents(self) -> Iterator[str]: + return (item.name for item in self.files().iterdir()) diff --git a/libs/win/importlib_metadata/docs/__init__.py b/libs/win/importlib_resources/py.typed similarity index 100% rename from libs/win/importlib_metadata/docs/__init__.py rename to libs/win/importlib_resources/py.typed diff --git a/libs/win/importlib_resources/readers.py b/libs/win/importlib_resources/readers.py new file mode 100644 index 00000000..ab34db74 --- /dev/null +++ b/libs/win/importlib_resources/readers.py @@ -0,0 +1,120 @@ +import collections +import pathlib +import operator + +from . import abc + +from ._itertools import unique_everseen +from ._compat import ZipPath + + +def remove_duplicates(items): + return iter(collections.OrderedDict.fromkeys(items)) + + +class FileReader(abc.TraversableResources): + def __init__(self, loader): + self.path = pathlib.Path(loader.path).parent + + def resource_path(self, resource): + """ + Return the file system path to prevent + `resources.path()` from creating a temporary + copy. + """ + return str(self.path.joinpath(resource)) + + def files(self): + return self.path + + +class ZipReader(abc.TraversableResources): + def __init__(self, loader, module): + _, _, name = module.rpartition('.') + self.prefix = loader.prefix.replace('\\', '/') + name + '/' + self.archive = loader.archive + + def open_resource(self, resource): + try: + return super().open_resource(resource) + except KeyError as exc: + raise FileNotFoundError(exc.args[0]) + + def is_resource(self, path): + # workaround for `zipfile.Path.is_file` returning true + # for non-existent paths. + target = self.files().joinpath(path) + return target.is_file() and target.exists() + + def files(self): + return ZipPath(self.archive, self.prefix) + + +class MultiplexedPath(abc.Traversable): + """ + Given a series of Traversable objects, implement a merged + version of the interface across all objects. Useful for + namespace packages which may be multihomed at a single + name. + """ + + def __init__(self, *paths): + self._paths = list(map(pathlib.Path, remove_duplicates(paths))) + if not self._paths: + message = 'MultiplexedPath must contain at least one path' + raise FileNotFoundError(message) + if not all(path.is_dir() for path in self._paths): + raise NotADirectoryError('MultiplexedPath only supports directories') + + def iterdir(self): + files = (file for path in self._paths for file in path.iterdir()) + return unique_everseen(files, key=operator.attrgetter('name')) + + def read_bytes(self): + raise FileNotFoundError(f'{self} is not a file') + + def read_text(self, *args, **kwargs): + raise FileNotFoundError(f'{self} is not a file') + + def is_dir(self): + return True + + def is_file(self): + return False + + def joinpath(self, *descendants): + try: + return super().joinpath(*descendants) + except abc.TraversalError: + # One of the paths did not resolve (a directory does not exist). + # Just return something that will not exist. + return self._paths[0].joinpath(*descendants) + + def open(self, *args, **kwargs): + raise FileNotFoundError(f'{self} is not a file') + + @property + def name(self): + return self._paths[0].name + + def __repr__(self): + paths = ', '.join(f"'{path}'" for path in self._paths) + return f'MultiplexedPath({paths})' + + +class NamespaceReader(abc.TraversableResources): + def __init__(self, namespace_path): + if 'NamespacePath' not in str(namespace_path): + raise ValueError('Invalid path') + self.path = MultiplexedPath(*list(namespace_path)) + + def resource_path(self, resource): + """ + Return the file system path to prevent + `resources.path()` from creating a temporary + copy. + """ + return str(self.path.joinpath(resource)) + + def files(self): + return self.path diff --git a/libs/win/importlib_resources/simple.py b/libs/win/importlib_resources/simple.py new file mode 100644 index 00000000..7770c922 --- /dev/null +++ b/libs/win/importlib_resources/simple.py @@ -0,0 +1,106 @@ +""" +Interface adapters for low-level readers. +""" + +import abc +import io +import itertools +from typing import BinaryIO, List + +from .abc import Traversable, TraversableResources + + +class SimpleReader(abc.ABC): + """ + The minimum, low-level interface required from a resource + provider. + """ + + @property + @abc.abstractmethod + def package(self) -> str: + """ + The name of the package for which this reader loads resources. + """ + + @abc.abstractmethod + def children(self) -> List['SimpleReader']: + """ + Obtain an iterable of SimpleReader for available + child containers (e.g. directories). + """ + + @abc.abstractmethod + def resources(self) -> List[str]: + """ + Obtain available named resources for this virtual package. + """ + + @abc.abstractmethod + def open_binary(self, resource: str) -> BinaryIO: + """ + Obtain a File-like for a named resource. + """ + + @property + def name(self): + return self.package.split('.')[-1] + + +class ResourceContainer(Traversable): + """ + Traversable container for a package's resources via its reader. + """ + + def __init__(self, reader: SimpleReader): + self.reader = reader + + def is_dir(self): + return True + + def is_file(self): + return False + + def iterdir(self): + files = (ResourceHandle(self, name) for name in self.reader.resources) + dirs = map(ResourceContainer, self.reader.children()) + return itertools.chain(files, dirs) + + def open(self, *args, **kwargs): + raise IsADirectoryError() + + +class ResourceHandle(Traversable): + """ + Handle to a named resource in a ResourceReader. + """ + + def __init__(self, parent: ResourceContainer, name: str): + self.parent = parent + self.name = name # type: ignore + + def is_file(self): + return True + + def is_dir(self): + return False + + def open(self, mode='r', *args, **kwargs): + stream = self.parent.reader.open_binary(self.name) + if 'b' not in mode: + stream = io.TextIOWrapper(*args, **kwargs) + return stream + + def joinpath(self, name): + raise RuntimeError("Cannot traverse into a resource") + + +class TraversableReader(TraversableResources, SimpleReader): + """ + A TraversableResources based on SimpleReader. Resource providers + may derive from this class to provide the TraversableResources + interface by supplying the SimpleReader interface. + """ + + def files(self): + return ResourceContainer(self) diff --git a/libs/win/importlib_metadata/tests/__init__.py b/libs/win/importlib_resources/tests/__init__.py similarity index 100% rename from libs/win/importlib_metadata/tests/__init__.py rename to libs/win/importlib_resources/tests/__init__.py diff --git a/libs/win/importlib_resources/tests/_compat.py b/libs/win/importlib_resources/tests/_compat.py new file mode 100644 index 00000000..e7bf06dd --- /dev/null +++ b/libs/win/importlib_resources/tests/_compat.py @@ -0,0 +1,32 @@ +import os + + +try: + from test.support import import_helper # type: ignore +except ImportError: + # Python 3.9 and earlier + class import_helper: # type: ignore + from test.support import ( + modules_setup, + modules_cleanup, + DirsOnSysPath, + CleanImport, + ) + + +try: + from test.support import os_helper # type: ignore +except ImportError: + # Python 3.9 compat + class os_helper: # type:ignore + from test.support import temp_dir + + +try: + # Python 3.10 + from test.support.os_helper import unlink +except ImportError: + from test.support import unlink as _unlink + + def unlink(target): + return _unlink(os.fspath(target)) diff --git a/libs/win/importlib_resources/tests/_path.py b/libs/win/importlib_resources/tests/_path.py new file mode 100644 index 00000000..c630e4d3 --- /dev/null +++ b/libs/win/importlib_resources/tests/_path.py @@ -0,0 +1,50 @@ +import pathlib +import functools + + +#### +# from jaraco.path 3.4 + + +def build(spec, prefix=pathlib.Path()): + """ + Build a set of files/directories, as described by the spec. + + Each key represents a pathname, and the value represents + the content. Content may be a nested directory. + + >>> spec = { + ... 'README.txt': "A README file", + ... "foo": { + ... "__init__.py": "", + ... "bar": { + ... "__init__.py": "", + ... }, + ... "baz.py": "# Some code", + ... } + ... } + >>> tmpdir = getfixture('tmpdir') + >>> build(spec, tmpdir) + """ + for name, contents in spec.items(): + create(contents, pathlib.Path(prefix) / name) + + +@functools.singledispatch +def create(content, path): + path.mkdir(exist_ok=True) + build(content, prefix=path) # type: ignore + + +@create.register +def _(content: bytes, path): + path.write_bytes(content) + + +@create.register +def _(content: str, path): + path.write_text(content) + + +# end from jaraco.path +#### diff --git a/libs/win/importlib_metadata/tests/data/__init__.py b/libs/win/importlib_resources/tests/data01/__init__.py similarity index 100% rename from libs/win/importlib_metadata/tests/data/__init__.py rename to libs/win/importlib_resources/tests/data01/__init__.py diff --git a/libs/win/importlib_resources/tests/data01/binary.file b/libs/win/importlib_resources/tests/data01/binary.file new file mode 100644 index 0000000000000000000000000000000000000000..eaf36c1daccfdf325514461cd1a2ffbc139b5464 GIT binary patch literal 4 LcmZQzWMT#Y01f~L literal 0 HcmV?d00001 diff --git a/libs/win/more_itertools/tests/__init__.py b/libs/win/importlib_resources/tests/data01/subdirectory/__init__.py similarity index 100% rename from libs/win/more_itertools/tests/__init__.py rename to libs/win/importlib_resources/tests/data01/subdirectory/__init__.py diff --git a/libs/win/importlib_resources/tests/data01/subdirectory/binary.file b/libs/win/importlib_resources/tests/data01/subdirectory/binary.file new file mode 100644 index 0000000000000000000000000000000000000000..eaf36c1daccfdf325514461cd1a2ffbc139b5464 GIT binary patch literal 4 LcmZQzWMT#Y01f~L literal 0 HcmV?d00001 diff --git a/libs/win/importlib_resources/tests/data01/utf-16.file b/libs/win/importlib_resources/tests/data01/utf-16.file new file mode 100644 index 0000000000000000000000000000000000000000..2cb772295ef4b480a8d83725bd5006a0236d8f68 GIT binary patch literal 44 ucmezW&x0YAAqNQa8FUyF7(y9B7~B|i84MZBfV^^`Xc15@g+Y;liva-T)Ce>H literal 0 HcmV?d00001 diff --git a/libs/win/importlib_resources/tests/data01/utf-8.file b/libs/win/importlib_resources/tests/data01/utf-8.file new file mode 100644 index 00000000..1c0132ad --- /dev/null +++ b/libs/win/importlib_resources/tests/data01/utf-8.file @@ -0,0 +1 @@ +Hello, UTF-8 world! diff --git a/libs/win/importlib_resources/tests/data02/__init__.py b/libs/win/importlib_resources/tests/data02/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/libs/win/importlib_resources/tests/data02/one/__init__.py b/libs/win/importlib_resources/tests/data02/one/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/libs/win/importlib_resources/tests/data02/one/resource1.txt b/libs/win/importlib_resources/tests/data02/one/resource1.txt new file mode 100644 index 00000000..61a813e4 --- /dev/null +++ b/libs/win/importlib_resources/tests/data02/one/resource1.txt @@ -0,0 +1 @@ +one resource diff --git a/libs/win/importlib_resources/tests/data02/two/__init__.py b/libs/win/importlib_resources/tests/data02/two/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/libs/win/importlib_resources/tests/data02/two/resource2.txt b/libs/win/importlib_resources/tests/data02/two/resource2.txt new file mode 100644 index 00000000..a80ce46e --- /dev/null +++ b/libs/win/importlib_resources/tests/data02/two/resource2.txt @@ -0,0 +1 @@ +two resource diff --git a/libs/win/importlib_resources/tests/namespacedata01/binary.file b/libs/win/importlib_resources/tests/namespacedata01/binary.file new file mode 100644 index 0000000000000000000000000000000000000000..eaf36c1daccfdf325514461cd1a2ffbc139b5464 GIT binary patch literal 4 LcmZQzWMT#Y01f~L literal 0 HcmV?d00001 diff --git a/libs/win/importlib_resources/tests/namespacedata01/utf-16.file b/libs/win/importlib_resources/tests/namespacedata01/utf-16.file new file mode 100644 index 0000000000000000000000000000000000000000..2cb772295ef4b480a8d83725bd5006a0236d8f68 GIT binary patch literal 44 ucmezW&x0YAAqNQa8FUyF7(y9B7~B|i84MZBfV^^`Xc15@g+Y;liva-T)Ce>H literal 0 HcmV?d00001 diff --git a/libs/win/importlib_resources/tests/namespacedata01/utf-8.file b/libs/win/importlib_resources/tests/namespacedata01/utf-8.file new file mode 100644 index 00000000..1c0132ad --- /dev/null +++ b/libs/win/importlib_resources/tests/namespacedata01/utf-8.file @@ -0,0 +1 @@ +Hello, UTF-8 world! diff --git a/libs/win/importlib_resources/tests/test_compatibilty_files.py b/libs/win/importlib_resources/tests/test_compatibilty_files.py new file mode 100644 index 00000000..d92c7c56 --- /dev/null +++ b/libs/win/importlib_resources/tests/test_compatibilty_files.py @@ -0,0 +1,102 @@ +import io +import unittest + +import importlib_resources as resources + +from importlib_resources._adapters import ( + CompatibilityFiles, + wrap_spec, +) + +from . import util + + +class CompatibilityFilesTests(unittest.TestCase): + @property + def package(self): + bytes_data = io.BytesIO(b'Hello, world!') + return util.create_package( + file=bytes_data, + path='some_path', + contents=('a', 'b', 'c'), + ) + + @property + def files(self): + return resources.files(self.package) + + def test_spec_path_iter(self): + self.assertEqual( + sorted(path.name for path in self.files.iterdir()), + ['a', 'b', 'c'], + ) + + def test_child_path_iter(self): + self.assertEqual(list((self.files / 'a').iterdir()), []) + + def test_orphan_path_iter(self): + self.assertEqual(list((self.files / 'a' / 'a').iterdir()), []) + self.assertEqual(list((self.files / 'a' / 'a' / 'a').iterdir()), []) + + def test_spec_path_is(self): + self.assertFalse(self.files.is_file()) + self.assertFalse(self.files.is_dir()) + + def test_child_path_is(self): + self.assertTrue((self.files / 'a').is_file()) + self.assertFalse((self.files / 'a').is_dir()) + + def test_orphan_path_is(self): + self.assertFalse((self.files / 'a' / 'a').is_file()) + self.assertFalse((self.files / 'a' / 'a').is_dir()) + self.assertFalse((self.files / 'a' / 'a' / 'a').is_file()) + self.assertFalse((self.files / 'a' / 'a' / 'a').is_dir()) + + def test_spec_path_name(self): + self.assertEqual(self.files.name, 'testingpackage') + + def test_child_path_name(self): + self.assertEqual((self.files / 'a').name, 'a') + + def test_orphan_path_name(self): + self.assertEqual((self.files / 'a' / 'b').name, 'b') + self.assertEqual((self.files / 'a' / 'b' / 'c').name, 'c') + + def test_spec_path_open(self): + self.assertEqual(self.files.read_bytes(), b'Hello, world!') + self.assertEqual(self.files.read_text(), 'Hello, world!') + + def test_child_path_open(self): + self.assertEqual((self.files / 'a').read_bytes(), b'Hello, world!') + self.assertEqual((self.files / 'a').read_text(), 'Hello, world!') + + def test_orphan_path_open(self): + with self.assertRaises(FileNotFoundError): + (self.files / 'a' / 'b').read_bytes() + with self.assertRaises(FileNotFoundError): + (self.files / 'a' / 'b' / 'c').read_bytes() + + def test_open_invalid_mode(self): + with self.assertRaises(ValueError): + self.files.open('0') + + def test_orphan_path_invalid(self): + with self.assertRaises(ValueError): + CompatibilityFiles.OrphanPath() + + def test_wrap_spec(self): + spec = wrap_spec(self.package) + self.assertIsInstance(spec.loader.get_resource_reader(None), CompatibilityFiles) + + +class CompatibilityFilesNoReaderTests(unittest.TestCase): + @property + def package(self): + return util.create_package_from_loader(None) + + @property + def files(self): + return resources.files(self.package) + + def test_spec_path_joinpath(self): + self.assertIsInstance(self.files / 'a', CompatibilityFiles.OrphanPath) diff --git a/libs/win/importlib_resources/tests/test_contents.py b/libs/win/importlib_resources/tests/test_contents.py new file mode 100644 index 00000000..525568e8 --- /dev/null +++ b/libs/win/importlib_resources/tests/test_contents.py @@ -0,0 +1,43 @@ +import unittest +import importlib_resources as resources + +from . import data01 +from . import util + + +class ContentsTests: + expected = { + '__init__.py', + 'binary.file', + 'subdirectory', + 'utf-16.file', + 'utf-8.file', + } + + def test_contents(self): + contents = {path.name for path in resources.files(self.data).iterdir()} + assert self.expected <= contents + + +class ContentsDiskTests(ContentsTests, unittest.TestCase): + def setUp(self): + self.data = data01 + + +class ContentsZipTests(ContentsTests, util.ZipSetup, unittest.TestCase): + pass + + +class ContentsNamespaceTests(ContentsTests, unittest.TestCase): + expected = { + # no __init__ because of namespace design + # no subdirectory as incidental difference in fixture + 'binary.file', + 'utf-16.file', + 'utf-8.file', + } + + def setUp(self): + from . import namespacedata01 + + self.data = namespacedata01 diff --git a/libs/win/importlib_resources/tests/test_files.py b/libs/win/importlib_resources/tests/test_files.py new file mode 100644 index 00000000..d258fb5f --- /dev/null +++ b/libs/win/importlib_resources/tests/test_files.py @@ -0,0 +1,112 @@ +import typing +import textwrap +import unittest +import warnings +import importlib +import contextlib + +import importlib_resources as resources +from ..abc import Traversable +from . import data01 +from . import util +from . import _path +from ._compat import os_helper, import_helper + + +@contextlib.contextmanager +def suppress_known_deprecation(): + with warnings.catch_warnings(record=True) as ctx: + warnings.simplefilter('default', category=DeprecationWarning) + yield ctx + + +class FilesTests: + def test_read_bytes(self): + files = resources.files(self.data) + actual = files.joinpath('utf-8.file').read_bytes() + assert actual == b'Hello, UTF-8 world!\n' + + def test_read_text(self): + files = resources.files(self.data) + actual = files.joinpath('utf-8.file').read_text(encoding='utf-8') + assert actual == 'Hello, UTF-8 world!\n' + + @unittest.skipUnless( + hasattr(typing, 'runtime_checkable'), + "Only suitable when typing supports runtime_checkable", + ) + def test_traversable(self): + assert isinstance(resources.files(self.data), Traversable) + + def test_old_parameter(self): + """ + Files used to take a 'package' parameter. Make sure anyone + passing by name is still supported. + """ + with suppress_known_deprecation(): + resources.files(package=self.data) + + +class OpenDiskTests(FilesTests, unittest.TestCase): + def setUp(self): + self.data = data01 + + +class OpenZipTests(FilesTests, util.ZipSetup, unittest.TestCase): + pass + + +class OpenNamespaceTests(FilesTests, unittest.TestCase): + def setUp(self): + from . import namespacedata01 + + self.data = namespacedata01 + + +class SiteDir: + def setUp(self): + self.fixtures = contextlib.ExitStack() + self.addCleanup(self.fixtures.close) + self.site_dir = self.fixtures.enter_context(os_helper.temp_dir()) + self.fixtures.enter_context(import_helper.DirsOnSysPath(self.site_dir)) + self.fixtures.enter_context(import_helper.CleanImport()) + + +class ModulesFilesTests(SiteDir, unittest.TestCase): + def test_module_resources(self): + """ + A module can have resources found adjacent to the module. + """ + spec = { + 'mod.py': '', + 'res.txt': 'resources are the best', + } + _path.build(spec, self.site_dir) + import mod + + actual = resources.files(mod).joinpath('res.txt').read_text() + assert actual == spec['res.txt'] + + +class ImplicitContextFilesTests(SiteDir, unittest.TestCase): + def test_implicit_files(self): + """ + Without any parameter, files() will infer the location as the caller. + """ + spec = { + 'somepkg': { + '__init__.py': textwrap.dedent( + """ + import importlib_resources as res + val = res.files().joinpath('res.txt').read_text() + """ + ), + 'res.txt': 'resources are the best', + }, + } + _path.build(spec, self.site_dir) + assert importlib.import_module('somepkg').val == 'resources are the best' + + +if __name__ == '__main__': + unittest.main() diff --git a/libs/win/importlib_resources/tests/test_open.py b/libs/win/importlib_resources/tests/test_open.py new file mode 100644 index 00000000..87b42c3d --- /dev/null +++ b/libs/win/importlib_resources/tests/test_open.py @@ -0,0 +1,81 @@ +import unittest + +import importlib_resources as resources +from . import data01 +from . import util + + +class CommonBinaryTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + target = resources.files(package).joinpath(path) + with target.open('rb'): + pass + + +class CommonTextTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + target = resources.files(package).joinpath(path) + with target.open(): + pass + + +class OpenTests: + def test_open_binary(self): + target = resources.files(self.data) / 'binary.file' + with target.open('rb') as fp: + result = fp.read() + self.assertEqual(result, b'\x00\x01\x02\x03') + + def test_open_text_default_encoding(self): + target = resources.files(self.data) / 'utf-8.file' + with target.open() as fp: + result = fp.read() + self.assertEqual(result, 'Hello, UTF-8 world!\n') + + def test_open_text_given_encoding(self): + target = resources.files(self.data) / 'utf-16.file' + with target.open(encoding='utf-16', errors='strict') as fp: + result = fp.read() + self.assertEqual(result, 'Hello, UTF-16 world!\n') + + def test_open_text_with_errors(self): + # Raises UnicodeError without the 'errors' argument. + target = resources.files(self.data) / 'utf-16.file' + with target.open(encoding='utf-8', errors='strict') as fp: + self.assertRaises(UnicodeError, fp.read) + with target.open(encoding='utf-8', errors='ignore') as fp: + result = fp.read() + self.assertEqual( + result, + 'H\x00e\x00l\x00l\x00o\x00,\x00 ' + '\x00U\x00T\x00F\x00-\x001\x006\x00 ' + '\x00w\x00o\x00r\x00l\x00d\x00!\x00\n\x00', + ) + + def test_open_binary_FileNotFoundError(self): + target = resources.files(self.data) / 'does-not-exist' + self.assertRaises(FileNotFoundError, target.open, 'rb') + + def test_open_text_FileNotFoundError(self): + target = resources.files(self.data) / 'does-not-exist' + self.assertRaises(FileNotFoundError, target.open) + + +class OpenDiskTests(OpenTests, unittest.TestCase): + def setUp(self): + self.data = data01 + + +class OpenDiskNamespaceTests(OpenTests, unittest.TestCase): + def setUp(self): + from . import namespacedata01 + + self.data = namespacedata01 + + +class OpenZipTests(OpenTests, util.ZipSetup, unittest.TestCase): + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/libs/win/importlib_resources/tests/test_path.py b/libs/win/importlib_resources/tests/test_path.py new file mode 100644 index 00000000..4f4d3943 --- /dev/null +++ b/libs/win/importlib_resources/tests/test_path.py @@ -0,0 +1,64 @@ +import io +import unittest + +import importlib_resources as resources +from . import data01 +from . import util + + +class CommonTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + with resources.as_file(resources.files(package).joinpath(path)): + pass + + +class PathTests: + def test_reading(self): + # Path should be readable. + # Test also implicitly verifies the returned object is a pathlib.Path + # instance. + target = resources.files(self.data) / 'utf-8.file' + with resources.as_file(target) as path: + self.assertTrue(path.name.endswith("utf-8.file"), repr(path)) + # pathlib.Path.read_text() was introduced in Python 3.5. + with path.open('r', encoding='utf-8') as file: + text = file.read() + self.assertEqual('Hello, UTF-8 world!\n', text) + + +class PathDiskTests(PathTests, unittest.TestCase): + data = data01 + + def test_natural_path(self): + """ + Guarantee the internal implementation detail that + file-system-backed resources do not get the tempdir + treatment. + """ + target = resources.files(self.data) / 'utf-8.file' + with resources.as_file(target) as path: + assert 'data' in str(path) + + +class PathMemoryTests(PathTests, unittest.TestCase): + def setUp(self): + file = io.BytesIO(b'Hello, UTF-8 world!\n') + self.addCleanup(file.close) + self.data = util.create_package( + file=file, path=FileNotFoundError("package exists only in memory") + ) + self.data.__spec__.origin = None + self.data.__spec__.has_location = False + + +class PathZipTests(PathTests, util.ZipSetup, unittest.TestCase): + def test_remove_in_context_manager(self): + # It is not an error if the file that was temporarily stashed on the + # file system is removed inside the `with` stanza. + target = resources.files(self.data) / 'utf-8.file' + with resources.as_file(target) as path: + path.unlink() + + +if __name__ == '__main__': + unittest.main() diff --git a/libs/win/importlib_resources/tests/test_read.py b/libs/win/importlib_resources/tests/test_read.py new file mode 100644 index 00000000..41dd6db5 --- /dev/null +++ b/libs/win/importlib_resources/tests/test_read.py @@ -0,0 +1,76 @@ +import unittest +import importlib_resources as resources + +from . import data01 +from . import util +from importlib import import_module + + +class CommonBinaryTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + resources.files(package).joinpath(path).read_bytes() + + +class CommonTextTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + resources.files(package).joinpath(path).read_text() + + +class ReadTests: + def test_read_bytes(self): + result = resources.files(self.data).joinpath('binary.file').read_bytes() + self.assertEqual(result, b'\0\1\2\3') + + def test_read_text_default_encoding(self): + result = resources.files(self.data).joinpath('utf-8.file').read_text() + self.assertEqual(result, 'Hello, UTF-8 world!\n') + + def test_read_text_given_encoding(self): + result = ( + resources.files(self.data) + .joinpath('utf-16.file') + .read_text(encoding='utf-16') + ) + self.assertEqual(result, 'Hello, UTF-16 world!\n') + + def test_read_text_with_errors(self): + # Raises UnicodeError without the 'errors' argument. + target = resources.files(self.data) / 'utf-16.file' + self.assertRaises(UnicodeError, target.read_text, encoding='utf-8') + result = target.read_text(encoding='utf-8', errors='ignore') + self.assertEqual( + result, + 'H\x00e\x00l\x00l\x00o\x00,\x00 ' + '\x00U\x00T\x00F\x00-\x001\x006\x00 ' + '\x00w\x00o\x00r\x00l\x00d\x00!\x00\n\x00', + ) + + +class ReadDiskTests(ReadTests, unittest.TestCase): + data = data01 + + +class ReadZipTests(ReadTests, util.ZipSetup, unittest.TestCase): + def test_read_submodule_resource(self): + submodule = import_module('ziptestdata.subdirectory') + result = resources.files(submodule).joinpath('binary.file').read_bytes() + self.assertEqual(result, b'\0\1\2\3') + + def test_read_submodule_resource_by_name(self): + result = ( + resources.files('ziptestdata.subdirectory') + .joinpath('binary.file') + .read_bytes() + ) + self.assertEqual(result, b'\0\1\2\3') + + +class ReadNamespaceTests(ReadTests, unittest.TestCase): + def setUp(self): + from . import namespacedata01 + + self.data = namespacedata01 + + +if __name__ == '__main__': + unittest.main() diff --git a/libs/win/importlib_resources/tests/test_reader.py b/libs/win/importlib_resources/tests/test_reader.py new file mode 100644 index 00000000..1c8ebeeb --- /dev/null +++ b/libs/win/importlib_resources/tests/test_reader.py @@ -0,0 +1,133 @@ +import os.path +import sys +import pathlib +import unittest + +from importlib import import_module +from importlib_resources.readers import MultiplexedPath, NamespaceReader + + +class MultiplexedPathTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + path = pathlib.Path(__file__).parent / 'namespacedata01' + cls.folder = str(path) + + def test_init_no_paths(self): + with self.assertRaises(FileNotFoundError): + MultiplexedPath() + + def test_init_file(self): + with self.assertRaises(NotADirectoryError): + MultiplexedPath(os.path.join(self.folder, 'binary.file')) + + def test_iterdir(self): + contents = {path.name for path in MultiplexedPath(self.folder).iterdir()} + try: + contents.remove('__pycache__') + except (KeyError, ValueError): + pass + self.assertEqual(contents, {'binary.file', 'utf-16.file', 'utf-8.file'}) + + def test_iterdir_duplicate(self): + data01 = os.path.abspath(os.path.join(__file__, '..', 'data01')) + contents = { + path.name for path in MultiplexedPath(self.folder, data01).iterdir() + } + for remove in ('__pycache__', '__init__.pyc'): + try: + contents.remove(remove) + except (KeyError, ValueError): + pass + self.assertEqual( + contents, + {'__init__.py', 'binary.file', 'subdirectory', 'utf-16.file', 'utf-8.file'}, + ) + + def test_is_dir(self): + self.assertEqual(MultiplexedPath(self.folder).is_dir(), True) + + def test_is_file(self): + self.assertEqual(MultiplexedPath(self.folder).is_file(), False) + + def test_open_file(self): + path = MultiplexedPath(self.folder) + with self.assertRaises(FileNotFoundError): + path.read_bytes() + with self.assertRaises(FileNotFoundError): + path.read_text() + with self.assertRaises(FileNotFoundError): + path.open() + + def test_join_path(self): + prefix = os.path.abspath(os.path.join(__file__, '..')) + data01 = os.path.join(prefix, 'data01') + path = MultiplexedPath(self.folder, data01) + self.assertEqual( + str(path.joinpath('binary.file'))[len(prefix) + 1 :], + os.path.join('namespacedata01', 'binary.file'), + ) + self.assertEqual( + str(path.joinpath('subdirectory'))[len(prefix) + 1 :], + os.path.join('data01', 'subdirectory'), + ) + self.assertEqual( + str(path.joinpath('imaginary'))[len(prefix) + 1 :], + os.path.join('namespacedata01', 'imaginary'), + ) + self.assertEqual(path.joinpath(), path) + + def test_join_path_compound(self): + path = MultiplexedPath(self.folder) + assert not path.joinpath('imaginary/foo.py').exists() + + def test_repr(self): + self.assertEqual( + repr(MultiplexedPath(self.folder)), + f"MultiplexedPath('{self.folder}')", + ) + + def test_name(self): + self.assertEqual( + MultiplexedPath(self.folder).name, + os.path.basename(self.folder), + ) + + +class NamespaceReaderTest(unittest.TestCase): + site_dir = str(pathlib.Path(__file__).parent) + + @classmethod + def setUpClass(cls): + sys.path.append(cls.site_dir) + + @classmethod + def tearDownClass(cls): + sys.path.remove(cls.site_dir) + + def test_init_error(self): + with self.assertRaises(ValueError): + NamespaceReader(['path1', 'path2']) + + def test_resource_path(self): + namespacedata01 = import_module('namespacedata01') + reader = NamespaceReader(namespacedata01.__spec__.submodule_search_locations) + + root = os.path.abspath(os.path.join(__file__, '..', 'namespacedata01')) + self.assertEqual( + reader.resource_path('binary.file'), os.path.join(root, 'binary.file') + ) + self.assertEqual( + reader.resource_path('imaginary'), os.path.join(root, 'imaginary') + ) + + def test_files(self): + namespacedata01 = import_module('namespacedata01') + reader = NamespaceReader(namespacedata01.__spec__.submodule_search_locations) + root = os.path.abspath(os.path.join(__file__, '..', 'namespacedata01')) + self.assertIsInstance(reader.files(), MultiplexedPath) + self.assertEqual(repr(reader.files()), f"MultiplexedPath('{root}')") + + +if __name__ == '__main__': + unittest.main() diff --git a/libs/win/importlib_resources/tests/test_resource.py b/libs/win/importlib_resources/tests/test_resource.py new file mode 100644 index 00000000..82390271 --- /dev/null +++ b/libs/win/importlib_resources/tests/test_resource.py @@ -0,0 +1,260 @@ +import sys +import unittest +import importlib_resources as resources +import uuid +import pathlib + +from . import data01 +from . import zipdata01, zipdata02 +from . import util +from importlib import import_module +from ._compat import import_helper, unlink + + +class ResourceTests: + # Subclasses are expected to set the `data` attribute. + + def test_is_file_exists(self): + target = resources.files(self.data) / 'binary.file' + self.assertTrue(target.is_file()) + + def test_is_file_missing(self): + target = resources.files(self.data) / 'not-a-file' + self.assertFalse(target.is_file()) + + def test_is_dir(self): + target = resources.files(self.data) / 'subdirectory' + self.assertFalse(target.is_file()) + self.assertTrue(target.is_dir()) + + +class ResourceDiskTests(ResourceTests, unittest.TestCase): + def setUp(self): + self.data = data01 + + +class ResourceZipTests(ResourceTests, util.ZipSetup, unittest.TestCase): + pass + + +def names(traversable): + return {item.name for item in traversable.iterdir()} + + +class ResourceLoaderTests(unittest.TestCase): + def test_resource_contents(self): + package = util.create_package( + file=data01, path=data01.__file__, contents=['A', 'B', 'C'] + ) + self.assertEqual(names(resources.files(package)), {'A', 'B', 'C'}) + + def test_is_file(self): + package = util.create_package( + file=data01, path=data01.__file__, contents=['A', 'B', 'C', 'D/E', 'D/F'] + ) + self.assertTrue(resources.files(package).joinpath('B').is_file()) + + def test_is_dir(self): + package = util.create_package( + file=data01, path=data01.__file__, contents=['A', 'B', 'C', 'D/E', 'D/F'] + ) + self.assertTrue(resources.files(package).joinpath('D').is_dir()) + + def test_resource_missing(self): + package = util.create_package( + file=data01, path=data01.__file__, contents=['A', 'B', 'C', 'D/E', 'D/F'] + ) + self.assertFalse(resources.files(package).joinpath('Z').is_file()) + + +class ResourceCornerCaseTests(unittest.TestCase): + def test_package_has_no_reader_fallback(self): + # Test odd ball packages which: + # 1. Do not have a ResourceReader as a loader + # 2. Are not on the file system + # 3. Are not in a zip file + module = util.create_package( + file=data01, path=data01.__file__, contents=['A', 'B', 'C'] + ) + # Give the module a dummy loader. + module.__loader__ = object() + # Give the module a dummy origin. + module.__file__ = '/path/which/shall/not/be/named' + module.__spec__.loader = module.__loader__ + module.__spec__.origin = module.__file__ + self.assertFalse(resources.files(module).joinpath('A').is_file()) + + +class ResourceFromZipsTest01(util.ZipSetupBase, unittest.TestCase): + ZIP_MODULE = zipdata01 # type: ignore + + def test_is_submodule_resource(self): + submodule = import_module('ziptestdata.subdirectory') + self.assertTrue(resources.files(submodule).joinpath('binary.file').is_file()) + + def test_read_submodule_resource_by_name(self): + self.assertTrue( + resources.files('ziptestdata.subdirectory') + .joinpath('binary.file') + .is_file() + ) + + def test_submodule_contents(self): + submodule = import_module('ziptestdata.subdirectory') + self.assertEqual( + names(resources.files(submodule)), {'__init__.py', 'binary.file'} + ) + + def test_submodule_contents_by_name(self): + self.assertEqual( + names(resources.files('ziptestdata.subdirectory')), + {'__init__.py', 'binary.file'}, + ) + + def test_as_file_directory(self): + with resources.as_file(resources.files('ziptestdata')) as data: + assert data.name == 'ziptestdata' + assert data.is_dir() + assert data.joinpath('subdirectory').is_dir() + assert len(list(data.iterdir())) + assert not data.parent.exists() + + +class ResourceFromZipsTest02(util.ZipSetupBase, unittest.TestCase): + ZIP_MODULE = zipdata02 # type: ignore + + def test_unrelated_contents(self): + """ + Test thata zip with two unrelated subpackages return + distinct resources. Ref python/importlib_resources#44. + """ + self.assertEqual( + names(resources.files('ziptestdata.one')), + {'__init__.py', 'resource1.txt'}, + ) + self.assertEqual( + names(resources.files('ziptestdata.two')), + {'__init__.py', 'resource2.txt'}, + ) + + +class DeletingZipsTest(unittest.TestCase): + """Having accessed resources in a zip file should not keep an open + reference to the zip. + """ + + ZIP_MODULE = zipdata01 + + def setUp(self): + modules = import_helper.modules_setup() + self.addCleanup(import_helper.modules_cleanup, *modules) + + data_path = pathlib.Path(self.ZIP_MODULE.__file__) + data_dir = data_path.parent + self.source_zip_path = data_dir / 'ziptestdata.zip' + self.zip_path = pathlib.Path(f'{uuid.uuid4()}.zip').absolute() + self.zip_path.write_bytes(self.source_zip_path.read_bytes()) + sys.path.append(str(self.zip_path)) + self.data = import_module('ziptestdata') + + def tearDown(self): + try: + sys.path.remove(str(self.zip_path)) + except ValueError: + pass + + try: + del sys.path_importer_cache[str(self.zip_path)] + del sys.modules[self.data.__name__] + except KeyError: + pass + + try: + unlink(self.zip_path) + except OSError: + # If the test fails, this will probably fail too + pass + + def test_iterdir_does_not_keep_open(self): + c = [item.name for item in resources.files('ziptestdata').iterdir()] + self.zip_path.unlink() + del c + + def test_is_file_does_not_keep_open(self): + c = resources.files('ziptestdata').joinpath('binary.file').is_file() + self.zip_path.unlink() + del c + + def test_is_file_failure_does_not_keep_open(self): + c = resources.files('ziptestdata').joinpath('not-present').is_file() + self.zip_path.unlink() + del c + + @unittest.skip("Desired but not supported.") + def test_as_file_does_not_keep_open(self): # pragma: no cover + c = resources.as_file(resources.files('ziptestdata') / 'binary.file') + self.zip_path.unlink() + del c + + def test_entered_path_does_not_keep_open(self): + # This is what certifi does on import to make its bundle + # available for the process duration. + c = resources.as_file( + resources.files('ziptestdata') / 'binary.file' + ).__enter__() + self.zip_path.unlink() + del c + + def test_read_binary_does_not_keep_open(self): + c = resources.files('ziptestdata').joinpath('binary.file').read_bytes() + self.zip_path.unlink() + del c + + def test_read_text_does_not_keep_open(self): + c = resources.files('ziptestdata').joinpath('utf-8.file').read_text() + self.zip_path.unlink() + del c + + +class ResourceFromNamespaceTest01(unittest.TestCase): + site_dir = str(pathlib.Path(__file__).parent) + + @classmethod + def setUpClass(cls): + sys.path.append(cls.site_dir) + + @classmethod + def tearDownClass(cls): + sys.path.remove(cls.site_dir) + + def test_is_submodule_resource(self): + self.assertTrue( + resources.files(import_module('namespacedata01')) + .joinpath('binary.file') + .is_file() + ) + + def test_read_submodule_resource_by_name(self): + self.assertTrue( + resources.files('namespacedata01').joinpath('binary.file').is_file() + ) + + def test_submodule_contents(self): + contents = names(resources.files(import_module('namespacedata01'))) + try: + contents.remove('__pycache__') + except KeyError: + pass + self.assertEqual(contents, {'binary.file', 'utf-8.file', 'utf-16.file'}) + + def test_submodule_contents_by_name(self): + contents = names(resources.files('namespacedata01')) + try: + contents.remove('__pycache__') + except KeyError: + pass + self.assertEqual(contents, {'binary.file', 'utf-8.file', 'utf-16.file'}) + + +if __name__ == '__main__': + unittest.main() diff --git a/libs/win/importlib_resources/tests/update-zips.py b/libs/win/importlib_resources/tests/update-zips.py new file mode 100644 index 00000000..231334aa --- /dev/null +++ b/libs/win/importlib_resources/tests/update-zips.py @@ -0,0 +1,53 @@ +""" +Generate the zip test data files. + +Run to build the tests/zipdataNN/ziptestdata.zip files from +files in tests/dataNN. + +Replaces the file with the working copy, but does commit anything +to the source repo. +""" + +import contextlib +import os +import pathlib +import zipfile + + +def main(): + """ + >>> from unittest import mock + >>> monkeypatch = getfixture('monkeypatch') + >>> monkeypatch.setattr(zipfile, 'ZipFile', mock.MagicMock()) + >>> print(); main() # print workaround for bpo-32509 + + ...data01... -> ziptestdata/... + ... + ...data02... -> ziptestdata/... + ... + """ + suffixes = '01', '02' + tuple(map(generate, suffixes)) + + +def generate(suffix): + root = pathlib.Path(__file__).parent.relative_to(os.getcwd()) + zfpath = root / f'zipdata{suffix}/ziptestdata.zip' + with zipfile.ZipFile(zfpath, 'w') as zf: + for src, rel in walk(root / f'data{suffix}'): + dst = 'ziptestdata' / pathlib.PurePosixPath(rel.as_posix()) + print(src, '->', dst) + zf.write(src, dst) + + +def walk(datapath): + for dirpath, dirnames, filenames in os.walk(datapath): + with contextlib.suppress(ValueError): + dirnames.remove('__pycache__') + for filename in filenames: + res = pathlib.Path(dirpath) / filename + rel = res.relative_to(datapath) + yield res, rel + + +__name__ == '__main__' and main() diff --git a/libs/win/importlib_resources/tests/util.py b/libs/win/importlib_resources/tests/util.py new file mode 100644 index 00000000..b596c0ce --- /dev/null +++ b/libs/win/importlib_resources/tests/util.py @@ -0,0 +1,167 @@ +import abc +import importlib +import io +import sys +import types +import pathlib + +from . import data01 +from . import zipdata01 +from ..abc import ResourceReader +from ._compat import import_helper + + +from importlib.machinery import ModuleSpec + + +class Reader(ResourceReader): + def __init__(self, **kwargs): + vars(self).update(kwargs) + + def get_resource_reader(self, package): + return self + + def open_resource(self, path): + self._path = path + if isinstance(self.file, Exception): + raise self.file + return self.file + + def resource_path(self, path_): + self._path = path_ + if isinstance(self.path, Exception): + raise self.path + return self.path + + def is_resource(self, path_): + self._path = path_ + if isinstance(self.path, Exception): + raise self.path + + def part(entry): + return entry.split('/') + + return any( + len(parts) == 1 and parts[0] == path_ for parts in map(part, self._contents) + ) + + def contents(self): + if isinstance(self.path, Exception): + raise self.path + yield from self._contents + + +def create_package_from_loader(loader, is_package=True): + name = 'testingpackage' + module = types.ModuleType(name) + spec = ModuleSpec(name, loader, origin='does-not-exist', is_package=is_package) + module.__spec__ = spec + module.__loader__ = loader + return module + + +def create_package(file=None, path=None, is_package=True, contents=()): + return create_package_from_loader( + Reader(file=file, path=path, _contents=contents), + is_package, + ) + + +class CommonTests(metaclass=abc.ABCMeta): + """ + Tests shared by test_open, test_path, and test_read. + """ + + @abc.abstractmethod + def execute(self, package, path): + """ + Call the pertinent legacy API function (e.g. open_text, path) + on package and path. + """ + + def test_package_name(self): + # Passing in the package name should succeed. + self.execute(data01.__name__, 'utf-8.file') + + def test_package_object(self): + # Passing in the package itself should succeed. + self.execute(data01, 'utf-8.file') + + def test_string_path(self): + # Passing in a string for the path should succeed. + path = 'utf-8.file' + self.execute(data01, path) + + def test_pathlib_path(self): + # Passing in a pathlib.PurePath object for the path should succeed. + path = pathlib.PurePath('utf-8.file') + self.execute(data01, path) + + def test_importing_module_as_side_effect(self): + # The anchor package can already be imported. + del sys.modules[data01.__name__] + self.execute(data01.__name__, 'utf-8.file') + + def test_missing_path(self): + # Attempting to open or read or request the path for a + # non-existent path should succeed if open_resource + # can return a viable data stream. + bytes_data = io.BytesIO(b'Hello, world!') + package = create_package(file=bytes_data, path=FileNotFoundError()) + self.execute(package, 'utf-8.file') + self.assertEqual(package.__loader__._path, 'utf-8.file') + + def test_extant_path(self): + # Attempting to open or read or request the path when the + # path does exist should still succeed. Does not assert + # anything about the result. + bytes_data = io.BytesIO(b'Hello, world!') + # any path that exists + path = __file__ + package = create_package(file=bytes_data, path=path) + self.execute(package, 'utf-8.file') + self.assertEqual(package.__loader__._path, 'utf-8.file') + + def test_useless_loader(self): + package = create_package(file=FileNotFoundError(), path=FileNotFoundError()) + with self.assertRaises(FileNotFoundError): + self.execute(package, 'utf-8.file') + + +class ZipSetupBase: + ZIP_MODULE = None + + @classmethod + def setUpClass(cls): + data_path = pathlib.Path(cls.ZIP_MODULE.__file__) + data_dir = data_path.parent + cls._zip_path = str(data_dir / 'ziptestdata.zip') + sys.path.append(cls._zip_path) + cls.data = importlib.import_module('ziptestdata') + + @classmethod + def tearDownClass(cls): + try: + sys.path.remove(cls._zip_path) + except ValueError: + pass + + try: + del sys.path_importer_cache[cls._zip_path] + del sys.modules[cls.data.__name__] + except KeyError: + pass + + try: + del cls.data + del cls._zip_path + except AttributeError: + pass + + def setUp(self): + modules = import_helper.modules_setup() + self.addCleanup(import_helper.modules_cleanup, *modules) + + +class ZipSetup(ZipSetupBase): + ZIP_MODULE = zipdata01 # type: ignore diff --git a/libs/win/importlib_resources/tests/zipdata01/__init__.py b/libs/win/importlib_resources/tests/zipdata01/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/libs/win/importlib_resources/tests/zipdata01/ziptestdata.zip b/libs/win/importlib_resources/tests/zipdata01/ziptestdata.zip new file mode 100644 index 0000000000000000000000000000000000000000..9a3bb0739f87e97c1084b94d7d153680f6727738 GIT binary patch literal 876 zcmWIWW@Zs#00HOCX@Q%&m27l?Y!DU);;PJolGNgol*E!m{nC;&T|+ayw9K5;|NlG~ zQWMD z9;rDw`8o=rA#S=B3g!7lIVp-}COK17UPc zNtt;*xhM-3R!jMEPhCreO-3*u>5Df}T7+BJ{639e$2uhfsIs`pJ5Qf}C xGXyDE@VNvOv@o!wQJfLgCAgysx3f@9jKpUmiW^zkK<;1z!tFpk^MROw0RS~O%0&PG literal 0 HcmV?d00001 diff --git a/libs/win/importlib_resources/tests/zipdata02/__init__.py b/libs/win/importlib_resources/tests/zipdata02/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/libs/win/importlib_resources/tests/zipdata02/ziptestdata.zip b/libs/win/importlib_resources/tests/zipdata02/ziptestdata.zip new file mode 100644 index 0000000000000000000000000000000000000000..d63ff512d2807ef2fd259455283b81b02e0e45fb GIT binary patch literal 698 zcmWIWW@Zs#00HOCX@Ot{ln@8fRhb1Psl_EJi6x2p@$s2?nI-Y@dIgmMI5kP5Y0A$_ z#jWw|&p#`9ff_(q7K_HB)Z+ZoqU2OVy^@L&ph*fa0WRVlP*R?c+X1opI-R&20MZDv z&j{oIpa8N17@0(vaR(gGH(;=&5k%n(M%;#g0ulz6G@1gL$cA79E2=^00gEsw4~s!C zUxI@ZWaIMqz|BszK;s4KsL2<9jRy!Q2E6`2cTLHjr{wAk1ZCU@!+_ G1_l6Bc%f?m literal 0 HcmV?d00001 diff --git a/libs/win/incubator/replace-file.py b/libs/win/incubator/replace-file.py new file mode 100644 index 00000000..a4d24bde --- /dev/null +++ b/libs/win/incubator/replace-file.py @@ -0,0 +1,10 @@ +from jaraco.windows.api.filesystem import ReplaceFile + +open('orig-file', 'w').write('some content') +open('replacing-file', 'w').write('new content') +ReplaceFile('orig-file', 'replacing-file', 'orig-backup', 0, 0, 0) +assert open('orig-file').read() == 'new content' +assert open('orig-backup').read() == 'some content' +import os + +assert not os.path.exists('replacing-file') diff --git a/libs/win/incubator/trace-symlink.py b/libs/win/incubator/trace-symlink.py new file mode 100644 index 00000000..1e7716db --- /dev/null +++ b/libs/win/incubator/trace-symlink.py @@ -0,0 +1,22 @@ +from jaraco.windows.filesystem import trace_symlink_target + +from optparse import OptionParser + + +def get_args(): + parser = OptionParser() + options, args = parser.parse_args() + try: + options.filename = args.pop(0) + except IndexError: + parser.error('filename required') + return options + + +def main(): + options = get_args() + print(trace_symlink_target(options.filename)) + + +if __name__ == '__main__': + main() diff --git a/libs/win/inflect/__init__.py b/libs/win/inflect/__init__.py new file mode 100644 index 00000000..78d2e33c --- /dev/null +++ b/libs/win/inflect/__init__.py @@ -0,0 +1,3991 @@ +""" +inflect: english language inflection + - correctly generate plurals, ordinals, indefinite articles + - convert numbers to words + +Copyright (C) 2010 Paul Dyson + +Based upon the Perl module +`Lingua::EN::Inflect `_. + +methods: + classical inflect + plural plural_noun plural_verb plural_adj singular_noun no num a an + compare compare_nouns compare_verbs compare_adjs + present_participle + ordinal + number_to_words + join + defnoun defverb defadj defa defan + +INFLECTIONS: + classical inflect + plural plural_noun plural_verb plural_adj singular_noun compare + no num a an present_participle + +PLURALS: + classical inflect + plural plural_noun plural_verb plural_adj singular_noun no num + compare compare_nouns compare_verbs compare_adjs + +COMPARISONS: + classical + compare compare_nouns compare_verbs compare_adjs + +ARTICLES: + classical inflect num a an + +NUMERICAL: + ordinal number_to_words + +USER_DEFINED: + defnoun defverb defadj defa defan + +Exceptions: + UnknownClassicalModeError + BadNumValueError + BadChunkingOptionError + NumOutOfRangeError + BadUserDefinedPatternError + BadRcFileError + BadGenderError + +""" + +import ast +import re +import functools +import collections +import contextlib +from typing import ( + Dict, + Union, + Optional, + Iterable, + List, + Match, + Tuple, + Callable, + Sequence, + cast, + Any, +) +from numbers import Number + + +from pydantic import Field, validate_arguments +from pydantic.typing import Annotated + + +class UnknownClassicalModeError(Exception): + pass + + +class BadNumValueError(Exception): + pass + + +class BadChunkingOptionError(Exception): + pass + + +class NumOutOfRangeError(Exception): + pass + + +class BadUserDefinedPatternError(Exception): + pass + + +class BadRcFileError(Exception): + pass + + +class BadGenderError(Exception): + pass + + +STDOUT_ON = False + + +def print3(txt: str) -> None: + if STDOUT_ON: + print(txt) + + +def enclose(s: str) -> str: + return f"(?:{s})" + + +def joinstem(cutpoint: Optional[int] = 0, words: Optional[Iterable[str]] = None) -> str: + """ + Join stem of each word in words into a string for regex. + + Each word is truncated at cutpoint. + + Cutpoint is usually negative indicating the number of letters to remove + from the end of each word. + + >>> joinstem(-2, ["ephemeris", "iris", ".*itis"]) + '(?:ephemer|ir|.*it)' + + >>> joinstem(None, ["ephemeris"]) + '(?:ephemeris)' + + >>> joinstem(5, None) + '(?:)' + """ + return enclose("|".join(w[:cutpoint] for w in words or [])) + + +def bysize(words: Iterable[str]) -> Dict[int, set]: + """ + From a list of words, return a dict of sets sorted by word length. + + >>> words = ['ant', 'cat', 'dog', 'pig', 'frog', 'goat', 'horse', 'elephant'] + >>> ret = bysize(words) + >>> sorted(ret[3]) + ['ant', 'cat', 'dog', 'pig'] + >>> ret[5] + {'horse'} + """ + res: Dict[int, set] = collections.defaultdict(set) + for w in words: + res[len(w)].add(w) + return res + + +def make_pl_si_lists( + lst: Iterable[str], + plending: str, + siendingsize: Optional[int], + dojoinstem: bool = True, +): + """ + given a list of singular words: lst + + an ending to append to make the plural: plending + + the number of characters to remove from the singular + before appending plending: siendingsize + + a flag whether to create a joinstem: dojoinstem + + return: + a list of pluralised words: si_list (called si because this is what you need to + look for to make the singular) + + the pluralised words as a dict of sets sorted by word length: si_bysize + the singular words as a dict of sets sorted by word length: pl_bysize + if dojoinstem is True: a regular expression that matches any of the stems: stem + """ + if siendingsize is not None: + siendingsize = -siendingsize + si_list = [w[:siendingsize] + plending for w in lst] + pl_bysize = bysize(lst) + si_bysize = bysize(si_list) + if dojoinstem: + stem = joinstem(siendingsize, lst) + return si_list, si_bysize, pl_bysize, stem + else: + return si_list, si_bysize, pl_bysize + + +# 1. PLURALS + +pl_sb_irregular_s = { + "corpus": "corpuses|corpora", + "opus": "opuses|opera", + "genus": "genera", + "mythos": "mythoi", + "penis": "penises|penes", + "testis": "testes", + "atlas": "atlases|atlantes", + "yes": "yeses", +} + +pl_sb_irregular = { + "child": "children", + "chili": "chilis|chilies", + "brother": "brothers|brethren", + "infinity": "infinities|infinity", + "loaf": "loaves", + "lore": "lores|lore", + "hoof": "hoofs|hooves", + "beef": "beefs|beeves", + "thief": "thiefs|thieves", + "money": "monies", + "mongoose": "mongooses", + "ox": "oxen", + "cow": "cows|kine", + "graffito": "graffiti", + "octopus": "octopuses|octopodes", + "genie": "genies|genii", + "ganglion": "ganglions|ganglia", + "trilby": "trilbys", + "turf": "turfs|turves", + "numen": "numina", + "atman": "atmas", + "occiput": "occiputs|occipita", + "sabretooth": "sabretooths", + "sabertooth": "sabertooths", + "lowlife": "lowlifes", + "flatfoot": "flatfoots", + "tenderfoot": "tenderfoots", + "romany": "romanies", + "jerry": "jerries", + "mary": "maries", + "talouse": "talouses", + "rom": "roma", + "carmen": "carmina", +} + +pl_sb_irregular.update(pl_sb_irregular_s) +# pl_sb_irregular_keys = enclose('|'.join(pl_sb_irregular.keys())) + +pl_sb_irregular_caps = { + "Romany": "Romanies", + "Jerry": "Jerrys", + "Mary": "Marys", + "Rom": "Roma", +} + +pl_sb_irregular_compound = {"prima donna": "prima donnas|prime donne"} + +si_sb_irregular = {v: k for (k, v) in pl_sb_irregular.items()} +for k in list(si_sb_irregular): + if "|" in k: + k1, k2 = k.split("|") + si_sb_irregular[k1] = si_sb_irregular[k2] = si_sb_irregular[k] + del si_sb_irregular[k] +si_sb_irregular_caps = {v: k for (k, v) in pl_sb_irregular_caps.items()} +si_sb_irregular_compound = {v: k for (k, v) in pl_sb_irregular_compound.items()} +for k in list(si_sb_irregular_compound): + if "|" in k: + k1, k2 = k.split("|") + si_sb_irregular_compound[k1] = si_sb_irregular_compound[ + k2 + ] = si_sb_irregular_compound[k] + del si_sb_irregular_compound[k] + +# si_sb_irregular_keys = enclose('|'.join(si_sb_irregular.keys())) + +# Z's that don't double + +pl_sb_z_zes_list = ("quartz", "topaz") +pl_sb_z_zes_bysize = bysize(pl_sb_z_zes_list) + +pl_sb_ze_zes_list = ("snooze",) +pl_sb_ze_zes_bysize = bysize(pl_sb_ze_zes_list) + + +# CLASSICAL "..is" -> "..ides" + +pl_sb_C_is_ides_complete = [ + # GENERAL WORDS... + "ephemeris", + "iris", + "clitoris", + "chrysalis", + "epididymis", +] + +pl_sb_C_is_ides_endings = [ + # INFLAMATIONS... + "itis" +] + +pl_sb_C_is_ides = joinstem( + -2, pl_sb_C_is_ides_complete + [f".*{w}" for w in pl_sb_C_is_ides_endings] +) + +pl_sb_C_is_ides_list = pl_sb_C_is_ides_complete + pl_sb_C_is_ides_endings + +( + si_sb_C_is_ides_list, + si_sb_C_is_ides_bysize, + pl_sb_C_is_ides_bysize, +) = make_pl_si_lists(pl_sb_C_is_ides_list, "ides", 2, dojoinstem=False) + + +# CLASSICAL "..a" -> "..ata" + +pl_sb_C_a_ata_list = ( + "anathema", + "bema", + "carcinoma", + "charisma", + "diploma", + "dogma", + "drama", + "edema", + "enema", + "enigma", + "lemma", + "lymphoma", + "magma", + "melisma", + "miasma", + "oedema", + "sarcoma", + "schema", + "soma", + "stigma", + "stoma", + "trauma", + "gumma", + "pragma", +) + +( + si_sb_C_a_ata_list, + si_sb_C_a_ata_bysize, + pl_sb_C_a_ata_bysize, + pl_sb_C_a_ata, +) = make_pl_si_lists(pl_sb_C_a_ata_list, "ata", 1) + +# UNCONDITIONAL "..a" -> "..ae" + +pl_sb_U_a_ae_list = ( + "alumna", + "alga", + "vertebra", + "persona", + "vita", +) +( + si_sb_U_a_ae_list, + si_sb_U_a_ae_bysize, + pl_sb_U_a_ae_bysize, + pl_sb_U_a_ae, +) = make_pl_si_lists(pl_sb_U_a_ae_list, "e", None) + +# CLASSICAL "..a" -> "..ae" + +pl_sb_C_a_ae_list = ( + "amoeba", + "antenna", + "formula", + "hyperbola", + "medusa", + "nebula", + "parabola", + "abscissa", + "hydra", + "nova", + "lacuna", + "aurora", + "umbra", + "flora", + "fauna", +) +( + si_sb_C_a_ae_list, + si_sb_C_a_ae_bysize, + pl_sb_C_a_ae_bysize, + pl_sb_C_a_ae, +) = make_pl_si_lists(pl_sb_C_a_ae_list, "e", None) + + +# CLASSICAL "..en" -> "..ina" + +pl_sb_C_en_ina_list = ("stamen", "foramen", "lumen") + +( + si_sb_C_en_ina_list, + si_sb_C_en_ina_bysize, + pl_sb_C_en_ina_bysize, + pl_sb_C_en_ina, +) = make_pl_si_lists(pl_sb_C_en_ina_list, "ina", 2) + + +# UNCONDITIONAL "..um" -> "..a" + +pl_sb_U_um_a_list = ( + "bacterium", + "agendum", + "desideratum", + "erratum", + "stratum", + "datum", + "ovum", + "extremum", + "candelabrum", +) +( + si_sb_U_um_a_list, + si_sb_U_um_a_bysize, + pl_sb_U_um_a_bysize, + pl_sb_U_um_a, +) = make_pl_si_lists(pl_sb_U_um_a_list, "a", 2) + +# CLASSICAL "..um" -> "..a" + +pl_sb_C_um_a_list = ( + "maximum", + "minimum", + "momentum", + "optimum", + "quantum", + "cranium", + "curriculum", + "dictum", + "phylum", + "aquarium", + "compendium", + "emporium", + "encomium", + "gymnasium", + "honorarium", + "interregnum", + "lustrum", + "memorandum", + "millennium", + "rostrum", + "spectrum", + "speculum", + "stadium", + "trapezium", + "ultimatum", + "medium", + "vacuum", + "velum", + "consortium", + "arboretum", +) + +( + si_sb_C_um_a_list, + si_sb_C_um_a_bysize, + pl_sb_C_um_a_bysize, + pl_sb_C_um_a, +) = make_pl_si_lists(pl_sb_C_um_a_list, "a", 2) + + +# UNCONDITIONAL "..us" -> "i" + +pl_sb_U_us_i_list = ( + "alumnus", + "alveolus", + "bacillus", + "bronchus", + "locus", + "nucleus", + "stimulus", + "meniscus", + "sarcophagus", +) +( + si_sb_U_us_i_list, + si_sb_U_us_i_bysize, + pl_sb_U_us_i_bysize, + pl_sb_U_us_i, +) = make_pl_si_lists(pl_sb_U_us_i_list, "i", 2) + +# CLASSICAL "..us" -> "..i" + +pl_sb_C_us_i_list = ( + "focus", + "radius", + "genius", + "incubus", + "succubus", + "nimbus", + "fungus", + "nucleolus", + "stylus", + "torus", + "umbilicus", + "uterus", + "hippopotamus", + "cactus", +) + +( + si_sb_C_us_i_list, + si_sb_C_us_i_bysize, + pl_sb_C_us_i_bysize, + pl_sb_C_us_i, +) = make_pl_si_lists(pl_sb_C_us_i_list, "i", 2) + + +# CLASSICAL "..us" -> "..us" (ASSIMILATED 4TH DECLENSION LATIN NOUNS) + +pl_sb_C_us_us = ( + "status", + "apparatus", + "prospectus", + "sinus", + "hiatus", + "impetus", + "plexus", +) +pl_sb_C_us_us_bysize = bysize(pl_sb_C_us_us) + +# UNCONDITIONAL "..on" -> "a" + +pl_sb_U_on_a_list = ( + "criterion", + "perihelion", + "aphelion", + "phenomenon", + "prolegomenon", + "noumenon", + "organon", + "asyndeton", + "hyperbaton", +) +( + si_sb_U_on_a_list, + si_sb_U_on_a_bysize, + pl_sb_U_on_a_bysize, + pl_sb_U_on_a, +) = make_pl_si_lists(pl_sb_U_on_a_list, "a", 2) + +# CLASSICAL "..on" -> "..a" + +pl_sb_C_on_a_list = ("oxymoron",) + +( + si_sb_C_on_a_list, + si_sb_C_on_a_bysize, + pl_sb_C_on_a_bysize, + pl_sb_C_on_a, +) = make_pl_si_lists(pl_sb_C_on_a_list, "a", 2) + + +# CLASSICAL "..o" -> "..i" (BUT NORMALLY -> "..os") + +pl_sb_C_o_i = [ + "solo", + "soprano", + "basso", + "alto", + "contralto", + "tempo", + "piano", + "virtuoso", +] # list not tuple so can concat for pl_sb_U_o_os + +pl_sb_C_o_i_bysize = bysize(pl_sb_C_o_i) +si_sb_C_o_i_bysize = bysize([f"{w[:-1]}i" for w in pl_sb_C_o_i]) + +pl_sb_C_o_i_stems = joinstem(-1, pl_sb_C_o_i) + +# ALWAYS "..o" -> "..os" + +pl_sb_U_o_os_complete = {"ado", "ISO", "NATO", "NCO", "NGO", "oto"} +si_sb_U_o_os_complete = {f"{w}s" for w in pl_sb_U_o_os_complete} + + +pl_sb_U_o_os_endings = [ + "aficionado", + "aggro", + "albino", + "allegro", + "ammo", + "Antananarivo", + "archipelago", + "armadillo", + "auto", + "avocado", + "Bamako", + "Barquisimeto", + "bimbo", + "bingo", + "Biro", + "bolero", + "Bolzano", + "bongo", + "Boto", + "burro", + "Cairo", + "canto", + "cappuccino", + "casino", + "cello", + "Chicago", + "Chimango", + "cilantro", + "cochito", + "coco", + "Colombo", + "Colorado", + "commando", + "concertino", + "contango", + "credo", + "crescendo", + "cyano", + "demo", + "ditto", + "Draco", + "dynamo", + "embryo", + "Esperanto", + "espresso", + "euro", + "falsetto", + "Faro", + "fiasco", + "Filipino", + "flamenco", + "furioso", + "generalissimo", + "Gestapo", + "ghetto", + "gigolo", + "gizmo", + "Greensboro", + "gringo", + "Guaiabero", + "guano", + "gumbo", + "gyro", + "hairdo", + "hippo", + "Idaho", + "impetigo", + "inferno", + "info", + "intermezzo", + "intertrigo", + "Iquico", + "jumbo", + "junto", + "Kakapo", + "kilo", + "Kinkimavo", + "Kokako", + "Kosovo", + "Lesotho", + "libero", + "libido", + "libretto", + "lido", + "Lilo", + "limbo", + "limo", + "lineno", + "lingo", + "lino", + "livedo", + "loco", + "logo", + "lumbago", + "macho", + "macro", + "mafioso", + "magneto", + "magnifico", + "Majuro", + "Malabo", + "manifesto", + "Maputo", + "Maracaibo", + "medico", + "memo", + "metro", + "Mexico", + "micro", + "Milano", + "Monaco", + "mono", + "Montenegro", + "Morocco", + "Muqdisho", + "myo", + "neutrino", + "Ningbo", + "octavo", + "oregano", + "Orinoco", + "Orlando", + "Oslo", + "panto", + "Paramaribo", + "Pardusco", + "pedalo", + "photo", + "pimento", + "pinto", + "pleco", + "Pluto", + "pogo", + "polo", + "poncho", + "Porto-Novo", + "Porto", + "pro", + "psycho", + "pueblo", + "quarto", + "Quito", + "repo", + "rhino", + "risotto", + "rococo", + "rondo", + "Sacramento", + "saddo", + "sago", + "salvo", + "Santiago", + "Sapporo", + "Sarajevo", + "scherzando", + "scherzo", + "silo", + "sirocco", + "sombrero", + "staccato", + "sterno", + "stucco", + "stylo", + "sumo", + "Taiko", + "techno", + "terrazzo", + "testudo", + "timpano", + "tiro", + "tobacco", + "Togo", + "Tokyo", + "torero", + "Torino", + "Toronto", + "torso", + "tremolo", + "typo", + "tyro", + "ufo", + "UNESCO", + "vaquero", + "vermicello", + "verso", + "vibrato", + "violoncello", + "Virgo", + "weirdo", + "WHO", + "WTO", + "Yamoussoukro", + "yo-yo", + "zero", + "Zibo", +] + pl_sb_C_o_i + +pl_sb_U_o_os_bysize = bysize(pl_sb_U_o_os_endings) +si_sb_U_o_os_bysize = bysize([f"{w}s" for w in pl_sb_U_o_os_endings]) + + +# UNCONDITIONAL "..ch" -> "..chs" + +pl_sb_U_ch_chs_list = ("czech", "eunuch", "stomach") + +( + si_sb_U_ch_chs_list, + si_sb_U_ch_chs_bysize, + pl_sb_U_ch_chs_bysize, + pl_sb_U_ch_chs, +) = make_pl_si_lists(pl_sb_U_ch_chs_list, "s", None) + + +# UNCONDITIONAL "..[ei]x" -> "..ices" + +pl_sb_U_ex_ices_list = ("codex", "murex", "silex") +( + si_sb_U_ex_ices_list, + si_sb_U_ex_ices_bysize, + pl_sb_U_ex_ices_bysize, + pl_sb_U_ex_ices, +) = make_pl_si_lists(pl_sb_U_ex_ices_list, "ices", 2) + +pl_sb_U_ix_ices_list = ("radix", "helix") +( + si_sb_U_ix_ices_list, + si_sb_U_ix_ices_bysize, + pl_sb_U_ix_ices_bysize, + pl_sb_U_ix_ices, +) = make_pl_si_lists(pl_sb_U_ix_ices_list, "ices", 2) + +# CLASSICAL "..[ei]x" -> "..ices" + +pl_sb_C_ex_ices_list = ( + "vortex", + "vertex", + "cortex", + "latex", + "pontifex", + "apex", + "index", + "simplex", +) + +( + si_sb_C_ex_ices_list, + si_sb_C_ex_ices_bysize, + pl_sb_C_ex_ices_bysize, + pl_sb_C_ex_ices, +) = make_pl_si_lists(pl_sb_C_ex_ices_list, "ices", 2) + + +pl_sb_C_ix_ices_list = ("appendix",) + +( + si_sb_C_ix_ices_list, + si_sb_C_ix_ices_bysize, + pl_sb_C_ix_ices_bysize, + pl_sb_C_ix_ices, +) = make_pl_si_lists(pl_sb_C_ix_ices_list, "ices", 2) + + +# ARABIC: ".." -> "..i" + +pl_sb_C_i_list = ("afrit", "afreet", "efreet") + +(si_sb_C_i_list, si_sb_C_i_bysize, pl_sb_C_i_bysize, pl_sb_C_i) = make_pl_si_lists( + pl_sb_C_i_list, "i", None +) + + +# HEBREW: ".." -> "..im" + +pl_sb_C_im_list = ("goy", "seraph", "cherub") + +(si_sb_C_im_list, si_sb_C_im_bysize, pl_sb_C_im_bysize, pl_sb_C_im) = make_pl_si_lists( + pl_sb_C_im_list, "im", None +) + + +# UNCONDITIONAL "..man" -> "..mans" + +pl_sb_U_man_mans_list = """ + ataman caiman cayman ceriman + desman dolman farman harman hetman + human leman ottoman shaman talisman +""".split() +pl_sb_U_man_mans_caps_list = """ + Alabaman Bahaman Burman German + Hiroshiman Liman Nakayaman Norman Oklahoman + Panaman Roman Selman Sonaman Tacoman Yakiman + Yokohaman Yuman +""".split() + +( + si_sb_U_man_mans_list, + si_sb_U_man_mans_bysize, + pl_sb_U_man_mans_bysize, +) = make_pl_si_lists(pl_sb_U_man_mans_list, "s", None, dojoinstem=False) +( + si_sb_U_man_mans_caps_list, + si_sb_U_man_mans_caps_bysize, + pl_sb_U_man_mans_caps_bysize, +) = make_pl_si_lists(pl_sb_U_man_mans_caps_list, "s", None, dojoinstem=False) + +# UNCONDITIONAL "..louse" -> "..lice" +pl_sb_U_louse_lice_list = ("booklouse", "grapelouse", "louse", "woodlouse") + +( + si_sb_U_louse_lice_list, + si_sb_U_louse_lice_bysize, + pl_sb_U_louse_lice_bysize, +) = make_pl_si_lists(pl_sb_U_louse_lice_list, "lice", 5, dojoinstem=False) + +pl_sb_uninflected_s_complete = [ + # PAIRS OR GROUPS SUBSUMED TO A SINGULAR... + "breeches", + "britches", + "pajamas", + "pyjamas", + "clippers", + "gallows", + "hijinks", + "headquarters", + "pliers", + "scissors", + "testes", + "herpes", + "pincers", + "shears", + "proceedings", + "trousers", + # UNASSIMILATED LATIN 4th DECLENSION + "cantus", + "coitus", + "nexus", + # RECENT IMPORTS... + "contretemps", + "corps", + "debris", + "siemens", + # DISEASES + "mumps", + # MISCELLANEOUS OTHERS... + "diabetes", + "jackanapes", + "series", + "species", + "subspecies", + "rabies", + "chassis", + "innings", + "news", + "mews", + "haggis", +] + +pl_sb_uninflected_s_endings = [ + # RECENT IMPORTS... + "ois", + # DISEASES + "measles", +] + +pl_sb_uninflected_s = pl_sb_uninflected_s_complete + [ + f".*{w}" for w in pl_sb_uninflected_s_endings +] + +pl_sb_uninflected_herd = ( + # DON'T INFLECT IN CLASSICAL MODE, OTHERWISE NORMAL INFLECTION + "wildebeest", + "swine", + "eland", + "bison", + "buffalo", + "cattle", + "elk", + "rhinoceros", + "zucchini", + "caribou", + "dace", + "grouse", + "guinea fowl", + "guinea-fowl", + "haddock", + "hake", + "halibut", + "herring", + "mackerel", + "pickerel", + "pike", + "roe", + "seed", + "shad", + "snipe", + "teal", + "turbot", + "water fowl", + "water-fowl", +) + +pl_sb_uninflected_complete = [ + # SOME FISH AND HERD ANIMALS + "tuna", + "salmon", + "mackerel", + "trout", + "bream", + "sea-bass", + "sea bass", + "carp", + "cod", + "flounder", + "whiting", + "moose", + # OTHER ODDITIES + "graffiti", + "djinn", + "samuri", + "offspring", + "pence", + "quid", + "hertz", +] + pl_sb_uninflected_s_complete +# SOME WORDS ENDING IN ...s (OFTEN PAIRS TAKEN AS A WHOLE) + +pl_sb_uninflected_caps = [ + # ALL NATIONALS ENDING IN -ese + "Portuguese", + "Amoyese", + "Borghese", + "Congoese", + "Faroese", + "Foochowese", + "Genevese", + "Genoese", + "Gilbertese", + "Hottentotese", + "Kiplingese", + "Kongoese", + "Lucchese", + "Maltese", + "Nankingese", + "Niasese", + "Pekingese", + "Piedmontese", + "Pistoiese", + "Sarawakese", + "Shavese", + "Vermontese", + "Wenchowese", + "Yengeese", +] + + +pl_sb_uninflected_endings = [ + # UNCOUNTABLE NOUNS + "butter", + "cash", + "furniture", + "information", + # SOME FISH AND HERD ANIMALS + "fish", + "deer", + "sheep", + # ALL NATIONALS ENDING IN -ese + "nese", + "rese", + "lese", + "mese", + # DISEASES + "pox", + # OTHER ODDITIES + "craft", +] + pl_sb_uninflected_s_endings +# SOME WORDS ENDING IN ...s (OFTEN PAIRS TAKEN AS A WHOLE) + + +pl_sb_uninflected_bysize = bysize(pl_sb_uninflected_endings) + + +# SINGULAR WORDS ENDING IN ...s (ALL INFLECT WITH ...es) + +pl_sb_singular_s_complete = [ + "acropolis", + "aegis", + "alias", + "asbestos", + "bathos", + "bias", + "bronchitis", + "bursitis", + "caddis", + "cannabis", + "canvas", + "chaos", + "cosmos", + "dais", + "digitalis", + "epidermis", + "ethos", + "eyas", + "gas", + "glottis", + "hubris", + "ibis", + "lens", + "mantis", + "marquis", + "metropolis", + "pathos", + "pelvis", + "polis", + "rhinoceros", + "sassafras", + "trellis", +] + pl_sb_C_is_ides_complete + + +pl_sb_singular_s_endings = ["ss", "us"] + pl_sb_C_is_ides_endings + +pl_sb_singular_s_bysize = bysize(pl_sb_singular_s_endings) + +si_sb_singular_s_complete = [f"{w}es" for w in pl_sb_singular_s_complete] +si_sb_singular_s_endings = [f"{w}es" for w in pl_sb_singular_s_endings] +si_sb_singular_s_bysize = bysize(si_sb_singular_s_endings) + +pl_sb_singular_s_es = ["[A-Z].*es"] + +pl_sb_singular_s = enclose( + "|".join( + pl_sb_singular_s_complete + + [f".*{w}" for w in pl_sb_singular_s_endings] + + pl_sb_singular_s_es + ) +) + + +# PLURALS ENDING IN uses -> use + + +si_sb_ois_oi_case = ("Bolshois", "Hanois") + +si_sb_uses_use_case = ("Betelgeuses", "Duses", "Meuses", "Syracuses", "Toulouses") + +si_sb_uses_use = ( + "abuses", + "applauses", + "blouses", + "carouses", + "causes", + "chartreuses", + "clauses", + "contuses", + "douses", + "excuses", + "fuses", + "grouses", + "hypotenuses", + "masseuses", + "menopauses", + "misuses", + "muses", + "overuses", + "pauses", + "peruses", + "profuses", + "recluses", + "reuses", + "ruses", + "souses", + "spouses", + "suffuses", + "transfuses", + "uses", +) + +si_sb_ies_ie_case = ( + "Addies", + "Aggies", + "Allies", + "Amies", + "Angies", + "Annies", + "Annmaries", + "Archies", + "Arties", + "Aussies", + "Barbies", + "Barries", + "Basies", + "Bennies", + "Bernies", + "Berties", + "Bessies", + "Betties", + "Billies", + "Blondies", + "Bobbies", + "Bonnies", + "Bowies", + "Brandies", + "Bries", + "Brownies", + "Callies", + "Carnegies", + "Carries", + "Cassies", + "Charlies", + "Cheries", + "Christies", + "Connies", + "Curies", + "Dannies", + "Debbies", + "Dixies", + "Dollies", + "Donnies", + "Drambuies", + "Eddies", + "Effies", + "Ellies", + "Elsies", + "Eries", + "Ernies", + "Essies", + "Eugenies", + "Fannies", + "Flossies", + "Frankies", + "Freddies", + "Gillespies", + "Goldies", + "Gracies", + "Guthries", + "Hallies", + "Hatties", + "Hetties", + "Hollies", + "Jackies", + "Jamies", + "Janies", + "Jannies", + "Jeanies", + "Jeannies", + "Jennies", + "Jessies", + "Jimmies", + "Jodies", + "Johnies", + "Johnnies", + "Josies", + "Julies", + "Kalgoorlies", + "Kathies", + "Katies", + "Kellies", + "Kewpies", + "Kristies", + "Laramies", + "Lassies", + "Lauries", + "Leslies", + "Lessies", + "Lillies", + "Lizzies", + "Lonnies", + "Lories", + "Lorries", + "Lotties", + "Louies", + "Mackenzies", + "Maggies", + "Maisies", + "Mamies", + "Marcies", + "Margies", + "Maries", + "Marjories", + "Matties", + "McKenzies", + "Melanies", + "Mickies", + "Millies", + "Minnies", + "Mollies", + "Mounties", + "Nannies", + "Natalies", + "Nellies", + "Netties", + "Ollies", + "Ozzies", + "Pearlies", + "Pottawatomies", + "Reggies", + "Richies", + "Rickies", + "Robbies", + "Ronnies", + "Rosalies", + "Rosemaries", + "Rosies", + "Roxies", + "Rushdies", + "Ruthies", + "Sadies", + "Sallies", + "Sammies", + "Scotties", + "Selassies", + "Sherries", + "Sophies", + "Stacies", + "Stefanies", + "Stephanies", + "Stevies", + "Susies", + "Sylvies", + "Tammies", + "Terries", + "Tessies", + "Tommies", + "Tracies", + "Trekkies", + "Valaries", + "Valeries", + "Valkyries", + "Vickies", + "Virgies", + "Willies", + "Winnies", + "Wylies", + "Yorkies", +) + +si_sb_ies_ie = ( + "aeries", + "baggies", + "belies", + "biggies", + "birdies", + "bogies", + "bonnies", + "boogies", + "bookies", + "bourgeoisies", + "brownies", + "budgies", + "caddies", + "calories", + "camaraderies", + "cockamamies", + "collies", + "cookies", + "coolies", + "cooties", + "coteries", + "crappies", + "curies", + "cutesies", + "dogies", + "eyries", + "floozies", + "footsies", + "freebies", + "genies", + "goalies", + "groupies", + "hies", + "jalousies", + "junkies", + "kiddies", + "laddies", + "lassies", + "lies", + "lingeries", + "magpies", + "menageries", + "mommies", + "movies", + "neckties", + "newbies", + "nighties", + "oldies", + "organdies", + "overlies", + "pies", + "pinkies", + "pixies", + "potpies", + "prairies", + "quickies", + "reveries", + "rookies", + "rotisseries", + "softies", + "sorties", + "species", + "stymies", + "sweeties", + "ties", + "underlies", + "unties", + "veggies", + "vies", + "yuppies", + "zombies", +) + + +si_sb_oes_oe_case = ( + "Chloes", + "Crusoes", + "Defoes", + "Faeroes", + "Ivanhoes", + "Joes", + "McEnroes", + "Moes", + "Monroes", + "Noes", + "Poes", + "Roscoes", + "Tahoes", + "Tippecanoes", + "Zoes", +) + +si_sb_oes_oe = ( + "aloes", + "backhoes", + "canoes", + "does", + "floes", + "foes", + "hoes", + "mistletoes", + "oboes", + "pekoes", + "roes", + "sloes", + "throes", + "tiptoes", + "toes", + "woes", +) + +si_sb_z_zes = ("quartzes", "topazes") + +si_sb_zzes_zz = ("buzzes", "fizzes", "frizzes", "razzes") + +si_sb_ches_che_case = ( + "Andromaches", + "Apaches", + "Blanches", + "Comanches", + "Nietzsches", + "Porsches", + "Roches", +) + +si_sb_ches_che = ( + "aches", + "avalanches", + "backaches", + "bellyaches", + "caches", + "cloches", + "creches", + "douches", + "earaches", + "fiches", + "headaches", + "heartaches", + "microfiches", + "niches", + "pastiches", + "psyches", + "quiches", + "stomachaches", + "toothaches", + "tranches", +) + +si_sb_xes_xe = ("annexes", "axes", "deluxes", "pickaxes") + +si_sb_sses_sse_case = ("Hesses", "Jesses", "Larousses", "Matisses") +si_sb_sses_sse = ( + "bouillabaisses", + "crevasses", + "demitasses", + "impasses", + "mousses", + "posses", +) + +si_sb_ves_ve_case = ( + # *[nwl]ives -> [nwl]live + "Clives", + "Palmolives", +) +si_sb_ves_ve = ( + # *[^d]eaves -> eave + "interweaves", + "weaves", + # *[nwl]ives -> [nwl]live + "olives", + # *[eoa]lves -> [eoa]lve + "bivalves", + "dissolves", + "resolves", + "salves", + "twelves", + "valves", +) + + +plverb_special_s = enclose( + "|".join( + [pl_sb_singular_s] + + pl_sb_uninflected_s + + list(pl_sb_irregular_s) + + ["(.*[csx])is", "(.*)ceps", "[A-Z].*s"] + ) +) + +_pl_sb_postfix_adj_defn = ( + ("general", enclose(r"(?!major|lieutenant|brigadier|adjutant|.*star)\S+")), + ("martial", enclose("court")), + ("force", enclose("pound")), +) + +pl_sb_postfix_adj: Iterable[str] = ( + enclose(val + f"(?=(?:-|\\s+){key})") for key, val in _pl_sb_postfix_adj_defn +) + +pl_sb_postfix_adj_stems = f"({'|'.join(pl_sb_postfix_adj)})(.*)" + + +# PLURAL WORDS ENDING IS es GO TO SINGULAR is + +si_sb_es_is = ( + "amanuenses", + "amniocenteses", + "analyses", + "antitheses", + "apotheoses", + "arterioscleroses", + "atheroscleroses", + "axes", + # 'bases', # bases -> basis + "catalyses", + "catharses", + "chasses", + "cirrhoses", + "cocces", + "crises", + "diagnoses", + "dialyses", + "diereses", + "electrolyses", + "emphases", + "exegeses", + "geneses", + "halitoses", + "hydrolyses", + "hypnoses", + "hypotheses", + "hystereses", + "metamorphoses", + "metastases", + "misdiagnoses", + "mitoses", + "mononucleoses", + "narcoses", + "necroses", + "nemeses", + "neuroses", + "oases", + "osmoses", + "osteoporoses", + "paralyses", + "parentheses", + "parthenogeneses", + "periphrases", + "photosyntheses", + "probosces", + "prognoses", + "prophylaxes", + "prostheses", + "preces", + "psoriases", + "psychoanalyses", + "psychokineses", + "psychoses", + "scleroses", + "scolioses", + "sepses", + "silicoses", + "symbioses", + "synopses", + "syntheses", + "taxes", + "telekineses", + "theses", + "thromboses", + "tuberculoses", + "urinalyses", +) + +pl_prep_list = """ + about above across after among around at athwart before behind + below beneath beside besides between betwixt beyond but by + during except for from in into near of off on onto out over + since till to under until unto upon with""".split() + +pl_prep_list_da = pl_prep_list + ["de", "du", "da"] + +pl_prep_bysize = bysize(pl_prep_list_da) + +pl_prep = enclose("|".join(pl_prep_list_da)) + +pl_sb_prep_dual_compound = fr"(.*?)((?:-|\s+)(?:{pl_prep})(?:-|\s+))a(?:-|\s+)(.*)" + + +singular_pronoun_genders = { + "neuter", + "feminine", + "masculine", + "gender-neutral", + "feminine or masculine", + "masculine or feminine", +} + +pl_pron_nom = { + # NOMINATIVE REFLEXIVE + "i": "we", + "myself": "ourselves", + "you": "you", + "yourself": "yourselves", + "she": "they", + "herself": "themselves", + "he": "they", + "himself": "themselves", + "it": "they", + "itself": "themselves", + "they": "they", + "themself": "themselves", + # POSSESSIVE + "mine": "ours", + "yours": "yours", + "hers": "theirs", + "his": "theirs", + "its": "theirs", + "theirs": "theirs", +} + +si_pron: Dict[str, Dict[str, Union[str, Dict[str, str]]]] = { + "nom": {v: k for (k, v) in pl_pron_nom.items()} +} +si_pron["nom"]["we"] = "I" + + +pl_pron_acc = { + # ACCUSATIVE REFLEXIVE + "me": "us", + "myself": "ourselves", + "you": "you", + "yourself": "yourselves", + "her": "them", + "herself": "themselves", + "him": "them", + "himself": "themselves", + "it": "them", + "itself": "themselves", + "them": "them", + "themself": "themselves", +} + +pl_pron_acc_keys = enclose("|".join(pl_pron_acc)) +pl_pron_acc_keys_bysize = bysize(pl_pron_acc) + +si_pron["acc"] = {v: k for (k, v) in pl_pron_acc.items()} + +for _thecase, _plur, _gend, _sing in ( + ("nom", "they", "neuter", "it"), + ("nom", "they", "feminine", "she"), + ("nom", "they", "masculine", "he"), + ("nom", "they", "gender-neutral", "they"), + ("nom", "they", "feminine or masculine", "she or he"), + ("nom", "they", "masculine or feminine", "he or she"), + ("nom", "themselves", "neuter", "itself"), + ("nom", "themselves", "feminine", "herself"), + ("nom", "themselves", "masculine", "himself"), + ("nom", "themselves", "gender-neutral", "themself"), + ("nom", "themselves", "feminine or masculine", "herself or himself"), + ("nom", "themselves", "masculine or feminine", "himself or herself"), + ("nom", "theirs", "neuter", "its"), + ("nom", "theirs", "feminine", "hers"), + ("nom", "theirs", "masculine", "his"), + ("nom", "theirs", "gender-neutral", "theirs"), + ("nom", "theirs", "feminine or masculine", "hers or his"), + ("nom", "theirs", "masculine or feminine", "his or hers"), + ("acc", "them", "neuter", "it"), + ("acc", "them", "feminine", "her"), + ("acc", "them", "masculine", "him"), + ("acc", "them", "gender-neutral", "them"), + ("acc", "them", "feminine or masculine", "her or him"), + ("acc", "them", "masculine or feminine", "him or her"), + ("acc", "themselves", "neuter", "itself"), + ("acc", "themselves", "feminine", "herself"), + ("acc", "themselves", "masculine", "himself"), + ("acc", "themselves", "gender-neutral", "themself"), + ("acc", "themselves", "feminine or masculine", "herself or himself"), + ("acc", "themselves", "masculine or feminine", "himself or herself"), +): + try: + si_pron[_thecase][_plur][_gend] = _sing # type: ignore + except TypeError: + si_pron[_thecase][_plur] = {} + si_pron[_thecase][_plur][_gend] = _sing # type: ignore + + +si_pron_acc_keys = enclose("|".join(si_pron["acc"])) +si_pron_acc_keys_bysize = bysize(si_pron["acc"]) + + +def get_si_pron(thecase, word, gender) -> str: + try: + sing = si_pron[thecase][word] + except KeyError: + raise # not a pronoun + try: + return sing[gender] # has several types due to gender + except TypeError: + return cast(str, sing) # answer independent of gender + + +# These dictionaries group verbs by first, second and third person +# conjugations. + +plverb_irregular_pres = { + "am": "are", + "are": "are", + "is": "are", + "was": "were", + "were": "were", + "was": "were", + "have": "have", + "have": "have", + "has": "have", + "do": "do", + "do": "do", + "does": "do", +} + +plverb_ambiguous_pres = { + "act": "act", + "act": "act", + "acts": "act", + "blame": "blame", + "blame": "blame", + "blames": "blame", + "can": "can", + "can": "can", + "can": "can", + "must": "must", + "must": "must", + "must": "must", + "fly": "fly", + "fly": "fly", + "flies": "fly", + "copy": "copy", + "copy": "copy", + "copies": "copy", + "drink": "drink", + "drink": "drink", + "drinks": "drink", + "fight": "fight", + "fight": "fight", + "fights": "fight", + "fire": "fire", + "fire": "fire", + "fires": "fire", + "like": "like", + "like": "like", + "likes": "like", + "look": "look", + "look": "look", + "looks": "look", + "make": "make", + "make": "make", + "makes": "make", + "reach": "reach", + "reach": "reach", + "reaches": "reach", + "run": "run", + "run": "run", + "runs": "run", + "sink": "sink", + "sink": "sink", + "sinks": "sink", + "sleep": "sleep", + "sleep": "sleep", + "sleeps": "sleep", + "view": "view", + "view": "view", + "views": "view", +} + +plverb_ambiguous_pres_keys = re.compile( + fr"^({enclose('|'.join(plverb_ambiguous_pres))})((\s.*)?)$", re.IGNORECASE +) + + +plverb_irregular_non_pres = ( + "did", + "had", + "ate", + "made", + "put", + "spent", + "fought", + "sank", + "gave", + "sought", + "shall", + "could", + "ought", + "should", +) + +plverb_ambiguous_non_pres = re.compile( + r"^((?:thought|saw|bent|will|might|cut))((\s.*)?)$", re.IGNORECASE +) + +# "..oes" -> "..oe" (the rest are "..oes" -> "o") + +pl_v_oes_oe = ("canoes", "floes", "oboes", "roes", "throes", "woes") +pl_v_oes_oe_endings_size4 = ("hoes", "toes") +pl_v_oes_oe_endings_size5 = ("shoes",) + + +pl_count_zero = ("0", "no", "zero", "nil") + + +pl_count_one = ("1", "a", "an", "one", "each", "every", "this", "that") + +pl_adj_special = {"a": "some", "an": "some", "this": "these", "that": "those"} + +pl_adj_special_keys = re.compile( + fr"^({enclose('|'.join(pl_adj_special))})$", re.IGNORECASE +) + +pl_adj_poss = { + "my": "our", + "your": "your", + "its": "their", + "her": "their", + "his": "their", + "their": "their", +} + +pl_adj_poss_keys = re.compile(fr"^({enclose('|'.join(pl_adj_poss))})$", re.IGNORECASE) + + +# 2. INDEFINITE ARTICLES + +# THIS PATTERN MATCHES STRINGS OF CAPITALS STARTING WITH A "VOWEL-SOUND" +# CONSONANT FOLLOWED BY ANOTHER CONSONANT, AND WHICH ARE NOT LIKELY +# TO BE REAL WORDS (OH, ALL RIGHT THEN, IT'S JUST MAGIC!) + +A_abbrev = re.compile( + r""" +(?! FJO | [HLMNS]Y. | RY[EO] | SQU + | ( F[LR]? | [HL] | MN? | N | RH? | S[CHKLMNPTVW]? | X(YL)?) [AEIOU]) +[FHLMNRSX][A-Z] +""", + re.VERBOSE, +) + +# THIS PATTERN CODES THE BEGINNINGS OF ALL ENGLISH WORDS BEGINING WITH A +# 'y' FOLLOWED BY A CONSONANT. ANY OTHER Y-CONSONANT PREFIX THEREFORE +# IMPLIES AN ABBREVIATION. + +A_y_cons = re.compile(r"^(y(b[lor]|cl[ea]|fere|gg|p[ios]|rou|tt))", re.IGNORECASE) + +# EXCEPTIONS TO EXCEPTIONS + +A_explicit_a = re.compile(r"^((?:unabomber|unanimous|US))", re.IGNORECASE) + +A_explicit_an = re.compile( + r"^((?:euler|hour(?!i)|heir|honest|hono[ur]|mpeg))", re.IGNORECASE +) + +A_ordinal_an = re.compile(r"^([aefhilmnorsx]-?th)", re.IGNORECASE) + +A_ordinal_a = re.compile(r"^([bcdgjkpqtuvwyz]-?th)", re.IGNORECASE) + + +# NUMERICAL INFLECTIONS + +nth = { + 0: "th", + 1: "st", + 2: "nd", + 3: "rd", + 4: "th", + 5: "th", + 6: "th", + 7: "th", + 8: "th", + 9: "th", + 11: "th", + 12: "th", + 13: "th", +} +nth_suff = set(nth.values()) + +ordinal = dict( + ty="tieth", + one="first", + two="second", + three="third", + five="fifth", + eight="eighth", + nine="ninth", + twelve="twelfth", +) + +ordinal_suff = re.compile(fr"({'|'.join(ordinal)})\Z") + + +# NUMBERS + +unit = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"] +teen = [ + "ten", + "eleven", + "twelve", + "thirteen", + "fourteen", + "fifteen", + "sixteen", + "seventeen", + "eighteen", + "nineteen", +] +ten = [ + "", + "", + "twenty", + "thirty", + "forty", + "fifty", + "sixty", + "seventy", + "eighty", + "ninety", +] +mill = [ + " ", + " thousand", + " million", + " billion", + " trillion", + " quadrillion", + " quintillion", + " sextillion", + " septillion", + " octillion", + " nonillion", + " decillion", +] + + +# SUPPORT CLASSICAL PLURALIZATIONS + +def_classical = dict( + all=False, zero=False, herd=False, names=True, persons=False, ancient=False +) + +all_classical = {k: True for k in def_classical} +no_classical = {k: False for k in def_classical} + + +# Maps strings to built-in constant types +string_to_constant = {"True": True, "False": False, "None": None} + + +# Pre-compiled regular expression objects +DOLLAR_DIGITS = re.compile(r"\$(\d+)") +FUNCTION_CALL = re.compile(r"((\w+)\([^)]*\)*)", re.IGNORECASE) +PARTITION_WORD = re.compile(r"\A(\s*)(.+?)(\s*)\Z") +PL_SB_POSTFIX_ADJ_STEMS_RE = re.compile( + fr"^(?:{pl_sb_postfix_adj_stems})$", re.IGNORECASE +) +PL_SB_PREP_DUAL_COMPOUND_RE = re.compile( + fr"^(?:{pl_sb_prep_dual_compound})$", re.IGNORECASE +) +DENOMINATOR = re.compile(r"(?P.+)( (per|a) .+)") +PLVERB_SPECIAL_S_RE = re.compile(fr"^({plverb_special_s})$") +WHITESPACE = re.compile(r"\s") +ENDS_WITH_S = re.compile(r"^(.*[^s])s$", re.IGNORECASE) +ENDS_WITH_APOSTROPHE_S = re.compile(r"^(.*)'s?$") +INDEFINITE_ARTICLE_TEST = re.compile(r"\A(\s*)(?:an?\s+)?(.+?)(\s*)\Z", re.IGNORECASE) +SPECIAL_AN = re.compile(r"^[aefhilmnorsx]$", re.IGNORECASE) +SPECIAL_A = re.compile(r"^[bcdgjkpqtuvwyz]$", re.IGNORECASE) +SPECIAL_ABBREV_AN = re.compile(r"^[aefhilmnorsx][.-]", re.IGNORECASE) +SPECIAL_ABBREV_A = re.compile(r"^[a-z][.-]", re.IGNORECASE) +CONSONANTS = re.compile(r"^[^aeiouy]", re.IGNORECASE) +ARTICLE_SPECIAL_EU = re.compile(r"^e[uw]", re.IGNORECASE) +ARTICLE_SPECIAL_ONCE = re.compile(r"^onc?e\b", re.IGNORECASE) +ARTICLE_SPECIAL_ONETIME = re.compile(r"^onetime\b", re.IGNORECASE) +ARTICLE_SPECIAL_UNIT = re.compile(r"^uni([^nmd]|mo)", re.IGNORECASE) +ARTICLE_SPECIAL_UBA = re.compile(r"^u[bcfghjkqrst][aeiou]", re.IGNORECASE) +ARTICLE_SPECIAL_UKR = re.compile(r"^ukr", re.IGNORECASE) +SPECIAL_CAPITALS = re.compile(r"^U[NK][AIEO]?") +VOWELS = re.compile(r"^[aeiou]", re.IGNORECASE) + +DIGIT_GROUP = re.compile(r"(\d)") +TWO_DIGITS = re.compile(r"(\d)(\d)") +THREE_DIGITS = re.compile(r"(\d)(\d)(\d)") +THREE_DIGITS_WORD = re.compile(r"(\d)(\d)(\d)(?=\D*\Z)") +TWO_DIGITS_WORD = re.compile(r"(\d)(\d)(?=\D*\Z)") +ONE_DIGIT_WORD = re.compile(r"(\d)(?=\D*\Z)") + +FOUR_DIGIT_COMMA = re.compile(r"(\d)(\d{3}(?:,|\Z))") +NON_DIGIT = re.compile(r"\D") +WHITESPACES_COMMA = re.compile(r"\s+,") +COMMA_WORD = re.compile(r", (\S+)\s+\Z") +WHITESPACES = re.compile(r"\s+") + + +PRESENT_PARTICIPLE_REPLACEMENTS = ( + (re.compile(r"ie$"), r"y"), + ( + re.compile(r"ue$"), + r"u", + ), # TODO: isn't ue$ -> u encompassed in the following rule? + (re.compile(r"([auy])e$"), r"\g<1>"), + (re.compile(r"ski$"), r"ski"), + (re.compile(r"[^b]i$"), r""), + (re.compile(r"^(are|were)$"), r"be"), + (re.compile(r"^(had)$"), r"hav"), + (re.compile(r"^(hoe)$"), r"\g<1>"), + (re.compile(r"([^e])e$"), r"\g<1>"), + (re.compile(r"er$"), r"er"), + (re.compile(r"([^aeiou][aeiouy]([bdgmnprst]))$"), r"\g<1>\g<2>"), +) + +DIGIT = re.compile(r"\d") + + +class Words(str): + lowered: str + split_: List[str] + first: str + last: str + + def __init__(self, orig) -> None: + self.lowered = self.lower() + self.split_ = self.split() + self.first = self.split_[0] + self.last = self.split_[-1] + + +Word = Annotated[str, Field(min_length=1)] +Falsish = Any # ideally, falsish would only validate on bool(value) is False + + +class engine: + def __init__(self) -> None: + + self.classical_dict = def_classical.copy() + self.persistent_count: Optional[int] = None + self.mill_count = 0 + self.pl_sb_user_defined: List[str] = [] + self.pl_v_user_defined: List[str] = [] + self.pl_adj_user_defined: List[str] = [] + self.si_sb_user_defined: List[str] = [] + self.A_a_user_defined: List[str] = [] + self.thegender = "neuter" + self.__number_args: Optional[Dict[str, str]] = None + + @property + def _number_args(self): + return cast(Dict[str, str], self.__number_args) + + @_number_args.setter + def _number_args(self, val): + self.__number_args = val + + deprecated_methods = dict( + pl="plural", + plnoun="plural_noun", + plverb="plural_verb", + pladj="plural_adj", + sinoun="single_noun", + prespart="present_participle", + numwords="number_to_words", + plequal="compare", + plnounequal="compare_nouns", + plverbequal="compare_verbs", + pladjequal="compare_adjs", + wordlist="join", + ) + + def __getattr__(self, meth): + if meth in self.deprecated_methods: + print3(f"{meth}() deprecated, use {self.deprecated_methods[meth]}()") + raise DeprecationWarning + raise AttributeError + + def defnoun(self, singular: str, plural: str) -> int: + """ + Set the noun plural of singular to plural. + + """ + self.checkpat(singular) + self.checkpatplural(plural) + self.pl_sb_user_defined.extend((singular, plural)) + self.si_sb_user_defined.extend((plural, singular)) + return 1 + + def defverb(self, s1: str, p1: str, s2: str, p2: str, s3: str, p3: str) -> int: + """ + Set the verb plurals for s1, s2 and s3 to p1, p2 and p3 respectively. + + Where 1, 2 and 3 represent the 1st, 2nd and 3rd person forms of the verb. + + """ + self.checkpat(s1) + self.checkpat(s2) + self.checkpat(s3) + self.checkpatplural(p1) + self.checkpatplural(p2) + self.checkpatplural(p3) + self.pl_v_user_defined.extend((s1, p1, s2, p2, s3, p3)) + return 1 + + def defadj(self, singular: str, plural: str) -> int: + """ + Set the adjective plural of singular to plural. + + """ + self.checkpat(singular) + self.checkpatplural(plural) + self.pl_adj_user_defined.extend((singular, plural)) + return 1 + + def defa(self, pattern: str) -> int: + """ + Define the indefinite article as 'a' for words matching pattern. + + """ + self.checkpat(pattern) + self.A_a_user_defined.extend((pattern, "a")) + return 1 + + def defan(self, pattern: str) -> int: + """ + Define the indefinite article as 'an' for words matching pattern. + + """ + self.checkpat(pattern) + self.A_a_user_defined.extend((pattern, "an")) + return 1 + + def checkpat(self, pattern: Optional[str]) -> None: + """ + check for errors in a regex pattern + """ + if pattern is None: + return + try: + re.match(pattern, "") + except re.error: + print3(f"\nBad user-defined singular pattern:\n\t{pattern}\n") + raise BadUserDefinedPatternError + + def checkpatplural(self, pattern: str) -> None: + """ + check for errors in a regex replace pattern + """ + return + + @validate_arguments + def ud_match(self, word: Word, wordlist: Sequence[Optional[Word]]) -> Optional[str]: + for i in range(len(wordlist) - 2, -2, -2): # backwards through even elements + mo = re.search(fr"^{wordlist[i]}$", word, re.IGNORECASE) + if mo: + if wordlist[i + 1] is None: + return None + pl = DOLLAR_DIGITS.sub( + r"\\1", cast(Word, wordlist[i + 1]) + ) # change $n to \n for expand + return mo.expand(pl) + return None + + def classical(self, **kwargs) -> None: + """ + turn classical mode on and off for various categories + + turn on all classical modes: + classical() + classical(all=True) + + turn on or off specific claassical modes: + e.g. + classical(herd=True) + classical(names=False) + + By default all classical modes are off except names. + + unknown value in args or key in kwargs raises + exception: UnknownClasicalModeError + + """ + if not kwargs: + self.classical_dict = all_classical.copy() + return + if "all" in kwargs: + if kwargs["all"]: + self.classical_dict = all_classical.copy() + else: + self.classical_dict = no_classical.copy() + + for k, v in kwargs.items(): + if k in def_classical: + self.classical_dict[k] = v + else: + raise UnknownClassicalModeError + + def num( + self, count: Optional[int] = None, show: Optional[int] = None + ) -> str: # (;$count,$show) + """ + Set the number to be used in other method calls. + + Returns count. + + Set show to False to return '' instead. + + """ + if count is not None: + try: + self.persistent_count = int(count) + except ValueError: + raise BadNumValueError + if (show is None) or show: + return str(count) + else: + self.persistent_count = None + return "" + + def gender(self, gender: str) -> None: + """ + set the gender for the singular of plural pronouns + + can be one of: + 'neuter' ('they' -> 'it') + 'feminine' ('they' -> 'she') + 'masculine' ('they' -> 'he') + 'gender-neutral' ('they' -> 'they') + 'feminine or masculine' ('they' -> 'she or he') + 'masculine or feminine' ('they' -> 'he or she') + """ + if gender in singular_pronoun_genders: + self.thegender = gender + else: + raise BadGenderError + + def _get_value_from_ast(self, obj): + """ + Return the value of the ast object. + """ + if isinstance(obj, ast.Num): + return obj.n + elif isinstance(obj, ast.Str): + return obj.s + elif isinstance(obj, ast.List): + return [self._get_value_from_ast(e) for e in obj.elts] + elif isinstance(obj, ast.Tuple): + return tuple([self._get_value_from_ast(e) for e in obj.elts]) + + # None, True and False are NameConstants in Py3.4 and above. + elif isinstance(obj, ast.NameConstant): + return obj.value + + # Probably passed a variable name. + # Or passed a single word without wrapping it in quotes as an argument + # ex: p.inflect("I plural(see)") instead of p.inflect("I plural('see')") + raise NameError(f"name '{obj.id}' is not defined") + + def _string_to_substitute( + self, mo: Match, methods_dict: Dict[str, Callable] + ) -> str: + """ + Return the string to be substituted for the match. + """ + matched_text, f_name = mo.groups() + # matched_text is the complete match string. e.g. plural_noun(cat) + # f_name is the function name. e.g. plural_noun + + # Return matched_text if function name is not in methods_dict + if f_name not in methods_dict: + return matched_text + + # Parse the matched text + a_tree = ast.parse(matched_text) + + # get the args and kwargs from ast objects + args_list = [ + self._get_value_from_ast(a) + for a in a_tree.body[0].value.args # type: ignore[attr-defined] + ] + kwargs_list = { + kw.arg: self._get_value_from_ast(kw.value) + for kw in a_tree.body[0].value.keywords # type: ignore[attr-defined] + } + + # Call the corresponding function + return methods_dict[f_name](*args_list, **kwargs_list) + + # 0. PERFORM GENERAL INFLECTIONS IN A STRING + + @validate_arguments + def inflect(self, text: Word) -> str: + """ + Perform inflections in a string. + + e.g. inflect('The plural of cat is plural(cat)') returns + 'The plural of cat is cats' + + can use plural, plural_noun, plural_verb, plural_adj, + singular_noun, a, an, no, ordinal, number_to_words, + and prespart + + """ + save_persistent_count = self.persistent_count + + # Dictionary of allowed methods + methods_dict: Dict[str, Callable] = { + "plural": self.plural, + "plural_adj": self.plural_adj, + "plural_noun": self.plural_noun, + "plural_verb": self.plural_verb, + "singular_noun": self.singular_noun, + "a": self.a, + "an": self.a, + "no": self.no, + "ordinal": self.ordinal, + "number_to_words": self.number_to_words, + "present_participle": self.present_participle, + "num": self.num, + } + + # Regular expression to find Python's function call syntax + output = FUNCTION_CALL.sub( + lambda mo: self._string_to_substitute(mo, methods_dict), text + ) + self.persistent_count = save_persistent_count + return output + + # ## PLURAL SUBROUTINES + + def postprocess(self, orig: str, inflected) -> str: + inflected = str(inflected) + if "|" in inflected: + word_options = inflected.split("|") + # When two parts of a noun need to be pluralized + if len(word_options[0].split(" ")) == len(word_options[1].split(" ")): + result = inflected.split("|")[self.classical_dict["all"]].split(" ") + # When only the last part of the noun needs to be pluralized + else: + result = inflected.split(" ") + for index, word in enumerate(result): + if "|" in word: + result[index] = word.split("|")[self.classical_dict["all"]] + else: + result = inflected.split(" ") + + # Try to fix word wise capitalization + for index, word in enumerate(orig.split(" ")): + if word == "I": + # Is this the only word for exceptions like this + # Where the original is fully capitalized + # without 'meaning' capitalization? + # Also this fails to handle a capitalizaion in context + continue + if word.capitalize() == word: + result[index] = result[index].capitalize() + if word == word.upper(): + result[index] = result[index].upper() + return " ".join(result) + + def partition_word(self, text: str) -> Tuple[str, str, str]: + mo = PARTITION_WORD.search(text) + if mo: + return mo.group(1), mo.group(2), mo.group(3) + else: + return "", "", "" + + @validate_arguments + def plural(self, text: Word, count: Optional[Union[str, int, Any]] = None) -> str: + """ + Return the plural of text. + + If count supplied, then return text if count is one of: + 1, a, an, one, each, every, this, that + + otherwise return the plural. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + plural = self.postprocess( + word, + self._pl_special_adjective(word, count) + or self._pl_special_verb(word, count) + or self._plnoun(word, count), + ) + return f"{pre}{plural}{post}" + + @validate_arguments + def plural_noun( + self, text: Word, count: Optional[Union[str, int, Any]] = None + ) -> str: + """ + Return the plural of text, where text is a noun. + + If count supplied, then return text if count is one of: + 1, a, an, one, each, every, this, that + + otherwise return the plural. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + plural = self.postprocess(word, self._plnoun(word, count)) + return f"{pre}{plural}{post}" + + @validate_arguments + def plural_verb( + self, text: Word, count: Optional[Union[str, int, Any]] = None + ) -> str: + """ + Return the plural of text, where text is a verb. + + If count supplied, then return text if count is one of: + 1, a, an, one, each, every, this, that + + otherwise return the plural. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + plural = self.postprocess( + word, + self._pl_special_verb(word, count) or self._pl_general_verb(word, count), + ) + return f"{pre}{plural}{post}" + + @validate_arguments + def plural_adj( + self, text: Word, count: Optional[Union[str, int, Any]] = None + ) -> str: + """ + Return the plural of text, where text is an adjective. + + If count supplied, then return text if count is one of: + 1, a, an, one, each, every, this, that + + otherwise return the plural. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + plural = self.postprocess(word, self._pl_special_adjective(word, count) or word) + return f"{pre}{plural}{post}" + + @validate_arguments + def compare(self, word1: Word, word2: Word) -> Union[str, bool]: + """ + compare word1 and word2 for equality regardless of plurality + + return values: + eq - the strings are equal + p:s - word1 is the plural of word2 + s:p - word2 is the plural of word1 + p:p - word1 and word2 are two different plural forms of the one word + False - otherwise + + >>> compare = engine().compare + >>> compare("egg", "eggs") + 's:p' + >>> compare('egg', 'egg') + 'eq' + + Words should not be empty. + + >>> compare('egg', '') + Traceback (most recent call last): + ... + pydantic.error_wrappers.ValidationError: 1 validation error for Compare + word2 + ensure this value has at least 1 characters... + """ + norms = self.plural_noun, self.plural_verb, self.plural_adj + results = (self._plequal(word1, word2, norm) for norm in norms) + return next(filter(None, results), False) + + @validate_arguments + def compare_nouns(self, word1: Word, word2: Word) -> Union[str, bool]: + """ + compare word1 and word2 for equality regardless of plurality + word1 and word2 are to be treated as nouns + + return values: + eq - the strings are equal + p:s - word1 is the plural of word2 + s:p - word2 is the plural of word1 + p:p - word1 and word2 are two different plural forms of the one word + False - otherwise + + """ + return self._plequal(word1, word2, self.plural_noun) + + @validate_arguments + def compare_verbs(self, word1: Word, word2: Word) -> Union[str, bool]: + """ + compare word1 and word2 for equality regardless of plurality + word1 and word2 are to be treated as verbs + + return values: + eq - the strings are equal + p:s - word1 is the plural of word2 + s:p - word2 is the plural of word1 + p:p - word1 and word2 are two different plural forms of the one word + False - otherwise + + """ + return self._plequal(word1, word2, self.plural_verb) + + @validate_arguments + def compare_adjs(self, word1: Word, word2: Word) -> Union[str, bool]: + """ + compare word1 and word2 for equality regardless of plurality + word1 and word2 are to be treated as adjectives + + return values: + eq - the strings are equal + p:s - word1 is the plural of word2 + s:p - word2 is the plural of word1 + p:p - word1 and word2 are two different plural forms of the one word + False - otherwise + + """ + return self._plequal(word1, word2, self.plural_adj) + + @validate_arguments + def singular_noun( + self, + text: Word, + count: Optional[Union[int, str, Any]] = None, + gender: Optional[str] = None, + ) -> Union[str, bool]: + """ + Return the singular of text, where text is a plural noun. + + If count supplied, then return the singular if count is one of: + 1, a, an, one, each, every, this, that or if count is None + + otherwise return text unchanged. + + Whitespace at the start and end is preserved. + + >>> p = engine() + >>> p.singular_noun('horses') + 'horse' + >>> p.singular_noun('knights') + 'knight' + + Returns False when a singular noun is passed. + + >>> p.singular_noun('horse') + False + >>> p.singular_noun('knight') + False + >>> p.singular_noun('soldier') + False + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + sing = self._sinoun(word, count=count, gender=gender) + if sing is not False: + plural = self.postprocess(word, sing) + return f"{pre}{plural}{post}" + return False + + def _plequal(self, word1: str, word2: str, pl) -> Union[str, bool]: # noqa: C901 + classval = self.classical_dict.copy() + self.classical_dict = all_classical.copy() + if word1 == word2: + return "eq" + if word1 == pl(word2): + return "p:s" + if pl(word1) == word2: + return "s:p" + self.classical_dict = no_classical.copy() + if word1 == pl(word2): + return "p:s" + if pl(word1) == word2: + return "s:p" + self.classical_dict = classval.copy() + + if pl == self.plural or pl == self.plural_noun: + if self._pl_check_plurals_N(word1, word2): + return "p:p" + if self._pl_check_plurals_N(word2, word1): + return "p:p" + if pl == self.plural or pl == self.plural_adj: + if self._pl_check_plurals_adj(word1, word2): + return "p:p" + return False + + def _pl_reg_plurals(self, pair: str, stems: str, end1: str, end2: str) -> bool: + pattern = fr"({stems})({end1}\|\1{end2}|{end2}\|\1{end1})" + return bool(re.search(pattern, pair)) + + def _pl_check_plurals_N(self, word1: str, word2: str) -> bool: + stem_endings = ( + (pl_sb_C_a_ata, "as", "ata"), + (pl_sb_C_is_ides, "is", "ides"), + (pl_sb_C_a_ae, "s", "e"), + (pl_sb_C_en_ina, "ens", "ina"), + (pl_sb_C_um_a, "ums", "a"), + (pl_sb_C_us_i, "uses", "i"), + (pl_sb_C_on_a, "ons", "a"), + (pl_sb_C_o_i_stems, "os", "i"), + (pl_sb_C_ex_ices, "exes", "ices"), + (pl_sb_C_ix_ices, "ixes", "ices"), + (pl_sb_C_i, "s", "i"), + (pl_sb_C_im, "s", "im"), + (".*eau", "s", "x"), + (".*ieu", "s", "x"), + (".*tri", "xes", "ces"), + (".{2,}[yia]n", "xes", "ges"), + ) + + words = map(Words, (word1, word2)) + pair = "|".join(word.last for word in words) + + return ( + pair in pl_sb_irregular_s.values() + or pair in pl_sb_irregular.values() + or pair in pl_sb_irregular_caps.values() + or any( + self._pl_reg_plurals(pair, stems, end1, end2) + for stems, end1, end2 in stem_endings + ) + ) + + def _pl_check_plurals_adj(self, word1: str, word2: str) -> bool: + word1a = word1[: word1.rfind("'")] if word1.endswith(("'s", "'")) else "" + word2a = word2[: word2.rfind("'")] if word2.endswith(("'s", "'")) else "" + + return ( + bool(word1a) + and bool(word2a) + and ( + self._pl_check_plurals_N(word1a, word2a) + or self._pl_check_plurals_N(word2a, word1a) + ) + ) + + def get_count(self, count: Optional[Union[str, int]] = None) -> Union[str, int]: + if count is None and self.persistent_count is not None: + count = self.persistent_count + + if count is not None: + count = ( + 1 + if ( + (str(count) in pl_count_one) + or ( + self.classical_dict["zero"] + and str(count).lower() in pl_count_zero + ) + ) + else 2 + ) + else: + count = "" + return count + + # @profile + def _plnoun( # noqa: C901 + self, word: str, count: Optional[Union[str, int]] = None + ) -> str: + count = self.get_count(count) + + # DEFAULT TO PLURAL + + if count == 1: + return word + + # HANDLE USER-DEFINED NOUNS + + value = self.ud_match(word, self.pl_sb_user_defined) + if value is not None: + return value + + # HANDLE EMPTY WORD, SINGULAR COUNT AND UNINFLECTED PLURALS + + if word == "": + return word + + word = Words(word) + + if word.last.lower() in pl_sb_uninflected_complete: + return word + + if word in pl_sb_uninflected_caps: + return word + + for k, v in pl_sb_uninflected_bysize.items(): + if word.lowered[-k:] in v: + return word + + if self.classical_dict["herd"] and word.last.lower() in pl_sb_uninflected_herd: + return word + + # HANDLE COMPOUNDS ("Governor General", "mother-in-law", "aide-de-camp", ETC.) + + mo = PL_SB_POSTFIX_ADJ_STEMS_RE.search(word) + if mo and mo.group(2) != "": + return f"{self._plnoun(mo.group(1), 2)}{mo.group(2)}" + + if " a " in word.lowered or "-a-" in word.lowered: + mo = PL_SB_PREP_DUAL_COMPOUND_RE.search(word) + if mo and mo.group(2) != "" and mo.group(3) != "": + return ( + f"{self._plnoun(mo.group(1), 2)}" + f"{mo.group(2)}" + f"{self._plnoun(mo.group(3))}" + ) + + if len(word.split_) >= 3: + for numword in range(1, len(word.split_) - 1): + if word.split_[numword] in pl_prep_list_da: + return " ".join( + word.split_[: numword - 1] + + [self._plnoun(word.split_[numword - 1], 2)] + + word.split_[numword:] + ) + + # only pluralize denominators in units + mo = DENOMINATOR.search(word.lowered) + if mo: + index = len(mo.group("denominator")) + return f"{self._plnoun(word[:index])}{word[index:]}" + + # handle units given in degrees (only accept if + # there is no more than one word following) + # degree Celsius => degrees Celsius but degree + # fahrenheit hour => degree fahrenheit hours + if len(word.split_) >= 2 and word.split_[-2] == "degree": + return " ".join([self._plnoun(word.first)] + word.split_[1:]) + + with contextlib.suppress(ValueError): + return self._handle_prepositional_phrase( + word.lowered, + functools.partial(self._plnoun, count=2), + '-', + ) + + # HANDLE PRONOUNS + + for k, v in pl_pron_acc_keys_bysize.items(): + if word.lowered[-k:] in v: # ends with accusative pronoun + for pk, pv in pl_prep_bysize.items(): + if word.lowered[:pk] in pv: # starts with a prep + if word.lowered.split() == [ + word.lowered[:pk], + word.lowered[-k:], + ]: + # only whitespace in between + return word.lowered[:-k] + pl_pron_acc[word.lowered[-k:]] + + try: + return pl_pron_nom[word.lowered] + except KeyError: + pass + + try: + return pl_pron_acc[word.lowered] + except KeyError: + pass + + # HANDLE ISOLATED IRREGULAR PLURALS + + if word.last in pl_sb_irregular_caps: + llen = len(word.last) + return f"{word[:-llen]}{pl_sb_irregular_caps[word.last]}" + + lowered_last = word.last.lower() + if lowered_last in pl_sb_irregular: + llen = len(lowered_last) + return f"{word[:-llen]}{pl_sb_irregular[lowered_last]}" + + dash_split = word.lowered.split('-') + if (" ".join(dash_split[-2:])).lower() in pl_sb_irregular_compound: + llen = len( + " ".join(dash_split[-2:]) + ) # TODO: what if 2 spaces between these words? + return ( + f"{word[:-llen]}" + f"{pl_sb_irregular_compound[(' '.join(dash_split[-2:])).lower()]}" + ) + + if word.lowered[-3:] == "quy": + return f"{word[:-1]}ies" + + if word.lowered[-6:] == "person": + if self.classical_dict["persons"]: + return f"{word}s" + else: + return f"{word[:-4]}ople" + + # HANDLE FAMILIES OF IRREGULAR PLURALS + + if word.lowered[-3:] == "man": + for k, v in pl_sb_U_man_mans_bysize.items(): + if word.lowered[-k:] in v: + return f"{word}s" + for k, v in pl_sb_U_man_mans_caps_bysize.items(): + if word[-k:] in v: + return f"{word}s" + return f"{word[:-3]}men" + if word.lowered[-5:] == "mouse": + return f"{word[:-5]}mice" + if word.lowered[-5:] == "louse": + v = pl_sb_U_louse_lice_bysize.get(len(word)) + if v and word.lowered in v: + return f"{word[:-5]}lice" + return f"{word}s" + if word.lowered[-5:] == "goose": + return f"{word[:-5]}geese" + if word.lowered[-5:] == "tooth": + return f"{word[:-5]}teeth" + if word.lowered[-4:] == "foot": + return f"{word[:-4]}feet" + if word.lowered[-4:] == "taco": + return f"{word[:-5]}tacos" + + if word.lowered == "die": + return "dice" + + # HANDLE UNASSIMILATED IMPORTS + + if word.lowered[-4:] == "ceps": + return word + if word.lowered[-4:] == "zoon": + return f"{word[:-2]}a" + if word.lowered[-3:] in ("cis", "sis", "xis"): + return f"{word[:-2]}es" + + for lastlet, d, numend, post in ( + ("h", pl_sb_U_ch_chs_bysize, None, "s"), + ("x", pl_sb_U_ex_ices_bysize, -2, "ices"), + ("x", pl_sb_U_ix_ices_bysize, -2, "ices"), + ("m", pl_sb_U_um_a_bysize, -2, "a"), + ("s", pl_sb_U_us_i_bysize, -2, "i"), + ("n", pl_sb_U_on_a_bysize, -2, "a"), + ("a", pl_sb_U_a_ae_bysize, None, "e"), + ): + if word.lowered[-1] == lastlet: # this test to add speed + for k, v in d.items(): + if word.lowered[-k:] in v: + return word[:numend] + post + + # HANDLE INCOMPLETELY ASSIMILATED IMPORTS + + if self.classical_dict["ancient"]: + if word.lowered[-4:] == "trix": + return f"{word[:-1]}ces" + if word.lowered[-3:] in ("eau", "ieu"): + return f"{word}x" + if word.lowered[-3:] in ("ynx", "inx", "anx") and len(word) > 4: + return f"{word[:-1]}ges" + + for lastlet, d, numend, post in ( + ("n", pl_sb_C_en_ina_bysize, -2, "ina"), + ("x", pl_sb_C_ex_ices_bysize, -2, "ices"), + ("x", pl_sb_C_ix_ices_bysize, -2, "ices"), + ("m", pl_sb_C_um_a_bysize, -2, "a"), + ("s", pl_sb_C_us_i_bysize, -2, "i"), + ("s", pl_sb_C_us_us_bysize, None, ""), + ("a", pl_sb_C_a_ae_bysize, None, "e"), + ("a", pl_sb_C_a_ata_bysize, None, "ta"), + ("s", pl_sb_C_is_ides_bysize, -1, "des"), + ("o", pl_sb_C_o_i_bysize, -1, "i"), + ("n", pl_sb_C_on_a_bysize, -2, "a"), + ): + if word.lowered[-1] == lastlet: # this test to add speed + for k, v in d.items(): + if word.lowered[-k:] in v: + return word[:numend] + post + + for d, numend, post in ( + (pl_sb_C_i_bysize, None, "i"), + (pl_sb_C_im_bysize, None, "im"), + ): + for k, v in d.items(): + if word.lowered[-k:] in v: + return word[:numend] + post + + # HANDLE SINGULAR NOUNS ENDING IN ...s OR OTHER SILIBANTS + + if lowered_last in pl_sb_singular_s_complete: + return f"{word}es" + + for k, v in pl_sb_singular_s_bysize.items(): + if word.lowered[-k:] in v: + return f"{word}es" + + if word.lowered[-2:] == "es" and word[0] == word[0].upper(): + return f"{word}es" + + if word.lowered[-1] == "z": + for k, v in pl_sb_z_zes_bysize.items(): + if word.lowered[-k:] in v: + return f"{word}es" + + if word.lowered[-2:-1] != "z": + return f"{word}zes" + + if word.lowered[-2:] == "ze": + for k, v in pl_sb_ze_zes_bysize.items(): + if word.lowered[-k:] in v: + return f"{word}s" + + if word.lowered[-2:] in ("ch", "sh", "zz", "ss") or word.lowered[-1] == "x": + return f"{word}es" + + # HANDLE ...f -> ...ves + + if word.lowered[-3:] in ("elf", "alf", "olf"): + return f"{word[:-1]}ves" + if word.lowered[-3:] == "eaf" and word.lowered[-4:-3] != "d": + return f"{word[:-1]}ves" + if word.lowered[-4:] in ("nife", "life", "wife"): + return f"{word[:-2]}ves" + if word.lowered[-3:] == "arf": + return f"{word[:-1]}ves" + + # HANDLE ...y + + if word.lowered[-1] == "y": + if word.lowered[-2:-1] in "aeiou" or len(word) == 1: + return f"{word}s" + + if self.classical_dict["names"]: + if word.lowered[-1] == "y" and word[0] == word[0].upper(): + return f"{word}s" + + return f"{word[:-1]}ies" + + # HANDLE ...o + + if lowered_last in pl_sb_U_o_os_complete: + return f"{word}s" + + for k, v in pl_sb_U_o_os_bysize.items(): + if word.lowered[-k:] in v: + return f"{word}s" + + if word.lowered[-2:] in ("ao", "eo", "io", "oo", "uo"): + return f"{word}s" + + if word.lowered[-1] == "o": + return f"{word}es" + + # OTHERWISE JUST ADD ...s + + return f"{word}s" + + @classmethod + def _handle_prepositional_phrase(cls, phrase, transform, sep): + """ + Given a word or phrase possibly separated by sep, parse out + the prepositional phrase and apply the transform to the word + preceding the prepositional phrase. + + Raise ValueError if the pivot is not found or if at least two + separators are not found. + + >>> engine._handle_prepositional_phrase("man-of-war", str.upper, '-') + 'MAN-of-war' + >>> engine._handle_prepositional_phrase("man of war", str.upper, ' ') + 'MAN of war' + """ + parts = phrase.split(sep) + if len(parts) < 3: + raise ValueError("Cannot handle words with fewer than two separators") + + pivot = cls._find_pivot(parts, pl_prep_list_da) + + transformed = transform(parts[pivot - 1]) or parts[pivot - 1] + return " ".join( + parts[: pivot - 1] + [sep.join([transformed, parts[pivot], ''])] + ) + " ".join(parts[(pivot + 1) :]) + + @staticmethod + def _find_pivot(words, candidates): + pivots = ( + index for index in range(1, len(words) - 1) if words[index] in candidates + ) + try: + return next(pivots) + except StopIteration: + raise ValueError("No pivot found") + + def _pl_special_verb( # noqa: C901 + self, word: str, count: Optional[Union[str, int]] = None + ) -> Union[str, bool]: + if self.classical_dict["zero"] and str(count).lower() in pl_count_zero: + return False + count = self.get_count(count) + + if count == 1: + return word + + # HANDLE USER-DEFINED VERBS + + value = self.ud_match(word, self.pl_v_user_defined) + if value is not None: + return value + + # HANDLE IRREGULAR PRESENT TENSE (SIMPLE AND COMPOUND) + + try: + words = Words(word) + except IndexError: + return False # word is '' + + if words.first in plverb_irregular_pres: + return f"{plverb_irregular_pres[words.first]}{words[len(words.first) :]}" + + # HANDLE IRREGULAR FUTURE, PRETERITE AND PERFECT TENSES + + if words.first in plverb_irregular_non_pres: + return word + + # HANDLE PRESENT NEGATIONS (SIMPLE AND COMPOUND) + + if words.first.endswith("n't") and words.first[:-3] in plverb_irregular_pres: + return ( + f"{plverb_irregular_pres[words.first[:-3]]}n't" + f"{words[len(words.first) :]}" + ) + + if words.first.endswith("n't"): + return word + + # HANDLE SPECIAL CASES + + mo = PLVERB_SPECIAL_S_RE.search(word) + if mo: + return False + if WHITESPACE.search(word): + return False + + if words.lowered == "quizzes": + return "quiz" + + # HANDLE STANDARD 3RD PERSON (CHOP THE ...(e)s OFF SINGLE WORDS) + + if ( + words.lowered[-4:] in ("ches", "shes", "zzes", "sses") + or words.lowered[-3:] == "xes" + ): + return words[:-2] + + if words.lowered[-3:] == "ies" and len(words) > 3: + return words.lowered[:-3] + "y" + + if ( + words.last.lower() in pl_v_oes_oe + or words.lowered[-4:] in pl_v_oes_oe_endings_size4 + or words.lowered[-5:] in pl_v_oes_oe_endings_size5 + ): + return words[:-1] + + if words.lowered.endswith("oes") and len(words) > 3: + return words.lowered[:-2] + + mo = ENDS_WITH_S.search(words) + if mo: + return mo.group(1) + + # OTHERWISE, A REGULAR VERB (HANDLE ELSEWHERE) + + return False + + def _pl_general_verb( + self, word: str, count: Optional[Union[str, int]] = None + ) -> str: + count = self.get_count(count) + + if count == 1: + return word + + # HANDLE AMBIGUOUS PRESENT TENSES (SIMPLE AND COMPOUND) + + mo = plverb_ambiguous_pres_keys.search(word) + if mo: + return f"{plverb_ambiguous_pres[mo.group(1).lower()]}{mo.group(2)}" + + # HANDLE AMBIGUOUS PRETERITE AND PERFECT TENSES + + mo = plverb_ambiguous_non_pres.search(word) + if mo: + return word + + # OTHERWISE, 1st OR 2ND PERSON IS UNINFLECTED + + return word + + def _pl_special_adjective( + self, word: str, count: Optional[Union[str, int]] = None + ) -> Union[str, bool]: + count = self.get_count(count) + + if count == 1: + return word + + # HANDLE USER-DEFINED ADJECTIVES + + value = self.ud_match(word, self.pl_adj_user_defined) + if value is not None: + return value + + # HANDLE KNOWN CASES + + mo = pl_adj_special_keys.search(word) + if mo: + return pl_adj_special[mo.group(1).lower()] + + # HANDLE POSSESSIVES + + mo = pl_adj_poss_keys.search(word) + if mo: + return pl_adj_poss[mo.group(1).lower()] + + mo = ENDS_WITH_APOSTROPHE_S.search(word) + if mo: + pl = self.plural_noun(mo.group(1)) + trailing_s = "" if pl[-1] == "s" else "s" + return f"{pl}'{trailing_s}" + + # OTHERWISE, NO IDEA + + return False + + # @profile + def _sinoun( # noqa: C901 + self, + word: str, + count: Optional[Union[str, int]] = None, + gender: Optional[str] = None, + ) -> Union[str, bool]: + count = self.get_count(count) + + # DEFAULT TO PLURAL + + if count == 2: + return word + + # SET THE GENDER + + try: + if gender is None: + gender = self.thegender + elif gender not in singular_pronoun_genders: + raise BadGenderError + except (TypeError, IndexError): + raise BadGenderError + + # HANDLE USER-DEFINED NOUNS + + value = self.ud_match(word, self.si_sb_user_defined) + if value is not None: + return value + + # HANDLE EMPTY WORD, SINGULAR COUNT AND UNINFLECTED PLURALS + + if word == "": + return word + + if word in si_sb_ois_oi_case: + return word[:-1] + + words = Words(word) + + if words.last.lower() in pl_sb_uninflected_complete: + return word + + if word in pl_sb_uninflected_caps: + return word + + for k, v in pl_sb_uninflected_bysize.items(): + if words.lowered[-k:] in v: + return word + + if self.classical_dict["herd"] and words.last.lower() in pl_sb_uninflected_herd: + return word + + if words.last.lower() in pl_sb_C_us_us: + return word if self.classical_dict["ancient"] else False + + # HANDLE COMPOUNDS ("Governor General", "mother-in-law", "aide-de-camp", ETC.) + + mo = PL_SB_POSTFIX_ADJ_STEMS_RE.search(word) + if mo and mo.group(2) != "": + return f"{self._sinoun(mo.group(1), 1, gender=gender)}{mo.group(2)}" + + with contextlib.suppress(ValueError): + return self._handle_prepositional_phrase( + words.lowered, + functools.partial(self._sinoun, count=1, gender=gender), + ' ', + ) + + with contextlib.suppress(ValueError): + return self._handle_prepositional_phrase( + words.lowered, + functools.partial(self._sinoun, count=1, gender=gender), + '-', + ) + + # HANDLE PRONOUNS + + for k, v in si_pron_acc_keys_bysize.items(): + if words.lowered[-k:] in v: # ends with accusative pronoun + for pk, pv in pl_prep_bysize.items(): + if words.lowered[:pk] in pv: # starts with a prep + if words.lowered.split() == [ + words.lowered[:pk], + words.lowered[-k:], + ]: + # only whitespace in between + return words.lowered[:-k] + get_si_pron( + "acc", words.lowered[-k:], gender + ) + + try: + return get_si_pron("nom", words.lowered, gender) + except KeyError: + pass + + try: + return get_si_pron("acc", words.lowered, gender) + except KeyError: + pass + + # HANDLE ISOLATED IRREGULAR PLURALS + + if words.last in si_sb_irregular_caps: + llen = len(words.last) + return "{}{}".format(word[:-llen], si_sb_irregular_caps[words.last]) + + if words.last.lower() in si_sb_irregular: + llen = len(words.last.lower()) + return "{}{}".format(word[:-llen], si_sb_irregular[words.last.lower()]) + + dash_split = words.lowered.split("-") + if (" ".join(dash_split[-2:])).lower() in si_sb_irregular_compound: + llen = len( + " ".join(dash_split[-2:]) + ) # TODO: what if 2 spaces between these words? + return "{}{}".format( + word[:-llen], + si_sb_irregular_compound[(" ".join(dash_split[-2:])).lower()], + ) + + if words.lowered[-5:] == "quies": + return word[:-3] + "y" + + if words.lowered[-7:] == "persons": + return word[:-1] + if words.lowered[-6:] == "people": + return word[:-4] + "rson" + + # HANDLE FAMILIES OF IRREGULAR PLURALS + + if words.lowered[-4:] == "mans": + for k, v in si_sb_U_man_mans_bysize.items(): + if words.lowered[-k:] in v: + return word[:-1] + for k, v in si_sb_U_man_mans_caps_bysize.items(): + if word[-k:] in v: + return word[:-1] + if words.lowered[-3:] == "men": + return word[:-3] + "man" + if words.lowered[-4:] == "mice": + return word[:-4] + "mouse" + if words.lowered[-4:] == "lice": + v = si_sb_U_louse_lice_bysize.get(len(word)) + if v and words.lowered in v: + return word[:-4] + "louse" + if words.lowered[-5:] == "geese": + return word[:-5] + "goose" + if words.lowered[-5:] == "teeth": + return word[:-5] + "tooth" + if words.lowered[-4:] == "feet": + return word[:-4] + "foot" + + if words.lowered == "dice": + return "die" + + # HANDLE UNASSIMILATED IMPORTS + + if words.lowered[-4:] == "ceps": + return word + if words.lowered[-3:] == "zoa": + return word[:-1] + "on" + + for lastlet, d, unass_numend, post in ( + ("s", si_sb_U_ch_chs_bysize, -1, ""), + ("s", si_sb_U_ex_ices_bysize, -4, "ex"), + ("s", si_sb_U_ix_ices_bysize, -4, "ix"), + ("a", si_sb_U_um_a_bysize, -1, "um"), + ("i", si_sb_U_us_i_bysize, -1, "us"), + ("a", si_sb_U_on_a_bysize, -1, "on"), + ("e", si_sb_U_a_ae_bysize, -1, ""), + ): + if words.lowered[-1] == lastlet: # this test to add speed + for k, v in d.items(): + if words.lowered[-k:] in v: + return word[:unass_numend] + post + + # HANDLE INCOMPLETELY ASSIMILATED IMPORTS + + if self.classical_dict["ancient"]: + + if words.lowered[-6:] == "trices": + return word[:-3] + "x" + if words.lowered[-4:] in ("eaux", "ieux"): + return word[:-1] + if words.lowered[-5:] in ("ynges", "inges", "anges") and len(word) > 6: + return word[:-3] + "x" + + for lastlet, d, class_numend, post in ( + ("a", si_sb_C_en_ina_bysize, -3, "en"), + ("s", si_sb_C_ex_ices_bysize, -4, "ex"), + ("s", si_sb_C_ix_ices_bysize, -4, "ix"), + ("a", si_sb_C_um_a_bysize, -1, "um"), + ("i", si_sb_C_us_i_bysize, -1, "us"), + ("s", pl_sb_C_us_us_bysize, None, ""), + ("e", si_sb_C_a_ae_bysize, -1, ""), + ("a", si_sb_C_a_ata_bysize, -2, ""), + ("s", si_sb_C_is_ides_bysize, -3, "s"), + ("i", si_sb_C_o_i_bysize, -1, "o"), + ("a", si_sb_C_on_a_bysize, -1, "on"), + ("m", si_sb_C_im_bysize, -2, ""), + ("i", si_sb_C_i_bysize, -1, ""), + ): + if words.lowered[-1] == lastlet: # this test to add speed + for k, v in d.items(): + if words.lowered[-k:] in v: + return word[:class_numend] + post + + # HANDLE PLURLS ENDING IN uses -> use + + if ( + words.lowered[-6:] == "houses" + or word in si_sb_uses_use_case + or words.last.lower() in si_sb_uses_use + ): + return word[:-1] + + # HANDLE PLURLS ENDING IN ies -> ie + + if word in si_sb_ies_ie_case or words.last.lower() in si_sb_ies_ie: + return word[:-1] + + # HANDLE PLURLS ENDING IN oes -> oe + + if ( + words.lowered[-5:] == "shoes" + or word in si_sb_oes_oe_case + or words.last.lower() in si_sb_oes_oe + ): + return word[:-1] + + # HANDLE SINGULAR NOUNS ENDING IN ...s OR OTHER SILIBANTS + + if word in si_sb_sses_sse_case or words.last.lower() in si_sb_sses_sse: + return word[:-1] + + if words.last.lower() in si_sb_singular_s_complete: + return word[:-2] + + for k, v in si_sb_singular_s_bysize.items(): + if words.lowered[-k:] in v: + return word[:-2] + + if words.lowered[-4:] == "eses" and word[0] == word[0].upper(): + return word[:-2] + + if words.last.lower() in si_sb_z_zes: + return word[:-2] + + if words.last.lower() in si_sb_zzes_zz: + return word[:-2] + + if words.lowered[-4:] == "zzes": + return word[:-3] + + if word in si_sb_ches_che_case or words.last.lower() in si_sb_ches_che: + return word[:-1] + + if words.lowered[-4:] in ("ches", "shes"): + return word[:-2] + + if words.last.lower() in si_sb_xes_xe: + return word[:-1] + + if words.lowered[-3:] == "xes": + return word[:-2] + + # HANDLE ...f -> ...ves + + if word in si_sb_ves_ve_case or words.last.lower() in si_sb_ves_ve: + return word[:-1] + + if words.lowered[-3:] == "ves": + if words.lowered[-5:-3] in ("el", "al", "ol"): + return word[:-3] + "f" + if words.lowered[-5:-3] == "ea" and word[-6:-5] != "d": + return word[:-3] + "f" + if words.lowered[-5:-3] in ("ni", "li", "wi"): + return word[:-3] + "fe" + if words.lowered[-5:-3] == "ar": + return word[:-3] + "f" + + # HANDLE ...y + + if words.lowered[-2:] == "ys": + if len(words.lowered) > 2 and words.lowered[-3] in "aeiou": + return word[:-1] + + if self.classical_dict["names"]: + if words.lowered[-2:] == "ys" and word[0] == word[0].upper(): + return word[:-1] + + if words.lowered[-3:] == "ies": + return word[:-3] + "y" + + # HANDLE ...o + + if words.lowered[-2:] == "os": + + if words.last.lower() in si_sb_U_o_os_complete: + return word[:-1] + + for k, v in si_sb_U_o_os_bysize.items(): + if words.lowered[-k:] in v: + return word[:-1] + + if words.lowered[-3:] in ("aos", "eos", "ios", "oos", "uos"): + return word[:-1] + + if words.lowered[-3:] == "oes": + return word[:-2] + + # UNASSIMILATED IMPORTS FINAL RULE + + if word in si_sb_es_is: + return word[:-2] + "is" + + # OTHERWISE JUST REMOVE ...s + + if words.lowered[-1] == "s": + return word[:-1] + + # COULD NOT FIND SINGULAR + + return False + + # ADJECTIVES + + @validate_arguments + def a(self, text: Word, count: Optional[Union[int, str, Any]] = 1) -> str: + """ + Return the appropriate indefinite article followed by text. + + The indefinite article is either 'a' or 'an'. + + If count is not one, then return count followed by text + instead of 'a' or 'an'. + + Whitespace at the start and end is preserved. + + """ + mo = INDEFINITE_ARTICLE_TEST.search(text) + if mo: + word = mo.group(2) + if not word: + return text + pre = mo.group(1) + post = mo.group(3) + result = self._indef_article(word, count) + return f"{pre}{result}{post}" + return "" + + an = a + + _indef_article_cases = ( + # HANDLE ORDINAL FORMS + (A_ordinal_a, "a"), + (A_ordinal_an, "an"), + # HANDLE SPECIAL CASES + (A_explicit_an, "an"), + (SPECIAL_AN, "an"), + (SPECIAL_A, "a"), + # HANDLE ABBREVIATIONS + (A_abbrev, "an"), + (SPECIAL_ABBREV_AN, "an"), + (SPECIAL_ABBREV_A, "a"), + # HANDLE CONSONANTS + (CONSONANTS, "a"), + # HANDLE SPECIAL VOWEL-FORMS + (ARTICLE_SPECIAL_EU, "a"), + (ARTICLE_SPECIAL_ONCE, "a"), + (ARTICLE_SPECIAL_ONETIME, "a"), + (ARTICLE_SPECIAL_UNIT, "a"), + (ARTICLE_SPECIAL_UBA, "a"), + (ARTICLE_SPECIAL_UKR, "a"), + (A_explicit_a, "a"), + # HANDLE SPECIAL CAPITALS + (SPECIAL_CAPITALS, "a"), + # HANDLE VOWELS + (VOWELS, "an"), + # HANDLE y... + # (BEFORE CERTAIN CONSONANTS IMPLIES (UNNATURALIZED) "i.." SOUND) + (A_y_cons, "an"), + ) + + def _indef_article(self, word: str, count: Union[int, str, Any]) -> str: + mycount = self.get_count(count) + + if mycount != 1: + return f"{count} {word}" + + # HANDLE USER-DEFINED VARIANTS + + value = self.ud_match(word, self.A_a_user_defined) + if value is not None: + return f"{value} {word}" + + matches = ( + f'{article} {word}' + for regexen, article in self._indef_article_cases + if regexen.search(word) + ) + + # OTHERWISE, GUESS "a" + fallback = f'a {word}' + return next(matches, fallback) + + # 2. TRANSLATE ZERO-QUANTIFIED $word TO "no plural($word)" + + @validate_arguments + def no(self, text: Word, count: Optional[Union[int, str]] = None) -> str: + """ + If count is 0, no, zero or nil, return 'no' followed by the plural + of text. + + If count is one of: + 1, a, an, one, each, every, this, that + return count followed by text. + + Otherwise return count follow by the plural of text. + + In the return value count is always followed by a space. + + Whitespace at the start and end is preserved. + + """ + if count is None and self.persistent_count is not None: + count = self.persistent_count + + if count is None: + count = 0 + mo = PARTITION_WORD.search(text) + if mo: + pre = mo.group(1) + word = mo.group(2) + post = mo.group(3) + else: + pre = "" + word = "" + post = "" + + if str(count).lower() in pl_count_zero: + count = 'no' + return f"{pre}{count} {self.plural(word, count)}{post}" + + # PARTICIPLES + + @validate_arguments + def present_participle(self, word: Word) -> str: + """ + Return the present participle for word. + + word is the 3rd person singular verb. + + """ + plv = self.plural_verb(word, 2) + ans = plv + + for regexen, repl in PRESENT_PARTICIPLE_REPLACEMENTS: + ans, num = regexen.subn(repl, plv) + if num: + return f"{ans}ing" + return f"{ans}ing" + + # NUMERICAL INFLECTIONS + + @validate_arguments + def ordinal(self, num: Union[int, Word]) -> str: # noqa: C901 + """ + Return the ordinal of num. + + num can be an integer or text + + e.g. ordinal(1) returns '1st' + ordinal('one') returns 'first' + + """ + if DIGIT.match(str(num)): + if isinstance(num, (int, float)): + n = int(num) + else: + if "." in str(num): + try: + # numbers after decimal, + # so only need last one for ordinal + n = int(num[-1]) + + except ValueError: # ends with '.', so need to use whole string + n = int(num[:-1]) + else: + n = int(num) + try: + post = nth[n % 100] + except KeyError: + post = nth[n % 10] + return f"{num}{post}" + else: + # Mad props to Damian Conway (?) whose ordinal() + # algorithm is type-bendy enough to foil MyPy + str_num: str = num # type: ignore[assignment] + mo = ordinal_suff.search(str_num) + if mo: + post = ordinal[mo.group(1)] + rval = ordinal_suff.sub(post, str_num) + else: + rval = f"{str_num}th" + return rval + + def millfn(self, ind: int = 0) -> str: + if ind > len(mill) - 1: + print3("number out of range") + raise NumOutOfRangeError + return mill[ind] + + def unitfn(self, units: int, mindex: int = 0) -> str: + return f"{unit[units]}{self.millfn(mindex)}" + + def tenfn(self, tens, units, mindex=0) -> str: + if tens != 1: + tens_part = ten[tens] + if tens and units: + hyphen = "-" + else: + hyphen = "" + unit_part = unit[units] + mill_part = self.millfn(mindex) + return f"{tens_part}{hyphen}{unit_part}{mill_part}" + return f"{teen[units]}{mill[mindex]}" + + def hundfn(self, hundreds: int, tens: int, units: int, mindex: int) -> str: + if hundreds: + andword = f" {self._number_args['andword']} " if tens or units else "" + # use unit not unitfn as simpler + return ( + f"{unit[hundreds]} hundred{andword}" + f"{self.tenfn(tens, units)}{self.millfn(mindex)}, " + ) + if tens or units: + return f"{self.tenfn(tens, units)}{self.millfn(mindex)}, " + return "" + + def group1sub(self, mo: Match) -> str: + units = int(mo.group(1)) + if units == 1: + return f" {self._number_args['one']}, " + elif units: + return f"{unit[units]}, " + else: + return f" {self._number_args['zero']}, " + + def group1bsub(self, mo: Match) -> str: + units = int(mo.group(1)) + if units: + return f"{unit[units]}, " + else: + return f" {self._number_args['zero']}, " + + def group2sub(self, mo: Match) -> str: + tens = int(mo.group(1)) + units = int(mo.group(2)) + if tens: + return f"{self.tenfn(tens, units)}, " + if units: + return f" {self._number_args['zero']} {unit[units]}, " + return f" {self._number_args['zero']} {self._number_args['zero']}, " + + def group3sub(self, mo: Match) -> str: + hundreds = int(mo.group(1)) + tens = int(mo.group(2)) + units = int(mo.group(3)) + if hundreds == 1: + hunword = f" {self._number_args['one']}" + elif hundreds: + hunword = str(unit[hundreds]) + else: + hunword = f" {self._number_args['zero']}" + if tens: + tenword = self.tenfn(tens, units) + elif units: + tenword = f" {self._number_args['zero']} {unit[units]}" + else: + tenword = f" {self._number_args['zero']} {self._number_args['zero']}" + return f"{hunword} {tenword}, " + + def hundsub(self, mo: Match) -> str: + ret = self.hundfn( + int(mo.group(1)), int(mo.group(2)), int(mo.group(3)), self.mill_count + ) + self.mill_count += 1 + return ret + + def tensub(self, mo: Match) -> str: + return f"{self.tenfn(int(mo.group(1)), int(mo.group(2)), self.mill_count)}, " + + def unitsub(self, mo: Match) -> str: + return f"{self.unitfn(int(mo.group(1)), self.mill_count)}, " + + def enword(self, num: str, group: int) -> str: + # import pdb + # pdb.set_trace() + + if group == 1: + num = DIGIT_GROUP.sub(self.group1sub, num) + elif group == 2: + num = TWO_DIGITS.sub(self.group2sub, num) + num = DIGIT_GROUP.sub(self.group1bsub, num, 1) + elif group == 3: + num = THREE_DIGITS.sub(self.group3sub, num) + num = TWO_DIGITS.sub(self.group2sub, num, 1) + num = DIGIT_GROUP.sub(self.group1sub, num, 1) + elif int(num) == 0: + num = self._number_args["zero"] + elif int(num) == 1: + num = self._number_args["one"] + else: + num = num.lstrip().lstrip("0") + self.mill_count = 0 + # surely there's a better way to do the next bit + mo = THREE_DIGITS_WORD.search(num) + while mo: + num = THREE_DIGITS_WORD.sub(self.hundsub, num, 1) + mo = THREE_DIGITS_WORD.search(num) + num = TWO_DIGITS_WORD.sub(self.tensub, num, 1) + num = ONE_DIGIT_WORD.sub(self.unitsub, num, 1) + return num + + @validate_arguments(config=dict(arbitrary_types_allowed=True)) # noqa: C901 + def number_to_words( # noqa: C901 + self, + num: Union[Number, Word], + wantlist: bool = False, + group: int = 0, + comma: Union[Falsish, str] = ",", + andword: str = "and", + zero: str = "zero", + one: str = "one", + decimal: Union[Falsish, str] = "point", + threshold: Optional[int] = None, + ) -> Union[str, List[str]]: + """ + Return a number in words. + + group = 1, 2 or 3 to group numbers before turning into words + comma: define comma + + andword: + word for 'and'. Can be set to ''. + e.g. "one hundred and one" vs "one hundred one" + + zero: word for '0' + one: word for '1' + decimal: word for decimal point + threshold: numbers above threshold not turned into words + + parameters not remembered from last call. Departure from Perl version. + """ + self._number_args = {"andword": andword, "zero": zero, "one": one} + num = str(num) + + # Handle "stylistic" conversions (up to a given threshold)... + if threshold is not None and float(num) > threshold: + spnum = num.split(".", 1) + while comma: + (spnum[0], n) = FOUR_DIGIT_COMMA.subn(r"\1,\2", spnum[0]) + if n == 0: + break + try: + return f"{spnum[0]}.{spnum[1]}" + except IndexError: + return str(spnum[0]) + + if group < 0 or group > 3: + raise BadChunkingOptionError + nowhite = num.lstrip() + if nowhite[0] == "+": + sign = "plus" + elif nowhite[0] == "-": + sign = "minus" + else: + sign = "" + + if num in nth_suff: + num = zero + + myord = num[-2:] in nth_suff + if myord: + num = num[:-2] + finalpoint = False + if decimal: + if group != 0: + chunks = num.split(".") + else: + chunks = num.split(".", 1) + if chunks[-1] == "": # remove blank string if nothing after decimal + chunks = chunks[:-1] + finalpoint = True # add 'point' to end of output + else: + chunks = [num] + + first: Union[int, str, bool] = 1 + loopstart = 0 + + if chunks[0] == "": + first = 0 + if len(chunks) > 1: + loopstart = 1 + + for i in range(loopstart, len(chunks)): + chunk = chunks[i] + # remove all non numeric \D + chunk = NON_DIGIT.sub("", chunk) + if chunk == "": + chunk = "0" + + if group == 0 and (first == 0 or first == ""): + chunk = self.enword(chunk, 1) + else: + chunk = self.enword(chunk, group) + + if chunk[-2:] == ", ": + chunk = chunk[:-2] + chunk = WHITESPACES_COMMA.sub(",", chunk) + + if group == 0 and first: + chunk = COMMA_WORD.sub(f" {andword} \\1", chunk) + chunk = WHITESPACES.sub(" ", chunk) + # chunk = re.sub(r"(\A\s|\s\Z)", self.blankfn, chunk) + chunk = chunk.strip() + if first: + first = "" + chunks[i] = chunk + + numchunks = [] + if first != 0: + numchunks = chunks[0].split(f"{comma} ") + + if myord and numchunks: + # TODO: can this be just one re as it is in perl? + mo = ordinal_suff.search(numchunks[-1]) + if mo: + numchunks[-1] = ordinal_suff.sub(ordinal[mo.group(1)], numchunks[-1]) + else: + numchunks[-1] += "th" + + for chunk in chunks[1:]: + numchunks.append(decimal) + numchunks.extend(chunk.split(f"{comma} ")) + + if finalpoint: + numchunks.append(decimal) + + # wantlist: Perl list context. can explicitly specify in Python + if wantlist: + if sign: + numchunks = [sign] + numchunks + return numchunks + elif group: + signout = f"{sign} " if sign else "" + return f"{signout}{', '.join(numchunks)}" + else: + signout = f"{sign} " if sign else "" + num = f"{signout}{numchunks.pop(0)}" + if decimal is None: + first = True + else: + first = not num.endswith(decimal) + for nc in numchunks: + if nc == decimal: + num += f" {nc}" + first = 0 + elif first: + num += f"{comma} {nc}" + else: + num += f" {nc}" + return num + + # Join words with commas and a trailing 'and' (when appropriate)... + + @validate_arguments + def join( + self, + words: Optional[Sequence[Word]], + sep: Optional[str] = None, + sep_spaced: bool = True, + final_sep: Optional[str] = None, + conj: str = "and", + conj_spaced: bool = True, + ) -> str: + """ + Join words into a list. + + e.g. join(['ant', 'bee', 'fly']) returns 'ant, bee, and fly' + + options: + conj: replacement for 'and' + sep: separator. default ',', unless ',' is in the list then ';' + final_sep: final separator. default ',', unless ',' is in the list then ';' + conj_spaced: boolean. Should conj have spaces around it + + """ + if not words: + return "" + if len(words) == 1: + return words[0] + + if conj_spaced: + if conj == "": + conj = " " + else: + conj = f" {conj} " + + if len(words) == 2: + return f"{words[0]}{conj}{words[1]}" + + if sep is None: + if "," in "".join(words): + sep = ";" + else: + sep = "," + if final_sep is None: + final_sep = sep + + final_sep = f"{final_sep}{conj}" + + if sep_spaced: + sep += " " + + return f"{sep.join(words[0:-1])}{final_sep}{words[-1]}" diff --git a/libs/win/inflect/py.typed b/libs/win/inflect/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/libs/win/jaraco.classes-1.5-py3.6-nspkg.pth b/libs/win/jaraco.classes-1.5-py3.6-nspkg.pth deleted file mode 100644 index 61cb14f9..00000000 --- a/libs/win/jaraco.classes-1.5-py3.6-nspkg.pth +++ /dev/null @@ -1 +0,0 @@ -import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('jaraco',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('jaraco', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('jaraco', [os.path.dirname(p)])));m = m or sys.modules.setdefault('jaraco', types.ModuleType('jaraco'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p) diff --git a/libs/win/jaraco.collections-1.6.0-py3.7-nspkg.pth b/libs/win/jaraco.collections-1.6.0-py3.7-nspkg.pth deleted file mode 100644 index 61cb14f9..00000000 --- a/libs/win/jaraco.collections-1.6.0-py3.7-nspkg.pth +++ /dev/null @@ -1 +0,0 @@ -import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('jaraco',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('jaraco', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('jaraco', [os.path.dirname(p)])));m = m or sys.modules.setdefault('jaraco', types.ModuleType('jaraco'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p) diff --git a/libs/win/jaraco.functools-1.20-py3.6-nspkg.pth b/libs/win/jaraco.functools-1.20-py3.6-nspkg.pth deleted file mode 100644 index 61cb14f9..00000000 --- a/libs/win/jaraco.functools-1.20-py3.6-nspkg.pth +++ /dev/null @@ -1 +0,0 @@ -import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('jaraco',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('jaraco', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('jaraco', [os.path.dirname(p)])));m = m or sys.modules.setdefault('jaraco', types.ModuleType('jaraco'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p) diff --git a/libs/win/jaraco.structures-1.1.2-py3.6-nspkg.pth b/libs/win/jaraco.structures-1.1.2-py3.6-nspkg.pth deleted file mode 100644 index 61cb14f9..00000000 --- a/libs/win/jaraco.structures-1.1.2-py3.6-nspkg.pth +++ /dev/null @@ -1 +0,0 @@ -import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('jaraco',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('jaraco', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('jaraco', [os.path.dirname(p)])));m = m or sys.modules.setdefault('jaraco', types.ModuleType('jaraco'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p) diff --git a/libs/win/jaraco.text-1.10.1-py3.6-nspkg.pth b/libs/win/jaraco.text-1.10.1-py3.6-nspkg.pth deleted file mode 100644 index 61cb14f9..00000000 --- a/libs/win/jaraco.text-1.10.1-py3.6-nspkg.pth +++ /dev/null @@ -1 +0,0 @@ -import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('jaraco',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('jaraco', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('jaraco', [os.path.dirname(p)])));m = m or sys.modules.setdefault('jaraco', types.ModuleType('jaraco'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p) diff --git a/libs/win/jaraco.ui-1.6-py3.6-nspkg.pth b/libs/win/jaraco.ui-1.6-py3.6-nspkg.pth deleted file mode 100644 index 61cb14f9..00000000 --- a/libs/win/jaraco.ui-1.6-py3.6-nspkg.pth +++ /dev/null @@ -1 +0,0 @@ -import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('jaraco',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('jaraco', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('jaraco', [os.path.dirname(p)])));m = m or sys.modules.setdefault('jaraco', types.ModuleType('jaraco'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p) diff --git a/libs/win/jaraco.windows-3.9.2-py3.7-nspkg.pth b/libs/win/jaraco.windows-3.9.2-py3.7-nspkg.pth deleted file mode 100644 index 61cb14f9..00000000 --- a/libs/win/jaraco.windows-3.9.2-py3.7-nspkg.pth +++ /dev/null @@ -1 +0,0 @@ -import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('jaraco',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('jaraco', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('jaraco', [os.path.dirname(p)])));m = m or sys.modules.setdefault('jaraco', types.ModuleType('jaraco'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p) diff --git a/libs/win/jaraco/classes/ancestry.py b/libs/win/jaraco/classes/ancestry.py index 040ce612..dd9b2e92 100644 --- a/libs/win/jaraco/classes/ancestry.py +++ b/libs/win/jaraco/classes/ancestry.py @@ -3,73 +3,66 @@ Routines for obtaining the class names of an object and its parent classes. """ -from __future__ import unicode_literals +from more_itertools import unique_everseen def all_bases(c): - """ - return a tuple of all base classes the class c has as a parent. - >>> object in all_bases(list) - True - """ - return c.mro()[1:] + """ + return a tuple of all base classes the class c has as a parent. + >>> object in all_bases(list) + True + """ + return c.mro()[1:] def all_classes(c): - """ - return a tuple of all classes to which c belongs - >>> list in all_classes(list) - True - """ - return c.mro() + """ + return a tuple of all classes to which c belongs + >>> list in all_classes(list) + True + """ + return c.mro() + # borrowed from # http://code.activestate.com/recipes/576949-find-all-subclasses-of-a-given-class/ -def iter_subclasses(cls, _seen=None): - """ - Generator over all subclasses of a given class, in depth-first order. +def iter_subclasses(cls): + """ + Generator over all subclasses of a given class, in depth-first order. - >>> bool in list(iter_subclasses(int)) - True - >>> class A(object): pass - >>> class B(A): pass - >>> class C(A): pass - >>> class D(B,C): pass - >>> class E(D): pass - >>> - >>> for cls in iter_subclasses(A): - ... print(cls.__name__) - B - D - E - C - >>> # get ALL (new-style) classes currently defined - >>> res = [cls.__name__ for cls in iter_subclasses(object)] - >>> 'type' in res - True - >>> 'tuple' in res - True - >>> len(res) > 100 - True - """ + >>> bool in list(iter_subclasses(int)) + True + >>> class A(object): pass + >>> class B(A): pass + >>> class C(A): pass + >>> class D(B,C): pass + >>> class E(D): pass + >>> + >>> for cls in iter_subclasses(A): + ... print(cls.__name__) + B + D + E + C + >>> # get ALL classes currently defined + >>> res = [cls.__name__ for cls in iter_subclasses(object)] + >>> 'type' in res + True + >>> 'tuple' in res + True + >>> len(res) > 100 + True + """ + return unique_everseen(_iter_all_subclasses(cls)) - if not isinstance(cls, type): - raise TypeError( - 'iter_subclasses must be called with ' - 'new-style classes, not %.100r' % cls - ) - if _seen is None: - _seen = set() - try: - subs = cls.__subclasses__() - except TypeError: # fails only when cls is type - subs = cls.__subclasses__(cls) - for sub in subs: - if sub in _seen: - continue - _seen.add(sub) - yield sub - for sub in iter_subclasses(sub, _seen): - yield sub + +def _iter_all_subclasses(cls): + try: + subs = cls.__subclasses__() + except TypeError: # fails only when cls is type + subs = cls.__subclasses__(cls) + for sub in subs: + yield sub + yield from iter_subclasses(sub) diff --git a/libs/win/jaraco/classes/meta.py b/libs/win/jaraco/classes/meta.py index c26f7dc2..bd41a1d9 100644 --- a/libs/win/jaraco/classes/meta.py +++ b/libs/win/jaraco/classes/meta.py @@ -4,38 +4,63 @@ meta.py Some useful metaclasses. """ -from __future__ import unicode_literals - class LeafClassesMeta(type): - """ - A metaclass for classes that keeps track of all of them that - aren't base classes. - """ + """ + A metaclass for classes that keeps track of all of them that + aren't base classes. - _leaf_classes = set() + >>> Parent = LeafClassesMeta('MyParentClass', (), {}) + >>> Parent in Parent._leaf_classes + True + >>> Child = LeafClassesMeta('MyChildClass', (Parent,), {}) + >>> Child in Parent._leaf_classes + True + >>> Parent in Parent._leaf_classes + False - def __init__(cls, name, bases, attrs): - if not hasattr(cls, '_leaf_classes'): - cls._leaf_classes = set() - leaf_classes = getattr(cls, '_leaf_classes') - leaf_classes.add(cls) - # remove any base classes - leaf_classes -= set(bases) + >>> Other = LeafClassesMeta('OtherClass', (), {}) + >>> Parent in Other._leaf_classes + False + >>> len(Other._leaf_classes) + 1 + """ + + def __init__(cls, name, bases, attrs): + if not hasattr(cls, '_leaf_classes'): + cls._leaf_classes = set() + leaf_classes = getattr(cls, '_leaf_classes') + leaf_classes.add(cls) + # remove any base classes + leaf_classes -= set(bases) class TagRegistered(type): - """ - As classes of this metaclass are created, they keep a registry in the - base class of all classes by a class attribute, indicated by attr_name. - """ - attr_name = 'tag' + """ + As classes of this metaclass are created, they keep a registry in the + base class of all classes by a class attribute, indicated by attr_name. - def __init__(cls, name, bases, namespace): - super(TagRegistered, cls).__init__(name, bases, namespace) - if not hasattr(cls, '_registry'): - cls._registry = {} - meta = cls.__class__ - attr = getattr(cls, meta.attr_name, None) - if attr: - cls._registry[attr] = cls + >>> FooObject = TagRegistered('FooObject', (), dict(tag='foo')) + >>> FooObject._registry['foo'] is FooObject + True + >>> BarObject = TagRegistered('Barobject', (FooObject,), dict(tag='bar')) + >>> FooObject._registry is BarObject._registry + True + >>> len(FooObject._registry) + 2 + + '...' below should be 'jaraco.classes' but for pytest-dev/pytest#3396 + >>> FooObject._registry['bar'] + + """ + + attr_name = 'tag' + + def __init__(cls, name, bases, namespace): + super(TagRegistered, cls).__init__(name, bases, namespace) + if not hasattr(cls, '_registry'): + cls._registry = {} + meta = cls.__class__ + attr = getattr(cls, meta.attr_name, None) + if attr: + cls._registry[attr] = cls diff --git a/libs/win/jaraco/classes/properties.py b/libs/win/jaraco/classes/properties.py index 57f9054f..62f9e200 100644 --- a/libs/win/jaraco/classes/properties.py +++ b/libs/win/jaraco/classes/properties.py @@ -1,67 +1,170 @@ -from __future__ import unicode_literals - -import six - -__metaclass__ = type - - class NonDataProperty: - """Much like the property builtin, but only implements __get__, - making it a non-data property, and can be subsequently reset. + """Much like the property builtin, but only implements __get__, + making it a non-data property, and can be subsequently reset. - See http://users.rcn.com/python/download/Descriptor.htm for more - information. + See http://users.rcn.com/python/download/Descriptor.htm for more + information. - >>> class X(object): - ... @NonDataProperty - ... def foo(self): - ... return 3 - >>> x = X() - >>> x.foo - 3 - >>> x.foo = 4 - >>> x.foo - 4 - """ + >>> class X(object): + ... @NonDataProperty + ... def foo(self): + ... return 3 + >>> x = X() + >>> x.foo + 3 + >>> x.foo = 4 + >>> x.foo + 4 - def __init__(self, fget): - assert fget is not None, "fget cannot be none" - assert six.callable(fget), "fget must be callable" - self.fget = fget + '...' below should be 'jaraco.classes' but for pytest-dev/pytest#3396 + >>> X.foo + <....properties.NonDataProperty object at ...> + """ - def __get__(self, obj, objtype=None): - if obj is None: - return self - return self.fget(obj) + def __init__(self, fget): + assert fget is not None, "fget cannot be none" + assert callable(fget), "fget must be callable" + self.fget = fget + + def __get__(self, obj, objtype=None): + if obj is None: + return self + return self.fget(obj) -# from http://stackoverflow.com/a/5191224 -class ClassPropertyDescriptor: - - def __init__(self, fget, fset=None): - self.fget = fget - self.fset = fset - - def __get__(self, obj, klass=None): - if klass is None: - klass = type(obj) - return self.fget.__get__(obj, klass)() - - def __set__(self, obj, value): - if not self.fset: - raise AttributeError("can't set attribute") - type_ = type(obj) - return self.fset.__get__(obj, type_)(value) - - def setter(self, func): - if not isinstance(func, (classmethod, staticmethod)): - func = classmethod(func) - self.fset = func - return self +class classproperty: + """ + Like @property but applies at the class level. -def classproperty(func): - if not isinstance(func, (classmethod, staticmethod)): - func = classmethod(func) + >>> class X(metaclass=classproperty.Meta): + ... val = None + ... @classproperty + ... def foo(cls): + ... return cls.val + ... @foo.setter + ... def foo(cls, val): + ... cls.val = val + >>> X.foo + >>> X.foo = 3 + >>> X.foo + 3 + >>> x = X() + >>> x.foo + 3 + >>> X.foo = 4 + >>> x.foo + 4 - return ClassPropertyDescriptor(func) + Setting the property on an instance affects the class. + + >>> x.foo = 5 + >>> x.foo + 5 + >>> X.foo + 5 + >>> vars(x) + {} + >>> X().foo + 5 + + Attempting to set an attribute where no setter was defined + results in an AttributeError: + + >>> class GetOnly(metaclass=classproperty.Meta): + ... @classproperty + ... def foo(cls): + ... return 'bar' + >>> GetOnly.foo = 3 + Traceback (most recent call last): + ... + AttributeError: can't set attribute + + It is also possible to wrap a classmethod or staticmethod in + a classproperty. + + >>> class Static(metaclass=classproperty.Meta): + ... @classproperty + ... @classmethod + ... def foo(cls): + ... return 'foo' + ... @classproperty + ... @staticmethod + ... def bar(): + ... return 'bar' + >>> Static.foo + 'foo' + >>> Static.bar + 'bar' + + *Legacy* + + For compatibility, if the metaclass isn't specified, the + legacy behavior will be invoked. + + >>> class X: + ... val = None + ... @classproperty + ... def foo(cls): + ... return cls.val + ... @foo.setter + ... def foo(cls, val): + ... cls.val = val + >>> X.foo + >>> X.foo = 3 + >>> X.foo + 3 + >>> x = X() + >>> x.foo + 3 + >>> X.foo = 4 + >>> x.foo + 4 + + Note, because the metaclass was not specified, setting + a value on an instance does not have the intended effect. + + >>> x.foo = 5 + >>> x.foo + 5 + >>> X.foo # should be 5 + 4 + >>> vars(x) # should be empty + {'foo': 5} + >>> X().foo # should be 5 + 4 + """ + + class Meta(type): + def __setattr__(self, key, value): + obj = self.__dict__.get(key, None) + if type(obj) is classproperty: + return obj.__set__(self, value) + return super().__setattr__(key, value) + + def __init__(self, fget, fset=None): + self.fget = self._ensure_method(fget) + self.fset = fset + fset and self.setter(fset) + + def __get__(self, instance, owner=None): + return self.fget.__get__(None, owner)() + + def __set__(self, owner, value): + if not self.fset: + raise AttributeError("can't set attribute") + if type(owner) is not classproperty.Meta: + owner = type(owner) + return self.fset.__get__(None, owner)(value) + + def setter(self, fset): + self.fset = self._ensure_method(fset) + return self + + @classmethod + def _ensure_method(cls, fn): + """ + Ensure fn is a classmethod or staticmethod. + """ + needs_method = not isinstance(fn, (classmethod, staticmethod)) + return classmethod(fn) if needs_method else fn diff --git a/libs/win/jaraco/collections.py b/libs/win/jaraco/collections.py index bb463deb..db89b122 100644 --- a/libs/win/jaraco/collections.py +++ b/libs/win/jaraco/collections.py @@ -1,906 +1,1090 @@ -# -*- coding: utf-8 -*- - -from __future__ import absolute_import, unicode_literals, division - import re import operator -import collections +import collections.abc import itertools import copy import functools +import random -try: - import collections.abc -except ImportError: - # Python 2.7 - collections.abc = collections - -import six from jaraco.classes.properties import NonDataProperty import jaraco.text class Projection(collections.abc.Mapping): - """ - Project a set of keys over a mapping + """ + Project a set of keys over a mapping - >>> sample = {'a': 1, 'b': 2, 'c': 3} - >>> prj = Projection(['a', 'c', 'd'], sample) - >>> prj == {'a': 1, 'c': 3} - True + >>> sample = {'a': 1, 'b': 2, 'c': 3} + >>> prj = Projection(['a', 'c', 'd'], sample) + >>> prj == {'a': 1, 'c': 3} + True - Keys should only appear if they were specified and exist in the space. + Keys should only appear if they were specified and exist in the space. - >>> sorted(list(prj.keys())) - ['a', 'c'] + >>> sorted(list(prj.keys())) + ['a', 'c'] - Use the projection to update another dict. + Attempting to access a key not in the projection + results in a KeyError. - >>> target = {'a': 2, 'b': 2} - >>> target.update(prj) - >>> target == {'a': 1, 'b': 2, 'c': 3} - True + >>> prj['b'] + Traceback (most recent call last): + ... + KeyError: 'b' - Also note that Projection keeps a reference to the original dict, so - if you modify the original dict, that could modify the Projection. + Use the projection to update another dict. - >>> del sample['a'] - >>> dict(prj) - {'c': 3} - """ - def __init__(self, keys, space): - self._keys = tuple(keys) - self._space = space + >>> target = {'a': 2, 'b': 2} + >>> target.update(prj) + >>> target == {'a': 1, 'b': 2, 'c': 3} + True - def __getitem__(self, key): - if key not in self._keys: - raise KeyError(key) - return self._space[key] + Also note that Projection keeps a reference to the original dict, so + if you modify the original dict, that could modify the Projection. - def __iter__(self): - return iter(set(self._keys).intersection(self._space)) + >>> del sample['a'] + >>> dict(prj) + {'c': 3} + """ - def __len__(self): - return len(tuple(iter(self))) + def __init__(self, keys, space): + self._keys = tuple(keys) + self._space = space + + def __getitem__(self, key): + if key not in self._keys: + raise KeyError(key) + return self._space[key] + + def __iter__(self): + return iter(set(self._keys).intersection(self._space)) + + def __len__(self): + return len(tuple(iter(self))) -class DictFilter(object): - """ - Takes a dict, and simulates a sub-dict based on the keys. +class DictFilter(collections.abc.Mapping): + """ + Takes a dict, and simulates a sub-dict based on the keys. - >>> sample = {'a': 1, 'b': 2, 'c': 3} - >>> filtered = DictFilter(sample, ['a', 'c']) - >>> filtered == {'a': 1, 'c': 3} - True + >>> sample = {'a': 1, 'b': 2, 'c': 3} + >>> filtered = DictFilter(sample, ['a', 'c']) + >>> filtered == {'a': 1, 'c': 3} + True + >>> set(filtered.values()) == {1, 3} + True + >>> set(filtered.items()) == {('a', 1), ('c', 3)} + True - One can also filter by a regular expression pattern + One can also filter by a regular expression pattern - >>> sample['d'] = 4 - >>> sample['ef'] = 5 + >>> sample['d'] = 4 + >>> sample['ef'] = 5 - Here we filter for only single-character keys + Here we filter for only single-character keys - >>> filtered = DictFilter(sample, include_pattern='.$') - >>> filtered == {'a': 1, 'b': 2, 'c': 3, 'd': 4} - True + >>> filtered = DictFilter(sample, include_pattern='.$') + >>> filtered == {'a': 1, 'b': 2, 'c': 3, 'd': 4} + True - Also note that DictFilter keeps a reference to the original dict, so - if you modify the original dict, that could modify the filtered dict. + >>> filtered['e'] + Traceback (most recent call last): + ... + KeyError: 'e' - >>> del sample['d'] - >>> del sample['a'] - >>> filtered == {'b': 2, 'c': 3} - True + >>> 'e' in filtered + False - """ - def __init__(self, dict, include_keys=[], include_pattern=None): - self.dict = dict - self.specified_keys = set(include_keys) - if include_pattern is not None: - self.include_pattern = re.compile(include_pattern) - else: - # for performance, replace the pattern_keys property - self.pattern_keys = set() + Pattern is useful for excluding keys with a prefix. - def get_pattern_keys(self): - keys = filter(self.include_pattern.match, self.dict.keys()) - return set(keys) - pattern_keys = NonDataProperty(get_pattern_keys) + >>> filtered = DictFilter(sample, include_pattern=r'(?![ace])') + >>> dict(filtered) + {'b': 2, 'd': 4} - @property - def include_keys(self): - return self.specified_keys.union(self.pattern_keys) + Also note that DictFilter keeps a reference to the original dict, so + if you modify the original dict, that could modify the filtered dict. - def keys(self): - return self.include_keys.intersection(self.dict.keys()) + >>> del sample['d'] + >>> dict(filtered) + {'b': 2} + """ - def values(self): - keys = self.keys() - values = map(self.dict.get, keys) - return values + def __init__(self, dict, include_keys=[], include_pattern=None): + self.dict = dict + self.specified_keys = set(include_keys) + if include_pattern is not None: + self.include_pattern = re.compile(include_pattern) + else: + # for performance, replace the pattern_keys property + self.pattern_keys = set() - def __getitem__(self, i): - if i not in self.include_keys: - return KeyError, i - return self.dict[i] + def get_pattern_keys(self): + keys = filter(self.include_pattern.match, self.dict.keys()) + return set(keys) - def items(self): - keys = self.keys() - values = map(self.dict.get, keys) - return zip(keys, values) + pattern_keys = NonDataProperty(get_pattern_keys) - def __eq__(self, other): - return dict(self) == other + @property + def include_keys(self): + return self.specified_keys | self.pattern_keys - def __ne__(self, other): - return dict(self) != other + def __getitem__(self, i): + if i not in self.include_keys: + raise KeyError(i) + return self.dict[i] + + def __iter__(self): + return filter(self.include_keys.__contains__, self.dict.keys()) + + def __len__(self): + return len(list(self)) def dict_map(function, dictionary): - """ - dict_map is much like the built-in function map. It takes a dictionary - and applys a function to the values of that dictionary, returning a - new dictionary with the mapped values in the original keys. + """ + dict_map is much like the built-in function map. It takes a dictionary + and applys a function to the values of that dictionary, returning a + new dictionary with the mapped values in the original keys. - >>> d = dict_map(lambda x:x+1, dict(a=1, b=2)) - >>> d == dict(a=2,b=3) - True - """ - return dict((key, function(value)) for key, value in dictionary.items()) + >>> d = dict_map(lambda x:x+1, dict(a=1, b=2)) + >>> d == dict(a=2,b=3) + True + """ + return dict((key, function(value)) for key, value in dictionary.items()) class RangeMap(dict): - """ - A dictionary-like object that uses the keys as bounds for a range. - Inclusion of the value for that range is determined by the - key_match_comparator, which defaults to less-than-or-equal. - A value is returned for a key if it is the first key that matches in - the sorted list of keys. + """ + A dictionary-like object that uses the keys as bounds for a range. + Inclusion of the value for that range is determined by the + key_match_comparator, which defaults to less-than-or-equal. + A value is returned for a key if it is the first key that matches in + the sorted list of keys. - One may supply keyword parameters to be passed to the sort function used - to sort keys (i.e. cmp [python 2 only], keys, reverse) as sort_params. + One may supply keyword parameters to be passed to the sort function used + to sort keys (i.e. key, reverse) as sort_params. - Let's create a map that maps 1-3 -> 'a', 4-6 -> 'b' + Let's create a map that maps 1-3 -> 'a', 4-6 -> 'b' - >>> r = RangeMap({3: 'a', 6: 'b'}) # boy, that was easy - >>> r[1], r[2], r[3], r[4], r[5], r[6] - ('a', 'a', 'a', 'b', 'b', 'b') + >>> r = RangeMap({3: 'a', 6: 'b'}) # boy, that was easy + >>> r[1], r[2], r[3], r[4], r[5], r[6] + ('a', 'a', 'a', 'b', 'b', 'b') - Even float values should work so long as the comparison operator - supports it. + Even float values should work so long as the comparison operator + supports it. - >>> r[4.5] - 'b' + >>> r[4.5] + 'b' - But you'll notice that the way rangemap is defined, it must be open-ended - on one side. + But you'll notice that the way rangemap is defined, it must be open-ended + on one side. - >>> r[0] - 'a' - >>> r[-1] - 'a' + >>> r[0] + 'a' + >>> r[-1] + 'a' - One can close the open-end of the RangeMap by using undefined_value + One can close the open-end of the RangeMap by using undefined_value - >>> r = RangeMap({0: RangeMap.undefined_value, 3: 'a', 6: 'b'}) - >>> r[0] - Traceback (most recent call last): - ... - KeyError: 0 + >>> r = RangeMap({0: RangeMap.undefined_value, 3: 'a', 6: 'b'}) + >>> r[0] + Traceback (most recent call last): + ... + KeyError: 0 - One can get the first or last elements in the range by using RangeMap.Item + One can get the first or last elements in the range by using RangeMap.Item - >>> last_item = RangeMap.Item(-1) - >>> r[last_item] - 'b' + >>> last_item = RangeMap.Item(-1) + >>> r[last_item] + 'b' - .last_item is a shortcut for Item(-1) + .last_item is a shortcut for Item(-1) - >>> r[RangeMap.last_item] - 'b' + >>> r[RangeMap.last_item] + 'b' - Sometimes it's useful to find the bounds for a RangeMap + Sometimes it's useful to find the bounds for a RangeMap - >>> r.bounds() - (0, 6) + >>> r.bounds() + (0, 6) - RangeMap supports .get(key, default) + RangeMap supports .get(key, default) - >>> r.get(0, 'not found') - 'not found' + >>> r.get(0, 'not found') + 'not found' - >>> r.get(7, 'not found') - 'not found' - """ - def __init__(self, source, sort_params={}, key_match_comparator=operator.le): - dict.__init__(self, source) - self.sort_params = sort_params - self.match = key_match_comparator + >>> r.get(7, 'not found') + 'not found' - def __getitem__(self, item): - sorted_keys = sorted(self.keys(), **self.sort_params) - if isinstance(item, RangeMap.Item): - result = self.__getitem__(sorted_keys[item]) - else: - key = self._find_first_match_(sorted_keys, item) - result = dict.__getitem__(self, key) - if result is RangeMap.undefined_value: - raise KeyError(key) - return result + One often wishes to define the ranges by their left-most values, + which requires use of sort params and a key_match_comparator. - def get(self, key, default=None): - """ - Return the value for key if key is in the dictionary, else default. - If default is not given, it defaults to None, so that this method - never raises a KeyError. - """ - try: - return self[key] - except KeyError: - return default + >>> r = RangeMap({1: 'a', 4: 'b'}, + ... sort_params=dict(reverse=True), + ... key_match_comparator=operator.ge) + >>> r[1], r[2], r[3], r[4], r[5], r[6] + ('a', 'a', 'a', 'b', 'b', 'b') - def _find_first_match_(self, keys, item): - is_match = functools.partial(self.match, item) - matches = list(filter(is_match, keys)) - if matches: - return matches[0] - raise KeyError(item) + That wasn't nearly as easy as before, so an alternate constructor + is provided: - def bounds(self): - sorted_keys = sorted(self.keys(), **self.sort_params) - return ( - sorted_keys[RangeMap.first_item], - sorted_keys[RangeMap.last_item], - ) + >>> r = RangeMap.left({1: 'a', 4: 'b', 7: RangeMap.undefined_value}) + >>> r[1], r[2], r[3], r[4], r[5], r[6] + ('a', 'a', 'a', 'b', 'b', 'b') - # some special values for the RangeMap - undefined_value = type(str('RangeValueUndefined'), (object,), {})() + """ - class Item(int): - "RangeMap Item" - first_item = Item(0) - last_item = Item(-1) + def __init__(self, source, sort_params={}, key_match_comparator=operator.le): + dict.__init__(self, source) + self.sort_params = sort_params + self.match = key_match_comparator + + @classmethod + def left(cls, source): + return cls( + source, sort_params=dict(reverse=True), key_match_comparator=operator.ge + ) + + def __getitem__(self, item): + sorted_keys = sorted(self.keys(), **self.sort_params) + if isinstance(item, RangeMap.Item): + result = self.__getitem__(sorted_keys[item]) + else: + key = self._find_first_match_(sorted_keys, item) + result = dict.__getitem__(self, key) + if result is RangeMap.undefined_value: + raise KeyError(key) + return result + + def get(self, key, default=None): + """ + Return the value for key if key is in the dictionary, else default. + If default is not given, it defaults to None, so that this method + never raises a KeyError. + """ + try: + return self[key] + except KeyError: + return default + + def _find_first_match_(self, keys, item): + is_match = functools.partial(self.match, item) + matches = list(filter(is_match, keys)) + if matches: + return matches[0] + raise KeyError(item) + + def bounds(self): + sorted_keys = sorted(self.keys(), **self.sort_params) + return (sorted_keys[RangeMap.first_item], sorted_keys[RangeMap.last_item]) + + # some special values for the RangeMap + undefined_value = type(str('RangeValueUndefined'), (), {})() + + class Item(int): + "RangeMap Item" + + first_item = Item(0) + last_item = Item(-1) def __identity(x): - return x + return x def sorted_items(d, key=__identity, reverse=False): - """ - Return the items of the dictionary sorted by the keys + """ + Return the items of the dictionary sorted by the keys - >>> sample = dict(foo=20, bar=42, baz=10) - >>> tuple(sorted_items(sample)) - (('bar', 42), ('baz', 10), ('foo', 20)) + >>> sample = dict(foo=20, bar=42, baz=10) + >>> tuple(sorted_items(sample)) + (('bar', 42), ('baz', 10), ('foo', 20)) - >>> reverse_string = lambda s: ''.join(reversed(s)) - >>> tuple(sorted_items(sample, key=reverse_string)) - (('foo', 20), ('bar', 42), ('baz', 10)) + >>> reverse_string = lambda s: ''.join(reversed(s)) + >>> tuple(sorted_items(sample, key=reverse_string)) + (('foo', 20), ('bar', 42), ('baz', 10)) - >>> tuple(sorted_items(sample, reverse=True)) - (('foo', 20), ('baz', 10), ('bar', 42)) - """ - # wrap the key func so it operates on the first element of each item - def pairkey_key(item): - return key(item[0]) - return sorted(d.items(), key=pairkey_key, reverse=reverse) + >>> tuple(sorted_items(sample, reverse=True)) + (('foo', 20), ('baz', 10), ('bar', 42)) + """ + # wrap the key func so it operates on the first element of each item + def pairkey_key(item): + return key(item[0]) + + return sorted(d.items(), key=pairkey_key, reverse=reverse) class KeyTransformingDict(dict): - """ - A dict subclass that transforms the keys before they're used. - Subclasses may override the default transform_key to customize behavior. - """ - @staticmethod - def transform_key(key): - return key + """ + A dict subclass that transforms the keys before they're used. + Subclasses may override the default transform_key to customize behavior. + """ - def __init__(self, *args, **kargs): - super(KeyTransformingDict, self).__init__() - # build a dictionary using the default constructs - d = dict(*args, **kargs) - # build this dictionary using transformed keys. - for item in d.items(): - self.__setitem__(*item) + @staticmethod + def transform_key(key): # pragma: nocover + return key - def __setitem__(self, key, val): - key = self.transform_key(key) - super(KeyTransformingDict, self).__setitem__(key, val) + def __init__(self, *args, **kargs): + super(KeyTransformingDict, self).__init__() + # build a dictionary using the default constructs + d = dict(*args, **kargs) + # build this dictionary using transformed keys. + for item in d.items(): + self.__setitem__(*item) - def __getitem__(self, key): - key = self.transform_key(key) - return super(KeyTransformingDict, self).__getitem__(key) + def __setitem__(self, key, val): + key = self.transform_key(key) + super(KeyTransformingDict, self).__setitem__(key, val) - def __contains__(self, key): - key = self.transform_key(key) - return super(KeyTransformingDict, self).__contains__(key) + def __getitem__(self, key): + key = self.transform_key(key) + return super(KeyTransformingDict, self).__getitem__(key) - def __delitem__(self, key): - key = self.transform_key(key) - return super(KeyTransformingDict, self).__delitem__(key) + def __contains__(self, key): + key = self.transform_key(key) + return super(KeyTransformingDict, self).__contains__(key) - def get(self, key, *args, **kwargs): - key = self.transform_key(key) - return super(KeyTransformingDict, self).get(key, *args, **kwargs) + def __delitem__(self, key): + key = self.transform_key(key) + return super(KeyTransformingDict, self).__delitem__(key) - def setdefault(self, key, *args, **kwargs): - key = self.transform_key(key) - return super(KeyTransformingDict, self).setdefault(key, *args, **kwargs) + def get(self, key, *args, **kwargs): + key = self.transform_key(key) + return super(KeyTransformingDict, self).get(key, *args, **kwargs) - def pop(self, key, *args, **kwargs): - key = self.transform_key(key) - return super(KeyTransformingDict, self).pop(key, *args, **kwargs) + def setdefault(self, key, *args, **kwargs): + key = self.transform_key(key) + return super(KeyTransformingDict, self).setdefault(key, *args, **kwargs) - def matching_key_for(self, key): - """ - Given a key, return the actual key stored in self that matches. - Raise KeyError if the key isn't found. - """ - try: - return next(e_key for e_key in self.keys() if e_key == key) - except StopIteration: - raise KeyError(key) + def pop(self, key, *args, **kwargs): + key = self.transform_key(key) + return super(KeyTransformingDict, self).pop(key, *args, **kwargs) + + def matching_key_for(self, key): + """ + Given a key, return the actual key stored in self that matches. + Raise KeyError if the key isn't found. + """ + try: + return next(e_key for e_key in self.keys() if e_key == key) + except StopIteration: + raise KeyError(key) class FoldedCaseKeyedDict(KeyTransformingDict): - """ - A case-insensitive dictionary (keys are compared as insensitive - if they are strings). + """ + A case-insensitive dictionary (keys are compared as insensitive + if they are strings). - >>> d = FoldedCaseKeyedDict() - >>> d['heLlo'] = 'world' - >>> list(d.keys()) == ['heLlo'] - True - >>> list(d.values()) == ['world'] - True - >>> d['hello'] == 'world' - True - >>> 'hello' in d - True - >>> 'HELLO' in d - True - >>> print(repr(FoldedCaseKeyedDict({'heLlo': 'world'})).replace("u'", "'")) - {'heLlo': 'world'} - >>> d = FoldedCaseKeyedDict({'heLlo': 'world'}) - >>> print(d['hello']) - world - >>> print(d['Hello']) - world - >>> list(d.keys()) - ['heLlo'] - >>> d = FoldedCaseKeyedDict({'heLlo': 'world', 'Hello': 'world'}) - >>> list(d.values()) - ['world'] - >>> key, = d.keys() - >>> key in ['heLlo', 'Hello'] - True - >>> del d['HELLO'] - >>> d - {} + >>> d = FoldedCaseKeyedDict() + >>> d['heLlo'] = 'world' + >>> list(d.keys()) == ['heLlo'] + True + >>> list(d.values()) == ['world'] + True + >>> d['hello'] == 'world' + True + >>> 'hello' in d + True + >>> 'HELLO' in d + True + >>> print(repr(FoldedCaseKeyedDict({'heLlo': 'world'}))) + {'heLlo': 'world'} + >>> d = FoldedCaseKeyedDict({'heLlo': 'world'}) + >>> print(d['hello']) + world + >>> print(d['Hello']) + world + >>> list(d.keys()) + ['heLlo'] + >>> d = FoldedCaseKeyedDict({'heLlo': 'world', 'Hello': 'world'}) + >>> list(d.values()) + ['world'] + >>> key, = d.keys() + >>> key in ['heLlo', 'Hello'] + True + >>> del d['HELLO'] + >>> d + {} - get should work + get should work - >>> d['Sumthin'] = 'else' - >>> d.get('SUMTHIN') - 'else' - >>> d.get('OTHER', 'thing') - 'thing' - >>> del d['sumthin'] + >>> d['Sumthin'] = 'else' + >>> d.get('SUMTHIN') + 'else' + >>> d.get('OTHER', 'thing') + 'thing' + >>> del d['sumthin'] - setdefault should also work + setdefault should also work - >>> d['This'] = 'that' - >>> print(d.setdefault('this', 'other')) - that - >>> len(d) - 1 - >>> print(d['this']) - that - >>> print(d.setdefault('That', 'other')) - other - >>> print(d['THAT']) - other + >>> d['This'] = 'that' + >>> print(d.setdefault('this', 'other')) + that + >>> len(d) + 1 + >>> print(d['this']) + that + >>> print(d.setdefault('That', 'other')) + other + >>> print(d['THAT']) + other - Make it pop! + Make it pop! - >>> print(d.pop('THAT')) - other + >>> print(d.pop('THAT')) + other - To retrieve the key in its originally-supplied form, use matching_key_for + To retrieve the key in its originally-supplied form, use matching_key_for - >>> print(d.matching_key_for('this')) - This - """ - @staticmethod - def transform_key(key): - return jaraco.text.FoldedCase(key) + >>> print(d.matching_key_for('this')) + This + + >>> d.matching_key_for('missing') + Traceback (most recent call last): + ... + KeyError: 'missing' + """ + + @staticmethod + def transform_key(key): + return jaraco.text.FoldedCase(key) -class DictAdapter(object): - """ - Provide a getitem interface for attributes of an object. +class DictAdapter: + """ + Provide a getitem interface for attributes of an object. - Let's say you want to get at the string.lowercase property in a formatted - string. It's easy with DictAdapter. + Let's say you want to get at the string.lowercase property in a formatted + string. It's easy with DictAdapter. - >>> import string - >>> print("lowercase is %(ascii_lowercase)s" % DictAdapter(string)) - lowercase is abcdefghijklmnopqrstuvwxyz - """ - def __init__(self, wrapped_ob): - self.object = wrapped_ob + >>> import string + >>> print("lowercase is %(ascii_lowercase)s" % DictAdapter(string)) + lowercase is abcdefghijklmnopqrstuvwxyz + """ - def __getitem__(self, name): - return getattr(self.object, name) + def __init__(self, wrapped_ob): + self.object = wrapped_ob + + def __getitem__(self, name): + return getattr(self.object, name) -class ItemsAsAttributes(object): - """ - Mix-in class to enable a mapping object to provide items as - attributes. +class ItemsAsAttributes: + """ + Mix-in class to enable a mapping object to provide items as + attributes. - >>> C = type(str('C'), (dict, ItemsAsAttributes), dict()) - >>> i = C() - >>> i['foo'] = 'bar' - >>> i.foo - 'bar' + >>> C = type(str('C'), (dict, ItemsAsAttributes), dict()) + >>> i = C() + >>> i['foo'] = 'bar' + >>> i.foo + 'bar' - Natural attribute access takes precedence + Natural attribute access takes precedence - >>> i.foo = 'henry' - >>> i.foo - 'henry' + >>> i.foo = 'henry' + >>> i.foo + 'henry' - But as you might expect, the mapping functionality is preserved. + But as you might expect, the mapping functionality is preserved. - >>> i['foo'] - 'bar' + >>> i['foo'] + 'bar' - A normal attribute error should be raised if an attribute is - requested that doesn't exist. + A normal attribute error should be raised if an attribute is + requested that doesn't exist. - >>> i.missing - Traceback (most recent call last): - ... - AttributeError: 'C' object has no attribute 'missing' + >>> i.missing + Traceback (most recent call last): + ... + AttributeError: 'C' object has no attribute 'missing' - It also works on dicts that customize __getitem__ + It also works on dicts that customize __getitem__ - >>> missing_func = lambda self, key: 'missing item' - >>> C = type( - ... str('C'), - ... (dict, ItemsAsAttributes), - ... dict(__missing__ = missing_func), - ... ) - >>> i = C() - >>> i.missing - 'missing item' - >>> i.foo - 'missing item' - """ - def __getattr__(self, key): - try: - return getattr(super(ItemsAsAttributes, self), key) - except AttributeError as e: - # attempt to get the value from the mapping (return self[key]) - # but be careful not to lose the original exception context. - noval = object() + >>> missing_func = lambda self, key: 'missing item' + >>> C = type( + ... str('C'), + ... (dict, ItemsAsAttributes), + ... dict(__missing__ = missing_func), + ... ) + >>> i = C() + >>> i.missing + 'missing item' + >>> i.foo + 'missing item' + """ - def _safe_getitem(cont, key, missing_result): - try: - return cont[key] - except KeyError: - return missing_result - result = _safe_getitem(self, key, noval) - if result is not noval: - return result - # raise the original exception, but use the original class - # name, not 'super'. - message, = e.args - message = message.replace('super', self.__class__.__name__, 1) - e.args = message, - raise + def __getattr__(self, key): + try: + return getattr(super(ItemsAsAttributes, self), key) + except AttributeError as e: + # attempt to get the value from the mapping (return self[key]) + # but be careful not to lose the original exception context. + noval = object() + + def _safe_getitem(cont, key, missing_result): + try: + return cont[key] + except KeyError: + return missing_result + + result = _safe_getitem(self, key, noval) + if result is not noval: + return result + # raise the original exception, but use the original class + # name, not 'super'. + (message,) = e.args + message = message.replace('super', self.__class__.__name__, 1) + e.args = (message,) + raise def invert_map(map): - """ - Given a dictionary, return another dictionary with keys and values - switched. If any of the values resolve to the same key, raises - a ValueError. + """ + Given a dictionary, return another dictionary with keys and values + switched. If any of the values resolve to the same key, raises + a ValueError. - >>> numbers = dict(a=1, b=2, c=3) - >>> letters = invert_map(numbers) - >>> letters[1] - 'a' - >>> numbers['d'] = 3 - >>> invert_map(numbers) - Traceback (most recent call last): - ... - ValueError: Key conflict in inverted mapping - """ - res = dict((v, k) for k, v in map.items()) - if not len(res) == len(map): - raise ValueError('Key conflict in inverted mapping') - return res + >>> numbers = dict(a=1, b=2, c=3) + >>> letters = invert_map(numbers) + >>> letters[1] + 'a' + >>> numbers['d'] = 3 + >>> invert_map(numbers) + Traceback (most recent call last): + ... + ValueError: Key conflict in inverted mapping + """ + res = dict((v, k) for k, v in map.items()) + if not len(res) == len(map): + raise ValueError('Key conflict in inverted mapping') + return res class IdentityOverrideMap(dict): - """ - A dictionary that by default maps each key to itself, but otherwise - acts like a normal dictionary. + """ + A dictionary that by default maps each key to itself, but otherwise + acts like a normal dictionary. - >>> d = IdentityOverrideMap() - >>> d[42] - 42 - >>> d['speed'] = 'speedo' - >>> print(d['speed']) - speedo - """ + >>> d = IdentityOverrideMap() + >>> d[42] + 42 + >>> d['speed'] = 'speedo' + >>> print(d['speed']) + speedo + """ - def __missing__(self, key): - return key + def __missing__(self, key): + return key -class DictStack(list, collections.abc.Mapping): - """ - A stack of dictionaries that behaves as a view on those dictionaries, - giving preference to the last. +class DictStack(list, collections.abc.MutableMapping): + """ + A stack of dictionaries that behaves as a view on those dictionaries, + giving preference to the last. - >>> stack = DictStack([dict(a=1, c=2), dict(b=2, a=2)]) - >>> stack['a'] - 2 - >>> stack['b'] - 2 - >>> stack['c'] - 2 - >>> stack.push(dict(a=3)) - >>> stack['a'] - 3 - >>> set(stack.keys()) == set(['a', 'b', 'c']) - True - >>> d = stack.pop() - >>> stack['a'] - 2 - >>> d = stack.pop() - >>> stack['a'] - 1 - >>> stack.get('b', None) - """ + >>> stack = DictStack([dict(a=1, c=2), dict(b=2, a=2)]) + >>> stack['a'] + 2 + >>> stack['b'] + 2 + >>> stack['c'] + 2 + >>> len(stack) + 3 + >>> stack.push(dict(a=3)) + >>> stack['a'] + 3 + >>> stack['a'] = 4 + >>> set(stack.keys()) == set(['a', 'b', 'c']) + True + >>> set(stack.items()) == set([('a', 4), ('b', 2), ('c', 2)]) + True + >>> dict(**stack) == dict(stack) == dict(a=4, c=2, b=2) + True + >>> d = stack.pop() + >>> stack['a'] + 2 + >>> d = stack.pop() + >>> stack['a'] + 1 + >>> stack.get('b', None) + >>> 'c' in stack + True + >>> del stack['c'] + >>> dict(stack) + {'a': 1} + """ - def keys(self): - return list(set(itertools.chain.from_iterable(c.keys() for c in self))) + def __iter__(self): + dicts = list.__iter__(self) + return iter(set(itertools.chain.from_iterable(c.keys() for c in dicts))) - def __getitem__(self, key): - for scope in reversed(self): - if key in scope: - return scope[key] - raise KeyError(key) + def __getitem__(self, key): + for scope in reversed(tuple(list.__iter__(self))): + if key in scope: + return scope[key] + raise KeyError(key) - push = list.append + push = list.append + + def __contains__(self, other): + return collections.abc.Mapping.__contains__(self, other) + + def __len__(self): + return len(list(iter(self))) + + def __setitem__(self, key, item): + last = list.__getitem__(self, -1) + return last.__setitem__(key, item) + + def __delitem__(self, key): + last = list.__getitem__(self, -1) + return last.__delitem__(key) + + # workaround for mypy confusion + def pop(self, *args, **kwargs): + return list.pop(self, *args, **kwargs) class BijectiveMap(dict): - """ - A Bijective Map (two-way mapping). + """ + A Bijective Map (two-way mapping). - Implemented as a simple dictionary of 2x the size, mapping values back - to keys. + Implemented as a simple dictionary of 2x the size, mapping values back + to keys. - Note, this implementation may be incomplete. If there's not a test for - your use case below, it's likely to fail, so please test and send pull - requests or patches for additional functionality needed. + Note, this implementation may be incomplete. If there's not a test for + your use case below, it's likely to fail, so please test and send pull + requests or patches for additional functionality needed. - >>> m = BijectiveMap() - >>> m['a'] = 'b' - >>> m == {'a': 'b', 'b': 'a'} - True - >>> print(m['b']) - a + >>> m = BijectiveMap() + >>> m['a'] = 'b' + >>> m == {'a': 'b', 'b': 'a'} + True + >>> print(m['b']) + a - >>> m['c'] = 'd' - >>> len(m) - 2 + >>> m['c'] = 'd' + >>> len(m) + 2 - Some weird things happen if you map an item to itself or overwrite a - single key of a pair, so it's disallowed. + Some weird things happen if you map an item to itself or overwrite a + single key of a pair, so it's disallowed. - >>> m['e'] = 'e' - Traceback (most recent call last): - ValueError: Key cannot map to itself + >>> m['e'] = 'e' + Traceback (most recent call last): + ValueError: Key cannot map to itself - >>> m['d'] = 'e' - Traceback (most recent call last): - ValueError: Key/Value pairs may not overlap + >>> m['d'] = 'e' + Traceback (most recent call last): + ValueError: Key/Value pairs may not overlap - >>> m['e'] = 'd' - Traceback (most recent call last): - ValueError: Key/Value pairs may not overlap + >>> m['e'] = 'd' + Traceback (most recent call last): + ValueError: Key/Value pairs may not overlap - >>> print(m.pop('d')) - c + >>> print(m.pop('d')) + c - >>> 'c' in m - False + >>> 'c' in m + False - >>> m = BijectiveMap(dict(a='b')) - >>> len(m) - 1 - >>> print(m['b']) - a + >>> m = BijectiveMap(dict(a='b')) + >>> len(m) + 1 + >>> print(m['b']) + a - >>> m = BijectiveMap() - >>> m.update(a='b') - >>> m['b'] - 'a' + >>> m = BijectiveMap() + >>> m.update(a='b') + >>> m['b'] + 'a' - >>> del m['b'] - >>> len(m) - 0 - >>> 'a' in m - False - """ - def __init__(self, *args, **kwargs): - super(BijectiveMap, self).__init__() - self.update(*args, **kwargs) + >>> del m['b'] + >>> len(m) + 0 + >>> 'a' in m + False + """ - def __setitem__(self, item, value): - if item == value: - raise ValueError("Key cannot map to itself") - overlap = ( - item in self and self[item] != value - or - value in self and self[value] != item - ) - if overlap: - raise ValueError("Key/Value pairs may not overlap") - super(BijectiveMap, self).__setitem__(item, value) - super(BijectiveMap, self).__setitem__(value, item) + def __init__(self, *args, **kwargs): + super(BijectiveMap, self).__init__() + self.update(*args, **kwargs) - def __delitem__(self, item): - self.pop(item) + def __setitem__(self, item, value): + if item == value: + raise ValueError("Key cannot map to itself") + overlap = ( + item in self + and self[item] != value + or value in self + and self[value] != item + ) + if overlap: + raise ValueError("Key/Value pairs may not overlap") + super(BijectiveMap, self).__setitem__(item, value) + super(BijectiveMap, self).__setitem__(value, item) - def __len__(self): - return super(BijectiveMap, self).__len__() // 2 + def __delitem__(self, item): + self.pop(item) - def pop(self, key, *args, **kwargs): - mirror = self[key] - super(BijectiveMap, self).__delitem__(mirror) - return super(BijectiveMap, self).pop(key, *args, **kwargs) + def __len__(self): + return super(BijectiveMap, self).__len__() // 2 - def update(self, *args, **kwargs): - # build a dictionary using the default constructs - d = dict(*args, **kwargs) - # build this dictionary using transformed keys. - for item in d.items(): - self.__setitem__(*item) + def pop(self, key, *args, **kwargs): + mirror = self[key] + super(BijectiveMap, self).__delitem__(mirror) + return super(BijectiveMap, self).pop(key, *args, **kwargs) + + def update(self, *args, **kwargs): + # build a dictionary using the default constructs + d = dict(*args, **kwargs) + # build this dictionary using transformed keys. + for item in d.items(): + self.__setitem__(*item) class FrozenDict(collections.abc.Mapping, collections.abc.Hashable): - """ - An immutable mapping. + """ + An immutable mapping. - >>> a = FrozenDict(a=1, b=2) - >>> b = FrozenDict(a=1, b=2) - >>> a == b - True + >>> a = FrozenDict(a=1, b=2) + >>> b = FrozenDict(a=1, b=2) + >>> a == b + True - >>> a == dict(a=1, b=2) - True - >>> dict(a=1, b=2) == a - True + >>> a == dict(a=1, b=2) + True + >>> dict(a=1, b=2) == a + True + >>> 'a' in a + True + >>> type(hash(a)) is type(0) + True + >>> set(iter(a)) == {'a', 'b'} + True + >>> len(a) + 2 + >>> a['a'] == a.get('a') == 1 + True - >>> a['c'] = 3 - Traceback (most recent call last): - ... - TypeError: 'FrozenDict' object does not support item assignment + >>> a['c'] = 3 + Traceback (most recent call last): + ... + TypeError: 'FrozenDict' object does not support item assignment - >>> a.update(y=3) - Traceback (most recent call last): - ... - AttributeError: 'FrozenDict' object has no attribute 'update' + >>> a.update(y=3) + Traceback (most recent call last): + ... + AttributeError: 'FrozenDict' object has no attribute 'update' - Copies should compare equal + Copies should compare equal - >>> copy.copy(a) == a - True + >>> copy.copy(a) == a + True - Copies should be the same type + Copies should be the same type - >>> isinstance(copy.copy(a), FrozenDict) - True + >>> isinstance(copy.copy(a), FrozenDict) + True - FrozenDict supplies .copy(), even though - collections.abc.Mapping doesn't demand it. + FrozenDict supplies .copy(), even though + collections.abc.Mapping doesn't demand it. - >>> a.copy() == a - True - >>> a.copy() is not a - True - """ - __slots__ = ['__data'] + >>> a.copy() == a + True + >>> a.copy() is not a + True + """ - def __new__(cls, *args, **kwargs): - self = super(FrozenDict, cls).__new__(cls) - self.__data = dict(*args, **kwargs) - return self + __slots__ = ['__data'] - # Container - def __contains__(self, key): - return key in self.__data + def __new__(cls, *args, **kwargs): + self = super(FrozenDict, cls).__new__(cls) + self.__data = dict(*args, **kwargs) + return self - # Hashable - def __hash__(self): - return hash(tuple(sorted(self.__data.iteritems()))) + # Container + def __contains__(self, key): + return key in self.__data - # Mapping - def __iter__(self): - return iter(self.__data) + # Hashable + def __hash__(self): + return hash(tuple(sorted(self.__data.items()))) - def __len__(self): - return len(self.__data) + # Mapping + def __iter__(self): + return iter(self.__data) - def __getitem__(self, key): - return self.__data[key] + def __len__(self): + return len(self.__data) - # override get for efficiency provided by dict - def get(self, *args, **kwargs): - return self.__data.get(*args, **kwargs) + def __getitem__(self, key): + return self.__data[key] - # override eq to recognize underlying implementation - def __eq__(self, other): - if isinstance(other, FrozenDict): - other = other.__data - return self.__data.__eq__(other) + # override get for efficiency provided by dict + def get(self, *args, **kwargs): + return self.__data.get(*args, **kwargs) - def copy(self): - "Return a shallow copy of self" - return copy.copy(self) + # override eq to recognize underlying implementation + def __eq__(self, other): + if isinstance(other, FrozenDict): + other = other.__data + return self.__data.__eq__(other) + + def copy(self): + "Return a shallow copy of self" + return copy.copy(self) class Enumeration(ItemsAsAttributes, BijectiveMap): - """ - A convenient way to provide enumerated values + """ + A convenient way to provide enumerated values - >>> e = Enumeration('a b c') - >>> e['a'] - 0 + >>> e = Enumeration('a b c') + >>> e['a'] + 0 - >>> e.a - 0 + >>> e.a + 0 - >>> e[1] - 'b' + >>> e[1] + 'b' - >>> set(e.names) == set('abc') - True + >>> set(e.names) == set('abc') + True - >>> set(e.codes) == set(range(3)) - True + >>> set(e.codes) == set(range(3)) + True - >>> e.get('d') is None - True + >>> e.get('d') is None + True - Codes need not start with 0 + Codes need not start with 0 - >>> e = Enumeration('a b c', range(1, 4)) - >>> e['a'] - 1 + >>> e = Enumeration('a b c', range(1, 4)) + >>> e['a'] + 1 - >>> e[3] - 'c' - """ - def __init__(self, names, codes=None): - if isinstance(names, six.string_types): - names = names.split() - if codes is None: - codes = itertools.count() - super(Enumeration, self).__init__(zip(names, codes)) + >>> e[3] + 'c' + """ - @property - def names(self): - return (key for key in self if isinstance(key, six.string_types)) + def __init__(self, names, codes=None): + if isinstance(names, str): + names = names.split() + if codes is None: + codes = itertools.count() + super(Enumeration, self).__init__(zip(names, codes)) - @property - def codes(self): - return (self[name] for name in self.names) + @property + def names(self): + return (key for key in self if isinstance(key, str)) + + @property + def codes(self): + return (self[name] for name in self.names) -class Everything(object): - """ - A collection "containing" every possible thing. +class Everything: + """ + A collection "containing" every possible thing. - >>> 'foo' in Everything() - True + >>> 'foo' in Everything() + True - >>> import random - >>> random.randint(1, 999) in Everything() - True + >>> import random + >>> random.randint(1, 999) in Everything() + True - >>> random.choice([None, 'foo', 42, ('a', 'b', 'c')]) in Everything() - True - """ - def __contains__(self, other): - return True + >>> random.choice([None, 'foo', 42, ('a', 'b', 'c')]) in Everything() + True + """ + + def __contains__(self, other): + return True -class InstrumentedDict(six.moves.UserDict): - """ - Instrument an existing dictionary with additional - functionality, but always reference and mutate - the original dictionary. +class InstrumentedDict(collections.UserDict): # type: ignore # buggy mypy + """ + Instrument an existing dictionary with additional + functionality, but always reference and mutate + the original dictionary. - >>> orig = {'a': 1, 'b': 2} - >>> inst = InstrumentedDict(orig) - >>> inst['a'] - 1 - >>> inst['c'] = 3 - >>> orig['c'] - 3 - >>> inst.keys() == orig.keys() - True - """ - def __init__(self, data): - six.moves.UserDict.__init__(self) - self.data = data + >>> orig = {'a': 1, 'b': 2} + >>> inst = InstrumentedDict(orig) + >>> inst['a'] + 1 + >>> inst['c'] = 3 + >>> orig['c'] + 3 + >>> inst.keys() == orig.keys() + True + """ + + def __init__(self, data): + super().__init__() + self.data = data -class Least(object): - """ - A value that is always lesser than any other +class Least: + """ + A value that is always lesser than any other - >>> least = Least() - >>> 3 < least - False - >>> 3 > least - True - >>> least < 3 - True - >>> least <= 3 - True - >>> least > 3 - False - >>> 'x' > least - True - >>> None > least - True - """ + >>> least = Least() + >>> 3 < least + False + >>> 3 > least + True + >>> least < 3 + True + >>> least <= 3 + True + >>> least > 3 + False + >>> 'x' > least + True + >>> None > least + True + """ - def __le__(self, other): - return True - __lt__ = __le__ + def __le__(self, other): + return True - def __ge__(self, other): - return False - __gt__ = __ge__ + __lt__ = __le__ + + def __ge__(self, other): + return False + + __gt__ = __ge__ -class Greatest(object): - """ - A value that is always greater than any other +class Greatest: + """ + A value that is always greater than any other - >>> greatest = Greatest() - >>> 3 < greatest - True - >>> 3 > greatest - False - >>> greatest < 3 - False - >>> greatest > 3 - True - >>> greatest >= 3 - True - >>> 'x' > greatest - False - >>> None > greatest - False - """ + >>> greatest = Greatest() + >>> 3 < greatest + True + >>> 3 > greatest + False + >>> greatest < 3 + False + >>> greatest > 3 + True + >>> greatest >= 3 + True + >>> 'x' > greatest + False + >>> None > greatest + False + """ - def __ge__(self, other): - return True - __gt__ = __ge__ + def __ge__(self, other): + return True - def __le__(self, other): - return False - __lt__ = __le__ + __gt__ = __ge__ + + def __le__(self, other): + return False + + __lt__ = __le__ + + +def pop_all(items): + """ + Clear items in place and return a copy of items. + + >>> items = [1, 2, 3] + >>> popped = pop_all(items) + >>> popped is items + False + >>> popped + [1, 2, 3] + >>> items + [] + """ + result, items[:] = items[:], [] + return result + + +# mypy disabled for pytest-dev/pytest#8332 +class FreezableDefaultDict(collections.defaultdict): # type: ignore + """ + Often it is desirable to prevent the mutation of + a default dict after its initial construction, such + as to prevent mutation during iteration. + + >>> dd = FreezableDefaultDict(list) + >>> dd[0].append('1') + >>> dd.freeze() + >>> dd[1] + [] + >>> len(dd) + 1 + """ + + def __missing__(self, key): + return getattr(self, '_frozen', super().__missing__)(key) + + def freeze(self): + self._frozen = lambda key: self.default_factory() + + +class Accumulator: + def __init__(self, initial=0): + self.val = initial + + def __call__(self, val): + self.val += val + return self.val + + +class WeightedLookup(RangeMap): + """ + Given parameters suitable for a dict representing keys + and a weighted proportion, return a RangeMap representing + spans of values proportial to the weights: + + >>> even = WeightedLookup(a=1, b=1) + + [0, 1) -> a + [1, 2) -> b + + >>> lk = WeightedLookup(a=1, b=2) + + [0, 1) -> a + [1, 3) -> b + + >>> lk[.5] + 'a' + >>> lk[1.5] + 'b' + + Adds ``.random()`` to select a random weighted value: + + >>> lk.random() in ['a', 'b'] + True + + >>> choices = [lk.random() for x in range(1000)] + + Statistically speaking, choices should be .5 a:b + >>> ratio = choices.count('a') / choices.count('b') + >>> .4 < ratio < .6 + True + """ + + def __init__(self, *args, **kwargs): + raw = dict(*args, **kwargs) + + # allocate keys by weight + indexes = map(Accumulator(), raw.values()) + super().__init__(zip(indexes, raw.keys()), key_match_comparator=operator.lt) + + def random(self): + lower, upper = self.bounds() + selector = random.random() * upper + return self[selector] diff --git a/libs/win/jaraco/context.py b/libs/win/jaraco/context.py new file mode 100644 index 00000000..818f16f3 --- /dev/null +++ b/libs/win/jaraco/context.py @@ -0,0 +1,253 @@ +import os +import subprocess +import contextlib +import functools +import tempfile +import shutil +import operator + + +@contextlib.contextmanager +def pushd(dir): + orig = os.getcwd() + os.chdir(dir) + try: + yield dir + finally: + os.chdir(orig) + + +@contextlib.contextmanager +def tarball_context(url, target_dir=None, runner=None, pushd=pushd): + """ + Get a tarball, extract it, change to that directory, yield, then + clean up. + `runner` is the function to invoke commands. + `pushd` is a context manager for changing the directory. + """ + if target_dir is None: + target_dir = os.path.basename(url).replace('.tar.gz', '').replace('.tgz', '') + if runner is None: + runner = functools.partial(subprocess.check_call, shell=True) + # In the tar command, use --strip-components=1 to strip the first path and + # then + # use -C to cause the files to be extracted to {target_dir}. This ensures + # that we always know where the files were extracted. + runner('mkdir {target_dir}'.format(**vars())) + try: + getter = 'wget {url} -O -' + extract = 'tar x{compression} --strip-components=1 -C {target_dir}' + cmd = ' | '.join((getter, extract)) + runner(cmd.format(compression=infer_compression(url), **vars())) + with pushd(target_dir): + yield target_dir + finally: + runner('rm -Rf {target_dir}'.format(**vars())) + + +def infer_compression(url): + """ + Given a URL or filename, infer the compression code for tar. + """ + # cheat and just assume it's the last two characters + compression_indicator = url[-2:] + mapping = dict(gz='z', bz='j', xz='J') + # Assume 'z' (gzip) if no match + return mapping.get(compression_indicator, 'z') + + +@contextlib.contextmanager +def temp_dir(remover=shutil.rmtree): + """ + Create a temporary directory context. Pass a custom remover + to override the removal behavior. + """ + temp_dir = tempfile.mkdtemp() + try: + yield temp_dir + finally: + remover(temp_dir) + + +@contextlib.contextmanager +def repo_context(url, branch=None, quiet=True, dest_ctx=temp_dir): + """ + Check out the repo indicated by url. + + If dest_ctx is supplied, it should be a context manager + to yield the target directory for the check out. + """ + exe = 'git' if 'git' in url else 'hg' + with dest_ctx() as repo_dir: + cmd = [exe, 'clone', url, repo_dir] + if branch: + cmd.extend(['--branch', branch]) + devnull = open(os.path.devnull, 'w') + stdout = devnull if quiet else None + subprocess.check_call(cmd, stdout=stdout) + yield repo_dir + + +@contextlib.contextmanager +def null(): + yield + + +class ExceptionTrap: + """ + A context manager that will catch certain exceptions and provide an + indication they occurred. + + >>> with ExceptionTrap() as trap: + ... raise Exception() + >>> bool(trap) + True + + >>> with ExceptionTrap() as trap: + ... pass + >>> bool(trap) + False + + >>> with ExceptionTrap(ValueError) as trap: + ... raise ValueError("1 + 1 is not 3") + >>> bool(trap) + True + + >>> with ExceptionTrap(ValueError) as trap: + ... raise Exception() + Traceback (most recent call last): + ... + Exception + + >>> bool(trap) + False + """ + + exc_info = None, None, None + + def __init__(self, exceptions=(Exception,)): + self.exceptions = exceptions + + def __enter__(self): + return self + + @property + def type(self): + return self.exc_info[0] + + @property + def value(self): + return self.exc_info[1] + + @property + def tb(self): + return self.exc_info[2] + + def __exit__(self, *exc_info): + type = exc_info[0] + matches = type and issubclass(type, self.exceptions) + if matches: + self.exc_info = exc_info + return matches + + def __bool__(self): + return bool(self.type) + + def raises(self, func, *, _test=bool): + """ + Wrap func and replace the result with the truth + value of the trap (True if an exception occurred). + + First, give the decorator an alias to support Python 3.8 + Syntax. + + >>> raises = ExceptionTrap(ValueError).raises + + Now decorate a function that always fails. + + >>> @raises + ... def fail(): + ... raise ValueError('failed') + >>> fail() + True + """ + + @functools.wraps(func) + def wrapper(*args, **kwargs): + with ExceptionTrap(self.exceptions) as trap: + func(*args, **kwargs) + return _test(trap) + + return wrapper + + def passes(self, func): + """ + Wrap func and replace the result with the truth + value of the trap (True if no exception). + + First, give the decorator an alias to support Python 3.8 + Syntax. + + >>> passes = ExceptionTrap(ValueError).passes + + Now decorate a function that always fails. + + >>> @passes + ... def fail(): + ... raise ValueError('failed') + + >>> fail() + False + """ + return self.raises(func, _test=operator.not_) + + +class suppress(contextlib.suppress, contextlib.ContextDecorator): + """ + A version of contextlib.suppress with decorator support. + + >>> @suppress(KeyError) + ... def key_error(): + ... {}[''] + >>> key_error() + """ + + +class on_interrupt(contextlib.ContextDecorator): + """ + Replace a KeyboardInterrupt with SystemExit(1) + + >>> def do_interrupt(): + ... raise KeyboardInterrupt() + >>> on_interrupt('error')(do_interrupt)() + Traceback (most recent call last): + ... + SystemExit: 1 + >>> on_interrupt('error', code=255)(do_interrupt)() + Traceback (most recent call last): + ... + SystemExit: 255 + >>> on_interrupt('suppress')(do_interrupt)() + >>> with __import__('pytest').raises(KeyboardInterrupt): + ... on_interrupt('ignore')(do_interrupt)() + """ + + def __init__( + self, + action='error', + # py3.7 compat + # /, + code=1, + ): + self.action = action + self.code = code + + def __enter__(self): + return self + + def __exit__(self, exctype, excinst, exctb): + if exctype is not KeyboardInterrupt or self.action == 'ignore': + return + elif self.action == 'error': + raise SystemExit(self.code) from excinst + return self.action == 'suppress' diff --git a/libs/win/jaraco/functools.py b/libs/win/jaraco/functools.py index 134102a7..fcdbb4f9 100644 --- a/libs/win/jaraco/functools.py +++ b/libs/win/jaraco/functools.py @@ -1,459 +1,525 @@ -from __future__ import ( - absolute_import, unicode_literals, print_function, division, -) - import functools import time -import warnings import inspect import collections -from itertools import count +import types +import itertools -__metaclass__ = type +import more_itertools + +from typing import Callable, TypeVar -try: - from functools import lru_cache -except ImportError: - try: - from backports.functools_lru_cache import lru_cache - except ImportError: - try: - from functools32 import lru_cache - except ImportError: - warnings.warn("No lru_cache available") - - -import more_itertools.recipes +CallableT = TypeVar("CallableT", bound=Callable[..., object]) def compose(*funcs): - """ - Compose any number of unary functions into a single unary function. + """ + Compose any number of unary functions into a single unary function. - >>> import textwrap - >>> from six import text_type - >>> stripped = text_type.strip(textwrap.dedent(compose.__doc__)) - >>> compose(text_type.strip, textwrap.dedent)(compose.__doc__) == stripped - True + >>> import textwrap + >>> expected = str.strip(textwrap.dedent(compose.__doc__)) + >>> strip_and_dedent = compose(str.strip, textwrap.dedent) + >>> strip_and_dedent(compose.__doc__) == expected + True - Compose also allows the innermost function to take arbitrary arguments. + Compose also allows the innermost function to take arbitrary arguments. - >>> round_three = lambda x: round(x, ndigits=3) - >>> f = compose(round_three, int.__truediv__) - >>> [f(3*x, x+1) for x in range(1,10)] - [1.5, 2.0, 2.25, 2.4, 2.5, 2.571, 2.625, 2.667, 2.7] - """ + >>> round_three = lambda x: round(x, ndigits=3) + >>> f = compose(round_three, int.__truediv__) + >>> [f(3*x, x+1) for x in range(1,10)] + [1.5, 2.0, 2.25, 2.4, 2.5, 2.571, 2.625, 2.667, 2.7] + """ - def compose_two(f1, f2): - return lambda *args, **kwargs: f1(f2(*args, **kwargs)) - return functools.reduce(compose_two, funcs) + def compose_two(f1, f2): + return lambda *args, **kwargs: f1(f2(*args, **kwargs)) + + return functools.reduce(compose_two, funcs) def method_caller(method_name, *args, **kwargs): - """ - Return a function that will call a named method on the - target object with optional positional and keyword - arguments. + """ + Return a function that will call a named method on the + target object with optional positional and keyword + arguments. - >>> lower = method_caller('lower') - >>> lower('MyString') - 'mystring' - """ - def call_method(target): - func = getattr(target, method_name) - return func(*args, **kwargs) - return call_method + >>> lower = method_caller('lower') + >>> lower('MyString') + 'mystring' + """ + + def call_method(target): + func = getattr(target, method_name) + return func(*args, **kwargs) + + return call_method def once(func): - """ - Decorate func so it's only ever called the first time. + """ + Decorate func so it's only ever called the first time. - This decorator can ensure that an expensive or non-idempotent function - will not be expensive on subsequent calls and is idempotent. + This decorator can ensure that an expensive or non-idempotent function + will not be expensive on subsequent calls and is idempotent. - >>> add_three = once(lambda a: a+3) - >>> add_three(3) - 6 - >>> add_three(9) - 6 - >>> add_three('12') - 6 + >>> add_three = once(lambda a: a+3) + >>> add_three(3) + 6 + >>> add_three(9) + 6 + >>> add_three('12') + 6 - To reset the stored value, simply clear the property ``saved_result``. + To reset the stored value, simply clear the property ``saved_result``. - >>> del add_three.saved_result - >>> add_three(9) - 12 - >>> add_three(8) - 12 + >>> del add_three.saved_result + >>> add_three(9) + 12 + >>> add_three(8) + 12 - Or invoke 'reset()' on it. + Or invoke 'reset()' on it. - >>> add_three.reset() - >>> add_three(-3) - 0 - >>> add_three(0) - 0 - """ - @functools.wraps(func) - def wrapper(*args, **kwargs): - if not hasattr(wrapper, 'saved_result'): - wrapper.saved_result = func(*args, **kwargs) - return wrapper.saved_result - wrapper.reset = lambda: vars(wrapper).__delitem__('saved_result') - return wrapper + >>> add_three.reset() + >>> add_three(-3) + 0 + >>> add_three(0) + 0 + """ + + @functools.wraps(func) + def wrapper(*args, **kwargs): + if not hasattr(wrapper, 'saved_result'): + wrapper.saved_result = func(*args, **kwargs) + return wrapper.saved_result + + wrapper.reset = lambda: vars(wrapper).__delitem__('saved_result') + return wrapper -def method_cache(method, cache_wrapper=None): - """ - Wrap lru_cache to support storing the cache data in the object instances. +def method_cache( + method: CallableT, + cache_wrapper: Callable[ + [CallableT], CallableT + ] = functools.lru_cache(), # type: ignore[assignment] +) -> CallableT: + """ + Wrap lru_cache to support storing the cache data in the object instances. - Abstracts the common paradigm where the method explicitly saves an - underscore-prefixed protected property on first call and returns that - subsequently. + Abstracts the common paradigm where the method explicitly saves an + underscore-prefixed protected property on first call and returns that + subsequently. - >>> class MyClass: - ... calls = 0 - ... - ... @method_cache - ... def method(self, value): - ... self.calls += 1 - ... return value + >>> class MyClass: + ... calls = 0 + ... + ... @method_cache + ... def method(self, value): + ... self.calls += 1 + ... return value - >>> a = MyClass() - >>> a.method(3) - 3 - >>> for x in range(75): - ... res = a.method(x) - >>> a.calls - 75 + >>> a = MyClass() + >>> a.method(3) + 3 + >>> for x in range(75): + ... res = a.method(x) + >>> a.calls + 75 - Note that the apparent behavior will be exactly like that of lru_cache - except that the cache is stored on each instance, so values in one - instance will not flush values from another, and when an instance is - deleted, so are the cached values for that instance. + Note that the apparent behavior will be exactly like that of lru_cache + except that the cache is stored on each instance, so values in one + instance will not flush values from another, and when an instance is + deleted, so are the cached values for that instance. - >>> b = MyClass() - >>> for x in range(35): - ... res = b.method(x) - >>> b.calls - 35 - >>> a.method(0) - 0 - >>> a.calls - 75 + >>> b = MyClass() + >>> for x in range(35): + ... res = b.method(x) + >>> b.calls + 35 + >>> a.method(0) + 0 + >>> a.calls + 75 - Note that if method had been decorated with ``functools.lru_cache()``, - a.calls would have been 76 (due to the cached value of 0 having been - flushed by the 'b' instance). + Note that if method had been decorated with ``functools.lru_cache()``, + a.calls would have been 76 (due to the cached value of 0 having been + flushed by the 'b' instance). - Clear the cache with ``.cache_clear()`` + Clear the cache with ``.cache_clear()`` - >>> a.method.cache_clear() + >>> a.method.cache_clear() - Another cache wrapper may be supplied: + Same for a method that hasn't yet been called. - >>> cache = lru_cache(maxsize=2) - >>> MyClass.method2 = method_cache(lambda self: 3, cache_wrapper=cache) - >>> a = MyClass() - >>> a.method2() - 3 + >>> c = MyClass() + >>> c.method.cache_clear() - Caution - do not subsequently wrap the method with another decorator, such - as ``@property``, which changes the semantics of the function. + Another cache wrapper may be supplied: - See also - http://code.activestate.com/recipes/577452-a-memoize-decorator-for-instance-methods/ - for another implementation and additional justification. - """ - cache_wrapper = cache_wrapper or lru_cache() + >>> cache = functools.lru_cache(maxsize=2) + >>> MyClass.method2 = method_cache(lambda self: 3, cache_wrapper=cache) + >>> a = MyClass() + >>> a.method2() + 3 - def wrapper(self, *args, **kwargs): - # it's the first call, replace the method with a cached, bound method - bound_method = functools.partial(method, self) - cached_method = cache_wrapper(bound_method) - setattr(self, method.__name__, cached_method) - return cached_method(*args, **kwargs) + Caution - do not subsequently wrap the method with another decorator, such + as ``@property``, which changes the semantics of the function. - return _special_method_cache(method, cache_wrapper) or wrapper + See also + http://code.activestate.com/recipes/577452-a-memoize-decorator-for-instance-methods/ + for another implementation and additional justification. + """ + + def wrapper(self: object, *args: object, **kwargs: object) -> object: + # it's the first call, replace the method with a cached, bound method + bound_method: CallableT = types.MethodType( # type: ignore[assignment] + method, self + ) + cached_method = cache_wrapper(bound_method) + setattr(self, method.__name__, cached_method) + return cached_method(*args, **kwargs) + + # Support cache clear even before cache has been created. + wrapper.cache_clear = lambda: None # type: ignore[attr-defined] + + return ( # type: ignore[return-value] + _special_method_cache(method, cache_wrapper) or wrapper + ) def _special_method_cache(method, cache_wrapper): - """ - Because Python treats special methods differently, it's not - possible to use instance attributes to implement the cached - methods. + """ + Because Python treats special methods differently, it's not + possible to use instance attributes to implement the cached + methods. - Instead, install the wrapper method under a different name - and return a simple proxy to that wrapper. + Instead, install the wrapper method under a different name + and return a simple proxy to that wrapper. - https://github.com/jaraco/jaraco.functools/issues/5 - """ - name = method.__name__ - special_names = '__getattr__', '__getitem__' - if name not in special_names: - return + https://github.com/jaraco/jaraco.functools/issues/5 + """ + name = method.__name__ + special_names = '__getattr__', '__getitem__' + if name not in special_names: + return - wrapper_name = '__cached' + name + wrapper_name = '__cached' + name - def proxy(self, *args, **kwargs): - if wrapper_name not in vars(self): - bound = functools.partial(method, self) - cache = cache_wrapper(bound) - setattr(self, wrapper_name, cache) - else: - cache = getattr(self, wrapper_name) - return cache(*args, **kwargs) + def proxy(self, *args, **kwargs): + if wrapper_name not in vars(self): + bound = types.MethodType(method, self) + cache = cache_wrapper(bound) + setattr(self, wrapper_name, cache) + else: + cache = getattr(self, wrapper_name) + return cache(*args, **kwargs) - return proxy + return proxy def apply(transform): - """ - Decorate a function with a transform function that is - invoked on results returned from the decorated function. + """ + Decorate a function with a transform function that is + invoked on results returned from the decorated function. - >>> @apply(reversed) - ... def get_numbers(start): - ... return range(start, start+3) - >>> list(get_numbers(4)) - [6, 5, 4] - """ - def wrap(func): - return compose(transform, func) - return wrap + >>> @apply(reversed) + ... def get_numbers(start): + ... "doc for get_numbers" + ... return range(start, start+3) + >>> list(get_numbers(4)) + [6, 5, 4] + >>> get_numbers.__doc__ + 'doc for get_numbers' + """ + + def wrap(func): + return functools.wraps(func)(compose(transform, func)) + + return wrap def result_invoke(action): - r""" - Decorate a function with an action function that is - invoked on the results returned from the decorated - function (for its side-effect), then return the original - result. + r""" + Decorate a function with an action function that is + invoked on the results returned from the decorated + function (for its side-effect), then return the original + result. - >>> @result_invoke(print) - ... def add_two(a, b): - ... return a + b - >>> x = add_two(2, 3) - 5 - """ - def wrap(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - result = func(*args, **kwargs) - action(result) - return result - return wrapper - return wrap + >>> @result_invoke(print) + ... def add_two(a, b): + ... return a + b + >>> x = add_two(2, 3) + 5 + >>> x + 5 + """ + + def wrap(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + result = func(*args, **kwargs) + action(result) + return result + + return wrapper + + return wrap def call_aside(f, *args, **kwargs): - """ - Call a function for its side effect after initialization. + """ + Call a function for its side effect after initialization. - >>> @call_aside - ... def func(): print("called") - called - >>> func() - called + >>> @call_aside + ... def func(): print("called") + called + >>> func() + called - Use functools.partial to pass parameters to the initial call + Use functools.partial to pass parameters to the initial call - >>> @functools.partial(call_aside, name='bingo') - ... def func(name): print("called with", name) - called with bingo - """ - f(*args, **kwargs) - return f + >>> @functools.partial(call_aside, name='bingo') + ... def func(name): print("called with", name) + called with bingo + """ + f(*args, **kwargs) + return f class Throttler: - """ - Rate-limit a function (or other callable) - """ - def __init__(self, func, max_rate=float('Inf')): - if isinstance(func, Throttler): - func = func.func - self.func = func - self.max_rate = max_rate - self.reset() + """ + Rate-limit a function (or other callable) + """ - def reset(self): - self.last_called = 0 + def __init__(self, func, max_rate=float('Inf')): + if isinstance(func, Throttler): + func = func.func + self.func = func + self.max_rate = max_rate + self.reset() - def __call__(self, *args, **kwargs): - self._wait() - return self.func(*args, **kwargs) + def reset(self): + self.last_called = 0 - def _wait(self): - "ensure at least 1/max_rate seconds from last call" - elapsed = time.time() - self.last_called - must_wait = 1 / self.max_rate - elapsed - time.sleep(max(0, must_wait)) - self.last_called = time.time() + def __call__(self, *args, **kwargs): + self._wait() + return self.func(*args, **kwargs) - def __get__(self, obj, type=None): - return first_invoke(self._wait, functools.partial(self.func, obj)) + def _wait(self): + "ensure at least 1/max_rate seconds from last call" + elapsed = time.time() - self.last_called + must_wait = 1 / self.max_rate - elapsed + time.sleep(max(0, must_wait)) + self.last_called = time.time() + + def __get__(self, obj, type=None): + return first_invoke(self._wait, functools.partial(self.func, obj)) def first_invoke(func1, func2): - """ - Return a function that when invoked will invoke func1 without - any parameters (for its side-effect) and then invoke func2 - with whatever parameters were passed, returning its result. - """ - def wrapper(*args, **kwargs): - func1() - return func2(*args, **kwargs) - return wrapper + """ + Return a function that when invoked will invoke func1 without + any parameters (for its side-effect) and then invoke func2 + with whatever parameters were passed, returning its result. + """ + + def wrapper(*args, **kwargs): + func1() + return func2(*args, **kwargs) + + return wrapper def retry_call(func, cleanup=lambda: None, retries=0, trap=()): - """ - Given a callable func, trap the indicated exceptions - for up to 'retries' times, invoking cleanup on the - exception. On the final attempt, allow any exceptions - to propagate. - """ - attempts = count() if retries == float('inf') else range(retries) - for attempt in attempts: - try: - return func() - except trap: - cleanup() + """ + Given a callable func, trap the indicated exceptions + for up to 'retries' times, invoking cleanup on the + exception. On the final attempt, allow any exceptions + to propagate. + """ + attempts = itertools.count() if retries == float('inf') else range(retries) + for attempt in attempts: + try: + return func() + except trap: + cleanup() - return func() + return func() def retry(*r_args, **r_kwargs): - """ - Decorator wrapper for retry_call. Accepts arguments to retry_call - except func and then returns a decorator for the decorated function. + """ + Decorator wrapper for retry_call. Accepts arguments to retry_call + except func and then returns a decorator for the decorated function. - Ex: + Ex: - >>> @retry(retries=3) - ... def my_func(a, b): - ... "this is my funk" - ... print(a, b) - >>> my_func.__doc__ - 'this is my funk' - """ - def decorate(func): - @functools.wraps(func) - def wrapper(*f_args, **f_kwargs): - bound = functools.partial(func, *f_args, **f_kwargs) - return retry_call(bound, *r_args, **r_kwargs) - return wrapper - return decorate + >>> @retry(retries=3) + ... def my_func(a, b): + ... "this is my funk" + ... print(a, b) + >>> my_func.__doc__ + 'this is my funk' + """ + + def decorate(func): + @functools.wraps(func) + def wrapper(*f_args, **f_kwargs): + bound = functools.partial(func, *f_args, **f_kwargs) + return retry_call(bound, *r_args, **r_kwargs) + + return wrapper + + return decorate def print_yielded(func): - """ - Convert a generator into a function that prints all yielded elements + """ + Convert a generator into a function that prints all yielded elements - >>> @print_yielded - ... def x(): - ... yield 3; yield None - >>> x() - 3 - None - """ - print_all = functools.partial(map, print) - print_results = compose(more_itertools.recipes.consume, print_all, func) - return functools.wraps(func)(print_results) + >>> @print_yielded + ... def x(): + ... yield 3; yield None + >>> x() + 3 + None + """ + print_all = functools.partial(map, print) + print_results = compose(more_itertools.consume, print_all, func) + return functools.wraps(func)(print_results) def pass_none(func): - """ - Wrap func so it's not called if its first param is None + """ + Wrap func so it's not called if its first param is None - >>> print_text = pass_none(print) - >>> print_text('text') - text - >>> print_text(None) - """ - @functools.wraps(func) - def wrapper(param, *args, **kwargs): - if param is not None: - return func(param, *args, **kwargs) - return wrapper + >>> print_text = pass_none(print) + >>> print_text('text') + text + >>> print_text(None) + """ + + @functools.wraps(func) + def wrapper(param, *args, **kwargs): + if param is not None: + return func(param, *args, **kwargs) + + return wrapper def assign_params(func, namespace): - """ - Assign parameters from namespace where func solicits. + """ + Assign parameters from namespace where func solicits. - >>> def func(x, y=3): - ... print(x, y) - >>> assigned = assign_params(func, dict(x=2, z=4)) - >>> assigned() - 2 3 + >>> def func(x, y=3): + ... print(x, y) + >>> assigned = assign_params(func, dict(x=2, z=4)) + >>> assigned() + 2 3 - The usual errors are raised if a function doesn't receive - its required parameters: + The usual errors are raised if a function doesn't receive + its required parameters: - >>> assigned = assign_params(func, dict(y=3, z=4)) - >>> assigned() - Traceback (most recent call last): - TypeError: func() ...argument... - """ - try: - sig = inspect.signature(func) - params = sig.parameters.keys() - except AttributeError: - spec = inspect.getargspec(func) - params = spec.args - call_ns = { - k: namespace[k] - for k in params - if k in namespace - } - return functools.partial(func, **call_ns) + >>> assigned = assign_params(func, dict(y=3, z=4)) + >>> assigned() + Traceback (most recent call last): + TypeError: func() ...argument... + + It even works on methods: + + >>> class Handler: + ... def meth(self, arg): + ... print(arg) + >>> assign_params(Handler().meth, dict(arg='crystal', foo='clear'))() + crystal + """ + sig = inspect.signature(func) + params = sig.parameters.keys() + call_ns = {k: namespace[k] for k in params if k in namespace} + return functools.partial(func, **call_ns) def save_method_args(method): - """ - Wrap a method such that when it is called, the args and kwargs are - saved on the method. + """ + Wrap a method such that when it is called, the args and kwargs are + saved on the method. - >>> class MyClass: - ... @save_method_args - ... def method(self, a, b): - ... print(a, b) - >>> my_ob = MyClass() - >>> my_ob.method(1, 2) - 1 2 - >>> my_ob._saved_method.args - (1, 2) - >>> my_ob._saved_method.kwargs - {} - >>> my_ob.method(a=3, b='foo') - 3 foo - >>> my_ob._saved_method.args - () - >>> my_ob._saved_method.kwargs == dict(a=3, b='foo') - True + >>> class MyClass: + ... @save_method_args + ... def method(self, a, b): + ... print(a, b) + >>> my_ob = MyClass() + >>> my_ob.method(1, 2) + 1 2 + >>> my_ob._saved_method.args + (1, 2) + >>> my_ob._saved_method.kwargs + {} + >>> my_ob.method(a=3, b='foo') + 3 foo + >>> my_ob._saved_method.args + () + >>> my_ob._saved_method.kwargs == dict(a=3, b='foo') + True - The arguments are stored on the instance, allowing for - different instance to save different args. + The arguments are stored on the instance, allowing for + different instance to save different args. - >>> your_ob = MyClass() - >>> your_ob.method({str('x'): 3}, b=[4]) - {'x': 3} [4] - >>> your_ob._saved_method.args - ({'x': 3},) - >>> my_ob._saved_method.args - () - """ - args_and_kwargs = collections.namedtuple('args_and_kwargs', 'args kwargs') + >>> your_ob = MyClass() + >>> your_ob.method({str('x'): 3}, b=[4]) + {'x': 3} [4] + >>> your_ob._saved_method.args + ({'x': 3},) + >>> my_ob._saved_method.args + () + """ + args_and_kwargs = collections.namedtuple('args_and_kwargs', 'args kwargs') - @functools.wraps(method) - def wrapper(self, *args, **kwargs): - attr_name = '_saved_' + method.__name__ - attr = args_and_kwargs(args, kwargs) - setattr(self, attr_name, attr) - return method(self, *args, **kwargs) - return wrapper + @functools.wraps(method) + def wrapper(self, *args, **kwargs): + attr_name = '_saved_' + method.__name__ + attr = args_and_kwargs(args, kwargs) + setattr(self, attr_name, attr) + return method(self, *args, **kwargs) + + return wrapper + + +def except_(*exceptions, replace=None, use=None): + """ + Replace the indicated exceptions, if raised, with the indicated + literal replacement or evaluated expression (if present). + + >>> safe_int = except_(ValueError)(int) + >>> safe_int('five') + >>> safe_int('5') + 5 + + Specify a literal replacement with ``replace``. + + >>> safe_int_r = except_(ValueError, replace=0)(int) + >>> safe_int_r('five') + 0 + + Provide an expression to ``use`` to pass through particular parameters. + + >>> safe_int_pt = except_(ValueError, use='args[0]')(int) + >>> safe_int_pt('five') + 'five' + + """ + + def decorate(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except exceptions: + try: + return eval(use) + except TypeError: + return replace + + return wrapper + + return decorate diff --git a/libs/win/jaraco/structures/binary.py b/libs/win/jaraco/structures/binary.py index be57cc76..c4cbbeda 100644 --- a/libs/win/jaraco/structures/binary.py +++ b/libs/win/jaraco/structures/binary.py @@ -1,151 +1,156 @@ -from __future__ import absolute_import, unicode_literals - import numbers from functools import reduce def get_bit_values(number, size=32): - """ - Get bit values as a list for a given number + """ + Get bit values as a list for a given number - >>> get_bit_values(1) == [0]*31 + [1] - True + >>> get_bit_values(1) == [0]*31 + [1] + True - >>> get_bit_values(0xDEADBEEF) - [1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1] + >>> get_bit_values(0xDEADBEEF) + [1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, \ +1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1] - You may override the default word size of 32-bits to match your actual - application. + You may override the default word size of 32-bits to match your actual + application. - >>> get_bit_values(0x3, 2) - [1, 1] + >>> get_bit_values(0x3, 2) + [1, 1] - >>> get_bit_values(0x3, 4) - [0, 0, 1, 1] - """ - number += 2**size - return list(map(int, bin(number)[-size:])) + >>> get_bit_values(0x3, 4) + [0, 0, 1, 1] + """ + number += 2 ** size + return list(map(int, bin(number)[-size:])) def gen_bit_values(number): - """ - Return a zero or one for each bit of a numeric value up to the most - significant 1 bit, beginning with the least significant bit. + """ + Return a zero or one for each bit of a numeric value up to the most + significant 1 bit, beginning with the least significant bit. - >>> list(gen_bit_values(16)) - [0, 0, 0, 0, 1] - """ - digits = bin(number)[2:] - return map(int, reversed(digits)) + >>> list(gen_bit_values(16)) + [0, 0, 0, 0, 1] + """ + digits = bin(number)[2:] + return map(int, reversed(digits)) def coalesce(bits): - """ - Take a sequence of bits, most significant first, and - coalesce them into a number. + """ + Take a sequence of bits, most significant first, and + coalesce them into a number. - >>> coalesce([1,0,1]) - 5 - """ - operation = lambda a, b: (a << 1 | b) - return reduce(operation, bits) + >>> coalesce([1,0,1]) + 5 + """ + + def operation(a, b): + return a << 1 | b + + return reduce(operation, bits) -class Flags(object): - """ - Subclasses should define _names, a list of flag names beginning - with the least-significant bit. +class Flags: + """ + Subclasses should define _names, a list of flag names beginning + with the least-significant bit. - >>> class MyFlags(Flags): - ... _names = 'a', 'b', 'c' - >>> mf = MyFlags.from_number(5) - >>> mf['a'] - 1 - >>> mf['b'] - 0 - >>> mf['c'] == mf[2] - True - >>> mf['b'] = 1 - >>> mf['a'] = 0 - >>> mf.number - 6 - """ - def __init__(self, values): - self._values = list(values) - if hasattr(self, '_names'): - n_missing_bits = len(self._names) - len(self._values) - self._values.extend([0] * n_missing_bits) + >>> class MyFlags(Flags): + ... _names = 'a', 'b', 'c' + >>> mf = MyFlags.from_number(5) + >>> mf['a'] + 1 + >>> mf['b'] + 0 + >>> mf['c'] == mf[2] + True + >>> mf['b'] = 1 + >>> mf['a'] = 0 + >>> mf.number + 6 + """ - @classmethod - def from_number(cls, number): - return cls(gen_bit_values(number)) + def __init__(self, values): + self._values = list(values) + if hasattr(self, '_names'): + n_missing_bits = len(self._names) - len(self._values) + self._values.extend([0] * n_missing_bits) - @property - def number(self): - return coalesce(reversed(self._values)) + @classmethod + def from_number(cls, number): + return cls(gen_bit_values(number)) - def __setitem__(self, key, value): - # first try by index, then by name - try: - self._values[key] = value - except TypeError: - index = self._names.index(key) - self._values[index] = value + @property + def number(self): + return coalesce(reversed(self._values)) - def __getitem__(self, key): - # first try by index, then by name - try: - return self._values[key] - except TypeError: - index = self._names.index(key) - return self._values[index] + def __setitem__(self, key, value): + # first try by index, then by name + try: + self._values[key] = value + except TypeError: + index = self._names.index(key) + self._values[index] = value + + def __getitem__(self, key): + # first try by index, then by name + try: + return self._values[key] + except TypeError: + index = self._names.index(key) + return self._values[index] class BitMask(type): - """ - A metaclass to create a bitmask with attributes. Subclass an int and - set this as the metaclass to use. + """ + A metaclass to create a bitmask with attributes. Subclass an int and + set this as the metaclass to use. - Here's how to create such a class on Python 3: + Construct such a class: - class MyBits(int, metaclass=BitMask): - a = 0x1 - b = 0x4 - c = 0x3 + >>> class MyBits(int, metaclass=BitMask): + ... a = 0x1 + ... b = 0x4 + ... c = 0x3 - For testing purposes, construct explicitly to support Python 2 + >>> b1 = MyBits(3) + >>> b1.a, b1.b, b1.c + (True, False, True) + >>> b2 = MyBits(8) + >>> any([b2.a, b2.b, b2.c]) + False - >>> ns = dict(a=0x1, b=0x4, c=0x3) - >>> MyBits = BitMask(str('MyBits'), (int,), ns) + If the instance defines methods, they won't be wrapped in + properties. - >>> b1 = MyBits(3) - >>> b1.a, b1.b, b1.c - (True, False, True) - >>> b2 = MyBits(8) - >>> any([b2.a, b2.b, b2.c]) - False + >>> class MyBits(int, metaclass=BitMask): + ... a = 0x1 + ... b = 0x4 + ... c = 0x3 + ... + ... @classmethod + ... def get_value(cls): + ... return 'some value' + ... + ... @property + ... def prop(cls): + ... return 'a property' + >>> MyBits(3).get_value() + 'some value' + >>> MyBits(3).prop + 'a property' + """ - If the instance defines methods, they won't be wrapped in - properties. + def __new__(cls, name, bases, attrs): + def make_property(name, value): + if name.startswith('_') or not isinstance(value, numbers.Number): + return value + return property(lambda self, value=value: bool(self & value)) - >>> ns['get_value'] = classmethod(lambda cls: 'some value') - >>> ns['prop'] = property(lambda self: 'a property') - >>> MyBits = BitMask(str('MyBits'), (int,), ns) - - >>> MyBits(3).get_value() - 'some value' - >>> MyBits(3).prop - 'a property' - """ - - def __new__(cls, name, bases, attrs): - def make_property(name, value): - if name.startswith('_') or not isinstance(value, numbers.Number): - return value - return property(lambda self, value=value: bool(self & value)) - - newattrs = dict( - (name, make_property(name, value)) - for name, value in attrs.items() - ) - return type.__new__(cls, name, bases, newattrs) + newattrs = dict( + (name, make_property(name, value)) for name, value in attrs.items() + ) + return type.__new__(cls, name, bases, newattrs) diff --git a/libs/win/jaraco/text.py b/libs/win/jaraco/text.py deleted file mode 100644 index 71b4b0bc..00000000 --- a/libs/win/jaraco/text.py +++ /dev/null @@ -1,452 +0,0 @@ -from __future__ import absolute_import, unicode_literals, print_function - -import sys -import re -import inspect -import itertools -import textwrap -import functools - -import six - -import jaraco.collections -from jaraco.functools import compose - - -def substitution(old, new): - """ - Return a function that will perform a substitution on a string - """ - return lambda s: s.replace(old, new) - - -def multi_substitution(*substitutions): - """ - Take a sequence of pairs specifying substitutions, and create - a function that performs those substitutions. - - >>> multi_substitution(('foo', 'bar'), ('bar', 'baz'))('foo') - 'baz' - """ - substitutions = itertools.starmap(substitution, substitutions) - # compose function applies last function first, so reverse the - # substitutions to get the expected order. - substitutions = reversed(tuple(substitutions)) - return compose(*substitutions) - - -class FoldedCase(six.text_type): - """ - A case insensitive string class; behaves just like str - except compares equal when the only variation is case. - - >>> s = FoldedCase('hello world') - - >>> s == 'Hello World' - True - - >>> 'Hello World' == s - True - - >>> s != 'Hello World' - False - - >>> s.index('O') - 4 - - >>> s.split('O') - ['hell', ' w', 'rld'] - - >>> sorted(map(FoldedCase, ['GAMMA', 'alpha', 'Beta'])) - ['alpha', 'Beta', 'GAMMA'] - - Sequence membership is straightforward. - - >>> "Hello World" in [s] - True - >>> s in ["Hello World"] - True - - You may test for set inclusion, but candidate and elements - must both be folded. - - >>> FoldedCase("Hello World") in {s} - True - >>> s in {FoldedCase("Hello World")} - True - - String inclusion works as long as the FoldedCase object - is on the right. - - >>> "hello" in FoldedCase("Hello World") - True - - But not if the FoldedCase object is on the left: - - >>> FoldedCase('hello') in 'Hello World' - False - - In that case, use in_: - - >>> FoldedCase('hello').in_('Hello World') - True - - """ - def __lt__(self, other): - return self.lower() < other.lower() - - def __gt__(self, other): - return self.lower() > other.lower() - - def __eq__(self, other): - return self.lower() == other.lower() - - def __ne__(self, other): - return self.lower() != other.lower() - - def __hash__(self): - return hash(self.lower()) - - def __contains__(self, other): - return super(FoldedCase, self).lower().__contains__(other.lower()) - - def in_(self, other): - "Does self appear in other?" - return self in FoldedCase(other) - - # cache lower since it's likely to be called frequently. - @jaraco.functools.method_cache - def lower(self): - return super(FoldedCase, self).lower() - - def index(self, sub): - return self.lower().index(sub.lower()) - - def split(self, splitter=' ', maxsplit=0): - pattern = re.compile(re.escape(splitter), re.I) - return pattern.split(self, maxsplit) - - -def local_format(string): - """ - format the string using variables in the caller's local namespace. - - >>> a = 3 - >>> local_format("{a:5}") - ' 3' - """ - context = inspect.currentframe().f_back.f_locals - if sys.version_info < (3, 2): - return string.format(**context) - return string.format_map(context) - - -def global_format(string): - """ - format the string using variables in the caller's global namespace. - - >>> a = 3 - >>> fmt = "The func name: {global_format.__name__}" - >>> global_format(fmt) - 'The func name: global_format' - """ - context = inspect.currentframe().f_back.f_globals - if sys.version_info < (3, 2): - return string.format(**context) - return string.format_map(context) - - -def namespace_format(string): - """ - Format the string using variable in the caller's scope (locals + globals). - - >>> a = 3 - >>> fmt = "A is {a} and this func is {namespace_format.__name__}" - >>> namespace_format(fmt) - 'A is 3 and this func is namespace_format' - """ - context = jaraco.collections.DictStack() - context.push(inspect.currentframe().f_back.f_globals) - context.push(inspect.currentframe().f_back.f_locals) - if sys.version_info < (3, 2): - return string.format(**context) - return string.format_map(context) - - -def is_decodable(value): - r""" - Return True if the supplied value is decodable (using the default - encoding). - - >>> is_decodable(b'\xff') - False - >>> is_decodable(b'\x32') - True - """ - # TODO: This code could be expressed more consisely and directly - # with a jaraco.context.ExceptionTrap, but that adds an unfortunate - # long dependency tree, so for now, use boolean literals. - try: - value.decode() - except UnicodeDecodeError: - return False - return True - - -def is_binary(value): - """ - Return True if the value appears to be binary (that is, it's a byte - string and isn't decodable). - """ - return isinstance(value, bytes) and not is_decodable(value) - - -def trim(s): - r""" - Trim something like a docstring to remove the whitespace that - is common due to indentation and formatting. - - >>> trim("\n\tfoo = bar\n\t\tbar = baz\n") - 'foo = bar\n\tbar = baz' - """ - return textwrap.dedent(s).strip() - - -class Splitter(object): - """object that will split a string with the given arguments for each call - - >>> s = Splitter(',') - >>> s('hello, world, this is your, master calling') - ['hello', ' world', ' this is your', ' master calling'] - """ - def __init__(self, *args): - self.args = args - - def __call__(self, s): - return s.split(*self.args) - - -def indent(string, prefix=' ' * 4): - return prefix + string - - -class WordSet(tuple): - """ - Given a Python identifier, return the words that identifier represents, - whether in camel case, underscore-separated, etc. - - >>> WordSet.parse("camelCase") - ('camel', 'Case') - - >>> WordSet.parse("under_sep") - ('under', 'sep') - - Acronyms should be retained - - >>> WordSet.parse("firstSNL") - ('first', 'SNL') - - >>> WordSet.parse("you_and_I") - ('you', 'and', 'I') - - >>> WordSet.parse("A simple test") - ('A', 'simple', 'test') - - Multiple caps should not interfere with the first cap of another word. - - >>> WordSet.parse("myABCClass") - ('my', 'ABC', 'Class') - - The result is a WordSet, so you can get the form you need. - - >>> WordSet.parse("myABCClass").underscore_separated() - 'my_ABC_Class' - - >>> WordSet.parse('a-command').camel_case() - 'ACommand' - - >>> WordSet.parse('someIdentifier').lowered().space_separated() - 'some identifier' - - Slices of the result should return another WordSet. - - >>> WordSet.parse('taken-out-of-context')[1:].underscore_separated() - 'out_of_context' - - >>> WordSet.from_class_name(WordSet()).lowered().space_separated() - 'word set' - """ - _pattern = re.compile('([A-Z]?[a-z]+)|([A-Z]+(?![a-z]))') - - def capitalized(self): - return WordSet(word.capitalize() for word in self) - - def lowered(self): - return WordSet(word.lower() for word in self) - - def camel_case(self): - return ''.join(self.capitalized()) - - def headless_camel_case(self): - words = iter(self) - first = next(words).lower() - return itertools.chain((first,), WordSet(words).camel_case()) - - def underscore_separated(self): - return '_'.join(self) - - def dash_separated(self): - return '-'.join(self) - - def space_separated(self): - return ' '.join(self) - - def __getitem__(self, item): - result = super(WordSet, self).__getitem__(item) - if isinstance(item, slice): - result = WordSet(result) - return result - - # for compatibility with Python 2 - def __getslice__(self, i, j): - return self.__getitem__(slice(i, j)) - - @classmethod - def parse(cls, identifier): - matches = cls._pattern.finditer(identifier) - return WordSet(match.group(0) for match in matches) - - @classmethod - def from_class_name(cls, subject): - return cls.parse(subject.__class__.__name__) - - -# for backward compatibility -words = WordSet.parse - - -def simple_html_strip(s): - r""" - Remove HTML from the string `s`. - - >>> str(simple_html_strip('')) - '' - - >>> print(simple_html_strip('A stormy day in paradise')) - A stormy day in paradise - - >>> print(simple_html_strip('Somebody tell the truth.')) - Somebody tell the truth. - - >>> print(simple_html_strip('What about
\nmultiple lines?')) - What about - multiple lines? - """ - html_stripper = re.compile('()|(<[^>]*>)|([^<]+)', re.DOTALL) - texts = ( - match.group(3) or '' - for match - in html_stripper.finditer(s) - ) - return ''.join(texts) - - -class SeparatedValues(six.text_type): - """ - A string separated by a separator. Overrides __iter__ for getting - the values. - - >>> list(SeparatedValues('a,b,c')) - ['a', 'b', 'c'] - - Whitespace is stripped and empty values are discarded. - - >>> list(SeparatedValues(' a, b , c, ')) - ['a', 'b', 'c'] - """ - separator = ',' - - def __iter__(self): - parts = self.split(self.separator) - return six.moves.filter(None, (part.strip() for part in parts)) - - -class Stripper: - r""" - Given a series of lines, find the common prefix and strip it from them. - - >>> lines = [ - ... 'abcdefg\n', - ... 'abc\n', - ... 'abcde\n', - ... ] - >>> res = Stripper.strip_prefix(lines) - >>> res.prefix - 'abc' - >>> list(res.lines) - ['defg\n', '\n', 'de\n'] - - If no prefix is common, nothing should be stripped. - - >>> lines = [ - ... 'abcd\n', - ... '1234\n', - ... ] - >>> res = Stripper.strip_prefix(lines) - >>> res.prefix = '' - >>> list(res.lines) - ['abcd\n', '1234\n'] - """ - def __init__(self, prefix, lines): - self.prefix = prefix - self.lines = map(self, lines) - - @classmethod - def strip_prefix(cls, lines): - prefix_lines, lines = itertools.tee(lines) - prefix = functools.reduce(cls.common_prefix, prefix_lines) - return cls(prefix, lines) - - def __call__(self, line): - if not self.prefix: - return line - null, prefix, rest = line.partition(self.prefix) - return rest - - @staticmethod - def common_prefix(s1, s2): - """ - Return the common prefix of two lines. - """ - index = min(len(s1), len(s2)) - while s1[:index] != s2[:index]: - index -= 1 - return s1[:index] - - -def remove_prefix(text, prefix): - """ - Remove the prefix from the text if it exists. - - >>> remove_prefix('underwhelming performance', 'underwhelming ') - 'performance' - - >>> remove_prefix('something special', 'sample') - 'something special' - """ - null, prefix, rest = text.rpartition(prefix) - return rest - - -def remove_suffix(text, suffix): - """ - Remove the suffix from the text if it exists. - - >>> remove_suffix('name.git', '.git') - 'name' - - >>> remove_suffix('something special', 'sample') - 'something special' - """ - rest, suffix, null = text.partition(suffix) - return rest diff --git a/libs/win/jaraco/text/Lorem ipsum.txt b/libs/win/jaraco/text/Lorem ipsum.txt new file mode 100644 index 00000000..986f944b --- /dev/null +++ b/libs/win/jaraco/text/Lorem ipsum.txt @@ -0,0 +1,2 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque. Aliquam faucibus, elit ut dictum aliquet, felis nisl adipiscing sapien, sed malesuada diam lacus eget erat. Cras mollis scelerisque nunc. Nullam arcu. Aliquam consequat. Curabitur augue lorem, dapibus quis, laoreet et, pretium ac, nisi. Aenean magna nisl, mollis quis, molestie eu, feugiat in, orci. In hac habitasse platea dictumst. diff --git a/libs/win/jaraco/text/__init__.py b/libs/win/jaraco/text/__init__.py new file mode 100644 index 00000000..e51101c2 --- /dev/null +++ b/libs/win/jaraco/text/__init__.py @@ -0,0 +1,622 @@ +import re +import itertools +import textwrap +import functools + +try: + from importlib.resources import files # type: ignore +except ImportError: # pragma: nocover + from importlib_resources import files # type: ignore + +from jaraco.functools import compose, method_cache +from jaraco.context import ExceptionTrap + + +def substitution(old, new): + """ + Return a function that will perform a substitution on a string + """ + return lambda s: s.replace(old, new) + + +def multi_substitution(*substitutions): + """ + Take a sequence of pairs specifying substitutions, and create + a function that performs those substitutions. + + >>> multi_substitution(('foo', 'bar'), ('bar', 'baz'))('foo') + 'baz' + """ + substitutions = itertools.starmap(substitution, substitutions) + # compose function applies last function first, so reverse the + # substitutions to get the expected order. + substitutions = reversed(tuple(substitutions)) + return compose(*substitutions) + + +class FoldedCase(str): + """ + A case insensitive string class; behaves just like str + except compares equal when the only variation is case. + + >>> s = FoldedCase('hello world') + + >>> s == 'Hello World' + True + + >>> 'Hello World' == s + True + + >>> s != 'Hello World' + False + + >>> s.index('O') + 4 + + >>> s.split('O') + ['hell', ' w', 'rld'] + + >>> sorted(map(FoldedCase, ['GAMMA', 'alpha', 'Beta'])) + ['alpha', 'Beta', 'GAMMA'] + + Sequence membership is straightforward. + + >>> "Hello World" in [s] + True + >>> s in ["Hello World"] + True + + Allows testing for set inclusion, but candidate and elements + must both be folded. + + >>> FoldedCase("Hello World") in {s} + True + >>> s in {FoldedCase("Hello World")} + True + + String inclusion works as long as the FoldedCase object + is on the right. + + >>> "hello" in FoldedCase("Hello World") + True + + But not if the FoldedCase object is on the left: + + >>> FoldedCase('hello') in 'Hello World' + False + + In that case, use ``in_``: + + >>> FoldedCase('hello').in_('Hello World') + True + + >>> FoldedCase('hello') > FoldedCase('Hello') + False + + >>> FoldedCase('ß') == FoldedCase('ss') + True + """ + + def __lt__(self, other): + return self.casefold() < other.casefold() + + def __gt__(self, other): + return self.casefold() > other.casefold() + + def __eq__(self, other): + return self.casefold() == other.casefold() + + def __ne__(self, other): + return self.casefold() != other.casefold() + + def __hash__(self): + return hash(self.casefold()) + + def __contains__(self, other): + return super().casefold().__contains__(other.casefold()) + + def in_(self, other): + "Does self appear in other?" + return self in FoldedCase(other) + + # cache casefold since it's likely to be called frequently. + @method_cache + def casefold(self): + return super().casefold() + + def index(self, sub): + return self.casefold().index(sub.casefold()) + + def split(self, splitter=' ', maxsplit=0): + pattern = re.compile(re.escape(splitter), re.I) + return pattern.split(self, maxsplit) + + +# Python 3.8 compatibility +_unicode_trap = ExceptionTrap(UnicodeDecodeError) + + +@_unicode_trap.passes +def is_decodable(value): + r""" + Return True if the supplied value is decodable (using the default + encoding). + + >>> is_decodable(b'\xff') + False + >>> is_decodable(b'\x32') + True + """ + value.decode() + + +def is_binary(value): + r""" + Return True if the value appears to be binary (that is, it's a byte + string and isn't decodable). + + >>> is_binary(b'\xff') + True + >>> is_binary('\xff') + False + """ + return isinstance(value, bytes) and not is_decodable(value) + + +def trim(s): + r""" + Trim something like a docstring to remove the whitespace that + is common due to indentation and formatting. + + >>> trim("\n\tfoo = bar\n\t\tbar = baz\n") + 'foo = bar\n\tbar = baz' + """ + return textwrap.dedent(s).strip() + + +def wrap(s): + """ + Wrap lines of text, retaining existing newlines as + paragraph markers. + + >>> print(wrap(lorem_ipsum)) + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad + minim veniam, quis nostrud exercitation ullamco laboris nisi ut + aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in + culpa qui officia deserunt mollit anim id est laborum. + + Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam + varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus + magna felis sollicitudin mauris. Integer in mauris eu nibh euismod + gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis + risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, + eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas + fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla + a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, + neque. Aliquam faucibus, elit ut dictum aliquet, felis nisl adipiscing + sapien, sed malesuada diam lacus eget erat. Cras mollis scelerisque + nunc. Nullam arcu. Aliquam consequat. Curabitur augue lorem, dapibus + quis, laoreet et, pretium ac, nisi. Aenean magna nisl, mollis quis, + molestie eu, feugiat in, orci. In hac habitasse platea dictumst. + """ + paragraphs = s.splitlines() + wrapped = ('\n'.join(textwrap.wrap(para)) for para in paragraphs) + return '\n\n'.join(wrapped) + + +def unwrap(s): + r""" + Given a multi-line string, return an unwrapped version. + + >>> wrapped = wrap(lorem_ipsum) + >>> wrapped.count('\n') + 20 + >>> unwrapped = unwrap(wrapped) + >>> unwrapped.count('\n') + 1 + >>> print(unwrapped) + Lorem ipsum dolor sit amet, consectetur adipiscing ... + Curabitur pretium tincidunt lacus. Nulla gravida orci ... + + """ + paragraphs = re.split(r'\n\n+', s) + cleaned = (para.replace('\n', ' ') for para in paragraphs) + return '\n'.join(cleaned) + + +lorem_ipsum: str = files(__name__).joinpath('Lorem ipsum.txt').read_text() + + +class Splitter(object): + """object that will split a string with the given arguments for each call + + >>> s = Splitter(',') + >>> s('hello, world, this is your, master calling') + ['hello', ' world', ' this is your', ' master calling'] + """ + + def __init__(self, *args): + self.args = args + + def __call__(self, s): + return s.split(*self.args) + + +def indent(string, prefix=' ' * 4): + """ + >>> indent('foo') + ' foo' + """ + return prefix + string + + +class WordSet(tuple): + """ + Given an identifier, return the words that identifier represents, + whether in camel case, underscore-separated, etc. + + >>> WordSet.parse("camelCase") + ('camel', 'Case') + + >>> WordSet.parse("under_sep") + ('under', 'sep') + + Acronyms should be retained + + >>> WordSet.parse("firstSNL") + ('first', 'SNL') + + >>> WordSet.parse("you_and_I") + ('you', 'and', 'I') + + >>> WordSet.parse("A simple test") + ('A', 'simple', 'test') + + Multiple caps should not interfere with the first cap of another word. + + >>> WordSet.parse("myABCClass") + ('my', 'ABC', 'Class') + + The result is a WordSet, providing access to other forms. + + >>> WordSet.parse("myABCClass").underscore_separated() + 'my_ABC_Class' + + >>> WordSet.parse('a-command').camel_case() + 'ACommand' + + >>> WordSet.parse('someIdentifier').lowered().space_separated() + 'some identifier' + + Slices of the result should return another WordSet. + + >>> WordSet.parse('taken-out-of-context')[1:].underscore_separated() + 'out_of_context' + + >>> WordSet.from_class_name(WordSet()).lowered().space_separated() + 'word set' + + >>> example = WordSet.parse('figured it out') + >>> example.headless_camel_case() + 'figuredItOut' + >>> example.dash_separated() + 'figured-it-out' + + """ + + _pattern = re.compile('([A-Z]?[a-z]+)|([A-Z]+(?![a-z]))') + + def capitalized(self): + return WordSet(word.capitalize() for word in self) + + def lowered(self): + return WordSet(word.lower() for word in self) + + def camel_case(self): + return ''.join(self.capitalized()) + + def headless_camel_case(self): + words = iter(self) + first = next(words).lower() + new_words = itertools.chain((first,), WordSet(words).camel_case()) + return ''.join(new_words) + + def underscore_separated(self): + return '_'.join(self) + + def dash_separated(self): + return '-'.join(self) + + def space_separated(self): + return ' '.join(self) + + def trim_right(self, item): + """ + Remove the item from the end of the set. + + >>> WordSet.parse('foo bar').trim_right('foo') + ('foo', 'bar') + >>> WordSet.parse('foo bar').trim_right('bar') + ('foo',) + >>> WordSet.parse('').trim_right('bar') + () + """ + return self[:-1] if self and self[-1] == item else self + + def trim_left(self, item): + """ + Remove the item from the beginning of the set. + + >>> WordSet.parse('foo bar').trim_left('foo') + ('bar',) + >>> WordSet.parse('foo bar').trim_left('bar') + ('foo', 'bar') + >>> WordSet.parse('').trim_left('bar') + () + """ + return self[1:] if self and self[0] == item else self + + def trim(self, item): + """ + >>> WordSet.parse('foo bar').trim('foo') + ('bar',) + """ + return self.trim_left(item).trim_right(item) + + def __getitem__(self, item): + result = super(WordSet, self).__getitem__(item) + if isinstance(item, slice): + result = WordSet(result) + return result + + @classmethod + def parse(cls, identifier): + matches = cls._pattern.finditer(identifier) + return WordSet(match.group(0) for match in matches) + + @classmethod + def from_class_name(cls, subject): + return cls.parse(subject.__class__.__name__) + + +# for backward compatibility +words = WordSet.parse + + +def simple_html_strip(s): + r""" + Remove HTML from the string `s`. + + >>> str(simple_html_strip('')) + '' + + >>> print(simple_html_strip('A stormy day in paradise')) + A stormy day in paradise + + >>> print(simple_html_strip('Somebody tell the truth.')) + Somebody tell the truth. + + >>> print(simple_html_strip('What about
\nmultiple lines?')) + What about + multiple lines? + """ + html_stripper = re.compile('()|(<[^>]*>)|([^<]+)', re.DOTALL) + texts = (match.group(3) or '' for match in html_stripper.finditer(s)) + return ''.join(texts) + + +class SeparatedValues(str): + """ + A string separated by a separator. Overrides __iter__ for getting + the values. + + >>> list(SeparatedValues('a,b,c')) + ['a', 'b', 'c'] + + Whitespace is stripped and empty values are discarded. + + >>> list(SeparatedValues(' a, b , c, ')) + ['a', 'b', 'c'] + """ + + separator = ',' + + def __iter__(self): + parts = self.split(self.separator) + return filter(None, (part.strip() for part in parts)) + + +class Stripper: + r""" + Given a series of lines, find the common prefix and strip it from them. + + >>> lines = [ + ... 'abcdefg\n', + ... 'abc\n', + ... 'abcde\n', + ... ] + >>> res = Stripper.strip_prefix(lines) + >>> res.prefix + 'abc' + >>> list(res.lines) + ['defg\n', '\n', 'de\n'] + + If no prefix is common, nothing should be stripped. + + >>> lines = [ + ... 'abcd\n', + ... '1234\n', + ... ] + >>> res = Stripper.strip_prefix(lines) + >>> res.prefix = '' + >>> list(res.lines) + ['abcd\n', '1234\n'] + """ + + def __init__(self, prefix, lines): + self.prefix = prefix + self.lines = map(self, lines) + + @classmethod + def strip_prefix(cls, lines): + prefix_lines, lines = itertools.tee(lines) + prefix = functools.reduce(cls.common_prefix, prefix_lines) + return cls(prefix, lines) + + def __call__(self, line): + if not self.prefix: + return line + null, prefix, rest = line.partition(self.prefix) + return rest + + @staticmethod + def common_prefix(s1, s2): + """ + Return the common prefix of two lines. + """ + index = min(len(s1), len(s2)) + while s1[:index] != s2[:index]: + index -= 1 + return s1[:index] + + +def remove_prefix(text, prefix): + """ + Remove the prefix from the text if it exists. + + >>> remove_prefix('underwhelming performance', 'underwhelming ') + 'performance' + + >>> remove_prefix('something special', 'sample') + 'something special' + """ + null, prefix, rest = text.rpartition(prefix) + return rest + + +def remove_suffix(text, suffix): + """ + Remove the suffix from the text if it exists. + + >>> remove_suffix('name.git', '.git') + 'name' + + >>> remove_suffix('something special', 'sample') + 'something special' + """ + rest, suffix, null = text.partition(suffix) + return rest + + +def normalize_newlines(text): + r""" + Replace alternate newlines with the canonical newline. + + >>> normalize_newlines('Lorem Ipsum\u2029') + 'Lorem Ipsum\n' + >>> normalize_newlines('Lorem Ipsum\r\n') + 'Lorem Ipsum\n' + >>> normalize_newlines('Lorem Ipsum\x85') + 'Lorem Ipsum\n' + """ + newlines = ['\r\n', '\r', '\n', '\u0085', '\u2028', '\u2029'] + pattern = '|'.join(newlines) + return re.sub(pattern, '\n', text) + + +def _nonblank(str): + return str and not str.startswith('#') + + +@functools.singledispatch +def yield_lines(iterable): + r""" + Yield valid lines of a string or iterable. + + >>> list(yield_lines('')) + [] + >>> list(yield_lines(['foo', 'bar'])) + ['foo', 'bar'] + >>> list(yield_lines('foo\nbar')) + ['foo', 'bar'] + >>> list(yield_lines('\nfoo\n#bar\nbaz #comment')) + ['foo', 'baz #comment'] + >>> list(yield_lines(['foo\nbar', 'baz', 'bing\n\n\n'])) + ['foo', 'bar', 'baz', 'bing'] + """ + return itertools.chain.from_iterable(map(yield_lines, iterable)) + + +@yield_lines.register(str) +def _(text): + return filter(_nonblank, map(str.strip, text.splitlines())) + + +def drop_comment(line): + """ + Drop comments. + + >>> drop_comment('foo # bar') + 'foo' + + A hash without a space may be in a URL. + + >>> drop_comment('http://example.com/foo#bar') + 'http://example.com/foo#bar' + """ + return line.partition(' #')[0] + + +def join_continuation(lines): + r""" + Join lines continued by a trailing backslash. + + >>> list(join_continuation(['foo \\', 'bar', 'baz'])) + ['foobar', 'baz'] + >>> list(join_continuation(['foo \\', 'bar', 'baz'])) + ['foobar', 'baz'] + >>> list(join_continuation(['foo \\', 'bar \\', 'baz'])) + ['foobarbaz'] + + Not sure why, but... + The character preceeding the backslash is also elided. + + >>> list(join_continuation(['goo\\', 'dly'])) + ['godly'] + + A terrible idea, but... + If no line is available to continue, suppress the lines. + + >>> list(join_continuation(['foo', 'bar\\', 'baz\\'])) + ['foo'] + """ + lines = iter(lines) + for item in lines: + while item.endswith('\\'): + try: + item = item[:-2].strip() + next(lines) + except StopIteration: + return + yield item + + +def read_newlines(filename, limit=1024): + r""" + >>> tmp_path = getfixture('tmp_path') + >>> filename = tmp_path / 'out.txt' + >>> _ = filename.write_text('foo\n', newline='') + >>> read_newlines(filename) + '\n' + >>> _ = filename.write_text('foo\r\n', newline='') + >>> read_newlines(filename) + '\r\n' + >>> _ = filename.write_text('foo\r\nbar\nbing\r', newline='') + >>> read_newlines(filename) + ('\r', '\n', '\r\n') + """ + with open(filename) as fp: + fp.read(limit) + return fp.newlines diff --git a/libs/win/jaraco/text/layouts.py b/libs/win/jaraco/text/layouts.py new file mode 100644 index 00000000..9636f0f7 --- /dev/null +++ b/libs/win/jaraco/text/layouts.py @@ -0,0 +1,25 @@ +qwerty = "-=qwertyuiop[]asdfghjkl;'zxcvbnm,./_+QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?" +dvorak = "[]',.pyfgcrl/=aoeuidhtns-;qjkxbmwvz{}\"<>PYFGCRL?+AOEUIDHTNS_:QJKXBMWVZ" + + +to_dvorak = str.maketrans(qwerty, dvorak) +to_qwerty = str.maketrans(dvorak, qwerty) + + +def translate(input, translation): + """ + >>> translate('dvorak', to_dvorak) + 'ekrpat' + >>> translate('qwerty', to_qwerty) + 'x,dokt' + """ + return input.translate(translation) + + +def _translate_stream(stream, translation): + """ + >>> import io + >>> _translate_stream(io.StringIO('foo'), to_dvorak) + urr + """ + print(translate(stream.read(), translation)) diff --git a/libs/win/jaraco/text/show-newlines.py b/libs/win/jaraco/text/show-newlines.py new file mode 100644 index 00000000..2ba32062 --- /dev/null +++ b/libs/win/jaraco/text/show-newlines.py @@ -0,0 +1,33 @@ +import autocommand +import inflect + +from more_itertools import always_iterable + +import jaraco.text + + +def report_newlines(filename): + r""" + Report the newlines in the indicated file. + + >>> tmp_path = getfixture('tmp_path') + >>> filename = tmp_path / 'out.txt' + >>> _ = filename.write_text('foo\nbar\n', newline='') + >>> report_newlines(filename) + newline is '\n' + >>> filename = tmp_path / 'out.txt' + >>> _ = filename.write_text('foo\nbar\r\n', newline='') + >>> report_newlines(filename) + newlines are ('\n', '\r\n') + """ + newlines = jaraco.text.read_newlines(filename) + count = len(tuple(always_iterable(newlines))) + engine = inflect.engine() + print( + engine.plural_noun("newline", count), + engine.plural_verb("is", count), + repr(newlines), + ) + + +autocommand.autocommand(__name__)(report_newlines) diff --git a/libs/win/jaraco/text/strip-prefix.py b/libs/win/jaraco/text/strip-prefix.py new file mode 100644 index 00000000..761717a9 --- /dev/null +++ b/libs/win/jaraco/text/strip-prefix.py @@ -0,0 +1,21 @@ +import sys + +import autocommand + +from jaraco.text import Stripper + + +def strip_prefix(): + r""" + Strip any common prefix from stdin. + + >>> import io, pytest + >>> getfixture('monkeypatch').setattr('sys.stdin', io.StringIO('abcdef\nabc123')) + >>> strip_prefix() + def + 123 + """ + sys.stdout.writelines(Stripper.strip_prefix(sys.stdin).lines) + + +autocommand.autocommand(__name__)(strip_prefix) diff --git a/libs/win/jaraco/text/to-dvorak.py b/libs/win/jaraco/text/to-dvorak.py new file mode 100644 index 00000000..a6d5da80 --- /dev/null +++ b/libs/win/jaraco/text/to-dvorak.py @@ -0,0 +1,6 @@ +import sys + +from . import layouts + + +__name__ == '__main__' and layouts._translate_stream(sys.stdin, layouts.to_dvorak) diff --git a/libs/win/jaraco/text/to-qwerty.py b/libs/win/jaraco/text/to-qwerty.py new file mode 100644 index 00000000..abe27286 --- /dev/null +++ b/libs/win/jaraco/text/to-qwerty.py @@ -0,0 +1,6 @@ +import sys + +from . import layouts + + +__name__ == '__main__' and layouts._translate_stream(sys.stdin, layouts.to_qwerty) diff --git a/libs/win/jaraco/ui/cmdline.py b/libs/win/jaraco/ui/cmdline.py index a7982ddb..8517af7a 100644 --- a/libs/win/jaraco/ui/cmdline.py +++ b/libs/win/jaraco/ui/cmdline.py @@ -1,77 +1,76 @@ import argparse -import six from jaraco.classes import meta -from jaraco import text +from jaraco import text # type: ignore -@six.add_metaclass(meta.LeafClassesMeta) -class Command(object): - """ - A general-purpose base class for creating commands for a command-line - program using argparse. Each subclass of Command represents a separate - sub-command of a program. +class Command(metaclass=meta.LeafClassesMeta): + """ + A general-purpose base class for creating commands for a command-line + program using argparse. Each subclass of Command represents a separate + sub-command of a program. - For example, one might use Command subclasses to implement the Mercurial - command set:: + For example, one might use Command subclasses to implement the Mercurial + command set:: - class Commit(Command): - @staticmethod - def add_arguments(cls, parser): - parser.add_argument('-m', '--message') + class Commit(Command): + @staticmethod + def add_arguments(cls, parser): + parser.add_argument('-m', '--message') - @classmethod - def run(cls, args): - "Run the 'commit' command with args (parsed)" + @classmethod + def run(cls, args): + "Run the 'commit' command with args (parsed)" - class Merge(Command): pass - class Pull(Command): pass - ... + class Merge(Command): pass + class Pull(Command): pass + ... - Then one could create an entry point for Mercurial like so:: + Then one could create an entry point for Mercurial like so:: - def hg_command(): - Command.invoke() - """ + def hg_command(): + Command.invoke() + """ - @classmethod - def add_subparsers(cls, parser): - subparsers = parser.add_subparsers() - [cmd_class.add_parser(subparsers) for cmd_class in cls._leaf_classes] + @classmethod + def add_subparsers(cls, parser): + subparsers = parser.add_subparsers() + [cmd_class.add_parser(subparsers) for cmd_class in cls._leaf_classes] - @classmethod - def add_parser(cls, subparsers): - cmd_string = text.words(cls.__name__).lowered().dash_separated() - parser = subparsers.add_parser(cmd_string) - parser.set_defaults(action=cls) - cls.add_arguments(parser) - return parser + @classmethod + def add_parser(cls, subparsers): + cmd_string = text.words(cls.__name__).lowered().dash_separated() + parser = subparsers.add_parser(cmd_string) + parser.set_defaults(action=cls) + cls.add_arguments(parser) + return parser - @classmethod - def add_arguments(cls, parser): - pass + @classmethod + def add_arguments(cls, parser): + pass - @classmethod - def invoke(cls): - """ - Invoke the command using ArgumentParser - """ - parser = argparse.ArgumentParser() - cls.add_subparsers(parser) - args = parser.parse_args() - args.action.run(args) + @classmethod + def invoke(cls): + """ + Invoke the command using ArgumentParser + """ + parser = argparse.ArgumentParser() + cls.add_subparsers(parser) + args = parser.parse_args() + args.action.run(args) class Extend(argparse.Action): - """ - Argparse action to take an nargs=* argument - and add any values to the existing value. + """ + Argparse action to take an nargs=* argument + and add any values to the existing value. - >>> parser = argparse.ArgumentParser() - >>> _ = parser.add_argument('--foo', nargs='*', default=[], action=Extend) - >>> args = parser.parse_args(['--foo', 'a=1', '--foo', 'b=2', 'c=3']) - >>> args.foo - ['a=1', 'b=2', 'c=3'] - """ - def __call__(self, parser, namespace, values, option_string=None): - getattr(namespace, self.dest).extend(values) + >>> parser = argparse.ArgumentParser() + >>> _ = parser.add_argument('--foo', nargs='*', default=[], action=Extend) + >>> args = parser.parse_args(['--foo', 'a=1', '--foo', 'b=2', 'c=3']) + >>> args.foo + ['a=1', 'b=2', 'c=3'] + """ + + def __call__(self, parser, namespace, values, option_string=None): + getattr(namespace, self.dest).extend(values) diff --git a/libs/win/jaraco/ui/editor.py b/libs/win/jaraco/ui/editor.py index b37c759d..c3102b64 100644 --- a/libs/win/jaraco/ui/editor.py +++ b/libs/win/jaraco/ui/editor.py @@ -1,5 +1,3 @@ -from __future__ import unicode_literals, absolute_import - import tempfile import os import sys @@ -9,100 +7,105 @@ import collections import io import difflib -import six +from typing import Mapping + + +class EditProcessException(RuntimeError): + pass -class EditProcessException(RuntimeError): pass class EditableFile(object): - """ - EditableFile saves some data to a temporary file, launches a - platform editor for interactive editing, and then reloads the data, - setting .changed to True if the data was edited. + """ + EditableFile saves some data to a temporary file, launches a + platform editor for interactive editing, and then reloads the data, + setting .changed to True if the data was edited. - e.g.:: + e.g.:: - x = EditableFile('foo') - x.edit() + x = EditableFile('foo') + x.edit() - if x.changed: - print(x.data) + if x.changed: + print(x.data) - The EDITOR environment variable can define which executable to use - (also XML_EDITOR if the content-type to edit includes 'xml'). If no - EDITOR is defined, defaults to 'notepad' on Windows and 'edit' on - other platforms. - """ - platform_default_editors = collections.defaultdict( - lambda: 'edit', - win32 = 'notepad', - linux2 = 'vi', - ) - encoding = 'utf-8' + The EDITOR environment variable can define which executable to use + (also XML_EDITOR if the content-type to edit includes 'xml'). If no + EDITOR is defined, defaults to 'notepad' on Windows and 'edit' on + other platforms. + """ - def __init__(self, data='', content_type='text/plain'): - self.data = six.text_type(data) - self.content_type = content_type + platform_default_editors: Mapping[str, str] = collections.defaultdict( + lambda: 'edit', + win32='notepad', + linux2='vi', + ) + encoding = 'utf-8' - def __enter__(self): - extension = mimetypes.guess_extension(self.content_type) or '' - fobj, self.name = tempfile.mkstemp(extension) - os.write(fobj, self.data.encode(self.encoding)) - os.close(fobj) - return self + def __init__(self, data='', content_type='text/plain'): + self.data = str(data) + self.content_type = content_type - def read(self): - with open(self.name, 'rb') as f: - return f.read().decode(self.encoding) + def __enter__(self): + extension = mimetypes.guess_extension(self.content_type) or '' + fobj, self.name = tempfile.mkstemp(extension) + os.write(fobj, self.data.encode(self.encoding)) + os.close(fobj) + return self - def __exit__(self, *tb_info): - os.remove(self.name) + def read(self): + with open(self.name, 'rb') as f: + return f.read().decode(self.encoding) - def edit(self): - """ - Edit the file - """ - self.changed = False - with self: - editor = self.get_editor() - cmd = [editor, self.name] - try: - res = subprocess.call(cmd) - except Exception as e: - print("Error launching editor %(editor)s" % locals()) - print(e) - return - if res != 0: - msg = '%(editor)s returned error status %(res)d' % locals() - raise EditProcessException(msg) - new_data = self.read() - if new_data != self.data: - self.changed = self._save_diff(self.data, new_data) - self.data = new_data + def __exit__(self, *tb_info): + os.remove(self.name) - @staticmethod - def _search_env(keys): - """ - Search the environment for the supplied keys, returning the first - one found or None if none was found. - """ - matches = (os.environ[key] for key in keys if key in os.environ) - return next(matches, None) + def edit(self): + """ + Edit the file + """ + self.changed = False + with self: + editor = self.get_editor() + cmd = [editor, self.name] + try: + res = subprocess.call(cmd) + except Exception as e: + print("Error launching editor %(editor)s" % locals()) + print(e) + return + if res != 0: + msg = '%(editor)s returned error status %(res)d' % locals() + raise EditProcessException(msg) + new_data = self.read() + if new_data != self.data: + self.changed = self._save_diff(self.data, new_data) + self.data = new_data - def get_editor(self): - """ - Give preference to an XML_EDITOR or EDITOR defined in the - environment. Otherwise use a default editor based on platform. - """ - env_search = ['EDITOR'] - if 'xml' in self.content_type: - env_search.insert(0, 'XML_EDITOR') - default_editor = self.platform_default_editors[sys.platform] - return self._search_env(env_search) or default_editor + @staticmethod + def _search_env(keys): + """ + Search the environment for the supplied keys, returning the first + one found or None if none was found. + """ + matches = (os.environ[key] for key in keys if key in os.environ) + return next(matches, None) - @staticmethod - def _save_diff(*versions): - def get_lines(content): - return list(io.StringIO(content)) - lines = map(get_lines, versions) - diff = difflib.context_diff(*lines) - return tuple(diff) + def get_editor(self): + """ + Give preference to an XML_EDITOR or EDITOR defined in the + environment. Otherwise use a default editor based on platform. + """ + env_search = ['EDITOR'] + if 'xml' in self.content_type: + env_search.insert(0, 'XML_EDITOR') + default_editor = self.platform_default_editors[sys.platform] + return self._search_env(env_search) or default_editor + + @staticmethod + def _save_diff(*versions): + def get_lines(content): + return list(io.StringIO(content)) + + lines = map(get_lines, versions) + diff = difflib.context_diff(*lines) + return tuple(diff) diff --git a/libs/win/jaraco/ui/input.py b/libs/win/jaraco/ui/input.py index 3d108fc0..c7b2c86a 100644 --- a/libs/win/jaraco/ui/input.py +++ b/libs/win/jaraco/ui/input.py @@ -3,24 +3,28 @@ This module currently provides a cross-platform getch function """ try: - # Windows - from msvcrt import getch + # Windows + from msvcrt import getch # type: ignore + + getch # workaround for https://github.com/kevinw/pyflakes/issues/13 except ImportError: - pass + pass try: - # Unix - import sys - import tty - import termios + # Unix + import sys + import tty + import termios + + def getch(): # type: ignore + fd = sys.stdin.fileno() + old = termios.tcgetattr(fd) + try: + tty.setraw(fd) + return sys.stdin.read(1) + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old) + - def getch(): - fd = sys.stdin.fileno() - old = termios.tcgetattr(fd) - try: - tty.setraw(fd) - return sys.stdin.read(1) - finally: - termios.tcsetattr(fd, termios.TCSADRAIN, old) except ImportError: - pass + pass diff --git a/libs/win/jaraco/ui/menu.py b/libs/win/jaraco/ui/menu.py index aede93b3..78687b3f 100644 --- a/libs/win/jaraco/ui/menu.py +++ b/libs/win/jaraco/ui/menu.py @@ -1,34 +1,32 @@ -from __future__ import print_function, absolute_import, unicode_literals - import itertools -import six class Menu(object): - """ - A simple command-line based menu - """ - def __init__(self, choices=None, formatter=str): - self.choices = choices or list() - self.formatter = formatter + """ + A simple command-line based menu + """ - def get_choice(self, prompt="> "): - n = len(self.choices) - number_width = len(str(n)) + 1 - menu_fmt = '{number:{number_width}}) {choice}' - formatted_choices = map(self.formatter, self.choices) - for number, choice in zip(itertools.count(1), formatted_choices): - print(menu_fmt.format(**locals())) - print() - try: - answer = int(six.moves.input(prompt)) - result = self.choices[answer - 1] - except ValueError: - print('invalid selection') - result = None - except IndexError: - print('invalid selection') - result = None - except KeyboardInterrupt: - result = None - return result + def __init__(self, choices=None, formatter=str): + self.choices = choices or list() + self.formatter = formatter + + def get_choice(self, prompt="> "): + n = len(self.choices) + number_width = len(str(n)) + 1 + menu_fmt = '{number:{number_width}}) {choice}' + formatted_choices = map(self.formatter, self.choices) + for number, choice in zip(itertools.count(1), formatted_choices): + print(menu_fmt.format(**locals())) + print() + try: + answer = int(input(prompt)) + result = self.choices[answer - 1] + except ValueError: + print('invalid selection') + result = None + except IndexError: + print('invalid selection') + result = None + except KeyboardInterrupt: + result = None + return result diff --git a/libs/win/jaraco/ui/progress.py b/libs/win/jaraco/ui/progress.py index d083310b..b57b1c85 100644 --- a/libs/win/jaraco/ui/progress.py +++ b/libs/win/jaraco/ui/progress.py @@ -1,152 +1,141 @@ # deprecated -- use TQDM -from __future__ import (print_function, absolute_import, unicode_literals, - division) - import time import sys import itertools import abc import datetime -import six +class AbstractProgressBar(metaclass=abc.ABCMeta): + def __init__(self, unit='', size=70): + """ + Size is the nominal size in characters + """ + self.unit = unit + self.size = size -@six.add_metaclass(abc.ABCMeta) -class AbstractProgressBar(object): - def __init__(self, unit='', size=70): - """ - Size is the nominal size in characters - """ - self.unit = unit - self.size = size + def report(self, amt): + sys.stdout.write('\r%s' % self.get_bar(amt)) + sys.stdout.flush() - def report(self, amt): - sys.stdout.write('\r%s' % self.get_bar(amt)) - sys.stdout.flush() + @abc.abstractmethod + def get_bar(self, amt): + "Return the string to be printed. Should be size >= self.size" - @abc.abstractmethod - def get_bar(self, amt): - "Return the string to be printed. Should be size >= self.size" + def summary(self, str): + return ' (' + self.unit_str(str) + ')' - def summary(self, str): - return ' (' + self.unit_str(str) + ')' + def unit_str(self, str): + if self.unit: + str += ' ' + self.unit + return str - def unit_str(self, str): - if self.unit: - str += ' ' + self.unit - return str + def finish(self): + print() - def finish(self): - print() + def __enter__(self): + self.report(0) + return self - def __enter__(self): - self.report(0) - return self + def __exit__(self, exc, exc_val, tb): + if exc is None: + self.finish() + else: + print() - def __exit__(self, exc, exc_val, tb): - if exc is None: - self.finish() - else: - print() - - def iterate(self, iterable): - """ - Report the status as the iterable is consumed. - """ - with self: - for n, item in enumerate(iterable, 1): - self.report(n) - yield item + def iterate(self, iterable): + """ + Report the status as the iterable is consumed. + """ + with self: + for n, item in enumerate(iterable, 1): + self.report(n) + yield item class SimpleProgressBar(AbstractProgressBar): - _PROG_DISPGLYPH = itertools.cycle(['|', '/', '-', '\\']) + _PROG_DISPGLYPH = itertools.cycle(['|', '/', '-', '\\']) - def get_bar(self, amt): - bar = next(self._PROG_DISPGLYPH) - template = ' [{bar:^{bar_len}}]' - summary = self.summary('{amt}') - template += summary - empty = template.format( - bar='', - bar_len=0, - amt=amt, - ) - bar_len = self.size - len(empty) - return template.format(**locals()) + def get_bar(self, amt): + bar = next(self._PROG_DISPGLYPH) + template = ' [{bar:^{bar_len}}]' + summary = self.summary('{amt}') + template += summary + empty = template.format( + bar='', + bar_len=0, + amt=amt, + ) + bar_len = self.size - len(empty) + return template.format(**locals()) - @classmethod - def demo(cls): - bar3 = cls(unit='cubes', size=30) - with bar3: - for x in six.moves.range(1, 759): - bar3.report(x) - time.sleep(0.01) + @classmethod + def demo(cls): + bar3 = cls(unit='cubes', size=30) + with bar3: + for x in range(1, 759): + bar3.report(x) + time.sleep(0.01) class TargetProgressBar(AbstractProgressBar): - def __init__(self, total=None, unit='', size=70): - """ - Size is the nominal size in characters - """ - self.total = total - super(TargetProgressBar, self).__init__(unit, size) + def __init__(self, total=None, unit='', size=70): + """ + Size is the nominal size in characters + """ + self.total = total + super(TargetProgressBar, self).__init__(unit, size) - def get_bar(self, amt): - template = ' [{bar:<{bar_len}}]' - completed = amt / self.total - percent = int(completed * 100) - percent_str = ' {percent:3}%' - template += percent_str - summary = self.summary('{amt}/{total}') - template += summary - empty = template.format( - total=self.total, - bar='', - bar_len=0, - **locals() - ) - bar_len = self.size - len(empty) - bar = '=' * int(completed * bar_len) - return template.format(total=self.total, **locals()) + def get_bar(self, amt): + template = ' [{bar:<{bar_len}}]' + completed = amt / self.total + percent = int(completed * 100) + percent_str = ' {percent:3}%' + template += percent_str + summary = self.summary('{amt}/{total}') + template += summary + empty = template.format(total=self.total, bar='', bar_len=0, **locals()) + bar_len = self.size - len(empty) + bar = '=' * int(completed * bar_len) + return template.format(total=self.total, **locals()) - @classmethod - def demo(cls): - bar1 = cls(100, 'blocks') - with bar1: - for x in six.moves.range(1, 101): - bar1.report(x) - time.sleep(0.05) + @classmethod + def demo(cls): + bar1 = cls(100, 'blocks') + with bar1: + for x in range(1, 101): + bar1.report(x) + time.sleep(0.05) - bar2 = cls(758, size=50) - with bar2: - for x in six.moves.range(1, 759): - bar2.report(x) - time.sleep(0.01) + bar2 = cls(758, size=50) + with bar2: + for x in range(1, 759): + bar2.report(x) + time.sleep(0.01) - def finish(self): - self.report(self.total) - super(TargetProgressBar, self).finish() + def finish(self): + self.report(self.total) + super(TargetProgressBar, self).finish() def countdown(template, duration=datetime.timedelta(seconds=5)): - """ - Do a countdown for duration, printing the template (which may accept one - positional argument). Template should be something like - ``countdown complete in {} seconds.`` - """ - now = datetime.datetime.now() - deadline = now + duration - remaining = deadline - datetime.datetime.now() - while remaining: - remaining = deadline - datetime.datetime.now() - remaining = max(datetime.timedelta(), remaining) - msg = template.format(remaining.total_seconds()) - print(msg, end=' '*10) - sys.stdout.flush() - time.sleep(.1) - print('\b'*80, end='') - sys.stdout.flush() - print() + """ + Do a countdown for duration, printing the template (which may accept one + positional argument). Template should be something like + ``countdown complete in {} seconds.`` + """ + now = datetime.datetime.now() + deadline = now + duration + remaining = deadline - datetime.datetime.now() + while remaining: + remaining = deadline - datetime.datetime.now() + remaining = max(datetime.timedelta(), remaining) + msg = template.format(remaining.total_seconds()) + print(msg, end=' ' * 10) + sys.stdout.flush() + time.sleep(0.1) + print('\b' * 80, end='') + sys.stdout.flush() + print() diff --git a/libs/win/jaraco/windows/api/clipboard.py b/libs/win/jaraco/windows/api/clipboard.py index d871aaa9..80a751f8 100644 --- a/libs/win/jaraco/windows/api/clipboard.py +++ b/libs/win/jaraco/windows/api/clipboard.py @@ -30,16 +30,16 @@ CF_GDIOBJFIRST = 0x0300 CF_GDIOBJLAST = 0x03FF RegisterClipboardFormat = ctypes.windll.user32.RegisterClipboardFormatW -RegisterClipboardFormat.argtypes = ctypes.wintypes.LPWSTR, +RegisterClipboardFormat.argtypes = (ctypes.wintypes.LPWSTR,) RegisterClipboardFormat.restype = ctypes.wintypes.UINT CF_HTML = RegisterClipboardFormat('HTML Format') EnumClipboardFormats = ctypes.windll.user32.EnumClipboardFormats -EnumClipboardFormats.argtypes = ctypes.wintypes.UINT, +EnumClipboardFormats.argtypes = (ctypes.wintypes.UINT,) EnumClipboardFormats.restype = ctypes.wintypes.UINT GetClipboardData = ctypes.windll.user32.GetClipboardData -GetClipboardData.argtypes = ctypes.wintypes.UINT, +GetClipboardData.argtypes = (ctypes.wintypes.UINT,) GetClipboardData.restype = ctypes.wintypes.HANDLE SetClipboardData = ctypes.windll.user32.SetClipboardData @@ -47,7 +47,7 @@ SetClipboardData.argtypes = ctypes.wintypes.UINT, ctypes.wintypes.HANDLE SetClipboardData.restype = ctypes.wintypes.HANDLE OpenClipboard = ctypes.windll.user32.OpenClipboard -OpenClipboard.argtypes = ctypes.wintypes.HANDLE, +OpenClipboard.argtypes = (ctypes.wintypes.HANDLE,) OpenClipboard.restype = ctypes.wintypes.BOOL ctypes.windll.user32.CloseClipboard.restype = ctypes.wintypes.BOOL diff --git a/libs/win/jaraco/windows/api/credential.py b/libs/win/jaraco/windows/api/credential.py index 003c3cb3..db1deb9e 100644 --- a/libs/win/jaraco/windows/api/credential.py +++ b/libs/win/jaraco/windows/api/credential.py @@ -5,58 +5,52 @@ Support for Credential Vault import ctypes from ctypes.wintypes import DWORD, LPCWSTR, BOOL, LPWSTR, FILETIME + try: - from ctypes.wintypes import LPBYTE + from ctypes.wintypes import LPBYTE except ImportError: - LPBYTE = ctypes.POINTER(ctypes.wintypes.BYTE) + LPBYTE = ctypes.POINTER(ctypes.wintypes.BYTE) # type: ignore class CredentialAttribute(ctypes.Structure): - _fields_ = [] + _fields_ = [] # type: ignore class Credential(ctypes.Structure): - _fields_ = [ - ('flags', DWORD), - ('type', DWORD), - ('target_name', LPWSTR), - ('comment', LPWSTR), - ('last_written', FILETIME), - ('credential_blob_size', DWORD), - ('credential_blob', LPBYTE), - ('persist', DWORD), - ('attribute_count', DWORD), - ('attributes', ctypes.POINTER(CredentialAttribute)), - ('target_alias', LPWSTR), - ('user_name', LPWSTR), - ] + _fields_ = [ + ('flags', DWORD), + ('type', DWORD), + ('target_name', LPWSTR), + ('comment', LPWSTR), + ('last_written', FILETIME), + ('credential_blob_size', DWORD), + ('credential_blob', LPBYTE), + ('persist', DWORD), + ('attribute_count', DWORD), + ('attributes', ctypes.POINTER(CredentialAttribute)), + ('target_alias', LPWSTR), + ('user_name', LPWSTR), + ] - def __del__(self): - ctypes.windll.advapi32.CredFree(ctypes.byref(self)) + def __del__(self): + ctypes.windll.advapi32.CredFree(ctypes.byref(self)) PCREDENTIAL = ctypes.POINTER(Credential) CredRead = ctypes.windll.advapi32.CredReadW CredRead.argtypes = ( - LPCWSTR, # TargetName - DWORD, # Type - DWORD, # Flags - ctypes.POINTER(PCREDENTIAL), # Credential + LPCWSTR, # TargetName + DWORD, # Type + DWORD, # Flags + ctypes.POINTER(PCREDENTIAL), # Credential ) CredRead.restype = BOOL CredWrite = ctypes.windll.advapi32.CredWriteW -CredWrite.argtypes = ( - PCREDENTIAL, # Credential - DWORD, # Flags -) +CredWrite.argtypes = (PCREDENTIAL, DWORD) # Credential # Flags CredWrite.restype = BOOL CredDelete = ctypes.windll.advapi32.CredDeleteW -CredDelete.argtypes = ( - LPCWSTR, # TargetName - DWORD, # Type - DWORD, # Flags -) +CredDelete.argtypes = (LPCWSTR, DWORD, DWORD) # TargetName # Type # Flags CredDelete.restype = BOOL diff --git a/libs/win/jaraco/windows/api/environ.py b/libs/win/jaraco/windows/api/environ.py index f394da02..a7882364 100644 --- a/libs/win/jaraco/windows/api/environ.py +++ b/libs/win/jaraco/windows/api/environ.py @@ -7,7 +7,7 @@ SetEnvironmentVariable.argtypes = [ctypes.wintypes.LPCWSTR] * 2 GetEnvironmentVariable = ctypes.windll.kernel32.GetEnvironmentVariableW GetEnvironmentVariable.restype = ctypes.wintypes.BOOL GetEnvironmentVariable.argtypes = [ - ctypes.wintypes.LPCWSTR, - ctypes.wintypes.LPWSTR, - ctypes.wintypes.DWORD, + ctypes.wintypes.LPCWSTR, + ctypes.wintypes.LPWSTR, + ctypes.wintypes.DWORD, ] diff --git a/libs/win/jaraco/windows/api/event.py b/libs/win/jaraco/windows/api/event.py index 5d2818c6..5b5d9f9d 100644 --- a/libs/win/jaraco/windows/api/event.py +++ b/libs/win/jaraco/windows/api/event.py @@ -1,19 +1,12 @@ from ctypes import windll, POINTER -from ctypes.wintypes import ( - LPWSTR, DWORD, LPVOID, HANDLE, BOOL, -) +from ctypes.wintypes import LPWSTR, DWORD, LPVOID, HANDLE, BOOL CreateEvent = windll.kernel32.CreateEventW -CreateEvent.argtypes = ( - LPVOID, # LPSECURITY_ATTRIBUTES - BOOL, - BOOL, - LPWSTR, -) +CreateEvent.argtypes = (LPVOID, BOOL, BOOL, LPWSTR) # LPSECURITY_ATTRIBUTES CreateEvent.restype = HANDLE SetEvent = windll.kernel32.SetEvent -SetEvent.argtypes = HANDLE, +SetEvent.argtypes = (HANDLE,) SetEvent.restype = BOOL WaitForSingleObject = windll.kernel32.WaitForSingleObject @@ -26,11 +19,11 @@ _WaitForMultipleObjects.restype = DWORD def WaitForMultipleObjects(handles, wait_all=False, timeout=0): - n_handles = len(handles) - handle_array = (HANDLE * n_handles)() - for index, handle in enumerate(handles): - handle_array[index] = handle - return _WaitForMultipleObjects(n_handles, handle_array, wait_all, timeout) + n_handles = len(handles) + handle_array = (HANDLE * n_handles)() + for index, handle in enumerate(handles): + handle_array[index] = handle + return _WaitForMultipleObjects(n_handles, handle_array, wait_all, timeout) WAIT_OBJECT_0 = 0 diff --git a/libs/win/jaraco/windows/api/filesystem.py b/libs/win/jaraco/windows/api/filesystem.py index fbd999de..b06dc6d2 100644 --- a/libs/win/jaraco/windows/api/filesystem.py +++ b/libs/win/jaraco/windows/api/filesystem.py @@ -2,22 +2,24 @@ import ctypes.wintypes CreateSymbolicLink = ctypes.windll.kernel32.CreateSymbolicLinkW CreateSymbolicLink.argtypes = ( - ctypes.wintypes.LPWSTR, - ctypes.wintypes.LPWSTR, - ctypes.wintypes.DWORD, + ctypes.wintypes.LPWSTR, + ctypes.wintypes.LPWSTR, + ctypes.wintypes.DWORD, ) CreateSymbolicLink.restype = ctypes.wintypes.BOOLEAN +SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE = 0x2 + CreateHardLink = ctypes.windll.kernel32.CreateHardLinkW CreateHardLink.argtypes = ( - ctypes.wintypes.LPWSTR, - ctypes.wintypes.LPWSTR, - ctypes.wintypes.LPVOID, # reserved for LPSECURITY_ATTRIBUTES + ctypes.wintypes.LPWSTR, + ctypes.wintypes.LPWSTR, + ctypes.wintypes.LPVOID, # reserved for LPSECURITY_ATTRIBUTES ) CreateHardLink.restype = ctypes.wintypes.BOOLEAN GetFileAttributes = ctypes.windll.kernel32.GetFileAttributesW -GetFileAttributes.argtypes = ctypes.wintypes.LPWSTR, +GetFileAttributes.argtypes = (ctypes.wintypes.LPWSTR,) GetFileAttributes.restype = ctypes.wintypes.DWORD SetFileAttributes = ctypes.windll.kernel32.SetFileAttributesW @@ -28,31 +30,33 @@ MAX_PATH = 260 GetFinalPathNameByHandle = ctypes.windll.kernel32.GetFinalPathNameByHandleW GetFinalPathNameByHandle.argtypes = ( - ctypes.wintypes.HANDLE, ctypes.wintypes.LPWSTR, ctypes.wintypes.DWORD, - ctypes.wintypes.DWORD, + ctypes.wintypes.HANDLE, + ctypes.wintypes.LPWSTR, + ctypes.wintypes.DWORD, + ctypes.wintypes.DWORD, ) GetFinalPathNameByHandle.restype = ctypes.wintypes.DWORD class SECURITY_ATTRIBUTES(ctypes.Structure): - _fields_ = ( - ('length', ctypes.wintypes.DWORD), - ('p_security_descriptor', ctypes.wintypes.LPVOID), - ('inherit_handle', ctypes.wintypes.BOOLEAN), - ) + _fields_ = ( + ('length', ctypes.wintypes.DWORD), + ('p_security_descriptor', ctypes.wintypes.LPVOID), + ('inherit_handle', ctypes.wintypes.BOOLEAN), + ) LPSECURITY_ATTRIBUTES = ctypes.POINTER(SECURITY_ATTRIBUTES) CreateFile = ctypes.windll.kernel32.CreateFileW CreateFile.argtypes = ( - ctypes.wintypes.LPWSTR, - ctypes.wintypes.DWORD, - ctypes.wintypes.DWORD, - LPSECURITY_ATTRIBUTES, - ctypes.wintypes.DWORD, - ctypes.wintypes.DWORD, - ctypes.wintypes.HANDLE, + ctypes.wintypes.LPWSTR, + ctypes.wintypes.DWORD, + ctypes.wintypes.DWORD, + LPSECURITY_ATTRIBUTES, + ctypes.wintypes.DWORD, + ctypes.wintypes.DWORD, + ctypes.wintypes.HANDLE, ) CreateFile.restype = ctypes.wintypes.HANDLE FILE_SHARE_READ = 1 @@ -83,56 +87,56 @@ CloseHandle.restype = ctypes.wintypes.BOOLEAN class WIN32_FIND_DATA(ctypes.wintypes.WIN32_FIND_DATAW): - """ - _fields_ = [ - ("dwFileAttributes", DWORD), - ("ftCreationTime", FILETIME), - ("ftLastAccessTime", FILETIME), - ("ftLastWriteTime", FILETIME), - ("nFileSizeHigh", DWORD), - ("nFileSizeLow", DWORD), - ("dwReserved0", DWORD), - ("dwReserved1", DWORD), - ("cFileName", WCHAR * MAX_PATH), - ("cAlternateFileName", WCHAR * 14)] - ] - """ + """ + _fields_ = [ + ("dwFileAttributes", DWORD), + ("ftCreationTime", FILETIME), + ("ftLastAccessTime", FILETIME), + ("ftLastWriteTime", FILETIME), + ("nFileSizeHigh", DWORD), + ("nFileSizeLow", DWORD), + ("dwReserved0", DWORD), + ("dwReserved1", DWORD), + ("cFileName", WCHAR * MAX_PATH), + ("cAlternateFileName", WCHAR * 14)] + ] + """ - @property - def file_attributes(self): - return self.dwFileAttributes + @property + def file_attributes(self): + return self.dwFileAttributes - @property - def creation_time(self): - return self.ftCreationTime + @property + def creation_time(self): + return self.ftCreationTime - @property - def last_access_time(self): - return self.ftLastAccessTime + @property + def last_access_time(self): + return self.ftLastAccessTime - @property - def last_write_time(self): - return self.ftLastWriteTime + @property + def last_write_time(self): + return self.ftLastWriteTime - @property - def file_size_words(self): - return [self.nFileSizeHigh, self.nFileSizeLow] + @property + def file_size_words(self): + return [self.nFileSizeHigh, self.nFileSizeLow] - @property - def reserved(self): - return [self.dwReserved0, self.dwReserved1] + @property + def reserved(self): + return [self.dwReserved0, self.dwReserved1] - @property - def filename(self): - return self.cFileName + @property + def filename(self): + return self.cFileName - @property - def alternate_filename(self): - return self.cAlternateFileName + @property + def alternate_filename(self): + return self.cAlternateFileName - @property - def file_size(self): - return self.nFileSizeHigh << 32 + self.nFileSizeLow + @property + def file_size(self): + return self.nFileSizeHigh << 32 + self.nFileSizeLow LPWIN32_FIND_DATA = ctypes.POINTER(ctypes.wintypes.WIN32_FIND_DATAW) @@ -144,7 +148,7 @@ FindNextFile = ctypes.windll.kernel32.FindNextFileW FindNextFile.argtypes = (ctypes.wintypes.HANDLE, LPWIN32_FIND_DATA) FindNextFile.restype = ctypes.wintypes.BOOLEAN -ctypes.windll.kernel32.FindClose.argtypes = ctypes.wintypes.HANDLE, +ctypes.windll.kernel32.FindClose.argtypes = (ctypes.wintypes.HANDLE,) SCS_32BIT_BINARY = 0 # A 32-bit Windows-based application SCS_64BIT_BINARY = 6 # A 64-bit Windows-based application @@ -156,7 +160,8 @@ SCS_WOW_BINARY = 2 # A 16-bit Windows-based application _GetBinaryType = ctypes.windll.kernel32.GetBinaryTypeW _GetBinaryType.argtypes = ( - ctypes.wintypes.LPWSTR, ctypes.POINTER(ctypes.wintypes.DWORD), + ctypes.wintypes.LPWSTR, + ctypes.POINTER(ctypes.wintypes.DWORD), ) _GetBinaryType.restype = ctypes.wintypes.BOOL @@ -164,47 +169,47 @@ FILEOP_FLAGS = ctypes.wintypes.WORD class BY_HANDLE_FILE_INFORMATION(ctypes.Structure): - _fields_ = [ - ('file_attributes', ctypes.wintypes.DWORD), - ('creation_time', ctypes.wintypes.FILETIME), - ('last_access_time', ctypes.wintypes.FILETIME), - ('last_write_time', ctypes.wintypes.FILETIME), - ('volume_serial_number', ctypes.wintypes.DWORD), - ('file_size_high', ctypes.wintypes.DWORD), - ('file_size_low', ctypes.wintypes.DWORD), - ('number_of_links', ctypes.wintypes.DWORD), - ('file_index_high', ctypes.wintypes.DWORD), - ('file_index_low', ctypes.wintypes.DWORD), - ] + _fields_ = [ + ('file_attributes', ctypes.wintypes.DWORD), + ('creation_time', ctypes.wintypes.FILETIME), + ('last_access_time', ctypes.wintypes.FILETIME), + ('last_write_time', ctypes.wintypes.FILETIME), + ('volume_serial_number', ctypes.wintypes.DWORD), + ('file_size_high', ctypes.wintypes.DWORD), + ('file_size_low', ctypes.wintypes.DWORD), + ('number_of_links', ctypes.wintypes.DWORD), + ('file_index_high', ctypes.wintypes.DWORD), + ('file_index_low', ctypes.wintypes.DWORD), + ] - @property - def file_size(self): - return (self.file_size_high << 32) + self.file_size_low + @property + def file_size(self): + return (self.file_size_high << 32) + self.file_size_low - @property - def file_index(self): - return (self.file_index_high << 32) + self.file_index_low + @property + def file_index(self): + return (self.file_index_high << 32) + self.file_index_low GetFileInformationByHandle = ctypes.windll.kernel32.GetFileInformationByHandle GetFileInformationByHandle.restype = ctypes.wintypes.BOOL GetFileInformationByHandle.argtypes = ( - ctypes.wintypes.HANDLE, - ctypes.POINTER(BY_HANDLE_FILE_INFORMATION), + ctypes.wintypes.HANDLE, + ctypes.POINTER(BY_HANDLE_FILE_INFORMATION), ) class SHFILEOPSTRUCT(ctypes.Structure): - _fields_ = [ - ('status_dialog', ctypes.wintypes.HWND), - ('operation', ctypes.wintypes.UINT), - ('from_', ctypes.wintypes.LPWSTR), - ('to', ctypes.wintypes.LPWSTR), - ('flags', FILEOP_FLAGS), - ('operations_aborted', ctypes.wintypes.BOOL), - ('name_mapping_handles', ctypes.wintypes.LPVOID), - ('progress_title', ctypes.wintypes.LPWSTR), - ] + _fields_ = [ + ('status_dialog', ctypes.wintypes.HWND), + ('operation', ctypes.wintypes.UINT), + ('from_', ctypes.wintypes.LPWSTR), + ('to', ctypes.wintypes.LPWSTR), + ('flags', FILEOP_FLAGS), + ('operations_aborted', ctypes.wintypes.BOOL), + ('name_mapping_handles', ctypes.wintypes.LPVOID), + ('progress_title', ctypes.wintypes.LPWSTR), + ] _SHFileOperation = ctypes.windll.shell32.SHFileOperationW @@ -218,12 +223,12 @@ FO_DELETE = 3 ReplaceFile = ctypes.windll.kernel32.ReplaceFileW ReplaceFile.restype = ctypes.wintypes.BOOL ReplaceFile.argtypes = [ - ctypes.wintypes.LPWSTR, - ctypes.wintypes.LPWSTR, - ctypes.wintypes.LPWSTR, - ctypes.wintypes.DWORD, - ctypes.wintypes.LPVOID, - ctypes.wintypes.LPVOID, + ctypes.wintypes.LPWSTR, + ctypes.wintypes.LPWSTR, + ctypes.wintypes.LPWSTR, + ctypes.wintypes.DWORD, + ctypes.wintypes.LPVOID, + ctypes.wintypes.LPVOID, ] REPLACEFILE_WRITE_THROUGH = 0x1 @@ -232,20 +237,20 @@ REPLACEFILE_IGNORE_ACL_ERRORS = 0x4 class STAT_STRUCT(ctypes.Structure): - _fields_ = [ - ('dev', ctypes.c_uint), - ('ino', ctypes.c_ushort), - ('mode', ctypes.c_ushort), - ('nlink', ctypes.c_short), - ('uid', ctypes.c_short), - ('gid', ctypes.c_short), - ('rdev', ctypes.c_uint), - # the following 4 fields are ctypes.c_uint64 for _stat64 - ('size', ctypes.c_uint), - ('atime', ctypes.c_uint), - ('mtime', ctypes.c_uint), - ('ctime', ctypes.c_uint), - ] + _fields_ = [ + ('dev', ctypes.c_uint), + ('ino', ctypes.c_ushort), + ('mode', ctypes.c_ushort), + ('nlink', ctypes.c_short), + ('uid', ctypes.c_short), + ('gid', ctypes.c_short), + ('rdev', ctypes.c_uint), + # the following 4 fields are ctypes.c_uint64 for _stat64 + ('size', ctypes.c_uint), + ('atime', ctypes.c_uint), + ('mtime', ctypes.c_uint), + ('ctime', ctypes.c_uint), + ] _wstat = ctypes.windll.msvcrt._wstat @@ -254,64 +259,64 @@ _wstat.restype = ctypes.c_int FILE_NOTIFY_CHANGE_LAST_WRITE = 0x10 -FindFirstChangeNotification = ( - ctypes.windll.kernel32.FindFirstChangeNotificationW) +FindFirstChangeNotification = ctypes.windll.kernel32.FindFirstChangeNotificationW FindFirstChangeNotification.argtypes = ( - ctypes.wintypes.LPWSTR, ctypes.wintypes.BOOL, ctypes.wintypes.DWORD, + ctypes.wintypes.LPWSTR, + ctypes.wintypes.BOOL, + ctypes.wintypes.DWORD, ) FindFirstChangeNotification.restype = ctypes.wintypes.HANDLE -FindCloseChangeNotification = ( - ctypes.windll.kernel32.FindCloseChangeNotification) -FindCloseChangeNotification.argtypes = ctypes.wintypes.HANDLE, +FindCloseChangeNotification = ctypes.windll.kernel32.FindCloseChangeNotification +FindCloseChangeNotification.argtypes = (ctypes.wintypes.HANDLE,) FindCloseChangeNotification.restype = ctypes.wintypes.BOOL FindNextChangeNotification = ctypes.windll.kernel32.FindNextChangeNotification -FindNextChangeNotification.argtypes = ctypes.wintypes.HANDLE, +FindNextChangeNotification.argtypes = (ctypes.wintypes.HANDLE,) FindNextChangeNotification.restype = ctypes.wintypes.BOOL FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000 IO_REPARSE_TAG_SYMLINK = 0xA000000C -FSCTL_GET_REPARSE_POINT = 0x900a8 +FSCTL_GET_REPARSE_POINT = 0x900A8 LPDWORD = ctypes.POINTER(ctypes.wintypes.DWORD) LPOVERLAPPED = ctypes.wintypes.LPVOID DeviceIoControl = ctypes.windll.kernel32.DeviceIoControl DeviceIoControl.argtypes = [ - ctypes.wintypes.HANDLE, - ctypes.wintypes.DWORD, - ctypes.wintypes.LPVOID, - ctypes.wintypes.DWORD, - ctypes.wintypes.LPVOID, - ctypes.wintypes.DWORD, - LPDWORD, - LPOVERLAPPED, + ctypes.wintypes.HANDLE, + ctypes.wintypes.DWORD, + ctypes.wintypes.LPVOID, + ctypes.wintypes.DWORD, + ctypes.wintypes.LPVOID, + ctypes.wintypes.DWORD, + LPDWORD, + LPOVERLAPPED, ] DeviceIoControl.restype = ctypes.wintypes.BOOL class REPARSE_DATA_BUFFER(ctypes.Structure): - _fields_ = [ - ('tag', ctypes.c_ulong), - ('data_length', ctypes.c_ushort), - ('reserved', ctypes.c_ushort), - ('substitute_name_offset', ctypes.c_ushort), - ('substitute_name_length', ctypes.c_ushort), - ('print_name_offset', ctypes.c_ushort), - ('print_name_length', ctypes.c_ushort), - ('flags', ctypes.c_ulong), - ('path_buffer', ctypes.c_byte * 1), - ] + _fields_ = [ + ('tag', ctypes.c_ulong), + ('data_length', ctypes.c_ushort), + ('reserved', ctypes.c_ushort), + ('substitute_name_offset', ctypes.c_ushort), + ('substitute_name_length', ctypes.c_ushort), + ('print_name_offset', ctypes.c_ushort), + ('print_name_length', ctypes.c_ushort), + ('flags', ctypes.c_ulong), + ('path_buffer', ctypes.c_byte * 1), + ] - def get_print_name(self): - wchar_size = ctypes.sizeof(ctypes.wintypes.WCHAR) - arr_typ = ctypes.wintypes.WCHAR * (self.print_name_length // wchar_size) - data = ctypes.byref(self.path_buffer, self.print_name_offset) - return ctypes.cast(data, ctypes.POINTER(arr_typ)).contents.value + def get_print_name(self): + wchar_size = ctypes.sizeof(ctypes.wintypes.WCHAR) + arr_typ = ctypes.wintypes.WCHAR * (self.print_name_length // wchar_size) + data = ctypes.byref(self.path_buffer, self.print_name_offset) + return ctypes.cast(data, ctypes.POINTER(arr_typ)).contents.value - def get_substitute_name(self): - wchar_size = ctypes.sizeof(ctypes.wintypes.WCHAR) - arr_typ = ctypes.wintypes.WCHAR * (self.substitute_name_length // wchar_size) - data = ctypes.byref(self.path_buffer, self.substitute_name_offset) - return ctypes.cast(data, ctypes.POINTER(arr_typ)).contents.value + def get_substitute_name(self): + wchar_size = ctypes.sizeof(ctypes.wintypes.WCHAR) + arr_typ = ctypes.wintypes.WCHAR * (self.substitute_name_length // wchar_size) + data = ctypes.byref(self.path_buffer, self.substitute_name_offset) + return ctypes.cast(data, ctypes.POINTER(arr_typ)).contents.value diff --git a/libs/win/jaraco/windows/api/inet.py b/libs/win/jaraco/windows/api/inet.py index 36c8e37c..f144b0f3 100644 --- a/libs/win/jaraco/windows/api/inet.py +++ b/libs/win/jaraco/windows/api/inet.py @@ -4,11 +4,11 @@ from ctypes.wintypes import DWORD, WCHAR, BYTE, BOOL # from mprapi.h -MAX_INTERFACE_NAME_LEN = 2**8 +MAX_INTERFACE_NAME_LEN = 2 ** 8 # from iprtrmib.h -MAXLEN_PHYSADDR = 2**3 -MAXLEN_IFDESCR = 2**8 +MAXLEN_PHYSADDR = 2 ** 3 +MAXLEN_IFDESCR = 2 ** 8 # from iptypes.h MAX_ADAPTER_ADDRESS_LENGTH = 8 @@ -16,114 +16,102 @@ MAX_DHCPV6_DUID_LENGTH = 130 class MIB_IFROW(ctypes.Structure): - _fields_ = ( - ('name', WCHAR * MAX_INTERFACE_NAME_LEN), - ('index', DWORD), - ('type', DWORD), - ('MTU', DWORD), - ('speed', DWORD), - ('physical_address_length', DWORD), - ('physical_address_raw', BYTE * MAXLEN_PHYSADDR), - ('admin_status', DWORD), - ('operational_status', DWORD), - ('last_change', DWORD), - ('octets_received', DWORD), - ('unicast_packets_received', DWORD), - ('non_unicast_packets_received', DWORD), - ('incoming_discards', DWORD), - ('incoming_errors', DWORD), - ('incoming_unknown_protocols', DWORD), - ('octets_sent', DWORD), - ('unicast_packets_sent', DWORD), - ('non_unicast_packets_sent', DWORD), - ('outgoing_discards', DWORD), - ('outgoing_errors', DWORD), - ('outgoing_queue_length', DWORD), - ('description_length', DWORD), - ('description_raw', ctypes.c_char * MAXLEN_IFDESCR), - ) + _fields_ = ( + ('name', WCHAR * MAX_INTERFACE_NAME_LEN), + ('index', DWORD), + ('type', DWORD), + ('MTU', DWORD), + ('speed', DWORD), + ('physical_address_length', DWORD), + ('physical_address_raw', BYTE * MAXLEN_PHYSADDR), + ('admin_status', DWORD), + ('operational_status', DWORD), + ('last_change', DWORD), + ('octets_received', DWORD), + ('unicast_packets_received', DWORD), + ('non_unicast_packets_received', DWORD), + ('incoming_discards', DWORD), + ('incoming_errors', DWORD), + ('incoming_unknown_protocols', DWORD), + ('octets_sent', DWORD), + ('unicast_packets_sent', DWORD), + ('non_unicast_packets_sent', DWORD), + ('outgoing_discards', DWORD), + ('outgoing_errors', DWORD), + ('outgoing_queue_length', DWORD), + ('description_length', DWORD), + ('description_raw', ctypes.c_char * MAXLEN_IFDESCR), + ) - def _get_binary_property(self, name): - val_prop = '{0}_raw'.format(name) - val = getattr(self, val_prop) - len_prop = '{0}_length'.format(name) - length = getattr(self, len_prop) - return str(memoryview(val))[:length] + def _get_binary_property(self, name): + val_prop = '{0}_raw'.format(name) + val = getattr(self, val_prop) + len_prop = '{0}_length'.format(name) + length = getattr(self, len_prop) + return str(memoryview(val))[:length] - @property - def physical_address(self): - return self._get_binary_property('physical_address') + @property + def physical_address(self): + return self._get_binary_property('physical_address') - @property - def description(self): - return self._get_binary_property('description') + @property + def description(self): + return self._get_binary_property('description') class MIB_IFTABLE(ctypes.Structure): - _fields_ = ( - ('num_entries', DWORD), # dwNumEntries - ('entries', MIB_IFROW * 0), # table - ) + _fields_ = ( + ('num_entries', DWORD), # dwNumEntries + ('entries', MIB_IFROW * 0), # table + ) class MIB_IPADDRROW(ctypes.Structure): - _fields_ = ( - ('address_num', DWORD), - ('index', DWORD), - ('mask', DWORD), - ('broadcast_address', DWORD), - ('reassembly_size', DWORD), - ('unused', ctypes.c_ushort), - ('type', ctypes.c_ushort), - ) + _fields_ = ( + ('address_num', DWORD), + ('index', DWORD), + ('mask', DWORD), + ('broadcast_address', DWORD), + ('reassembly_size', DWORD), + ('unused', ctypes.c_ushort), + ('type', ctypes.c_ushort), + ) - @property - def address(self): - "The address in big-endian" - _ = struct.pack('L', self.address_num) - return struct.unpack('!L', _)[0] + @property + def address(self): + "The address in big-endian" + _ = struct.pack('L', self.address_num) + return struct.unpack('!L', _)[0] class MIB_IPADDRTABLE(ctypes.Structure): - _fields_ = ( - ('num_entries', DWORD), - ('entries', MIB_IPADDRROW * 0), - ) + _fields_ = (('num_entries', DWORD), ('entries', MIB_IPADDRROW * 0)) class SOCKADDR(ctypes.Structure): - _fields_ = ( - ('family', ctypes.c_ushort), - ('data', ctypes.c_byte * 14), - ) + _fields_ = (('family', ctypes.c_ushort), ('data', ctypes.c_byte * 14)) LPSOCKADDR = ctypes.POINTER(SOCKADDR) class SOCKET_ADDRESS(ctypes.Structure): - _fields_ = [ - ('address', LPSOCKADDR), - ('length', ctypes.c_int), - ] + _fields_ = [('address', LPSOCKADDR), ('length', ctypes.c_int)] class _IP_ADAPTER_ADDRESSES_METRIC(ctypes.Structure): - _fields_ = [ - ('length', ctypes.c_ulong), - ('interface_index', DWORD), - ] + _fields_ = [('length', ctypes.c_ulong), ('interface_index', DWORD)] class _IP_ADAPTER_ADDRESSES_U1(ctypes.Union): - _fields_ = [ - ('alignment', ctypes.c_ulonglong), - ('metric', _IP_ADAPTER_ADDRESSES_METRIC), - ] + _fields_ = [ + ('alignment', ctypes.c_ulonglong), + ('metric', _IP_ADAPTER_ADDRESSES_METRIC), + ] class IP_ADAPTER_ADDRESSES(ctypes.Structure): - pass + pass LP_IP_ADAPTER_ADDRESSES = ctypes.POINTER(IP_ADAPTER_ADDRESSES) @@ -149,69 +137,69 @@ NET_IF_CONNECTION_TYPE = ctypes.c_uint # enum TUNNEL_TYPE = ctypes.c_uint # enum IP_ADAPTER_ADDRESSES._fields_ = [ - # ('u', _IP_ADAPTER_ADDRESSES_U1), - ('length', ctypes.c_ulong), - ('interface_index', DWORD), - ('next', LP_IP_ADAPTER_ADDRESSES), - ('adapter_name', ctypes.c_char_p), - ('first_unicast_address', PIP_ADAPTER_UNICAST_ADDRESS), - ('first_anycast_address', PIP_ADAPTER_ANYCAST_ADDRESS), - ('first_multicast_address', PIP_ADAPTER_MULTICAST_ADDRESS), - ('first_dns_server_address', PIP_ADAPTER_DNS_SERVER_ADDRESS), - ('dns_suffix', ctypes.c_wchar_p), - ('description', ctypes.c_wchar_p), - ('friendly_name', ctypes.c_wchar_p), - ('byte', BYTE * MAX_ADAPTER_ADDRESS_LENGTH), - ('physical_address_length', DWORD), - ('flags', DWORD), - ('mtu', DWORD), - ('interface_type', DWORD), - ('oper_status', IF_OPER_STATUS), - ('ipv6_interface_index', DWORD), - ('zone_indices', DWORD), - ('first_prefix', PIP_ADAPTER_PREFIX), - ('transmit_link_speed', ctypes.c_uint64), - ('receive_link_speed', ctypes.c_uint64), - ('first_wins_server_address', PIP_ADAPTER_WINS_SERVER_ADDRESS_LH), - ('first_gateway_address', PIP_ADAPTER_GATEWAY_ADDRESS_LH), - ('ipv4_metric', ctypes.c_ulong), - ('ipv6_metric', ctypes.c_ulong), - ('luid', IF_LUID), - ('dhcpv4_server', SOCKET_ADDRESS), - ('compartment_id', NET_IF_COMPARTMENT_ID), - ('network_guid', NET_IF_NETWORK_GUID), - ('connection_type', NET_IF_CONNECTION_TYPE), - ('tunnel_type', TUNNEL_TYPE), - ('dhcpv6_server', SOCKET_ADDRESS), - ('dhcpv6_client_duid', ctypes.c_byte * MAX_DHCPV6_DUID_LENGTH), - ('dhcpv6_client_duid_length', ctypes.c_ulong), - ('dhcpv6_iaid', ctypes.c_ulong), - ('first_dns_suffix', PIP_ADAPTER_DNS_SUFFIX), + # ('u', _IP_ADAPTER_ADDRESSES_U1), + ('length', ctypes.c_ulong), + ('interface_index', DWORD), + ('next', LP_IP_ADAPTER_ADDRESSES), + ('adapter_name', ctypes.c_char_p), + ('first_unicast_address', PIP_ADAPTER_UNICAST_ADDRESS), + ('first_anycast_address', PIP_ADAPTER_ANYCAST_ADDRESS), + ('first_multicast_address', PIP_ADAPTER_MULTICAST_ADDRESS), + ('first_dns_server_address', PIP_ADAPTER_DNS_SERVER_ADDRESS), + ('dns_suffix', ctypes.c_wchar_p), + ('description', ctypes.c_wchar_p), + ('friendly_name', ctypes.c_wchar_p), + ('byte', BYTE * MAX_ADAPTER_ADDRESS_LENGTH), + ('physical_address_length', DWORD), + ('flags', DWORD), + ('mtu', DWORD), + ('interface_type', DWORD), + ('oper_status', IF_OPER_STATUS), + ('ipv6_interface_index', DWORD), + ('zone_indices', DWORD), + ('first_prefix', PIP_ADAPTER_PREFIX), + ('transmit_link_speed', ctypes.c_uint64), + ('receive_link_speed', ctypes.c_uint64), + ('first_wins_server_address', PIP_ADAPTER_WINS_SERVER_ADDRESS_LH), + ('first_gateway_address', PIP_ADAPTER_GATEWAY_ADDRESS_LH), + ('ipv4_metric', ctypes.c_ulong), + ('ipv6_metric', ctypes.c_ulong), + ('luid', IF_LUID), + ('dhcpv4_server', SOCKET_ADDRESS), + ('compartment_id', NET_IF_COMPARTMENT_ID), + ('network_guid', NET_IF_NETWORK_GUID), + ('connection_type', NET_IF_CONNECTION_TYPE), + ('tunnel_type', TUNNEL_TYPE), + ('dhcpv6_server', SOCKET_ADDRESS), + ('dhcpv6_client_duid', ctypes.c_byte * MAX_DHCPV6_DUID_LENGTH), + ('dhcpv6_client_duid_length', ctypes.c_ulong), + ('dhcpv6_iaid', ctypes.c_ulong), + ('first_dns_suffix', PIP_ADAPTER_DNS_SUFFIX), ] # define some parameters to the API Functions GetIfTable = ctypes.windll.iphlpapi.GetIfTable GetIfTable.argtypes = [ - ctypes.POINTER(MIB_IFTABLE), - ctypes.POINTER(ctypes.c_ulong), - BOOL, + ctypes.POINTER(MIB_IFTABLE), + ctypes.POINTER(ctypes.c_ulong), + BOOL, ] GetIfTable.restype = DWORD GetIpAddrTable = ctypes.windll.iphlpapi.GetIpAddrTable GetIpAddrTable.argtypes = [ - ctypes.POINTER(MIB_IPADDRTABLE), - ctypes.POINTER(ctypes.c_ulong), - BOOL, + ctypes.POINTER(MIB_IPADDRTABLE), + ctypes.POINTER(ctypes.c_ulong), + BOOL, ] GetIpAddrTable.restype = DWORD GetAdaptersAddresses = ctypes.windll.iphlpapi.GetAdaptersAddresses GetAdaptersAddresses.argtypes = [ - ctypes.c_ulong, - ctypes.c_ulong, - ctypes.c_void_p, - ctypes.POINTER(IP_ADAPTER_ADDRESSES), - ctypes.POINTER(ctypes.c_ulong), + ctypes.c_ulong, + ctypes.c_ulong, + ctypes.c_void_p, + ctypes.POINTER(IP_ADAPTER_ADDRESSES), + ctypes.POINTER(ctypes.c_ulong), ] GetAdaptersAddresses.restype = ctypes.c_ulong diff --git a/libs/win/jaraco/windows/api/library.py b/libs/win/jaraco/windows/api/library.py index 7f14a58e..736de57c 100644 --- a/libs/win/jaraco/windows/api/library.py +++ b/libs/win/jaraco/windows/api/library.py @@ -2,8 +2,8 @@ import ctypes.wintypes GetModuleFileName = ctypes.windll.kernel32.GetModuleFileNameW GetModuleFileName.argtypes = ( - ctypes.wintypes.HANDLE, - ctypes.wintypes.LPWSTR, - ctypes.wintypes.DWORD, + ctypes.wintypes.HANDLE, + ctypes.wintypes.LPWSTR, + ctypes.wintypes.DWORD, ) GetModuleFileName.restype = ctypes.wintypes.DWORD diff --git a/libs/win/jaraco/windows/api/memory.py b/libs/win/jaraco/windows/api/memory.py index 0371099c..c8b60472 100644 --- a/libs/win/jaraco/windows/api/memory.py +++ b/libs/win/jaraco/windows/api/memory.py @@ -7,25 +7,25 @@ GlobalAlloc.argtypes = ctypes.wintypes.UINT, ctypes.c_size_t GlobalAlloc.restype = ctypes.wintypes.HANDLE GlobalLock = ctypes.windll.kernel32.GlobalLock -GlobalLock.argtypes = ctypes.wintypes.HGLOBAL, +GlobalLock.argtypes = (ctypes.wintypes.HGLOBAL,) GlobalLock.restype = ctypes.wintypes.LPVOID GlobalUnlock = ctypes.windll.kernel32.GlobalUnlock -GlobalUnlock.argtypes = ctypes.wintypes.HGLOBAL, +GlobalUnlock.argtypes = (ctypes.wintypes.HGLOBAL,) GlobalUnlock.restype = ctypes.wintypes.BOOL GlobalSize = ctypes.windll.kernel32.GlobalSize -GlobalSize.argtypes = ctypes.wintypes.HGLOBAL, +GlobalSize.argtypes = (ctypes.wintypes.HGLOBAL,) GlobalSize.restype = ctypes.c_size_t CreateFileMapping = ctypes.windll.kernel32.CreateFileMappingW CreateFileMapping.argtypes = [ - ctypes.wintypes.HANDLE, - ctypes.c_void_p, - ctypes.wintypes.DWORD, - ctypes.wintypes.DWORD, - ctypes.wintypes.DWORD, - ctypes.wintypes.LPWSTR, + ctypes.wintypes.HANDLE, + ctypes.c_void_p, + ctypes.wintypes.DWORD, + ctypes.wintypes.DWORD, + ctypes.wintypes.DWORD, + ctypes.wintypes.LPWSTR, ] CreateFileMapping.restype = ctypes.wintypes.HANDLE @@ -33,13 +33,9 @@ MapViewOfFile = ctypes.windll.kernel32.MapViewOfFile MapViewOfFile.restype = ctypes.wintypes.HANDLE UnmapViewOfFile = ctypes.windll.kernel32.UnmapViewOfFile -UnmapViewOfFile.argtypes = ctypes.wintypes.HANDLE, +UnmapViewOfFile.argtypes = (ctypes.wintypes.HANDLE,) RtlMoveMemory = ctypes.windll.kernel32.RtlMoveMemory -RtlMoveMemory.argtypes = ( - ctypes.c_void_p, - ctypes.c_void_p, - ctypes.c_size_t, -) +RtlMoveMemory.argtypes = (ctypes.c_void_p, ctypes.c_void_p, ctypes.c_size_t) -ctypes.windll.kernel32.LocalFree.argtypes = ctypes.wintypes.HLOCAL, +ctypes.windll.kernel32.LocalFree.argtypes = (ctypes.wintypes.HLOCAL,) diff --git a/libs/win/jaraco/windows/api/message.py b/libs/win/jaraco/windows/api/message.py index 5ce2d808..c4c20bad 100644 --- a/libs/win/jaraco/windows/api/message.py +++ b/libs/win/jaraco/windows/api/message.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python - """ jaraco.windows.message @@ -9,22 +7,21 @@ Windows Messaging support import ctypes from ctypes.wintypes import HWND, UINT, WPARAM, LPARAM, DWORD, LPVOID -import six - LRESULT = LPARAM class LPARAM_wstr(LPARAM): - """ - A special instance of LPARAM that can be constructed from a string - instance (for functions such as SendMessage, whose LPARAM may point to - a unicode string). - """ - @classmethod - def from_param(cls, param): - if isinstance(param, six.string_types): - return LPVOID.from_param(six.text_type(param)) - return LPARAM.from_param(param) + """ + A special instance of LPARAM that can be constructed from a string + instance (for functions such as SendMessage, whose LPARAM may point to + a unicode string). + """ + + @classmethod + def from_param(cls, param): + if isinstance(param, str): + return LPVOID.from_param(str(param)) + return LPARAM.from_param(param) SendMessage = ctypes.windll.user32.SendMessageW @@ -43,12 +40,10 @@ SMTO_NOTIMEOUTIFNOTHUNG = 0x08 SMTO_ERRORONEXIT = 0x20 SendMessageTimeout = ctypes.windll.user32.SendMessageTimeoutW -SendMessageTimeout.argtypes = SendMessage.argtypes + ( - UINT, UINT, ctypes.POINTER(DWORD) -) +SendMessageTimeout.argtypes = SendMessage.argtypes + (UINT, UINT, ctypes.POINTER(DWORD)) SendMessageTimeout.restype = LRESULT def unicode_as_lparam(source): - pointer = ctypes.cast(ctypes.c_wchar_p(source), ctypes.c_void_p) - return LPARAM(pointer.value) + pointer = ctypes.cast(ctypes.c_wchar_p(source), ctypes.c_void_p) + return LPARAM(pointer.value) diff --git a/libs/win/jaraco/windows/api/net.py b/libs/win/jaraco/windows/api/net.py index ce693319..14defac2 100644 --- a/libs/win/jaraco/windows/api/net.py +++ b/libs/win/jaraco/windows/api/net.py @@ -7,24 +7,24 @@ RESOURCETYPE_ANY = 0 class NETRESOURCE(ctypes.Structure): - _fields_ = [ - ('scope', ctypes.wintypes.DWORD), - ('type', ctypes.wintypes.DWORD), - ('display_type', ctypes.wintypes.DWORD), - ('usage', ctypes.wintypes.DWORD), - ('local_name', ctypes.wintypes.LPWSTR), - ('remote_name', ctypes.wintypes.LPWSTR), - ('comment', ctypes.wintypes.LPWSTR), - ('provider', ctypes.wintypes.LPWSTR), - ] + _fields_ = [ + ('scope', ctypes.wintypes.DWORD), + ('type', ctypes.wintypes.DWORD), + ('display_type', ctypes.wintypes.DWORD), + ('usage', ctypes.wintypes.DWORD), + ('local_name', ctypes.wintypes.LPWSTR), + ('remote_name', ctypes.wintypes.LPWSTR), + ('comment', ctypes.wintypes.LPWSTR), + ('provider', ctypes.wintypes.LPWSTR), + ] LPNETRESOURCE = ctypes.POINTER(NETRESOURCE) WNetAddConnection2 = mpr.WNetAddConnection2W WNetAddConnection2.argtypes = ( - LPNETRESOURCE, - ctypes.wintypes.LPCWSTR, - ctypes.wintypes.LPCWSTR, - ctypes.wintypes.DWORD, + LPNETRESOURCE, + ctypes.wintypes.LPCWSTR, + ctypes.wintypes.LPCWSTR, + ctypes.wintypes.DWORD, ) diff --git a/libs/win/jaraco/windows/api/power.py b/libs/win/jaraco/windows/api/power.py index 77253a8a..b43de876 100644 --- a/libs/win/jaraco/windows/api/power.py +++ b/libs/win/jaraco/windows/api/power.py @@ -2,24 +2,23 @@ import ctypes.wintypes class SYSTEM_POWER_STATUS(ctypes.Structure): - _fields_ = ( - ('ac_line_status', ctypes.wintypes.BYTE), - ('battery_flag', ctypes.wintypes.BYTE), - ('battery_life_percent', ctypes.wintypes.BYTE), - ('reserved', ctypes.wintypes.BYTE), - ('battery_life_time', ctypes.wintypes.DWORD), - ('battery_full_life_time', ctypes.wintypes.DWORD), - ) + _fields_ = ( + ('ac_line_status', ctypes.wintypes.BYTE), + ('battery_flag', ctypes.wintypes.BYTE), + ('battery_life_percent', ctypes.wintypes.BYTE), + ('reserved', ctypes.wintypes.BYTE), + ('battery_life_time', ctypes.wintypes.DWORD), + ('battery_full_life_time', ctypes.wintypes.DWORD), + ) - @property - def ac_line_status_string(self): - return { - 0: 'offline', 1: 'online', 255: 'unknown'}[self.ac_line_status] + @property + def ac_line_status_string(self): + return {0: 'offline', 1: 'online', 255: 'unknown'}[self.ac_line_status] LPSYSTEM_POWER_STATUS = ctypes.POINTER(SYSTEM_POWER_STATUS) GetSystemPowerStatus = ctypes.windll.kernel32.GetSystemPowerStatus -GetSystemPowerStatus.argtypes = LPSYSTEM_POWER_STATUS, +GetSystemPowerStatus.argtypes = (LPSYSTEM_POWER_STATUS,) GetSystemPowerStatus.restype = ctypes.wintypes.BOOL SetThreadExecutionState = ctypes.windll.kernel32.SetThreadExecutionState @@ -28,10 +27,11 @@ SetThreadExecutionState.restype = ctypes.c_uint class ES: - """ - Execution state constants - """ - continuous = 0x80000000 - system_required = 1 - display_required = 2 - awaymode_required = 0x40 + """ + Execution state constants + """ + + continuous = 0x80000000 + system_required = 1 + display_required = 2 + awaymode_required = 0x40 diff --git a/libs/win/jaraco/windows/api/privilege.py b/libs/win/jaraco/windows/api/privilege.py index b841311e..7fb6a497 100644 --- a/libs/win/jaraco/windows/api/privilege.py +++ b/libs/win/jaraco/windows/api/privilege.py @@ -2,35 +2,32 @@ import ctypes.wintypes class LUID(ctypes.Structure): - _fields_ = [ - ('low_part', ctypes.wintypes.DWORD), - ('high_part', ctypes.wintypes.LONG), - ] + _fields_ = [ + ('low_part', ctypes.wintypes.DWORD), + ('high_part', ctypes.wintypes.LONG), + ] - def __eq__(self, other): - return ( - self.high_part == other.high_part and - self.low_part == other.low_part - ) + def __eq__(self, other): + return self.high_part == other.high_part and self.low_part == other.low_part - def __ne__(self, other): - return not (self == other) + def __ne__(self, other): + return not (self == other) LookupPrivilegeValue = ctypes.windll.advapi32.LookupPrivilegeValueW LookupPrivilegeValue.argtypes = ( - ctypes.wintypes.LPWSTR, # system name - ctypes.wintypes.LPWSTR, # name - ctypes.POINTER(LUID), + ctypes.wintypes.LPWSTR, # system name + ctypes.wintypes.LPWSTR, # name + ctypes.POINTER(LUID), ) LookupPrivilegeValue.restype = ctypes.wintypes.BOOL class TOKEN_INFORMATION_CLASS: - TokenUser = 1 - TokenGroups = 2 - TokenPrivileges = 3 - # ... see http://msdn.microsoft.com/en-us/library/aa379626%28VS.85%29.aspx + TokenUser = 1 + TokenGroups = 2 + TokenPrivileges = 3 + # ... see http://msdn.microsoft.com/en-us/library/aa379626%28VS.85%29.aspx SE_PRIVILEGE_ENABLED_BY_DEFAULT = 0x00000001 @@ -40,67 +37,63 @@ SE_PRIVILEGE_USED_FOR_ACCESS = 0x80000000 class LUID_AND_ATTRIBUTES(ctypes.Structure): - _fields_ = [ - ('LUID', LUID), - ('attributes', ctypes.wintypes.DWORD), - ] + _fields_ = [('LUID', LUID), ('attributes', ctypes.wintypes.DWORD)] - def is_enabled(self): - return bool(self.attributes & SE_PRIVILEGE_ENABLED) + def is_enabled(self): + return bool(self.attributes & SE_PRIVILEGE_ENABLED) - def enable(self): - self.attributes |= SE_PRIVILEGE_ENABLED + def enable(self): + self.attributes |= SE_PRIVILEGE_ENABLED - def get_name(self): - size = ctypes.wintypes.DWORD(10240) - buf = ctypes.create_unicode_buffer(size.value) - res = LookupPrivilegeName(None, self.LUID, buf, size) - if res == 0: - raise RuntimeError - return buf[:size.value] + def get_name(self): + size = ctypes.wintypes.DWORD(10240) + buf = ctypes.create_unicode_buffer(size.value) + res = LookupPrivilegeName(None, self.LUID, buf, size) + if res == 0: + raise RuntimeError + return buf[: size.value] - def __str__(self): - res = self.get_name() - if self.is_enabled(): - res += ' (enabled)' - return res + def __str__(self): + res = self.get_name() + if self.is_enabled(): + res += ' (enabled)' + return res LookupPrivilegeName = ctypes.windll.advapi32.LookupPrivilegeNameW LookupPrivilegeName.argtypes = ( - ctypes.wintypes.LPWSTR, # lpSystemName - ctypes.POINTER(LUID), # lpLuid - ctypes.wintypes.LPWSTR, # lpName - ctypes.POINTER(ctypes.wintypes.DWORD), # cchName + ctypes.wintypes.LPWSTR, # lpSystemName + ctypes.POINTER(LUID), # lpLuid + ctypes.wintypes.LPWSTR, # lpName + ctypes.POINTER(ctypes.wintypes.DWORD), # cchName ) LookupPrivilegeName.restype = ctypes.wintypes.BOOL class TOKEN_PRIVILEGES(ctypes.Structure): - _fields_ = [ - ('count', ctypes.wintypes.DWORD), - ('privileges', LUID_AND_ATTRIBUTES * 0), - ] + _fields_ = [ + ('count', ctypes.wintypes.DWORD), + ('privileges', LUID_AND_ATTRIBUTES * 0), + ] - def get_array(self): - array_type = LUID_AND_ATTRIBUTES * self.count - privileges = ctypes.cast( - self.privileges, ctypes.POINTER(array_type)).contents - return privileges + def get_array(self): + array_type = LUID_AND_ATTRIBUTES * self.count + privileges = ctypes.cast(self.privileges, ctypes.POINTER(array_type)).contents + return privileges - def __iter__(self): - return iter(self.get_array()) + def __iter__(self): + return iter(self.get_array()) PTOKEN_PRIVILEGES = ctypes.POINTER(TOKEN_PRIVILEGES) GetTokenInformation = ctypes.windll.advapi32.GetTokenInformation GetTokenInformation.argtypes = [ - ctypes.wintypes.HANDLE, # TokenHandle - ctypes.c_uint, # TOKEN_INFORMATION_CLASS value - ctypes.c_void_p, # TokenInformation - ctypes.wintypes.DWORD, # TokenInformationLength - ctypes.POINTER(ctypes.wintypes.DWORD), # ReturnLength + ctypes.wintypes.HANDLE, # TokenHandle + ctypes.c_uint, # TOKEN_INFORMATION_CLASS value + ctypes.c_void_p, # TokenInformation + ctypes.wintypes.DWORD, # TokenInformationLength + ctypes.POINTER(ctypes.wintypes.DWORD), # ReturnLength ] GetTokenInformation.restype = ctypes.wintypes.BOOL @@ -108,10 +101,10 @@ GetTokenInformation.restype = ctypes.wintypes.BOOL AdjustTokenPrivileges = ctypes.windll.advapi32.AdjustTokenPrivileges AdjustTokenPrivileges.restype = ctypes.wintypes.BOOL AdjustTokenPrivileges.argtypes = [ - ctypes.wintypes.HANDLE, # TokenHandle - ctypes.wintypes.BOOL, # DisableAllPrivileges - PTOKEN_PRIVILEGES, # NewState (optional) - ctypes.wintypes.DWORD, # BufferLength of PreviousState - PTOKEN_PRIVILEGES, # PreviousState (out, optional) - ctypes.POINTER(ctypes.wintypes.DWORD), # ReturnLength + ctypes.wintypes.HANDLE, # TokenHandle + ctypes.wintypes.BOOL, # DisableAllPrivileges + PTOKEN_PRIVILEGES, # NewState (optional) + ctypes.wintypes.DWORD, # BufferLength of PreviousState + PTOKEN_PRIVILEGES, # PreviousState (out, optional) + ctypes.POINTER(ctypes.wintypes.DWORD), # ReturnLength ] diff --git a/libs/win/jaraco/windows/api/process.py b/libs/win/jaraco/windows/api/process.py index 56ce7852..3337cba5 100644 --- a/libs/win/jaraco/windows/api/process.py +++ b/libs/win/jaraco/windows/api/process.py @@ -1,11 +1,13 @@ import ctypes.wintypes -TOKEN_ALL_ACCESS = 0xf01ff +TOKEN_ALL_ACCESS = 0xF01FF GetCurrentProcess = ctypes.windll.kernel32.GetCurrentProcess GetCurrentProcess.restype = ctypes.wintypes.HANDLE OpenProcessToken = ctypes.windll.advapi32.OpenProcessToken OpenProcessToken.argtypes = ( - ctypes.wintypes.HANDLE, ctypes.wintypes.DWORD, - ctypes.POINTER(ctypes.wintypes.HANDLE)) + ctypes.wintypes.HANDLE, + ctypes.wintypes.DWORD, + ctypes.POINTER(ctypes.wintypes.HANDLE), +) OpenProcessToken.restype = ctypes.wintypes.BOOL diff --git a/libs/win/jaraco/windows/api/security.py b/libs/win/jaraco/windows/api/security.py index c9e7b58e..db5d220c 100644 --- a/libs/win/jaraco/windows/api/security.py +++ b/libs/win/jaraco/windows/api/security.py @@ -24,116 +24,117 @@ POLICY_LOOKUP_NAMES = 0x00000800 POLICY_NOTIFICATION = 0x00001000 POLICY_ALL_ACCESS = ( - STANDARD_RIGHTS_REQUIRED | - POLICY_VIEW_LOCAL_INFORMATION | - POLICY_VIEW_AUDIT_INFORMATION | - POLICY_GET_PRIVATE_INFORMATION | - POLICY_TRUST_ADMIN | - POLICY_CREATE_ACCOUNT | - POLICY_CREATE_SECRET | - POLICY_CREATE_PRIVILEGE | - POLICY_SET_DEFAULT_QUOTA_LIMITS | - POLICY_SET_AUDIT_REQUIREMENTS | - POLICY_AUDIT_LOG_ADMIN | - POLICY_SERVER_ADMIN | - POLICY_LOOKUP_NAMES) + STANDARD_RIGHTS_REQUIRED + | POLICY_VIEW_LOCAL_INFORMATION + | POLICY_VIEW_AUDIT_INFORMATION + | POLICY_GET_PRIVATE_INFORMATION + | POLICY_TRUST_ADMIN + | POLICY_CREATE_ACCOUNT + | POLICY_CREATE_SECRET + | POLICY_CREATE_PRIVILEGE + | POLICY_SET_DEFAULT_QUOTA_LIMITS + | POLICY_SET_AUDIT_REQUIREMENTS + | POLICY_AUDIT_LOG_ADMIN + | POLICY_SERVER_ADMIN + | POLICY_LOOKUP_NAMES +) POLICY_READ = ( - STANDARD_RIGHTS_READ | - POLICY_VIEW_AUDIT_INFORMATION | - POLICY_GET_PRIVATE_INFORMATION) + STANDARD_RIGHTS_READ + | POLICY_VIEW_AUDIT_INFORMATION + | POLICY_GET_PRIVATE_INFORMATION +) POLICY_WRITE = ( - STANDARD_RIGHTS_WRITE | - POLICY_TRUST_ADMIN | - POLICY_CREATE_ACCOUNT | - POLICY_CREATE_SECRET | - POLICY_CREATE_PRIVILEGE | - POLICY_SET_DEFAULT_QUOTA_LIMITS | - POLICY_SET_AUDIT_REQUIREMENTS | - POLICY_AUDIT_LOG_ADMIN | - POLICY_SERVER_ADMIN) + STANDARD_RIGHTS_WRITE + | POLICY_TRUST_ADMIN + | POLICY_CREATE_ACCOUNT + | POLICY_CREATE_SECRET + | POLICY_CREATE_PRIVILEGE + | POLICY_SET_DEFAULT_QUOTA_LIMITS + | POLICY_SET_AUDIT_REQUIREMENTS + | POLICY_AUDIT_LOG_ADMIN + | POLICY_SERVER_ADMIN +) POLICY_EXECUTE = ( - STANDARD_RIGHTS_EXECUTE | - POLICY_VIEW_LOCAL_INFORMATION | - POLICY_LOOKUP_NAMES) + STANDARD_RIGHTS_EXECUTE | POLICY_VIEW_LOCAL_INFORMATION | POLICY_LOOKUP_NAMES +) class TokenAccess: - TOKEN_QUERY = 0x8 + TOKEN_QUERY = 0x8 class TokenInformationClass: - TokenUser = 1 + TokenUser = 1 class TOKEN_USER(ctypes.Structure): - num = 1 - _fields_ = [ - ('SID', ctypes.c_void_p), - ('ATTRIBUTES', ctypes.wintypes.DWORD), - ] + num = 1 + _fields_ = [('SID', ctypes.c_void_p), ('ATTRIBUTES', ctypes.wintypes.DWORD)] class SECURITY_DESCRIPTOR(ctypes.Structure): - """ - typedef struct _SECURITY_DESCRIPTOR - { - UCHAR Revision; - UCHAR Sbz1; - SECURITY_DESCRIPTOR_CONTROL Control; - PSID Owner; - PSID Group; - PACL Sacl; - PACL Dacl; - } SECURITY_DESCRIPTOR; - """ - SECURITY_DESCRIPTOR_CONTROL = ctypes.wintypes.USHORT - REVISION = 1 + """ + typedef struct _SECURITY_DESCRIPTOR + { + UCHAR Revision; + UCHAR Sbz1; + SECURITY_DESCRIPTOR_CONTROL Control; + PSID Owner; + PSID Group; + PACL Sacl; + PACL Dacl; + } SECURITY_DESCRIPTOR; + """ - _fields_ = [ - ('Revision', ctypes.c_ubyte), - ('Sbz1', ctypes.c_ubyte), - ('Control', SECURITY_DESCRIPTOR_CONTROL), - ('Owner', ctypes.c_void_p), - ('Group', ctypes.c_void_p), - ('Sacl', ctypes.c_void_p), - ('Dacl', ctypes.c_void_p), - ] + SECURITY_DESCRIPTOR_CONTROL = ctypes.wintypes.USHORT + REVISION = 1 + + _fields_ = [ + ('Revision', ctypes.c_ubyte), + ('Sbz1', ctypes.c_ubyte), + ('Control', SECURITY_DESCRIPTOR_CONTROL), + ('Owner', ctypes.c_void_p), + ('Group', ctypes.c_void_p), + ('Sacl', ctypes.c_void_p), + ('Dacl', ctypes.c_void_p), + ] class SECURITY_ATTRIBUTES(ctypes.Structure): - """ - typedef struct _SECURITY_ATTRIBUTES { - DWORD nLength; - LPVOID lpSecurityDescriptor; - BOOL bInheritHandle; - } SECURITY_ATTRIBUTES; - """ - _fields_ = [ - ('nLength', ctypes.wintypes.DWORD), - ('lpSecurityDescriptor', ctypes.c_void_p), - ('bInheritHandle', ctypes.wintypes.BOOL), - ] + """ + typedef struct _SECURITY_ATTRIBUTES { + DWORD nLength; + LPVOID lpSecurityDescriptor; + BOOL bInheritHandle; + } SECURITY_ATTRIBUTES; + """ - def __init__(self, *args, **kwargs): - super(SECURITY_ATTRIBUTES, self).__init__(*args, **kwargs) - self.nLength = ctypes.sizeof(SECURITY_ATTRIBUTES) + _fields_ = [ + ('nLength', ctypes.wintypes.DWORD), + ('lpSecurityDescriptor', ctypes.c_void_p), + ('bInheritHandle', ctypes.wintypes.BOOL), + ] - @property - def descriptor(self): - return self._descriptor + def __init__(self, *args, **kwargs): + super(SECURITY_ATTRIBUTES, self).__init__(*args, **kwargs) + self.nLength = ctypes.sizeof(SECURITY_ATTRIBUTES) - @descriptor.setter - def descriptor(self, value): - self._descriptor = value - self.lpSecurityDescriptor = ctypes.addressof(value) + @property + def descriptor(self): + return self._descriptor + + @descriptor.setter + def descriptor(self, value): + self._descriptor = value + self.lpSecurityDescriptor = ctypes.addressof(value) ctypes.windll.advapi32.SetSecurityDescriptorOwner.argtypes = ( - ctypes.POINTER(SECURITY_DESCRIPTOR), - ctypes.c_void_p, - ctypes.wintypes.BOOL, + ctypes.POINTER(SECURITY_DESCRIPTOR), + ctypes.c_void_p, + ctypes.wintypes.BOOL, ) diff --git a/libs/win/jaraco/windows/api/shell.py b/libs/win/jaraco/windows/api/shell.py index 1d428c87..af7174dc 100644 --- a/libs/win/jaraco/windows/api/shell.py +++ b/libs/win/jaraco/windows/api/shell.py @@ -1,39 +1,40 @@ import ctypes.wintypes + BOOL = ctypes.wintypes.BOOL class SHELLSTATE(ctypes.Structure): - _fields_ = [ - ('show_all_objects', BOOL, 1), - ('show_extensions', BOOL, 1), - ('no_confirm_recycle', BOOL, 1), - ('show_sys_files', BOOL, 1), - ('show_comp_color', BOOL, 1), - ('double_click_in_web_view', BOOL, 1), - ('desktop_HTML', BOOL, 1), - ('win95_classic', BOOL, 1), - ('dont_pretty_path', BOOL, 1), - ('show_attrib_col', BOOL, 1), - ('map_network_drive_button', BOOL, 1), - ('show_info_tip', BOOL, 1), - ('hide_icons', BOOL, 1), - ('web_view', BOOL, 1), - ('filter', BOOL, 1), - ('show_super_hidden', BOOL, 1), - ('no_net_crawling', BOOL, 1), - ('win95_unused', ctypes.wintypes.DWORD), - ('param_sort', ctypes.wintypes.LONG), - ('sort_direction', ctypes.c_int), - ('version', ctypes.wintypes.UINT), - ('not_used', ctypes.wintypes.UINT), - ('sep_process', BOOL, 1), - ('start_panel_on', BOOL, 1), - ('show_start_page', BOOL, 1), - ('auto_check_select', BOOL, 1), - ('icons_only', BOOL, 1), - ('show_type_overlay', BOOL, 1), - ('spare_flags', ctypes.wintypes.UINT, 13), - ] + _fields_ = [ + ('show_all_objects', BOOL, 1), + ('show_extensions', BOOL, 1), + ('no_confirm_recycle', BOOL, 1), + ('show_sys_files', BOOL, 1), + ('show_comp_color', BOOL, 1), + ('double_click_in_web_view', BOOL, 1), + ('desktop_HTML', BOOL, 1), + ('win95_classic', BOOL, 1), + ('dont_pretty_path', BOOL, 1), + ('show_attrib_col', BOOL, 1), + ('map_network_drive_button', BOOL, 1), + ('show_info_tip', BOOL, 1), + ('hide_icons', BOOL, 1), + ('web_view', BOOL, 1), + ('filter', BOOL, 1), + ('show_super_hidden', BOOL, 1), + ('no_net_crawling', BOOL, 1), + ('win95_unused', ctypes.wintypes.DWORD), + ('param_sort', ctypes.wintypes.LONG), + ('sort_direction', ctypes.c_int), + ('version', ctypes.wintypes.UINT), + ('not_used', ctypes.wintypes.UINT), + ('sep_process', BOOL, 1), + ('start_panel_on', BOOL, 1), + ('show_start_page', BOOL, 1), + ('auto_check_select', BOOL, 1), + ('icons_only', BOOL, 1), + ('show_type_overlay', BOOL, 1), + ('spare_flags', ctypes.wintypes.UINT, 13), + ] SSF_SHOWALLOBJECTS = 0x00000001 @@ -123,8 +124,8 @@ SSF_SHOWTYPEOVERLAY = 0x02000000 SHGetSetSettings = ctypes.windll.shell32.SHGetSetSettings SHGetSetSettings.argtypes = [ - ctypes.POINTER(SHELLSTATE), - ctypes.wintypes.DWORD, - ctypes.wintypes.BOOL, # get or set (True: set) + ctypes.POINTER(SHELLSTATE), + ctypes.wintypes.DWORD, + ctypes.wintypes.BOOL, # get or set (True: set) ] SHGetSetSettings.restype = None diff --git a/libs/win/jaraco/windows/api/system.py b/libs/win/jaraco/windows/api/system.py index 6a09f5ad..ba69affb 100644 --- a/libs/win/jaraco/windows/api/system.py +++ b/libs/win/jaraco/windows/api/system.py @@ -2,10 +2,10 @@ import ctypes.wintypes SystemParametersInfo = ctypes.windll.user32.SystemParametersInfoW SystemParametersInfo.argtypes = ( - ctypes.wintypes.UINT, - ctypes.wintypes.UINT, - ctypes.c_void_p, - ctypes.wintypes.UINT, + ctypes.wintypes.UINT, + ctypes.wintypes.UINT, + ctypes.c_void_p, + ctypes.wintypes.UINT, ) SPI_GETACTIVEWINDOWTRACKING = 0x1000 diff --git a/libs/win/jaraco/windows/api/user.py b/libs/win/jaraco/windows/api/user.py index 9d0b3f8d..936cdd23 100644 --- a/libs/win/jaraco/windows/api/user.py +++ b/libs/win/jaraco/windows/api/user.py @@ -1,9 +1,9 @@ import ctypes.wintypes try: - from ctypes.wintypes import LPDWORD + from ctypes.wintypes import LPDWORD except ImportError: - LPDWORD = ctypes.POINTER(ctypes.wintypes.DWORD) + LPDWORD = ctypes.POINTER(ctypes.wintypes.DWORD) # type: ignore GetUserName = ctypes.windll.advapi32.GetUserNameW GetUserName.argtypes = ctypes.wintypes.LPWSTR, LPDWORD diff --git a/libs/win/jaraco/windows/batch.py b/libs/win/jaraco/windows/batch.py new file mode 100644 index 00000000..b0ac6f0c --- /dev/null +++ b/libs/win/jaraco/windows/batch.py @@ -0,0 +1,39 @@ +import subprocess +import itertools + +from more_itertools import consume, always_iterable + + +def extract_environment(env_cmd, initial=None): + """ + Take a command (either a single command or list of arguments) + and return the environment created after running that command. + Note that if the command must be a batch file or .cmd file, or the + changes to the environment will not be captured. + + If initial is supplied, it is used as the initial environment passed + to the child process. + """ + # construct the command that will alter the environment + env_cmd = subprocess.list2cmdline(always_iterable(env_cmd)) + # create a tag so we can tell in the output when the proc is done + tag = 'Done running command' + # construct a cmd.exe command to do accomplish this + cmd = 'cmd.exe /s /c "{env_cmd} && echo "{tag}" && set"'.format(**vars()) + # launch the process + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, env=initial) + # parse the output sent to stdout + lines = proc.stdout + # make sure the lines are strings + + def make_str(s): + return s.decode() + + lines = map(make_str, lines) + # consume whatever output occurs until the tag is reached + consume(itertools.takewhile(lambda l: tag not in l, lines)) + # construct a dictionary of the pairs + result = dict(line.rstrip().split('=', 1) for line in lines) + # let the process finish + proc.communicate() + return result diff --git a/libs/win/jaraco/windows/clipboard.py b/libs/win/jaraco/windows/clipboard.py index 2f4bbc3a..cf7dc6bc 100644 --- a/libs/win/jaraco/windows/clipboard.py +++ b/libs/win/jaraco/windows/clipboard.py @@ -1,5 +1,3 @@ -from __future__ import with_statement, print_function - import sys import re import itertools @@ -7,220 +5,265 @@ from contextlib import contextmanager import io import ctypes from ctypes import windll - -import six -from six.moves import map +import textwrap +import collections from jaraco.windows.api import clipboard, memory from jaraco.windows.error import handle_nonzero_success, WindowsError from jaraco.windows.memory import LockedMemory -__all__ = ( - 'GetClipboardData', 'CloseClipboard', - 'SetClipboardData', 'OpenClipboard', -) +__all__ = ('GetClipboardData', 'CloseClipboard', 'SetClipboardData', 'OpenClipboard') def OpenClipboard(owner=None): - """ - Open the clipboard. + """ + Open the clipboard. - owner - [in] Handle to the window to be associated with the open clipboard. - If this parameter is None, the open clipboard is associated with the - current task. - """ - handle_nonzero_success(windll.user32.OpenClipboard(owner)) + owner + [in] Handle to the window to be associated with the open clipboard. + If this parameter is None, the open clipboard is associated with the + current task. + """ + handle_nonzero_success(windll.user32.OpenClipboard(owner)) def CloseClipboard(): - handle_nonzero_success(windll.user32.CloseClipboard()) + handle_nonzero_success(windll.user32.CloseClipboard()) data_handlers = dict() def handles(*formats): - def register(func): - for format in formats: - data_handlers[format] = func - return func - return register + def register(func): + for format in formats: + data_handlers[format] = func + return func + + return register def nts(buffer): - """ - Null Terminated String - Get the portion of bytestring buffer up to a null character. - """ - result, null, rest = buffer.partition('\x00') - return result + """ + Null Terminated String + Get the portion of bytestring buffer up to a null character. + """ + result, null, rest = buffer.partition('\x00') + return result @handles(clipboard.CF_DIBV5, clipboard.CF_DIB) def raw_data(handle): - return LockedMemory(handle).data + return LockedMemory(handle).data @handles(clipboard.CF_TEXT) def text_string(handle): - return nts(raw_data(handle)) + return nts(raw_data(handle)) @handles(clipboard.CF_UNICODETEXT) def unicode_string(handle): - return nts(raw_data(handle).decode('utf-16')) + return nts(raw_data(handle).decode('utf-16')) @handles(clipboard.CF_BITMAP) def as_bitmap(handle): - # handle is HBITMAP - raise NotImplementedError("Can't convert to DIB") - # todo: use GetDIBits http://msdn.microsoft.com - # /en-us/library/dd144879%28v=VS.85%29.aspx + # handle is HBITMAP + raise NotImplementedError("Can't convert to DIB") + # todo: use GetDIBits http://msdn.microsoft.com + # /en-us/library/dd144879%28v=VS.85%29.aspx @handles(clipboard.CF_HTML) class HTMLSnippet(object): - def __init__(self, handle): - self.data = nts(raw_data(handle).decode('utf-8')) - self.headers = self.parse_headers(self.data) + """ + HTML Snippet representing the Microsoft `HTML snippet format + `_. + """ - @property - def html(self): - return self.data[self.headers['StartHTML']:] + def __init__(self, handle): + self.data = nts(raw_data(handle).decode('utf-8')) + self.headers = self.parse_headers(self.data) - @staticmethod - def parse_headers(data): - d = io.StringIO(data) + @property + def html(self): + return self.data[self.headers['StartHTML'] :] - def header_line(line): - return re.match('(\w+):(.*)', line) - headers = map(header_line, d) - # grab headers until they no longer match - headers = itertools.takewhile(bool, headers) + @property + def fragment(self): + return self.data[self.headers['StartFragment'] : self.headers['EndFragment']] - def best_type(value): - try: - return int(value) - except ValueError: - pass - try: - return float(value) - except ValueError: - pass - return value - pairs = ( - (header.group(1), best_type(header.group(2))) - for header - in headers - ) - return dict(pairs) + @staticmethod + def parse_headers(data): + d = io.StringIO(data) + + def header_line(line): + return re.match(r'(\w+):(.*)', line) + + headers = map(header_line, d) + # grab headers until they no longer match + headers = itertools.takewhile(bool, headers) + + def best_type(value): + try: + return int(value) + except ValueError: + pass + try: + return float(value) + except ValueError: + pass + return value + + pairs = ((header.group(1), best_type(header.group(2))) for header in headers) + return dict(pairs) + + @classmethod + def from_string(cls, source): + """ + Construct an HTMLSnippet with all the headers, modeled after + https://docs.microsoft.com/en-us/troubleshoot/cpp/add-html-code-clipboard + """ + tmpl = textwrap.dedent( + """ + Version:0.9 + StartHTML:{start_html:08d} + EndHTML:{end_html:08d} + StartFragment:{start_fragment:08d} + EndFragment:{end_fragment:08d} + + + {source} + + + """ + ).strip() + zeros = collections.defaultdict(lambda: 0, locals()) + pre_value = tmpl.format_map(zeros) + start_html = pre_value.find('') + end_html = len(tmpl) + assert end_html < 100000000 + start_fragment = pre_value.find(source) + end_fragment = pre_value.rfind('\n %(target)s\n" % vars()) + """ + Like cmd.exe's mklink except it will infer directory status of the + target. + """ + from optparse import OptionParser + + parser = OptionParser(usage="usage: %prog [options] link target") + parser.add_option( + '-d', + '--directory', + help="Target is a directory (only necessary if not present)", + action="store_true", + ) + options, args = parser.parse_args() + try: + link, target = args + except ValueError: + parser.error("incorrect number of arguments") + symlink(target, link, options.directory) + sys.stdout.write("Symbolic link created: %(link)s --> %(target)s\n" % vars()) def _is_target_a_directory(link, rel_target): - """ - If creating a symlink from link to a target, determine if target - is a directory (relative to dirname(link)). - """ - target = os.path.join(os.path.dirname(link), rel_target) - return os.path.isdir(target) + """ + If creating a symlink from link to a target, determine if target + is a directory (relative to dirname(link)). + """ + target = os.path.join(os.path.dirname(link), rel_target) + return os.path.isdir(target) def symlink(target, link, target_is_directory=False): - """ - An implementation of os.symlink for Windows (Vista and greater) - """ - target_is_directory = ( - target_is_directory or - _is_target_a_directory(link, target) - ) - # normalize the target (MS symlinks don't respect forward slashes) - target = os.path.normpath(target) - handle_nonzero_success( - api.CreateSymbolicLink(link, target, target_is_directory)) + """ + An implementation of os.symlink for Windows (Vista and greater) + """ + target_is_directory = target_is_directory or _is_target_a_directory(link, target) + # normalize the target (MS symlinks don't respect forward slashes) + target = os.path.normpath(target) + flags = target_is_directory | api.SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE + handle_nonzero_success(api.CreateSymbolicLink(link, target, flags)) def link(target, link): - """ - Establishes a hard link between an existing file and a new file. - """ - handle_nonzero_success(api.CreateHardLink(link, target, None)) + """ + Establishes a hard link between an existing file and a new file. + """ + handle_nonzero_success(api.CreateHardLink(link, target, None)) def is_reparse_point(path): - """ - Determine if the given path is a reparse point. - Return False if the file does not exist or the file attributes cannot - be determined. - """ - res = api.GetFileAttributes(path) - return ( - res != api.INVALID_FILE_ATTRIBUTES - and bool(res & api.FILE_ATTRIBUTE_REPARSE_POINT) - ) + """ + Determine if the given path is a reparse point. + Return False if the file does not exist or the file attributes cannot + be determined. + """ + res = api.GetFileAttributes(path) + return res != api.INVALID_FILE_ATTRIBUTES and bool( + res & api.FILE_ATTRIBUTE_REPARSE_POINT + ) def islink(path): - "Determine if the given path is a symlink" - return is_reparse_point(path) and is_symlink(path) + "Determine if the given path is a symlink" + return is_reparse_point(path) and is_symlink(path) def _patch_path(path): - """ - Paths have a max length of api.MAX_PATH characters (260). If a target path - is longer than that, it needs to be made absolute and prepended with - \\?\ in order to work with API calls. - See http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx for - details. - """ - if path.startswith('\\\\?\\'): - return path - abs_path = os.path.abspath(path) - if not abs_path[1] == ':': - # python doesn't include the drive letter, but \\?\ requires it - abs_path = os.getcwd()[:2] + abs_path - return '\\\\?\\' + abs_path + r""" + Paths have a max length of api.MAX_PATH characters (260). If a target path + is longer than that, it needs to be made absolute and prepended with + \\?\ in order to work with API calls. + See http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx for + details. + """ + if path.startswith('\\\\?\\'): + return path + abs_path = os.path.abspath(path) + if not abs_path[1] == ':': + # python doesn't include the drive letter, but \\?\ requires it + abs_path = os.getcwd()[:2] + abs_path + return '\\\\?\\' + abs_path def is_symlink(path): - """ - Assuming path is a reparse point, determine if it's a symlink. - """ - path = _patch_path(path) - try: - return _is_symlink(next(find_files(path))) - except WindowsError as orig_error: - tmpl = "Error accessing {path}: {orig_error.message}" - raise builtins.WindowsError(tmpl.format(**locals())) + """ + Assuming path is a reparse point, determine if it's a symlink. + """ + path = _patch_path(path) + try: + return _is_symlink(next(find_files(path))) + # comment below workaround for PyCQA/pyflakes#376 + except WindowsError as orig_error: # noqa: F841 + tmpl = "Error accessing {path}: {orig_error.message}" + raise builtins.WindowsError(tmpl.format(**locals())) def _is_symlink(find_data): - return find_data.reserved[0] == api.IO_REPARSE_TAG_SYMLINK + return find_data.reserved[0] == api.IO_REPARSE_TAG_SYMLINK def find_files(spec): - """ - A pythonic wrapper around the FindFirstFile/FindNextFile win32 api. + r""" + A pythonic wrapper around the FindFirstFile/FindNextFile win32 api. - >>> root_files = tuple(find_files(r'c:\*')) - >>> len(root_files) > 1 - True - >>> root_files[0].filename == root_files[1].filename - False + >>> root_files = tuple(find_files(r'c:\*')) + >>> len(root_files) > 1 + True + >>> root_files[0].filename == root_files[1].filename + False - This test might fail on a non-standard installation - >>> 'Windows' in (fd.filename for fd in root_files) - True - """ - fd = api.WIN32_FIND_DATA() - handle = api.FindFirstFile(spec, byref(fd)) - while True: - if handle == api.INVALID_HANDLE_VALUE: - raise WindowsError() - yield fd - fd = api.WIN32_FIND_DATA() - res = api.FindNextFile(handle, byref(fd)) - if res == 0: # error - error = WindowsError() - if error.code == api.ERROR_NO_MORE_FILES: - break - else: - raise error - # todo: how to close handle when generator is destroyed? - # hint: catch GeneratorExit - windll.kernel32.FindClose(handle) + This test might fail on a non-standard installation + >>> 'Windows' in (fd.filename for fd in root_files) + True + """ + fd = api.WIN32_FIND_DATA() + handle = api.FindFirstFile(spec, byref(fd)) + while True: + if handle == api.INVALID_HANDLE_VALUE: + raise WindowsError() + yield fd + fd = api.WIN32_FIND_DATA() + res = api.FindNextFile(handle, byref(fd)) + if res == 0: # error + error = WindowsError() + if error.code == api.ERROR_NO_MORE_FILES: + break + else: + raise error + # todo: how to close handle when generator is destroyed? + # hint: catch GeneratorExit + windll.kernel32.FindClose(handle) def get_final_path(path): - """ - For a given path, determine the ultimate location of that path. - Useful for resolving symlink targets. - This functions wraps the GetFinalPathNameByHandle from the Windows - SDK. + r""" + For a given path, determine the ultimate location of that path. + Useful for resolving symlink targets. + This functions wraps the GetFinalPathNameByHandle from the Windows + SDK. - Note, this function fails if a handle cannot be obtained (such as - for C:\Pagefile.sys on a stock windows system). Consider using - trace_symlink_target instead. - """ - desired_access = api.NULL - share_mode = ( - api.FILE_SHARE_READ | api.FILE_SHARE_WRITE | api.FILE_SHARE_DELETE - ) - security_attributes = api.LPSECURITY_ATTRIBUTES() # NULL pointer - hFile = api.CreateFile( - path, - desired_access, - share_mode, - security_attributes, - api.OPEN_EXISTING, - api.FILE_FLAG_BACKUP_SEMANTICS, - api.NULL, - ) + Note, this function fails if a handle cannot be obtained (such as + for C:\Pagefile.sys on a stock windows system). Consider using + trace_symlink_target instead. + """ + desired_access = api.NULL + share_mode = api.FILE_SHARE_READ | api.FILE_SHARE_WRITE | api.FILE_SHARE_DELETE + security_attributes = api.LPSECURITY_ATTRIBUTES() # NULL pointer + hFile = api.CreateFile( + path, + desired_access, + share_mode, + security_attributes, + api.OPEN_EXISTING, + api.FILE_FLAG_BACKUP_SEMANTICS, + api.NULL, + ) - if hFile == api.INVALID_HANDLE_VALUE: - raise WindowsError() + if hFile == api.INVALID_HANDLE_VALUE: + raise WindowsError() - buf_size = api.GetFinalPathNameByHandle( - hFile, LPWSTR(), 0, api.VOLUME_NAME_DOS) - handle_nonzero_success(buf_size) - buf = create_unicode_buffer(buf_size) - result_length = api.GetFinalPathNameByHandle( - hFile, buf, len(buf), api.VOLUME_NAME_DOS) + buf_size = api.GetFinalPathNameByHandle(hFile, LPWSTR(), 0, api.VOLUME_NAME_DOS) + handle_nonzero_success(buf_size) + buf = create_unicode_buffer(buf_size) + result_length = api.GetFinalPathNameByHandle( + hFile, buf, len(buf), api.VOLUME_NAME_DOS + ) - assert result_length < len(buf) - handle_nonzero_success(result_length) - handle_nonzero_success(api.CloseHandle(hFile)) + assert result_length < len(buf) + handle_nonzero_success(result_length) + handle_nonzero_success(api.CloseHandle(hFile)) - return buf[:result_length] + return buf[:result_length] def compat_stat(path): - """ - Generate stat as found on Python 3.2 and later. - """ - stat = os.stat(path) - info = get_file_info(path) - # rewrite st_ino, st_dev, and st_nlink based on file info - return nt.stat_result( - (stat.st_mode,) + - (info.file_index, info.volume_serial_number, info.number_of_links) + - stat[4:] - ) + """ + Generate stat as found on Python 3.2 and later. + """ + stat = os.stat(path) + info = get_file_info(path) + # rewrite st_ino, st_dev, and st_nlink based on file info + return nt.stat_result( + (stat.st_mode,) + + (info.file_index, info.volume_serial_number, info.number_of_links) + + stat[4:] + ) def samefile(f1, f2): - """ - Backport of samefile from Python 3.2 with support for Windows. - """ - return posixpath.samestat(compat_stat(f1), compat_stat(f2)) + """ + Backport of samefile from Python 3.2 with support for Windows. + """ + return posixpath.samestat(compat_stat(f1), compat_stat(f2)) def get_file_info(path): - # open the file the same way CPython does in posixmodule.c - desired_access = api.FILE_READ_ATTRIBUTES - share_mode = 0 - security_attributes = None - creation_disposition = api.OPEN_EXISTING - flags_and_attributes = ( - api.FILE_ATTRIBUTE_NORMAL | - api.FILE_FLAG_BACKUP_SEMANTICS | - api.FILE_FLAG_OPEN_REPARSE_POINT - ) - template_file = None + # open the file the same way CPython does in posixmodule.c + desired_access = api.FILE_READ_ATTRIBUTES + share_mode = 0 + security_attributes = None + creation_disposition = api.OPEN_EXISTING + flags_and_attributes = ( + api.FILE_ATTRIBUTE_NORMAL + | api.FILE_FLAG_BACKUP_SEMANTICS + | api.FILE_FLAG_OPEN_REPARSE_POINT + ) + template_file = None - handle = api.CreateFile( - path, - desired_access, - share_mode, - security_attributes, - creation_disposition, - flags_and_attributes, - template_file, - ) + handle = api.CreateFile( + path, + desired_access, + share_mode, + security_attributes, + creation_disposition, + flags_and_attributes, + template_file, + ) - if handle == api.INVALID_HANDLE_VALUE: - raise WindowsError() + if handle == api.INVALID_HANDLE_VALUE: + raise WindowsError() - info = api.BY_HANDLE_FILE_INFORMATION() - res = api.GetFileInformationByHandle(handle, info) - handle_nonzero_success(res) - handle_nonzero_success(api.CloseHandle(handle)) + info = api.BY_HANDLE_FILE_INFORMATION() + res = api.GetFileInformationByHandle(handle, info) + handle_nonzero_success(res) + handle_nonzero_success(api.CloseHandle(handle)) - return info + return info def GetBinaryType(filepath): - res = api.DWORD() - handle_nonzero_success(api._GetBinaryType(filepath, res)) - return res + res = api.DWORD() + handle_nonzero_success(api._GetBinaryType(filepath, res)) + return res def _make_null_terminated_list(obs): - obs = _makelist(obs) - if obs is None: - return - return u'\x00'.join(obs) + u'\x00\x00' + obs = _makelist(obs) + if obs is None: + return + return u'\x00'.join(obs) + u'\x00\x00' def _makelist(ob): - if ob is None: - return - if not isinstance(ob, (list, tuple, set)): - return [ob] - return ob + if ob is None: + return + if not isinstance(ob, (list, tuple, set)): + return [ob] + return ob def SHFileOperation(operation, from_, to=None, flags=[]): - flags = functools.reduce(operator.or_, flags, 0) - from_ = _make_null_terminated_list(from_) - to = _make_null_terminated_list(to) - params = api.SHFILEOPSTRUCT(0, operation, from_, to, flags) - res = api._SHFileOperation(params) - if res != 0: - raise RuntimeError("SHFileOperation returned %d" % res) + flags = functools.reduce(operator.or_, flags, 0) + from_ = _make_null_terminated_list(from_) + to = _make_null_terminated_list(to) + params = api.SHFILEOPSTRUCT(0, operation, from_, to, flags) + res = api._SHFileOperation(params) + if res != 0: + raise RuntimeError("SHFileOperation returned %d" % res) def join(*paths): - r""" - Wrapper around os.path.join that works with Windows drive letters. + r""" + Wrapper around os.path.join that works with Windows drive letters. - >>> join('d:\\foo', '\\bar') - 'd:\\bar' - """ - paths_with_drives = map(os.path.splitdrive, paths) - drives, paths = zip(*paths_with_drives) - # the drive we care about is the last one in the list - drive = next(filter(None, reversed(drives)), '') - return os.path.join(drive, os.path.join(*paths)) + >>> join('d:\\foo', '\\bar') + 'd:\\bar' + """ + paths_with_drives = map(os.path.splitdrive, paths) + drives, paths = zip(*paths_with_drives) + # the drive we care about is the last one in the list + drive = next(filter(None, reversed(drives)), '') + return os.path.join(drive, os.path.join(*paths)) def resolve_path(target, start=os.path.curdir): - r""" - Find a path from start to target where target is relative to start. + r""" + Find a path from start to target where target is relative to start. - >>> tmp = str(getfixture('tmpdir_as_cwd')) + >>> tmp = str(getfixture('tmpdir_as_cwd')) - >>> findpath('d:\\') - 'd:\\' + >>> findpath('d:\\') + 'd:\\' - >>> findpath('d:\\', tmp) - 'd:\\' + >>> findpath('d:\\', tmp) + 'd:\\' - >>> findpath('\\bar', 'd:\\') - 'd:\\bar' + >>> findpath('\\bar', 'd:\\') + 'd:\\bar' - >>> findpath('\\bar', 'd:\\foo') # fails with '\\bar' - 'd:\\bar' + >>> findpath('\\bar', 'd:\\foo') # fails with '\\bar' + 'd:\\bar' - >>> findpath('bar', 'd:\\foo') - 'd:\\foo\\bar' + >>> findpath('bar', 'd:\\foo') + 'd:\\foo\\bar' - >>> findpath('\\baz', 'd:\\foo\\bar') # fails with '\\baz' - 'd:\\baz' + >>> findpath('\\baz', 'd:\\foo\\bar') # fails with '\\baz' + 'd:\\baz' - >>> os.path.abspath(findpath('\\bar')).lower() - 'c:\\bar' + >>> os.path.abspath(findpath('\\bar')).lower() + 'c:\\bar' - >>> os.path.abspath(findpath('bar')) - '...\\bar' + >>> os.path.abspath(findpath('bar')) + '...\\bar' - >>> findpath('..', 'd:\\foo\\bar') - 'd:\\foo' + >>> findpath('..', 'd:\\foo\\bar') + 'd:\\foo' - The parent of the root directory is the root directory. - >>> findpath('..', 'd:\\') - 'd:\\' - """ - return os.path.normpath(join(start, target)) + The parent of the root directory is the root directory. + >>> findpath('..', 'd:\\') + 'd:\\' + """ + return os.path.normpath(join(start, target)) findpath = resolve_path def trace_symlink_target(link): - """ - Given a file that is known to be a symlink, trace it to its ultimate - target. + """ + Given a file that is known to be a symlink, trace it to its ultimate + target. - Raises TargetNotPresent when the target cannot be determined. - Raises ValueError when the specified link is not a symlink. - """ + Raises TargetNotPresent when the target cannot be determined. + Raises ValueError when the specified link is not a symlink. + """ - if not is_symlink(link): - raise ValueError("link must point to a symlink on the system") - while is_symlink(link): - orig = os.path.dirname(link) - link = readlink(link) - link = resolve_path(link, orig) - return link + if not is_symlink(link): + raise ValueError("link must point to a symlink on the system") + while is_symlink(link): + orig = os.path.dirname(link) + link = readlink(link) + link = resolve_path(link, orig) + return link def readlink(link): - """ - readlink(link) -> target - Return a string representing the path to which the symbolic link points. - """ - handle = api.CreateFile( - link, - 0, - 0, - None, - api.OPEN_EXISTING, - api.FILE_FLAG_OPEN_REPARSE_POINT | api.FILE_FLAG_BACKUP_SEMANTICS, - None, - ) + """ + readlink(link) -> target + Return a string representing the path to which the symbolic link points. + """ + handle = api.CreateFile( + link, + 0, + 0, + None, + api.OPEN_EXISTING, + api.FILE_FLAG_OPEN_REPARSE_POINT | api.FILE_FLAG_BACKUP_SEMANTICS, + None, + ) - if handle == api.INVALID_HANDLE_VALUE: - raise WindowsError() + if handle == api.INVALID_HANDLE_VALUE: + raise WindowsError() - res = reparse.DeviceIoControl( - handle, api.FSCTL_GET_REPARSE_POINT, None, 10240) + res = reparse.DeviceIoControl(handle, api.FSCTL_GET_REPARSE_POINT, None, 10240) - bytes = create_string_buffer(res) - p_rdb = cast(bytes, POINTER(api.REPARSE_DATA_BUFFER)) - rdb = p_rdb.contents - if not rdb.tag == api.IO_REPARSE_TAG_SYMLINK: - raise RuntimeError("Expected IO_REPARSE_TAG_SYMLINK, but got %d" % rdb.tag) + bytes = create_string_buffer(res) + p_rdb = cast(bytes, POINTER(api.REPARSE_DATA_BUFFER)) + rdb = p_rdb.contents + if not rdb.tag == api.IO_REPARSE_TAG_SYMLINK: + raise RuntimeError("Expected IO_REPARSE_TAG_SYMLINK, but got %d" % rdb.tag) - handle_nonzero_success(api.CloseHandle(handle)) - return rdb.get_substitute_name() + handle_nonzero_success(api.CloseHandle(handle)) + return rdb.get_substitute_name() def patch_os_module(): - """ - jaraco.windows provides the os.symlink and os.readlink functions. - Monkey-patch the os module to include them if not present. - """ - if not hasattr(os, 'symlink'): - os.symlink = symlink - os.path.islink = islink - if not hasattr(os, 'readlink'): - os.readlink = readlink + """ + jaraco.windows provides the os.symlink and os.readlink functions. + Monkey-patch the os module to include them if not present. + """ + if not hasattr(os, 'symlink'): + os.symlink = symlink + os.path.islink = islink + if not hasattr(os, 'readlink'): + os.readlink = readlink def find_symlinks(root): - for dirpath, dirnames, filenames in os.walk(root): - for name in dirnames + filenames: - pathname = os.path.join(dirpath, name) - if is_symlink(pathname): - yield pathname - # don't traverse symlinks - if name in dirnames: - dirnames.remove(name) + for dirpath, dirnames, filenames in os.walk(root): + for name in dirnames + filenames: + pathname = os.path.join(dirpath, name) + if is_symlink(pathname): + yield pathname + # don't traverse symlinks + if name in dirnames: + dirnames.remove(name) def find_symlinks_cmd(): - """ - %prog [start-path] - Search the specified path (defaults to the current directory) for symlinks, - printing the source and target on each line. - """ - from optparse import OptionParser - from textwrap import dedent - parser = OptionParser(usage=dedent(find_symlinks_cmd.__doc__).strip()) - options, args = parser.parse_args() - if not args: - args = ['.'] - root = args.pop() - if args: - parser.error("unexpected argument(s)") - try: - for symlink in find_symlinks(root): - target = readlink(symlink) - dir = ['', 'D'][os.path.isdir(symlink)] - msg = '{dir:2}{symlink} --> {target}'.format(**locals()) - print(msg) - except KeyboardInterrupt: - pass + """ + %prog [start-path] + Search the specified path (defaults to the current directory) for symlinks, + printing the source and target on each line. + """ + from optparse import OptionParser + from textwrap import dedent + + parser = OptionParser(usage=dedent(find_symlinks_cmd.__doc__).strip()) + options, args = parser.parse_args() + if not args: + args = ['.'] + root = args.pop() + if args: + parser.error("unexpected argument(s)") + try: + for symlink in find_symlinks(root): + target = readlink(symlink) + dir = ['', 'D'][os.path.isdir(symlink)] + msg = '{dir:2}{symlink} --> {target}'.format(**locals()) + print(msg) + except KeyboardInterrupt: + pass -@six.add_metaclass(binary.BitMask) -class FileAttributes(int): +class FileAttributes(int, metaclass=binary.BitMask): - # extract the values from the stat module on Python 3.5 - # and later. - locals().update( - (name.split('FILE_ATTRIBUTES_')[1].lower(), value) - for name, value in vars(stat).items() - if name.startswith('FILE_ATTRIBUTES_') - ) + # extract the values from the stat module on Python 3.5 + # and later. + locals().update( + (name.split('FILE_ATTRIBUTES_')[1].lower(), value) + for name, value in vars(stat).items() + if name.startswith('FILE_ATTRIBUTES_') + ) - # For Python 3.4 and earlier, define the constants here - archive = 0x20 - compressed = 0x800 - hidden = 0x2 - device = 0x40 - directory = 0x10 - encrypted = 0x4000 - normal = 0x80 - not_content_indexed = 0x2000 - offline = 0x1000 - read_only = 0x1 - reparse_point = 0x400 - sparse_file = 0x200 - system = 0x4 - temporary = 0x100 - virtual = 0x10000 + # For Python 3.4 and earlier, define the constants here + archive = 0x20 + compressed = 0x800 + hidden = 0x2 + device = 0x40 + directory = 0x10 + encrypted = 0x4000 + normal = 0x80 + not_content_indexed = 0x2000 + offline = 0x1000 + read_only = 0x1 + reparse_point = 0x400 + sparse_file = 0x200 + system = 0x4 + temporary = 0x100 + virtual = 0x10000 - @classmethod - def get(cls, filepath): - attrs = api.GetFileAttributes(filepath) - if attrs == api.INVALID_FILE_ATTRIBUTES: - raise WindowsError() - return cls(attrs) + @classmethod + def get(cls, filepath): + attrs = api.GetFileAttributes(filepath) + if attrs == api.INVALID_FILE_ATTRIBUTES: + raise WindowsError() + return cls(attrs) GetFileAttributes = FileAttributes.get def SetFileAttributes(filepath, *attrs): - """ - Set file attributes. e.g.: + """ + Set file attributes. e.g.: - SetFileAttributes('C:\\foo', 'hidden') + SetFileAttributes('C:\\foo', 'hidden') - Each attr must be either a numeric value, a constant defined in - jaraco.windows.filesystem.api, or one of the nice names - defined in this function. - """ - nice_names = collections.defaultdict( - lambda key: key, - hidden='FILE_ATTRIBUTE_HIDDEN', - read_only='FILE_ATTRIBUTE_READONLY', - ) - flags = (getattr(api, nice_names[attr], attr) for attr in attrs) - flags = functools.reduce(operator.or_, flags) - handle_nonzero_success(api.SetFileAttributes(filepath, flags)) + Each attr must be either a numeric value, a constant defined in + jaraco.windows.filesystem.api, or one of the nice names + defined in this function. + """ + nice_names = collections.defaultdict( + lambda key: key, + hidden='FILE_ATTRIBUTE_HIDDEN', + read_only='FILE_ATTRIBUTE_READONLY', + ) + flags = (getattr(api, nice_names[attr], attr) for attr in attrs) + flags = functools.reduce(operator.or_, flags) + handle_nonzero_success(api.SetFileAttributes(filepath, flags)) diff --git a/libs/win/jaraco/windows/filesystem/backports.py b/libs/win/jaraco/windows/filesystem/backports.py index abb45d07..d26c92b8 100644 --- a/libs/win/jaraco/windows/filesystem/backports.py +++ b/libs/win/jaraco/windows/filesystem/backports.py @@ -1,109 +1,107 @@ -from __future__ import unicode_literals - import os.path # realpath taken from https://bugs.python.org/file38057/issue9949-v4.patch def realpath(path): - if isinstance(path, str): - prefix = '\\\\?\\' - unc_prefix = prefix + 'UNC' - new_unc_prefix = '\\' - cwd = os.getcwd() - else: - prefix = b'\\\\?\\' - unc_prefix = prefix + b'UNC' - new_unc_prefix = b'\\' - cwd = os.getcwdb() - had_prefix = path.startswith(prefix) - path, ok = _resolve_path(cwd, path, {}) - # The path returned by _getfinalpathname will always start with \\?\ - - # strip off that prefix unless it was already provided on the original - # path. - if not had_prefix: - # For UNC paths, the prefix will actually be \\?\UNC - handle that - # case as well. - if path.startswith(unc_prefix): - path = new_unc_prefix + path[len(unc_prefix):] - elif path.startswith(prefix): - path = path[len(prefix):] - return path + if isinstance(path, str): + prefix = '\\\\?\\' + unc_prefix = prefix + 'UNC' + new_unc_prefix = '\\' + cwd = os.getcwd() + else: + prefix = b'\\\\?\\' + unc_prefix = prefix + b'UNC' + new_unc_prefix = b'\\' + cwd = os.getcwdb() + had_prefix = path.startswith(prefix) + path, ok = _resolve_path(cwd, path, {}) + # The path returned by _getfinalpathname will always start with \\?\ - + # strip off that prefix unless it was already provided on the original + # path. + if not had_prefix: + # For UNC paths, the prefix will actually be \\?\UNC - handle that + # case as well. + if path.startswith(unc_prefix): + path = new_unc_prefix + path[len(unc_prefix) :] + elif path.startswith(prefix): + path = path[len(prefix) :] + return path -def _resolve_path(path, rest, seen): - # Windows normalizes the path before resolving symlinks; be sure to - # follow the same behavior. - rest = os.path.normpath(rest) +def _resolve_path(path, rest, seen): # noqa: C901 + # Windows normalizes the path before resolving symlinks; be sure to + # follow the same behavior. + rest = os.path.normpath(rest) - if isinstance(rest, str): - sep = '\\' - else: - sep = b'\\' + if isinstance(rest, str): + sep = '\\' + else: + sep = b'\\' - if os.path.isabs(rest): - drive, rest = os.path.splitdrive(rest) - path = drive + sep - rest = rest[1:] + if os.path.isabs(rest): + drive, rest = os.path.splitdrive(rest) + path = drive + sep + rest = rest[1:] - while rest: - name, _, rest = rest.partition(sep) - new_path = os.path.join(path, name) if path else name - if os.path.exists(new_path): - if not rest: - # The whole path exists. Resolve it using the OS. - path = os.path._getfinalpathname(new_path) - else: - # The OS can resolve `new_path`; keep traversing the path. - path = new_path - elif not os.path.lexists(new_path): - # `new_path` does not exist on the filesystem at all. Use the - # OS to resolve `path`, if it exists, and then append the - # remainder. - if os.path.exists(path): - path = os.path._getfinalpathname(path) - rest = os.path.join(name, rest) if rest else name - return os.path.join(path, rest), True - else: - # We have a symbolic link that the OS cannot resolve. Try to - # resolve it ourselves. + while rest: + name, _, rest = rest.partition(sep) + new_path = os.path.join(path, name) if path else name + if os.path.exists(new_path): + if not rest: + # The whole path exists. Resolve it using the OS. + path = os.path._getfinalpathname(new_path) + else: + # The OS can resolve `new_path`; keep traversing the path. + path = new_path + elif not os.path.lexists(new_path): + # `new_path` does not exist on the filesystem at all. Use the + # OS to resolve `path`, if it exists, and then append the + # remainder. + if os.path.exists(path): + path = os.path._getfinalpathname(path) + rest = os.path.join(name, rest) if rest else name + return os.path.join(path, rest), True + else: + # We have a symbolic link that the OS cannot resolve. Try to + # resolve it ourselves. - # On Windows, symbolic link resolution can be partially or - # fully disabled [1]. The end result of a disabled symlink - # appears the same as a broken symlink (lexists() returns True - # but exists() returns False). And in both cases, the link can - # still be read using readlink(). Call stat() and check the - # resulting error code to ensure we don't circumvent the - # Windows symbolic link restrictions. - # [1] https://technet.microsoft.com/en-us/library/cc754077.aspx - try: - os.stat(new_path) - except OSError as e: - # WinError 1463: The symbolic link cannot be followed - # because its type is disabled. - if e.winerror == 1463: - raise + # On Windows, symbolic link resolution can be partially or + # fully disabled [1]. The end result of a disabled symlink + # appears the same as a broken symlink (lexists() returns True + # but exists() returns False). And in both cases, the link can + # still be read using readlink(). Call stat() and check the + # resulting error code to ensure we don't circumvent the + # Windows symbolic link restrictions. + # [1] https://technet.microsoft.com/en-us/library/cc754077.aspx + try: + os.stat(new_path) + except OSError as e: + # WinError 1463: The symbolic link cannot be followed + # because its type is disabled. + if e.winerror == 1463: + raise - key = os.path.normcase(new_path) - if key in seen: - # This link has already been seen; try to use the - # previously resolved value. - path = seen[key] - if path is None: - # It has not yet been resolved, which means we must - # have a symbolic link loop. Return what we have - # resolved so far plus the remainder of the path (who - # cares about the Zen of Python?). - path = os.path.join(new_path, rest) if rest else new_path - return path, False - else: - # Mark this link as in the process of being resolved. - seen[key] = None - # Try to resolve it. - path, ok = _resolve_path(path, os.readlink(new_path), seen) - if ok: - # Resolution succeded; store the resolved value. - seen[key] = path - else: - # Resolution failed; punt. - return (os.path.join(path, rest) if rest else path), False - return path, True + key = os.path.normcase(new_path) + if key in seen: + # This link has already been seen; try to use the + # previously resolved value. + path = seen[key] + if path is None: + # It has not yet been resolved, which means we must + # have a symbolic link loop. Return what we have + # resolved so far plus the remainder of the path (who + # cares about the Zen of Python?). + path = os.path.join(new_path, rest) if rest else new_path + return path, False + else: + # Mark this link as in the process of being resolved. + seen[key] = None + # Try to resolve it. + path, ok = _resolve_path(path, os.readlink(new_path), seen) + if ok: + # Resolution succeded; store the resolved value. + seen[key] = path + else: + # Resolution failed; punt. + return (os.path.join(path, rest) if rest else path), False + return path, True diff --git a/libs/win/jaraco/windows/filesystem/change.py b/libs/win/jaraco/windows/filesystem/change.py index 620d9272..7a3c508f 100644 --- a/libs/win/jaraco/windows/filesystem/change.py +++ b/libs/win/jaraco/windows/filesystem/change.py @@ -1,14 +1,10 @@ -# -*- coding: UTF-8 -*- - """ FileChange - Classes and routines for monitoring the file system for changes. + Classes and routines for monitoring the file system for changes. Copyright © 2004, 2011, 2013 Jason R. Coombs """ -from __future__ import print_function - import os import sys import datetime @@ -17,8 +13,6 @@ from threading import Thread import itertools import logging -import six - from more_itertools.recipes import consume import jaraco.text @@ -29,243 +23,237 @@ log = logging.getLogger(__name__) class NotifierException(Exception): - pass + pass class FileFilter(object): - def set_root(self, root): - self.root = root + def set_root(self, root): + self.root = root - def _get_file_path(self, filename): - try: - filename = os.path.join(self.root, filename) - except AttributeError: - pass - return filename + def _get_file_path(self, filename): + try: + filename = os.path.join(self.root, filename) + except AttributeError: + pass + return filename class ModifiedTimeFilter(FileFilter): - """ - Returns true for each call where the modified time of the file is after - the cutoff time. - """ - def __init__(self, cutoff): - self.cutoff = cutoff + """ + Returns true for each call where the modified time of the file is after + the cutoff time. + """ - def __call__(self, file): - filepath = self._get_file_path(file) - last_mod = datetime.datetime.utcfromtimestamp( - os.stat(filepath).st_mtime) - log.debug('{filepath} last modified at {last_mod}.'.format(**vars())) - return last_mod > self.cutoff + def __init__(self, cutoff): + self.cutoff = cutoff + + def __call__(self, file): + filepath = self._get_file_path(file) + last_mod = datetime.datetime.utcfromtimestamp(os.stat(filepath).st_mtime) + log.debug('{filepath} last modified at {last_mod}.'.format(**vars())) + return last_mod > self.cutoff class PatternFilter(FileFilter): - """ - Filter that returns True for files that match pattern (a regular - expression). - """ - def __init__(self, pattern): - self.pattern = ( - re.compile(pattern) if isinstance(pattern, six.string_types) - else pattern - ) + """ + Filter that returns True for files that match pattern (a regular + expression). + """ - def __call__(self, file): - return bool(self.pattern.match(file, re.I)) + def __init__(self, pattern): + self.pattern = re.compile(pattern) if isinstance(pattern, str) else pattern + + def __call__(self, file): + return bool(self.pattern.match(file, re.I)) class GlobFilter(PatternFilter): - """ - Filter that returns True for files that match the pattern (a glob - expression. - """ - def __init__(self, expression): - super(GlobFilter, self).__init__( - self.convert_file_pattern(expression)) + """ + Filter that returns True for files that match the pattern (a glob + expression. + """ - @staticmethod - def convert_file_pattern(p): - r""" - converts a filename specification (such as c:\*.*) to an equivelent - regular expression - >>> GlobFilter.convert_file_pattern('/*') - '/.*' - """ - subs = (('\\', '\\\\'), ('.', '\\.'), ('*', '.*'), ('?', '.')) - return jaraco.text.multi_substitution(*subs)(p) + def __init__(self, expression): + super(GlobFilter, self).__init__(self.convert_file_pattern(expression)) + + @staticmethod + def convert_file_pattern(p): + r""" + converts a filename specification (such as c:\*.*) to an equivelent + regular expression + >>> GlobFilter.convert_file_pattern('/*') + '/.*' + """ + subs = (('\\', '\\\\'), ('.', '\\.'), ('*', '.*'), ('?', '.')) + return jaraco.text.multi_substitution(*subs)(p) class AggregateFilter(FileFilter): - """ - This file filter will aggregate the filters passed to it, and when called, - will return the results of each filter ANDed together. - """ - def __init__(self, *filters): - self.filters = filters + """ + This file filter will aggregate the filters passed to it, and when called, + will return the results of each filter ANDed together. + """ - def set_root(self, root): - consume(f.set_root(root) for f in self.filters) + def __init__(self, *filters): + self.filters = filters - def __call__(self, file): - return all(fil(file) for fil in self.filters) + def set_root(self, root): + consume(f.set_root(root) for f in self.filters) + + def __call__(self, file): + return all(fil(file) for fil in self.filters) class OncePerModFilter(FileFilter): - def __init__(self): - self.history = list() + def __init__(self): + self.history = list() - def __call__(self, file): - file = os.path.join(self.root, file) - key = file, os.stat(file).st_mtime - result = key not in self.history - self.history.append(key) - if len(self.history) > 100: - del self.history[-50:] - return result + def __call__(self, file): + file = os.path.join(self.root, file) + key = file, os.stat(file).st_mtime + result = key not in self.history + self.history.append(key) + if len(self.history) > 100: + del self.history[-50:] + return result def files_with_path(files, path): - return (os.path.join(path, file) for file in files) + return (os.path.join(path, file) for file in files) def get_file_paths(walk_result): - root, dirs, files = walk_result - return files_with_path(files, root) + root, dirs, files = walk_result + return files_with_path(files, root) class Notifier(object): - def __init__(self, root='.', filters=[]): - # assign the root, verify it exists - self.root = root - if not os.path.isdir(self.root): - raise NotifierException( - 'Root directory "%s" does not exist' % self.root) - self.filters = filters + def __init__(self, root='.', filters=[]): + # assign the root, verify it exists + self.root = root + if not os.path.isdir(self.root): + raise NotifierException('Root directory "%s" does not exist' % self.root) + self.filters = filters - self.watch_subtree = False - self.quit_event = event.CreateEvent(None, 0, 0, None) - self.opm_filter = OncePerModFilter() + self.watch_subtree = False + self.quit_event = event.CreateEvent(None, 0, 0, None) + self.opm_filter = OncePerModFilter() - def __del__(self): - try: - fs.FindCloseChangeNotification(self.hChange) - except Exception: - pass + def __del__(self): + try: + fs.FindCloseChangeNotification(self.hChange) + except Exception: + pass - def _get_change_handle(self): - # set up to monitor the directory tree specified - self.hChange = fs.FindFirstChangeNotification( - self.root, - self.watch_subtree, - fs.FILE_NOTIFY_CHANGE_LAST_WRITE, - ) + def _get_change_handle(self): + # set up to monitor the directory tree specified + self.hChange = fs.FindFirstChangeNotification( + self.root, self.watch_subtree, fs.FILE_NOTIFY_CHANGE_LAST_WRITE + ) - # make sure it worked; if not, bail - INVALID_HANDLE_VALUE = fs.INVALID_HANDLE_VALUE - if self.hChange == INVALID_HANDLE_VALUE: - raise NotifierException( - 'Could not set up directory change notification') + # make sure it worked; if not, bail + INVALID_HANDLE_VALUE = fs.INVALID_HANDLE_VALUE + if self.hChange == INVALID_HANDLE_VALUE: + raise NotifierException('Could not set up directory change notification') - @staticmethod - def _filtered_walk(path, file_filter): - """ - static method that calls os.walk, but filters out - anything that doesn't match the filter - """ - for root, dirs, files in os.walk(path): - log.debug('looking in %s', root) - log.debug('files is %s', files) - file_filter.set_root(root) - files = filter(file_filter, files) - log.debug('filtered files is %s', files) - yield (root, dirs, files) + @staticmethod + def _filtered_walk(path, file_filter): + """ + static method that calls os.walk, but filters out + anything that doesn't match the filter + """ + for root, dirs, files in os.walk(path): + log.debug('looking in %s', root) + log.debug('files is %s', files) + file_filter.set_root(root) + files = filter(file_filter, files) + log.debug('filtered files is %s', files) + yield (root, dirs, files) - def quit(self): - event.SetEvent(self.quit_event) + def quit(self): + event.SetEvent(self.quit_event) class BlockingNotifier(Notifier): + @staticmethod + def wait_results(*args): + """calls WaitForMultipleObjects repeatedly with args""" + return itertools.starmap(event.WaitForMultipleObjects, itertools.repeat(args)) - @staticmethod - def wait_results(*args): - """ calls WaitForMultipleObjects repeatedly with args """ - return itertools.starmap( - event.WaitForMultipleObjects, - itertools.repeat(args)) + def get_changed_files(self): + self._get_change_handle() + check_time = datetime.datetime.utcnow() + # block (sleep) until something changes in the + # target directory or a quit is requested. + # timeout so we can catch keyboard interrupts or other exceptions + events = (self.hChange, self.quit_event) + for result in self.wait_results(events, False, 1000): + if result == event.WAIT_TIMEOUT: + continue + index = result - event.WAIT_OBJECT_0 + if events[index] is self.quit_event: + # quit was received; stop yielding results + return - def get_changed_files(self): - self._get_change_handle() - check_time = datetime.datetime.utcnow() - # block (sleep) until something changes in the - # target directory or a quit is requested. - # timeout so we can catch keyboard interrupts or other exceptions - events = (self.hChange, self.quit_event) - for result in self.wait_results(events, False, 1000): - if result == event.WAIT_TIMEOUT: - continue - index = result - event.WAIT_OBJECT_0 - if events[index] is self.quit_event: - # quit was received; stop yielding results - return + # something has changed. + log.debug('Change notification received') + fs.FindNextChangeNotification(self.hChange) + next_check_time = datetime.datetime.utcnow() + log.debug('Looking for all files changed after %s', check_time) + for file in self.find_files_after(check_time): + yield file + check_time = next_check_time - # something has changed. - log.debug('Change notification received') - fs.FindNextChangeNotification(self.hChange) - next_check_time = datetime.datetime.utcnow() - log.debug('Looking for all files changed after %s', check_time) - for file in self.find_files_after(check_time): - yield file - check_time = next_check_time - - def find_files_after(self, cutoff): - mtf = ModifiedTimeFilter(cutoff) - af = AggregateFilter(mtf, self.opm_filter, *self.filters) - results = Notifier._filtered_walk(self.root, af) - results = itertools.imap(get_file_paths, results) - if self.watch_subtree: - result = itertools.chain(*results) - else: - result = next(results) - return result + def find_files_after(self, cutoff): + mtf = ModifiedTimeFilter(cutoff) + af = AggregateFilter(mtf, self.opm_filter, *self.filters) + results = Notifier._filtered_walk(self.root, af) + results = itertools.imap(get_file_paths, results) + if self.watch_subtree: + result = itertools.chain(*results) + else: + result = next(results) + return result class ThreadedNotifier(BlockingNotifier, Thread): - r""" - ThreadedNotifier provides a simple interface that calls the handler - for each file rooted in root that passes the filters. It runs as its own - thread, so must be started as such:: + r""" + ThreadedNotifier provides a simple interface that calls the handler + for each file rooted in root that passes the filters. It runs as its own + thread, so must be started as such:: - notifier = ThreadedNotifier('c:\\', handler = StreamHandler()) - notifier.start() - C:\Autoexec.bat changed. - """ - def __init__(self, root='.', filters=[], handler=lambda file: None): - # init notifier stuff - BlockingNotifier.__init__(self, root, filters) - # init thread stuff - Thread.__init__(self) - # set it as a daemon thread so that it doesn't block waiting to close. - # I tried setting __del__(self) to .quit(), but unfortunately, there - # are references to this object in the win32api stuff, so __del__ - # never gets called. - self.setDaemon(True) + notifier = ThreadedNotifier('c:\\', handler = StreamHandler()) + notifier.start() + C:\Autoexec.bat changed. + """ - self.handle = handler + def __init__(self, root='.', filters=[], handler=lambda file: None): + # init notifier stuff + BlockingNotifier.__init__(self, root, filters) + # init thread stuff + Thread.__init__(self) + # set it as a daemon thread so that it doesn't block waiting to close. + # I tried setting __del__(self) to .quit(), but unfortunately, there + # are references to this object in the win32api stuff, so __del__ + # never gets called. + self.setDaemon(True) - def run(self): - for file in self.get_changed_files(): - self.handle(file) + self.handle = handler + + def run(self): + for file in self.get_changed_files(): + self.handle(file) class StreamHandler(object): - """ - StreamHandler: a sample handler object for use with the threaded - notifier that will announce by writing to the supplied stream - (stdout by default) the name of the file. - """ - def __init__(self, output=sys.stdout): - self.output = output + """ + StreamHandler: a sample handler object for use with the threaded + notifier that will announce by writing to the supplied stream + (stdout by default) the name of the file. + """ - def __call__(self, filename): - self.output.write('%s changed.\n' % filename) + def __init__(self, output=sys.stdout): + self.output = output + + def __call__(self, filename): + self.output.write('%s changed.\n' % filename) diff --git a/libs/win/jaraco/windows/inet.py b/libs/win/jaraco/windows/inet.py index 37c40cda..4c98dc54 100644 --- a/libs/win/jaraco/windows/inet.py +++ b/libs/win/jaraco/windows/inet.py @@ -3,8 +3,6 @@ Some routines for retrieving the addresses from the local network config. """ -from __future__ import print_function - import itertools import ctypes @@ -13,112 +11,108 @@ from jaraco.windows.api import errors, inet def GetAdaptersAddresses(): - size = ctypes.c_ulong() - res = inet.GetAdaptersAddresses(0, 0, None, None, size) - if res != errors.ERROR_BUFFER_OVERFLOW: - raise RuntimeError("Error getting structure length (%d)" % res) - print(size.value) - pointer_type = ctypes.POINTER(inet.IP_ADAPTER_ADDRESSES) - buffer = ctypes.create_string_buffer(size.value) - struct_p = ctypes.cast(buffer, pointer_type) - res = inet.GetAdaptersAddresses(0, 0, None, struct_p, size) - if res != errors.NO_ERROR: - raise RuntimeError("Error retrieving table (%d)" % res) - while struct_p: - yield struct_p.contents - struct_p = struct_p.contents.next + size = ctypes.c_ulong() + res = inet.GetAdaptersAddresses(0, 0, None, None, size) + if res != errors.ERROR_BUFFER_OVERFLOW: + raise RuntimeError("Error getting structure length (%d)" % res) + print(size.value) + pointer_type = ctypes.POINTER(inet.IP_ADAPTER_ADDRESSES) + buffer = ctypes.create_string_buffer(size.value) + struct_p = ctypes.cast(buffer, pointer_type) + res = inet.GetAdaptersAddresses(0, 0, None, struct_p, size) + if res != errors.NO_ERROR: + raise RuntimeError("Error retrieving table (%d)" % res) + while struct_p: + yield struct_p.contents + struct_p = struct_p.contents.next class AllocatedTable(object): - """ - Both the interface table and the ip address table use the same - technique to store arrays of structures of variable length. This - base class captures the functionality to retrieve and access those - table entries. + """ + Both the interface table and the ip address table use the same + technique to store arrays of structures of variable length. This + base class captures the functionality to retrieve and access those + table entries. - The subclass needs to define three class attributes: - method: a callable that takes three arguments - a pointer to - the structure, the length of the data contained by the - structure, and a boolean of whether the result should - be sorted. - structure: a C structure defininition that describes the table - format. - row_structure: a C structure definition that describes the row - format. - """ - def __get_table_size(self): - """ - Retrieve the size of the buffer needed by calling the method - with a null pointer and length of zero. This should trigger an - insufficient buffer error and return the size needed for the - buffer. - """ - length = ctypes.wintypes.DWORD() - res = self.method(None, length, False) - if res != errors.ERROR_INSUFFICIENT_BUFFER: - raise RuntimeError("Error getting table length (%d)" % res) - return length.value + The subclass needs to define three class attributes: + method: a callable that takes three arguments - a pointer to + the structure, the length of the data contained by the + structure, and a boolean of whether the result should + be sorted. + structure: a C structure defininition that describes the table + format. + row_structure: a C structure definition that describes the row + format. + """ - def get_table(self): - """ - Get the table - """ - buffer_length = self.__get_table_size() - returned_buffer_length = ctypes.wintypes.DWORD(buffer_length) - buffer = ctypes.create_string_buffer(buffer_length) - pointer_type = ctypes.POINTER(self.structure) - table_p = ctypes.cast(buffer, pointer_type) - res = self.method(table_p, returned_buffer_length, False) - if res != errors.NO_ERROR: - raise RuntimeError("Error retrieving table (%d)" % res) - return table_p.contents + def __get_table_size(self): + """ + Retrieve the size of the buffer needed by calling the method + with a null pointer and length of zero. This should trigger an + insufficient buffer error and return the size needed for the + buffer. + """ + length = ctypes.wintypes.DWORD() + res = self.method(None, length, False) + if res != errors.ERROR_INSUFFICIENT_BUFFER: + raise RuntimeError("Error getting table length (%d)" % res) + return length.value - @property - def entries(self): - """ - Using the table structure, return the array of entries based - on the table size. - """ - table = self.get_table() - entries_array = self.row_structure * table.num_entries - pointer_type = ctypes.POINTER(entries_array) - return ctypes.cast(table.entries, pointer_type).contents + def get_table(self): + """ + Get the table + """ + buffer_length = self.__get_table_size() + returned_buffer_length = ctypes.wintypes.DWORD(buffer_length) + buffer = ctypes.create_string_buffer(buffer_length) + pointer_type = ctypes.POINTER(self.structure) + table_p = ctypes.cast(buffer, pointer_type) + res = self.method(table_p, returned_buffer_length, False) + if res != errors.NO_ERROR: + raise RuntimeError("Error retrieving table (%d)" % res) + return table_p.contents + + @property + def entries(self): + """ + Using the table structure, return the array of entries based + on the table size. + """ + table = self.get_table() + entries_array = self.row_structure * table.num_entries + pointer_type = ctypes.POINTER(entries_array) + return ctypes.cast(table.entries, pointer_type).contents class InterfaceTable(AllocatedTable): - method = inet.GetIfTable - structure = inet.MIB_IFTABLE - row_structure = inet.MIB_IFROW + method = inet.GetIfTable + structure = inet.MIB_IFTABLE + row_structure = inet.MIB_IFROW class AddressTable(AllocatedTable): - method = inet.GetIpAddrTable - structure = inet.MIB_IPADDRTABLE - row_structure = inet.MIB_IPADDRROW + method = inet.GetIpAddrTable + structure = inet.MIB_IPADDRTABLE + row_structure = inet.MIB_IPADDRROW class AddressManager(object): - @staticmethod - def hardware_address_to_string(addr): - hex_bytes = (byte.encode('hex') for byte in addr) - return ':'.join(hex_bytes) + @staticmethod + def hardware_address_to_string(addr): + hex_bytes = (byte.encode('hex') for byte in addr) + return ':'.join(hex_bytes) - def get_host_mac_address_strings(self): - return ( - self.hardware_address_to_string(addr) - for addr in self.get_host_mac_addresses()) + def get_host_mac_address_strings(self): + return ( + self.hardware_address_to_string(addr) + for addr in self.get_host_mac_addresses() + ) - def get_host_ip_address_strings(self): - return itertools.imap(str, self.get_host_ip_addresses()) + def get_host_ip_address_strings(self): + return itertools.imap(str, self.get_host_ip_addresses()) - def get_host_mac_addresses(self): - return ( - entry.physical_address - for entry in InterfaceTable().entries - ) + def get_host_mac_addresses(self): + return (entry.physical_address for entry in InterfaceTable().entries) - def get_host_ip_addresses(self): - return ( - entry.address - for entry in AddressTable().entries - ) + def get_host_ip_addresses(self): + return (entry.address for entry in AddressTable().entries) diff --git a/libs/win/jaraco/windows/lib.py b/libs/win/jaraco/windows/lib.py index 0602c8e0..64ebfffb 100644 --- a/libs/win/jaraco/windows/lib.py +++ b/libs/win/jaraco/windows/lib.py @@ -4,18 +4,18 @@ from .api import library def find_lib(lib): - r""" - Find the DLL for a given library. + r""" + Find the DLL for a given library. - Accepts a string or loaded module + Accepts a string or loaded module - >>> print(find_lib('kernel32').lower()) - c:\windows\system32\kernel32.dll - """ - if isinstance(lib, str): - lib = getattr(ctypes.windll, lib) + >>> print(find_lib('kernel32').lower()) + c:\windows\system32\kernel32.dll + """ + if isinstance(lib, str): + lib = getattr(ctypes.windll, lib) - size = 1024 - result = ctypes.create_unicode_buffer(size) - library.GetModuleFileName(lib._handle, result, size) - return result.value + size = 1024 + result = ctypes.create_unicode_buffer(size) + library.GetModuleFileName(lib._handle, result, size) + return result.value diff --git a/libs/win/jaraco/windows/memory.py b/libs/win/jaraco/windows/memory.py index d4bcb83c..1e989376 100644 --- a/libs/win/jaraco/windows/memory.py +++ b/libs/win/jaraco/windows/memory.py @@ -5,25 +5,25 @@ from .api import memory class LockedMemory(object): - def __init__(self, handle): - self.handle = handle + def __init__(self, handle): + self.handle = handle - def __enter__(self): - self.data_ptr = memory.GlobalLock(self.handle) - if not self.data_ptr: - del self.data_ptr - raise WinError() - return self + def __enter__(self): + self.data_ptr = memory.GlobalLock(self.handle) + if not self.data_ptr: + del self.data_ptr + raise WinError() + return self - def __exit__(self, *args): - memory.GlobalUnlock(self.handle) - del self.data_ptr + def __exit__(self, *args): + memory.GlobalUnlock(self.handle) + del self.data_ptr - @property - def data(self): - with self: - return ctypes.string_at(self.data_ptr, self.size) + @property + def data(self): + with self: + return ctypes.string_at(self.data_ptr, self.size) - @property - def size(self): - return memory.GlobalSize(self.data_ptr) + @property + def size(self): + return memory.GlobalSize(self.data_ptr) diff --git a/libs/win/jaraco/windows/mmap.py b/libs/win/jaraco/windows/mmap.py index 11460894..c64c2548 100644 --- a/libs/win/jaraco/windows/mmap.py +++ b/libs/win/jaraco/windows/mmap.py @@ -1,63 +1,66 @@ import ctypes.wintypes -import six - from .error import handle_nonzero_success from .api import memory class MemoryMap(object): - """ - A memory map object which can have security attributes overridden. - """ - def __init__(self, name, length, security_attributes=None): - self.name = name - self.length = length - self.security_attributes = security_attributes - self.pos = 0 + """ + A memory map object which can have security attributes overridden. + """ - def __enter__(self): - p_SA = ( - ctypes.byref(self.security_attributes) - if self.security_attributes else None - ) - INVALID_HANDLE_VALUE = -1 - PAGE_READWRITE = 0x4 - FILE_MAP_WRITE = 0x2 - filemap = ctypes.windll.kernel32.CreateFileMappingW( - INVALID_HANDLE_VALUE, p_SA, PAGE_READWRITE, 0, self.length, - six.text_type(self.name)) - handle_nonzero_success(filemap) - if filemap == INVALID_HANDLE_VALUE: - raise Exception("Failed to create file mapping") - self.filemap = filemap - self.view = memory.MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0) - return self + def __init__(self, name, length, security_attributes=None): + self.name = name + self.length = length + self.security_attributes = security_attributes + self.pos = 0 - def seek(self, pos): - self.pos = pos + def __enter__(self): + p_SA = ( + ctypes.byref(self.security_attributes) if self.security_attributes else None + ) + INVALID_HANDLE_VALUE = -1 + PAGE_READWRITE = 0x4 + FILE_MAP_WRITE = 0x2 + filemap = ctypes.windll.kernel32.CreateFileMappingW( + INVALID_HANDLE_VALUE, + p_SA, + PAGE_READWRITE, + 0, + self.length, + str(self.name), + ) + handle_nonzero_success(filemap) + if filemap == INVALID_HANDLE_VALUE: + raise Exception("Failed to create file mapping") + self.filemap = filemap + self.view = memory.MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0) + return self - def write(self, msg): - assert isinstance(msg, bytes) - n = len(msg) - if self.pos + n >= self.length: # A little safety. - raise ValueError("Refusing to write %d bytes" % n) - dest = self.view + self.pos - length = ctypes.c_size_t(n) - ctypes.windll.kernel32.RtlMoveMemory(dest, msg, length) - self.pos += n + def seek(self, pos): + self.pos = pos - def read(self, n): - """ - Read n bytes from mapped view. - """ - out = ctypes.create_string_buffer(n) - source = self.view + self.pos - length = ctypes.c_size_t(n) - ctypes.windll.kernel32.RtlMoveMemory(out, source, length) - self.pos += n - return out.raw + def write(self, msg): + assert isinstance(msg, bytes) + n = len(msg) + if self.pos + n >= self.length: # A little safety. + raise ValueError("Refusing to write %d bytes" % n) + dest = self.view + self.pos + length = ctypes.c_size_t(n) + ctypes.windll.kernel32.RtlMoveMemory(dest, msg, length) + self.pos += n - def __exit__(self, exc_type, exc_val, tb): - ctypes.windll.kernel32.UnmapViewOfFile(self.view) - ctypes.windll.kernel32.CloseHandle(self.filemap) + def read(self, n): + """ + Read n bytes from mapped view. + """ + out = ctypes.create_string_buffer(n) + source = self.view + self.pos + length = ctypes.c_size_t(n) + ctypes.windll.kernel32.RtlMoveMemory(out, source, length) + self.pos += n + return out.raw + + def __exit__(self, exc_type, exc_val, tb): + ctypes.windll.kernel32.UnmapViewOfFile(self.view) + ctypes.windll.kernel32.CloseHandle(self.filemap) diff --git a/libs/win/jaraco/windows/msie.py b/libs/win/jaraco/windows/msie.py index c4b5793c..d4136182 100644 --- a/libs/win/jaraco/windows/msie.py +++ b/libs/win/jaraco/windows/msie.py @@ -1,5 +1,3 @@ -# -*- coding: UTF-8 -*- - """cookies.py Cookie support utilities @@ -8,52 +6,50 @@ Cookie support utilities import os import itertools -import six - class CookieMonster(object): - "Read cookies out of a user's IE cookies file" + "Read cookies out of a user's IE cookies file" - @property - def cookie_dir(self): - import _winreg as winreg - key = winreg.OpenKeyEx( - winreg.HKEY_CURRENT_USER, 'Software' - '\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders') - cookie_dir, type = winreg.QueryValueEx(key, 'Cookies') - return cookie_dir + @property + def cookie_dir(self): + import _winreg as winreg - def entries(self, filename): - with open(os.path.join(self.cookie_dir, filename)) as cookie_file: - while True: - entry = itertools.takewhile( - self.is_not_cookie_delimiter, - cookie_file) - entry = list(map(six.text_type.rstrip, entry)) - if not entry: - break - cookie = self.make_cookie(*entry) - yield cookie + key = winreg.OpenKeyEx( + winreg.HKEY_CURRENT_USER, + 'Software' r'\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', + ) + cookie_dir, type = winreg.QueryValueEx(key, 'Cookies') + return cookie_dir - @staticmethod - def is_not_cookie_delimiter(s): - return s != '*\n' + def entries(self, filename): + with open(os.path.join(self.cookie_dir, filename)) as cookie_file: + while True: + entry = itertools.takewhile(self.is_not_cookie_delimiter, cookie_file) + entry = [item.rstrip() for item in entry] + if not entry: + break + cookie = self.make_cookie(*entry) + yield cookie - @staticmethod - def make_cookie( - key, value, domain, flags, ExpireLow, ExpireHigh, - CreateLow, CreateHigh): - expires = (int(ExpireHigh) << 32) | int(ExpireLow) - created = (int(CreateHigh) << 32) | int(CreateLow) - flags = int(flags) - domain, sep, path = domain.partition('/') - path = '/' + path - return dict( - key=key, - value=value, - domain=domain, - flags=flags, - expires=expires, - created=created, - path=path, - ) + @staticmethod + def is_not_cookie_delimiter(s): + return s != '*\n' + + @staticmethod + def make_cookie( + key, value, domain, flags, ExpireLow, ExpireHigh, CreateLow, CreateHigh + ): + expires = (int(ExpireHigh) << 32) | int(ExpireLow) + created = (int(CreateHigh) << 32) | int(CreateLow) + flags = int(flags) + domain, sep, path = domain.partition('/') + path = '/' + path + return dict( + key=key, + value=value, + domain=domain, + flags=flags, + expires=expires, + created=created, + path=path, + ) diff --git a/libs/win/jaraco/windows/msvc.py b/libs/win/jaraco/windows/msvc.py new file mode 100644 index 00000000..b060c7b0 --- /dev/null +++ b/libs/win/jaraco/windows/msvc.py @@ -0,0 +1,37 @@ +import subprocess + + +default_components = [ + 'Microsoft.VisualStudio.Component.CoreEditor', + 'Microsoft.VisualStudio.Workload.CoreEditor', + 'Microsoft.VisualStudio.Component.Roslyn.Compiler', + 'Microsoft.Component.MSBuild', + 'Microsoft.VisualStudio.Component.TextTemplating', + 'Microsoft.VisualStudio.Component.VC.CoreIde', + 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64', + 'Microsoft.VisualStudio.Component.VC.Tools.ARM64', + 'Microsoft.VisualStudio.Component.Windows10SDK.19041', + 'Microsoft.VisualStudio.Component.VC.Redist.14.Latest', + 'Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core', + 'Microsoft.VisualStudio.Workload.NativeDesktop', +] + + +def install(components=default_components): + cmd = [ + 'vs_buildtools', + '--quiet', + '--wait', + '--norestart', + '--nocache', + '--installPath', + 'C:\\BuildTools', + ] + for component in components: + cmd += ['--add', component] + res = subprocess.Popen(cmd).wait() + if res != 3010: + raise SystemExit(res) + + +__name__ == '__main__' and install() diff --git a/libs/win/jaraco/windows/net.py b/libs/win/jaraco/windows/net.py index 709f0dbf..4057a5f3 100644 --- a/libs/win/jaraco/windows/net.py +++ b/libs/win/jaraco/windows/net.py @@ -2,29 +2,30 @@ API hooks for network stuff. """ -__all__ = ('AddConnection') +__all__ = 'AddConnection' from jaraco.windows.error import WindowsError from .api import net def AddConnection( - remote_name, type=net.RESOURCETYPE_ANY, local_name=None, - provider_name=None, user=None, password=None, flags=0): - resource = net.NETRESOURCE( - type=type, - remote_name=remote_name, - local_name=local_name, - provider_name=provider_name, - # WNetAddConnection2 ignores the other members of NETRESOURCE - ) + remote_name, + type=net.RESOURCETYPE_ANY, + local_name=None, + provider_name=None, + user=None, + password=None, + flags=0, +): + resource = net.NETRESOURCE( + type=type, + remote_name=remote_name, + local_name=local_name, + provider_name=provider_name, + # WNetAddConnection2 ignores the other members of NETRESOURCE + ) - result = net.WNetAddConnection2( - resource, - password, - user, - flags, - ) + result = net.WNetAddConnection2(resource, password, user, flags) - if result != 0: - raise WindowsError(result) + if result != 0: + raise WindowsError(result) diff --git a/libs/win/jaraco/windows/power.py b/libs/win/jaraco/windows/power.py index 8d8276fa..f88f1308 100644 --- a/libs/win/jaraco/windows/power.py +++ b/libs/win/jaraco/windows/power.py @@ -1,77 +1,75 @@ -# -*- coding: utf-8 -*- - -from __future__ import print_function - import itertools import contextlib from more_itertools.recipes import consume, unique_justseen + try: - import wmi as wmilib + import wmi as wmilib except ImportError: - pass + pass from jaraco.windows.error import handle_nonzero_success from .api import power def GetSystemPowerStatus(): - stat = power.SYSTEM_POWER_STATUS() - handle_nonzero_success(GetSystemPowerStatus(stat)) - return stat + stat = power.SYSTEM_POWER_STATUS() + handle_nonzero_success(GetSystemPowerStatus(stat)) + return stat def _init_power_watcher(): - global power_watcher - if 'power_watcher' not in globals(): - wmi = wmilib.WMI() - query = 'SELECT * from Win32_PowerManagementEvent' - power_watcher = wmi.ExecNotificationQuery(query) + global power_watcher + if 'power_watcher' not in globals(): + wmi = wmilib.WMI() + query = 'SELECT * from Win32_PowerManagementEvent' + power_watcher = wmi.ExecNotificationQuery(query) def get_power_management_events(): - _init_power_watcher() - while True: - yield power_watcher.NextEvent() + _init_power_watcher() + while True: + yield power_watcher.NextEvent() def wait_for_power_status_change(): - EVT_POWER_STATUS_CHANGE = 10 + EVT_POWER_STATUS_CHANGE = 10 - def not_power_status_change(evt): - return evt.EventType != EVT_POWER_STATUS_CHANGE - events = get_power_management_events() - consume(itertools.takewhile(not_power_status_change, events)) + def not_power_status_change(evt): + return evt.EventType != EVT_POWER_STATUS_CHANGE + + events = get_power_management_events() + consume(itertools.takewhile(not_power_status_change, events)) def get_unique_power_states(): - """ - Just like get_power_states, but ensures values are returned only - when the state changes. - """ - return unique_justseen(get_power_states()) + """ + Just like get_power_states, but ensures values are returned only + when the state changes. + """ + return unique_justseen(get_power_states()) def get_power_states(): - """ - Continuously return the power state of the system when it changes. - This function will block indefinitely if the power state never - changes. - """ - while True: - state = GetSystemPowerStatus() - yield state.ac_line_status_string - wait_for_power_status_change() + """ + Continuously return the power state of the system when it changes. + This function will block indefinitely if the power state never + changes. + """ + while True: + state = GetSystemPowerStatus() + yield state.ac_line_status_string + wait_for_power_status_change() @contextlib.contextmanager def no_sleep(): - """ - Context that prevents the computer from going to sleep. - """ - mode = power.ES.continuous | power.ES.system_required - handle_nonzero_success(power.SetThreadExecutionState(mode)) - try: - yield - finally: - handle_nonzero_success(power.SetThreadExecutionState(power.ES.continuous)) + """ + Context that prevents the computer from going to sleep. + """ + mode = power.ES.continuous | power.ES.system_required + handle_nonzero_success(power.SetThreadExecutionState(mode)) + try: + yield + finally: + handle_nonzero_success(power.SetThreadExecutionState(power.ES.continuous)) diff --git a/libs/win/jaraco/windows/privilege.py b/libs/win/jaraco/windows/privilege.py index 848a526d..7a75bcfa 100644 --- a/libs/win/jaraco/windows/privilege.py +++ b/libs/win/jaraco/windows/privilege.py @@ -1,5 +1,3 @@ -from __future__ import print_function - import ctypes from ctypes import wintypes @@ -9,134 +7,138 @@ from .api import process def get_process_token(): - """ - Get the current process token - """ - token = wintypes.HANDLE() - res = process.OpenProcessToken( - process.GetCurrentProcess(), process.TOKEN_ALL_ACCESS, token) - if not res > 0: - raise RuntimeError("Couldn't get process token") - return token + """ + Get the current process token + """ + token = wintypes.HANDLE() + res = process.OpenProcessToken( + process.GetCurrentProcess(), process.TOKEN_ALL_ACCESS, token + ) + if not res > 0: + raise RuntimeError("Couldn't get process token") + return token def get_symlink_luid(): - """ - Get the LUID for the SeCreateSymbolicLinkPrivilege - """ - symlink_luid = privilege.LUID() - res = privilege.LookupPrivilegeValue( - None, "SeCreateSymbolicLinkPrivilege", symlink_luid) - if not res > 0: - raise RuntimeError("Couldn't lookup privilege value") - return symlink_luid + """ + Get the LUID for the SeCreateSymbolicLinkPrivilege + """ + symlink_luid = privilege.LUID() + res = privilege.LookupPrivilegeValue( + None, "SeCreateSymbolicLinkPrivilege", symlink_luid + ) + if not res > 0: + raise RuntimeError("Couldn't lookup privilege value") + return symlink_luid def get_privilege_information(): - """ - Get all privileges associated with the current process. - """ - # first call with zero length to determine what size buffer we need + """ + Get all privileges associated with the current process. + """ + # first call with zero length to determine what size buffer we need - return_length = wintypes.DWORD() - params = [ - get_process_token(), - privilege.TOKEN_INFORMATION_CLASS.TokenPrivileges, - None, - 0, - return_length, - ] + return_length = wintypes.DWORD() + params = [ + get_process_token(), + privilege.TOKEN_INFORMATION_CLASS.TokenPrivileges, + None, + 0, + return_length, + ] - res = privilege.GetTokenInformation(*params) + res = privilege.GetTokenInformation(*params) - # assume we now have the necessary length in return_length + # assume we now have the necessary length in return_length - buffer = ctypes.create_string_buffer(return_length.value) - params[2] = buffer - params[3] = return_length.value + buffer = ctypes.create_string_buffer(return_length.value) + params[2] = buffer + params[3] = return_length.value - res = privilege.GetTokenInformation(*params) - assert res > 0, "Error in second GetTokenInformation (%d)" % res + res = privilege.GetTokenInformation(*params) + assert res > 0, "Error in second GetTokenInformation (%d)" % res - privileges = ctypes.cast( - buffer, ctypes.POINTER(privilege.TOKEN_PRIVILEGES)).contents - return privileges + privileges = ctypes.cast( + buffer, ctypes.POINTER(privilege.TOKEN_PRIVILEGES) + ).contents + return privileges def report_privilege_information(): - """ - Report all privilege information assigned to the current process. - """ - privileges = get_privilege_information() - print("found {0} privileges".format(privileges.count)) - tuple(map(print, privileges)) + """ + Report all privilege information assigned to the current process. + """ + privileges = get_privilege_information() + print("found {0} privileges".format(privileges.count)) + tuple(map(print, privileges)) def enable_symlink_privilege(): - """ - Try to assign the symlink privilege to the current process token. - Return True if the assignment is successful. - """ - # create a space in memory for a TOKEN_PRIVILEGES structure - # with one element - size = ctypes.sizeof(privilege.TOKEN_PRIVILEGES) - size += ctypes.sizeof(privilege.LUID_AND_ATTRIBUTES) - buffer = ctypes.create_string_buffer(size) - tp = ctypes.cast(buffer, ctypes.POINTER(privilege.TOKEN_PRIVILEGES)).contents - tp.count = 1 - tp.get_array()[0].enable() - tp.get_array()[0].LUID = get_symlink_luid() - token = get_process_token() - res = privilege.AdjustTokenPrivileges(token, False, tp, 0, None, None) - if res == 0: - raise RuntimeError("Error in AdjustTokenPrivileges") + """ + Try to assign the symlink privilege to the current process token. + Return True if the assignment is successful. + """ + # create a space in memory for a TOKEN_PRIVILEGES structure + # with one element + size = ctypes.sizeof(privilege.TOKEN_PRIVILEGES) + size += ctypes.sizeof(privilege.LUID_AND_ATTRIBUTES) + buffer = ctypes.create_string_buffer(size) + tp = ctypes.cast(buffer, ctypes.POINTER(privilege.TOKEN_PRIVILEGES)).contents + tp.count = 1 + tp.get_array()[0].enable() + tp.get_array()[0].LUID = get_symlink_luid() + token = get_process_token() + res = privilege.AdjustTokenPrivileges(token, False, tp, 0, None, None) + if res == 0: + raise RuntimeError("Error in AdjustTokenPrivileges") - ERROR_NOT_ALL_ASSIGNED = 1300 - return ctypes.windll.kernel32.GetLastError() != ERROR_NOT_ALL_ASSIGNED + ERROR_NOT_ALL_ASSIGNED = 1300 + return ctypes.windll.kernel32.GetLastError() != ERROR_NOT_ALL_ASSIGNED class PolicyHandle(wintypes.HANDLE): - pass + pass class LSA_UNICODE_STRING(ctypes.Structure): - _fields_ = [ - ('length', ctypes.c_ushort), - ('max_length', ctypes.c_ushort), - ('buffer', ctypes.wintypes.LPWSTR), - ] + _fields_ = [ + ('length', ctypes.c_ushort), + ('max_length', ctypes.c_ushort), + ('buffer', ctypes.wintypes.LPWSTR), + ] def OpenPolicy(system_name, object_attributes, access_mask): - policy = PolicyHandle() - raise NotImplementedError( - "Need to construct structures for parameters " - "(see http://msdn.microsoft.com/en-us/library/windows" - "/desktop/aa378299%28v=vs.85%29.aspx)") - res = ctypes.windll.advapi32.LsaOpenPolicy( - system_name, object_attributes, - access_mask, ctypes.byref(policy)) - assert res == 0, "Error status {res}".format(**vars()) - return policy + policy = PolicyHandle() + raise NotImplementedError( + "Need to construct structures for parameters " + "(see http://msdn.microsoft.com/en-us/library/windows" + "/desktop/aa378299%28v=vs.85%29.aspx)" + ) + res = ctypes.windll.advapi32.LsaOpenPolicy( + system_name, object_attributes, access_mask, ctypes.byref(policy) + ) + assert res == 0, "Error status {res}".format(**vars()) + return policy def grant_symlink_privilege(who, machine=''): - """ - Grant the 'create symlink' privilege to who. + """ + Grant the 'create symlink' privilege to who. - Based on http://support.microsoft.com/kb/132958 - """ - flags = security.POLICY_CREATE_ACCOUNT | security.POLICY_LOOKUP_NAMES - policy = OpenPolicy(machine, flags) - return policy + Based on http://support.microsoft.com/kb/132958 + """ + flags = security.POLICY_CREATE_ACCOUNT | security.POLICY_LOOKUP_NAMES + policy = OpenPolicy(machine, flags) + return policy def main(): - assigned = enable_symlink_privilege() - msg = ['failure', 'success'][assigned] + assigned = enable_symlink_privilege() + msg = ['failure', 'success'][assigned] - print("Symlink privilege assignment completed with {0}".format(msg)) + print("Symlink privilege assignment completed with {0}".format(msg)) if __name__ == '__main__': - main() + main() diff --git a/libs/win/jaraco/windows/registry.py b/libs/win/jaraco/windows/registry.py index b6f3b239..dd4b6848 100644 --- a/libs/win/jaraco/windows/registry.py +++ b/libs/win/jaraco/windows/registry.py @@ -1,20 +1,18 @@ +import winreg from itertools import count -import six -winreg = six.moves.winreg - def key_values(key): - for index in count(): - try: - yield winreg.EnumValue(key, index) - except WindowsError: - break + for index in count(): + try: + yield winreg.EnumValue(key, index) + except WindowsError: + break def key_subkeys(key): - for index in count(): - try: - yield winreg.EnumKey(key, index) - except WindowsError: - break + for index in count(): + try: + yield winreg.EnumKey(key, index) + except WindowsError: + break diff --git a/libs/win/jaraco/windows/reparse.py b/libs/win/jaraco/windows/reparse.py index 2751e967..f9159381 100644 --- a/libs/win/jaraco/windows/reparse.py +++ b/libs/win/jaraco/windows/reparse.py @@ -1,35 +1,34 @@ -from __future__ import division - import ctypes.wintypes from .error import handle_nonzero_success from .api import filesystem -def DeviceIoControl( - device, io_control_code, in_buffer, out_buffer, overlapped=None): - if overlapped is not None: - raise NotImplementedError("overlapped handles not yet supported") +def DeviceIoControl(device, io_control_code, in_buffer, out_buffer, overlapped=None): + if overlapped is not None: + raise NotImplementedError("overlapped handles not yet supported") - if isinstance(out_buffer, int): - out_buffer = ctypes.create_string_buffer(out_buffer) + if isinstance(out_buffer, int): + out_buffer = ctypes.create_string_buffer(out_buffer) - in_buffer_size = len(in_buffer) if in_buffer is not None else 0 - out_buffer_size = len(out_buffer) - assert isinstance(out_buffer, ctypes.Array) + in_buffer_size = len(in_buffer) if in_buffer is not None else 0 + out_buffer_size = len(out_buffer) + assert isinstance(out_buffer, ctypes.Array) - returned_bytes = ctypes.wintypes.DWORD() + returned_bytes = ctypes.wintypes.DWORD() - res = filesystem.DeviceIoControl( - device, - io_control_code, - in_buffer, in_buffer_size, - out_buffer, out_buffer_size, - returned_bytes, - overlapped, - ) + res = filesystem.DeviceIoControl( + device, + io_control_code, + in_buffer, + in_buffer_size, + out_buffer, + out_buffer_size, + returned_bytes, + overlapped, + ) - handle_nonzero_success(res) - handle_nonzero_success(returned_bytes) + handle_nonzero_success(res) + handle_nonzero_success(returned_bytes) - return out_buffer[:returned_bytes.value] + return out_buffer[: returned_bytes.value] diff --git a/libs/win/jaraco/windows/security.py b/libs/win/jaraco/windows/security.py index 7c481ed6..43582e04 100644 --- a/libs/win/jaraco/windows/security.py +++ b/libs/win/jaraco/windows/security.py @@ -5,63 +5,66 @@ from .api import security def GetTokenInformation(token, information_class): - """ - Given a token, get the token information for it. - """ - data_size = ctypes.wintypes.DWORD() - ctypes.windll.advapi32.GetTokenInformation( - token, information_class.num, - 0, 0, ctypes.byref(data_size)) - data = ctypes.create_string_buffer(data_size.value) - handle_nonzero_success(ctypes.windll.advapi32.GetTokenInformation( - token, - information_class.num, - ctypes.byref(data), ctypes.sizeof(data), - ctypes.byref(data_size))) - return ctypes.cast(data, ctypes.POINTER(security.TOKEN_USER)).contents + """ + Given a token, get the token information for it. + """ + data_size = ctypes.wintypes.DWORD() + ctypes.windll.advapi32.GetTokenInformation( + token, information_class.num, 0, 0, ctypes.byref(data_size) + ) + data = ctypes.create_string_buffer(data_size.value) + handle_nonzero_success( + ctypes.windll.advapi32.GetTokenInformation( + token, + information_class.num, + ctypes.byref(data), + ctypes.sizeof(data), + ctypes.byref(data_size), + ) + ) + return ctypes.cast(data, ctypes.POINTER(security.TOKEN_USER)).contents def OpenProcessToken(proc_handle, access): - result = ctypes.wintypes.HANDLE() - proc_handle = ctypes.wintypes.HANDLE(proc_handle) - handle_nonzero_success(ctypes.windll.advapi32.OpenProcessToken( - proc_handle, access, ctypes.byref(result))) - return result + result = ctypes.wintypes.HANDLE() + proc_handle = ctypes.wintypes.HANDLE(proc_handle) + handle_nonzero_success( + ctypes.windll.advapi32.OpenProcessToken( + proc_handle, access, ctypes.byref(result) + ) + ) + return result def get_current_user(): - """ - Return a TOKEN_USER for the owner of this process. - """ - process = OpenProcessToken( - ctypes.windll.kernel32.GetCurrentProcess(), - security.TokenAccess.TOKEN_QUERY, - ) - return GetTokenInformation(process, security.TOKEN_USER) + """ + Return a TOKEN_USER for the owner of this process. + """ + process = OpenProcessToken( + ctypes.windll.kernel32.GetCurrentProcess(), security.TokenAccess.TOKEN_QUERY + ) + return GetTokenInformation(process, security.TOKEN_USER) def get_security_attributes_for_user(user=None): - """ - Return a SECURITY_ATTRIBUTES structure with the SID set to the - specified user (uses current user if none is specified). - """ - if user is None: - user = get_current_user() + """ + Return a SECURITY_ATTRIBUTES structure with the SID set to the + specified user (uses current user if none is specified). + """ + if user is None: + user = get_current_user() - assert isinstance(user, security.TOKEN_USER), ( - "user must be TOKEN_USER instance") + assert isinstance(user, security.TOKEN_USER), "user must be TOKEN_USER instance" - SD = security.SECURITY_DESCRIPTOR() - SA = security.SECURITY_ATTRIBUTES() - # by attaching the actual security descriptor, it will be garbage- - # collected with the security attributes - SA.descriptor = SD - SA.bInheritHandle = 1 + SD = security.SECURITY_DESCRIPTOR() + SA = security.SECURITY_ATTRIBUTES() + # by attaching the actual security descriptor, it will be garbage- + # collected with the security attributes + SA.descriptor = SD + SA.bInheritHandle = 1 - ctypes.windll.advapi32.InitializeSecurityDescriptor( - ctypes.byref(SD), - security.SECURITY_DESCRIPTOR.REVISION) - ctypes.windll.advapi32.SetSecurityDescriptorOwner( - ctypes.byref(SD), - user.SID, 0) - return SA + ctypes.windll.advapi32.InitializeSecurityDescriptor( + ctypes.byref(SD), security.SECURITY_DESCRIPTOR.REVISION + ) + ctypes.windll.advapi32.SetSecurityDescriptorOwner(ctypes.byref(SD), user.SID, 0) + return SA diff --git a/libs/win/jaraco/windows/services.py b/libs/win/jaraco/windows/services.py index 97cea7ab..b2064dcd 100644 --- a/libs/win/jaraco/windows/services.py +++ b/libs/win/jaraco/windows/services.py @@ -5,8 +5,6 @@ Based on http://code.activestate.com /recipes/115875-controlling-windows-services/ """ -from __future__ import print_function - import sys import time @@ -16,221 +14,240 @@ import win32service class Service(object): - """ - The Service Class is used for controlling Windows - services. Just pass the name of the service you wish to control to the - class instance and go from there. For example, if you want to control - the Workstation service try this: + """ + The Service Class is used for controlling Windows + services. Just pass the name of the service you wish to control to the + class instance and go from there. For example, if you want to control + the Workstation service try this: - from jaraco.windows import services - workstation = services.Service("Workstation") - workstation.start() - workstation.fetchstatus("running", 10) - workstation.stop() - workstation.fetchstatus("stopped") + from jaraco.windows import services + workstation = services.Service("Workstation") + workstation.start() + workstation.fetchstatus("running", 10) + workstation.stop() + workstation.fetchstatus("stopped") - Creating an instance of the Service class is done by passing the name of - the service as it appears in the Management Console or the short name as - it appears in the registry. Mixed case is ok. - cvs = services.Service("CVS NT Service 1.11.1.2 (Build 41)") - or - cvs = services.Service("cvs") + Creating an instance of the Service class is done by passing the name of + the service as it appears in the Management Console or the short name as + it appears in the registry. Mixed case is ok. + cvs = services.Service("CVS NT Service 1.11.1.2 (Build 41)") + or + cvs = services.Service("cvs") - If needing remote service control try this: - cvs = services.Service("cvs", r"\\CVS_SERVER") - or - cvs = services.Service("cvs", "\\\\CVS_SERVER") + If needing remote service control try this: + cvs = services.Service("cvs", r"\\CVS_SERVER") + or + cvs = services.Service("cvs", "\\\\CVS_SERVER") - The Service Class supports these methods: + The Service Class supports these methods: - start: Starts service. - stop: Stops service. - restart: Stops and restarts service. - pause: Pauses service (Only if service supports feature). - resume: Resumes service that has been paused. - status: Queries current status of service. - fetchstatus: Continually queries service until requested - status(STARTING, RUNNING, - STOPPING & STOPPED) is met or timeout value(in seconds) reached. - Default timeout value is infinite. - infotype: Queries service for process type. (Single, shared and/or - interactive process) - infoctrl: Queries control information about a running service. - i.e. Can it be paused, stopped, etc? - infostartup: Queries service Startup type. (Boot, System, - Automatic, Manual, Disabled) - setstartup Changes/sets Startup type. (Boot, System, - Automatic, Manual, Disabled) - getname: Gets the long and short service names used by Windowin32service. - (Generally used for internal purposes) - """ + start: Starts service. + stop: Stops service. + restart: Stops and restarts service. + pause: Pauses service (Only if service supports feature). + resume: Resumes service that has been paused. + status: Queries current status of service. + fetchstatus: Continually queries service until requested + status(STARTING, RUNNING, + STOPPING & STOPPED) is met or timeout value(in seconds) reached. + Default timeout value is infinite. + infotype: Queries service for process type. (Single, shared and/or + interactive process) + infoctrl: Queries control information about a running service. + i.e. Can it be paused, stopped, etc? + infostartup: Queries service Startup type. (Boot, System, + Automatic, Manual, Disabled) + setstartup: Changes/sets Startup type. (Boot, System, + Automatic, Manual, Disabled) + getname: Gets the long and short service names used by Windowin32service. + (Generally used for internal purposes) + """ - def __init__(self, service, machinename=None, dbname=None): - self.userv = service - self.scmhandle = win32service.OpenSCManager( - machinename, dbname, win32service.SC_MANAGER_ALL_ACCESS) - self.sserv, self.lserv = self.getname() - if (self.sserv or self.lserv) is None: - sys.exit() - self.handle = win32service.OpenService( - self.scmhandle, self.sserv, win32service.SERVICE_ALL_ACCESS) - self.sccss = "SYSTEM\\CurrentControlSet\\Services\\" + def __init__(self, service, machinename=None, dbname=None): + self.userv = service + self.scmhandle = win32service.OpenSCManager( + machinename, dbname, win32service.SC_MANAGER_ALL_ACCESS + ) + self.sserv, self.lserv = self.getname() + if (self.sserv or self.lserv) is None: + sys.exit() + self.handle = win32service.OpenService( + self.scmhandle, self.sserv, win32service.SERVICE_ALL_ACCESS + ) + self.sccss = "SYSTEM\\CurrentControlSet\\Services\\" - def start(self): - win32service.StartService(self.handle, None) + def start(self): + win32service.StartService(self.handle, None) - def stop(self): - self.stat = win32service.ControlService( - self.handle, win32service.SERVICE_CONTROL_STOP) + def stop(self): + self.stat = win32service.ControlService( + self.handle, win32service.SERVICE_CONTROL_STOP + ) - def restart(self): - self.stop() - self.fetchstatus("STOPPED") - self.start() + def restart(self): + self.stop() + self.fetchstatus("STOPPED") + self.start() - def pause(self): - self.stat = win32service.ControlService( - self.handle, win32service.SERVICE_CONTROL_PAUSE) + def pause(self): + self.stat = win32service.ControlService( + self.handle, win32service.SERVICE_CONTROL_PAUSE + ) - def resume(self): - self.stat = win32service.ControlService( - self.handle, win32service.SERVICE_CONTROL_CONTINUE) + def resume(self): + self.stat = win32service.ControlService( + self.handle, win32service.SERVICE_CONTROL_CONTINUE + ) - def status(self, prn=0): - self.stat = win32service.QueryServiceStatus(self.handle) - if self.stat[1] == win32service.SERVICE_STOPPED: - if prn == 1: - print("The %s service is stopped." % self.lserv) - else: - return "STOPPED" - elif self.stat[1] == win32service.SERVICE_START_PENDING: - if prn == 1: - print("The %s service is starting." % self.lserv) - else: - return "STARTING" - elif self.stat[1] == win32service.SERVICE_STOP_PENDING: - if prn == 1: - print("The %s service is stopping." % self.lserv) - else: - return "STOPPING" - elif self.stat[1] == win32service.SERVICE_RUNNING: - if prn == 1: - print("The %s service is running." % self.lserv) - else: - return "RUNNING" + def status(self, prn=0): + self.stat = win32service.QueryServiceStatus(self.handle) + if self.stat[1] == win32service.SERVICE_STOPPED: + if prn == 1: + print("The %s service is stopped." % self.lserv) + else: + return "STOPPED" + elif self.stat[1] == win32service.SERVICE_START_PENDING: + if prn == 1: + print("The %s service is starting." % self.lserv) + else: + return "STARTING" + elif self.stat[1] == win32service.SERVICE_STOP_PENDING: + if prn == 1: + print("The %s service is stopping." % self.lserv) + else: + return "STOPPING" + elif self.stat[1] == win32service.SERVICE_RUNNING: + if prn == 1: + print("The %s service is running." % self.lserv) + else: + return "RUNNING" - def fetchstatus(self, fstatus, timeout=None): - self.fstatus = fstatus.upper() - if timeout is not None: - timeout = int(timeout) - timeout *= 2 + def fetchstatus(self, fstatus, timeout=None): + self.fstatus = fstatus.upper() + if timeout is not None: + timeout = int(timeout) + timeout *= 2 - def to(timeout): - time.sleep(.5) - if timeout is not None: - if timeout > 1: - timeout -= 1 - return timeout - else: - return "TO" - if self.fstatus == "STOPPED": - while 1: - self.stat = win32service.QueryServiceStatus(self.handle) - if self.stat[1] == win32service.SERVICE_STOPPED: - self.fstate = "STOPPED" - break - else: - timeout = to(timeout) - if timeout == "TO": - return "TIMEDOUT" - break - elif self.fstatus == "STOPPING": - while 1: - self.stat = win32service.QueryServiceStatus(self.handle) - if self.stat[1]==win32service.SERVICE_STOP_PENDING: - self.fstate = "STOPPING" - break - else: - timeout=to(timeout) - if timeout == "TO": - return "TIMEDOUT" - break - elif self.fstatus == "RUNNING": - while 1: - self.stat = win32service.QueryServiceStatus(self.handle) - if self.stat[1]==win32service.SERVICE_RUNNING: - self.fstate = "RUNNING" - break - else: - timeout=to(timeout) - if timeout == "TO": - return "TIMEDOUT" - break - elif self.fstatus == "STARTING": - while 1: - self.stat = win32service.QueryServiceStatus(self.handle) - if self.stat[1]==win32service.SERVICE_START_PENDING: - self.fstate = "STARTING" - break - else: - timeout=to(timeout) - if timeout == "TO": - return "TIMEDOUT" - break + def to(timeout): + time.sleep(0.5) + if timeout is not None: + if timeout > 1: + timeout -= 1 + return timeout + else: + return "TO" - def infotype(self): - self.stat = win32service.QueryServiceStatus(self.handle) - if self.stat[0] and win32service.SERVICE_WIN32_OWN_PROCESS: - print("The %s service runs in its own process." % self.lserv) - if self.stat[0] and win32service.SERVICE_WIN32_SHARE_PROCESS: - print("The %s service shares a process with other services." % self.lserv) - if self.stat[0] and win32service.SERVICE_INTERACTIVE_PROCESS: - print("The %s service can interact with the desktop." % self.lserv) + if self.fstatus == "STOPPED": + while 1: + self.stat = win32service.QueryServiceStatus(self.handle) + if self.stat[1] == win32service.SERVICE_STOPPED: + self.fstate = "STOPPED" + break + else: + timeout = to(timeout) + if timeout == "TO": + return "TIMEDOUT" + break + elif self.fstatus == "STOPPING": + while 1: + self.stat = win32service.QueryServiceStatus(self.handle) + if self.stat[1] == win32service.SERVICE_STOP_PENDING: + self.fstate = "STOPPING" + break + else: + timeout = to(timeout) + if timeout == "TO": + return "TIMEDOUT" + break + elif self.fstatus == "RUNNING": + while 1: + self.stat = win32service.QueryServiceStatus(self.handle) + if self.stat[1] == win32service.SERVICE_RUNNING: + self.fstate = "RUNNING" + break + else: + timeout = to(timeout) + if timeout == "TO": + return "TIMEDOUT" + break + elif self.fstatus == "STARTING": + while 1: + self.stat = win32service.QueryServiceStatus(self.handle) + if self.stat[1] == win32service.SERVICE_START_PENDING: + self.fstate = "STARTING" + break + else: + timeout = to(timeout) + if timeout == "TO": + return "TIMEDOUT" + break - def infoctrl(self): - self.stat = win32service.QueryServiceStatus(self.handle) - if self.stat[2] and win32service.SERVICE_ACCEPT_PAUSE_CONTINUE: - print("The %s service can be paused." % self.lserv) - if self.stat[2] and win32service.SERVICE_ACCEPT_STOP: - print("The %s service can be stopped." % self.lserv) - if self.stat[2] and win32service.SERVICE_ACCEPT_SHUTDOWN: - print("The %s service can be shutdown." % self.lserv) + def infotype(self): + self.stat = win32service.QueryServiceStatus(self.handle) + if self.stat[0] and win32service.SERVICE_WIN32_OWN_PROCESS: + print("The %s service runs in its own process." % self.lserv) + if self.stat[0] and win32service.SERVICE_WIN32_SHARE_PROCESS: + print("The %s service shares a process with other services." % self.lserv) + if self.stat[0] and win32service.SERVICE_INTERACTIVE_PROCESS: + print("The %s service can interact with the desktop." % self.lserv) - def infostartup(self): - self.isuphandle = win32api.RegOpenKeyEx(win32con.HKEY_LOCAL_MACHINE, self.sccss + self.sserv, 0, win32con.KEY_READ) - self.isuptype = win32api.RegQueryValueEx(self.isuphandle, "Start")[0] - win32api.RegCloseKey(self.isuphandle) - if self.isuptype == 0: - return "boot" - elif self.isuptype == 1: - return "system" - elif self.isuptype == 2: - return "automatic" - elif self.isuptype == 3: - return "manual" - elif self.isuptype == 4: - return "disabled" + def infoctrl(self): + self.stat = win32service.QueryServiceStatus(self.handle) + if self.stat[2] and win32service.SERVICE_ACCEPT_PAUSE_CONTINUE: + print("The %s service can be paused." % self.lserv) + if self.stat[2] and win32service.SERVICE_ACCEPT_STOP: + print("The %s service can be stopped." % self.lserv) + if self.stat[2] and win32service.SERVICE_ACCEPT_SHUTDOWN: + print("The %s service can be shutdown." % self.lserv) - @property - def suptype(self): - types = 'boot', 'system', 'automatic', 'manual', 'disabled' - lookup = dict((name, number) for number, name in enumerate(types)) - return lookup[self.startuptype] + def infostartup(self): + self.isuphandle = win32api.RegOpenKeyEx( + win32con.HKEY_LOCAL_MACHINE, self.sccss + self.sserv, 0, win32con.KEY_READ + ) + self.isuptype = win32api.RegQueryValueEx(self.isuphandle, "Start")[0] + win32api.RegCloseKey(self.isuphandle) + if self.isuptype == 0: + return "boot" + elif self.isuptype == 1: + return "system" + elif self.isuptype == 2: + return "automatic" + elif self.isuptype == 3: + return "manual" + elif self.isuptype == 4: + return "disabled" - def setstartup(self, startuptype): - self.startuptype = startuptype.lower() - self.snc = win32service.SERVICE_NO_CHANGE - win32service.ChangeServiceConfig(self.handle, self.snc, self.suptype, - self.snc, None, None, 0, None, None, None, self.lserv) + @property + def suptype(self): + types = 'boot', 'system', 'automatic', 'manual', 'disabled' + lookup = dict((name, number) for number, name in enumerate(types)) + return lookup[self.startuptype] - def getname(self): - self.snames=win32service.EnumServicesStatus(self.scmhandle) - for i in self.snames: - if i[0].lower() == self.userv.lower(): - return i[0], i[1] - break - if i[1].lower() == self.userv.lower(): - return i[0], i[1] - break - print("Error: The %s service doesn't seem to exist." % self.userv) - return None, None + def setstartup(self, startuptype): + self.startuptype = startuptype.lower() + self.snc = win32service.SERVICE_NO_CHANGE + win32service.ChangeServiceConfig( + self.handle, + self.snc, + self.suptype, + self.snc, + None, + None, + 0, + None, + None, + None, + self.lserv, + ) + + def getname(self): + self.snames = win32service.EnumServicesStatus(self.scmhandle) + for i in self.snames: + if i[0].lower() == self.userv.lower(): + return i[0], i[1] + break + if i[1].lower() == self.userv.lower(): + return i[0], i[1] + break + print("Error: The %s service doesn't seem to exist." % self.userv) + return None, None diff --git a/libs/win/jaraco/windows/shell.py b/libs/win/jaraco/windows/shell.py index 58333359..2805cbe4 100644 --- a/libs/win/jaraco/windows/shell.py +++ b/libs/win/jaraco/windows/shell.py @@ -2,13 +2,13 @@ from .api import shell def get_recycle_bin_confirm(): - settings = shell.SHELLSTATE() - shell.SHGetSetSettings(settings, shell.SSF_NOCONFIRMRECYCLE, False) - return not settings.no_confirm_recycle + settings = shell.SHELLSTATE() + shell.SHGetSetSettings(settings, shell.SSF_NOCONFIRMRECYCLE, False) + return not settings.no_confirm_recycle def set_recycle_bin_confirm(confirm=False): - settings = shell.SHELLSTATE() - settings.no_confirm_recycle = not confirm - shell.SHGetSetSettings(settings, shell.SSF_NOCONFIRMRECYCLE, True) - # cross fingers and hope it worked + settings = shell.SHELLSTATE() + settings.no_confirm_recycle = not confirm + shell.SHGetSetSettings(settings, shell.SSF_NOCONFIRMRECYCLE, True) + # cross fingers and hope it worked diff --git a/libs/win/jaraco/windows/timers.py b/libs/win/jaraco/windows/timers.py index 626118a9..caf4a58e 100644 --- a/libs/win/jaraco/windows/timers.py +++ b/libs/win/jaraco/windows/timers.py @@ -1,71 +1,66 @@ -# -*- coding: UTF-8 -*- - """ timers - In particular, contains a waitable timer. + In particular, contains a waitable timer. """ -from __future__ import absolute_import - import time -from six.moves import _thread +import _thread from jaraco.windows.api import event as win32event -__author__ = 'Jason R. Coombs ' - class WaitableTimer: - """ - t = WaitableTimer() - t.set(None, 10) # every 10 seconds - t.wait_for_signal() # 10 seconds elapses - t.stop() - t.wait_for_signal(20) # 20 seconds elapses (timeout occurred) - """ - def __init__(self): - self.signal_event = win32event.CreateEvent(None, 0, 0, None) - self.stop_event = win32event.CreateEvent(None, 0, 0, None) + """ + t = WaitableTimer() + t.set(None, 10) # every 10 seconds + t.wait_for_signal() # 10 seconds elapses + t.stop() + t.wait_for_signal(20) # 20 seconds elapses (timeout occurred) + """ - def set(self, due_time, period): - _thread.start_new_thread(self._signal_loop, (due_time, period)) + def __init__(self): + self.signal_event = win32event.CreateEvent(None, 0, 0, None) + self.stop_event = win32event.CreateEvent(None, 0, 0, None) - def stop(self): - win32event.SetEvent(self.stop_event) + def set(self, due_time, period): + _thread.start_new_thread(self._signal_loop, (due_time, period)) - def wait_for_signal(self, timeout=None): - """ - wait for the signal; return after the signal has occurred or the - timeout in seconds elapses. - """ - timeout_ms = int(timeout * 1000) if timeout else win32event.INFINITE - win32event.WaitForSingleObject(self.signal_event, timeout_ms) + def stop(self): + win32event.SetEvent(self.stop_event) - def _signal_loop(self, due_time, period): - if not due_time and not period: - raise ValueError("due_time or period must be non-zero") - try: - if not due_time: - due_time = time.time() + period - if due_time: - self._wait(due_time - time.time()) - while period: - due_time += period - self._wait(due_time - time.time()) - except Exception: - pass + def wait_for_signal(self, timeout=None): + """ + wait for the signal; return after the signal has occurred or the + timeout in seconds elapses. + """ + timeout_ms = int(timeout * 1000) if timeout else win32event.INFINITE + win32event.WaitForSingleObject(self.signal_event, timeout_ms) - def _wait(self, seconds): - milliseconds = int(seconds * 1000) - if milliseconds > 0: - res = win32event.WaitForSingleObject(self.stop_event, milliseconds) - if res == win32event.WAIT_OBJECT_0: - raise Exception - if res == win32event.WAIT_TIMEOUT: - pass - win32event.SetEvent(self.signal_event) + def _signal_loop(self, due_time, period): + if not due_time and not period: + raise ValueError("due_time or period must be non-zero") + try: + if not due_time: + due_time = time.time() + period + if due_time: + self._wait(due_time - time.time()) + while period: + due_time += period + self._wait(due_time - time.time()) + except Exception: + pass - @staticmethod - def get_even_due_time(period): - now = time.time() - return now - (now % period) + def _wait(self, seconds): + milliseconds = int(seconds * 1000) + if milliseconds > 0: + res = win32event.WaitForSingleObject(self.stop_event, milliseconds) + if res == win32event.WAIT_OBJECT_0: + raise Exception + if res == win32event.WAIT_TIMEOUT: + pass + win32event.SetEvent(self.signal_event) + + @staticmethod + def get_even_due_time(period): + now = time.time() + return now - (now % period) diff --git a/libs/win/jaraco/windows/timezone.py b/libs/win/jaraco/windows/timezone.py index 7eedcf0b..fdefc931 100644 --- a/libs/win/jaraco/windows/timezone.py +++ b/libs/win/jaraco/windows/timezone.py @@ -10,245 +10,253 @@ from jaraco.collections import RangeMap class AnyDict(object): - "A dictionary that returns the same value regardless of key" + "A dictionary that returns the same value regardless of key" - def __init__(self, value): - self.value = value + def __init__(self, value): + self.value = value - def __getitem__(self, key): - return self.value + def __getitem__(self, key): + return self.value class SYSTEMTIME(Extended, ctypes.Structure): - _fields_ = [ - ('year', WORD), - ('month', WORD), - ('day_of_week', WORD), - ('day', WORD), - ('hour', WORD), - ('minute', WORD), - ('second', WORD), - ('millisecond', WORD), - ] + _fields_ = [ + ('year', WORD), + ('month', WORD), + ('day_of_week', WORD), + ('day', WORD), + ('hour', WORD), + ('minute', WORD), + ('second', WORD), + ('millisecond', WORD), + ] class REG_TZI_FORMAT(Extended, ctypes.Structure): - _fields_ = [ - ('bias', LONG), - ('standard_bias', LONG), - ('daylight_bias', LONG), - ('standard_start', SYSTEMTIME), - ('daylight_start', SYSTEMTIME), - ] + _fields_ = [ + ('bias', LONG), + ('standard_bias', LONG), + ('daylight_bias', LONG), + ('standard_start', SYSTEMTIME), + ('daylight_start', SYSTEMTIME), + ] class TIME_ZONE_INFORMATION(Extended, ctypes.Structure): - _fields_ = [ - ('bias', LONG), - ('standard_name', WCHAR * 32), - ('standard_start', SYSTEMTIME), - ('standard_bias', LONG), - ('daylight_name', WCHAR * 32), - ('daylight_start', SYSTEMTIME), - ('daylight_bias', LONG), - ] + _fields_ = [ + ('bias', LONG), + ('standard_name', WCHAR * 32), + ('standard_start', SYSTEMTIME), + ('standard_bias', LONG), + ('daylight_name', WCHAR * 32), + ('daylight_start', SYSTEMTIME), + ('daylight_bias', LONG), + ] class DYNAMIC_TIME_ZONE_INFORMATION(TIME_ZONE_INFORMATION): - """ - Because the structure of the DYNAMIC_TIME_ZONE_INFORMATION extends - the structure of the TIME_ZONE_INFORMATION, this structure - can be used as a drop-in replacement for calls where the - structure is passed by reference. + """ + Because the structure of the DYNAMIC_TIME_ZONE_INFORMATION extends + the structure of the TIME_ZONE_INFORMATION, this structure + can be used as a drop-in replacement for calls where the + structure is passed by reference. - For example, - dynamic_tzi = DYNAMIC_TIME_ZONE_INFORMATION() - ctypes.windll.kernel32.GetTimeZoneInformation(ctypes.byref(dynamic_tzi)) + For example, + dynamic_tzi = DYNAMIC_TIME_ZONE_INFORMATION() + ctypes.windll.kernel32.GetTimeZoneInformation(ctypes.byref(dynamic_tzi)) - (although the key_name and dynamic_daylight_time_disabled flags will be - set to the default (null)). + (although the key_name and dynamic_daylight_time_disabled flags will be + set to the default (null)). - >>> isinstance(DYNAMIC_TIME_ZONE_INFORMATION(), TIME_ZONE_INFORMATION) - True + >>> isinstance(DYNAMIC_TIME_ZONE_INFORMATION(), TIME_ZONE_INFORMATION) + True - """ - _fields_ = [ - # ctypes automatically includes the fields from the parent - ('key_name', WCHAR * 128), - ('dynamic_daylight_time_disabled', BOOL), - ] + """ - def __init__(self, *args, **kwargs): - """Allow initialization from args from both this class and - its superclass. Default ctypes implementation seems to - assume that this class is only initialized with its own - _fields_ (for non-keyword-args).""" - super_self = super(DYNAMIC_TIME_ZONE_INFORMATION, self) - super_fields = super_self._fields_ - super_args = args[:len(super_fields)] - self_args = args[len(super_fields):] - # convert the super args to keyword args so they're also handled - for field, arg in zip(super_fields, super_args): - field_name, spec = field - kwargs[field_name] = arg - super(DYNAMIC_TIME_ZONE_INFORMATION, self).__init__(*self_args, **kwargs) + _fields_ = [ + # ctypes automatically includes the fields from the parent + ('key_name', WCHAR * 128), + ('dynamic_daylight_time_disabled', BOOL), + ] + + def __init__(self, *args, **kwargs): + """Allow initialization from args from both this class and + its superclass. Default ctypes implementation seems to + assume that this class is only initialized with its own + _fields_ (for non-keyword-args).""" + super_self = super(DYNAMIC_TIME_ZONE_INFORMATION, self) + super_fields = super_self._fields_ + super_args = args[: len(super_fields)] + self_args = args[len(super_fields) :] + # convert the super args to keyword args so they're also handled + for field, arg in zip(super_fields, super_args): + field_name, spec = field + kwargs[field_name] = arg + super(DYNAMIC_TIME_ZONE_INFORMATION, self).__init__(*self_args, **kwargs) class Info(DYNAMIC_TIME_ZONE_INFORMATION): - """ - A time zone definition class based on the win32 - DYNAMIC_TIME_ZONE_INFORMATION structure. + """ + A time zone definition class based on the win32 + DYNAMIC_TIME_ZONE_INFORMATION structure. - Describes a bias against UTC (bias), and two dates at which a separate - additional bias applies (standard_bias and daylight_bias). - """ + Describes a bias against UTC (bias), and two dates at which a separate + additional bias applies (standard_bias and daylight_bias). + """ - def field_names(self): - return map(operator.itemgetter(0), self._fields_) + def field_names(self): + return map(operator.itemgetter(0), self._fields_) - def __init__(self, *args, **kwargs): - """ - Try to construct a timezone.Info from - a) [DYNAMIC_]TIME_ZONE_INFORMATION args - b) another Info - c) a REG_TZI_FORMAT - d) a byte structure - """ - funcs = ( - super(Info, self).__init__, - self.__init_from_other, - self.__init_from_reg_tzi, - self.__init_from_bytes, - ) - for func in funcs: - try: - func(*args, **kwargs) - return - except TypeError: - pass - raise TypeError("Invalid arguments for %s" % self.__class__) + def __init__(self, *args, **kwargs): + """ + Try to construct a timezone.Info from + a) [DYNAMIC_]TIME_ZONE_INFORMATION args + b) another Info + c) a REG_TZI_FORMAT + d) a byte structure + """ + funcs = ( + super(Info, self).__init__, + self.__init_from_other, + self.__init_from_reg_tzi, + self.__init_from_bytes, + ) + for func in funcs: + try: + func(*args, **kwargs) + return + except TypeError: + pass + raise TypeError("Invalid arguments for %s" % self.__class__) - def __init_from_bytes(self, bytes, **kwargs): - reg_tzi = REG_TZI_FORMAT() - # todo: use buffer API in Python 3 - buffer = memoryview(bytes) - ctypes.memmove(ctypes.addressof(reg_tzi), buffer, len(buffer)) - self.__init_from_reg_tzi(self, reg_tzi, **kwargs) + def __init_from_bytes(self, bytes, **kwargs): + reg_tzi = REG_TZI_FORMAT() + # todo: use buffer API in Python 3 + buffer = memoryview(bytes) + ctypes.memmove(ctypes.addressof(reg_tzi), buffer, len(buffer)) + self.__init_from_reg_tzi(self, reg_tzi, **kwargs) - def __init_from_reg_tzi(self, reg_tzi, **kwargs): - if not isinstance(reg_tzi, REG_TZI_FORMAT): - raise TypeError("Not a REG_TZI_FORMAT") - for field_name, type in reg_tzi._fields_: - setattr(self, field_name, getattr(reg_tzi, field_name)) - for name, value in kwargs.items(): - setattr(self, name, value) + def __init_from_reg_tzi(self, reg_tzi, **kwargs): + if not isinstance(reg_tzi, REG_TZI_FORMAT): + raise TypeError("Not a REG_TZI_FORMAT") + for field_name, type in reg_tzi._fields_: + setattr(self, field_name, getattr(reg_tzi, field_name)) + for name, value in kwargs.items(): + setattr(self, name, value) - def __init_from_other(self, other): - if not isinstance(other, TIME_ZONE_INFORMATION): - raise TypeError("Not a TIME_ZONE_INFORMATION") - for name in other.field_names(): - # explicitly get the value from the underlying structure - value = super(Info, other).__getattribute__(other, name) - setattr(self, name, value) - # consider instead of the loop above just copying the memory directly - # size = max(ctypes.sizeof(DYNAMIC_TIME_ZONE_INFO), ctypes.sizeof(other)) - # ctypes.memmove(ctypes.addressof(self), other, size) + def __init_from_other(self, other): + if not isinstance(other, TIME_ZONE_INFORMATION): + raise TypeError("Not a TIME_ZONE_INFORMATION") + for name in other.field_names(): + # explicitly get the value from the underlying structure + value = super(Info, other).__getattribute__(other, name) + setattr(self, name, value) + # consider instead of the loop above just copying the memory directly + # size = max(ctypes.sizeof(DYNAMIC_TIME_ZONE_INFO), ctypes.sizeof(other)) + # ctypes.memmove(ctypes.addressof(self), other, size) - def __getattribute__(self, attr): - value = super(Info, self).__getattribute__(attr) + def __getattribute__(self, attr): + value = super(Info, self).__getattribute__(attr) - def make_minute_timedelta(m): - datetime.timedelta(minutes=m) - if 'bias' in attr: - value = make_minute_timedelta(value) - return value + def make_minute_timedelta(m): + datetime.timedelta(minutes=m) - @classmethod - def current(class_): - "Windows Platform SDK GetTimeZoneInformation" - tzi = class_() - kernel32 = ctypes.windll.kernel32 - getter = kernel32.GetTimeZoneInformation - getter = getattr(kernel32, 'GetDynamicTimeZoneInformation', getter) - code = getter(ctypes.byref(tzi)) - return code, tzi + if 'bias' in attr: + value = make_minute_timedelta(value) + return value - def set(self): - kernel32 = ctypes.windll.kernel32 - setter = kernel32.SetTimeZoneInformation - setter = getattr(kernel32, 'SetDynamicTimeZoneInformation', setter) - return setter(ctypes.byref(self)) + @classmethod + def current(class_): + "Windows Platform SDK GetTimeZoneInformation" + tzi = class_() + kernel32 = ctypes.windll.kernel32 + getter = kernel32.GetTimeZoneInformation + getter = getattr(kernel32, 'GetDynamicTimeZoneInformation', getter) + code = getter(ctypes.byref(tzi)) + return code, tzi - def copy(self): - return self.__class__(self) + def set(self): + kernel32 = ctypes.windll.kernel32 + setter = kernel32.SetTimeZoneInformation + setter = getattr(kernel32, 'SetDynamicTimeZoneInformation', setter) + return setter(ctypes.byref(self)) - def locate_daylight_start(self, year): - info = self.get_info_for_year(year) - return self._locate_day(year, info.daylight_start) + def copy(self): + return self.__class__(self) - def locate_standard_start(self, year): - info = self.get_info_for_year(year) - return self._locate_day(year, info.standard_start) + def locate_daylight_start(self, year): + info = self.get_info_for_year(year) + return self._locate_day(year, info.daylight_start) - def get_info_for_year(self, year): - return self.dynamic_info[year] + def locate_standard_start(self, year): + info = self.get_info_for_year(year) + return self._locate_day(year, info.standard_start) - @property - def dynamic_info(self): - "Return a map that for a given year will return the correct Info" - if self.key_name: - dyn_key = self.get_key().subkey('Dynamic DST') - del dyn_key['FirstEntry'] - del dyn_key['LastEntry'] - years = map(int, dyn_key.keys()) - values = map(Info, dyn_key.values()) - # create a range mapping that searches by descending year and matches - # if the target year is greater or equal. - return RangeMap(zip(years, values), RangeMap.descending, operator.ge) - else: - return AnyDict(self) + def get_info_for_year(self, year): + return self.dynamic_info[year] - @staticmethod - def _locate_day(year, cutoff): - """ - Takes a SYSTEMTIME object, such as retrieved from a TIME_ZONE_INFORMATION - structure or call to GetTimeZoneInformation and interprets - it based on the given - year to identify the actual day. + @property + def dynamic_info(self): + "Return a map that for a given year will return the correct Info" + if self.key_name: + dyn_key = self.get_key().subkey('Dynamic DST') + del dyn_key['FirstEntry'] + del dyn_key['LastEntry'] + years = map(int, dyn_key.keys()) + values = map(Info, dyn_key.values()) + # create a range mapping that searches by descending year and matches + # if the target year is greater or equal. + return RangeMap(zip(years, values), RangeMap.descending, operator.ge) + else: + return AnyDict(self) - This method is necessary because the SYSTEMTIME structure - refers to a day by its - day of the week and week of the month (e.g. 4th saturday in March). + @staticmethod + def _locate_day(year, cutoff): + """ + Takes a SYSTEMTIME object, such as retrieved from a TIME_ZONE_INFORMATION + structure or call to GetTimeZoneInformation and interprets + it based on the given + year to identify the actual day. - >>> SATURDAY = 6 - >>> MARCH = 3 - >>> st = SYSTEMTIME(2000, MARCH, SATURDAY, 4, 0, 0, 0, 0) + This method is necessary because the SYSTEMTIME structure + refers to a day by its + day of the week and week of the month (e.g. 4th saturday in March). - # according to my calendar, the 4th Saturday in March in 2009 was the 28th - >>> expected_date = datetime.datetime(2009, 3, 28) - >>> Info._locate_day(2009, st) == expected_date - True - """ - # MS stores Sunday as 0, Python datetime stores Monday as zero - target_weekday = (cutoff.day_of_week + 6) % 7 - # For SYSTEMTIMEs relating to time zone inforamtion, cutoff.day - # is the week of the month - week_of_month = cutoff.day - # so the following is the first day of that week - day = (week_of_month - 1) * 7 + 1 - result = datetime.datetime( - year, cutoff.month, day, - cutoff.hour, cutoff.minute, cutoff.second, cutoff.millisecond) - # now the result is the correct week, but not necessarily - # the correct day of the week - days_to_go = (target_weekday - result.weekday()) % 7 - result += datetime.timedelta(days_to_go) - # if we selected a day in the month following the target month, - # move back a week or two. - # This is necessary because Microsoft defines the fifth week in a month - # to be the last week in a month and adding the time delta might have - # pushed the result into the next month. - while result.month == cutoff.month + 1: - result -= datetime.timedelta(weeks=1) - return result + >>> SATURDAY = 6 + >>> MARCH = 3 + >>> st = SYSTEMTIME(2000, MARCH, SATURDAY, 4, 0, 0, 0, 0) + + # according to my calendar, the 4th Saturday in March in 2009 was the 28th + >>> expected_date = datetime.datetime(2009, 3, 28) + >>> Info._locate_day(2009, st) == expected_date + True + """ + # MS stores Sunday as 0, Python datetime stores Monday as zero + target_weekday = (cutoff.day_of_week + 6) % 7 + # For SYSTEMTIMEs relating to time zone inforamtion, cutoff.day + # is the week of the month + week_of_month = cutoff.day + # so the following is the first day of that week + day = (week_of_month - 1) * 7 + 1 + result = datetime.datetime( + year, + cutoff.month, + day, + cutoff.hour, + cutoff.minute, + cutoff.second, + cutoff.millisecond, + ) + # now the result is the correct week, but not necessarily + # the correct day of the week + days_to_go = (target_weekday - result.weekday()) % 7 + result += datetime.timedelta(days_to_go) + # if we selected a day in the month following the target month, + # move back a week or two. + # This is necessary because Microsoft defines the fifth week in a month + # to be the last week in a month and adding the time delta might have + # pushed the result into the next month. + while result.month == cutoff.month + 1: + result -= datetime.timedelta(weeks=1) + return result diff --git a/libs/win/jaraco/windows/ui.py b/libs/win/jaraco/windows/ui.py index 20f948f3..7249331e 100644 --- a/libs/win/jaraco/windows/ui.py +++ b/libs/win/jaraco/windows/ui.py @@ -5,5 +5,5 @@ from jaraco.windows.util import ensure_unicode def MessageBox(text, caption=None, handle=None, type=None): - text, caption = map(ensure_unicode, (text, caption)) - ctypes.windll.user32.MessageBoxW(handle, text, caption, type) + text, caption = map(ensure_unicode, (text, caption)) + ctypes.windll.user32.MessageBoxW(handle, text, caption, type) diff --git a/libs/win/jaraco/windows/user.py b/libs/win/jaraco/windows/user.py index 9b574777..503233b7 100644 --- a/libs/win/jaraco/windows/user.py +++ b/libs/win/jaraco/windows/user.py @@ -5,12 +5,12 @@ from .error import WindowsError, handle_nonzero_success def get_user_name(): - size = ctypes.wintypes.DWORD() - try: - handle_nonzero_success(GetUserName(None, size)) - except WindowsError as e: - if e.code != errors.ERROR_INSUFFICIENT_BUFFER: - raise - buffer = ctypes.create_unicode_buffer(size.value) - handle_nonzero_success(GetUserName(buffer, size)) - return buffer.value + size = ctypes.wintypes.DWORD() + try: + handle_nonzero_success(GetUserName(None, size)) + except WindowsError as e: + if e.code != errors.ERROR_INSUFFICIENT_BUFFER: + raise + buffer = ctypes.create_unicode_buffer(size.value) + handle_nonzero_success(GetUserName(buffer, size)) + return buffer.value diff --git a/libs/win/jaraco/windows/util.py b/libs/win/jaraco/windows/util.py index 5524df85..c51ff997 100644 --- a/libs/win/jaraco/windows/util.py +++ b/libs/win/jaraco/windows/util.py @@ -4,17 +4,18 @@ import ctypes def ensure_unicode(param): - try: - param = ctypes.create_unicode_buffer(param) - except TypeError: - pass # just return the param as is - return param + try: + param = ctypes.create_unicode_buffer(param) + except TypeError: + pass # just return the param as is + return param class Extended(object): - "Used to add extended capability to structures" - def __eq__(self, other): - return memoryview(self) == memoryview(other) + "Used to add extended capability to structures" - def __ne__(self, other): - return memoryview(self) != memoryview(other) + def __eq__(self, other): + return memoryview(self) == memoryview(other) + + def __ne__(self, other): + return memoryview(self) != memoryview(other) diff --git a/libs/win/jaraco/windows/vpn.py b/libs/win/jaraco/windows/vpn.py index 9cf31dc1..df9f1503 100644 --- a/libs/win/jaraco/windows/vpn.py +++ b/libs/win/jaraco/windows/vpn.py @@ -3,15 +3,19 @@ from path import Path def install_pptp(name, param_lines): - """ - """ - # or consider using the API: - # http://msdn.microsoft.com/en-us/library/aa446739%28v=VS.85%29.aspx - pbk_path = ( - Path(os.environ['PROGRAMDATA']) - / 'Microsoft' / 'Network' / 'Connections' / 'pbk' / 'rasphone.pbk') - pbk_path.dirname().makedirs_p() - with open(pbk_path, 'a') as pbk: - pbk.write('[{name}]\n'.format(name=name)) - pbk.writelines(param_lines) - pbk.write('\n') + """ """ + # or consider using the API: + # http://msdn.microsoft.com/en-us/library/aa446739%28v=VS.85%29.aspx + pbk_path = ( + Path(os.environ['PROGRAMDATA']) + / 'Microsoft' + / 'Network' + / 'Connections' + / 'pbk' + / 'rasphone.pbk' + ) + pbk_path.dirname().makedirs_p() + with open(pbk_path, 'a') as pbk: + pbk.write('[{name}]\n'.format(name=name)) + pbk.writelines(param_lines) + pbk.write('\n') diff --git a/libs/win/jaraco/windows/xmouse.py b/libs/win/jaraco/windows/xmouse.py index 20b19435..8f3485f3 100644 --- a/libs/win/jaraco/windows/xmouse.py +++ b/libs/win/jaraco/windows/xmouse.py @@ -1,7 +1,3 @@ -#!python - -from __future__ import print_function - import ctypes from jaraco.windows.error import handle_nonzero_success from jaraco.windows.api import system @@ -9,92 +5,84 @@ from jaraco.ui.cmdline import Command def set(value): - result = system.SystemParametersInfo( - system.SPI_SETACTIVEWINDOWTRACKING, - 0, - ctypes.cast(value, ctypes.c_void_p), - 0, - ) - handle_nonzero_success(result) + result = system.SystemParametersInfo( + system.SPI_SETACTIVEWINDOWTRACKING, 0, ctypes.cast(value, ctypes.c_void_p), 0 + ) + handle_nonzero_success(result) def get(): - value = ctypes.wintypes.BOOL() - result = system.SystemParametersInfo( - system.SPI_GETACTIVEWINDOWTRACKING, - 0, - ctypes.byref(value), - 0, - ) - handle_nonzero_success(result) - return bool(value) + value = ctypes.wintypes.BOOL() + result = system.SystemParametersInfo( + system.SPI_GETACTIVEWINDOWTRACKING, 0, ctypes.byref(value), 0 + ) + handle_nonzero_success(result) + return bool(value) def set_delay(milliseconds): - result = system.SystemParametersInfo( - system.SPI_SETACTIVEWNDTRKTIMEOUT, - 0, - ctypes.cast(milliseconds, ctypes.c_void_p), - 0, - ) - handle_nonzero_success(result) + result = system.SystemParametersInfo( + system.SPI_SETACTIVEWNDTRKTIMEOUT, + 0, + ctypes.cast(milliseconds, ctypes.c_void_p), + 0, + ) + handle_nonzero_success(result) def get_delay(): - value = ctypes.wintypes.DWORD() - result = system.SystemParametersInfo( - system.SPI_GETACTIVEWNDTRKTIMEOUT, - 0, - ctypes.byref(value), - 0, - ) - handle_nonzero_success(result) - return int(value.value) + value = ctypes.wintypes.DWORD() + result = system.SystemParametersInfo( + system.SPI_GETACTIVEWNDTRKTIMEOUT, 0, ctypes.byref(value), 0 + ) + handle_nonzero_success(result) + return int(value.value) class DelayParam(Command): - @staticmethod - def add_arguments(parser): - parser.add_argument( - '-d', '--delay', type=int, - help="Delay in milliseconds for active window tracking" - ) + @staticmethod + def add_arguments(parser): + parser.add_argument( + '-d', + '--delay', + type=int, + help="Delay in milliseconds for active window tracking", + ) class Show(Command): - @classmethod - def run(cls, args): - msg = "xmouse: {enabled} (delay {delay}ms)".format( - enabled=get(), - delay=get_delay(), - ) - print(msg) + @classmethod + def run(cls, args): + msg = "xmouse: {enabled} (delay {delay}ms)".format( + enabled=get(), delay=get_delay() + ) + print(msg) class Enable(DelayParam): - @classmethod - def run(cls, args): - print("enabling xmouse") - set(True) - args.delay and set_delay(args.delay) + @classmethod + def run(cls, args): + print("enabling xmouse") + set(True) + args.delay and set_delay(args.delay) class Disable(DelayParam): - @classmethod - def run(cls, args): - print("disabling xmouse") - set(False) - args.delay and set_delay(args.delay) + @classmethod + def run(cls, args): + print("disabling xmouse") + set(False) + args.delay and set_delay(args.delay) class Toggle(DelayParam): - @classmethod - def run(cls, args): - value = get() - print("xmouse: %s -> %s" % (value, not value)) - set(not value) - args.delay and set_delay(args.delay) + @classmethod + def run(cls, args): + value = get() + print("xmouse: %s -> %s" % (value, not value)) + set(not value) + args.delay and set_delay(args.delay) if __name__ == '__main__': - Command.invoke() + Command.invoke() diff --git a/libs/win/more_itertools/__init__.py b/libs/win/more_itertools/__init__.py index bba462c3..557bfc20 100644 --- a/libs/win/more_itertools/__init__.py +++ b/libs/win/more_itertools/__init__.py @@ -1,2 +1,6 @@ -from more_itertools.more import * # noqa -from more_itertools.recipes import * # noqa +"""More routines for operating on iterables, beyond itertools""" + +from .more import * # noqa +from .recipes import * # noqa + +__version__ = '9.0.0' diff --git a/libs/win/more_itertools/__init__.pyi b/libs/win/more_itertools/__init__.pyi new file mode 100644 index 00000000..96f6e36c --- /dev/null +++ b/libs/win/more_itertools/__init__.pyi @@ -0,0 +1,2 @@ +from .more import * +from .recipes import * diff --git a/libs/win/more_itertools/more.py b/libs/win/more_itertools/more.py index 05e851ee..7f73d6ed 100644 --- a/libs/win/more_itertools/more.py +++ b/libs/win/more_itertools/more.py @@ -1,8 +1,9 @@ -from __future__ import print_function +import warnings -from collections import Counter, defaultdict, deque -from functools import partial, wraps -from heapq import merge +from collections import Counter, defaultdict, deque, abc +from collections.abc import Sequence +from functools import partial, reduce, wraps +from heapq import heapify, heapreplace, heappop from itertools import ( chain, compress, @@ -14,100 +15,162 @@ from itertools import ( repeat, starmap, takewhile, - tee + tee, + zip_longest, ) -from operator import itemgetter, lt, gt, sub -from sys import maxsize, version_info -try: - from collections.abc import Sequence -except ImportError: - from collections import Sequence +from math import exp, factorial, floor, log +from queue import Empty, Queue +from random import random, randrange, uniform +from operator import itemgetter, mul, sub, gt, lt, ge, le +from sys import hexversion, maxsize +from time import monotonic -from six import binary_type, string_types, text_type -from six.moves import filter, map, range, zip, zip_longest - -from .recipes import consume, flatten, take +from .recipes import ( + _marker, + _zip_equal, + UnequalIterablesError, + consume, + flatten, + pairwise, + powerset, + take, + unique_everseen, + all_equal, +) __all__ = [ + 'AbortThread', + 'SequenceView', + 'UnequalIterablesError', 'adjacent', + 'all_unique', 'always_iterable', 'always_reversible', 'bucket', + 'callback_iter', 'chunked', + 'chunked_even', 'circular_shifts', 'collapse', - 'collate', + 'combination_index', 'consecutive_groups', + 'constrained_batches', 'consumer', 'count_cycle', + 'countable', 'difference', + 'distinct_combinations', 'distinct_permutations', 'distribute', 'divide', + 'duplicates_everseen', + 'duplicates_justseen', 'exactly_n', + 'filter_except', 'first', 'groupby_transform', + 'ichunked', + 'iequals', 'ilen', - 'interleave_longest', 'interleave', + 'interleave_evenly', + 'interleave_longest', 'intersperse', + 'is_sorted', 'islice_extended', 'iterate', 'last', 'locate', + 'longest_common_prefix', 'lstrip', 'make_decorator', + 'map_except', + 'map_if', 'map_reduce', + 'mark_ends', + 'minmax', + 'nth_or_last', + 'nth_permutation', + 'nth_product', 'numeric_range', 'one', + 'only', 'padded', + 'partitions', 'peekable', + 'permutation_index', + 'product_index', + 'raise_', + 'repeat_each', + 'repeat_last', 'replace', 'rlocate', 'rstrip', 'run_length', + 'sample', 'seekable', - 'SequenceView', + 'set_partitions', 'side_effect', 'sliced', 'sort_together', - 'split_at', 'split_after', + 'split_at', 'split_before', + 'split_into', + 'split_when', 'spy', 'stagger', 'strip', + 'strictly_n', + 'substrings', + 'substrings_indexes', + 'time_limited', + 'unique_in_window', 'unique_to_each', + 'unzip', + 'value_chain', 'windowed', + 'windowed_complete', 'with_iter', + 'zip_broadcast', + 'zip_equal', 'zip_offset', ] -_marker = object() - -def chunked(iterable, n): +def chunked(iterable, n, strict=False): """Break *iterable* into lists of length *n*: >>> list(chunked([1, 2, 3, 4, 5, 6], 3)) [[1, 2, 3], [4, 5, 6]] - If the length of *iterable* is not evenly divisible by *n*, the last - returned list will be shorter: + By the default, the last yielded list will have fewer than *n* elements + if the length of *iterable* is not divisible by *n*: >>> list(chunked([1, 2, 3, 4, 5, 6, 7, 8], 3)) [[1, 2, 3], [4, 5, 6], [7, 8]] To use a fill-in value instead, see the :func:`grouper` recipe. - :func:`chunked` is useful for splitting up a computation on a large number - of keys into batches, to be pickled and sent off to worker processes. One - example is operations on rows in MySQL, which does not implement - server-side cursors properly and would otherwise load the entire dataset - into RAM on the client. + If the length of *iterable* is not divisible by *n* and *strict* is + ``True``, then ``ValueError`` will be raised before the last + list is yielded. """ - return iter(partial(take, n, iter(iterable)), []) + iterator = iter(partial(take, n, iter(iterable)), []) + if strict: + if n is None: + raise ValueError('n must not be None when using strict mode.') + + def ret(): + for chunk in iterator: + if len(chunk) != n: + raise ValueError('iterable is not divisible by n.') + yield chunk + + return iter(ret()) + else: + return iterator def first(iterable, default=_marker): @@ -129,14 +192,12 @@ def first(iterable, default=_marker): """ try: return next(iter(iterable)) - except StopIteration: - # I'm on the edge about raising ValueError instead of StopIteration. At - # the moment, ValueError wins, because the caller could conceivably - # want to do something different with flow control when I raise the - # exception, and it's weird to explicitly catch StopIteration. + except StopIteration as e: if default is _marker: - raise ValueError('first() was called on an empty iterable, and no ' - 'default value was provided.') + raise ValueError( + 'first() was called on an empty iterable, and no ' + 'default value was provided.' + ) from e return default @@ -153,20 +214,40 @@ def last(iterable, default=_marker): raise ``ValueError``. """ try: - try: - # Try to access the last item directly + if isinstance(iterable, Sequence): return iterable[-1] - except (TypeError, AttributeError, KeyError): - # If not slice-able, iterate entirely using length-1 deque - return deque(iterable, maxlen=1)[0] - except IndexError: # If the iterable was empty + # Work around https://bugs.python.org/issue38525 + elif hasattr(iterable, '__reversed__') and (hexversion != 0x030800F0): + return next(reversed(iterable)) + else: + return deque(iterable, maxlen=1)[-1] + except (IndexError, TypeError, StopIteration): if default is _marker: - raise ValueError('last() was called on an empty iterable, and no ' - 'default value was provided.') + raise ValueError( + 'last() was called on an empty iterable, and no default was ' + 'provided.' + ) return default -class peekable(object): +def nth_or_last(iterable, n, default=_marker): + """Return the nth or the last item of *iterable*, + or *default* if *iterable* is empty. + + >>> nth_or_last([0, 1, 2, 3], 2) + 2 + >>> nth_or_last([0, 1], 2) + 1 + >>> nth_or_last([], 0, 'some default') + 'some default' + + If *default* is not provided and there are no items in the iterable, + raise ``ValueError``. + """ + return last(islice(iterable, n + 1), default=default) + + +class peekable: """Wrap an iterator to allow lookahead and prepending elements. Call :meth:`peek` on the result to get the value that will be returned @@ -219,11 +300,12 @@ class peekable(object): >>> if p: # peekable has items ... list(p) ['a', 'b'] - >>> if not p: # peekable is exhaused + >>> if not p: # peekable is exhausted ... list(p) [] """ + def __init__(self, iterable): self._it = iter(iterable) self._cache = deque() @@ -238,10 +320,6 @@ class peekable(object): return False return True - def __nonzero__(self): - # For Python 2 compatibility - return self.__bool__() - def peek(self, default=_marker): """Return the item that will be next returned from ``next()``. @@ -295,8 +373,6 @@ class peekable(object): return next(self._it) - next = __next__ # For Python 2 compatibility - def _get_slice(self, index): # Normalize the slice's arguments step = 1 if (index.step is None) else index.step @@ -336,70 +412,6 @@ class peekable(object): return self._cache[index] -def _collate(*iterables, **kwargs): - """Helper for ``collate()``, called when the user is using the ``reverse`` - or ``key`` keyword arguments on Python versions below 3.5. - - """ - key = kwargs.pop('key', lambda a: a) - reverse = kwargs.pop('reverse', False) - - min_or_max = partial(max if reverse else min, key=itemgetter(0)) - peekables = [peekable(it) for it in iterables] - peekables = [p for p in peekables if p] # Kill empties. - while peekables: - _, p = min_or_max((key(p.peek()), p) for p in peekables) - yield next(p) - peekables = [x for x in peekables if x] - - -def collate(*iterables, **kwargs): - """Return a sorted merge of the items from each of several already-sorted - *iterables*. - - >>> list(collate('ACDZ', 'AZ', 'JKL')) - ['A', 'A', 'C', 'D', 'J', 'K', 'L', 'Z', 'Z'] - - Works lazily, keeping only the next value from each iterable in memory. Use - :func:`collate` to, for example, perform a n-way mergesort of items that - don't fit in memory. - - If a *key* function is specified, the iterables will be sorted according - to its result: - - >>> key = lambda s: int(s) # Sort by numeric value, not by string - >>> list(collate(['1', '10'], ['2', '11'], key=key)) - ['1', '2', '10', '11'] - - - If the *iterables* are sorted in descending order, set *reverse* to - ``True``: - - >>> list(collate([5, 3, 1], [4, 2, 0], reverse=True)) - [5, 4, 3, 2, 1, 0] - - If the elements of the passed-in iterables are out of order, you might get - unexpected results. - - On Python 2.7, this function delegates to :func:`heapq.merge` if neither - of the keyword arguments are specified. On Python 3.5+, this function - is an alias for :func:`heapq.merge`. - - """ - if not kwargs: - return merge(*iterables) - - return _collate(*iterables, **kwargs) - - -# If using Python version 3.5 or greater, heapq.merge() will be faster than -# collate - use that instead. -if version_info >= (3, 5, 0): - _collate_docstring = collate.__doc__ - collate = partial(merge) - collate.__doc__ = _collate_docstring - - def consumer(func): """Decorator that automatically advances a PEP-342-style "reverse iterator" to its first yield point so you don't have to call ``next()`` on it @@ -422,11 +434,13 @@ def consumer(func): ``t.send()`` could be used. """ + @wraps(func) def wrapper(*args, **kwargs): gen = func(*args, **kwargs) next(gen) return gen + return wrapper @@ -439,20 +453,20 @@ def ilen(iterable): This consumes the iterable, so handle with care. """ - # maxlen=1 only stores the last item in the deque - d = deque(enumerate(iterable, 1), maxlen=1) - # since we started enumerate at 1, - # the first item of the last pair will be the length of the iterable - # (assuming there were items) - return d[0][0] if d else 0 + # This approach was selected because benchmarks showed it's likely the + # fastest of the known implementations at the time of writing. + # See GitHub tracker: #236, #230. + counter = count() + deque(zip(iterable, counter), maxlen=0) + return next(counter) def iterate(func, start): """Return ``start``, ``func(start)``, ``func(func(start))``, ... - >>> from itertools import islice - >>> list(islice(iterate(lambda x: 2*x, 1), 10)) - [1, 2, 4, 8, 16, 32, 64, 128, 256, 512] + >>> from itertools import islice + >>> list(islice(iterate(lambda x: 2*x, 1), 10)) + [1, 2, 4, 8, 16, 32, 64, 128, 256, 512] """ while True: @@ -472,8 +486,7 @@ def with_iter(context_manager): """ with context_manager as iterable: - for item in iterable: - yield item + yield from iterable def one(iterable, too_short=None, too_long=None): @@ -507,7 +520,8 @@ def one(iterable, too_short=None, too_long=None): >>> one(it) # doctest: +IGNORE_EXCEPTION_DETAIL Traceback (most recent call last): ... - ValueError: too many items in iterable (expected 1)' + ValueError: Expected exactly one item in iterable, but got 'too', + 'many', and perhaps more. >>> too_long = RuntimeError >>> one(it, too_long=too_long) # doctest: +IGNORE_EXCEPTION_DETAIL Traceback (most recent call last): @@ -515,29 +529,112 @@ def one(iterable, too_short=None, too_long=None): RuntimeError Note that :func:`one` attempts to advance *iterable* twice to ensure there - is only one item. If there is more than one, both items will be discarded. - See :func:`spy` or :func:`peekable` to check iterable contents less - destructively. + is only one item. See :func:`spy` or :func:`peekable` to check iterable + contents less destructively. """ it = iter(iterable) try: - value = next(it) + first_value = next(it) + except StopIteration as e: + raise ( + too_short or ValueError('too few items in iterable (expected 1)') + ) from e + + try: + second_value = next(it) except StopIteration: - raise too_short or ValueError('too few items in iterable (expected 1)') + pass + else: + msg = ( + 'Expected exactly one item in iterable, but got {!r}, {!r}, ' + 'and perhaps more.'.format(first_value, second_value) + ) + raise too_long or ValueError(msg) + + return first_value + + +def raise_(exception, *args): + raise exception(*args) + + +def strictly_n(iterable, n, too_short=None, too_long=None): + """Validate that *iterable* has exactly *n* items and return them if + it does. If it has fewer than *n* items, call function *too_short* + with those items. If it has more than *n* items, call function + *too_long* with the first ``n + 1`` items. + + >>> iterable = ['a', 'b', 'c', 'd'] + >>> n = 4 + >>> list(strictly_n(iterable, n)) + ['a', 'b', 'c', 'd'] + + By default, *too_short* and *too_long* are functions that raise + ``ValueError``. + + >>> list(strictly_n('ab', 3)) # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + ValueError: too few items in iterable (got 2) + + >>> list(strictly_n('abc', 2)) # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + ValueError: too many items in iterable (got at least 3) + + You can instead supply functions that do something else. + *too_short* will be called with the number of items in *iterable*. + *too_long* will be called with `n + 1`. + + >>> def too_short(item_count): + ... raise RuntimeError + >>> it = strictly_n('abcd', 6, too_short=too_short) + >>> list(it) # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + RuntimeError + + >>> def too_long(item_count): + ... print('The boss is going to hear about this') + >>> it = strictly_n('abcdef', 4, too_long=too_long) + >>> list(it) + The boss is going to hear about this + ['a', 'b', 'c', 'd'] + + """ + if too_short is None: + too_short = lambda item_count: raise_( + ValueError, + 'Too few items in iterable (got {})'.format(item_count), + ) + + if too_long is None: + too_long = lambda item_count: raise_( + ValueError, + 'Too many items in iterable (got at least {})'.format(item_count), + ) + + it = iter(iterable) + for i in range(n): + try: + item = next(it) + except StopIteration: + too_short(i) + return + else: + yield item try: next(it) except StopIteration: pass else: - raise too_long or ValueError('too many items in iterable (expected 1)') - - return value + too_long(n + 1) -def distinct_permutations(iterable): +def distinct_permutations(iterable, r=None): """Yield successive distinct permutations of the elements in *iterable*. >>> sorted(distinct_permutations([1, 0, 1])) @@ -553,34 +650,88 @@ def distinct_permutations(iterable): items input, and each `x_i` is the count of a distinct item in the input sequence. + If *r* is given, only the *r*-length permutations are yielded. + + >>> sorted(distinct_permutations([1, 0, 1], r=2)) + [(0, 1), (1, 0), (1, 1)] + >>> sorted(distinct_permutations(range(3), r=2)) + [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)] + """ - def perm_unique_helper(item_counts, perm, i): - """Internal helper function + # Algorithm: https://w.wiki/Qai + def _full(A): + while True: + # Yield the permutation we have + yield tuple(A) - :arg item_counts: Stores the unique items in ``iterable`` and how many - times they are repeated - :arg perm: The permutation that is being built for output - :arg i: The index of the permutation being modified + # Find the largest index i such that A[i] < A[i + 1] + for i in range(size - 2, -1, -1): + if A[i] < A[i + 1]: + break + # If no such index exists, this permutation is the last one + else: + return - The output permutations are built up recursively; the distinct items - are placed until their repetitions are exhausted. - """ - if i < 0: - yield tuple(perm) - else: - for item in item_counts: - if item_counts[item] <= 0: - continue - perm[i] = item - item_counts[item] -= 1 - for x in perm_unique_helper(item_counts, perm, i - 1): - yield x - item_counts[item] += 1 + # Find the largest index j greater than j such that A[i] < A[j] + for j in range(size - 1, i, -1): + if A[i] < A[j]: + break - item_counts = Counter(iterable) - length = sum(item_counts.values()) + # Swap the value of A[i] with that of A[j], then reverse the + # sequence from A[i + 1] to form the new permutation + A[i], A[j] = A[j], A[i] + A[i + 1 :] = A[: i - size : -1] # A[i + 1:][::-1] - return perm_unique_helper(item_counts, [None] * length, length - 1) + # Algorithm: modified from the above + def _partial(A, r): + # Split A into the first r items and the last r items + head, tail = A[:r], A[r:] + right_head_indexes = range(r - 1, -1, -1) + left_tail_indexes = range(len(tail)) + + while True: + # Yield the permutation we have + yield tuple(head) + + # Starting from the right, find the first index of the head with + # value smaller than the maximum value of the tail - call it i. + pivot = tail[-1] + for i in right_head_indexes: + if head[i] < pivot: + break + pivot = head[i] + else: + return + + # Starting from the left, find the first value of the tail + # with a value greater than head[i] and swap. + for j in left_tail_indexes: + if tail[j] > head[i]: + head[i], tail[j] = tail[j], head[i] + break + # If we didn't find one, start from the right and find the first + # index of the head with a value greater than head[i] and swap. + else: + for j in right_head_indexes: + if head[j] > head[i]: + head[i], head[j] = head[j], head[i] + break + + # Reverse head[i + 1:] and swap it with tail[:r - (i + 1)] + tail += head[: i - r : -1] # head[i + 1:][::-1] + i += 1 + head[i:], tail[:] = tail[: r - i], tail[r - i :] + + items = sorted(iterable) + + size = len(items) + if r is None: + r = size + + if 0 < r <= size: + return _full(items) if (r == size) else _partial(items, r) + + return iter(() if r else ((),)) def intersperse(e, iterable, n=1): @@ -597,8 +748,8 @@ def intersperse(e, iterable, n=1): if n == 0: raise ValueError('n must be > 0') elif n == 1: - # interleave(repeat(e), iterable) -> e, x_0, e, e, x_1, e, x_2... - # islice(..., 1, None) -> x_0, e, e, x_1, e, x_2... + # interleave(repeat(e), iterable) -> e, x_0, e, x_1, e, x_2... + # islice(..., 1, None) -> x_0, e, x_1, e, x_2... return islice(interleave(repeat(e), iterable), 1, None) else: # interleave(filler, chunks) -> [e], [x_0, x_1], [e], [x_2, x_3]... @@ -650,7 +801,7 @@ def windowed(seq, n, fillvalue=None, step=1): [(1, 2, 3), (2, 3, 4), (3, 4, 5)] When the window is larger than the iterable, *fillvalue* is used in place - of missing values:: + of missing values: >>> list(windowed([1, 2, 3], 4)) [(1, 2, 3, None)] @@ -660,6 +811,14 @@ def windowed(seq, n, fillvalue=None, step=1): >>> list(windowed([1, 2, 3, 4, 5, 6], 3, fillvalue='!', step=2)) [(1, 2, 3), (3, 4, 5), (5, 6, '!')] + To slide into the iterable's items, use :func:`chain` to add filler items + to the left: + + >>> iterable = [1, 2, 3, 4] + >>> n = 3 + >>> padding = [None] * (n - 1) + >>> list(windowed(chain(padding, iterable), 3)) + [(None, None, 1), (None, 1, 2), (1, 2, 3), (2, 3, 4)] """ if n < 0: raise ValueError('n must be >= 0') @@ -669,37 +828,92 @@ def windowed(seq, n, fillvalue=None, step=1): if step < 1: raise ValueError('step must be >= 1') - it = iter(seq) - window = deque([], n) - append = window.append - - # Initial deque fill - for _ in range(n): - append(next(it, fillvalue)) - yield tuple(window) - - # Appending new items to the right causes old items to fall off the left - i = 0 - for item in it: - append(item) - i = (i + 1) % step - if i % step == 0: + window = deque(maxlen=n) + i = n + for _ in map(window.append, seq): + i -= 1 + if not i: + i = step yield tuple(window) - # If there are items from the iterable in the window, pad with the given - # value and emit them. - if (i % step) and (step - i < n): - for _ in range(step - i): - append(fillvalue) + size = len(window) + if size == 0: + return + elif size < n: + yield tuple(chain(window, repeat(fillvalue, n - size))) + elif 0 < i < min(step, n): + window += (fillvalue,) * i yield tuple(window) -class bucket(object): +def substrings(iterable): + """Yield all of the substrings of *iterable*. + + >>> [''.join(s) for s in substrings('more')] + ['m', 'o', 'r', 'e', 'mo', 'or', 're', 'mor', 'ore', 'more'] + + Note that non-string iterables can also be subdivided. + + >>> list(substrings([0, 1, 2])) + [(0,), (1,), (2,), (0, 1), (1, 2), (0, 1, 2)] + + """ + # The length-1 substrings + seq = [] + for item in iter(iterable): + seq.append(item) + yield (item,) + seq = tuple(seq) + item_count = len(seq) + + # And the rest + for n in range(2, item_count + 1): + for i in range(item_count - n + 1): + yield seq[i : i + n] + + +def substrings_indexes(seq, reverse=False): + """Yield all substrings and their positions in *seq* + + The items yielded will be a tuple of the form ``(substr, i, j)``, where + ``substr == seq[i:j]``. + + This function only works for iterables that support slicing, such as + ``str`` objects. + + >>> for item in substrings_indexes('more'): + ... print(item) + ('m', 0, 1) + ('o', 1, 2) + ('r', 2, 3) + ('e', 3, 4) + ('mo', 0, 2) + ('or', 1, 3) + ('re', 2, 4) + ('mor', 0, 3) + ('ore', 1, 4) + ('more', 0, 4) + + Set *reverse* to ``True`` to yield the same items in the opposite order. + + + """ + r = range(1, len(seq) + 1) + if reverse: + r = reversed(r) + return ( + (seq[i : i + L], i, i + L) for L in r for i in range(len(seq) - L + 1) + ) + + +class bucket: """Wrap *iterable* and return an object that buckets it iterable into child iterables based on a *key* function. >>> iterable = ['a1', 'b1', 'c1', 'a2', 'b2', 'c2', 'b3'] - >>> s = bucket(iterable, key=lambda x: x[0]) + >>> s = bucket(iterable, key=lambda x: x[0]) # Bucket by 1st character + >>> sorted(list(s)) # Get the keys + ['a', 'b', 'c'] >>> a_iterable = s['a'] >>> next(a_iterable) 'a1' @@ -727,6 +941,7 @@ class bucket(object): [] """ + def __init__(self, iterable, key, validator=None): self._it = iter(iterable) self._key = key @@ -772,6 +987,14 @@ class bucket(object): elif self._validator(item_value): self._cache[item_value].append(item) + def __iter__(self): + for item in self._it: + item_value = self._key(item) + if self._validator(item_value): + self._cache[item_value].append(item) + + yield from self._cache.keys() + def __getitem__(self, value): if not self._validator(value): return iter(()) @@ -819,7 +1042,7 @@ def spy(iterable, n=1): it = iter(iterable) head = take(n, it) - return head, chain(head, it) + return head.copy(), chain(head, it) def interleave(*iterables): @@ -852,6 +1075,72 @@ def interleave_longest(*iterables): return (x for x in i if x is not _marker) +def interleave_evenly(iterables, lengths=None): + """ + Interleave multiple iterables so that their elements are evenly distributed + throughout the output sequence. + + >>> iterables = [1, 2, 3, 4, 5], ['a', 'b'] + >>> list(interleave_evenly(iterables)) + [1, 2, 'a', 3, 4, 'b', 5] + + >>> iterables = [[1, 2, 3], [4, 5], [6, 7, 8]] + >>> list(interleave_evenly(iterables)) + [1, 6, 4, 2, 7, 3, 8, 5] + + This function requires iterables of known length. Iterables without + ``__len__()`` can be used by manually specifying lengths with *lengths*: + + >>> from itertools import combinations, repeat + >>> iterables = [combinations(range(4), 2), ['a', 'b', 'c']] + >>> lengths = [4 * (4 - 1) // 2, 3] + >>> list(interleave_evenly(iterables, lengths=lengths)) + [(0, 1), (0, 2), 'a', (0, 3), (1, 2), 'b', (1, 3), (2, 3), 'c'] + + Based on Bresenham's algorithm. + """ + if lengths is None: + try: + lengths = [len(it) for it in iterables] + except TypeError: + raise ValueError( + 'Iterable lengths could not be determined automatically. ' + 'Specify them with the lengths keyword.' + ) + elif len(iterables) != len(lengths): + raise ValueError('Mismatching number of iterables and lengths.') + + dims = len(lengths) + + # sort iterables by length, descending + lengths_permute = sorted( + range(dims), key=lambda i: lengths[i], reverse=True + ) + lengths_desc = [lengths[i] for i in lengths_permute] + iters_desc = [iter(iterables[i]) for i in lengths_permute] + + # the longest iterable is the primary one (Bresenham: the longest + # distance along an axis) + delta_primary, deltas_secondary = lengths_desc[0], lengths_desc[1:] + iter_primary, iters_secondary = iters_desc[0], iters_desc[1:] + errors = [delta_primary // dims] * len(deltas_secondary) + + to_yield = sum(lengths) + while to_yield: + yield next(iter_primary) + to_yield -= 1 + # update errors for each secondary iterable + errors = [e - delta for e, delta in zip(errors, deltas_secondary)] + + # those iterables for which the error is negative are yielded + # ("diagonal step" in Bresenham) + for i, e in enumerate(errors): + if e < 0: + yield next(iters_secondary[i]) + to_yield -= 1 + errors[i] += delta_primary + + def collapse(iterable, base_type=None, levels=None): """Flatten an iterable with multiple levels of nesting (e.g., a list of lists of tuples) into non-iterable types. @@ -860,7 +1149,9 @@ def collapse(iterable, base_type=None, levels=None): >>> list(collapse(iterable)) [1, 2, 3, 4, 5, 6] - String types are not considered iterable and will not be collapsed. + Binary and text strings are not considered iterable and + will not be collapsed. + To avoid collapsing other types, specify *base_type*: >>> iterable = ['ab', ('cd', 'ef'), ['gh', 'ij']] @@ -876,11 +1167,12 @@ def collapse(iterable, base_type=None, levels=None): ['a', ['b'], 'c', ['d']] """ + def walk(node, level): if ( - ((levels is not None) and (level > levels)) or - isinstance(node, string_types) or - ((base_type is not None) and isinstance(node, base_type)) + ((levels is not None) and (level > levels)) + or isinstance(node, (str, bytes)) + or ((base_type is not None) and isinstance(node, base_type)) ): yield node return @@ -892,11 +1184,9 @@ def collapse(iterable, base_type=None, levels=None): return else: for child in tree: - for x in walk(child, level + 1): - yield x + yield from walk(child, level + 1) - for x in walk(iterable, 0): - yield x + yield from walk(iterable, 0) def side_effect(func, iterable, chunk_size=None, before=None, after=None): @@ -954,56 +1244,93 @@ def side_effect(func, iterable, chunk_size=None, before=None, after=None): else: for chunk in chunked(iterable, chunk_size): func(chunk) - for item in chunk: - yield item + yield from chunk finally: if after is not None: after() -def sliced(seq, n): +def sliced(seq, n, strict=False): """Yield slices of length *n* from the sequence *seq*. - >>> list(sliced((1, 2, 3, 4, 5, 6), 3)) - [(1, 2, 3), (4, 5, 6)] + >>> list(sliced((1, 2, 3, 4, 5, 6), 3)) + [(1, 2, 3), (4, 5, 6)] - If the length of the sequence is not divisible by the requested slice - length, the last slice will be shorter. + By the default, the last yielded slice will have fewer than *n* elements + if the length of *seq* is not divisible by *n*: - >>> list(sliced((1, 2, 3, 4, 5, 6, 7, 8), 3)) - [(1, 2, 3), (4, 5, 6), (7, 8)] + >>> list(sliced((1, 2, 3, 4, 5, 6, 7, 8), 3)) + [(1, 2, 3), (4, 5, 6), (7, 8)] + + If the length of *seq* is not divisible by *n* and *strict* is + ``True``, then ``ValueError`` will be raised before the last + slice is yielded. This function will only work for iterables that support slicing. For non-sliceable iterables, see :func:`chunked`. """ - return takewhile(bool, (seq[i: i + n] for i in count(0, n))) + iterator = takewhile(len, (seq[i : i + n] for i in count(0, n))) + if strict: + + def ret(): + for _slice in iterator: + if len(_slice) != n: + raise ValueError("seq is not divisible by n.") + yield _slice + + return iter(ret()) + else: + return iterator -def split_at(iterable, pred): +def split_at(iterable, pred, maxsplit=-1, keep_separator=False): """Yield lists of items from *iterable*, where each list is delimited by - an item where callable *pred* returns ``True``. The lists do not include - the delimiting items. + an item where callable *pred* returns ``True``. >>> list(split_at('abcdcba', lambda x: x == 'b')) [['a'], ['c', 'd', 'c'], ['a']] >>> list(split_at(range(10), lambda n: n % 2 == 1)) [[0], [2], [4], [6], [8], []] + + At most *maxsplit* splits are done. If *maxsplit* is not specified or -1, + then there is no limit on the number of splits: + + >>> list(split_at(range(10), lambda n: n % 2 == 1, maxsplit=2)) + [[0], [2], [4, 5, 6, 7, 8, 9]] + + By default, the delimiting items are not included in the output. + The include them, set *keep_separator* to ``True``. + + >>> list(split_at('abcdcba', lambda x: x == 'b', keep_separator=True)) + [['a'], ['b'], ['c', 'd', 'c'], ['b'], ['a']] + """ + if maxsplit == 0: + yield list(iterable) + return + buf = [] - for item in iterable: + it = iter(iterable) + for item in it: if pred(item): yield buf + if keep_separator: + yield [item] + if maxsplit == 1: + yield list(it) + return buf = [] + maxsplit -= 1 else: buf.append(item) yield buf -def split_before(iterable, pred): - """Yield lists of items from *iterable*, where each list starts with an - item where callable *pred* returns ``True``: +def split_before(iterable, pred, maxsplit=-1): + """Yield lists of items from *iterable*, where each list ends just before + an item for which callable *pred* returns ``True``: >>> list(split_before('OneTwo', lambda s: s.isupper())) [['O', 'n', 'e'], ['T', 'w', 'o']] @@ -1011,17 +1338,32 @@ def split_before(iterable, pred): >>> list(split_before(range(10), lambda n: n % 3 == 0)) [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]] + At most *maxsplit* splits are done. If *maxsplit* is not specified or -1, + then there is no limit on the number of splits: + + >>> list(split_before(range(10), lambda n: n % 3 == 0, maxsplit=2)) + [[0, 1, 2], [3, 4, 5], [6, 7, 8, 9]] """ + if maxsplit == 0: + yield list(iterable) + return + buf = [] - for item in iterable: + it = iter(iterable) + for item in it: if pred(item) and buf: yield buf + if maxsplit == 1: + yield [item] + list(it) + return buf = [] + maxsplit -= 1 buf.append(item) - yield buf + if buf: + yield buf -def split_after(iterable, pred): +def split_after(iterable, pred, maxsplit=-1): """Yield lists of items from *iterable*, where each list ends with an item where callable *pred* returns ``True``: @@ -1031,17 +1373,122 @@ def split_after(iterable, pred): >>> list(split_after(range(10), lambda n: n % 3 == 0)) [[0], [1, 2, 3], [4, 5, 6], [7, 8, 9]] + At most *maxsplit* splits are done. If *maxsplit* is not specified or -1, + then there is no limit on the number of splits: + + >>> list(split_after(range(10), lambda n: n % 3 == 0, maxsplit=2)) + [[0], [1, 2, 3], [4, 5, 6, 7, 8, 9]] + """ + if maxsplit == 0: + yield list(iterable) + return + buf = [] - for item in iterable: + it = iter(iterable) + for item in it: buf.append(item) if pred(item) and buf: yield buf + if maxsplit == 1: + yield list(it) + return buf = [] + maxsplit -= 1 if buf: yield buf +def split_when(iterable, pred, maxsplit=-1): + """Split *iterable* into pieces based on the output of *pred*. + *pred* should be a function that takes successive pairs of items and + returns ``True`` if the iterable should be split in between them. + + For example, to find runs of increasing numbers, split the iterable when + element ``i`` is larger than element ``i + 1``: + + >>> list(split_when([1, 2, 3, 3, 2, 5, 2, 4, 2], lambda x, y: x > y)) + [[1, 2, 3, 3], [2, 5], [2, 4], [2]] + + At most *maxsplit* splits are done. If *maxsplit* is not specified or -1, + then there is no limit on the number of splits: + + >>> list(split_when([1, 2, 3, 3, 2, 5, 2, 4, 2], + ... lambda x, y: x > y, maxsplit=2)) + [[1, 2, 3, 3], [2, 5], [2, 4, 2]] + + """ + if maxsplit == 0: + yield list(iterable) + return + + it = iter(iterable) + try: + cur_item = next(it) + except StopIteration: + return + + buf = [cur_item] + for next_item in it: + if pred(cur_item, next_item): + yield buf + if maxsplit == 1: + yield [next_item] + list(it) + return + buf = [] + maxsplit -= 1 + + buf.append(next_item) + cur_item = next_item + + yield buf + + +def split_into(iterable, sizes): + """Yield a list of sequential items from *iterable* of length 'n' for each + integer 'n' in *sizes*. + + >>> list(split_into([1,2,3,4,5,6], [1,2,3])) + [[1], [2, 3], [4, 5, 6]] + + If the sum of *sizes* is smaller than the length of *iterable*, then the + remaining items of *iterable* will not be returned. + + >>> list(split_into([1,2,3,4,5,6], [2,3])) + [[1, 2], [3, 4, 5]] + + If the sum of *sizes* is larger than the length of *iterable*, fewer items + will be returned in the iteration that overruns *iterable* and further + lists will be empty: + + >>> list(split_into([1,2,3,4], [1,2,3,4])) + [[1], [2, 3], [4], []] + + When a ``None`` object is encountered in *sizes*, the returned list will + contain items up to the end of *iterable* the same way that itertools.slice + does: + + >>> list(split_into([1,2,3,4,5,6,7,8,9,0], [2,3,None])) + [[1, 2], [3, 4, 5], [6, 7, 8, 9, 0]] + + :func:`split_into` can be useful for grouping a series of items where the + sizes of the groups are not uniform. An example would be where in a row + from a table, multiple columns represent elements of the same feature + (e.g. a point represented by x,y,z) but, the format is not the same for + all columns. + """ + # convert the iterable argument into an iterator so its contents can + # be consumed by islice in case it is a generator + it = iter(iterable) + + for size in sizes: + if size is None: + yield list(it) + return + else: + yield list(islice(it, size)) + + def padded(iterable, fillvalue=None, n=None, next_multiple=False): """Yield the elements from *iterable*, followed by *fillvalue*, such that at least *n* items are emitted. @@ -1060,8 +1507,7 @@ def padded(iterable, fillvalue=None, n=None, next_multiple=False): """ it = iter(iterable) if n is None: - for item in chain(it, repeat(fillvalue)): - yield item + yield from chain(it, repeat(fillvalue)) elif n < 1: raise ValueError('n must be at least 1') else: @@ -1075,6 +1521,34 @@ def padded(iterable, fillvalue=None, n=None, next_multiple=False): yield fillvalue +def repeat_each(iterable, n=2): + """Repeat each element in *iterable* *n* times. + + >>> list(repeat_each('ABC', 3)) + ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'] + """ + return chain.from_iterable(map(repeat, iterable, repeat(n))) + + +def repeat_last(iterable, default=None): + """After the *iterable* is exhausted, keep yielding its last element. + + >>> list(islice(repeat_last(range(3)), 5)) + [0, 1, 2, 2, 2] + + If the iterable is empty, yield *default* forever:: + + >>> list(islice(repeat_last(range(0), 42), 5)) + [42, 42, 42, 42, 42] + + """ + item = _marker + for item in iterable: + yield item + final = default if item is _marker else item + yield from repeat(final) + + def distribute(n, iterable): """Distribute the items from *iterable* among *n* smaller iterables. @@ -1138,7 +1612,38 @@ def stagger(iterable, offsets=(-1, 0, 1), longest=False, fillvalue=None): ) -def zip_offset(*iterables, **kwargs): +def zip_equal(*iterables): + """``zip`` the input *iterables* together, but raise + ``UnequalIterablesError`` if they aren't all the same length. + + >>> it_1 = range(3) + >>> it_2 = iter('abc') + >>> list(zip_equal(it_1, it_2)) + [(0, 'a'), (1, 'b'), (2, 'c')] + + >>> it_1 = range(3) + >>> it_2 = iter('abcd') + >>> list(zip_equal(it_1, it_2)) # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + more_itertools.more.UnequalIterablesError: Iterables have different + lengths + + """ + if hexversion >= 0x30A00A6: + warnings.warn( + ( + 'zip_equal will be removed in a future version of ' + 'more-itertools. Use the builtin zip function with ' + 'strict=True instead.' + ), + DeprecationWarning, + ) + + return _zip_equal(*iterables) + + +def zip_offset(*iterables, offsets, longest=False, fillvalue=None): """``zip`` the input *iterables* together, but offset the `i`-th iterable by the `i`-th item in *offsets*. @@ -1146,7 +1651,7 @@ def zip_offset(*iterables, **kwargs): [('0', 'b'), ('1', 'c'), ('2', 'd'), ('3', 'e')] This can be used as a lightweight alternative to SciPy or pandas to analyze - data sets in which somes series have a lead or lag relationship. + data sets in which some series have a lead or lag relationship. By default, the sequence will end when the shortest iterable is exhausted. To continue until the longest iterable is exhausted, set *longest* to @@ -1159,10 +1664,6 @@ def zip_offset(*iterables, **kwargs): sequence. Specify *fillvalue* to use some other value. """ - offsets = kwargs['offsets'] - longest = kwargs.get('longest', False) - fillvalue = kwargs.get('fillvalue', None) - if len(iterables) != len(offsets): raise ValueError("Number of iterables and offsets didn't match") @@ -1181,7 +1682,7 @@ def zip_offset(*iterables, **kwargs): return zip(*staggered) -def sort_together(iterables, key_list=(0,), reverse=False): +def sort_together(iterables, key_list=(0,), key=None, reverse=False): """Return the input iterables sorted together, with *key_list* as the priority for sorting. All iterables are trimmed to the length of the shortest one. @@ -1197,21 +1698,103 @@ def sort_together(iterables, key_list=(0,), reverse=False): [(1, 2, 3, 4), ('d', 'c', 'b', 'a')] Set a different key list to sort according to another iterable. - Specifying mutliple keys dictates how ties are broken:: + Specifying multiple keys dictates how ties are broken:: >>> iterables = [(3, 1, 2), (0, 1, 0), ('c', 'b', 'a')] >>> sort_together(iterables, key_list=(1, 2)) [(2, 3, 1), (0, 0, 1), ('a', 'c', 'b')] + To sort by a function of the elements of the iterable, pass a *key* + function. Its arguments are the elements of the iterables corresponding to + the key list:: + + >>> names = ('a', 'b', 'c') + >>> lengths = (1, 2, 3) + >>> widths = (5, 2, 1) + >>> def area(length, width): + ... return length * width + >>> sort_together([names, lengths, widths], key_list=(1, 2), key=area) + [('c', 'b', 'a'), (3, 2, 1), (1, 2, 5)] + Set *reverse* to ``True`` to sort in descending order. >>> sort_together([(1, 2, 3), ('c', 'b', 'a')], reverse=True) [(3, 2, 1), ('a', 'b', 'c')] """ - return list(zip(*sorted(zip(*iterables), - key=itemgetter(*key_list), - reverse=reverse))) + if key is None: + # if there is no key function, the key argument to sorted is an + # itemgetter + key_argument = itemgetter(*key_list) + else: + # if there is a key function, call it with the items at the offsets + # specified by the key function as arguments + key_list = list(key_list) + if len(key_list) == 1: + # if key_list contains a single item, pass the item at that offset + # as the only argument to the key function + key_offset = key_list[0] + key_argument = lambda zipped_items: key(zipped_items[key_offset]) + else: + # if key_list contains multiple items, use itemgetter to return a + # tuple of items, which we pass as *args to the key function + get_key_items = itemgetter(*key_list) + key_argument = lambda zipped_items: key( + *get_key_items(zipped_items) + ) + + return list( + zip(*sorted(zip(*iterables), key=key_argument, reverse=reverse)) + ) + + +def unzip(iterable): + """The inverse of :func:`zip`, this function disaggregates the elements + of the zipped *iterable*. + + The ``i``-th iterable contains the ``i``-th element from each element + of the zipped iterable. The first element is used to determine the + length of the remaining elements. + + >>> iterable = [('a', 1), ('b', 2), ('c', 3), ('d', 4)] + >>> letters, numbers = unzip(iterable) + >>> list(letters) + ['a', 'b', 'c', 'd'] + >>> list(numbers) + [1, 2, 3, 4] + + This is similar to using ``zip(*iterable)``, but it avoids reading + *iterable* into memory. Note, however, that this function uses + :func:`itertools.tee` and thus may require significant storage. + + """ + head, iterable = spy(iter(iterable)) + if not head: + # empty iterable, e.g. zip([], [], []) + return () + # spy returns a one-length iterable as head + head = head[0] + iterables = tee(iterable, len(head)) + + def itemgetter(i): + def getter(obj): + try: + return obj[i] + except IndexError: + # basically if we have an iterable like + # iter([(1, 2, 3), (4, 5), (6,)]) + # the second unzipped iterable would fail at the third tuple + # since it would try to access tup[1] + # same with the third unzipped iterable and the second tuple + # to support these "improperly zipped" iterables, + # we create a custom itemgetter + # which just stops the unzipped iterables + # at first length mismatch + raise StopIteration + + return getter + + return tuple(map(itemgetter(i), it) for i, it in enumerate(iterables)) def divide(n, iterable): @@ -1246,19 +1829,26 @@ def divide(n, iterable): if n < 1: raise ValueError('n must be at least 1') - seq = tuple(iterable) + try: + iterable[:0] + except TypeError: + seq = tuple(iterable) + else: + seq = iterable + q, r = divmod(len(seq), n) ret = [] - for i in range(n): - start = (i * q) + (i if i < r else r) - stop = ((i + 1) * q) + (i + 1 if i + 1 < r else r) + stop = 0 + for i in range(1, n + 1): + start = stop + stop += q + 1 if i <= r else q ret.append(iter(seq[start:stop])) return ret -def always_iterable(obj, base_type=(text_type, binary_type)): +def always_iterable(obj, base_type=(str, bytes)): """If *obj* is iterable, return an iterator over its items:: >>> obj = (1, 2, 3) @@ -1350,21 +1940,23 @@ def adjacent(predicate, iterable, distance=1): return zip(adjacent_to_selected, i2) -def groupby_transform(iterable, keyfunc=None, valuefunc=None): - """An extension of :func:`itertools.groupby` that transforms the values of - *iterable* after grouping them. - *keyfunc* is a function used to compute a grouping key for each item. - *valuefunc* is a function for transforming the items after grouping. +def groupby_transform(iterable, keyfunc=None, valuefunc=None, reducefunc=None): + """An extension of :func:`itertools.groupby` that can apply transformations + to the grouped data. - >>> iterable = 'AaaABbBCcA' - >>> keyfunc = lambda x: x.upper() - >>> valuefunc = lambda x: x.lower() - >>> grouper = groupby_transform(iterable, keyfunc, valuefunc) - >>> [(k, ''.join(g)) for k, g in grouper] - [('A', 'aaaa'), ('B', 'bbb'), ('C', 'cc'), ('A', 'a')] + * *keyfunc* is a function computing a key value for each item in *iterable* + * *valuefunc* is a function that transforms the individual items from + *iterable* after grouping + * *reducefunc* is a function that transforms each group of items - *keyfunc* and *valuefunc* default to identity functions if they are not - specified. + >>> iterable = 'aAAbBBcCC' + >>> keyfunc = lambda k: k.upper() + >>> valuefunc = lambda v: v.lower() + >>> reducefunc = lambda g: ''.join(g) + >>> list(groupby_transform(iterable, keyfunc, valuefunc, reducefunc)) + [('A', 'aaa'), ('B', 'bbb'), ('C', 'ccc')] + + Each optional argument defaults to an identity function if not specified. :func:`groupby_transform` is useful when grouping elements of an iterable using a separate iterable as the key. To do this, :func:`zip` the iterables @@ -1384,11 +1976,16 @@ def groupby_transform(iterable, keyfunc=None, valuefunc=None): duplicate groups, you should sort the iterable by the key function. """ - valuefunc = (lambda x: x) if valuefunc is None else valuefunc - return ((k, map(valuefunc, g)) for k, g in groupby(iterable, keyfunc)) + ret = groupby(iterable, keyfunc) + if valuefunc: + ret = ((k, map(valuefunc, g)) for k, g in ret) + if reducefunc: + ret = ((k, reducefunc(g)) for k, g in ret) + + return ret -def numeric_range(*args): +class numeric_range(abc.Sequence, abc.Hashable): """An extension of the built-in ``range()`` function whose arguments can be any orderable numeric type. @@ -1425,28 +2022,184 @@ def numeric_range(*args): Be aware of the limitations of floating point numbers; the representation of the yielded numbers may be surprising. - """ - argc = len(args) - if argc == 1: - stop, = args - start = type(stop)(0) - step = 1 - elif argc == 2: - start, stop = args - step = 1 - elif argc == 3: - start, stop, step = args - else: - err_msg = 'numeric_range takes at most 3 arguments, got {}' - raise TypeError(err_msg.format(argc)) + ``datetime.datetime`` objects can be used for *start* and *stop*, if *step* + is a ``datetime.timedelta`` object: - values = (start + (step * n) for n in count()) - if step > 0: - return takewhile(partial(gt, stop), values) - elif step < 0: - return takewhile(partial(lt, stop), values) - else: - raise ValueError('numeric_range arg 3 must not be zero') + >>> import datetime + >>> start = datetime.datetime(2019, 1, 1) + >>> stop = datetime.datetime(2019, 1, 3) + >>> step = datetime.timedelta(days=1) + >>> items = iter(numeric_range(start, stop, step)) + >>> next(items) + datetime.datetime(2019, 1, 1, 0, 0) + >>> next(items) + datetime.datetime(2019, 1, 2, 0, 0) + + """ + + _EMPTY_HASH = hash(range(0, 0)) + + def __init__(self, *args): + argc = len(args) + if argc == 1: + (self._stop,) = args + self._start = type(self._stop)(0) + self._step = type(self._stop - self._start)(1) + elif argc == 2: + self._start, self._stop = args + self._step = type(self._stop - self._start)(1) + elif argc == 3: + self._start, self._stop, self._step = args + elif argc == 0: + raise TypeError( + 'numeric_range expected at least ' + '1 argument, got {}'.format(argc) + ) + else: + raise TypeError( + 'numeric_range expected at most ' + '3 arguments, got {}'.format(argc) + ) + + self._zero = type(self._step)(0) + if self._step == self._zero: + raise ValueError('numeric_range() arg 3 must not be zero') + self._growing = self._step > self._zero + self._init_len() + + def __bool__(self): + if self._growing: + return self._start < self._stop + else: + return self._start > self._stop + + def __contains__(self, elem): + if self._growing: + if self._start <= elem < self._stop: + return (elem - self._start) % self._step == self._zero + else: + if self._start >= elem > self._stop: + return (self._start - elem) % (-self._step) == self._zero + + return False + + def __eq__(self, other): + if isinstance(other, numeric_range): + empty_self = not bool(self) + empty_other = not bool(other) + if empty_self or empty_other: + return empty_self and empty_other # True if both empty + else: + return ( + self._start == other._start + and self._step == other._step + and self._get_by_index(-1) == other._get_by_index(-1) + ) + else: + return False + + def __getitem__(self, key): + if isinstance(key, int): + return self._get_by_index(key) + elif isinstance(key, slice): + step = self._step if key.step is None else key.step * self._step + + if key.start is None or key.start <= -self._len: + start = self._start + elif key.start >= self._len: + start = self._stop + else: # -self._len < key.start < self._len + start = self._get_by_index(key.start) + + if key.stop is None or key.stop >= self._len: + stop = self._stop + elif key.stop <= -self._len: + stop = self._start + else: # -self._len < key.stop < self._len + stop = self._get_by_index(key.stop) + + return numeric_range(start, stop, step) + else: + raise TypeError( + 'numeric range indices must be ' + 'integers or slices, not {}'.format(type(key).__name__) + ) + + def __hash__(self): + if self: + return hash((self._start, self._get_by_index(-1), self._step)) + else: + return self._EMPTY_HASH + + def __iter__(self): + values = (self._start + (n * self._step) for n in count()) + if self._growing: + return takewhile(partial(gt, self._stop), values) + else: + return takewhile(partial(lt, self._stop), values) + + def __len__(self): + return self._len + + def _init_len(self): + if self._growing: + start = self._start + stop = self._stop + step = self._step + else: + start = self._stop + stop = self._start + step = -self._step + distance = stop - start + if distance <= self._zero: + self._len = 0 + else: # distance > 0 and step > 0: regular euclidean division + q, r = divmod(distance, step) + self._len = int(q) + int(r != self._zero) + + def __reduce__(self): + return numeric_range, (self._start, self._stop, self._step) + + def __repr__(self): + if self._step == 1: + return "numeric_range({}, {})".format( + repr(self._start), repr(self._stop) + ) + else: + return "numeric_range({}, {}, {})".format( + repr(self._start), repr(self._stop), repr(self._step) + ) + + def __reversed__(self): + return iter( + numeric_range( + self._get_by_index(-1), self._start - self._step, -self._step + ) + ) + + def count(self, value): + return int(value in self) + + def index(self, value): + if self._growing: + if self._start <= value < self._stop: + q, r = divmod(value - self._start, self._step) + if r == self._zero: + return int(q) + else: + if self._start >= value > self._stop: + q, r = divmod(self._start - value, -self._step) + if r == self._zero: + return int(q) + + raise ValueError("{} is not in numeric range".format(value)) + + def _get_by_index(self, i): + if i < 0: + i += self._len + if i < 0 or i >= self._len: + raise IndexError("numeric range object index out of range") + return self._start + i * self._step def count_cycle(iterable, n=None): @@ -1465,6 +2218,43 @@ def count_cycle(iterable, n=None): return ((i, item) for i in counter for item in iterable) +def mark_ends(iterable): + """Yield 3-tuples of the form ``(is_first, is_last, item)``. + + >>> list(mark_ends('ABC')) + [(True, False, 'A'), (False, False, 'B'), (False, True, 'C')] + + Use this when looping over an iterable to take special action on its first + and/or last items: + + >>> iterable = ['Header', 100, 200, 'Footer'] + >>> total = 0 + >>> for is_first, is_last, item in mark_ends(iterable): + ... if is_first: + ... continue # Skip the header + ... if is_last: + ... continue # Skip the footer + ... total += item + >>> print(total) + 300 + """ + it = iter(iterable) + + try: + b = next(it) + except StopIteration: + return + + try: + for i in count(): + a = b + b = next(it) + yield i == 0, False, a + + except StopIteration: + yield i == 0, True, a + + def locate(iterable, pred=bool, window_size=None): """Yield the index of each item in *iterable* for which *pred* returns ``True``. @@ -1513,6 +2303,16 @@ def locate(iterable, pred=bool, window_size=None): return compress(count(), starmap(pred, it)) +def longest_common_prefix(iterables): + """Yield elements of the longest common prefix amongst given *iterables*. + + >>> ''.join(longest_common_prefix(['abcd', 'abc', 'abf'])) + 'ab' + + """ + return (c[0] for c in takewhile(all_equal, zip(*iterables))) + + def lstrip(iterable, pred): """Yield the items from *iterable*, but strip any from the beginning for which *pred* returns ``True``. @@ -1547,13 +2347,13 @@ def rstrip(iterable, pred): """ cache = [] cache_append = cache.append + cache_clear = cache.clear for x in iterable: if pred(x): cache_append(x) else: - for y in cache: - yield y - del cache[:] + yield from cache + cache_clear() yield x @@ -1574,7 +2374,7 @@ def strip(iterable, pred): return rstrip(lstrip(iterable, pred), pred) -def islice_extended(iterable, *args): +class islice_extended: """An extension of :func:`itertools.islice` that supports negative values for *stop*, *start*, and *step*. @@ -1591,20 +2391,46 @@ def islice_extended(iterable, *args): >>> list(islice_extended(count(), 110, 99, -2)) [110, 108, 106, 104, 102, 100] + You can also use slice notation directly: + + >>> iterable = map(str, count()) + >>> it = islice_extended(iterable)[10:20:2] + >>> list(it) + ['10', '12', '14', '16', '18'] + """ - s = slice(*args) + + def __init__(self, iterable, *args): + it = iter(iterable) + if args: + self._iterable = _islice_helper(it, slice(*args)) + else: + self._iterable = it + + def __iter__(self): + return self + + def __next__(self): + return next(self._iterable) + + def __getitem__(self, key): + if isinstance(key, slice): + return islice_extended(_islice_helper(self._iterable, key)) + + raise TypeError('islice_extended.__getitem__ argument must be a slice') + + +def _islice_helper(it, s): start = s.start stop = s.stop if s.step == 0: raise ValueError('step argument must be a non-zero integer or None.') step = s.step or 1 - it = iter(iterable) - if step > 0: start = 0 if (start is None) else start - if (start < 0): + if start < 0: # Consume all but the last -start items cache = deque(enumerate(it, 1), maxlen=-start) len_iter = cache[-1][0] if cache else 0 @@ -1642,8 +2468,7 @@ def islice_extended(iterable, *args): cache.append(item) else: # When both start and stop are positive we have the normal case - for item in islice(it, start, stop, step): - yield item + yield from islice(it, start, stop, step) else: start = -1 if (start is None) else start @@ -1688,8 +2513,7 @@ def islice_extended(iterable, *args): cache = list(islice(it, n)) - for item in cache[i::step]: - yield item + yield from cache[i::step] def always_reversible(iterable): @@ -1740,6 +2564,17 @@ def consecutive_groups(iterable, ordering=lambda x: x): ['i'] ['l', 'm', 'n', 'o', 'p'] + Each group of consecutive items is an iterator that shares it source with + *iterable*. When an an output group is advanced, the previous group is + no longer available unless its elements are copied (e.g., into a ``list``). + + >>> iterable = [1, 2, 11, 12, 21, 22] + >>> saved_groups = [] + >>> for group in consecutive_groups(iterable): + ... saved_groups.append(list(group)) # Copy group elements + >>> saved_groups + [[1, 2], [11, 12], [21, 22]] + """ for k, g in groupby( enumerate(iterable), key=lambda x: x[0] - ordering(x[1]) @@ -1747,48 +2582,52 @@ def consecutive_groups(iterable, ordering=lambda x: x): yield map(itemgetter(1), g) -def difference(iterable, func=sub): - """By default, compute the first difference of *iterable* using - :func:`operator.sub`. +def difference(iterable, func=sub, *, initial=None): + """This function is the inverse of :func:`itertools.accumulate`. By default + it will compute the first difference of *iterable* using + :func:`operator.sub`: - >>> iterable = [0, 1, 3, 6, 10] + >>> from itertools import accumulate + >>> iterable = accumulate([0, 1, 2, 3, 4]) # produces 0, 1, 3, 6, 10 >>> list(difference(iterable)) [0, 1, 2, 3, 4] - This is the opposite of :func:`accumulate`'s default behavior: - - >>> from more_itertools import accumulate - >>> iterable = [0, 1, 2, 3, 4] - >>> list(accumulate(iterable)) - [0, 1, 3, 6, 10] - >>> list(difference(accumulate(iterable))) - [0, 1, 2, 3, 4] - - By default *func* is :func:`operator.sub`, but other functions can be + *func* defaults to :func:`operator.sub`, but other functions can be specified. They will be applied as follows:: A, B, C, D, ... --> A, func(B, A), func(C, B), func(D, C), ... For example, to do progressive division: - >>> iterable = [1, 2, 6, 24, 120] # Factorial sequence + >>> iterable = [1, 2, 6, 24, 120] >>> func = lambda x, y: x // y >>> list(difference(iterable, func)) [1, 2, 3, 4, 5] + If the *initial* keyword is set, the first element will be skipped when + computing successive differences. + + >>> it = [10, 11, 13, 16] # from accumulate([1, 2, 3], initial=10) + >>> list(difference(it, initial=10)) + [1, 2, 3] + """ a, b = tee(iterable) try: - item = next(b) + first = [next(b)] except StopIteration: return iter([]) - return chain([item], map(lambda x: func(x[1], x[0]), zip(a, b))) + + if initial is not None: + first = [] + + return chain(first, map(func, b, a)) class SequenceView(Sequence): """Return a read-only view of the sequence object *target*. - :class:`SequenceView` objects are analagous to Python's built-in + :class:`SequenceView` objects are analogous to Python's built-in "dictionary view" types. They provide a dynamic view of a sequence's items, meaning that when the sequence updates, so does the view. @@ -1814,6 +2653,7 @@ class SequenceView(Sequence): require (much) extra storage. """ + def __init__(self, target): if not isinstance(target, Sequence): raise TypeError @@ -1829,7 +2669,7 @@ class SequenceView(Sequence): return '{}({})'.format(self.__class__.__name__, repr(self._target)) -class seekable(object): +class seekable: """Wrap an iterator to allow for seeking backward and forward. This progressively caches the items in the source iterable so they can be re-visited. @@ -1862,8 +2702,26 @@ class seekable(object): >>> next(it), next(it), next(it) ('0', '1', '2') - The cache grows as the source iterable progresses, so beware of wrapping - very large or infinite iterables. + Call :meth:`peek` to look ahead one item without advancing the iterator: + + >>> it = seekable('1234') + >>> it.peek() + '1' + >>> list(it) + ['1', '2', '3', '4'] + >>> it.peek(default='empty') + 'empty' + + Before the iterator is at its end, calling :func:`bool` on it will return + ``True``. After it will return ``False``: + + >>> it = seekable('5678') + >>> bool(it) + True + >>> list(it) + ['5', '6', '7', '8'] + >>> bool(it) + False You may view the contents of the cache with the :meth:`elements` method. That returns a :class:`SequenceView`, a view that updates automatically: @@ -1879,11 +2737,30 @@ class seekable(object): >>> elements SequenceView(['0', '1', '2', '3']) + By default, the cache grows as the source iterable progresses, so beware of + wrapping very large or infinite iterables. Supply *maxlen* to limit the + size of the cache (this of course limits how far back you can seek). + + >>> from itertools import count + >>> it = seekable((str(n) for n in count()), maxlen=2) + >>> next(it), next(it), next(it), next(it) + ('0', '1', '2', '3') + >>> list(it.elements()) + ['2', '3'] + >>> it.seek(0) + >>> next(it), next(it), next(it), next(it) + ('2', '3', '4', '5') + >>> next(it) + '6' + """ - def __init__(self, iterable): + def __init__(self, iterable, maxlen=None): self._source = iter(iterable) - self._cache = [] + if maxlen is None: + self._cache = [] + else: + self._cache = deque([], maxlen) self._index = None def __iter__(self): @@ -1903,7 +2780,24 @@ class seekable(object): self._cache.append(item) return item - next = __next__ + def __bool__(self): + try: + self.peek() + except StopIteration: + return False + return True + + def peek(self, default=_marker): + try: + peeked = next(self) + except StopIteration: + if default is _marker: + raise + return default + if self._index is None: + self._index = len(self._cache) + self._index -= 1 + return peeked def elements(self): return SequenceView(self._cache) @@ -1915,7 +2809,7 @@ class seekable(object): consume(self, remainder) -class run_length(object): +class run_length: """ :func:`run_length.encode` compresses an iterable with run-length encoding. It yields groups of repeated items with the count of how many times they @@ -1965,8 +2859,8 @@ def exactly_n(iterable, n, predicate=bool): def circular_shifts(iterable): """Return a list of circular shifts of *iterable*. - >>> circular_shifts(range(4)) - [(0, 1, 2, 3), (1, 2, 3, 0), (2, 3, 0, 1), (3, 0, 1, 2)] + >>> circular_shifts(range(4)) + [(0, 1, 2, 3), (1, 2, 3, 0), (2, 3, 0, 1), (3, 0, 1, 2)] """ lst = list(iterable) return take(len(lst), windowed(cycle(lst), len(lst))) @@ -2140,9 +3034,7 @@ def rlocate(iterable, pred=bool, window_size=None): if window_size is None: try: len_iter = len(iterable) - return ( - len_iter - i - 1 for i in locate(reversed(iterable), pred) - ) + return (len_iter - i - 1 for i in locate(reversed(iterable), pred)) except TypeError: pass @@ -2200,8 +3092,7 @@ def replace(iterable, pred, substitutes, count=None, window_size=1): if pred(*w): if (count is None) or (n < count): n += 1 - for s in substitutes: - yield s + yield from substitutes consume(windows, window_size - 1) continue @@ -2209,3 +3100,1248 @@ def replace(iterable, pred, substitutes, count=None, window_size=1): # yield the first item from the window. if w and (w[0] is not _marker): yield w[0] + + +def partitions(iterable): + """Yield all possible order-preserving partitions of *iterable*. + + >>> iterable = 'abc' + >>> for part in partitions(iterable): + ... print([''.join(p) for p in part]) + ['abc'] + ['a', 'bc'] + ['ab', 'c'] + ['a', 'b', 'c'] + + This is unrelated to :func:`partition`. + + """ + sequence = list(iterable) + n = len(sequence) + for i in powerset(range(1, n)): + yield [sequence[i:j] for i, j in zip((0,) + i, i + (n,))] + + +def set_partitions(iterable, k=None): + """ + Yield the set partitions of *iterable* into *k* parts. Set partitions are + not order-preserving. + + >>> iterable = 'abc' + >>> for part in set_partitions(iterable, 2): + ... print([''.join(p) for p in part]) + ['a', 'bc'] + ['ab', 'c'] + ['b', 'ac'] + + + If *k* is not given, every set partition is generated. + + >>> iterable = 'abc' + >>> for part in set_partitions(iterable): + ... print([''.join(p) for p in part]) + ['abc'] + ['a', 'bc'] + ['ab', 'c'] + ['b', 'ac'] + ['a', 'b', 'c'] + + """ + L = list(iterable) + n = len(L) + if k is not None: + if k < 1: + raise ValueError( + "Can't partition in a negative or zero number of groups" + ) + elif k > n: + return + + def set_partitions_helper(L, k): + n = len(L) + if k == 1: + yield [L] + elif n == k: + yield [[s] for s in L] + else: + e, *M = L + for p in set_partitions_helper(M, k - 1): + yield [[e], *p] + for p in set_partitions_helper(M, k): + for i in range(len(p)): + yield p[:i] + [[e] + p[i]] + p[i + 1 :] + + if k is None: + for k in range(1, n + 1): + yield from set_partitions_helper(L, k) + else: + yield from set_partitions_helper(L, k) + + +class time_limited: + """ + Yield items from *iterable* until *limit_seconds* have passed. + If the time limit expires before all items have been yielded, the + ``timed_out`` parameter will be set to ``True``. + + >>> from time import sleep + >>> def generator(): + ... yield 1 + ... yield 2 + ... sleep(0.2) + ... yield 3 + >>> iterable = time_limited(0.1, generator()) + >>> list(iterable) + [1, 2] + >>> iterable.timed_out + True + + Note that the time is checked before each item is yielded, and iteration + stops if the time elapsed is greater than *limit_seconds*. If your time + limit is 1 second, but it takes 2 seconds to generate the first item from + the iterable, the function will run for 2 seconds and not yield anything. + + """ + + def __init__(self, limit_seconds, iterable): + if limit_seconds < 0: + raise ValueError('limit_seconds must be positive') + self.limit_seconds = limit_seconds + self._iterable = iter(iterable) + self._start_time = monotonic() + self.timed_out = False + + def __iter__(self): + return self + + def __next__(self): + item = next(self._iterable) + if monotonic() - self._start_time > self.limit_seconds: + self.timed_out = True + raise StopIteration + + return item + + +def only(iterable, default=None, too_long=None): + """If *iterable* has only one item, return it. + If it has zero items, return *default*. + If it has more than one item, raise the exception given by *too_long*, + which is ``ValueError`` by default. + + >>> only([], default='missing') + 'missing' + >>> only([1]) + 1 + >>> only([1, 2]) # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + ValueError: Expected exactly one item in iterable, but got 1, 2, + and perhaps more.' + >>> only([1, 2], too_long=TypeError) # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + TypeError + + Note that :func:`only` attempts to advance *iterable* twice to ensure there + is only one item. See :func:`spy` or :func:`peekable` to check + iterable contents less destructively. + """ + it = iter(iterable) + first_value = next(it, default) + + try: + second_value = next(it) + except StopIteration: + pass + else: + msg = ( + 'Expected exactly one item in iterable, but got {!r}, {!r}, ' + 'and perhaps more.'.format(first_value, second_value) + ) + raise too_long or ValueError(msg) + + return first_value + + +class _IChunk: + def __init__(self, iterable, n): + self._it = islice(iterable, n) + self._cache = deque() + + def fill_cache(self): + self._cache.extend(self._it) + + def __iter__(self): + return self + + def __next__(self): + try: + return next(self._it) + except StopIteration: + if self._cache: + return self._cache.popleft() + else: + raise + + +def ichunked(iterable, n): + """Break *iterable* into sub-iterables with *n* elements each. + :func:`ichunked` is like :func:`chunked`, but it yields iterables + instead of lists. + + If the sub-iterables are read in order, the elements of *iterable* + won't be stored in memory. + If they are read out of order, :func:`itertools.tee` is used to cache + elements as necessary. + + >>> from itertools import count + >>> all_chunks = ichunked(count(), 4) + >>> c_1, c_2, c_3 = next(all_chunks), next(all_chunks), next(all_chunks) + >>> list(c_2) # c_1's elements have been cached; c_3's haven't been + [4, 5, 6, 7] + >>> list(c_1) + [0, 1, 2, 3] + >>> list(c_3) + [8, 9, 10, 11] + + """ + source = peekable(iter(iterable)) + ichunk_marker = object() + while True: + # Check to see whether we're at the end of the source iterable + item = source.peek(ichunk_marker) + if item is ichunk_marker: + return + + chunk = _IChunk(source, n) + yield chunk + + # Advance the source iterable and fill previous chunk's cache + chunk.fill_cache() + + +def iequals(*iterables): + """Return ``True`` if all given *iterables* are equal to each other, + which means that they contain the same elements in the same order. + + The function is useful for comparing iterables of different data types + or iterables that do not support equality checks. + + >>> iequals("abc", ['a', 'b', 'c'], ('a', 'b', 'c'), iter("abc")) + True + + >>> iequals("abc", "acb") + False + + Not to be confused with :func:`all_equals`, which checks whether all + elements of iterable are equal to each other. + + """ + return all(map(all_equal, zip_longest(*iterables, fillvalue=object()))) + + +def distinct_combinations(iterable, r): + """Yield the distinct combinations of *r* items taken from *iterable*. + + >>> list(distinct_combinations([0, 0, 1], 2)) + [(0, 0), (0, 1)] + + Equivalent to ``set(combinations(iterable))``, except duplicates are not + generated and thrown away. For larger input sequences this is much more + efficient. + + """ + if r < 0: + raise ValueError('r must be non-negative') + elif r == 0: + yield () + return + pool = tuple(iterable) + generators = [unique_everseen(enumerate(pool), key=itemgetter(1))] + current_combo = [None] * r + level = 0 + while generators: + try: + cur_idx, p = next(generators[-1]) + except StopIteration: + generators.pop() + level -= 1 + continue + current_combo[level] = p + if level + 1 == r: + yield tuple(current_combo) + else: + generators.append( + unique_everseen( + enumerate(pool[cur_idx + 1 :], cur_idx + 1), + key=itemgetter(1), + ) + ) + level += 1 + + +def filter_except(validator, iterable, *exceptions): + """Yield the items from *iterable* for which the *validator* function does + not raise one of the specified *exceptions*. + + *validator* is called for each item in *iterable*. + It should be a function that accepts one argument and raises an exception + if that item is not valid. + + >>> iterable = ['1', '2', 'three', '4', None] + >>> list(filter_except(int, iterable, ValueError, TypeError)) + ['1', '2', '4'] + + If an exception other than one given by *exceptions* is raised by + *validator*, it is raised like normal. + """ + for item in iterable: + try: + validator(item) + except exceptions: + pass + else: + yield item + + +def map_except(function, iterable, *exceptions): + """Transform each item from *iterable* with *function* and yield the + result, unless *function* raises one of the specified *exceptions*. + + *function* is called to transform each item in *iterable*. + It should accept one argument. + + >>> iterable = ['1', '2', 'three', '4', None] + >>> list(map_except(int, iterable, ValueError, TypeError)) + [1, 2, 4] + + If an exception other than one given by *exceptions* is raised by + *function*, it is raised like normal. + """ + for item in iterable: + try: + yield function(item) + except exceptions: + pass + + +def map_if(iterable, pred, func, func_else=lambda x: x): + """Evaluate each item from *iterable* using *pred*. If the result is + equivalent to ``True``, transform the item with *func* and yield it. + Otherwise, transform the item with *func_else* and yield it. + + *pred*, *func*, and *func_else* should each be functions that accept + one argument. By default, *func_else* is the identity function. + + >>> from math import sqrt + >>> iterable = list(range(-5, 5)) + >>> iterable + [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4] + >>> list(map_if(iterable, lambda x: x > 3, lambda x: 'toobig')) + [-5, -4, -3, -2, -1, 0, 1, 2, 3, 'toobig'] + >>> list(map_if(iterable, lambda x: x >= 0, + ... lambda x: f'{sqrt(x):.2f}', lambda x: None)) + [None, None, None, None, None, '0.00', '1.00', '1.41', '1.73', '2.00'] + """ + for item in iterable: + yield func(item) if pred(item) else func_else(item) + + +def _sample_unweighted(iterable, k): + # Implementation of "Algorithm L" from the 1994 paper by Kim-Hung Li: + # "Reservoir-Sampling Algorithms of Time Complexity O(n(1+log(N/n)))". + + # Fill up the reservoir (collection of samples) with the first `k` samples + reservoir = take(k, iterable) + + # Generate random number that's the largest in a sample of k U(0,1) numbers + # Largest order statistic: https://en.wikipedia.org/wiki/Order_statistic + W = exp(log(random()) / k) + + # The number of elements to skip before changing the reservoir is a random + # number with a geometric distribution. Sample it using random() and logs. + next_index = k + floor(log(random()) / log(1 - W)) + + for index, element in enumerate(iterable, k): + + if index == next_index: + reservoir[randrange(k)] = element + # The new W is the largest in a sample of k U(0, `old_W`) numbers + W *= exp(log(random()) / k) + next_index += floor(log(random()) / log(1 - W)) + 1 + + return reservoir + + +def _sample_weighted(iterable, k, weights): + # Implementation of "A-ExpJ" from the 2006 paper by Efraimidis et al. : + # "Weighted random sampling with a reservoir". + + # Log-transform for numerical stability for weights that are small/large + weight_keys = (log(random()) / weight for weight in weights) + + # Fill up the reservoir (collection of samples) with the first `k` + # weight-keys and elements, then heapify the list. + reservoir = take(k, zip(weight_keys, iterable)) + heapify(reservoir) + + # The number of jumps before changing the reservoir is a random variable + # with an exponential distribution. Sample it using random() and logs. + smallest_weight_key, _ = reservoir[0] + weights_to_skip = log(random()) / smallest_weight_key + + for weight, element in zip(weights, iterable): + if weight >= weights_to_skip: + # The notation here is consistent with the paper, but we store + # the weight-keys in log-space for better numerical stability. + smallest_weight_key, _ = reservoir[0] + t_w = exp(weight * smallest_weight_key) + r_2 = uniform(t_w, 1) # generate U(t_w, 1) + weight_key = log(r_2) / weight + heapreplace(reservoir, (weight_key, element)) + smallest_weight_key, _ = reservoir[0] + weights_to_skip = log(random()) / smallest_weight_key + else: + weights_to_skip -= weight + + # Equivalent to [element for weight_key, element in sorted(reservoir)] + return [heappop(reservoir)[1] for _ in range(k)] + + +def sample(iterable, k, weights=None): + """Return a *k*-length list of elements chosen (without replacement) + from the *iterable*. Like :func:`random.sample`, but works on iterables + of unknown length. + + >>> iterable = range(100) + >>> sample(iterable, 5) # doctest: +SKIP + [81, 60, 96, 16, 4] + + An iterable with *weights* may also be given: + + >>> iterable = range(100) + >>> weights = (i * i + 1 for i in range(100)) + >>> sampled = sample(iterable, 5, weights=weights) # doctest: +SKIP + [79, 67, 74, 66, 78] + + The algorithm can also be used to generate weighted random permutations. + The relative weight of each item determines the probability that it + appears late in the permutation. + + >>> data = "abcdefgh" + >>> weights = range(1, len(data) + 1) + >>> sample(data, k=len(data), weights=weights) # doctest: +SKIP + ['c', 'a', 'b', 'e', 'g', 'd', 'h', 'f'] + """ + if k == 0: + return [] + + iterable = iter(iterable) + if weights is None: + return _sample_unweighted(iterable, k) + else: + weights = iter(weights) + return _sample_weighted(iterable, k, weights) + + +def is_sorted(iterable, key=None, reverse=False, strict=False): + """Returns ``True`` if the items of iterable are in sorted order, and + ``False`` otherwise. *key* and *reverse* have the same meaning that they do + in the built-in :func:`sorted` function. + + >>> is_sorted(['1', '2', '3', '4', '5'], key=int) + True + >>> is_sorted([5, 4, 3, 1, 2], reverse=True) + False + + If *strict*, tests for strict sorting, that is, returns ``False`` if equal + elements are found: + + >>> is_sorted([1, 2, 2]) + True + >>> is_sorted([1, 2, 2], strict=True) + False + + The function returns ``False`` after encountering the first out-of-order + item. If there are no out-of-order items, the iterable is exhausted. + """ + + compare = (le if reverse else ge) if strict else (lt if reverse else gt) + it = iterable if key is None else map(key, iterable) + return not any(starmap(compare, pairwise(it))) + + +class AbortThread(BaseException): + pass + + +class callback_iter: + """Convert a function that uses callbacks to an iterator. + + Let *func* be a function that takes a `callback` keyword argument. + For example: + + >>> def func(callback=None): + ... for i, c in [(1, 'a'), (2, 'b'), (3, 'c')]: + ... if callback: + ... callback(i, c) + ... return 4 + + + Use ``with callback_iter(func)`` to get an iterator over the parameters + that are delivered to the callback. + + >>> with callback_iter(func) as it: + ... for args, kwargs in it: + ... print(args) + (1, 'a') + (2, 'b') + (3, 'c') + + The function will be called in a background thread. The ``done`` property + indicates whether it has completed execution. + + >>> it.done + True + + If it completes successfully, its return value will be available + in the ``result`` property. + + >>> it.result + 4 + + Notes: + + * If the function uses some keyword argument besides ``callback``, supply + *callback_kwd*. + * If it finished executing, but raised an exception, accessing the + ``result`` property will raise the same exception. + * If it hasn't finished executing, accessing the ``result`` + property from within the ``with`` block will raise ``RuntimeError``. + * If it hasn't finished executing, accessing the ``result`` property from + outside the ``with`` block will raise a + ``more_itertools.AbortThread`` exception. + * Provide *wait_seconds* to adjust how frequently the it is polled for + output. + + """ + + def __init__(self, func, callback_kwd='callback', wait_seconds=0.1): + self._func = func + self._callback_kwd = callback_kwd + self._aborted = False + self._future = None + self._wait_seconds = wait_seconds + # Lazily import concurrent.future + self._executor = __import__( + 'concurrent.futures' + ).futures.ThreadPoolExecutor(max_workers=1) + self._iterator = self._reader() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self._aborted = True + self._executor.shutdown() + + def __iter__(self): + return self + + def __next__(self): + return next(self._iterator) + + @property + def done(self): + if self._future is None: + return False + return self._future.done() + + @property + def result(self): + if not self.done: + raise RuntimeError('Function has not yet completed') + + return self._future.result() + + def _reader(self): + q = Queue() + + def callback(*args, **kwargs): + if self._aborted: + raise AbortThread('canceled by user') + + q.put((args, kwargs)) + + self._future = self._executor.submit( + self._func, **{self._callback_kwd: callback} + ) + + while True: + try: + item = q.get(timeout=self._wait_seconds) + except Empty: + pass + else: + q.task_done() + yield item + + if self._future.done(): + break + + remaining = [] + while True: + try: + item = q.get_nowait() + except Empty: + break + else: + q.task_done() + remaining.append(item) + q.join() + yield from remaining + + +def windowed_complete(iterable, n): + """ + Yield ``(beginning, middle, end)`` tuples, where: + + * Each ``middle`` has *n* items from *iterable* + * Each ``beginning`` has the items before the ones in ``middle`` + * Each ``end`` has the items after the ones in ``middle`` + + >>> iterable = range(7) + >>> n = 3 + >>> for beginning, middle, end in windowed_complete(iterable, n): + ... print(beginning, middle, end) + () (0, 1, 2) (3, 4, 5, 6) + (0,) (1, 2, 3) (4, 5, 6) + (0, 1) (2, 3, 4) (5, 6) + (0, 1, 2) (3, 4, 5) (6,) + (0, 1, 2, 3) (4, 5, 6) () + + Note that *n* must be at least 0 and most equal to the length of + *iterable*. + + This function will exhaust the iterable and may require significant + storage. + """ + if n < 0: + raise ValueError('n must be >= 0') + + seq = tuple(iterable) + size = len(seq) + + if n > size: + raise ValueError('n must be <= len(seq)') + + for i in range(size - n + 1): + beginning = seq[:i] + middle = seq[i : i + n] + end = seq[i + n :] + yield beginning, middle, end + + +def all_unique(iterable, key=None): + """ + Returns ``True`` if all the elements of *iterable* are unique (no two + elements are equal). + + >>> all_unique('ABCB') + False + + If a *key* function is specified, it will be used to make comparisons. + + >>> all_unique('ABCb') + True + >>> all_unique('ABCb', str.lower) + False + + The function returns as soon as the first non-unique element is + encountered. Iterables with a mix of hashable and unhashable items can + be used, but the function will be slower for unhashable items. + """ + seenset = set() + seenset_add = seenset.add + seenlist = [] + seenlist_add = seenlist.append + for element in map(key, iterable) if key else iterable: + try: + if element in seenset: + return False + seenset_add(element) + except TypeError: + if element in seenlist: + return False + seenlist_add(element) + return True + + +def nth_product(index, *args): + """Equivalent to ``list(product(*args))[index]``. + + The products of *args* can be ordered lexicographically. + :func:`nth_product` computes the product at sort position *index* without + computing the previous products. + + >>> nth_product(8, range(2), range(2), range(2), range(2)) + (1, 0, 0, 0) + + ``IndexError`` will be raised if the given *index* is invalid. + """ + pools = list(map(tuple, reversed(args))) + ns = list(map(len, pools)) + + c = reduce(mul, ns) + + if index < 0: + index += c + + if not 0 <= index < c: + raise IndexError + + result = [] + for pool, n in zip(pools, ns): + result.append(pool[index % n]) + index //= n + + return tuple(reversed(result)) + + +def nth_permutation(iterable, r, index): + """Equivalent to ``list(permutations(iterable, r))[index]``` + + The subsequences of *iterable* that are of length *r* where order is + important can be ordered lexicographically. :func:`nth_permutation` + computes the subsequence at sort position *index* directly, without + computing the previous subsequences. + + >>> nth_permutation('ghijk', 2, 5) + ('h', 'i') + + ``ValueError`` will be raised If *r* is negative or greater than the length + of *iterable*. + ``IndexError`` will be raised if the given *index* is invalid. + """ + pool = list(iterable) + n = len(pool) + + if r is None or r == n: + r, c = n, factorial(n) + elif not 0 <= r < n: + raise ValueError + else: + c = factorial(n) // factorial(n - r) + + if index < 0: + index += c + + if not 0 <= index < c: + raise IndexError + + if c == 0: + return tuple() + + result = [0] * r + q = index * factorial(n) // c if r < n else index + for d in range(1, n + 1): + q, i = divmod(q, d) + if 0 <= n - d < r: + result[n - d] = i + if q == 0: + break + + return tuple(map(pool.pop, result)) + + +def value_chain(*args): + """Yield all arguments passed to the function in the same order in which + they were passed. If an argument itself is iterable then iterate over its + values. + + >>> list(value_chain(1, 2, 3, [4, 5, 6])) + [1, 2, 3, 4, 5, 6] + + Binary and text strings are not considered iterable and are emitted + as-is: + + >>> list(value_chain('12', '34', ['56', '78'])) + ['12', '34', '56', '78'] + + + Multiple levels of nesting are not flattened. + + """ + for value in args: + if isinstance(value, (str, bytes)): + yield value + continue + try: + yield from value + except TypeError: + yield value + + +def product_index(element, *args): + """Equivalent to ``list(product(*args)).index(element)`` + + The products of *args* can be ordered lexicographically. + :func:`product_index` computes the first index of *element* without + computing the previous products. + + >>> product_index([8, 2], range(10), range(5)) + 42 + + ``ValueError`` will be raised if the given *element* isn't in the product + of *args*. + """ + index = 0 + + for x, pool in zip_longest(element, args, fillvalue=_marker): + if x is _marker or pool is _marker: + raise ValueError('element is not a product of args') + + pool = tuple(pool) + index = index * len(pool) + pool.index(x) + + return index + + +def combination_index(element, iterable): + """Equivalent to ``list(combinations(iterable, r)).index(element)`` + + The subsequences of *iterable* that are of length *r* can be ordered + lexicographically. :func:`combination_index` computes the index of the + first *element*, without computing the previous combinations. + + >>> combination_index('adf', 'abcdefg') + 10 + + ``ValueError`` will be raised if the given *element* isn't one of the + combinations of *iterable*. + """ + element = enumerate(element) + k, y = next(element, (None, None)) + if k is None: + return 0 + + indexes = [] + pool = enumerate(iterable) + for n, x in pool: + if x == y: + indexes.append(n) + tmp, y = next(element, (None, None)) + if tmp is None: + break + else: + k = tmp + else: + raise ValueError('element is not a combination of iterable') + + n, _ = last(pool, default=(n, None)) + + # Python versions below 3.8 don't have math.comb + index = 1 + for i, j in enumerate(reversed(indexes), start=1): + j = n - j + if i <= j: + index += factorial(j) // (factorial(i) * factorial(j - i)) + + return factorial(n + 1) // (factorial(k + 1) * factorial(n - k)) - index + + +def permutation_index(element, iterable): + """Equivalent to ``list(permutations(iterable, r)).index(element)``` + + The subsequences of *iterable* that are of length *r* where order is + important can be ordered lexicographically. :func:`permutation_index` + computes the index of the first *element* directly, without computing + the previous permutations. + + >>> permutation_index([1, 3, 2], range(5)) + 19 + + ``ValueError`` will be raised if the given *element* isn't one of the + permutations of *iterable*. + """ + index = 0 + pool = list(iterable) + for i, x in zip(range(len(pool), -1, -1), element): + r = pool.index(x) + index = index * i + r + del pool[r] + + return index + + +class countable: + """Wrap *iterable* and keep a count of how many items have been consumed. + + The ``items_seen`` attribute starts at ``0`` and increments as the iterable + is consumed: + + >>> iterable = map(str, range(10)) + >>> it = countable(iterable) + >>> it.items_seen + 0 + >>> next(it), next(it) + ('0', '1') + >>> list(it) + ['2', '3', '4', '5', '6', '7', '8', '9'] + >>> it.items_seen + 10 + """ + + def __init__(self, iterable): + self._it = iter(iterable) + self.items_seen = 0 + + def __iter__(self): + return self + + def __next__(self): + item = next(self._it) + self.items_seen += 1 + + return item + + +def chunked_even(iterable, n): + """Break *iterable* into lists of approximately length *n*. + Items are distributed such the lengths of the lists differ by at most + 1 item. + + >>> iterable = [1, 2, 3, 4, 5, 6, 7] + >>> n = 3 + >>> list(chunked_even(iterable, n)) # List lengths: 3, 2, 2 + [[1, 2, 3], [4, 5], [6, 7]] + >>> list(chunked(iterable, n)) # List lengths: 3, 3, 1 + [[1, 2, 3], [4, 5, 6], [7]] + + """ + + len_method = getattr(iterable, '__len__', None) + + if len_method is None: + return _chunked_even_online(iterable, n) + else: + return _chunked_even_finite(iterable, len_method(), n) + + +def _chunked_even_online(iterable, n): + buffer = [] + maxbuf = n + (n - 2) * (n - 1) + for x in iterable: + buffer.append(x) + if len(buffer) == maxbuf: + yield buffer[:n] + buffer = buffer[n:] + yield from _chunked_even_finite(buffer, len(buffer), n) + + +def _chunked_even_finite(iterable, N, n): + if N < 1: + return + + # Lists are either size `full_size <= n` or `partial_size = full_size - 1` + q, r = divmod(N, n) + num_lists = q + (1 if r > 0 else 0) + q, r = divmod(N, num_lists) + full_size = q + (1 if r > 0 else 0) + partial_size = full_size - 1 + num_full = N - partial_size * num_lists + num_partial = num_lists - num_full + + buffer = [] + iterator = iter(iterable) + + # Yield num_full lists of full_size + for x in iterator: + buffer.append(x) + if len(buffer) == full_size: + yield buffer + buffer = [] + num_full -= 1 + if num_full <= 0: + break + + # Yield num_partial lists of partial_size + for x in iterator: + buffer.append(x) + if len(buffer) == partial_size: + yield buffer + buffer = [] + num_partial -= 1 + + +def zip_broadcast(*objects, scalar_types=(str, bytes), strict=False): + """A version of :func:`zip` that "broadcasts" any scalar + (i.e., non-iterable) items into output tuples. + + >>> iterable_1 = [1, 2, 3] + >>> iterable_2 = ['a', 'b', 'c'] + >>> scalar = '_' + >>> list(zip_broadcast(iterable_1, iterable_2, scalar)) + [(1, 'a', '_'), (2, 'b', '_'), (3, 'c', '_')] + + The *scalar_types* keyword argument determines what types are considered + scalar. It is set to ``(str, bytes)`` by default. Set it to ``None`` to + treat strings and byte strings as iterable: + + >>> list(zip_broadcast('abc', 0, 'xyz', scalar_types=None)) + [('a', 0, 'x'), ('b', 0, 'y'), ('c', 0, 'z')] + + If the *strict* keyword argument is ``True``, then + ``UnequalIterablesError`` will be raised if any of the iterables have + different lengths. + """ + + def is_scalar(obj): + if scalar_types and isinstance(obj, scalar_types): + return True + try: + iter(obj) + except TypeError: + return True + else: + return False + + size = len(objects) + if not size: + return + + iterables, iterable_positions = [], [] + scalars, scalar_positions = [], [] + for i, obj in enumerate(objects): + if is_scalar(obj): + scalars.append(obj) + scalar_positions.append(i) + else: + iterables.append(iter(obj)) + iterable_positions.append(i) + + if len(scalars) == size: + yield tuple(objects) + return + + zipper = _zip_equal if strict else zip + for item in zipper(*iterables): + new_item = [None] * size + + for i, elem in zip(iterable_positions, item): + new_item[i] = elem + + for i, elem in zip(scalar_positions, scalars): + new_item[i] = elem + + yield tuple(new_item) + + +def unique_in_window(iterable, n, key=None): + """Yield the items from *iterable* that haven't been seen recently. + *n* is the size of the lookback window. + + >>> iterable = [0, 1, 0, 2, 3, 0] + >>> n = 3 + >>> list(unique_in_window(iterable, n)) + [0, 1, 2, 3, 0] + + The *key* function, if provided, will be used to determine uniqueness: + + >>> list(unique_in_window('abAcda', 3, key=lambda x: x.lower())) + ['a', 'b', 'c', 'd', 'a'] + + The items in *iterable* must be hashable. + + """ + if n <= 0: + raise ValueError('n must be greater than 0') + + window = deque(maxlen=n) + uniques = set() + use_key = key is not None + + for item in iterable: + k = key(item) if use_key else item + if k in uniques: + continue + + if len(uniques) == n: + uniques.discard(window[0]) + + uniques.add(k) + window.append(k) + + yield item + + +def duplicates_everseen(iterable, key=None): + """Yield duplicate elements after their first appearance. + + >>> list(duplicates_everseen('mississippi')) + ['s', 'i', 's', 's', 'i', 'p', 'i'] + >>> list(duplicates_everseen('AaaBbbCccAaa', str.lower)) + ['a', 'a', 'b', 'b', 'c', 'c', 'A', 'a', 'a'] + + This function is analagous to :func:`unique_everseen` and is subject to + the same performance considerations. + + """ + seen_set = set() + seen_list = [] + use_key = key is not None + + for element in iterable: + k = key(element) if use_key else element + try: + if k not in seen_set: + seen_set.add(k) + else: + yield element + except TypeError: + if k not in seen_list: + seen_list.append(k) + else: + yield element + + +def duplicates_justseen(iterable, key=None): + """Yields serially-duplicate elements after their first appearance. + + >>> list(duplicates_justseen('mississippi')) + ['s', 's', 'p'] + >>> list(duplicates_justseen('AaaBbbCccAaa', str.lower)) + ['a', 'a', 'b', 'b', 'c', 'c', 'a', 'a'] + + This function is analagous to :func:`unique_justseen`. + + """ + return flatten( + map( + lambda group_tuple: islice_extended(group_tuple[1])[1:], + groupby(iterable, key), + ) + ) + + +def minmax(iterable_or_value, *others, key=None, default=_marker): + """Returns both the smallest and largest items in an iterable + or the largest of two or more arguments. + + >>> minmax([3, 1, 5]) + (1, 5) + + >>> minmax(4, 2, 6) + (2, 6) + + If a *key* function is provided, it will be used to transform the input + items for comparison. + + >>> minmax([5, 30], key=str) # '30' sorts before '5' + (30, 5) + + If a *default* value is provided, it will be returned if there are no + input items. + + >>> minmax([], default=(0, 0)) + (0, 0) + + Otherwise ``ValueError`` is raised. + + This function is based on the + `recipe `__ by + Raymond Hettinger and takes care to minimize the number of comparisons + performed. + """ + iterable = (iterable_or_value, *others) if others else iterable_or_value + + it = iter(iterable) + + try: + lo = hi = next(it) + except StopIteration as e: + if default is _marker: + raise ValueError( + '`minmax()` argument is an empty iterable. ' + 'Provide a `default` value to suppress this error.' + ) from e + return default + + # Different branches depending on the presence of key. This saves a lot + # of unimportant copies which would slow the "key=None" branch + # significantly down. + if key is None: + for x, y in zip_longest(it, it, fillvalue=lo): + if y < x: + x, y = y, x + if x < lo: + lo = x + if hi < y: + hi = y + + else: + lo_key = hi_key = key(lo) + + for x, y in zip_longest(it, it, fillvalue=lo): + + x_key, y_key = key(x), key(y) + + if y_key < x_key: + x, y, x_key, y_key = y, x, y_key, x_key + if x_key < lo_key: + lo, lo_key = x, x_key + if hi_key < y_key: + hi, hi_key = y, y_key + + return lo, hi + + +def constrained_batches( + iterable, max_size, max_count=None, get_len=len, strict=True +): + """Yield batches of items from *iterable* with a combined size limited by + *max_size*. + + >>> iterable = [b'12345', b'123', b'12345678', b'1', b'1', b'12', b'1'] + >>> list(constrained_batches(iterable, 10)) + [(b'12345', b'123'), (b'12345678', b'1', b'1'), (b'12', b'1')] + + If a *max_count* is supplied, the number of items per batch is also + limited: + + >>> iterable = [b'12345', b'123', b'12345678', b'1', b'1', b'12', b'1'] + >>> list(constrained_batches(iterable, 10, max_count = 2)) + [(b'12345', b'123'), (b'12345678', b'1'), (b'1', b'12'), (b'1',)] + + If a *get_len* function is supplied, use that instead of :func:`len` to + determine item size. + + If *strict* is ``True``, raise ``ValueError`` if any single item is bigger + than *max_size*. Otherwise, allow single items to exceed *max_size*. + """ + if max_size <= 0: + raise ValueError('maximum size must be greater than zero') + + batch = [] + batch_size = 0 + batch_count = 0 + for item in iterable: + item_len = get_len(item) + if strict and item_len > max_size: + raise ValueError('item size exceeds maximum size') + + reached_count = batch_count == max_count + reached_size = item_len + batch_size > max_size + if batch_count and (reached_size or reached_count): + yield tuple(batch) + batch.clear() + batch_size = 0 + batch_count = 0 + + batch.append(item) + batch_size += item_len + batch_count += 1 + + if batch: + yield tuple(batch) diff --git a/libs/win/more_itertools/more.pyi b/libs/win/more_itertools/more.pyi new file mode 100644 index 00000000..1413fae7 --- /dev/null +++ b/libs/win/more_itertools/more.pyi @@ -0,0 +1,674 @@ +"""Stubs for more_itertools.more""" + +from typing import ( + Any, + Callable, + Container, + Dict, + Generic, + Hashable, + Iterable, + Iterator, + List, + Optional, + Reversible, + Sequence, + Sized, + Tuple, + Union, + TypeVar, + type_check_only, +) +from types import TracebackType +from typing_extensions import ContextManager, Protocol, Type, overload + +# Type and type variable definitions +_T = TypeVar('_T') +_T1 = TypeVar('_T1') +_T2 = TypeVar('_T2') +_U = TypeVar('_U') +_V = TypeVar('_V') +_W = TypeVar('_W') +_T_co = TypeVar('_T_co', covariant=True) +_GenFn = TypeVar('_GenFn', bound=Callable[..., Iterator[object]]) +_Raisable = Union[BaseException, 'Type[BaseException]'] + +@type_check_only +class _SizedIterable(Protocol[_T_co], Sized, Iterable[_T_co]): ... + +@type_check_only +class _SizedReversible(Protocol[_T_co], Sized, Reversible[_T_co]): ... + +def chunked( + iterable: Iterable[_T], n: Optional[int], strict: bool = ... +) -> Iterator[List[_T]]: ... +@overload +def first(iterable: Iterable[_T]) -> _T: ... +@overload +def first(iterable: Iterable[_T], default: _U) -> Union[_T, _U]: ... +@overload +def last(iterable: Iterable[_T]) -> _T: ... +@overload +def last(iterable: Iterable[_T], default: _U) -> Union[_T, _U]: ... +@overload +def nth_or_last(iterable: Iterable[_T], n: int) -> _T: ... +@overload +def nth_or_last( + iterable: Iterable[_T], n: int, default: _U +) -> Union[_T, _U]: ... + +class peekable(Generic[_T], Iterator[_T]): + def __init__(self, iterable: Iterable[_T]) -> None: ... + def __iter__(self) -> peekable[_T]: ... + def __bool__(self) -> bool: ... + @overload + def peek(self) -> _T: ... + @overload + def peek(self, default: _U) -> Union[_T, _U]: ... + def prepend(self, *items: _T) -> None: ... + def __next__(self) -> _T: ... + @overload + def __getitem__(self, index: int) -> _T: ... + @overload + def __getitem__(self, index: slice) -> List[_T]: ... + +def consumer(func: _GenFn) -> _GenFn: ... +def ilen(iterable: Iterable[object]) -> int: ... +def iterate(func: Callable[[_T], _T], start: _T) -> Iterator[_T]: ... +def with_iter( + context_manager: ContextManager[Iterable[_T]], +) -> Iterator[_T]: ... +def one( + iterable: Iterable[_T], + too_short: Optional[_Raisable] = ..., + too_long: Optional[_Raisable] = ..., +) -> _T: ... +def raise_(exception: _Raisable, *args: Any) -> None: ... +def strictly_n( + iterable: Iterable[_T], + n: int, + too_short: Optional[_GenFn] = ..., + too_long: Optional[_GenFn] = ..., +) -> List[_T]: ... +def distinct_permutations( + iterable: Iterable[_T], r: Optional[int] = ... +) -> Iterator[Tuple[_T, ...]]: ... +def intersperse( + e: _U, iterable: Iterable[_T], n: int = ... +) -> Iterator[Union[_T, _U]]: ... +def unique_to_each(*iterables: Iterable[_T]) -> List[List[_T]]: ... +@overload +def windowed( + seq: Iterable[_T], n: int, *, step: int = ... +) -> Iterator[Tuple[Optional[_T], ...]]: ... +@overload +def windowed( + seq: Iterable[_T], n: int, fillvalue: _U, step: int = ... +) -> Iterator[Tuple[Union[_T, _U], ...]]: ... +def substrings(iterable: Iterable[_T]) -> Iterator[Tuple[_T, ...]]: ... +def substrings_indexes( + seq: Sequence[_T], reverse: bool = ... +) -> Iterator[Tuple[Sequence[_T], int, int]]: ... + +class bucket(Generic[_T, _U], Container[_U]): + def __init__( + self, + iterable: Iterable[_T], + key: Callable[[_T], _U], + validator: Optional[Callable[[object], object]] = ..., + ) -> None: ... + def __contains__(self, value: object) -> bool: ... + def __iter__(self) -> Iterator[_U]: ... + def __getitem__(self, value: object) -> Iterator[_T]: ... + +def spy( + iterable: Iterable[_T], n: int = ... +) -> Tuple[List[_T], Iterator[_T]]: ... +def interleave(*iterables: Iterable[_T]) -> Iterator[_T]: ... +def interleave_longest(*iterables: Iterable[_T]) -> Iterator[_T]: ... +def interleave_evenly( + iterables: List[Iterable[_T]], lengths: Optional[List[int]] = ... +) -> Iterator[_T]: ... +def collapse( + iterable: Iterable[Any], + base_type: Optional[type] = ..., + levels: Optional[int] = ..., +) -> Iterator[Any]: ... +@overload +def side_effect( + func: Callable[[_T], object], + iterable: Iterable[_T], + chunk_size: None = ..., + before: Optional[Callable[[], object]] = ..., + after: Optional[Callable[[], object]] = ..., +) -> Iterator[_T]: ... +@overload +def side_effect( + func: Callable[[List[_T]], object], + iterable: Iterable[_T], + chunk_size: int, + before: Optional[Callable[[], object]] = ..., + after: Optional[Callable[[], object]] = ..., +) -> Iterator[_T]: ... +def sliced( + seq: Sequence[_T], n: int, strict: bool = ... +) -> Iterator[Sequence[_T]]: ... +def split_at( + iterable: Iterable[_T], + pred: Callable[[_T], object], + maxsplit: int = ..., + keep_separator: bool = ..., +) -> Iterator[List[_T]]: ... +def split_before( + iterable: Iterable[_T], pred: Callable[[_T], object], maxsplit: int = ... +) -> Iterator[List[_T]]: ... +def split_after( + iterable: Iterable[_T], pred: Callable[[_T], object], maxsplit: int = ... +) -> Iterator[List[_T]]: ... +def split_when( + iterable: Iterable[_T], + pred: Callable[[_T, _T], object], + maxsplit: int = ..., +) -> Iterator[List[_T]]: ... +def split_into( + iterable: Iterable[_T], sizes: Iterable[Optional[int]] +) -> Iterator[List[_T]]: ... +@overload +def padded( + iterable: Iterable[_T], + *, + n: Optional[int] = ..., + next_multiple: bool = ..., +) -> Iterator[Optional[_T]]: ... +@overload +def padded( + iterable: Iterable[_T], + fillvalue: _U, + n: Optional[int] = ..., + next_multiple: bool = ..., +) -> Iterator[Union[_T, _U]]: ... +@overload +def repeat_last(iterable: Iterable[_T]) -> Iterator[_T]: ... +@overload +def repeat_last( + iterable: Iterable[_T], default: _U +) -> Iterator[Union[_T, _U]]: ... +def distribute(n: int, iterable: Iterable[_T]) -> List[Iterator[_T]]: ... +@overload +def stagger( + iterable: Iterable[_T], + offsets: _SizedIterable[int] = ..., + longest: bool = ..., +) -> Iterator[Tuple[Optional[_T], ...]]: ... +@overload +def stagger( + iterable: Iterable[_T], + offsets: _SizedIterable[int] = ..., + longest: bool = ..., + fillvalue: _U = ..., +) -> Iterator[Tuple[Union[_T, _U], ...]]: ... + +class UnequalIterablesError(ValueError): + def __init__( + self, details: Optional[Tuple[int, int, int]] = ... + ) -> None: ... + +@overload +def zip_equal(__iter1: Iterable[_T1]) -> Iterator[Tuple[_T1]]: ... +@overload +def zip_equal( + __iter1: Iterable[_T1], __iter2: Iterable[_T2] +) -> Iterator[Tuple[_T1, _T2]]: ... +@overload +def zip_equal( + __iter1: Iterable[_T], + __iter2: Iterable[_T], + __iter3: Iterable[_T], + *iterables: Iterable[_T], +) -> Iterator[Tuple[_T, ...]]: ... +@overload +def zip_offset( + __iter1: Iterable[_T1], + *, + offsets: _SizedIterable[int], + longest: bool = ..., + fillvalue: None = None, +) -> Iterator[Tuple[Optional[_T1]]]: ... +@overload +def zip_offset( + __iter1: Iterable[_T1], + __iter2: Iterable[_T2], + *, + offsets: _SizedIterable[int], + longest: bool = ..., + fillvalue: None = None, +) -> Iterator[Tuple[Optional[_T1], Optional[_T2]]]: ... +@overload +def zip_offset( + __iter1: Iterable[_T], + __iter2: Iterable[_T], + __iter3: Iterable[_T], + *iterables: Iterable[_T], + offsets: _SizedIterable[int], + longest: bool = ..., + fillvalue: None = None, +) -> Iterator[Tuple[Optional[_T], ...]]: ... +@overload +def zip_offset( + __iter1: Iterable[_T1], + *, + offsets: _SizedIterable[int], + longest: bool = ..., + fillvalue: _U, +) -> Iterator[Tuple[Union[_T1, _U]]]: ... +@overload +def zip_offset( + __iter1: Iterable[_T1], + __iter2: Iterable[_T2], + *, + offsets: _SizedIterable[int], + longest: bool = ..., + fillvalue: _U, +) -> Iterator[Tuple[Union[_T1, _U], Union[_T2, _U]]]: ... +@overload +def zip_offset( + __iter1: Iterable[_T], + __iter2: Iterable[_T], + __iter3: Iterable[_T], + *iterables: Iterable[_T], + offsets: _SizedIterable[int], + longest: bool = ..., + fillvalue: _U, +) -> Iterator[Tuple[Union[_T, _U], ...]]: ... +def sort_together( + iterables: Iterable[Iterable[_T]], + key_list: Iterable[int] = ..., + key: Optional[Callable[..., Any]] = ..., + reverse: bool = ..., +) -> List[Tuple[_T, ...]]: ... +def unzip(iterable: Iterable[Sequence[_T]]) -> Tuple[Iterator[_T], ...]: ... +def divide(n: int, iterable: Iterable[_T]) -> List[Iterator[_T]]: ... +def always_iterable( + obj: object, + base_type: Union[ + type, Tuple[Union[type, Tuple[Any, ...]], ...], None + ] = ..., +) -> Iterator[Any]: ... +def adjacent( + predicate: Callable[[_T], bool], + iterable: Iterable[_T], + distance: int = ..., +) -> Iterator[Tuple[bool, _T]]: ... +@overload +def groupby_transform( + iterable: Iterable[_T], + keyfunc: None = None, + valuefunc: None = None, + reducefunc: None = None, +) -> Iterator[Tuple[_T, Iterator[_T]]]: ... +@overload +def groupby_transform( + iterable: Iterable[_T], + keyfunc: Callable[[_T], _U], + valuefunc: None, + reducefunc: None, +) -> Iterator[Tuple[_U, Iterator[_T]]]: ... +@overload +def groupby_transform( + iterable: Iterable[_T], + keyfunc: None, + valuefunc: Callable[[_T], _V], + reducefunc: None, +) -> Iterable[Tuple[_T, Iterable[_V]]]: ... +@overload +def groupby_transform( + iterable: Iterable[_T], + keyfunc: Callable[[_T], _U], + valuefunc: Callable[[_T], _V], + reducefunc: None, +) -> Iterable[Tuple[_U, Iterator[_V]]]: ... +@overload +def groupby_transform( + iterable: Iterable[_T], + keyfunc: None, + valuefunc: None, + reducefunc: Callable[[Iterator[_T]], _W], +) -> Iterable[Tuple[_T, _W]]: ... +@overload +def groupby_transform( + iterable: Iterable[_T], + keyfunc: Callable[[_T], _U], + valuefunc: None, + reducefunc: Callable[[Iterator[_T]], _W], +) -> Iterable[Tuple[_U, _W]]: ... +@overload +def groupby_transform( + iterable: Iterable[_T], + keyfunc: None, + valuefunc: Callable[[_T], _V], + reducefunc: Callable[[Iterable[_V]], _W], +) -> Iterable[Tuple[_T, _W]]: ... +@overload +def groupby_transform( + iterable: Iterable[_T], + keyfunc: Callable[[_T], _U], + valuefunc: Callable[[_T], _V], + reducefunc: Callable[[Iterable[_V]], _W], +) -> Iterable[Tuple[_U, _W]]: ... + +class numeric_range(Generic[_T, _U], Sequence[_T], Hashable, Reversible[_T]): + @overload + def __init__(self, __stop: _T) -> None: ... + @overload + def __init__(self, __start: _T, __stop: _T) -> None: ... + @overload + def __init__(self, __start: _T, __stop: _T, __step: _U) -> None: ... + def __bool__(self) -> bool: ... + def __contains__(self, elem: object) -> bool: ... + def __eq__(self, other: object) -> bool: ... + @overload + def __getitem__(self, key: int) -> _T: ... + @overload + def __getitem__(self, key: slice) -> numeric_range[_T, _U]: ... + def __hash__(self) -> int: ... + def __iter__(self) -> Iterator[_T]: ... + def __len__(self) -> int: ... + def __reduce__( + self, + ) -> Tuple[Type[numeric_range[_T, _U]], Tuple[_T, _T, _U]]: ... + def __repr__(self) -> str: ... + def __reversed__(self) -> Iterator[_T]: ... + def count(self, value: _T) -> int: ... + def index(self, value: _T) -> int: ... # type: ignore + +def count_cycle( + iterable: Iterable[_T], n: Optional[int] = ... +) -> Iterable[Tuple[int, _T]]: ... +def mark_ends( + iterable: Iterable[_T], +) -> Iterable[Tuple[bool, bool, _T]]: ... +def locate( + iterable: Iterable[object], + pred: Callable[..., Any] = ..., + window_size: Optional[int] = ..., +) -> Iterator[int]: ... +def lstrip( + iterable: Iterable[_T], pred: Callable[[_T], object] +) -> Iterator[_T]: ... +def rstrip( + iterable: Iterable[_T], pred: Callable[[_T], object] +) -> Iterator[_T]: ... +def strip( + iterable: Iterable[_T], pred: Callable[[_T], object] +) -> Iterator[_T]: ... + +class islice_extended(Generic[_T], Iterator[_T]): + def __init__( + self, iterable: Iterable[_T], *args: Optional[int] + ) -> None: ... + def __iter__(self) -> islice_extended[_T]: ... + def __next__(self) -> _T: ... + def __getitem__(self, index: slice) -> islice_extended[_T]: ... + +def always_reversible(iterable: Iterable[_T]) -> Iterator[_T]: ... +def consecutive_groups( + iterable: Iterable[_T], ordering: Callable[[_T], int] = ... +) -> Iterator[Iterator[_T]]: ... +@overload +def difference( + iterable: Iterable[_T], + func: Callable[[_T, _T], _U] = ..., + *, + initial: None = ..., +) -> Iterator[Union[_T, _U]]: ... +@overload +def difference( + iterable: Iterable[_T], func: Callable[[_T, _T], _U] = ..., *, initial: _U +) -> Iterator[_U]: ... + +class SequenceView(Generic[_T], Sequence[_T]): + def __init__(self, target: Sequence[_T]) -> None: ... + @overload + def __getitem__(self, index: int) -> _T: ... + @overload + def __getitem__(self, index: slice) -> Sequence[_T]: ... + def __len__(self) -> int: ... + +class seekable(Generic[_T], Iterator[_T]): + def __init__( + self, iterable: Iterable[_T], maxlen: Optional[int] = ... + ) -> None: ... + def __iter__(self) -> seekable[_T]: ... + def __next__(self) -> _T: ... + def __bool__(self) -> bool: ... + @overload + def peek(self) -> _T: ... + @overload + def peek(self, default: _U) -> Union[_T, _U]: ... + def elements(self) -> SequenceView[_T]: ... + def seek(self, index: int) -> None: ... + +class run_length: + @staticmethod + def encode(iterable: Iterable[_T]) -> Iterator[Tuple[_T, int]]: ... + @staticmethod + def decode(iterable: Iterable[Tuple[_T, int]]) -> Iterator[_T]: ... + +def exactly_n( + iterable: Iterable[_T], n: int, predicate: Callable[[_T], object] = ... +) -> bool: ... +def circular_shifts(iterable: Iterable[_T]) -> List[Tuple[_T, ...]]: ... +def make_decorator( + wrapping_func: Callable[..., _U], result_index: int = ... +) -> Callable[..., Callable[[Callable[..., Any]], Callable[..., _U]]]: ... +@overload +def map_reduce( + iterable: Iterable[_T], + keyfunc: Callable[[_T], _U], + valuefunc: None = ..., + reducefunc: None = ..., +) -> Dict[_U, List[_T]]: ... +@overload +def map_reduce( + iterable: Iterable[_T], + keyfunc: Callable[[_T], _U], + valuefunc: Callable[[_T], _V], + reducefunc: None = ..., +) -> Dict[_U, List[_V]]: ... +@overload +def map_reduce( + iterable: Iterable[_T], + keyfunc: Callable[[_T], _U], + valuefunc: None = ..., + reducefunc: Callable[[List[_T]], _W] = ..., +) -> Dict[_U, _W]: ... +@overload +def map_reduce( + iterable: Iterable[_T], + keyfunc: Callable[[_T], _U], + valuefunc: Callable[[_T], _V], + reducefunc: Callable[[List[_V]], _W], +) -> Dict[_U, _W]: ... +def rlocate( + iterable: Iterable[_T], + pred: Callable[..., object] = ..., + window_size: Optional[int] = ..., +) -> Iterator[int]: ... +def replace( + iterable: Iterable[_T], + pred: Callable[..., object], + substitutes: Iterable[_U], + count: Optional[int] = ..., + window_size: int = ..., +) -> Iterator[Union[_T, _U]]: ... +def partitions(iterable: Iterable[_T]) -> Iterator[List[List[_T]]]: ... +def set_partitions( + iterable: Iterable[_T], k: Optional[int] = ... +) -> Iterator[List[List[_T]]]: ... + +class time_limited(Generic[_T], Iterator[_T]): + def __init__( + self, limit_seconds: float, iterable: Iterable[_T] + ) -> None: ... + def __iter__(self) -> islice_extended[_T]: ... + def __next__(self) -> _T: ... + +@overload +def only( + iterable: Iterable[_T], *, too_long: Optional[_Raisable] = ... +) -> Optional[_T]: ... +@overload +def only( + iterable: Iterable[_T], default: _U, too_long: Optional[_Raisable] = ... +) -> Union[_T, _U]: ... +def ichunked(iterable: Iterable[_T], n: int) -> Iterator[Iterator[_T]]: ... +def distinct_combinations( + iterable: Iterable[_T], r: int +) -> Iterator[Tuple[_T, ...]]: ... +def filter_except( + validator: Callable[[Any], object], + iterable: Iterable[_T], + *exceptions: Type[BaseException], +) -> Iterator[_T]: ... +def map_except( + function: Callable[[Any], _U], + iterable: Iterable[_T], + *exceptions: Type[BaseException], +) -> Iterator[_U]: ... +def map_if( + iterable: Iterable[Any], + pred: Callable[[Any], bool], + func: Callable[[Any], Any], + func_else: Optional[Callable[[Any], Any]] = ..., +) -> Iterator[Any]: ... +def sample( + iterable: Iterable[_T], + k: int, + weights: Optional[Iterable[float]] = ..., +) -> List[_T]: ... +def is_sorted( + iterable: Iterable[_T], + key: Optional[Callable[[_T], _U]] = ..., + reverse: bool = False, + strict: bool = False, +) -> bool: ... + +class AbortThread(BaseException): + pass + +class callback_iter(Generic[_T], Iterator[_T]): + def __init__( + self, + func: Callable[..., Any], + callback_kwd: str = ..., + wait_seconds: float = ..., + ) -> None: ... + def __enter__(self) -> callback_iter[_T]: ... + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_value: Optional[BaseException], + traceback: Optional[TracebackType], + ) -> Optional[bool]: ... + def __iter__(self) -> callback_iter[_T]: ... + def __next__(self) -> _T: ... + def _reader(self) -> Iterator[_T]: ... + @property + def done(self) -> bool: ... + @property + def result(self) -> Any: ... + +def windowed_complete( + iterable: Iterable[_T], n: int +) -> Iterator[Tuple[_T, ...]]: ... +def all_unique( + iterable: Iterable[_T], key: Optional[Callable[[_T], _U]] = ... +) -> bool: ... +def nth_product(index: int, *args: Iterable[_T]) -> Tuple[_T, ...]: ... +def nth_permutation( + iterable: Iterable[_T], r: int, index: int +) -> Tuple[_T, ...]: ... +def value_chain(*args: Union[_T, Iterable[_T]]) -> Iterable[_T]: ... +def product_index(element: Iterable[_T], *args: Iterable[_T]) -> int: ... +def combination_index( + element: Iterable[_T], iterable: Iterable[_T] +) -> int: ... +def permutation_index( + element: Iterable[_T], iterable: Iterable[_T] +) -> int: ... +def repeat_each(iterable: Iterable[_T], n: int = ...) -> Iterator[_T]: ... + +class countable(Generic[_T], Iterator[_T]): + def __init__(self, iterable: Iterable[_T]) -> None: ... + def __iter__(self) -> countable[_T]: ... + def __next__(self) -> _T: ... + +def chunked_even(iterable: Iterable[_T], n: int) -> Iterator[List[_T]]: ... +def zip_broadcast( + *objects: Union[_T, Iterable[_T]], + scalar_types: Union[ + type, Tuple[Union[type, Tuple[Any, ...]], ...], None + ] = ..., + strict: bool = ..., +) -> Iterable[Tuple[_T, ...]]: ... +def unique_in_window( + iterable: Iterable[_T], n: int, key: Optional[Callable[[_T], _U]] = ... +) -> Iterator[_T]: ... +def duplicates_everseen( + iterable: Iterable[_T], key: Optional[Callable[[_T], _U]] = ... +) -> Iterator[_T]: ... +def duplicates_justseen( + iterable: Iterable[_T], key: Optional[Callable[[_T], _U]] = ... +) -> Iterator[_T]: ... + +class _SupportsLessThan(Protocol): + def __lt__(self, __other: Any) -> bool: ... + +_SupportsLessThanT = TypeVar("_SupportsLessThanT", bound=_SupportsLessThan) + +@overload +def minmax( + iterable_or_value: Iterable[_SupportsLessThanT], *, key: None = None +) -> Tuple[_SupportsLessThanT, _SupportsLessThanT]: ... +@overload +def minmax( + iterable_or_value: Iterable[_T], *, key: Callable[[_T], _SupportsLessThan] +) -> Tuple[_T, _T]: ... +@overload +def minmax( + iterable_or_value: Iterable[_SupportsLessThanT], + *, + key: None = None, + default: _U, +) -> Union[_U, Tuple[_SupportsLessThanT, _SupportsLessThanT]]: ... +@overload +def minmax( + iterable_or_value: Iterable[_T], + *, + key: Callable[[_T], _SupportsLessThan], + default: _U, +) -> Union[_U, Tuple[_T, _T]]: ... +@overload +def minmax( + iterable_or_value: _SupportsLessThanT, + __other: _SupportsLessThanT, + *others: _SupportsLessThanT, +) -> Tuple[_SupportsLessThanT, _SupportsLessThanT]: ... +@overload +def minmax( + iterable_or_value: _T, + __other: _T, + *others: _T, + key: Callable[[_T], _SupportsLessThan], +) -> Tuple[_T, _T]: ... +def longest_common_prefix( + iterables: Iterable[Iterable[_T]], +) -> Iterator[_T]: ... +def iequals(*iterables: Iterable[object]) -> bool: ... +def constrained_batches( + iterable: Iterable[object], + max_size: int, + max_count: Optional[int] = ..., + get_len: Callable[[_T], object] = ..., + strict: bool = ..., +) -> Iterator[Tuple[_T]]: ... diff --git a/libs/win/more_itertools/py.typed b/libs/win/more_itertools/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/libs/win/more_itertools/recipes.py b/libs/win/more_itertools/recipes.py index 3a7706cb..85796207 100644 --- a/libs/win/more_itertools/recipes.py +++ b/libs/win/more_itertools/recipes.py @@ -7,20 +7,33 @@ Some backward-compatible usability improvements have been made. .. [1] http://docs.python.org/library/itertools.html#recipes """ -from collections import deque -from itertools import ( - chain, combinations, count, cycle, groupby, islice, repeat, starmap, tee -) +import math import operator + +from collections import deque +from collections.abc import Sized +from functools import reduce +from itertools import ( + chain, + combinations, + compress, + count, + cycle, + groupby, + islice, + repeat, + starmap, + tee, + zip_longest, +) from random import randrange, sample, choice -from six import PY2 -from six.moves import filter, filterfalse, map, range, zip, zip_longest - __all__ = [ - 'accumulate', 'all_equal', + 'batched', + 'before_and_after', 'consume', + 'convolve', 'dotproduct', 'first_true', 'flatten', @@ -30,8 +43,10 @@ __all__ = [ 'nth', 'nth_combination', 'padnone', + 'pad_none', 'pairwise', 'partition', + 'polynomial_from_roots', 'powerset', 'prepend', 'quantify', @@ -41,42 +56,18 @@ __all__ = [ 'random_product', 'repeatfunc', 'roundrobin', + 'sieve', + 'sliding_window', + 'subslices', 'tabulate', 'tail', 'take', + 'triplewise', 'unique_everseen', 'unique_justseen', ] - -def accumulate(iterable, func=operator.add): - """ - Return an iterator whose items are the accumulated results of a function - (specified by the optional *func* argument) that takes two arguments. - By default, returns accumulated sums with :func:`operator.add`. - - >>> list(accumulate([1, 2, 3, 4, 5])) # Running sum - [1, 3, 6, 10, 15] - >>> list(accumulate([1, 2, 3], func=operator.mul)) # Running product - [1, 2, 6] - >>> list(accumulate([0, 1, -1, 2, 3, 2], func=max)) # Running maximum - [0, 1, 1, 2, 3, 3] - - This function is available in the ``itertools`` module for Python 3.2 and - greater. - - """ - it = iter(iterable) - try: - total = next(it) - except StopIteration: - return - else: - yield total - - for element in it: - total = func(total, element) - yield total +_marker = object() def take(n, iterable): @@ -84,11 +75,12 @@ def take(n, iterable): >>> take(3, range(10)) [0, 1, 2] - >>> take(5, range(3)) - [0, 1, 2] - Effectively a short replacement for ``next`` based iterator consumption - when you want more than one item, but less than the whole iterator. + If there are fewer than *n* items in the iterable, all of them are + returned. + + >>> take(10, range(3)) + [0, 1, 2] """ return list(islice(iterable, n)) @@ -115,12 +107,19 @@ def tabulate(function, start=0): def tail(n, iterable): """Return an iterator over the last *n* items of *iterable*. - >>> t = tail(3, 'ABCDEFG') - >>> list(t) - ['E', 'F', 'G'] + >>> t = tail(3, 'ABCDEFG') + >>> list(t) + ['E', 'F', 'G'] """ - return iter(deque(iterable, maxlen=n)) + # If the given iterable has a length, then we can use islice to get its + # final elements. Note that if the iterable is not actually Iterable, + # either islice or deque will throw a TypeError. This is why we don't + # check if it is Iterable. + if isinstance(iterable, Sized): + yield from islice(iterable, max(0, len(iterable) - n), None) + else: + yield from iter(deque(iterable, maxlen=n)) def consume(iterator, n=None): @@ -166,11 +165,11 @@ def consume(iterator, n=None): def nth(iterable, n, default=None): """Returns the nth item or a default value. - >>> l = range(10) - >>> nth(l, 3) - 3 - >>> nth(l, 20, "zebra") - 'zebra' + >>> l = range(10) + >>> nth(l, 3) + 3 + >>> nth(l, 20, "zebra") + 'zebra' """ return next(islice(iterable, n, None), default) @@ -193,17 +192,17 @@ def all_equal(iterable): def quantify(iterable, pred=bool): """Return the how many times the predicate is true. - >>> quantify([True, False, True]) - 2 + >>> quantify([True, False, True]) + 2 """ return sum(map(pred, iterable)) -def padnone(iterable): +def pad_none(iterable): """Returns the sequence of elements and then returns ``None`` indefinitely. - >>> take(5, padnone(range(3))) + >>> take(5, pad_none(range(3))) [0, 1, 2, None, None] Useful for emulating the behavior of the built-in :func:`map` function. @@ -214,11 +213,14 @@ def padnone(iterable): return chain(iterable, repeat(None)) +padnone = pad_none + + def ncycles(iterable, n): """Returns the sequence elements *n* times - >>> list(ncycles(["a", "b"], 3)) - ['a', 'b', 'a', 'b', 'a', 'b'] + >>> list(ncycles(["a", "b"], 3)) + ['a', 'b', 'a', 'b', 'a', 'b'] """ return chain.from_iterable(repeat(tuple(iterable), n)) @@ -227,8 +229,8 @@ def ncycles(iterable, n): def dotproduct(vec1, vec2): """Returns the dot product of the two iterables. - >>> dotproduct([10, 10], [20, 20]) - 400 + >>> dotproduct([10, 10], [20, 20]) + 400 """ return sum(map(operator.mul, vec1, vec2)) @@ -273,27 +275,109 @@ def repeatfunc(func, times=None, *args): return starmap(func, repeat(args, times)) -def pairwise(iterable): +def _pairwise(iterable): """Returns an iterator of paired items, overlapping, from the original - >>> take(4, pairwise(count())) - [(0, 1), (1, 2), (2, 3), (3, 4)] + >>> take(4, pairwise(count())) + [(0, 1), (1, 2), (2, 3), (3, 4)] + + On Python 3.10 and above, this is an alias for :func:`itertools.pairwise`. """ a, b = tee(iterable) next(b, None) - return zip(a, b) + yield from zip(a, b) -def grouper(n, iterable, fillvalue=None): - """Collect data into fixed-length chunks or blocks. +try: + from itertools import pairwise as itertools_pairwise +except ImportError: + pairwise = _pairwise +else: - >>> list(grouper(3, 'ABCDEFG', 'x')) - [('A', 'B', 'C'), ('D', 'E', 'F'), ('G', 'x', 'x')] + def pairwise(iterable): + yield from itertools_pairwise(iterable) + + pairwise.__doc__ = _pairwise.__doc__ + + +class UnequalIterablesError(ValueError): + def __init__(self, details=None): + msg = 'Iterables have different lengths' + if details is not None: + msg += (': index 0 has length {}; index {} has length {}').format( + *details + ) + + super().__init__(msg) + + +def _zip_equal_generator(iterables): + for combo in zip_longest(*iterables, fillvalue=_marker): + for val in combo: + if val is _marker: + raise UnequalIterablesError() + yield combo + + +def _zip_equal(*iterables): + # Check whether the iterables are all the same size. + try: + first_size = len(iterables[0]) + for i, it in enumerate(iterables[1:], 1): + size = len(it) + if size != first_size: + break + else: + # If we didn't break out, we can use the built-in zip. + return zip(*iterables) + + # If we did break out, there was a mismatch. + raise UnequalIterablesError(details=(first_size, i, size)) + # If any one of the iterables didn't have a length, start reading + # them until one runs out. + except TypeError: + return _zip_equal_generator(iterables) + + +def grouper(iterable, n, incomplete='fill', fillvalue=None): + """Group elements from *iterable* into fixed-length groups of length *n*. + + >>> list(grouper('ABCDEF', 3)) + [('A', 'B', 'C'), ('D', 'E', 'F')] + + The keyword arguments *incomplete* and *fillvalue* control what happens for + iterables whose length is not a multiple of *n*. + + When *incomplete* is `'fill'`, the last group will contain instances of + *fillvalue*. + + >>> list(grouper('ABCDEFG', 3, incomplete='fill', fillvalue='x')) + [('A', 'B', 'C'), ('D', 'E', 'F'), ('G', 'x', 'x')] + + When *incomplete* is `'ignore'`, the last group will not be emitted. + + >>> list(grouper('ABCDEFG', 3, incomplete='ignore', fillvalue='x')) + [('A', 'B', 'C'), ('D', 'E', 'F')] + + When *incomplete* is `'strict'`, a subclass of `ValueError` will be raised. + + >>> it = grouper('ABCDEFG', 3, incomplete='strict') + >>> list(it) # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + UnequalIterablesError """ args = [iter(iterable)] * n - return zip_longest(fillvalue=fillvalue, *args) + if incomplete == 'fill': + return zip_longest(*args, fillvalue=fillvalue) + if incomplete == 'strict': + return _zip_equal(*args) + if incomplete == 'ignore': + return zip(*args) + else: + raise ValueError('Expected fill, strict, or ignore') def roundrobin(*iterables): @@ -309,10 +393,7 @@ def roundrobin(*iterables): """ # Recipe credited to George Sakkis pending = len(iterables) - if PY2: - nexts = cycle(iter(it).next for it in iterables) - else: - nexts = cycle(iter(it).__next__ for it in iterables) + nexts = cycle(iter(it).__next__ for it in iterables) while pending: try: for next in nexts: @@ -334,18 +415,43 @@ def partition(pred, iterable): >>> list(even_items), list(odd_items) ([0, 2, 4, 6, 8], [1, 3, 5, 7, 9]) + If *pred* is None, :func:`bool` is used. + + >>> iterable = [0, 1, False, True, '', ' '] + >>> false_items, true_items = partition(None, iterable) + >>> list(false_items), list(true_items) + ([0, False, ''], [1, True, ' ']) + """ - # partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9 - t1, t2 = tee(iterable) - return filterfalse(pred, t1), filter(pred, t2) + if pred is None: + pred = bool + + evaluations = ((pred(x), x) for x in iterable) + t1, t2 = tee(evaluations) + return ( + (x for (cond, x) in t1 if not cond), + (x for (cond, x) in t2 if cond), + ) def powerset(iterable): """Yields all possible subsets of the iterable. - >>> list(powerset([1,2,3])) + >>> list(powerset([1, 2, 3])) [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)] + :func:`powerset` will operate on iterables that aren't :class:`set` + instances, so repeated elements in the input will produce repeated elements + in the output. Use :func:`unique_everseen` on the input to avoid generating + duplicates: + + >>> seq = [1, 1, 0] + >>> list(powerset(seq)) + [(), (1,), (1,), (0,), (1, 1), (1, 0), (1, 0), (1, 1, 0)] + >>> from more_itertools import unique_everseen + >>> list(powerset(unique_everseen(seq))) + [(), (1,), (0,), (1, 0)] + """ s = list(iterable) return chain.from_iterable(combinations(s, r) for r in range(len(s) + 1)) @@ -363,41 +469,46 @@ def unique_everseen(iterable, key=None): Sequences with a mix of hashable and unhashable items can be used. The function will be slower (i.e., `O(n^2)`) for unhashable items. + Remember that ``list`` objects are unhashable - you can use the *key* + parameter to transform the list to a tuple (which is hashable) to + avoid a slowdown. + + >>> iterable = ([1, 2], [2, 3], [1, 2]) + >>> list(unique_everseen(iterable)) # Slow + [[1, 2], [2, 3]] + >>> list(unique_everseen(iterable, key=tuple)) # Faster + [[1, 2], [2, 3]] + + Similary, you may want to convert unhashable ``set`` objects with + ``key=frozenset``. For ``dict`` objects, + ``key=lambda x: frozenset(x.items())`` can be used. + """ seenset = set() seenset_add = seenset.add seenlist = [] seenlist_add = seenlist.append - if key is None: - for element in iterable: - try: - if element not in seenset: - seenset_add(element) - yield element - except TypeError: - if element not in seenlist: - seenlist_add(element) - yield element - else: - for element in iterable: - k = key(element) - try: - if k not in seenset: - seenset_add(k) - yield element - except TypeError: - if k not in seenlist: - seenlist_add(k) - yield element + use_key = key is not None + + for element in iterable: + k = key(element) if use_key else element + try: + if k not in seenset: + seenset_add(k) + yield element + except TypeError: + if k not in seenlist: + seenlist_add(k) + yield element def unique_justseen(iterable, key=None): """Yields elements in order, ignoring serial duplicates - >>> list(unique_justseen('AAAABBBCCDAABBB')) - ['A', 'B', 'C', 'D', 'A', 'B'] - >>> list(unique_justseen('ABBCcAD', str.lower)) - ['A', 'B', 'C', 'A', 'D'] + >>> list(unique_justseen('AAAABBBCCDAABBB')) + ['A', 'B', 'C', 'D', 'A', 'B'] + >>> list(unique_justseen('ABBCcAD', str.lower)) + ['A', 'B', 'C', 'A', 'D'] """ return map(next, map(operator.itemgetter(1), groupby(iterable, key))) @@ -414,6 +525,16 @@ def iter_except(func, exception, first=None): >>> list(iter_except(l.pop, IndexError)) [2, 1, 0] + Multiple exceptions can be specified as a stopping condition: + + >>> l = [1, 2, 3, '...', 4, 5, 6] + >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError))) + [7, 6, 5] + >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError))) + [4, 3, 2] + >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError))) + [] + """ try: if first is not None: @@ -424,7 +545,7 @@ def iter_except(func, exception, first=None): pass -def first_true(iterable, default=False, pred=None): +def first_true(iterable, default=None, pred=None): """ Returns the first true value in the iterable. @@ -444,7 +565,7 @@ def first_true(iterable, default=False, pred=None): return next(filter(pred, iterable), default) -def random_product(*args, **kwds): +def random_product(*args, repeat=1): """Draw an item at random from each of the input iterables. >>> random_product('abc', range(4), 'XYZ') # doctest:+SKIP @@ -460,7 +581,7 @@ def random_product(*args, **kwds): ``itertools.product(*args, **kwarg)``. """ - pools = [tuple(pool) for pool in args] * kwds.get('repeat', 1) + pools = [tuple(pool) for pool in args] * repeat return tuple(choice(pool) for pool in pools) @@ -523,6 +644,12 @@ def nth_combination(iterable, r, index): sort position *index* directly, without computing the previous subsequences. + >>> nth_combination(range(5), 3, 5) + (0, 3, 4) + + ``ValueError`` will be raised If *r* is negative or greater than the length + of *iterable*. + ``IndexError`` will be raised if the given *index* is invalid. """ pool = tuple(iterable) n = len(pool) @@ -559,7 +686,156 @@ def prepend(value, iterator): >>> list(prepend(value, iterator)) ['0', '1', '2', '3'] - To prepend multiple values, see :func:`itertools.chain`. + To prepend multiple values, see :func:`itertools.chain` + or :func:`value_chain`. """ return chain([value], iterator) + + +def convolve(signal, kernel): + """Convolve the iterable *signal* with the iterable *kernel*. + + >>> signal = (1, 2, 3, 4, 5) + >>> kernel = [3, 2, 1] + >>> list(convolve(signal, kernel)) + [3, 8, 14, 20, 26, 14, 5] + + Note: the input arguments are not interchangeable, as the *kernel* + is immediately consumed and stored. + + """ + kernel = tuple(kernel)[::-1] + n = len(kernel) + window = deque([0], maxlen=n) * n + for x in chain(signal, repeat(0, n - 1)): + window.append(x) + yield sum(map(operator.mul, kernel, window)) + + +def before_and_after(predicate, it): + """A variant of :func:`takewhile` that allows complete access to the + remainder of the iterator. + + >>> it = iter('ABCdEfGhI') + >>> all_upper, remainder = before_and_after(str.isupper, it) + >>> ''.join(all_upper) + 'ABC' + >>> ''.join(remainder) # takewhile() would lose the 'd' + 'dEfGhI' + + Note that the first iterator must be fully consumed before the second + iterator can generate valid results. + """ + it = iter(it) + transition = [] + + def true_iterator(): + for elem in it: + if predicate(elem): + yield elem + else: + transition.append(elem) + return + + # Note: this is different from itertools recipes to allow nesting + # before_and_after remainders into before_and_after again. See tests + # for an example. + remainder_iterator = chain(transition, it) + + return true_iterator(), remainder_iterator + + +def triplewise(iterable): + """Return overlapping triplets from *iterable*. + + >>> list(triplewise('ABCDE')) + [('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E')] + + """ + for (a, _), (b, c) in pairwise(pairwise(iterable)): + yield a, b, c + + +def sliding_window(iterable, n): + """Return a sliding window of width *n* over *iterable*. + + >>> list(sliding_window(range(6), 4)) + [(0, 1, 2, 3), (1, 2, 3, 4), (2, 3, 4, 5)] + + If *iterable* has fewer than *n* items, then nothing is yielded: + + >>> list(sliding_window(range(3), 4)) + [] + + For a variant with more features, see :func:`windowed`. + """ + it = iter(iterable) + window = deque(islice(it, n), maxlen=n) + if len(window) == n: + yield tuple(window) + for x in it: + window.append(x) + yield tuple(window) + + +def subslices(iterable): + """Return all contiguous non-empty subslices of *iterable*. + + >>> list(subslices('ABC')) + [['A'], ['A', 'B'], ['A', 'B', 'C'], ['B'], ['B', 'C'], ['C']] + + This is similar to :func:`substrings`, but emits items in a different + order. + """ + seq = list(iterable) + slices = starmap(slice, combinations(range(len(seq) + 1), 2)) + return map(operator.getitem, repeat(seq), slices) + + +def polynomial_from_roots(roots): + """Compute a polynomial's coefficients from its roots. + + >>> roots = [5, -4, 3] # (x - 5) * (x + 4) * (x - 3) + >>> polynomial_from_roots(roots) # x^3 - 4 * x^2 - 17 * x + 60 + [1, -4, -17, 60] + """ + # Use math.prod for Python 3.8+, + prod = getattr(math, 'prod', lambda x: reduce(operator.mul, x, 1)) + roots = list(map(operator.neg, roots)) + return [ + sum(map(prod, combinations(roots, k))) for k in range(len(roots) + 1) + ] + + +def sieve(n): + """Yield the primes less than n. + + >>> list(sieve(30)) + [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] + """ + isqrt = getattr(math, 'isqrt', lambda x: int(math.sqrt(x))) + limit = isqrt(n) + 1 + data = bytearray([1]) * n + data[:2] = 0, 0 + for p in compress(range(limit), data): + data[p + p : n : p] = bytearray(len(range(p + p, n, p))) + + return compress(count(), data) + + +def batched(iterable, n): + """Batch data into lists of length *n*. The last batch may be shorter. + + >>> list(batched('ABCDEFG', 3)) + [['A', 'B', 'C'], ['D', 'E', 'F'], ['G']] + + This recipe is from the ``itertools`` docs. This library also provides + :func:`chunked`, which has a different implementation. + """ + it = iter(iterable) + while True: + batch = list(islice(it, n)) + if not batch: + break + yield batch diff --git a/libs/win/more_itertools/recipes.pyi b/libs/win/more_itertools/recipes.pyi new file mode 100644 index 00000000..29415c5a --- /dev/null +++ b/libs/win/more_itertools/recipes.pyi @@ -0,0 +1,110 @@ +"""Stubs for more_itertools.recipes""" +from typing import ( + Any, + Callable, + Iterable, + Iterator, + List, + Optional, + Sequence, + Tuple, + TypeVar, + Union, +) +from typing_extensions import overload, Type + +# Type and type variable definitions +_T = TypeVar('_T') +_U = TypeVar('_U') + +def take(n: int, iterable: Iterable[_T]) -> List[_T]: ... +def tabulate( + function: Callable[[int], _T], start: int = ... +) -> Iterator[_T]: ... +def tail(n: int, iterable: Iterable[_T]) -> Iterator[_T]: ... +def consume(iterator: Iterable[object], n: Optional[int] = ...) -> None: ... +@overload +def nth(iterable: Iterable[_T], n: int) -> Optional[_T]: ... +@overload +def nth(iterable: Iterable[_T], n: int, default: _U) -> Union[_T, _U]: ... +def all_equal(iterable: Iterable[object]) -> bool: ... +def quantify( + iterable: Iterable[_T], pred: Callable[[_T], bool] = ... +) -> int: ... +def pad_none(iterable: Iterable[_T]) -> Iterator[Optional[_T]]: ... +def padnone(iterable: Iterable[_T]) -> Iterator[Optional[_T]]: ... +def ncycles(iterable: Iterable[_T], n: int) -> Iterator[_T]: ... +def dotproduct(vec1: Iterable[object], vec2: Iterable[object]) -> object: ... +def flatten(listOfLists: Iterable[Iterable[_T]]) -> Iterator[_T]: ... +def repeatfunc( + func: Callable[..., _U], times: Optional[int] = ..., *args: Any +) -> Iterator[_U]: ... +def pairwise(iterable: Iterable[_T]) -> Iterator[Tuple[_T, _T]]: ... +def grouper( + iterable: Iterable[_T], + n: int, + incomplete: str = ..., + fillvalue: _U = ..., +) -> Iterator[Tuple[Union[_T, _U], ...]]: ... +def roundrobin(*iterables: Iterable[_T]) -> Iterator[_T]: ... +def partition( + pred: Optional[Callable[[_T], object]], iterable: Iterable[_T] +) -> Tuple[Iterator[_T], Iterator[_T]]: ... +def powerset(iterable: Iterable[_T]) -> Iterator[Tuple[_T, ...]]: ... +def unique_everseen( + iterable: Iterable[_T], key: Optional[Callable[[_T], _U]] = ... +) -> Iterator[_T]: ... +def unique_justseen( + iterable: Iterable[_T], key: Optional[Callable[[_T], object]] = ... +) -> Iterator[_T]: ... +@overload +def iter_except( + func: Callable[[], _T], + exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]], + first: None = ..., +) -> Iterator[_T]: ... +@overload +def iter_except( + func: Callable[[], _T], + exception: Union[Type[BaseException], Tuple[Type[BaseException], ...]], + first: Callable[[], _U], +) -> Iterator[Union[_T, _U]]: ... +@overload +def first_true( + iterable: Iterable[_T], *, pred: Optional[Callable[[_T], object]] = ... +) -> Optional[_T]: ... +@overload +def first_true( + iterable: Iterable[_T], + default: _U, + pred: Optional[Callable[[_T], object]] = ..., +) -> Union[_T, _U]: ... +def random_product( + *args: Iterable[_T], repeat: int = ... +) -> Tuple[_T, ...]: ... +def random_permutation( + iterable: Iterable[_T], r: Optional[int] = ... +) -> Tuple[_T, ...]: ... +def random_combination(iterable: Iterable[_T], r: int) -> Tuple[_T, ...]: ... +def random_combination_with_replacement( + iterable: Iterable[_T], r: int +) -> Tuple[_T, ...]: ... +def nth_combination( + iterable: Iterable[_T], r: int, index: int +) -> Tuple[_T, ...]: ... +def prepend(value: _T, iterator: Iterable[_U]) -> Iterator[Union[_T, _U]]: ... +def convolve(signal: Iterable[_T], kernel: Iterable[_T]) -> Iterator[_T]: ... +def before_and_after( + predicate: Callable[[_T], bool], it: Iterable[_T] +) -> Tuple[Iterator[_T], Iterator[_T]]: ... +def triplewise(iterable: Iterable[_T]) -> Iterator[Tuple[_T, _T, _T]]: ... +def sliding_window( + iterable: Iterable[_T], n: int +) -> Iterator[Tuple[_T, ...]]: ... +def subslices(iterable: Iterable[_T]) -> Iterator[List[_T]]: ... +def polynomial_from_roots(roots: Sequence[int]) -> List[int]: ... +def sieve(n: int) -> Iterator[int]: ... +def batched( + iterable: Iterable[_T], + n: int, +) -> Iterator[List[_T]]: ... diff --git a/libs/win/more_itertools/tests/test_more.py b/libs/win/more_itertools/tests/test_more.py deleted file mode 100644 index a1b1e431..00000000 --- a/libs/win/more_itertools/tests/test_more.py +++ /dev/null @@ -1,2074 +0,0 @@ -from __future__ import division, print_function, unicode_literals - -from collections import OrderedDict -from decimal import Decimal -from doctest import DocTestSuite -from fractions import Fraction -from functools import partial, reduce -from heapq import merge -from io import StringIO -from itertools import ( - chain, - count, - groupby, - islice, - permutations, - product, - repeat, -) -from operator import add, mul, itemgetter -from unittest import TestCase - -from six.moves import filter, map, range, zip - -import more_itertools as mi - - -def load_tests(loader, tests, ignore): - # Add the doctests - tests.addTests(DocTestSuite('more_itertools.more')) - return tests - - -class CollateTests(TestCase): - """Unit tests for ``collate()``""" - # Also accidentally tests peekable, though that could use its own tests - - def test_default(self): - """Test with the default `key` function.""" - iterables = [range(4), range(7), range(3, 6)] - self.assertEqual( - sorted(reduce(list.__add__, [list(it) for it in iterables])), - list(mi.collate(*iterables)) - ) - - def test_key(self): - """Test using a custom `key` function.""" - iterables = [range(5, 0, -1), range(4, 0, -1)] - actual = sorted( - reduce(list.__add__, [list(it) for it in iterables]), reverse=True - ) - expected = list(mi.collate(*iterables, key=lambda x: -x)) - self.assertEqual(actual, expected) - - def test_empty(self): - """Be nice if passed an empty list of iterables.""" - self.assertEqual([], list(mi.collate())) - - def test_one(self): - """Work when only 1 iterable is passed.""" - self.assertEqual([0, 1], list(mi.collate(range(2)))) - - def test_reverse(self): - """Test the `reverse` kwarg.""" - iterables = [range(4, 0, -1), range(7, 0, -1), range(3, 6, -1)] - - actual = sorted( - reduce(list.__add__, [list(it) for it in iterables]), reverse=True - ) - expected = list(mi.collate(*iterables, reverse=True)) - self.assertEqual(actual, expected) - - def test_alias(self): - self.assertNotEqual(merge.__doc__, mi.collate.__doc__) - self.assertNotEqual(partial.__doc__, mi.collate.__doc__) - - -class ChunkedTests(TestCase): - """Tests for ``chunked()``""" - - def test_even(self): - """Test when ``n`` divides evenly into the length of the iterable.""" - self.assertEqual( - list(mi.chunked('ABCDEF', 3)), [['A', 'B', 'C'], ['D', 'E', 'F']] - ) - - def test_odd(self): - """Test when ``n`` does not divide evenly into the length of the - iterable. - - """ - self.assertEqual( - list(mi.chunked('ABCDE', 3)), [['A', 'B', 'C'], ['D', 'E']] - ) - - -class FirstTests(TestCase): - """Tests for ``first()``""" - - def test_many(self): - """Test that it works on many-item iterables.""" - # Also try it on a generator expression to make sure it works on - # whatever those return, across Python versions. - self.assertEqual(mi.first(x for x in range(4)), 0) - - def test_one(self): - """Test that it doesn't raise StopIteration prematurely.""" - self.assertEqual(mi.first([3]), 3) - - def test_empty_stop_iteration(self): - """It should raise StopIteration for empty iterables.""" - self.assertRaises(ValueError, lambda: mi.first([])) - - def test_default(self): - """It should return the provided default arg for empty iterables.""" - self.assertEqual(mi.first([], 'boo'), 'boo') - - -class IterOnlyRange: - """User-defined iterable class which only support __iter__. - - It is not specified to inherit ``object``, so indexing on a instance will - raise an ``AttributeError`` rather than ``TypeError`` in Python 2. - - >>> r = IterOnlyRange(5) - >>> r[0] - AttributeError: IterOnlyRange instance has no attribute '__getitem__' - - Note: In Python 3, ``TypeError`` will be raised because ``object`` is - inherited implicitly by default. - - >>> r[0] - TypeError: 'IterOnlyRange' object does not support indexing - """ - def __init__(self, n): - """Set the length of the range.""" - self.n = n - - def __iter__(self): - """Works same as range().""" - return iter(range(self.n)) - - -class LastTests(TestCase): - """Tests for ``last()``""" - - def test_many_nonsliceable(self): - """Test that it works on many-item non-slice-able iterables.""" - # Also try it on a generator expression to make sure it works on - # whatever those return, across Python versions. - self.assertEqual(mi.last(x for x in range(4)), 3) - - def test_one_nonsliceable(self): - """Test that it doesn't raise StopIteration prematurely.""" - self.assertEqual(mi.last(x for x in range(1)), 0) - - def test_empty_stop_iteration_nonsliceable(self): - """It should raise ValueError for empty non-slice-able iterables.""" - self.assertRaises(ValueError, lambda: mi.last(x for x in range(0))) - - def test_default_nonsliceable(self): - """It should return the provided default arg for empty non-slice-able - iterables. - """ - self.assertEqual(mi.last((x for x in range(0)), 'boo'), 'boo') - - def test_many_sliceable(self): - """Test that it works on many-item slice-able iterables.""" - self.assertEqual(mi.last([0, 1, 2, 3]), 3) - - def test_one_sliceable(self): - """Test that it doesn't raise StopIteration prematurely.""" - self.assertEqual(mi.last([3]), 3) - - def test_empty_stop_iteration_sliceable(self): - """It should raise ValueError for empty slice-able iterables.""" - self.assertRaises(ValueError, lambda: mi.last([])) - - def test_default_sliceable(self): - """It should return the provided default arg for empty slice-able - iterables. - """ - self.assertEqual(mi.last([], 'boo'), 'boo') - - def test_dict(self): - """last(dic) and last(dic.keys()) should return same result.""" - dic = {'a': 1, 'b': 2, 'c': 3} - self.assertEqual(mi.last(dic), mi.last(dic.keys())) - - def test_ordereddict(self): - """last(dic) should return the last key.""" - od = OrderedDict() - od['a'] = 1 - od['b'] = 2 - od['c'] = 3 - self.assertEqual(mi.last(od), 'c') - - def test_customrange(self): - """It should work on custom class where [] raises AttributeError.""" - self.assertEqual(mi.last(IterOnlyRange(5)), 4) - - -class PeekableTests(TestCase): - """Tests for ``peekable()`` behavor not incidentally covered by testing - ``collate()`` - - """ - def test_peek_default(self): - """Make sure passing a default into ``peek()`` works.""" - p = mi.peekable([]) - self.assertEqual(p.peek(7), 7) - - def test_truthiness(self): - """Make sure a ``peekable`` tests true iff there are items remaining in - the iterable. - - """ - p = mi.peekable([]) - self.assertFalse(p) - - p = mi.peekable(range(3)) - self.assertTrue(p) - - def test_simple_peeking(self): - """Make sure ``next`` and ``peek`` advance and don't advance the - iterator, respectively. - - """ - p = mi.peekable(range(10)) - self.assertEqual(next(p), 0) - self.assertEqual(p.peek(), 1) - self.assertEqual(next(p), 1) - - def test_indexing(self): - """ - Indexing into the peekable shouldn't advance the iterator. - """ - p = mi.peekable('abcdefghijkl') - - # The 0th index is what ``next()`` will return - self.assertEqual(p[0], 'a') - self.assertEqual(next(p), 'a') - - # Indexing further into the peekable shouldn't advance the itertor - self.assertEqual(p[2], 'd') - self.assertEqual(next(p), 'b') - - # The 0th index moves up with the iterator; the last index follows - self.assertEqual(p[0], 'c') - self.assertEqual(p[9], 'l') - - self.assertEqual(next(p), 'c') - self.assertEqual(p[8], 'l') - - # Negative indexing should work too - self.assertEqual(p[-2], 'k') - self.assertEqual(p[-9], 'd') - self.assertRaises(IndexError, lambda: p[-10]) - - def test_slicing(self): - """Slicing the peekable shouldn't advance the iterator.""" - seq = list('abcdefghijkl') - p = mi.peekable(seq) - - # Slicing the peekable should just be like slicing a re-iterable - self.assertEqual(p[1:4], seq[1:4]) - - # Advancing the iterator moves the slices up also - self.assertEqual(next(p), 'a') - self.assertEqual(p[1:4], seq[1:][1:4]) - - # Implicit starts and stop should work - self.assertEqual(p[:5], seq[1:][:5]) - self.assertEqual(p[:], seq[1:][:]) - - # Indexing past the end should work - self.assertEqual(p[:100], seq[1:][:100]) - - # Steps should work, including negative - self.assertEqual(p[::2], seq[1:][::2]) - self.assertEqual(p[::-1], seq[1:][::-1]) - - def test_slicing_reset(self): - """Test slicing on a fresh iterable each time""" - iterable = ['0', '1', '2', '3', '4', '5'] - indexes = list(range(-4, len(iterable) + 4)) + [None] - steps = [1, 2, 3, 4, -1, -2, -3, 4] - for slice_args in product(indexes, indexes, steps): - it = iter(iterable) - p = mi.peekable(it) - next(p) - index = slice(*slice_args) - actual = p[index] - expected = iterable[1:][index] - self.assertEqual(actual, expected, slice_args) - - def test_slicing_error(self): - iterable = '01234567' - p = mi.peekable(iter(iterable)) - - # Prime the cache - p.peek() - old_cache = list(p._cache) - - # Illegal slice - with self.assertRaises(ValueError): - p[1:-1:0] - - # Neither the cache nor the iteration should be affected - self.assertEqual(old_cache, list(p._cache)) - self.assertEqual(list(p), list(iterable)) - - def test_passthrough(self): - """Iterating a peekable without using ``peek()`` or ``prepend()`` - should just give the underlying iterable's elements (a trivial test but - useful to set a baseline in case something goes wrong)""" - expected = [1, 2, 3, 4, 5] - actual = list(mi.peekable(expected)) - self.assertEqual(actual, expected) - - # prepend() behavior tests - - def test_prepend(self): - """Tests intersperesed ``prepend()`` and ``next()`` calls""" - it = mi.peekable(range(2)) - actual = [] - - # Test prepend() before next() - it.prepend(10) - actual += [next(it), next(it)] - - # Test prepend() between next()s - it.prepend(11) - actual += [next(it), next(it)] - - # Test prepend() after source iterable is consumed - it.prepend(12) - actual += [next(it)] - - expected = [10, 0, 11, 1, 12] - self.assertEqual(actual, expected) - - def test_multi_prepend(self): - """Tests prepending multiple items and getting them in proper order""" - it = mi.peekable(range(5)) - actual = [next(it), next(it)] - it.prepend(10, 11, 12) - it.prepend(20, 21) - actual += list(it) - expected = [0, 1, 20, 21, 10, 11, 12, 2, 3, 4] - self.assertEqual(actual, expected) - - def test_empty(self): - """Tests prepending in front of an empty iterable""" - it = mi.peekable([]) - it.prepend(10) - actual = list(it) - expected = [10] - self.assertEqual(actual, expected) - - def test_prepend_truthiness(self): - """Tests that ``__bool__()`` or ``__nonzero__()`` works properly - with ``prepend()``""" - it = mi.peekable(range(5)) - self.assertTrue(it) - actual = list(it) - self.assertFalse(it) - it.prepend(10) - self.assertTrue(it) - actual += [next(it)] - self.assertFalse(it) - expected = [0, 1, 2, 3, 4, 10] - self.assertEqual(actual, expected) - - def test_multi_prepend_peek(self): - """Tests prepending multiple elements and getting them in reverse order - while peeking""" - it = mi.peekable(range(5)) - actual = [next(it), next(it)] - self.assertEqual(it.peek(), 2) - it.prepend(10, 11, 12) - self.assertEqual(it.peek(), 10) - it.prepend(20, 21) - self.assertEqual(it.peek(), 20) - actual += list(it) - self.assertFalse(it) - expected = [0, 1, 20, 21, 10, 11, 12, 2, 3, 4] - self.assertEqual(actual, expected) - - def test_prepend_after_stop(self): - """Test resuming iteration after a previous exhaustion""" - it = mi.peekable(range(3)) - self.assertEqual(list(it), [0, 1, 2]) - self.assertRaises(StopIteration, lambda: next(it)) - it.prepend(10) - self.assertEqual(next(it), 10) - self.assertRaises(StopIteration, lambda: next(it)) - - def test_prepend_slicing(self): - """Tests interaction between prepending and slicing""" - seq = list(range(20)) - p = mi.peekable(seq) - - p.prepend(30, 40, 50) - pseq = [30, 40, 50] + seq # pseq for prepended_seq - - # adapt the specific tests from test_slicing - self.assertEqual(p[0], 30) - self.assertEqual(p[1:8], pseq[1:8]) - self.assertEqual(p[1:], pseq[1:]) - self.assertEqual(p[:5], pseq[:5]) - self.assertEqual(p[:], pseq[:]) - self.assertEqual(p[:100], pseq[:100]) - self.assertEqual(p[::2], pseq[::2]) - self.assertEqual(p[::-1], pseq[::-1]) - - def test_prepend_indexing(self): - """Tests interaction between prepending and indexing""" - seq = list(range(20)) - p = mi.peekable(seq) - - p.prepend(30, 40, 50) - - self.assertEqual(p[0], 30) - self.assertEqual(next(p), 30) - self.assertEqual(p[2], 0) - self.assertEqual(next(p), 40) - self.assertEqual(p[0], 50) - self.assertEqual(p[9], 8) - self.assertEqual(next(p), 50) - self.assertEqual(p[8], 8) - self.assertEqual(p[-2], 18) - self.assertEqual(p[-9], 11) - self.assertRaises(IndexError, lambda: p[-21]) - - def test_prepend_iterable(self): - """Tests prepending from an iterable""" - it = mi.peekable(range(5)) - # Don't directly use the range() object to avoid any range-specific - # optimizations - it.prepend(*(x for x in range(5))) - actual = list(it) - expected = list(chain(range(5), range(5))) - self.assertEqual(actual, expected) - - def test_prepend_many(self): - """Tests that prepending a huge number of elements works""" - it = mi.peekable(range(5)) - # Don't directly use the range() object to avoid any range-specific - # optimizations - it.prepend(*(x for x in range(20000))) - actual = list(it) - expected = list(chain(range(20000), range(5))) - self.assertEqual(actual, expected) - - def test_prepend_reversed(self): - """Tests prepending from a reversed iterable""" - it = mi.peekable(range(3)) - it.prepend(*reversed((10, 11, 12))) - actual = list(it) - expected = [12, 11, 10, 0, 1, 2] - self.assertEqual(actual, expected) - - -class ConsumerTests(TestCase): - """Tests for ``consumer()``""" - - def test_consumer(self): - @mi.consumer - def eater(): - while True: - x = yield # noqa - - e = eater() - e.send('hi') # without @consumer, would raise TypeError - - -class DistinctPermutationsTests(TestCase): - def test_distinct_permutations(self): - """Make sure the output for ``distinct_permutations()`` is the same as - set(permutations(it)). - - """ - iterable = ['z', 'a', 'a', 'q', 'q', 'q', 'y'] - test_output = sorted(mi.distinct_permutations(iterable)) - ref_output = sorted(set(permutations(iterable))) - self.assertEqual(test_output, ref_output) - - def test_other_iterables(self): - """Make sure ``distinct_permutations()`` accepts a different type of - iterables. - - """ - # a generator - iterable = (c for c in ['z', 'a', 'a', 'q', 'q', 'q', 'y']) - test_output = sorted(mi.distinct_permutations(iterable)) - # "reload" it - iterable = (c for c in ['z', 'a', 'a', 'q', 'q', 'q', 'y']) - ref_output = sorted(set(permutations(iterable))) - self.assertEqual(test_output, ref_output) - - # an iterator - iterable = iter(['z', 'a', 'a', 'q', 'q', 'q', 'y']) - test_output = sorted(mi.distinct_permutations(iterable)) - # "reload" it - iterable = iter(['z', 'a', 'a', 'q', 'q', 'q', 'y']) - ref_output = sorted(set(permutations(iterable))) - self.assertEqual(test_output, ref_output) - - -class IlenTests(TestCase): - def test_ilen(self): - """Sanity-checks for ``ilen()``.""" - # Non-empty - self.assertEqual( - mi.ilen(filter(lambda x: x % 10 == 0, range(101))), 11 - ) - - # Empty - self.assertEqual(mi.ilen((x for x in range(0))), 0) - - # Iterable with __len__ - self.assertEqual(mi.ilen(list(range(6))), 6) - - -class WithIterTests(TestCase): - def test_with_iter(self): - s = StringIO('One fish\nTwo fish') - initial_words = [line.split()[0] for line in mi.with_iter(s)] - - # Iterable's items should be faithfully represented - self.assertEqual(initial_words, ['One', 'Two']) - # The file object should be closed - self.assertEqual(s.closed, True) - - -class OneTests(TestCase): - def test_basic(self): - it = iter(['item']) - self.assertEqual(mi.one(it), 'item') - - def test_too_short(self): - it = iter([]) - self.assertRaises(ValueError, lambda: mi.one(it)) - self.assertRaises(IndexError, lambda: mi.one(it, too_short=IndexError)) - - def test_too_long(self): - it = count() - self.assertRaises(ValueError, lambda: mi.one(it)) # burn 0 and 1 - self.assertEqual(next(it), 2) - self.assertRaises( - OverflowError, lambda: mi.one(it, too_long=OverflowError) - ) - - -class IntersperseTest(TestCase): - """ Tests for intersperse() """ - - def test_even(self): - iterable = (x for x in '01') - self.assertEqual( - list(mi.intersperse(None, iterable)), ['0', None, '1'] - ) - - def test_odd(self): - iterable = (x for x in '012') - self.assertEqual( - list(mi.intersperse(None, iterable)), ['0', None, '1', None, '2'] - ) - - def test_nested(self): - element = ('a', 'b') - iterable = (x for x in '012') - actual = list(mi.intersperse(element, iterable)) - expected = ['0', ('a', 'b'), '1', ('a', 'b'), '2'] - self.assertEqual(actual, expected) - - def test_not_iterable(self): - self.assertRaises(TypeError, lambda: mi.intersperse('x', 1)) - - def test_n(self): - for n, element, expected in [ - (1, '_', ['0', '_', '1', '_', '2', '_', '3', '_', '4', '_', '5']), - (2, '_', ['0', '1', '_', '2', '3', '_', '4', '5']), - (3, '_', ['0', '1', '2', '_', '3', '4', '5']), - (4, '_', ['0', '1', '2', '3', '_', '4', '5']), - (5, '_', ['0', '1', '2', '3', '4', '_', '5']), - (6, '_', ['0', '1', '2', '3', '4', '5']), - (7, '_', ['0', '1', '2', '3', '4', '5']), - (3, ['a', 'b'], ['0', '1', '2', ['a', 'b'], '3', '4', '5']), - ]: - iterable = (x for x in '012345') - actual = list(mi.intersperse(element, iterable, n=n)) - self.assertEqual(actual, expected) - - def test_n_zero(self): - self.assertRaises( - ValueError, lambda: list(mi.intersperse('x', '012', n=0)) - ) - - -class UniqueToEachTests(TestCase): - """Tests for ``unique_to_each()``""" - - def test_all_unique(self): - """When all the input iterables are unique the output should match - the input.""" - iterables = [[1, 2], [3, 4, 5], [6, 7, 8]] - self.assertEqual(mi.unique_to_each(*iterables), iterables) - - def test_duplicates(self): - """When there are duplicates in any of the input iterables that aren't - in the rest, those duplicates should be emitted.""" - iterables = ["mississippi", "missouri"] - self.assertEqual( - mi.unique_to_each(*iterables), [['p', 'p'], ['o', 'u', 'r']] - ) - - def test_mixed(self): - """When the input iterables contain different types the function should - still behave properly""" - iterables = ['x', (i for i in range(3)), [1, 2, 3], tuple()] - self.assertEqual(mi.unique_to_each(*iterables), [['x'], [0], [3], []]) - - -class WindowedTests(TestCase): - """Tests for ``windowed()``""" - - def test_basic(self): - actual = list(mi.windowed([1, 2, 3, 4, 5], 3)) - expected = [(1, 2, 3), (2, 3, 4), (3, 4, 5)] - self.assertEqual(actual, expected) - - def test_large_size(self): - """ - When the window size is larger than the iterable, and no fill value is - given,``None`` should be filled in. - """ - actual = list(mi.windowed([1, 2, 3, 4, 5], 6)) - expected = [(1, 2, 3, 4, 5, None)] - self.assertEqual(actual, expected) - - def test_fillvalue(self): - """ - When sizes don't match evenly, the given fill value should be used. - """ - iterable = [1, 2, 3, 4, 5] - - for n, kwargs, expected in [ - (6, {}, [(1, 2, 3, 4, 5, '!')]), # n > len(iterable) - (3, {'step': 3}, [(1, 2, 3), (4, 5, '!')]), # using ``step`` - ]: - actual = list(mi.windowed(iterable, n, fillvalue='!', **kwargs)) - self.assertEqual(actual, expected) - - def test_zero(self): - """When the window size is zero, an empty tuple should be emitted.""" - actual = list(mi.windowed([1, 2, 3, 4, 5], 0)) - expected = [tuple()] - self.assertEqual(actual, expected) - - def test_negative(self): - """When the window size is negative, ValueError should be raised.""" - with self.assertRaises(ValueError): - list(mi.windowed([1, 2, 3, 4, 5], -1)) - - def test_step(self): - """The window should advance by the number of steps provided""" - iterable = [1, 2, 3, 4, 5, 6, 7] - for n, step, expected in [ - (3, 2, [(1, 2, 3), (3, 4, 5), (5, 6, 7)]), # n > step - (3, 3, [(1, 2, 3), (4, 5, 6), (7, None, None)]), # n == step - (3, 4, [(1, 2, 3), (5, 6, 7)]), # line up nicely - (3, 5, [(1, 2, 3), (6, 7, None)]), # off by one - (3, 6, [(1, 2, 3), (7, None, None)]), # off by two - (3, 7, [(1, 2, 3)]), # step past the end - (7, 8, [(1, 2, 3, 4, 5, 6, 7)]), # step > len(iterable) - ]: - actual = list(mi.windowed(iterable, n, step=step)) - self.assertEqual(actual, expected) - - # Step must be greater than or equal to 1 - with self.assertRaises(ValueError): - list(mi.windowed(iterable, 3, step=0)) - - -class BucketTests(TestCase): - """Tests for ``bucket()``""" - - def test_basic(self): - iterable = [10, 20, 30, 11, 21, 31, 12, 22, 23, 33] - D = mi.bucket(iterable, key=lambda x: 10 * (x // 10)) - - # In-order access - self.assertEqual(list(D[10]), [10, 11, 12]) - - # Out of order access - self.assertEqual(list(D[30]), [30, 31, 33]) - self.assertEqual(list(D[20]), [20, 21, 22, 23]) - - self.assertEqual(list(D[40]), []) # Nothing in here! - - def test_in(self): - iterable = [10, 20, 30, 11, 21, 31, 12, 22, 23, 33] - D = mi.bucket(iterable, key=lambda x: 10 * (x // 10)) - - self.assertTrue(10 in D) - self.assertFalse(40 in D) - self.assertTrue(20 in D) - self.assertFalse(21 in D) - - # Checking in-ness shouldn't advance the iterator - self.assertEqual(next(D[10]), 10) - - def test_validator(self): - iterable = count(0) - key = lambda x: int(str(x)[0]) # First digit of each number - validator = lambda x: 0 < x < 10 # No leading zeros - D = mi.bucket(iterable, key, validator=validator) - self.assertEqual(mi.take(3, D[1]), [1, 10, 11]) - self.assertNotIn(0, D) # Non-valid entries don't return True - self.assertNotIn(0, D._cache) # Don't store non-valid entries - self.assertEqual(list(D[0]), []) - - -class SpyTests(TestCase): - """Tests for ``spy()``""" - - def test_basic(self): - original_iterable = iter('abcdefg') - head, new_iterable = mi.spy(original_iterable) - self.assertEqual(head, ['a']) - self.assertEqual( - list(new_iterable), ['a', 'b', 'c', 'd', 'e', 'f', 'g'] - ) - - def test_unpacking(self): - original_iterable = iter('abcdefg') - (first, second, third), new_iterable = mi.spy(original_iterable, 3) - self.assertEqual(first, 'a') - self.assertEqual(second, 'b') - self.assertEqual(third, 'c') - self.assertEqual( - list(new_iterable), ['a', 'b', 'c', 'd', 'e', 'f', 'g'] - ) - - def test_too_many(self): - original_iterable = iter('abc') - head, new_iterable = mi.spy(original_iterable, 4) - self.assertEqual(head, ['a', 'b', 'c']) - self.assertEqual(list(new_iterable), ['a', 'b', 'c']) - - def test_zero(self): - original_iterable = iter('abc') - head, new_iterable = mi.spy(original_iterable, 0) - self.assertEqual(head, []) - self.assertEqual(list(new_iterable), ['a', 'b', 'c']) - - -class InterleaveTests(TestCase): - def test_even(self): - actual = list(mi.interleave([1, 4, 7], [2, 5, 8], [3, 6, 9])) - expected = [1, 2, 3, 4, 5, 6, 7, 8, 9] - self.assertEqual(actual, expected) - - def test_short(self): - actual = list(mi.interleave([1, 4], [2, 5, 7], [3, 6, 8])) - expected = [1, 2, 3, 4, 5, 6] - self.assertEqual(actual, expected) - - def test_mixed_types(self): - it_list = ['a', 'b', 'c', 'd'] - it_str = '12345' - it_inf = count() - actual = list(mi.interleave(it_list, it_str, it_inf)) - expected = ['a', '1', 0, 'b', '2', 1, 'c', '3', 2, 'd', '4', 3] - self.assertEqual(actual, expected) - - -class InterleaveLongestTests(TestCase): - def test_even(self): - actual = list(mi.interleave_longest([1, 4, 7], [2, 5, 8], [3, 6, 9])) - expected = [1, 2, 3, 4, 5, 6, 7, 8, 9] - self.assertEqual(actual, expected) - - def test_short(self): - actual = list(mi.interleave_longest([1, 4], [2, 5, 7], [3, 6, 8])) - expected = [1, 2, 3, 4, 5, 6, 7, 8] - self.assertEqual(actual, expected) - - def test_mixed_types(self): - it_list = ['a', 'b', 'c', 'd'] - it_str = '12345' - it_gen = (x for x in range(3)) - actual = list(mi.interleave_longest(it_list, it_str, it_gen)) - expected = ['a', '1', 0, 'b', '2', 1, 'c', '3', 2, 'd', '4', '5'] - self.assertEqual(actual, expected) - - -class TestCollapse(TestCase): - """Tests for ``collapse()``""" - - def test_collapse(self): - l = [[1], 2, [[3], 4], [[[5]]]] - self.assertEqual(list(mi.collapse(l)), [1, 2, 3, 4, 5]) - - def test_collapse_to_string(self): - l = [["s1"], "s2", [["s3"], "s4"], [[["s5"]]]] - self.assertEqual(list(mi.collapse(l)), ["s1", "s2", "s3", "s4", "s5"]) - - def test_collapse_flatten(self): - l = [[1], [2], [[3], 4], [[[5]]]] - self.assertEqual(list(mi.collapse(l, levels=1)), list(mi.flatten(l))) - - def test_collapse_to_level(self): - l = [[1], 2, [[3], 4], [[[5]]]] - self.assertEqual(list(mi.collapse(l, levels=2)), [1, 2, 3, 4, [5]]) - self.assertEqual( - list(mi.collapse(mi.collapse(l, levels=1), levels=1)), - list(mi.collapse(l, levels=2)) - ) - - def test_collapse_to_list(self): - l = (1, [2], (3, [4, (5,)], 'ab')) - actual = list(mi.collapse(l, base_type=list)) - expected = [1, [2], 3, [4, (5,)], 'ab'] - self.assertEqual(actual, expected) - - -class SideEffectTests(TestCase): - """Tests for ``side_effect()``""" - - def test_individual(self): - # The function increments the counter for each call - counter = [0] - - def func(arg): - counter[0] += 1 - - result = list(mi.side_effect(func, range(10))) - self.assertEqual(result, list(range(10))) - self.assertEqual(counter[0], 10) - - def test_chunked(self): - # The function increments the counter for each call - counter = [0] - - def func(arg): - counter[0] += 1 - - result = list(mi.side_effect(func, range(10), 2)) - self.assertEqual(result, list(range(10))) - self.assertEqual(counter[0], 5) - - def test_before_after(self): - f = StringIO() - collector = [] - - def func(item): - print(item, file=f) - collector.append(f.getvalue()) - - def it(): - yield u'a' - yield u'b' - raise RuntimeError('kaboom') - - before = lambda: print('HEADER', file=f) - after = f.close - - try: - mi.consume(mi.side_effect(func, it(), before=before, after=after)) - except RuntimeError: - pass - - # The iterable should have been written to the file - self.assertEqual(collector, [u'HEADER\na\n', u'HEADER\na\nb\n']) - - # The file should be closed even though something bad happened - self.assertTrue(f.closed) - - def test_before_fails(self): - f = StringIO() - func = lambda x: print(x, file=f) - - def before(): - raise RuntimeError('ouch') - - try: - mi.consume( - mi.side_effect(func, u'abc', before=before, after=f.close) - ) - except RuntimeError: - pass - - # The file should be closed even though something bad happened in the - # before function - self.assertTrue(f.closed) - - -class SlicedTests(TestCase): - """Tests for ``sliced()``""" - - def test_even(self): - """Test when the length of the sequence is divisible by *n*""" - seq = 'ABCDEFGHI' - self.assertEqual(list(mi.sliced(seq, 3)), ['ABC', 'DEF', 'GHI']) - - def test_odd(self): - """Test when the length of the sequence is not divisible by *n*""" - seq = 'ABCDEFGHI' - self.assertEqual(list(mi.sliced(seq, 4)), ['ABCD', 'EFGH', 'I']) - - def test_not_sliceable(self): - seq = (x for x in 'ABCDEFGHI') - - with self.assertRaises(TypeError): - list(mi.sliced(seq, 3)) - - -class SplitAtTests(TestCase): - """Tests for ``split()``""" - - def comp_with_str_split(self, str_to_split, delim): - pred = lambda c: c == delim - actual = list(map(''.join, mi.split_at(str_to_split, pred))) - expected = str_to_split.split(delim) - self.assertEqual(actual, expected) - - def test_seperators(self): - test_strs = ['', 'abcba', 'aaabbbcccddd', 'e'] - for s, delim in product(test_strs, 'abcd'): - self.comp_with_str_split(s, delim) - - -class SplitBeforeTest(TestCase): - """Tests for ``split_before()``""" - - def test_starts_with_sep(self): - actual = list(mi.split_before('xooxoo', lambda c: c == 'x')) - expected = [['x', 'o', 'o'], ['x', 'o', 'o']] - self.assertEqual(actual, expected) - - def test_ends_with_sep(self): - actual = list(mi.split_before('ooxoox', lambda c: c == 'x')) - expected = [['o', 'o'], ['x', 'o', 'o'], ['x']] - self.assertEqual(actual, expected) - - def test_no_sep(self): - actual = list(mi.split_before('ooo', lambda c: c == 'x')) - expected = [['o', 'o', 'o']] - self.assertEqual(actual, expected) - - -class SplitAfterTest(TestCase): - """Tests for ``split_after()``""" - - def test_starts_with_sep(self): - actual = list(mi.split_after('xooxoo', lambda c: c == 'x')) - expected = [['x'], ['o', 'o', 'x'], ['o', 'o']] - self.assertEqual(actual, expected) - - def test_ends_with_sep(self): - actual = list(mi.split_after('ooxoox', lambda c: c == 'x')) - expected = [['o', 'o', 'x'], ['o', 'o', 'x']] - self.assertEqual(actual, expected) - - def test_no_sep(self): - actual = list(mi.split_after('ooo', lambda c: c == 'x')) - expected = [['o', 'o', 'o']] - self.assertEqual(actual, expected) - - -class PaddedTest(TestCase): - """Tests for ``padded()``""" - - def test_no_n(self): - seq = [1, 2, 3] - - # No fillvalue - self.assertEqual(mi.take(5, mi.padded(seq)), [1, 2, 3, None, None]) - - # With fillvalue - self.assertEqual( - mi.take(5, mi.padded(seq, fillvalue='')), [1, 2, 3, '', ''] - ) - - def test_invalid_n(self): - self.assertRaises(ValueError, lambda: list(mi.padded([1, 2, 3], n=-1))) - self.assertRaises(ValueError, lambda: list(mi.padded([1, 2, 3], n=0))) - - def test_valid_n(self): - seq = [1, 2, 3, 4, 5] - - # No need for padding: len(seq) <= n - self.assertEqual(list(mi.padded(seq, n=4)), [1, 2, 3, 4, 5]) - self.assertEqual(list(mi.padded(seq, n=5)), [1, 2, 3, 4, 5]) - - # No fillvalue - self.assertEqual( - list(mi.padded(seq, n=7)), [1, 2, 3, 4, 5, None, None] - ) - - # With fillvalue - self.assertEqual( - list(mi.padded(seq, fillvalue='', n=7)), [1, 2, 3, 4, 5, '', ''] - ) - - def test_next_multiple(self): - seq = [1, 2, 3, 4, 5, 6] - - # No need for padding: len(seq) % n == 0 - self.assertEqual( - list(mi.padded(seq, n=3, next_multiple=True)), [1, 2, 3, 4, 5, 6] - ) - - # Padding needed: len(seq) < n - self.assertEqual( - list(mi.padded(seq, n=8, next_multiple=True)), - [1, 2, 3, 4, 5, 6, None, None] - ) - - # No padding needed: len(seq) == n - self.assertEqual( - list(mi.padded(seq, n=6, next_multiple=True)), [1, 2, 3, 4, 5, 6] - ) - - # Padding needed: len(seq) > n - self.assertEqual( - list(mi.padded(seq, n=4, next_multiple=True)), - [1, 2, 3, 4, 5, 6, None, None] - ) - - # With fillvalue - self.assertEqual( - list(mi.padded(seq, fillvalue='', n=4, next_multiple=True)), - [1, 2, 3, 4, 5, 6, '', ''] - ) - - -class DistributeTest(TestCase): - """Tests for distribute()""" - - def test_invalid_n(self): - self.assertRaises(ValueError, lambda: mi.distribute(-1, [1, 2, 3])) - self.assertRaises(ValueError, lambda: mi.distribute(0, [1, 2, 3])) - - def test_basic(self): - iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - - for n, expected in [ - (1, [iterable]), - (2, [[1, 3, 5, 7, 9], [2, 4, 6, 8, 10]]), - (3, [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]]), - (10, [[n] for n in range(1, 10 + 1)]), - ]: - self.assertEqual( - [list(x) for x in mi.distribute(n, iterable)], expected - ) - - def test_large_n(self): - iterable = [1, 2, 3, 4] - self.assertEqual( - [list(x) for x in mi.distribute(6, iterable)], - [[1], [2], [3], [4], [], []] - ) - - -class StaggerTest(TestCase): - """Tests for ``stagger()``""" - - def test_default(self): - iterable = [0, 1, 2, 3] - actual = list(mi.stagger(iterable)) - expected = [(None, 0, 1), (0, 1, 2), (1, 2, 3)] - self.assertEqual(actual, expected) - - def test_offsets(self): - iterable = [0, 1, 2, 3] - for offsets, expected in [ - ((-2, 0, 2), [('', 0, 2), ('', 1, 3)]), - ((-2, -1), [('', ''), ('', 0), (0, 1), (1, 2), (2, 3)]), - ((1, 2), [(1, 2), (2, 3)]), - ]: - all_groups = mi.stagger(iterable, offsets=offsets, fillvalue='') - self.assertEqual(list(all_groups), expected) - - def test_longest(self): - iterable = [0, 1, 2, 3] - for offsets, expected in [ - ( - (-1, 0, 1), - [('', 0, 1), (0, 1, 2), (1, 2, 3), (2, 3, ''), (3, '', '')] - ), - ((-2, -1), [('', ''), ('', 0), (0, 1), (1, 2), (2, 3), (3, '')]), - ((1, 2), [(1, 2), (2, 3), (3, '')]), - ]: - all_groups = mi.stagger( - iterable, offsets=offsets, fillvalue='', longest=True - ) - self.assertEqual(list(all_groups), expected) - - -class ZipOffsetTest(TestCase): - """Tests for ``zip_offset()``""" - - def test_shortest(self): - a_1 = [0, 1, 2, 3] - a_2 = [0, 1, 2, 3, 4, 5] - a_3 = [0, 1, 2, 3, 4, 5, 6, 7] - actual = list( - mi.zip_offset(a_1, a_2, a_3, offsets=(-1, 0, 1), fillvalue='') - ) - expected = [('', 0, 1), (0, 1, 2), (1, 2, 3), (2, 3, 4), (3, 4, 5)] - self.assertEqual(actual, expected) - - def test_longest(self): - a_1 = [0, 1, 2, 3] - a_2 = [0, 1, 2, 3, 4, 5] - a_3 = [0, 1, 2, 3, 4, 5, 6, 7] - actual = list( - mi.zip_offset(a_1, a_2, a_3, offsets=(-1, 0, 1), longest=True) - ) - expected = [ - (None, 0, 1), - (0, 1, 2), - (1, 2, 3), - (2, 3, 4), - (3, 4, 5), - (None, 5, 6), - (None, None, 7), - ] - self.assertEqual(actual, expected) - - def test_mismatch(self): - iterables = [0, 1, 2], [2, 3, 4] - offsets = (-1, 0, 1) - self.assertRaises( - ValueError, - lambda: list(mi.zip_offset(*iterables, offsets=offsets)) - ) - - -class SortTogetherTest(TestCase): - """Tests for sort_together()""" - - def test_key_list(self): - """tests `key_list` including default, iterables include duplicates""" - iterables = [ - ['GA', 'GA', 'GA', 'CT', 'CT', 'CT'], - ['May', 'Aug.', 'May', 'June', 'July', 'July'], - [97, 20, 100, 70, 100, 20] - ] - - self.assertEqual( - mi.sort_together(iterables), - [ - ('CT', 'CT', 'CT', 'GA', 'GA', 'GA'), - ('June', 'July', 'July', 'May', 'Aug.', 'May'), - (70, 100, 20, 97, 20, 100) - ] - ) - - self.assertEqual( - mi.sort_together(iterables, key_list=(0, 1)), - [ - ('CT', 'CT', 'CT', 'GA', 'GA', 'GA'), - ('July', 'July', 'June', 'Aug.', 'May', 'May'), - (100, 20, 70, 20, 97, 100) - ] - ) - - self.assertEqual( - mi.sort_together(iterables, key_list=(0, 1, 2)), - [ - ('CT', 'CT', 'CT', 'GA', 'GA', 'GA'), - ('July', 'July', 'June', 'Aug.', 'May', 'May'), - (20, 100, 70, 20, 97, 100) - ] - ) - - self.assertEqual( - mi.sort_together(iterables, key_list=(2,)), - [ - ('GA', 'CT', 'CT', 'GA', 'GA', 'CT'), - ('Aug.', 'July', 'June', 'May', 'May', 'July'), - (20, 20, 70, 97, 100, 100) - ] - ) - - def test_invalid_key_list(self): - """tests `key_list` for indexes not available in `iterables`""" - iterables = [ - ['GA', 'GA', 'GA', 'CT', 'CT', 'CT'], - ['May', 'Aug.', 'May', 'June', 'July', 'July'], - [97, 20, 100, 70, 100, 20] - ] - - self.assertRaises( - IndexError, lambda: mi.sort_together(iterables, key_list=(5,)) - ) - - def test_reverse(self): - """tests `reverse` to ensure a reverse sort for `key_list` iterables""" - iterables = [ - ['GA', 'GA', 'GA', 'CT', 'CT', 'CT'], - ['May', 'Aug.', 'May', 'June', 'July', 'July'], - [97, 20, 100, 70, 100, 20] - ] - - self.assertEqual( - mi.sort_together(iterables, key_list=(0, 1, 2), reverse=True), - [('GA', 'GA', 'GA', 'CT', 'CT', 'CT'), - ('May', 'May', 'Aug.', 'June', 'July', 'July'), - (100, 97, 20, 70, 100, 20)] - ) - - def test_uneven_iterables(self): - """tests trimming of iterables to the shortest length before sorting""" - iterables = [['GA', 'GA', 'GA', 'CT', 'CT', 'CT', 'MA'], - ['May', 'Aug.', 'May', 'June', 'July', 'July'], - [97, 20, 100, 70, 100, 20, 0]] - - self.assertEqual( - mi.sort_together(iterables), - [ - ('CT', 'CT', 'CT', 'GA', 'GA', 'GA'), - ('June', 'July', 'July', 'May', 'Aug.', 'May'), - (70, 100, 20, 97, 20, 100) - ] - ) - - -class DivideTest(TestCase): - """Tests for divide()""" - - def test_invalid_n(self): - self.assertRaises(ValueError, lambda: mi.divide(-1, [1, 2, 3])) - self.assertRaises(ValueError, lambda: mi.divide(0, [1, 2, 3])) - - def test_basic(self): - iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - - for n, expected in [ - (1, [iterable]), - (2, [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]), - (3, [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]), - (10, [[n] for n in range(1, 10 + 1)]), - ]: - self.assertEqual( - [list(x) for x in mi.divide(n, iterable)], expected - ) - - def test_large_n(self): - iterable = [1, 2, 3, 4] - self.assertEqual( - [list(x) for x in mi.divide(6, iterable)], - [[1], [2], [3], [4], [], []] - ) - - -class TestAlwaysIterable(TestCase): - """Tests for always_iterable()""" - def test_single(self): - self.assertEqual(list(mi.always_iterable(1)), [1]) - - def test_strings(self): - for obj in ['foo', b'bar', u'baz']: - actual = list(mi.always_iterable(obj)) - expected = [obj] - self.assertEqual(actual, expected) - - def test_base_type(self): - dict_obj = {'a': 1, 'b': 2} - str_obj = '123' - - # Default: dicts are iterable like they normally are - default_actual = list(mi.always_iterable(dict_obj)) - default_expected = list(dict_obj) - self.assertEqual(default_actual, default_expected) - - # Unitary types set: dicts are not iterable - custom_actual = list(mi.always_iterable(dict_obj, base_type=dict)) - custom_expected = [dict_obj] - self.assertEqual(custom_actual, custom_expected) - - # With unitary types set, strings are iterable - str_actual = list(mi.always_iterable(str_obj, base_type=None)) - str_expected = list(str_obj) - self.assertEqual(str_actual, str_expected) - - def test_iterables(self): - self.assertEqual(list(mi.always_iterable([0, 1])), [0, 1]) - self.assertEqual( - list(mi.always_iterable([0, 1], base_type=list)), [[0, 1]] - ) - self.assertEqual( - list(mi.always_iterable(iter('foo'))), ['f', 'o', 'o'] - ) - self.assertEqual(list(mi.always_iterable([])), []) - - def test_none(self): - self.assertEqual(list(mi.always_iterable(None)), []) - - def test_generator(self): - def _gen(): - yield 0 - yield 1 - - self.assertEqual(list(mi.always_iterable(_gen())), [0, 1]) - - -class AdjacentTests(TestCase): - def test_typical(self): - actual = list(mi.adjacent(lambda x: x % 5 == 0, range(10))) - expected = [(True, 0), (True, 1), (False, 2), (False, 3), (True, 4), - (True, 5), (True, 6), (False, 7), (False, 8), (False, 9)] - self.assertEqual(actual, expected) - - def test_empty_iterable(self): - actual = list(mi.adjacent(lambda x: x % 5 == 0, [])) - expected = [] - self.assertEqual(actual, expected) - - def test_length_one(self): - actual = list(mi.adjacent(lambda x: x % 5 == 0, [0])) - expected = [(True, 0)] - self.assertEqual(actual, expected) - - actual = list(mi.adjacent(lambda x: x % 5 == 0, [1])) - expected = [(False, 1)] - self.assertEqual(actual, expected) - - def test_consecutive_true(self): - """Test that when the predicate matches multiple consecutive elements - it doesn't repeat elements in the output""" - actual = list(mi.adjacent(lambda x: x % 5 < 2, range(10))) - expected = [(True, 0), (True, 1), (True, 2), (False, 3), (True, 4), - (True, 5), (True, 6), (True, 7), (False, 8), (False, 9)] - self.assertEqual(actual, expected) - - def test_distance(self): - actual = list(mi.adjacent(lambda x: x % 5 == 0, range(10), distance=2)) - expected = [(True, 0), (True, 1), (True, 2), (True, 3), (True, 4), - (True, 5), (True, 6), (True, 7), (False, 8), (False, 9)] - self.assertEqual(actual, expected) - - actual = list(mi.adjacent(lambda x: x % 5 == 0, range(10), distance=3)) - expected = [(True, 0), (True, 1), (True, 2), (True, 3), (True, 4), - (True, 5), (True, 6), (True, 7), (True, 8), (False, 9)] - self.assertEqual(actual, expected) - - def test_large_distance(self): - """Test distance larger than the length of the iterable""" - iterable = range(10) - actual = list(mi.adjacent(lambda x: x % 5 == 4, iterable, distance=20)) - expected = list(zip(repeat(True), iterable)) - self.assertEqual(actual, expected) - - actual = list(mi.adjacent(lambda x: False, iterable, distance=20)) - expected = list(zip(repeat(False), iterable)) - self.assertEqual(actual, expected) - - def test_zero_distance(self): - """Test that adjacent() reduces to zip+map when distance is 0""" - iterable = range(1000) - predicate = lambda x: x % 4 == 2 - actual = mi.adjacent(predicate, iterable, 0) - expected = zip(map(predicate, iterable), iterable) - self.assertTrue(all(a == e for a, e in zip(actual, expected))) - - def test_negative_distance(self): - """Test that adjacent() raises an error with negative distance""" - pred = lambda x: x - self.assertRaises( - ValueError, lambda: mi.adjacent(pred, range(1000), -1) - ) - self.assertRaises( - ValueError, lambda: mi.adjacent(pred, range(10), -10) - ) - - def test_grouping(self): - """Test interaction of adjacent() with groupby_transform()""" - iterable = mi.adjacent(lambda x: x % 5 == 0, range(10)) - grouper = mi.groupby_transform(iterable, itemgetter(0), itemgetter(1)) - actual = [(k, list(g)) for k, g in grouper] - expected = [ - (True, [0, 1]), - (False, [2, 3]), - (True, [4, 5, 6]), - (False, [7, 8, 9]), - ] - self.assertEqual(actual, expected) - - def test_call_once(self): - """Test that the predicate is only called once per item.""" - already_seen = set() - iterable = range(10) - - def predicate(item): - self.assertNotIn(item, already_seen) - already_seen.add(item) - return True - - actual = list(mi.adjacent(predicate, iterable)) - expected = [(True, x) for x in iterable] - self.assertEqual(actual, expected) - - -class GroupByTransformTests(TestCase): - def assertAllGroupsEqual(self, groupby1, groupby2): - """Compare two groupby objects for equality, both keys and groups.""" - for a, b in zip(groupby1, groupby2): - key1, group1 = a - key2, group2 = b - self.assertEqual(key1, key2) - self.assertListEqual(list(group1), list(group2)) - self.assertRaises(StopIteration, lambda: next(groupby1)) - self.assertRaises(StopIteration, lambda: next(groupby2)) - - def test_default_funcs(self): - """Test that groupby_transform() with default args mimics groupby()""" - iterable = [(x // 5, x) for x in range(1000)] - actual = mi.groupby_transform(iterable) - expected = groupby(iterable) - self.assertAllGroupsEqual(actual, expected) - - def test_valuefunc(self): - iterable = [(int(x / 5), int(x / 3), x) for x in range(10)] - - # Test the standard usage of grouping one iterable using another's keys - grouper = mi.groupby_transform( - iterable, keyfunc=itemgetter(0), valuefunc=itemgetter(-1) - ) - actual = [(k, list(g)) for k, g in grouper] - expected = [(0, [0, 1, 2, 3, 4]), (1, [5, 6, 7, 8, 9])] - self.assertEqual(actual, expected) - - grouper = mi.groupby_transform( - iterable, keyfunc=itemgetter(1), valuefunc=itemgetter(-1) - ) - actual = [(k, list(g)) for k, g in grouper] - expected = [(0, [0, 1, 2]), (1, [3, 4, 5]), (2, [6, 7, 8]), (3, [9])] - self.assertEqual(actual, expected) - - # and now for something a little different - d = dict(zip(range(10), 'abcdefghij')) - grouper = mi.groupby_transform( - range(10), keyfunc=lambda x: x // 5, valuefunc=d.get - ) - actual = [(k, ''.join(g)) for k, g in grouper] - expected = [(0, 'abcde'), (1, 'fghij')] - self.assertEqual(actual, expected) - - def test_no_valuefunc(self): - iterable = range(1000) - - def key(x): - return x // 5 - - actual = mi.groupby_transform(iterable, key, valuefunc=None) - expected = groupby(iterable, key) - self.assertAllGroupsEqual(actual, expected) - - actual = mi.groupby_transform(iterable, key) # default valuefunc - expected = groupby(iterable, key) - self.assertAllGroupsEqual(actual, expected) - - -class NumericRangeTests(TestCase): - def test_basic(self): - for args, expected in [ - ((4,), [0, 1, 2, 3]), - ((4.0,), [0.0, 1.0, 2.0, 3.0]), - ((1.0, 4), [1.0, 2.0, 3.0]), - ((1, 4.0), [1, 2, 3]), - ((1.0, 5), [1.0, 2.0, 3.0, 4.0]), - ((0, 20, 5), [0, 5, 10, 15]), - ((0, 20, 5.0), [0.0, 5.0, 10.0, 15.0]), - ((0, 10, 3), [0, 3, 6, 9]), - ((0, 10, 3.0), [0.0, 3.0, 6.0, 9.0]), - ((0, -5, -1), [0, -1, -2, -3, -4]), - ((0.0, -5, -1), [0.0, -1.0, -2.0, -3.0, -4.0]), - ((1, 2, Fraction(1, 2)), [Fraction(1, 1), Fraction(3, 2)]), - ((0,), []), - ((0.0,), []), - ((1, 0), []), - ((1.0, 0.0), []), - ((Fraction(2, 1),), [Fraction(0, 1), Fraction(1, 1)]), - ((Decimal('2.0'),), [Decimal('0.0'), Decimal('1.0')]), - ]: - actual = list(mi.numeric_range(*args)) - self.assertEqual(actual, expected) - self.assertTrue( - all(type(a) == type(e) for a, e in zip(actual, expected)) - ) - - def test_arg_count(self): - self.assertRaises(TypeError, lambda: list(mi.numeric_range())) - self.assertRaises( - TypeError, lambda: list(mi.numeric_range(0, 1, 2, 3)) - ) - - def test_zero_step(self): - self.assertRaises( - ValueError, lambda: list(mi.numeric_range(1, 2, 0)) - ) - - -class CountCycleTests(TestCase): - def test_basic(self): - expected = [ - (0, 'a'), (0, 'b'), (0, 'c'), - (1, 'a'), (1, 'b'), (1, 'c'), - (2, 'a'), (2, 'b'), (2, 'c'), - ] - for actual in [ - mi.take(9, mi.count_cycle('abc')), # n=None - list(mi.count_cycle('abc', 3)), # n=3 - ]: - self.assertEqual(actual, expected) - - def test_empty(self): - self.assertEqual(list(mi.count_cycle('')), []) - self.assertEqual(list(mi.count_cycle('', 2)), []) - - def test_negative(self): - self.assertEqual(list(mi.count_cycle('abc', -3)), []) - - -class LocateTests(TestCase): - def test_default_pred(self): - iterable = [0, 1, 1, 0, 1, 0, 0] - actual = list(mi.locate(iterable)) - expected = [1, 2, 4] - self.assertEqual(actual, expected) - - def test_no_matches(self): - iterable = [0, 0, 0] - actual = list(mi.locate(iterable)) - expected = [] - self.assertEqual(actual, expected) - - def test_custom_pred(self): - iterable = ['0', 1, 1, '0', 1, '0', '0'] - pred = lambda x: x == '0' - actual = list(mi.locate(iterable, pred)) - expected = [0, 3, 5, 6] - self.assertEqual(actual, expected) - - def test_window_size(self): - iterable = ['0', 1, 1, '0', 1, '0', '0'] - pred = lambda *args: args == ('0', 1) - actual = list(mi.locate(iterable, pred, window_size=2)) - expected = [0, 3] - self.assertEqual(actual, expected) - - def test_window_size_large(self): - iterable = [1, 2, 3, 4] - pred = lambda a, b, c, d, e: True - actual = list(mi.locate(iterable, pred, window_size=5)) - expected = [0] - self.assertEqual(actual, expected) - - def test_window_size_zero(self): - iterable = [1, 2, 3, 4] - pred = lambda: True - with self.assertRaises(ValueError): - list(mi.locate(iterable, pred, window_size=0)) - - -class StripFunctionTests(TestCase): - def test_hashable(self): - iterable = list('www.example.com') - pred = lambda x: x in set('cmowz.') - - self.assertEqual(list(mi.lstrip(iterable, pred)), list('example.com')) - self.assertEqual(list(mi.rstrip(iterable, pred)), list('www.example')) - self.assertEqual(list(mi.strip(iterable, pred)), list('example')) - - def test_not_hashable(self): - iterable = [ - list('http://'), list('www'), list('.example'), list('.com') - ] - pred = lambda x: x in [list('http://'), list('www'), list('.com')] - - self.assertEqual(list(mi.lstrip(iterable, pred)), iterable[2:]) - self.assertEqual(list(mi.rstrip(iterable, pred)), iterable[:3]) - self.assertEqual(list(mi.strip(iterable, pred)), iterable[2: 3]) - - def test_math(self): - iterable = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2] - pred = lambda x: x <= 2 - - self.assertEqual(list(mi.lstrip(iterable, pred)), iterable[3:]) - self.assertEqual(list(mi.rstrip(iterable, pred)), iterable[:-3]) - self.assertEqual(list(mi.strip(iterable, pred)), iterable[3:-3]) - - -class IsliceExtendedTests(TestCase): - def test_all(self): - iterable = ['0', '1', '2', '3', '4', '5'] - indexes = list(range(-4, len(iterable) + 4)) + [None] - steps = [1, 2, 3, 4, -1, -2, -3, 4] - for slice_args in product(indexes, indexes, steps): - try: - actual = list(mi.islice_extended(iterable, *slice_args)) - except Exception as e: - self.fail((slice_args, e)) - - expected = iterable[slice(*slice_args)] - self.assertEqual(actual, expected, slice_args) - - def test_zero_step(self): - with self.assertRaises(ValueError): - list(mi.islice_extended([1, 2, 3], 0, 1, 0)) - - -class ConsecutiveGroupsTest(TestCase): - def test_numbers(self): - iterable = [-10, -8, -7, -6, 1, 2, 4, 5, -1, 7] - actual = [list(g) for g in mi.consecutive_groups(iterable)] - expected = [[-10], [-8, -7, -6], [1, 2], [4, 5], [-1], [7]] - self.assertEqual(actual, expected) - - def test_custom_ordering(self): - iterable = ['1', '10', '11', '20', '21', '22', '30', '31'] - ordering = lambda x: int(x) - actual = [list(g) for g in mi.consecutive_groups(iterable, ordering)] - expected = [['1'], ['10', '11'], ['20', '21', '22'], ['30', '31']] - self.assertEqual(actual, expected) - - def test_exotic_ordering(self): - iterable = [ - ('a', 'b', 'c', 'd'), - ('a', 'c', 'b', 'd'), - ('a', 'c', 'd', 'b'), - ('a', 'd', 'b', 'c'), - ('d', 'b', 'c', 'a'), - ('d', 'c', 'a', 'b'), - ] - ordering = list(permutations('abcd')).index - actual = [list(g) for g in mi.consecutive_groups(iterable, ordering)] - expected = [ - [('a', 'b', 'c', 'd')], - [('a', 'c', 'b', 'd'), ('a', 'c', 'd', 'b'), ('a', 'd', 'b', 'c')], - [('d', 'b', 'c', 'a'), ('d', 'c', 'a', 'b')], - ] - self.assertEqual(actual, expected) - - -class DifferenceTest(TestCase): - def test_normal(self): - iterable = [10, 20, 30, 40, 50] - actual = list(mi.difference(iterable)) - expected = [10, 10, 10, 10, 10] - self.assertEqual(actual, expected) - - def test_custom(self): - iterable = [10, 20, 30, 40, 50] - actual = list(mi.difference(iterable, add)) - expected = [10, 30, 50, 70, 90] - self.assertEqual(actual, expected) - - def test_roundtrip(self): - original = list(range(100)) - accumulated = mi.accumulate(original) - actual = list(mi.difference(accumulated)) - self.assertEqual(actual, original) - - def test_one(self): - self.assertEqual(list(mi.difference([0])), [0]) - - def test_empty(self): - self.assertEqual(list(mi.difference([])), []) - - -class SeekableTest(TestCase): - def test_exhaustion_reset(self): - iterable = [str(n) for n in range(10)] - - s = mi.seekable(iterable) - self.assertEqual(list(s), iterable) # Normal iteration - self.assertEqual(list(s), []) # Iterable is exhausted - - s.seek(0) - self.assertEqual(list(s), iterable) # Back in action - - def test_partial_reset(self): - iterable = [str(n) for n in range(10)] - - s = mi.seekable(iterable) - self.assertEqual(mi.take(5, s), iterable[:5]) # Normal iteration - - s.seek(1) - self.assertEqual(list(s), iterable[1:]) # Get the rest of the iterable - - def test_forward(self): - iterable = [str(n) for n in range(10)] - - s = mi.seekable(iterable) - self.assertEqual(mi.take(1, s), iterable[:1]) # Normal iteration - - s.seek(3) # Skip over index 2 - self.assertEqual(list(s), iterable[3:]) # Result is similar to slicing - - s.seek(0) # Back to 0 - self.assertEqual(list(s), iterable) # No difference in result - - def test_past_end(self): - iterable = [str(n) for n in range(10)] - - s = mi.seekable(iterable) - self.assertEqual(mi.take(1, s), iterable[:1]) # Normal iteration - - s.seek(20) - self.assertEqual(list(s), []) # Iterable is exhausted - - s.seek(0) # Back to 0 - self.assertEqual(list(s), iterable) # No difference in result - - def test_elements(self): - iterable = map(str, count()) - - s = mi.seekable(iterable) - mi.take(10, s) - - elements = s.elements() - self.assertEqual( - [elements[i] for i in range(10)], [str(n) for n in range(10)] - ) - self.assertEqual(len(elements), 10) - - mi.take(10, s) - self.assertEqual(list(elements), [str(n) for n in range(20)]) - - -class SequenceViewTests(TestCase): - def test_init(self): - view = mi.SequenceView((1, 2, 3)) - self.assertEqual(repr(view), "SequenceView((1, 2, 3))") - self.assertRaises(TypeError, lambda: mi.SequenceView({})) - - def test_update(self): - seq = [1, 2, 3] - view = mi.SequenceView(seq) - self.assertEqual(len(view), 3) - self.assertEqual(repr(view), "SequenceView([1, 2, 3])") - - seq.pop() - self.assertEqual(len(view), 2) - self.assertEqual(repr(view), "SequenceView([1, 2])") - - def test_indexing(self): - seq = ('a', 'b', 'c', 'd', 'e', 'f') - view = mi.SequenceView(seq) - for i in range(-len(seq), len(seq)): - self.assertEqual(view[i], seq[i]) - - def test_slicing(self): - seq = ('a', 'b', 'c', 'd', 'e', 'f') - view = mi.SequenceView(seq) - n = len(seq) - indexes = list(range(-n - 1, n + 1)) + [None] - steps = list(range(-n, n + 1)) - steps.remove(0) - for slice_args in product(indexes, indexes, steps): - i = slice(*slice_args) - self.assertEqual(view[i], seq[i]) - - def test_abc_methods(self): - # collections.Sequence should provide all of this functionality - seq = ('a', 'b', 'c', 'd', 'e', 'f', 'f') - view = mi.SequenceView(seq) - - # __contains__ - self.assertIn('b', view) - self.assertNotIn('g', view) - - # __iter__ - self.assertEqual(list(iter(view)), list(seq)) - - # __reversed__ - self.assertEqual(list(reversed(view)), list(reversed(seq))) - - # index - self.assertEqual(view.index('b'), 1) - - # count - self.assertEqual(seq.count('f'), 2) - - -class RunLengthTest(TestCase): - def test_encode(self): - iterable = (int(str(n)[0]) for n in count(800)) - actual = mi.take(4, mi.run_length.encode(iterable)) - expected = [(8, 100), (9, 100), (1, 1000), (2, 1000)] - self.assertEqual(actual, expected) - - def test_decode(self): - iterable = [('d', 4), ('c', 3), ('b', 2), ('a', 1)] - actual = ''.join(mi.run_length.decode(iterable)) - expected = 'ddddcccbba' - self.assertEqual(actual, expected) - - -class ExactlyNTests(TestCase): - """Tests for ``exactly_n()``""" - - def test_true(self): - """Iterable has ``n`` ``True`` elements""" - self.assertTrue(mi.exactly_n([True, False, True], 2)) - self.assertTrue(mi.exactly_n([1, 1, 1, 0], 3)) - self.assertTrue(mi.exactly_n([False, False], 0)) - self.assertTrue(mi.exactly_n(range(100), 10, lambda x: x < 10)) - - def test_false(self): - """Iterable does not have ``n`` ``True`` elements""" - self.assertFalse(mi.exactly_n([True, False, False], 2)) - self.assertFalse(mi.exactly_n([True, True, False], 1)) - self.assertFalse(mi.exactly_n([False], 1)) - self.assertFalse(mi.exactly_n([True], -1)) - self.assertFalse(mi.exactly_n(repeat(True), 100)) - - def test_empty(self): - """Return ``True`` if the iterable is empty and ``n`` is 0""" - self.assertTrue(mi.exactly_n([], 0)) - self.assertFalse(mi.exactly_n([], 1)) - - -class AlwaysReversibleTests(TestCase): - """Tests for ``always_reversible()``""" - - def test_regular_reversed(self): - self.assertEqual(list(reversed(range(10))), - list(mi.always_reversible(range(10)))) - self.assertEqual(list(reversed([1, 2, 3])), - list(mi.always_reversible([1, 2, 3]))) - self.assertEqual(reversed([1, 2, 3]).__class__, - mi.always_reversible([1, 2, 3]).__class__) - - def test_nonseq_reversed(self): - # Create a non-reversible generator from a sequence - with self.assertRaises(TypeError): - reversed(x for x in range(10)) - - self.assertEqual(list(reversed(range(10))), - list(mi.always_reversible(x for x in range(10)))) - self.assertEqual(list(reversed([1, 2, 3])), - list(mi.always_reversible(x for x in [1, 2, 3]))) - self.assertNotEqual(reversed((1, 2)).__class__, - mi.always_reversible(x for x in (1, 2)).__class__) - - -class CircularShiftsTests(TestCase): - def test_empty(self): - # empty iterable -> empty list - self.assertEqual(list(mi.circular_shifts([])), []) - - def test_simple_circular_shifts(self): - # test the a simple iterator case - self.assertEqual( - mi.circular_shifts(range(4)), - [(0, 1, 2, 3), (1, 2, 3, 0), (2, 3, 0, 1), (3, 0, 1, 2)] - ) - - def test_duplicates(self): - # test non-distinct entries - self.assertEqual( - mi.circular_shifts([0, 1, 0, 1]), - [(0, 1, 0, 1), (1, 0, 1, 0), (0, 1, 0, 1), (1, 0, 1, 0)] - ) - - -class MakeDecoratorTests(TestCase): - def test_basic(self): - slicer = mi.make_decorator(islice) - - @slicer(1, 10, 2) - def user_function(arg_1, arg_2, kwarg_1=None): - self.assertEqual(arg_1, 'arg_1') - self.assertEqual(arg_2, 'arg_2') - self.assertEqual(kwarg_1, 'kwarg_1') - return map(str, count()) - - it = user_function('arg_1', 'arg_2', kwarg_1='kwarg_1') - actual = list(it) - expected = ['1', '3', '5', '7', '9'] - self.assertEqual(actual, expected) - - def test_result_index(self): - def stringify(*args, **kwargs): - self.assertEqual(args[0], 'arg_0') - iterable = args[1] - self.assertEqual(args[2], 'arg_2') - self.assertEqual(kwargs['kwarg_1'], 'kwarg_1') - return map(str, iterable) - - stringifier = mi.make_decorator(stringify, result_index=1) - - @stringifier('arg_0', 'arg_2', kwarg_1='kwarg_1') - def user_function(n): - return count(n) - - it = user_function(1) - actual = mi.take(5, it) - expected = ['1', '2', '3', '4', '5'] - self.assertEqual(actual, expected) - - def test_wrap_class(self): - seeker = mi.make_decorator(mi.seekable) - - @seeker() - def user_function(n): - return map(str, range(n)) - - it = user_function(5) - self.assertEqual(list(it), ['0', '1', '2', '3', '4']) - - it.seek(0) - self.assertEqual(list(it), ['0', '1', '2', '3', '4']) - - -class MapReduceTests(TestCase): - def test_default(self): - iterable = (str(x) for x in range(5)) - keyfunc = lambda x: int(x) // 2 - actual = sorted(mi.map_reduce(iterable, keyfunc).items()) - expected = [(0, ['0', '1']), (1, ['2', '3']), (2, ['4'])] - self.assertEqual(actual, expected) - - def test_valuefunc(self): - iterable = (str(x) for x in range(5)) - keyfunc = lambda x: int(x) // 2 - valuefunc = int - actual = sorted(mi.map_reduce(iterable, keyfunc, valuefunc).items()) - expected = [(0, [0, 1]), (1, [2, 3]), (2, [4])] - self.assertEqual(actual, expected) - - def test_reducefunc(self): - iterable = (str(x) for x in range(5)) - keyfunc = lambda x: int(x) // 2 - valuefunc = int - reducefunc = lambda value_list: reduce(mul, value_list, 1) - actual = sorted( - mi.map_reduce(iterable, keyfunc, valuefunc, reducefunc).items() - ) - expected = [(0, 0), (1, 6), (2, 4)] - self.assertEqual(actual, expected) - - def test_ret(self): - d = mi.map_reduce([1, 0, 2, 0, 1, 0], bool) - self.assertEqual(d, {False: [0, 0, 0], True: [1, 2, 1]}) - self.assertRaises(KeyError, lambda: d[None].append(1)) - - -class RlocateTests(TestCase): - def test_default_pred(self): - iterable = [0, 1, 1, 0, 1, 0, 0] - for it in (iterable[:], iter(iterable)): - actual = list(mi.rlocate(it)) - expected = [4, 2, 1] - self.assertEqual(actual, expected) - - def test_no_matches(self): - iterable = [0, 0, 0] - for it in (iterable[:], iter(iterable)): - actual = list(mi.rlocate(it)) - expected = [] - self.assertEqual(actual, expected) - - def test_custom_pred(self): - iterable = ['0', 1, 1, '0', 1, '0', '0'] - pred = lambda x: x == '0' - for it in (iterable[:], iter(iterable)): - actual = list(mi.rlocate(it, pred)) - expected = [6, 5, 3, 0] - self.assertEqual(actual, expected) - - def test_efficient_reversal(self): - iterable = range(10 ** 10) # Is efficiently reversible - target = 10 ** 10 - 2 - pred = lambda x: x == target # Find-able from the right - actual = next(mi.rlocate(iterable, pred)) - self.assertEqual(actual, target) - - def test_window_size(self): - iterable = ['0', 1, 1, '0', 1, '0', '0'] - pred = lambda *args: args == ('0', 1) - for it in (iterable, iter(iterable)): - actual = list(mi.rlocate(it, pred, window_size=2)) - expected = [3, 0] - self.assertEqual(actual, expected) - - def test_window_size_large(self): - iterable = [1, 2, 3, 4] - pred = lambda a, b, c, d, e: True - for it in (iterable, iter(iterable)): - actual = list(mi.rlocate(iterable, pred, window_size=5)) - expected = [0] - self.assertEqual(actual, expected) - - def test_window_size_zero(self): - iterable = [1, 2, 3, 4] - pred = lambda: True - for it in (iterable, iter(iterable)): - with self.assertRaises(ValueError): - list(mi.locate(iterable, pred, window_size=0)) - - -class ReplaceTests(TestCase): - def test_basic(self): - iterable = range(10) - pred = lambda x: x % 2 == 0 - substitutes = [] - actual = list(mi.replace(iterable, pred, substitutes)) - expected = [1, 3, 5, 7, 9] - self.assertEqual(actual, expected) - - def test_count(self): - iterable = range(10) - pred = lambda x: x % 2 == 0 - substitutes = [] - actual = list(mi.replace(iterable, pred, substitutes, count=4)) - expected = [1, 3, 5, 7, 8, 9] - self.assertEqual(actual, expected) - - def test_window_size(self): - iterable = range(10) - pred = lambda *args: args == (0, 1, 2) - substitutes = [] - actual = list(mi.replace(iterable, pred, substitutes, window_size=3)) - expected = [3, 4, 5, 6, 7, 8, 9] - self.assertEqual(actual, expected) - - def test_window_size_end(self): - iterable = range(10) - pred = lambda *args: args == (7, 8, 9) - substitutes = [] - actual = list(mi.replace(iterable, pred, substitutes, window_size=3)) - expected = [0, 1, 2, 3, 4, 5, 6] - self.assertEqual(actual, expected) - - def test_window_size_count(self): - iterable = range(10) - pred = lambda *args: (args == (0, 1, 2)) or (args == (7, 8, 9)) - substitutes = [] - actual = list( - mi.replace(iterable, pred, substitutes, count=1, window_size=3) - ) - expected = [3, 4, 5, 6, 7, 8, 9] - self.assertEqual(actual, expected) - - def test_window_size_large(self): - iterable = range(4) - pred = lambda a, b, c, d, e: True - substitutes = [5, 6, 7] - actual = list(mi.replace(iterable, pred, substitutes, window_size=5)) - expected = [5, 6, 7] - self.assertEqual(actual, expected) - - def test_window_size_zero(self): - iterable = range(10) - pred = lambda *args: True - substitutes = [] - with self.assertRaises(ValueError): - list(mi.replace(iterable, pred, substitutes, window_size=0)) - - def test_iterable_substitutes(self): - iterable = range(5) - pred = lambda x: x % 2 == 0 - substitutes = iter('__') - actual = list(mi.replace(iterable, pred, substitutes)) - expected = ['_', '_', 1, '_', '_', 3, '_', '_'] - self.assertEqual(actual, expected) diff --git a/libs/win/more_itertools/tests/test_recipes.py b/libs/win/more_itertools/tests/test_recipes.py deleted file mode 100644 index 98981fe8..00000000 --- a/libs/win/more_itertools/tests/test_recipes.py +++ /dev/null @@ -1,616 +0,0 @@ -from doctest import DocTestSuite -from unittest import TestCase - -from itertools import combinations -from six.moves import range - -import more_itertools as mi - - -def load_tests(loader, tests, ignore): - # Add the doctests - tests.addTests(DocTestSuite('more_itertools.recipes')) - return tests - - -class AccumulateTests(TestCase): - """Tests for ``accumulate()``""" - - def test_empty(self): - """Test that an empty input returns an empty output""" - self.assertEqual(list(mi.accumulate([])), []) - - def test_default(self): - """Test accumulate with the default function (addition)""" - self.assertEqual(list(mi.accumulate([1, 2, 3])), [1, 3, 6]) - - def test_bogus_function(self): - """Test accumulate with an invalid function""" - with self.assertRaises(TypeError): - list(mi.accumulate([1, 2, 3], func=lambda x: x)) - - def test_custom_function(self): - """Test accumulate with a custom function""" - self.assertEqual( - list(mi.accumulate((1, 2, 3, 2, 1), func=max)), [1, 2, 3, 3, 3] - ) - - -class TakeTests(TestCase): - """Tests for ``take()``""" - - def test_simple_take(self): - """Test basic usage""" - t = mi.take(5, range(10)) - self.assertEqual(t, [0, 1, 2, 3, 4]) - - def test_null_take(self): - """Check the null case""" - t = mi.take(0, range(10)) - self.assertEqual(t, []) - - def test_negative_take(self): - """Make sure taking negative items results in a ValueError""" - self.assertRaises(ValueError, lambda: mi.take(-3, range(10))) - - def test_take_too_much(self): - """Taking more than an iterator has remaining should return what the - iterator has remaining. - - """ - t = mi.take(10, range(5)) - self.assertEqual(t, [0, 1, 2, 3, 4]) - - -class TabulateTests(TestCase): - """Tests for ``tabulate()``""" - - def test_simple_tabulate(self): - """Test the happy path""" - t = mi.tabulate(lambda x: x) - f = tuple([next(t) for _ in range(3)]) - self.assertEqual(f, (0, 1, 2)) - - def test_count(self): - """Ensure tabulate accepts specific count""" - t = mi.tabulate(lambda x: 2 * x, -1) - f = (next(t), next(t), next(t)) - self.assertEqual(f, (-2, 0, 2)) - - -class TailTests(TestCase): - """Tests for ``tail()``""" - - def test_greater(self): - """Length of iterable is greather than requested tail""" - self.assertEqual(list(mi.tail(3, 'ABCDEFG')), ['E', 'F', 'G']) - - def test_equal(self): - """Length of iterable is equal to the requested tail""" - self.assertEqual( - list(mi.tail(7, 'ABCDEFG')), ['A', 'B', 'C', 'D', 'E', 'F', 'G'] - ) - - def test_less(self): - """Length of iterable is less than requested tail""" - self.assertEqual( - list(mi.tail(8, 'ABCDEFG')), ['A', 'B', 'C', 'D', 'E', 'F', 'G'] - ) - - -class ConsumeTests(TestCase): - """Tests for ``consume()``""" - - def test_sanity(self): - """Test basic functionality""" - r = (x for x in range(10)) - mi.consume(r, 3) - self.assertEqual(3, next(r)) - - def test_null_consume(self): - """Check the null case""" - r = (x for x in range(10)) - mi.consume(r, 0) - self.assertEqual(0, next(r)) - - def test_negative_consume(self): - """Check that negative consumsion throws an error""" - r = (x for x in range(10)) - self.assertRaises(ValueError, lambda: mi.consume(r, -1)) - - def test_total_consume(self): - """Check that iterator is totally consumed by default""" - r = (x for x in range(10)) - mi.consume(r) - self.assertRaises(StopIteration, lambda: next(r)) - - -class NthTests(TestCase): - """Tests for ``nth()``""" - - def test_basic(self): - """Make sure the nth item is returned""" - l = range(10) - for i, v in enumerate(l): - self.assertEqual(mi.nth(l, i), v) - - def test_default(self): - """Ensure a default value is returned when nth item not found""" - l = range(3) - self.assertEqual(mi.nth(l, 100, "zebra"), "zebra") - - def test_negative_item_raises(self): - """Ensure asking for a negative item raises an exception""" - self.assertRaises(ValueError, lambda: mi.nth(range(10), -3)) - - -class AllEqualTests(TestCase): - """Tests for ``all_equal()``""" - - def test_true(self): - """Everything is equal""" - self.assertTrue(mi.all_equal('aaaaaa')) - self.assertTrue(mi.all_equal([0, 0, 0, 0])) - - def test_false(self): - """Not everything is equal""" - self.assertFalse(mi.all_equal('aaaaab')) - self.assertFalse(mi.all_equal([0, 0, 0, 1])) - - def test_tricky(self): - """Not everything is identical, but everything is equal""" - items = [1, complex(1, 0), 1.0] - self.assertTrue(mi.all_equal(items)) - - def test_empty(self): - """Return True if the iterable is empty""" - self.assertTrue(mi.all_equal('')) - self.assertTrue(mi.all_equal([])) - - def test_one(self): - """Return True if the iterable is singular""" - self.assertTrue(mi.all_equal('0')) - self.assertTrue(mi.all_equal([0])) - - -class QuantifyTests(TestCase): - """Tests for ``quantify()``""" - - def test_happy_path(self): - """Make sure True count is returned""" - q = [True, False, True] - self.assertEqual(mi.quantify(q), 2) - - def test_custom_predicate(self): - """Ensure non-default predicates return as expected""" - q = range(10) - self.assertEqual(mi.quantify(q, lambda x: x % 2 == 0), 5) - - -class PadnoneTests(TestCase): - """Tests for ``padnone()``""" - - def test_happy_path(self): - """wrapper iterator should return None indefinitely""" - r = range(2) - p = mi.padnone(r) - self.assertEqual([0, 1, None, None], [next(p) for _ in range(4)]) - - -class NcyclesTests(TestCase): - """Tests for ``nyclces()``""" - - def test_happy_path(self): - """cycle a sequence three times""" - r = ["a", "b", "c"] - n = mi.ncycles(r, 3) - self.assertEqual( - ["a", "b", "c", "a", "b", "c", "a", "b", "c"], - list(n) - ) - - def test_null_case(self): - """asking for 0 cycles should return an empty iterator""" - n = mi.ncycles(range(100), 0) - self.assertRaises(StopIteration, lambda: next(n)) - - def test_pathalogical_case(self): - """asking for negative cycles should return an empty iterator""" - n = mi.ncycles(range(100), -10) - self.assertRaises(StopIteration, lambda: next(n)) - - -class DotproductTests(TestCase): - """Tests for ``dotproduct()``'""" - - def test_happy_path(self): - """simple dotproduct example""" - self.assertEqual(400, mi.dotproduct([10, 10], [20, 20])) - - -class FlattenTests(TestCase): - """Tests for ``flatten()``""" - - def test_basic_usage(self): - """ensure list of lists is flattened one level""" - f = [[0, 1, 2], [3, 4, 5]] - self.assertEqual(list(range(6)), list(mi.flatten(f))) - - def test_single_level(self): - """ensure list of lists is flattened only one level""" - f = [[0, [1, 2]], [[3, 4], 5]] - self.assertEqual([0, [1, 2], [3, 4], 5], list(mi.flatten(f))) - - -class RepeatfuncTests(TestCase): - """Tests for ``repeatfunc()``""" - - def test_simple_repeat(self): - """test simple repeated functions""" - r = mi.repeatfunc(lambda: 5) - self.assertEqual([5, 5, 5, 5, 5], [next(r) for _ in range(5)]) - - def test_finite_repeat(self): - """ensure limited repeat when times is provided""" - r = mi.repeatfunc(lambda: 5, times=5) - self.assertEqual([5, 5, 5, 5, 5], list(r)) - - def test_added_arguments(self): - """ensure arguments are applied to the function""" - r = mi.repeatfunc(lambda x: x, 2, 3) - self.assertEqual([3, 3], list(r)) - - def test_null_times(self): - """repeat 0 should return an empty iterator""" - r = mi.repeatfunc(range, 0, 3) - self.assertRaises(StopIteration, lambda: next(r)) - - -class PairwiseTests(TestCase): - """Tests for ``pairwise()``""" - - def test_base_case(self): - """ensure an iterable will return pairwise""" - p = mi.pairwise([1, 2, 3]) - self.assertEqual([(1, 2), (2, 3)], list(p)) - - def test_short_case(self): - """ensure an empty iterator if there's not enough values to pair""" - p = mi.pairwise("a") - self.assertRaises(StopIteration, lambda: next(p)) - - -class GrouperTests(TestCase): - """Tests for ``grouper()``""" - - def test_even(self): - """Test when group size divides evenly into the length of - the iterable. - - """ - self.assertEqual( - list(mi.grouper(3, 'ABCDEF')), [('A', 'B', 'C'), ('D', 'E', 'F')] - ) - - def test_odd(self): - """Test when group size does not divide evenly into the length of the - iterable. - - """ - self.assertEqual( - list(mi.grouper(3, 'ABCDE')), [('A', 'B', 'C'), ('D', 'E', None)] - ) - - def test_fill_value(self): - """Test that the fill value is used to pad the final group""" - self.assertEqual( - list(mi.grouper(3, 'ABCDE', 'x')), - [('A', 'B', 'C'), ('D', 'E', 'x')] - ) - - -class RoundrobinTests(TestCase): - """Tests for ``roundrobin()``""" - - def test_even_groups(self): - """Ensure ordered output from evenly populated iterables""" - self.assertEqual( - list(mi.roundrobin('ABC', [1, 2, 3], range(3))), - ['A', 1, 0, 'B', 2, 1, 'C', 3, 2] - ) - - def test_uneven_groups(self): - """Ensure ordered output from unevenly populated iterables""" - self.assertEqual( - list(mi.roundrobin('ABCD', [1, 2], range(0))), - ['A', 1, 'B', 2, 'C', 'D'] - ) - - -class PartitionTests(TestCase): - """Tests for ``partition()``""" - - def test_bool(self): - """Test when pred() returns a boolean""" - lesser, greater = mi.partition(lambda x: x > 5, range(10)) - self.assertEqual(list(lesser), [0, 1, 2, 3, 4, 5]) - self.assertEqual(list(greater), [6, 7, 8, 9]) - - def test_arbitrary(self): - """Test when pred() returns an integer""" - divisibles, remainders = mi.partition(lambda x: x % 3, range(10)) - self.assertEqual(list(divisibles), [0, 3, 6, 9]) - self.assertEqual(list(remainders), [1, 2, 4, 5, 7, 8]) - - -class PowersetTests(TestCase): - """Tests for ``powerset()``""" - - def test_combinatorics(self): - """Ensure a proper enumeration""" - p = mi.powerset([1, 2, 3]) - self.assertEqual( - list(p), - [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)] - ) - - -class UniqueEverseenTests(TestCase): - """Tests for ``unique_everseen()``""" - - def test_everseen(self): - """ensure duplicate elements are ignored""" - u = mi.unique_everseen('AAAABBBBCCDAABBB') - self.assertEqual( - ['A', 'B', 'C', 'D'], - list(u) - ) - - def test_custom_key(self): - """ensure the custom key comparison works""" - u = mi.unique_everseen('aAbACCc', key=str.lower) - self.assertEqual(list('abC'), list(u)) - - def test_unhashable(self): - """ensure things work for unhashable items""" - iterable = ['a', [1, 2, 3], [1, 2, 3], 'a'] - u = mi.unique_everseen(iterable) - self.assertEqual(list(u), ['a', [1, 2, 3]]) - - def test_unhashable_key(self): - """ensure things work for unhashable items with a custom key""" - iterable = ['a', [1, 2, 3], [1, 2, 3], 'a'] - u = mi.unique_everseen(iterable, key=lambda x: x) - self.assertEqual(list(u), ['a', [1, 2, 3]]) - - -class UniqueJustseenTests(TestCase): - """Tests for ``unique_justseen()``""" - - def test_justseen(self): - """ensure only last item is remembered""" - u = mi.unique_justseen('AAAABBBCCDABB') - self.assertEqual(list('ABCDAB'), list(u)) - - def test_custom_key(self): - """ensure the custom key comparison works""" - u = mi.unique_justseen('AABCcAD', str.lower) - self.assertEqual(list('ABCAD'), list(u)) - - -class IterExceptTests(TestCase): - """Tests for ``iter_except()``""" - - def test_exact_exception(self): - """ensure the exact specified exception is caught""" - l = [1, 2, 3] - i = mi.iter_except(l.pop, IndexError) - self.assertEqual(list(i), [3, 2, 1]) - - def test_generic_exception(self): - """ensure the generic exception can be caught""" - l = [1, 2] - i = mi.iter_except(l.pop, Exception) - self.assertEqual(list(i), [2, 1]) - - def test_uncaught_exception_is_raised(self): - """ensure a non-specified exception is raised""" - l = [1, 2, 3] - i = mi.iter_except(l.pop, KeyError) - self.assertRaises(IndexError, lambda: list(i)) - - def test_first(self): - """ensure first is run before the function""" - l = [1, 2, 3] - f = lambda: 25 - i = mi.iter_except(l.pop, IndexError, f) - self.assertEqual(list(i), [25, 3, 2, 1]) - - -class FirstTrueTests(TestCase): - """Tests for ``first_true()``""" - - def test_something_true(self): - """Test with no keywords""" - self.assertEqual(mi.first_true(range(10)), 1) - - def test_nothing_true(self): - """Test default return value.""" - self.assertEqual(mi.first_true([0, 0, 0]), False) - - def test_default(self): - """Test with a default keyword""" - self.assertEqual(mi.first_true([0, 0, 0], default='!'), '!') - - def test_pred(self): - """Test with a custom predicate""" - self.assertEqual( - mi.first_true([2, 4, 6], pred=lambda x: x % 3 == 0), 6 - ) - - -class RandomProductTests(TestCase): - """Tests for ``random_product()`` - - Since random.choice() has different results with the same seed across - python versions 2.x and 3.x, these tests use highly probably events to - create predictable outcomes across platforms. - """ - - def test_simple_lists(self): - """Ensure that one item is chosen from each list in each pair. - Also ensure that each item from each list eventually appears in - the chosen combinations. - - Odds are roughly 1 in 7.1 * 10e16 that one item from either list will - not be chosen after 100 samplings of one item from each list. Just to - be safe, better use a known random seed, too. - - """ - nums = [1, 2, 3] - lets = ['a', 'b', 'c'] - n, m = zip(*[mi.random_product(nums, lets) for _ in range(100)]) - n, m = set(n), set(m) - self.assertEqual(n, set(nums)) - self.assertEqual(m, set(lets)) - self.assertEqual(len(n), len(nums)) - self.assertEqual(len(m), len(lets)) - - def test_list_with_repeat(self): - """ensure multiple items are chosen, and that they appear to be chosen - from one list then the next, in proper order. - - """ - nums = [1, 2, 3] - lets = ['a', 'b', 'c'] - r = list(mi.random_product(nums, lets, repeat=100)) - self.assertEqual(2 * 100, len(r)) - n, m = set(r[::2]), set(r[1::2]) - self.assertEqual(n, set(nums)) - self.assertEqual(m, set(lets)) - self.assertEqual(len(n), len(nums)) - self.assertEqual(len(m), len(lets)) - - -class RandomPermutationTests(TestCase): - """Tests for ``random_permutation()``""" - - def test_full_permutation(self): - """ensure every item from the iterable is returned in a new ordering - - 15 elements have a 1 in 1.3 * 10e12 of appearing in sorted order, so - we fix a seed value just to be sure. - - """ - i = range(15) - r = mi.random_permutation(i) - self.assertEqual(set(i), set(r)) - if i == r: - raise AssertionError("Values were not permuted") - - def test_partial_permutation(self): - """ensure all returned items are from the iterable, that the returned - permutation is of the desired length, and that all items eventually - get returned. - - Sampling 100 permutations of length 5 from a set of 15 leaves a - (2/3)^100 chance that an item will not be chosen. Multiplied by 15 - items, there is a 1 in 2.6e16 chance that at least 1 item will not - show up in the resulting output. Using a random seed will fix that. - - """ - items = range(15) - item_set = set(items) - all_items = set() - for _ in range(100): - permutation = mi.random_permutation(items, 5) - self.assertEqual(len(permutation), 5) - permutation_set = set(permutation) - self.assertLessEqual(permutation_set, item_set) - all_items |= permutation_set - self.assertEqual(all_items, item_set) - - -class RandomCombinationTests(TestCase): - """Tests for ``random_combination()``""" - - def test_psuedorandomness(self): - """ensure different subsets of the iterable get returned over many - samplings of random combinations""" - items = range(15) - all_items = set() - for _ in range(50): - combination = mi.random_combination(items, 5) - all_items |= set(combination) - self.assertEqual(all_items, set(items)) - - def test_no_replacement(self): - """ensure that elements are sampled without replacement""" - items = range(15) - for _ in range(50): - combination = mi.random_combination(items, len(items)) - self.assertEqual(len(combination), len(set(combination))) - self.assertRaises( - ValueError, lambda: mi.random_combination(items, len(items) + 1) - ) - - -class RandomCombinationWithReplacementTests(TestCase): - """Tests for ``random_combination_with_replacement()``""" - - def test_replacement(self): - """ensure that elements are sampled with replacement""" - items = range(5) - combo = mi.random_combination_with_replacement(items, len(items) * 2) - self.assertEqual(2 * len(items), len(combo)) - if len(set(combo)) == len(combo): - raise AssertionError("Combination contained no duplicates") - - def test_pseudorandomness(self): - """ensure different subsets of the iterable get returned over many - samplings of random combinations""" - items = range(15) - all_items = set() - for _ in range(50): - combination = mi.random_combination_with_replacement(items, 5) - all_items |= set(combination) - self.assertEqual(all_items, set(items)) - - -class NthCombinationTests(TestCase): - def test_basic(self): - iterable = 'abcdefg' - r = 4 - for index, expected in enumerate(combinations(iterable, r)): - actual = mi.nth_combination(iterable, r, index) - self.assertEqual(actual, expected) - - def test_long(self): - actual = mi.nth_combination(range(180), 4, 2000000) - expected = (2, 12, 35, 126) - self.assertEqual(actual, expected) - - def test_invalid_r(self): - for r in (-1, 3): - with self.assertRaises(ValueError): - mi.nth_combination([], r, 0) - - def test_invalid_index(self): - with self.assertRaises(IndexError): - mi.nth_combination('abcdefg', 3, -36) - - -class PrependTests(TestCase): - def test_basic(self): - value = 'a' - iterator = iter('bcdefg') - actual = list(mi.prepend(value, iterator)) - expected = list('abcdefg') - self.assertEqual(actual, expected) - - def test_multiple(self): - value = 'ab' - iterator = iter('cdefg') - actual = tuple(mi.prepend(value, iterator)) - expected = ('ab',) + tuple('cdefg') - self.assertEqual(actual, expected) diff --git a/libs/win/path.py b/libs/win/path/__init__.py similarity index 53% rename from libs/win/path.py rename to libs/win/path/__init__.py index 69ac5c13..f16857f8 100644 --- a/libs/win/path.py +++ b/libs/win/path/__init__.py @@ -1,7 +1,8 @@ """ -path.py - An object representing a path to a file or directory. +Path Pie -https://github.com/jaraco/path.py +Implements ``path.Path`` - An object representing a +path to a file or directory. Example:: @@ -21,8 +22,6 @@ Example:: foo_txt = Path("bar") / "foo.txt" """ -from __future__ import unicode_literals - import sys import warnings import os @@ -33,183 +32,89 @@ import hashlib import errno import tempfile import functools -import operator import re import contextlib import io import importlib import itertools -import platform -import ntpath -try: +with contextlib.suppress(ImportError): import win32security -except ImportError: - pass -try: +with contextlib.suppress(ImportError): import pwd -except ImportError: - pass -try: +with contextlib.suppress(ImportError): import grp -except ImportError: - pass -############################################################################## -# Python 2/3 support -PY3 = sys.version_info >= (3,) -PY2 = not PY3 - -string_types = str, -text_type = str -getcwdu = os.getcwd +from . import matchers +from . import masks +from . import classes +from .py37compat import best_realpath, lru_cache -if PY2: - import __builtin__ - string_types = __builtin__.basestring, - text_type = __builtin__.unicode - getcwdu = os.getcwdu - map = itertools.imap - filter = itertools.ifilter - FileNotFoundError = OSError - itertools.filterfalse = itertools.ifilterfalse - - -@contextlib.contextmanager -def io_error_compat(): - try: - yield - except IOError as io_err: - # On Python 2, io.open raises IOError; transform to OSError for - # future compatibility. - os_err = OSError(*io_err.args) - os_err.filename = getattr(io_err, 'filename', None) - raise os_err - -############################################################################## - - -__all__ = ['Path', 'TempDir', 'CaseInsensitivePattern'] +__all__ = ['Path', 'TempDir'] LINESEPS = ['\r\n', '\r', '\n'] U_LINESEPS = LINESEPS + ['\u0085', '\u2028', '\u2029'] -NEWLINE = re.compile('|'.join(LINESEPS)) +B_NEWLINE = re.compile('|'.join(LINESEPS).encode()) U_NEWLINE = re.compile('|'.join(U_LINESEPS)) -NL_END = re.compile(r'(?:{0})$'.format(NEWLINE.pattern)) -U_NL_END = re.compile(r'(?:{0})$'.format(U_NEWLINE.pattern)) +B_NL_END = re.compile(B_NEWLINE.pattern + b'$') +U_NL_END = re.compile(U_NEWLINE.pattern + '$') - -try: - import importlib_metadata - __version__ = importlib_metadata.version('path.py') -except Exception: - __version__ = 'unknown' +_default_linesep = object() class TreeWalkWarning(Warning): pass -# from jaraco.functools -def compose(*funcs): - compose_two = lambda f1, f2: lambda *args, **kwargs: f1(f2(*args, **kwargs)) # noqa - return functools.reduce(compose_two, funcs) - - -def simple_cache(func): +class Traversal: """ - Save results for the :meth:'path.using_module' classmethod. - When Python 3.2 is available, use functools.lru_cache instead. + Wrap a walk result to customize the traversal. + + `follow` is a function that takes an item and returns + True if that item should be followed and False otherwise. + + For example, to avoid traversing into directories that + begin with `.`: + + >>> traverse = Traversal(lambda dir: not dir.startswith('.')) + >>> items = list(traverse(Path('.').walk())) + + Directories beginning with `.` will appear in the results, but + their children will not. + + >>> dot_dir = next(item for item in items if item.isdir() and item.startswith('.')) + >>> any(item.parent == dot_dir for item in items) + False """ - saved_results = {} - def wrapper(cls, module): - if module in saved_results: - return saved_results[module] - saved_results[module] = func(cls, module) - return saved_results[module] - return wrapper + def __init__(self, follow): + self.follow = follow - -class ClassProperty(property): - def __get__(self, cls, owner): - return self.fget.__get__(None, owner)() - - -class multimethod(object): - """ - Acts like a classmethod when invoked from the class and like an - instancemethod when invoked from the instance. - """ - def __init__(self, func): - self.func = func - - def __get__(self, instance, owner): - return ( - functools.partial(self.func, owner) if instance is None - else functools.partial(self.func, owner, instance) - ) - - -class matchers(object): - # TODO: make this class a module - - @staticmethod - def load(param): - """ - If the supplied parameter is a string, assum it's a simple - pattern. - """ - return ( - matchers.Pattern(param) if isinstance(param, string_types) - else param if param is not None - else matchers.Null() - ) - - class Base(object): - pass - - class Null(Base): - def __call__(self, path): - return True - - class Pattern(Base): - def __init__(self, pattern): - self.pattern = pattern - - def get_pattern(self, normcase): + def __call__(self, walker): + traverse = None + while True: try: - return self._pattern - except AttributeError: - pass - self._pattern = normcase(self.pattern) - return self._pattern + item = walker.send(traverse) + except StopIteration: + return + yield item - def __call__(self, path): - normcase = getattr(self, 'normcase', path.module.normcase) - pattern = self.get_pattern(normcase) - return fnmatch.fnmatchcase(normcase(path.name), pattern) - - class CaseInsensitive(Pattern): - """ - A Pattern with a ``'normcase'`` property, suitable for passing to - :meth:`listdir`, :meth:`dirs`, :meth:`files`, :meth:`walk`, - :meth:`walkdirs`, or :meth:`walkfiles` to match case-insensitive. - - For example, to get all files ending in .py, .Py, .pY, or .PY in the - current directory:: - - from path import Path, matchers - Path('.').files(matchers.CaseInsensitive('*.py')) - """ - normcase = staticmethod(ntpath.normcase) + traverse = functools.partial(self.follow, item) -class Path(text_type): +def _strip_newlines(lines): + r""" + >>> list(_strip_newlines(['Hello World\r\n', 'foo'])) + ['Hello World', 'foo'] + """ + return (U_NL_END.sub('', line) for line in lines) + + +class Path(str): """ Represents a filesystem path. @@ -234,18 +139,18 @@ class Path(text_type): def __init__(self, other=''): if other is None: raise TypeError("Invalid initial value for path: None") + with contextlib.suppress(AttributeError): + self._validate() @classmethod - @simple_cache + @lru_cache def using_module(cls, module): subclass_name = cls.__name__ + '_' + module.__name__ - if PY2: - subclass_name = str(subclass_name) bases = (cls,) ns = {'module': module} return type(subclass_name, bases, ns) - @ClassProperty + @classes.ClassProperty @classmethod def _next_class(cls): """ @@ -260,19 +165,14 @@ class Path(text_type): # Adding a Path and a string yields a Path. def __add__(self, more): - try: - return self._next_class(super(Path, self).__add__(more)) - except TypeError: # Python bug - return NotImplemented + return self._next_class(super(Path, self).__add__(more)) def __radd__(self, other): - if not isinstance(other, string_types): - return NotImplemented return self._next_class(other.__add__(self)) # The / operator joins Paths. def __div__(self, rel): - """ fp.__div__(rel) == fp / rel == fp.joinpath(rel) + """fp.__div__(rel) == fp / rel == fp.joinpath(rel) Join two path components, adding a separator character if needed. @@ -286,7 +186,7 @@ class Path(text_type): # The / operator joins Paths the other way around def __rdiv__(self, rel): - """ fp.__rdiv__(rel) == rel / fp + """fp.__rdiv__(rel) == rel / fp Join two path components, adding a separator character if needed. @@ -306,54 +206,52 @@ class Path(text_type): def __exit__(self, *_): os.chdir(self._old_dir) - def __fspath__(self): - return self - @classmethod def getcwd(cls): - """ Return the current working directory as a path object. + """Return the current working directory as a path object. - .. seealso:: :func:`os.getcwdu` + .. seealso:: :func:`os.getcwd` """ - return cls(getcwdu()) + return cls(os.getcwd()) # # --- Operations on Path strings. def abspath(self): - """ .. seealso:: :func:`os.path.abspath` """ + """.. seealso:: :func:`os.path.abspath`""" return self._next_class(self.module.abspath(self)) def normcase(self): - """ .. seealso:: :func:`os.path.normcase` """ + """.. seealso:: :func:`os.path.normcase`""" return self._next_class(self.module.normcase(self)) def normpath(self): - """ .. seealso:: :func:`os.path.normpath` """ + """.. seealso:: :func:`os.path.normpath`""" return self._next_class(self.module.normpath(self)) def realpath(self): - """ .. seealso:: :func:`os.path.realpath` """ - return self._next_class(self.module.realpath(self)) + """.. seealso:: :func:`os.path.realpath`""" + realpath = best_realpath(self.module) + return self._next_class(realpath(self)) def expanduser(self): - """ .. seealso:: :func:`os.path.expanduser` """ + """.. seealso:: :func:`os.path.expanduser`""" return self._next_class(self.module.expanduser(self)) def expandvars(self): - """ .. seealso:: :func:`os.path.expandvars` """ + """.. seealso:: :func:`os.path.expandvars`""" return self._next_class(self.module.expandvars(self)) def dirname(self): - """ .. seealso:: :attr:`parent`, :func:`os.path.dirname` """ + """.. seealso:: :attr:`parent`, :func:`os.path.dirname`""" return self._next_class(self.module.dirname(self)) def basename(self): - """ .. seealso:: :attr:`name`, :func:`os.path.basename` """ + """.. seealso:: :attr:`name`, :func:`os.path.basename`""" return self._next_class(self.module.basename(self)) def expand(self): - """ Clean up a filename by calling :meth:`expandvars()`, + """Clean up a filename by calling :meth:`expandvars()`, :meth:`expanduser()`, and :meth:`normpath()` on it. This is commonly everything needed to clean up a filename @@ -363,7 +261,7 @@ class Path(text_type): @property def stem(self): - """ The same as :meth:`name`, but with one file extension stripped off. + """The same as :meth:`name`, but with one file extension stripped off. >>> Path('/home/guido/python.tar.gz').stem 'python.tar' @@ -371,19 +269,14 @@ class Path(text_type): base, ext = self.module.splitext(self.name) return base - @property - def namebase(self): - warnings.warn("Use .stem instead of .namebase", DeprecationWarning) - return self.stem - @property def ext(self): - """ The file extension, for example ``'.py'``. """ + """The file extension, for example ``'.py'``.""" f, ext = self.module.splitext(self) return ext def with_suffix(self, suffix): - """ Return a new path with the file suffix changed (or added, if none) + """Return a new path with the file suffix changed (or added, if none) >>> Path('/home/guido/python.tar.gz').with_suffix(".foo") Path('/home/guido/python.tar.foo') @@ -403,7 +296,7 @@ class Path(text_type): @property def drive(self): - """ The drive specifier, for example ``'C:'``. + """The drive specifier, for example ``'C:'``. This is always empty on systems that don't use drive specifiers. """ @@ -411,7 +304,9 @@ class Path(text_type): return self._next_class(drive) parent = property( - dirname, None, None, + dirname, + None, + None, """ This path's parent directory, as a new Path object. For example, @@ -419,20 +314,24 @@ class Path(text_type): Path('/usr/local/lib')`` .. seealso:: :meth:`dirname`, :func:`os.path.dirname` - """) + """, + ) name = property( - basename, None, None, + basename, + None, + None, """ The name of this file or directory without the full path. For example, ``Path('/usr/local/lib/libpython.so').name == 'libpython.so'`` .. seealso:: :meth:`basename`, :func:`os.path.basename` - """) + """, + ) def splitpath(self): - """ p.splitpath() -> Return ``(p.parent, p.name)``. + """Return two-tuple of ``.parent``, ``.name``. .. seealso:: :attr:`parent`, :attr:`name`, :func:`os.path.split` """ @@ -440,7 +339,7 @@ class Path(text_type): return self._next_class(parent), child def splitdrive(self): - """ p.splitdrive() -> Return ``(p.drive, )``. + """Return two-tuple of ``.drive`` and rest without drive. Split the drive specifier from this path. If there is no drive specifier, :samp:`{p.drive}` is empty, so the return value @@ -449,10 +348,10 @@ class Path(text_type): .. seealso:: :func:`os.path.splitdrive` """ drive, rel = self.module.splitdrive(self) - return self._next_class(drive), rel + return self._next_class(drive), self._next_class(rel) def splitext(self): - """ p.splitext() -> Return ``(p.stripext(), p.ext)``. + """Return two-tuple of ``.stripext()`` and ``.ext``. Split the filename extension from this path and return the two parts. Either part may be empty. @@ -467,28 +366,14 @@ class Path(text_type): return self._next_class(filename), ext def stripext(self): - """ p.stripext() -> Remove one file extension from the path. + """Remove one file extension from the path. For example, ``Path('/home/guido/python.tar.gz').stripext()`` returns ``Path('/home/guido/python.tar')``. """ return self.splitext()[0] - def splitunc(self): - """ .. seealso:: :func:`os.path.splitunc` """ - unc, rest = self.module.splitunc(self) - return self._next_class(unc), rest - - @property - def uncshare(self): - """ - The UNC mount point for this path. - This is empty for paths on local drives. - """ - unc, r = self.module.splitunc(self) - return self._next_class(unc) - - @multimethod + @classes.multimethod def joinpath(cls, first, *others): """ Join first to zero or more :class:`Path` components, @@ -498,41 +383,52 @@ class Path(text_type): .. seealso:: :func:`os.path.join` """ - if not isinstance(first, cls): - first = cls(first) - return first._next_class(first.module.join(first, *others)) + return cls._next_class(cls.module.join(first, *others)) def splitall(self): - r""" Return a list of the path components in this path. + r"""Return a list of the path components in this path. The first item in the list will be a Path. Its value will be either :data:`os.curdir`, :data:`os.pardir`, empty, or the root directory of this path (for example, ``'/'`` or ``'C:\\'``). The other items in the list will be strings. - ``path.Path.joinpath(*result)`` will yield the original path. + ``Path.joinpath(*result)`` will yield the original path. + + >>> Path('/foo/bar/baz').splitall() + [Path('/'), 'foo', 'bar', 'baz'] """ - parts = [] + return list(self._parts()) + + def parts(self): + """ + >>> Path('/foo/bar/baz').parts() + (Path('/'), 'foo', 'bar', 'baz') + """ + return tuple(self._parts()) + + def _parts(self): + return reversed(tuple(self._parts_iter())) + + def _parts_iter(self): loc = self while loc != os.curdir and loc != os.pardir: prev = loc loc, child = prev.splitpath() if loc == prev: break - parts.append(child) - parts.append(loc) - parts.reverse() - return parts + yield child + yield loc def relpath(self, start='.'): - """ Return this path as a relative path, + """Return this path as a relative path, based from `start`, which defaults to the current working directory. """ cwd = self._next_class(start) return cwd.relpathto(self) def relpathto(self, dest): - """ Return a relative path from `self` to `dest`. + """Return a relative path from `self` to `dest`. If there is no relative path from `self` to `dest`, for example if they reside on different drives in Windows, then this returns @@ -572,7 +468,7 @@ class Path(text_type): # --- Listing, searching, walking, and matching def listdir(self, match=None): - """ D.listdir() -> List of items in this directory. + """List of items in this directory. Use :meth:`files` or :meth:`dirs` instead if you want a listing of just files or just subdirectories. @@ -585,12 +481,10 @@ class Path(text_type): .. seealso:: :meth:`files`, :meth:`dirs` """ match = matchers.load(match) - return list(filter(match, ( - self / child for child in os.listdir(self) - ))) + return list(filter(match, (self / child for child in os.listdir(self)))) def dirs(self, *args, **kwargs): - """ D.dirs() -> List of this directory's subdirectories. + """List of this directory's subdirectories. The elements of the list are Path objects. This does not walk recursively into subdirectories @@ -601,7 +495,7 @@ class Path(text_type): return [p for p in self.listdir(*args, **kwargs) if p.isdir()] def files(self, *args, **kwargs): - """ D.files() -> List of the files in this directory. + """List of the files in self. The elements of the list are Path objects. This does not walk into subdirectories (see :meth:`walkfiles`). @@ -612,7 +506,7 @@ class Path(text_type): return [p for p in self.listdir(*args, **kwargs) if p.isfile()] def walk(self, match=None, errors='strict'): - """ D.walk() -> iterator over files and subdirs, recursively. + """Iterator over files and subdirs, recursively. The iterator yields Path objects naming each child item of this directory and its descendants. This requires that @@ -627,75 +521,49 @@ class Path(text_type): reports the error via :func:`warnings.warn()`), and ``'ignore'``. `errors` may also be an arbitrary callable taking a msg parameter. """ - class Handlers: - def strict(msg): - raise - - def warn(msg): - warnings.warn(msg, TreeWalkWarning) - - def ignore(msg): - pass - - if not callable(errors) and errors not in vars(Handlers): - raise ValueError("invalid errors parameter") - errors = vars(Handlers).get(errors, errors) + errors = Handlers._resolve(errors) match = matchers.load(match) try: childList = self.listdir() - except Exception: - exc = sys.exc_info()[1] - tmpl = "Unable to list directory '%(self)s': %(exc)s" - msg = tmpl % locals() - errors(msg) + except Exception as exc: + errors(f"Unable to list directory '{self}': {exc}") return for child in childList: + traverse = None if match(child): - yield child + traverse = yield child + traverse = traverse or child.isdir try: - isdir = child.isdir() - except Exception: - exc = sys.exc_info()[1] - tmpl = "Unable to access '%(child)s': %(exc)s" - msg = tmpl % locals() - errors(msg) - isdir = False + do_traverse = traverse() + except Exception as exc: + errors(f"Unable to access '{child}': {exc}") + continue - if isdir: + if do_traverse: for item in child.walk(errors=errors, match=match): yield item def walkdirs(self, *args, **kwargs): - """ D.walkdirs() -> iterator over subdirs, recursively. - """ - return ( - item - for item in self.walk(*args, **kwargs) - if item.isdir() - ) + """Iterator over subdirs, recursively.""" + return (item for item in self.walk(*args, **kwargs) if item.isdir()) def walkfiles(self, *args, **kwargs): - """ D.walkfiles() -> iterator over files in D, recursively. - """ - return ( - item - for item in self.walk(*args, **kwargs) - if item.isfile() - ) + """Iterator over files, recursively.""" + return (item for item in self.walk(*args, **kwargs) if item.isfile()) def fnmatch(self, pattern, normcase=None): - """ Return ``True`` if `self.name` matches the given `pattern`. + """Return ``True`` if `self.name` matches the given `pattern`. `pattern` - A filename pattern with wildcards, for example ``'*.py'``. If the pattern contains a `normcase` attribute, it is applied to the name and path prior to comparison. `normcase` - (optional) A function used to normalize the pattern and - filename before matching. Defaults to :meth:`self.module`, which - defaults to :meth:`os.path.normcase`. + filename before matching. Defaults to normcase from + ``self.module``, :func:`os.path.normcase`. .. seealso:: :func:`fnmatch.fnmatch` """ @@ -706,7 +574,7 @@ class Path(text_type): return fnmatch.fnmatchcase(name, pattern) def glob(self, pattern): - """ Return a list of Path objects that match the pattern. + """Return a list of Path objects that match the pattern. `pattern` - a path relative to this directory, with wildcards. @@ -723,7 +591,7 @@ class Path(text_type): return [cls(s) for s in glob.glob(self / pattern)] def iglob(self, pattern): - """ Return an iterator of Path objects that match the pattern. + """Return an iterator of Path objects that match the pattern. `pattern` - a path relative to this directory, with wildcards. @@ -744,64 +612,72 @@ class Path(text_type): # --- Reading or writing an entire file at once. def open(self, *args, **kwargs): - """ Open this file and return a corresponding :class:`file` object. + """Open this file and return a corresponding file object. Keyword arguments work as in :func:`io.open`. If the file cannot be - opened, an :class:`~exceptions.OSError` is raised. + opened, an :class:`OSError` is raised. """ - with io_error_compat(): - return io.open(self, *args, **kwargs) + return io.open(self, *args, **kwargs) def bytes(self): - """ Open this file, read all bytes, return them as a string. """ + """Open this file, read all bytes, return them as a string.""" with self.open('rb') as f: return f.read() def chunks(self, size, *args, **kwargs): - """ Returns a generator yielding chunks of the file, so it can - be read piece by piece with a simple for loop. + """Returns a generator yielding chunks of the file, so it can + be read piece by piece with a simple for loop. - Any argument you pass after `size` will be passed to :meth:`open`. + Any argument you pass after `size` will be passed to :meth:`open`. - :example: + :example: - >>> hash = hashlib.md5() - >>> for chunk in Path("path.py").chunks(8192, mode='rb'): - ... hash.update(chunk) + >>> hash = hashlib.md5() + >>> for chunk in Path("CHANGES.rst").chunks(8192, mode='rb'): + ... hash.update(chunk) - This will read the file by chunks of 8192 bytes. + This will read the file by chunks of 8192 bytes. """ with self.open(*args, **kwargs) as f: for chunk in iter(lambda: f.read(size) or None, None): yield chunk def write_bytes(self, bytes, append=False): - """ Open this file and write the given bytes to it. + """Open this file and write the given bytes to it. Default behavior is to overwrite any existing file. Call ``p.write_bytes(bytes, append=True)`` to append instead. """ - if append: - mode = 'ab' - else: - mode = 'wb' - with self.open(mode) as f: + with self.open('ab' if append else 'wb') as f: f.write(bytes) - def text(self, encoding=None, errors='strict'): - r""" Open this file, read it in, return the content as a string. + def read_text(self, encoding=None, errors=None): + r"""Open this file, read it in, return the content as a string. - All newline sequences are converted to ``'\n'``. Keyword arguments - will be passed to :meth:`open`. + Optional parameters are passed to :meth:`open`. .. seealso:: :meth:`lines` """ - with self.open(mode='r', encoding=encoding, errors=errors) as f: - return U_NEWLINE.sub('\n', f.read()) + with self.open(encoding=encoding, errors=errors) as f: + return f.read() - def write_text(self, text, encoding=None, errors='strict', - linesep=os.linesep, append=False): - r""" Write the given text to this file. + def read_bytes(self): + r"""Return the contents of this file as bytes.""" + with self.open(mode='rb') as f: + return f.read() + + def text(self, encoding=None, errors='strict'): + r"""Legacy function to read text. + + Converts all newline sequences to ``\n``. + """ + warnings.warn(".text is deprecated; use read_text", DeprecationWarning) + return U_NEWLINE.sub('\n', self.read_text(encoding, errors)) + + def write_text( + self, text, encoding=None, errors='strict', linesep=os.linesep, append=False + ): + r"""Write the given text to this file. The default behavior is to overwrite any existing file; to append instead, use the `append=True` keyword argument. @@ -812,24 +688,22 @@ class Path(text_type): Parameters: - `text` - str/unicode - The text to be written. + `text` - str/bytes - The text to be written. - `encoding` - str - The Unicode encoding that will be used. - This is ignored if `text` isn't a Unicode string. + `encoding` - str - The text encoding used. `errors` - str - How to handle Unicode encoding errors. Default is ``'strict'``. See ``help(unicode.encode)`` for the - options. This is ignored if `text` isn't a Unicode - string. + options. Ignored if `text` isn't a Unicode string. `linesep` - keyword argument - str/unicode - The sequence of characters to be used to mark end-of-line. The default is - :data:`os.linesep`. You can also specify ``None`` to - leave all newlines as they are in `text`. + :data:`os.linesep`. Specify ``None`` to + use newlines unmodified. `append` - keyword argument - bool - Specifies what to do if the file already exists (``True``: append to the end of it; - ``False``: overwrite it.) The default is ``False``. + ``False``: overwrite it). The default is ``False``. --- Newline handling. @@ -839,18 +713,13 @@ class Path(text_type): end-of-line sequence (see :data:`os.linesep`; on Windows, for example, the end-of-line marker is ``'\r\n'``). - If you don't like your platform's default, you can override it - using the `linesep=` keyword argument. If you specifically want - ``write_text()`` to preserve the newlines as-is, use ``linesep=None``. - - This applies to Unicode text the same as to 8-bit text, except - there are three additional standard Unicode end-of-line sequences: - ``u'\x85'``, ``u'\r\x85'``, and ``u'\u2028'``. - - (This is slightly different from when you open a file for - writing with ``fopen(filename, "w")`` in C or ``open(filename, 'w')`` - in Python.) + To override the platform's default, pass the `linesep=` + keyword argument. To preserve the newlines as-is, pass + ``linesep=None``. + This handling applies to Unicode text and bytes, except + with Unicode, additional non-ASCII newlines are recognized: + ``\x85``, ``\r\x85``, and ``\u2028``. --- Unicode @@ -862,39 +731,52 @@ class Path(text_type): specified `encoding` (or the default encoding if `encoding` isn't specified). The `errors` argument applies only to this conversion. - """ - if isinstance(text, text_type): + if isinstance(text, str): if linesep is not None: text = U_NEWLINE.sub(linesep, text) - text = text.encode(encoding or sys.getdefaultencoding(), errors) + bytes = text.encode(encoding or sys.getdefaultencoding(), errors) else: + warnings.warn( + "Writing bytes in write_text is deprecated", + DeprecationWarning, + stacklevel=1, + ) assert encoding is None - text = NEWLINE.sub(linesep, text) - self.write_bytes(text, append=append) + if linesep is not None: + text = B_NEWLINE.sub(linesep.encode(), text) + bytes = text + self.write_bytes(bytes, append=append) - def lines(self, encoding=None, errors='strict', retain=True): - r""" Open this file, read all lines, return them in a list. + def lines(self, encoding=None, errors=None, retain=True): + r"""Open this file, read all lines, return them in a list. Optional arguments: `encoding` - The Unicode encoding (or character set) of - the file. The default is ``None``, meaning the content - of the file is read as 8-bit characters and returned - as a list of (non-Unicode) str objects. - `errors` - How to handle Unicode errors; see help(str.decode) - for the options. Default is ``'strict'``. - `retain` - If ``True``, retain newline characters; but all newline - character combinations (``'\r'``, ``'\n'``, ``'\r\n'``) are - translated to ``'\n'``. If ``False``, newline characters are - stripped off. Default is ``True``. + the file. The default is ``None``, meaning use + ``locale.getpreferredencoding()``. + `errors` - How to handle Unicode errors; see + `open `_ + for the options. Default is ``None`` meaning "strict". + `retain` - If ``True`` (default), retain newline characters, + but translate all newline + characters to ``\n``. If ``False``, newline characters are + omitted. .. seealso:: :meth:`text` """ - return self.text(encoding, errors).splitlines(retain) + text = U_NEWLINE.sub('\n', self.read_text(encoding, errors)) + return text.splitlines(retain) - def write_lines(self, lines, encoding=None, errors='strict', - linesep=os.linesep, append=False): - r""" Write the given lines of text to this file. + def write_lines( + self, + lines, + encoding=None, + errors='strict', + linesep=_default_linesep, + append=False, + ): + r"""Write the given lines of text to this file. By default this overwrites any existing file at this path. @@ -909,7 +791,7 @@ class Path(text_type): `errors` - How to handle errors in Unicode encoding. This also applies only to Unicode strings. - linesep - The desired line-ending. This line-ending is + linesep - (deprecated) The desired line-ending. This line-ending is applied to every line. If a line already has any standard line ending (``'\r'``, ``'\n'``, ``'\r\n'``, ``u'\x85'``, ``u'\r\x85'``, ``u'\u2028'``), that will @@ -917,32 +799,28 @@ class Path(text_type): default is os.linesep, which is platform-dependent (``'\r\n'`` on Windows, ``'\n'`` on Unix, etc.). Specify ``None`` to write the lines as-is, like - :meth:`file.writelines`. + ``.writelines`` on a file object. Use the keyword argument ``append=True`` to append lines to the file. The default is to overwrite the file. - - .. warning :: - - When you use this with Unicode data, if the encoding of the - existing data in the file is different from the encoding - you specify with the `encoding=` parameter, the result is - mixed-encoding data, which can really confuse someone trying - to read the file later. """ - with self.open('ab' if append else 'wb') as f: - for line in lines: - isUnicode = isinstance(line, text_type) - if linesep is not None: - pattern = U_NL_END if isUnicode else NL_END - line = pattern.sub('', line) + linesep - if isUnicode: - line = line.encode( - encoding or sys.getdefaultencoding(), errors) - f.write(line) + mode = 'a' if append else 'w' + with self.open(mode, encoding=encoding, errors=errors, newline='') as f: + f.writelines(self._replace_linesep(lines, linesep)) + + @staticmethod + def _replace_linesep(lines, linesep): + if linesep != _default_linesep: + warnings.warn("linesep is deprecated", DeprecationWarning, stacklevel=3) + else: + linesep = os.linesep + if linesep is None: + return lines + + return (line + linesep for line in _strip_newlines(lines)) def read_md5(self): - """ Calculate the md5 hash for this file. + """Calculate the md5 hash for this file. This reads through the entire file. @@ -951,7 +829,7 @@ class Path(text_type): return self.read_hash('md5') def _hash(self, hash_name): - """ Returns a hash object for the file at the current path. + """Returns a hash object for the file at the current path. `hash_name` should be a hash algo name (such as ``'md5'`` or ``'sha1'``) that's available in the :mod:`hashlib` module. @@ -962,7 +840,7 @@ class Path(text_type): return m def read_hash(self, hash_name): - """ Calculate given hash for this file. + """Calculate given hash for this file. List of supported hashes can be obtained from :mod:`hashlib` package. This reads the entire file. @@ -972,7 +850,7 @@ class Path(text_type): return self._hash(hash_name).digest() def read_hexhash(self, hash_name): - """ Calculate given hash for this file, returning hexdigest. + """Calculate given hash for this file, returning hexdigest. List of supported hashes can be obtained from :mod:`hashlib` package. This reads the entire file. @@ -987,121 +865,154 @@ class Path(text_type): # bound. Playing it safe and wrapping them all in method calls. def isabs(self): - """ .. seealso:: :func:`os.path.isabs` """ + """ + >>> Path('.').isabs() + False + + .. seealso:: :func:`os.path.isabs` + """ return self.module.isabs(self) def exists(self): - """ .. seealso:: :func:`os.path.exists` """ + """.. seealso:: :func:`os.path.exists`""" return self.module.exists(self) def isdir(self): - """ .. seealso:: :func:`os.path.isdir` """ + """.. seealso:: :func:`os.path.isdir`""" return self.module.isdir(self) def isfile(self): - """ .. seealso:: :func:`os.path.isfile` """ + """.. seealso:: :func:`os.path.isfile`""" return self.module.isfile(self) def islink(self): - """ .. seealso:: :func:`os.path.islink` """ + """.. seealso:: :func:`os.path.islink`""" return self.module.islink(self) def ismount(self): - """ .. seealso:: :func:`os.path.ismount` """ + """ + >>> Path('.').ismount() + False + + .. seealso:: :func:`os.path.ismount` + """ return self.module.ismount(self) def samefile(self, other): - """ .. seealso:: :func:`os.path.samefile` """ - if not hasattr(self.module, 'samefile'): - other = Path(other).realpath().normpath().normcase() - return self.realpath().normpath().normcase() == other + """.. seealso:: :func:`os.path.samefile`""" return self.module.samefile(self, other) def getatime(self): - """ .. seealso:: :attr:`atime`, :func:`os.path.getatime` """ + """.. seealso:: :attr:`atime`, :func:`os.path.getatime`""" return self.module.getatime(self) atime = property( - getatime, None, None, - """ Last access time of the file. + getatime, + None, + None, + """ + Last access time of the file. + + >>> Path('.').atime > 0 + True .. seealso:: :meth:`getatime`, :func:`os.path.getatime` - """) + """, + ) def getmtime(self): - """ .. seealso:: :attr:`mtime`, :func:`os.path.getmtime` """ + """.. seealso:: :attr:`mtime`, :func:`os.path.getmtime`""" return self.module.getmtime(self) mtime = property( - getmtime, None, None, - """ Last-modified time of the file. + getmtime, + None, + None, + """ + Last modified time of the file. .. seealso:: :meth:`getmtime`, :func:`os.path.getmtime` - """) + """, + ) def getctime(self): - """ .. seealso:: :attr:`ctime`, :func:`os.path.getctime` """ + """.. seealso:: :attr:`ctime`, :func:`os.path.getctime`""" return self.module.getctime(self) ctime = property( - getctime, None, None, + getctime, + None, + None, """ Creation time of the file. .. seealso:: :meth:`getctime`, :func:`os.path.getctime` - """) + """, + ) def getsize(self): - """ .. seealso:: :attr:`size`, :func:`os.path.getsize` """ + """.. seealso:: :attr:`size`, :func:`os.path.getsize`""" return self.module.getsize(self) size = property( - getsize, None, None, + getsize, + None, + None, """ Size of the file, in bytes. .. seealso:: :meth:`getsize`, :func:`os.path.getsize` - """) + """, + ) - if hasattr(os, 'access'): - def access(self, mode): - """ Return ``True`` if current user has access to this path. + def access(self, *args, **kwargs): + """ + Return does the real user have access to this path. - mode - One of the constants :data:`os.F_OK`, :data:`os.R_OK`, - :data:`os.W_OK`, :data:`os.X_OK` + >>> Path('.').access(os.F_OK) + True - .. seealso:: :func:`os.access` - """ - return os.access(self, mode) + .. seealso:: :func:`os.access` + """ + return os.access(self, *args, **kwargs) def stat(self): - """ Perform a ``stat()`` system call on this path. + """ + Perform a ``stat()`` system call on this path. + + >>> Path('.').stat() + os.stat_result(...) .. seealso:: :meth:`lstat`, :func:`os.stat` """ return os.stat(self) def lstat(self): - """ Like :meth:`stat`, but do not follow symbolic links. + """ + Like :meth:`stat`, but do not follow symbolic links. + + >>> Path('.').lstat() == Path('.').stat() + True .. seealso:: :meth:`stat`, :func:`os.lstat` """ return os.lstat(self) - def __get_owner_windows(self): - """ + def __get_owner_windows(self): # pragma: nocover + r""" Return the name of the owner of this file or directory. Follow symbolic links. - Return a name of the form ``r'DOMAIN\\User Name'``; may be a group. + Return a name of the form ``DOMAIN\User Name``; may be a group. .. seealso:: :attr:`owner` """ desc = win32security.GetFileSecurity( - self, win32security.OWNER_SECURITY_INFORMATION) + self, win32security.OWNER_SECURITY_INFORMATION + ) sid = desc.GetSecurityDescriptorOwner() account, domain, typecode = win32security.LookupAccountSid(None, sid) return domain + '\\' + account - def __get_owner_unix(self): + def __get_owner_unix(self): # pragma: nocover """ Return the name of the owner of this file or directory. Follow symbolic links. @@ -1111,44 +1022,50 @@ class Path(text_type): st = self.stat() return pwd.getpwuid(st.st_uid).pw_name - def __get_owner_not_implemented(self): + def __get_owner_not_implemented(self): # pragma: nocover raise NotImplementedError("Ownership not available on this platform.") - if 'win32security' in globals(): - get_owner = __get_owner_windows - elif 'pwd' in globals(): - get_owner = __get_owner_unix - else: - get_owner = __get_owner_not_implemented + get_owner = ( + __get_owner_windows + if 'win32security' in globals() + else __get_owner_unix + if 'pwd' in globals() + else __get_owner_not_implemented + ) owner = property( - get_owner, None, None, + get_owner, + None, + None, """ Name of the owner of this file or directory. - .. seealso:: :meth:`get_owner`""") + .. seealso:: :meth:`get_owner`""", + ) if hasattr(os, 'statvfs'): + def statvfs(self): - """ Perform a ``statvfs()`` system call on this path. + """Perform a ``statvfs()`` system call on this path. .. seealso:: :func:`os.statvfs` """ return os.statvfs(self) if hasattr(os, 'pathconf'): + def pathconf(self, name): - """ .. seealso:: :func:`os.pathconf` """ + """.. seealso:: :func:`os.pathconf`""" return os.pathconf(self, name) # # --- Modifying operations on files and directories - def utime(self, times): - """ Set the access and modified times of this file. + def utime(self, *args, **kwargs): + """Set the access and modified times of this file. .. seealso:: :func:`os.utime` """ - os.utime(self, times) + os.utime(self, *args, **kwargs) return self def chmod(self, mode): @@ -1158,36 +1075,37 @@ class Path(text_type): .. seealso:: :func:`os.chmod` """ - if isinstance(mode, string_types): - mask = _multi_permission_mask(mode) + if isinstance(mode, str): + mask = masks.compound(mode) mode = mask(self.stat().st_mode) os.chmod(self, mode) return self - def chown(self, uid=-1, gid=-1): - """ - Change the owner and group by names rather than the uid or gid numbers. + if hasattr(os, 'chown'): - .. seealso:: :func:`os.chown` - """ - if hasattr(os, 'chown'): - if 'pwd' in globals() and isinstance(uid, string_types): - uid = pwd.getpwnam(uid).pw_uid - if 'grp' in globals() and isinstance(gid, string_types): - gid = grp.getgrnam(gid).gr_gid - os.chown(self, uid, gid) - else: - msg = "Ownership not available on this platform." - raise NotImplementedError(msg) - return self + def chown(self, uid=-1, gid=-1): + """ + Change the owner and group by names or numbers. + + .. seealso:: :func:`os.chown` + """ + + def resolve_uid(uid): + return uid if isinstance(uid, int) else pwd.getpwnam(uid).pw_uid + + def resolve_gid(gid): + return gid if isinstance(gid, int) else grp.getgrnam(gid).gr_gid + + os.chown(self, resolve_uid(uid), resolve_gid(gid)) + return self def rename(self, new): - """ .. seealso:: :func:`os.rename` """ + """.. seealso:: :func:`os.rename`""" os.rename(self, new) return self._next_class(new) def renames(self, new): - """ .. seealso:: :func:`os.renames` """ + """.. seealso:: :func:`os.renames`""" os.renames(self, new) return self._next_class(new) @@ -1195,74 +1113,60 @@ class Path(text_type): # --- Create/delete operations on directories def mkdir(self, mode=0o777): - """ .. seealso:: :func:`os.mkdir` """ + """.. seealso:: :func:`os.mkdir`""" os.mkdir(self, mode) return self def mkdir_p(self, mode=0o777): - """ Like :meth:`mkdir`, but does not raise an exception if the - directory already exists. """ - try: + """Like :meth:`mkdir`, but does not raise an exception if the + directory already exists.""" + with contextlib.suppress(FileExistsError): self.mkdir(mode) - except OSError: - _, e, _ = sys.exc_info() - if e.errno != errno.EEXIST: - raise return self def makedirs(self, mode=0o777): - """ .. seealso:: :func:`os.makedirs` """ + """.. seealso:: :func:`os.makedirs`""" os.makedirs(self, mode) return self def makedirs_p(self, mode=0o777): - """ Like :meth:`makedirs`, but does not raise an exception if the - directory already exists. """ - try: + """Like :meth:`makedirs`, but does not raise an exception if the + directory already exists.""" + with contextlib.suppress(FileExistsError): self.makedirs(mode) - except OSError: - _, e, _ = sys.exc_info() - if e.errno != errno.EEXIST: - raise return self def rmdir(self): - """ .. seealso:: :func:`os.rmdir` """ + """.. seealso:: :func:`os.rmdir`""" os.rmdir(self) return self def rmdir_p(self): - """ Like :meth:`rmdir`, but does not raise an exception if the - directory is not empty or does not exist. """ - try: - self.rmdir() - except OSError: - _, e, _ = sys.exc_info() - bypass_codes = errno.ENOTEMPTY, errno.EEXIST, errno.ENOENT - if e.errno not in bypass_codes: - raise + """Like :meth:`rmdir`, but does not raise an exception if the + directory is not empty or does not exist.""" + suppressed = FileNotFoundError, FileExistsError, DirectoryNotEmpty + with contextlib.suppress(suppressed): + with DirectoryNotEmpty.translate(): + self.rmdir() return self def removedirs(self): - """ .. seealso:: :func:`os.removedirs` """ + """.. seealso:: :func:`os.removedirs`""" os.removedirs(self) return self def removedirs_p(self): - """ Like :meth:`removedirs`, but does not raise an exception if the - directory is not empty or does not exist. """ - try: - self.removedirs() - except OSError: - _, e, _ = sys.exc_info() - if e.errno != errno.ENOTEMPTY and e.errno != errno.EEXIST: - raise + """Like :meth:`removedirs`, but does not raise an exception if the + directory is not empty or does not exist.""" + with contextlib.suppress(FileExistsError, DirectoryNotEmpty): + with DirectoryNotEmpty.translate(): + self.removedirs() return self # --- Modifying operations on files def touch(self): - """ Set the access/modified times of this file to the current time. + """Set the access/modified times of this file to the current time. Create the file if it does not exist. """ fd = os.open(self, os.O_WRONLY | os.O_CREAT, 0o666) @@ -1271,78 +1175,61 @@ class Path(text_type): return self def remove(self): - """ .. seealso:: :func:`os.remove` """ + """.. seealso:: :func:`os.remove`""" os.remove(self) return self def remove_p(self): - """ Like :meth:`remove`, but does not raise an exception if the - file does not exist. """ - try: + """Like :meth:`remove`, but does not raise an exception if the + file does not exist.""" + with contextlib.suppress(FileNotFoundError): self.unlink() - except FileNotFoundError as exc: - if PY2 and exc.errno != errno.ENOENT: - raise return self - def unlink(self): - """ .. seealso:: :func:`os.unlink` """ - os.unlink(self) - return self - - def unlink_p(self): - """ Like :meth:`unlink`, but does not raise an exception if the - file does not exist. """ - self.remove_p() - return self + unlink = remove + unlink_p = remove_p # --- Links - if hasattr(os, 'link'): - def link(self, newpath): - """ Create a hard link at `newpath`, pointing to this file. + def link(self, newpath): + """Create a hard link at `newpath`, pointing to this file. - .. seealso:: :func:`os.link` - """ - os.link(self, newpath) - return self._next_class(newpath) + .. seealso:: :func:`os.link` + """ + os.link(self, newpath) + return self._next_class(newpath) - if hasattr(os, 'symlink'): - def symlink(self, newlink=None): - """ Create a symbolic link at `newlink`, pointing here. + def symlink(self, newlink=None): + """Create a symbolic link at `newlink`, pointing here. - If newlink is not supplied, the symbolic link will assume - the name self.basename(), creating the link in the cwd. + If newlink is not supplied, the symbolic link will assume + the name self.basename(), creating the link in the cwd. - .. seealso:: :func:`os.symlink` - """ - if newlink is None: - newlink = self.basename() - os.symlink(self, newlink) - return self._next_class(newlink) + .. seealso:: :func:`os.symlink` + """ + if newlink is None: + newlink = self.basename() + os.symlink(self, newlink) + return self._next_class(newlink) - if hasattr(os, 'readlink'): - def readlink(self): - """ Return the path to which this symbolic link points. + def readlink(self): + """Return the path to which this symbolic link points. - The result may be an absolute or a relative path. + The result may be an absolute or a relative path. - .. seealso:: :meth:`readlinkabs`, :func:`os.readlink` - """ - return self._next_class(os.readlink(self)) + .. seealso:: :meth:`readlinkabs`, :func:`os.readlink` + """ + return self._next_class(os.readlink(self)) - def readlinkabs(self): - """ Return the path to which this symbolic link points. + def readlinkabs(self): + """Return the path to which this symbolic link points. - The result is always an absolute path. + The result is always an absolute path. - .. seealso:: :meth:`readlink`, :func:`os.readlink` - """ - p = self.readlink() - if p.isabs(): - return p - else: - return (self.parent / p).abspath() + .. seealso:: :meth:`readlink`, :func:`os.readlink` + """ + p = self.readlink() + return p if p.isabs() else (self.parent / p).abspath() # High-level functions from shutil # These functions will be bound to the instance such that @@ -1359,28 +1246,26 @@ class Path(text_type): rmtree = shutil.rmtree def rmtree_p(self): - """ Like :meth:`rmtree`, but does not raise an exception if the - directory does not exist. """ - try: + """Like :meth:`rmtree`, but does not raise an exception if the + directory does not exist.""" + with contextlib.suppress(FileNotFoundError): self.rmtree() - except OSError: - _, e, _ = sys.exc_info() - if e.errno != errno.ENOENT: - raise return self def chdir(self): - """ .. seealso:: :func:`os.chdir` """ + """.. seealso:: :func:`os.chdir`""" os.chdir(self) cd = chdir def merge_tree( - self, dst, symlinks=False, - # * - update=False, - copy_function=shutil.copy2, - ignore=lambda dir, contents: []): + self, + dst, + symlinks=False, + *, + copy_function=shutil.copy2, + ignore=lambda dir, contents: [], + ): """ Copy entire contents of self to dst, overwriting existing contents in dst with those in self. @@ -1397,15 +1282,6 @@ class Path(text_type): dst = self._next_class(dst) dst.makedirs_p() - if update: - warnings.warn( - "Update is deprecated; " - "use copy_function=only_newer(shutil.copy2)", - DeprecationWarning, - stacklevel=2, - ) - copy_function = only_newer(copy_function) - sources = self.listdir() _ignored = ignore(self, [item.name for item in sources]) @@ -1421,7 +1297,6 @@ class Path(text_type): source.merge_tree( dest, symlinks=symlinks, - update=update, copy_function=copy_function, ignore=ignore, ) @@ -1434,22 +1309,29 @@ class Path(text_type): # --- Special stuff from os if hasattr(os, 'chroot'): - def chroot(self): - """ .. seealso:: :func:`os.chroot` """ + + def chroot(self): # pragma: nocover + """.. seealso:: :func:`os.chroot`""" os.chroot(self) if hasattr(os, 'startfile'): - def startfile(self): - """ .. seealso:: :func:`os.startfile` """ - os.startfile(self) + + def startfile(self, *args, **kwargs): # pragma: nocover + """.. seealso:: :func:`os.startfile`""" + os.startfile(self, *args, **kwargs) return self # in-place re-writing, courtesy of Martijn Pieters # http://www.zopatista.com/python/2013/11/26/inplace-file-rewriting/ @contextlib.contextmanager def in_place( - self, mode='r', buffering=-1, encoding=None, errors=None, - newline=None, backup_extension=None, + self, + mode='r', + buffering=-1, + encoding=None, + errors=None, + newline=None, + backup_extension=None, ): """ A context in which a file may be re-written in-place with @@ -1476,68 +1358,62 @@ class Path(text_type): Thereafter, the file at `filename` will have line numbers in it. """ - import io - if set(mode).intersection('wa+'): raise ValueError('Only read-only file modes can be used') # move existing file to backup, create new file with same permissions # borrowed extensively from the fileinput module backup_fn = self + (backup_extension or os.extsep + 'bak') - try: - os.unlink(backup_fn) - except os.error: - pass - os.rename(self, backup_fn) + backup_fn.remove_p() + self.rename(backup_fn) readable = io.open( - backup_fn, mode, buffering=buffering, - encoding=encoding, errors=errors, newline=newline, + backup_fn, + mode, + buffering=buffering, + encoding=encoding, + errors=errors, + newline=newline, ) try: perm = os.fstat(readable.fileno()).st_mode except OSError: - writable = open( - self, 'w' + mode.replace('r', ''), - buffering=buffering, encoding=encoding, errors=errors, + writable = self.open( + 'w' + mode.replace('r', ''), + buffering=buffering, + encoding=encoding, + errors=errors, newline=newline, ) else: os_mode = os.O_CREAT | os.O_WRONLY | os.O_TRUNC - if hasattr(os, 'O_BINARY'): - os_mode |= os.O_BINARY + os_mode |= getattr(os, 'O_BINARY', 0) fd = os.open(self, os_mode, perm) writable = io.open( - fd, "w" + mode.replace('r', ''), - buffering=buffering, encoding=encoding, errors=errors, + fd, + "w" + mode.replace('r', ''), + buffering=buffering, + encoding=encoding, + errors=errors, newline=newline, ) - try: - if hasattr(os, 'chmod'): - os.chmod(self, perm) - except OSError: - pass + with contextlib.suppress(OSError, AttributeError): + self.chmod(perm) try: yield readable, writable except Exception: # move backup back readable.close() writable.close() - try: - os.unlink(self) - except os.error: - pass - os.rename(backup_fn, self) + self.remove_p() + backup_fn.rename(self) raise else: readable.close() writable.close() finally: - try: - os.unlink(backup_fn) - except os.error: - pass + backup_fn.remove_p() - @ClassProperty + @classes.ClassProperty @classmethod def special(cls): """ @@ -1563,24 +1439,64 @@ class Path(text_type): return functools.partial(SpecialResolver, cls) +class DirectoryNotEmpty(OSError): + @staticmethod + @contextlib.contextmanager + def translate(): + try: + yield + except OSError as exc: + if exc.errno == errno.ENOTEMPTY: + raise DirectoryNotEmpty(*exc.args) from exc + raise + + def only_newer(copy_func): """ Wrap a copy function (like shutil.copy2) to return the dst if it's newer than the source. """ + @functools.wraps(copy_func) def wrapper(src, dst, *args, **kwargs): - is_newer_dst = ( - dst.exists() - and dst.getmtime() >= src.getmtime() - ) + is_newer_dst = dst.exists() and dst.getmtime() >= src.getmtime() if is_newer_dst: return dst return copy_func(src, dst, *args, **kwargs) + return wrapper -class SpecialResolver(object): +class ExtantPath(Path): + """ + >>> ExtantPath('.') + ExtantPath('.') + >>> ExtantPath('does-not-exist') + Traceback (most recent call last): + OSError: does-not-exist does not exist. + """ + + def _validate(self): + if not self.exists(): + raise OSError(f"{self} does not exist.") + + +class ExtantFile(Path): + """ + >>> ExtantFile('.') + Traceback (most recent call last): + FileNotFoundError: . does not exist as a file. + >>> ExtantFile('does-not-exist') + Traceback (most recent call last): + FileNotFoundError: does-not-exist does not exist as a file. + """ + + def _validate(self): + if not self.isfile(): + raise FileNotFoundError(f"{self} does not exist as a file.") + + +class SpecialResolver: class ResolverScope: def __init__(self, paths, scope): self.paths = paths @@ -1592,13 +1508,8 @@ class SpecialResolver(object): def __init__(self, path_class, *args, **kwargs): appdirs = importlib.import_module('appdirs') - # let appname default to None until - # https://github.com/ActiveState/appdirs/issues/55 is solved. - not args and kwargs.setdefault('appname', None) - vars(self).update( - path_class=path_class, - wrapper=appdirs.AppDirs(*args, **kwargs), + path_class=path_class, wrapper=appdirs.AppDirs(*args, **kwargs) ) def __getattr__(self, scope): @@ -1619,11 +1530,10 @@ class Multi: """ A mix-in for a Path which may contain multiple Path separated by pathsep. """ + @classmethod def for_class(cls, path_cls): name = 'Multi' + path_cls.__name__ - if PY2: - name = str(name) return type(name, (cls, path_cls), {}) @classmethod @@ -1635,17 +1545,13 @@ class Multi: def __iter__(self): return iter(map(self._next_class, self.split(os.pathsep))) - @ClassProperty + @classes.ClassProperty @classmethod def _next_class(cls): """ Multi-subclasses should use the parent class """ - return next( - class_ - for class_ in cls.__mro__ - if not issubclass(class_, Multi) - ) + return next(class_ for class_ in cls.__mro__ if not issubclass(class_, Multi)) class TempDir(Path): @@ -1654,17 +1560,21 @@ class TempDir(Path): constructed with the same parameters that you can use as a context manager. - Example:: + For example: - with TempDir() as d: - # do stuff with the Path object "d" + >>> with TempDir() as d: + ... d.isdir() and isinstance(d, Path) + True - # here the directory is deleted automatically + The directory is deleted automatically. + + >>> d.isdir() + False .. seealso:: :func:`tempfile.mkdtemp` """ - @ClassProperty + @classes.ClassProperty @classmethod def _next_class(cls): return Path @@ -1684,138 +1594,21 @@ class TempDir(Path): return self._next_class(self) def __exit__(self, exc_type, exc_value, traceback): - if not exc_value: - self.rmtree() + self.rmtree() -# For backwards compatibility. -tempdir = TempDir +class Handlers: + def strict(msg): + raise + def warn(msg): + warnings.warn(msg, TreeWalkWarning) -def _multi_permission_mask(mode): - """ - Support multiple, comma-separated Unix chmod symbolic modes. + def ignore(msg): + pass - >>> _multi_permission_mask('a=r,u+w')(0) == 0o644 - True - """ - def compose(f, g): - return lambda *args, **kwargs: g(f(*args, **kwargs)) - return functools.reduce(compose, map(_permission_mask, mode.split(','))) - - -def _permission_mask(mode): - """ - Convert a Unix chmod symbolic mode like ``'ugo+rwx'`` to a function - suitable for applying to a mask to affect that change. - - >>> mask = _permission_mask('ugo+rwx') - >>> mask(0o554) == 0o777 - True - - >>> _permission_mask('go-x')(0o777) == 0o766 - True - - >>> _permission_mask('o-x')(0o445) == 0o444 - True - - >>> _permission_mask('a+x')(0) == 0o111 - True - - >>> _permission_mask('a=rw')(0o057) == 0o666 - True - - >>> _permission_mask('u=x')(0o666) == 0o166 - True - - >>> _permission_mask('g=')(0o157) == 0o107 - True - """ - # parse the symbolic mode - parsed = re.match('(?P[ugoa]+)(?P[-+=])(?P[rwx]*)$', mode) - if not parsed: - raise ValueError("Unrecognized symbolic mode", mode) - - # generate a mask representing the specified permission - spec_map = dict(r=4, w=2, x=1) - specs = (spec_map[perm] for perm in parsed.group('what')) - spec = functools.reduce(operator.or_, specs, 0) - - # now apply spec to each subject in who - shift_map = dict(u=6, g=3, o=0) - who = parsed.group('who').replace('a', 'ugo') - masks = (spec << shift_map[subj] for subj in who) - mask = functools.reduce(operator.or_, masks) - - op = parsed.group('op') - - # if op is -, invert the mask - if op == '-': - mask ^= 0o777 - - # if op is =, retain extant values for unreferenced subjects - if op == '=': - masks = (0o7 << shift_map[subj] for subj in who) - retain = functools.reduce(operator.or_, masks) ^ 0o777 - - op_map = { - '+': operator.or_, - '-': operator.and_, - '=': lambda mask, target: target & retain ^ mask, - } - return functools.partial(op_map[op], mask) - - -class CaseInsensitivePattern(matchers.CaseInsensitive): - def __init__(self, value): - warnings.warn( - "Use matchers.CaseInsensitive instead", - DeprecationWarning, - stacklevel=2, - ) - super(CaseInsensitivePattern, self).__init__(value) - - -class FastPath(Path): - def __init__(self, *args, **kwargs): - warnings.warn( - "Use Path, as FastPath no longer holds any advantage", - DeprecationWarning, - stacklevel=2, - ) - super(FastPath, self).__init__(*args, **kwargs) - - -def patch_for_linux_python2(): - """ - As reported in #130, when Linux users create filenames - not in the file system encoding, it creates problems on - Python 2. This function attempts to patch the os module - to make it behave more like that on Python 3. - """ - if not PY2 or platform.system() != 'Linux': - return - - try: - import backports.os - except ImportError: - return - - class OS: - """ - The proxy to the os module - """ - def __init__(self, wrapped): - self._orig = wrapped - - def __getattr__(self, name): - return getattr(self._orig, name) - - def listdir(self, *args, **kwargs): - items = self._orig.listdir(*args, **kwargs) - return list(map(backports.os.fsdecode, items)) - - globals().update(os=OS(os)) - - -patch_for_linux_python2() + @classmethod + def _resolve(cls, param): + if not callable(param) and param not in vars(Handlers): + raise ValueError("invalid errors parameter") + return vars(cls).get(param, param) diff --git a/libs/win/path/__init__.pyi b/libs/win/path/__init__.pyi new file mode 100644 index 00000000..a0b8f561 --- /dev/null +++ b/libs/win/path/__init__.pyi @@ -0,0 +1,483 @@ +from __future__ import annotations + +import builtins +import contextlib +import os +import shutil +import sys +from io import ( + BufferedRandom, + BufferedReader, + BufferedWriter, + FileIO, + TextIOWrapper, +) +from types import ModuleType, TracebackType +from typing import ( + Any, + AnyStr, + BinaryIO, + Callable, + Generator, + Iterable, + Iterator, + IO, + List, + Optional, + Set, + Tuple, + Type, + Union, + overload, +) + +from _typeshed import ( + OpenBinaryMode, + OpenBinaryModeUpdating, + OpenBinaryModeReading, + OpenBinaryModeWriting, + OpenTextMode, + Self, +) +from typing_extensions import Literal + +from . import classes + +# Type for the match argument for several methods +_Match = Optional[Union[str, Callable[[str], bool], Callable[[Path], bool]]] + +class TreeWalkWarning(Warning): + pass + +class Traversal: + follow: Callable[[Path], bool] + def __init__(self, follow: Callable[[Path], bool]): ... + def __call__( + self, + walker: Generator[Path, Optional[Callable[[], bool]], None], + ) -> Iterator[Path]: ... + +class Path(str): + module: Any + def __init__(self, other: Any = ...) -> None: ... + @classmethod + def using_module(cls, module: ModuleType) -> Type[Path]: ... + @classes.ClassProperty + @classmethod + def _next_class(cls: Type[Self]) -> Type[Self]: ... + def __repr__(self) -> str: ... + def __add__(self: Self, more: str) -> Self: ... + def __radd__(self: Self, other: str) -> Self: ... + def __div__(self: Self, rel: str) -> Self: ... + def __truediv__(self: Self, rel: str) -> Self: ... + def __rdiv__(self: Self, rel: str) -> Self: ... + def __rtruediv__(self: Self, rel: str) -> Self: ... + def __enter__(self: Self) -> Self: ... + def __exit__( + self, + exc_type: Optional[type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: ... + @classmethod + def getcwd(cls: Type[Self]) -> Self: ... + def abspath(self: Self) -> Self: ... + def normcase(self: Self) -> Self: ... + def normpath(self: Self) -> Self: ... + def realpath(self: Self) -> Self: ... + def expanduser(self: Self) -> Self: ... + def expandvars(self: Self) -> Self: ... + def dirname(self: Self) -> Self: ... + def basename(self: Self) -> Self: ... + def expand(self: Self) -> Self: ... + @property + def stem(self) -> str: ... + @property + def ext(self) -> str: ... + def with_suffix(self: Self, suffix: str) -> Self: ... + @property + def drive(self: Self) -> Self: ... + @property + def parent(self: Self) -> Self: ... + @property + def name(self: Self) -> Self: ... + def splitpath(self: Self) -> Tuple[Self, str]: ... + def splitdrive(self: Self) -> Tuple[Self, Self]: ... + def splitext(self: Self) -> Tuple[Self, str]: ... + def stripext(self: Self) -> Self: ... + @classes.multimethod + def joinpath(cls: Self, first: str, *others: str) -> Self: ... + def splitall(self: Self) -> List[Union[Self, str]]: ... + def parts(self: Self) -> Tuple[Union[Self, str], ...]: ... + def _parts(self: Self) -> Iterator[Union[Self, str]]: ... + def _parts_iter(self: Self) -> Iterator[Union[Self, str]]: ... + def relpath(self: Self, start: str = ...) -> Self: ... + def relpathto(self: Self, dest: str) -> Self: ... + # --- Listing, searching, walking, and matching + def listdir(self: Self, match: _Match = ...) -> List[Self]: ... + def dirs(self: Self, match: _Match = ...) -> List[Self]: ... + def files(self: Self, match: _Match = ...) -> List[Self]: ... + def walk( + self: Self, + match: _Match = ..., + errors: str = ..., + ) -> Generator[Self, Optional[Callable[[], bool]], None]: ... + def walkdirs( + self: Self, + match: _Match = ..., + errors: str = ..., + ) -> Iterator[Self]: ... + def walkfiles( + self: Self, + match: _Match = ..., + errors: str = ..., + ) -> Iterator[Self]: ... + def fnmatch( + self, + pattern: Union[Path, str], + normcase: Optional[Callable[[str], str]] = ..., + ) -> bool: ... + def glob(self: Self, pattern: str) -> List[Self]: ... + def iglob(self: Self, pattern: str) -> Iterator[Self]: ... + @overload + def open( + self, + mode: OpenTextMode = ..., + buffering: int = ..., + encoding: Optional[str] = ..., + errors: Optional[str] = ..., + newline: Optional[str] = ..., + closefd: bool = ..., + opener: Optional[Callable[[str, int], int]] = ..., + ) -> TextIOWrapper: ... + @overload + def open( + self, + mode: OpenBinaryMode, + buffering: Literal[0], + encoding: Optional[str] = ..., + errors: Optional[str] = ..., + newline: Optional[str] = ..., + closefd: bool = ..., + opener: Callable[[str, int], int] = ..., + ) -> FileIO: ... + @overload + def open( + self, + mode: OpenBinaryModeUpdating, + buffering: Literal[-1, 1] = ..., + encoding: Optional[str] = ..., + errors: Optional[str] = ..., + newline: Optional[str] = ..., + closefd: bool = ..., + opener: Callable[[str, int], int] = ..., + ) -> BufferedRandom: ... + @overload + def open( + self, + mode: OpenBinaryModeReading, + buffering: Literal[-1, 1] = ..., + encoding: Optional[str] = ..., + errors: Optional[str] = ..., + newline: Optional[str] = ..., + closefd: bool = ..., + opener: Callable[[str, int], int] = ..., + ) -> BufferedReader: ... + @overload + def open( + self, + mode: OpenBinaryModeWriting, + buffering: Literal[-1, 1] = ..., + encoding: Optional[str] = ..., + errors: Optional[str] = ..., + newline: Optional[str] = ..., + closefd: bool = ..., + opener: Callable[[str, int], int] = ..., + ) -> BufferedWriter: ... + @overload + def open( + self, + mode: OpenBinaryMode, + buffering: int, + encoding: Optional[str] = ..., + errors: Optional[str] = ..., + newline: Optional[str] = ..., + closefd: bool = ..., + opener: Callable[[str, int], int] = ..., + ) -> BinaryIO: ... + @overload + def open( + self, + mode: str, + buffering: int = ..., + encoding: Optional[str] = ..., + errors: Optional[str] = ..., + newline: Optional[str] = ..., + closefd: bool = ..., + opener: Callable[[str, int], int] = ..., + ) -> IO[Any]: ... + def bytes(self) -> builtins.bytes: ... + @overload + def chunks( + self, + size: int, + mode: OpenTextMode = ..., + buffering: int = ..., + encoding: Optional[str] = ..., + errors: Optional[str] = ..., + newline: Optional[str] = ..., + closefd: bool = ..., + opener: Optional[Callable[[str, int], int]] = ..., + ) -> Iterator[str]: ... + @overload + def chunks( + self, + size: int, + mode: OpenBinaryMode, + buffering: int = ..., + encoding: Optional[str] = ..., + errors: Optional[str] = ..., + newline: Optional[str] = ..., + closefd: bool = ..., + opener: Optional[Callable[[str, int], int]] = ..., + ) -> Iterator[builtins.bytes]: ... + @overload + def chunks( + self, + size: int, + mode: str, + buffering: int = ..., + encoding: Optional[str] = ..., + errors: Optional[str] = ..., + newline: Optional[str] = ..., + closefd: bool = ..., + opener: Optional[Callable[[str, int], int]] = ..., + ) -> Iterator[Union[str, builtins.bytes]]: ... + def write_bytes(self, bytes: builtins.bytes, append: bool = ...) -> None: ... + def read_text( + self, encoding: Optional[str] = ..., errors: Optional[str] = ... + ) -> str: ... + def read_bytes(self) -> builtins.bytes: ... + def text(self, encoding: Optional[str] = ..., errors: str = ...) -> str: ... + @overload + def write_text( + self, + text: str, + encoding: Optional[str] = ..., + errors: str = ..., + linesep: Optional[str] = ..., + append: bool = ..., + ) -> None: ... + @overload + def write_text( + self, + text: builtins.bytes, + encoding: None = ..., + errors: str = ..., + linesep: Optional[str] = ..., + append: bool = ..., + ) -> None: ... + def lines( + self, + encoding: Optional[str] = ..., + errors: Optional[str] = ..., + retain: bool = ..., + ) -> List[str]: ... + def write_lines( + self, + lines: List[str], + encoding: Optional[str] = ..., + errors: str = ..., + linesep: Optional[str] = ..., + append: bool = ..., + ) -> None: ... + def read_md5(self) -> builtins.bytes: ... + def read_hash(self, hash_name: str) -> builtins.bytes: ... + def read_hexhash(self, hash_name: str) -> str: ... + def isabs(self) -> bool: ... + def exists(self) -> bool: ... + def isdir(self) -> bool: ... + def isfile(self) -> bool: ... + def islink(self) -> bool: ... + def ismount(self) -> bool: ... + def samefile(self, other: str) -> bool: ... + def getatime(self) -> float: ... + @property + def atime(self) -> float: ... + def getmtime(self) -> float: ... + @property + def mtime(self) -> float: ... + def getctime(self) -> float: ... + @property + def ctime(self) -> float: ... + def getsize(self) -> int: ... + @property + def size(self) -> int: ... + def access( + self, + mode: int, + *, + dir_fd: Optional[int] = ..., + effective_ids: bool = ..., + follow_symlinks: bool = ..., + ) -> bool: ... + def stat(self) -> os.stat_result: ... + def lstat(self) -> os.stat_result: ... + def get_owner(self) -> str: ... + @property + def owner(self) -> str: ... + if sys.platform != 'win32': + def statvfs(self) -> os.statvfs_result: ... + def pathconf(self, name: Union[str, int]) -> int: ... + + def utime( + self, + times: Union[Tuple[int, int], Tuple[float, float], None] = ..., + *, + ns: Tuple[int, int] = ..., + dir_fd: Optional[int] = ..., + follow_symlinks: bool = ..., + ) -> Path: ... + def chmod(self: Self, mode: Union[str, int]) -> Self: ... + if sys.platform != 'win32': + def chown( + self: Self, uid: Union[int, str] = ..., gid: Union[int, str] = ... + ) -> Self: ... + + def rename(self: Self, new: str) -> Self: ... + def renames(self: Self, new: str) -> Self: ... + def mkdir(self: Self, mode: int = ...) -> Self: ... + def mkdir_p(self: Self, mode: int = ...) -> Self: ... + def makedirs(self: Self, mode: int = ...) -> Self: ... + def makedirs_p(self: Self, mode: int = ...) -> Self: ... + def rmdir(self: Self) -> Self: ... + def rmdir_p(self: Self) -> Self: ... + def removedirs(self: Self) -> Self: ... + def removedirs_p(self: Self) -> Self: ... + def touch(self: Self) -> Self: ... + def remove(self: Self) -> Self: ... + def remove_p(self: Self) -> Self: ... + def unlink(self: Self) -> Self: ... + def unlink_p(self: Self) -> Self: ... + def link(self: Self, newpath: str) -> Self: ... + def symlink(self: Self, newlink: Optional[str] = ...) -> Self: ... + def readlink(self: Self) -> Self: ... + def readlinkabs(self: Self) -> Self: ... + def copyfile(self, dst: str, *, follow_symlinks: bool = ...) -> str: ... + def copymode(self, dst: str, *, follow_symlinks: bool = ...) -> None: ... + def copystat(self, dst: str, *, follow_symlinks: bool = ...) -> None: ... + def copy(self, dst: str, *, follow_symlinks: bool = ...) -> Any: ... + def copy2(self, dst: str, *, follow_symlinks: bool = ...) -> Any: ... + def copytree( + self, + dst: str, + symlinks: bool = ..., + ignore: Optional[Callable[[str, list[str]], Iterable[str]]] = ..., + copy_function: Callable[[str, str], None] = ..., + ignore_dangling_symlinks: bool = ..., + dirs_exist_ok: bool = ..., + ) -> Any: ... + def move( + self, dst: str, copy_function: Callable[[str, str], None] = ... + ) -> Any: ... + def rmtree( + self, + ignore_errors: bool = ..., + onerror: Optional[Callable[[Any, Any, Any], Any]] = ..., + ) -> None: ... + def rmtree_p(self: Self) -> Self: ... + def chdir(self) -> None: ... + def cd(self) -> None: ... + def merge_tree( + self, + dst: str, + symlinks: bool = ..., + *, + copy_function: Callable[[str, str], None] = ..., + ignore: Callable[[Any, List[str]], Union[List[str], Set[str]]] = ..., + ) -> None: ... + if sys.platform != 'win32': + def chroot(self) -> None: ... + if sys.platform == 'win32': + def startfile(self: Self, operation: Optional[str] = ...) -> Self: ... + + @contextlib.contextmanager + def in_place( + self, + mode: str = ..., + buffering: int = ..., + encoding: Optional[str] = ..., + errors: Optional[str] = ..., + newline: Optional[str] = ..., + backup_extension: Optional[str] = ..., + ) -> Iterator[Tuple[IO[Any], IO[Any]]]: ... + @classes.ClassProperty + @classmethod + def special(cls) -> Callable[[Optional[str]], SpecialResolver]: ... + +class DirectoryNotEmpty(OSError): + @staticmethod + def translate() -> Iterator[None]: ... + +def only_newer(copy_func: Callable[[str, str], None]) -> Callable[[str, str], None]: ... + +class ExtantPath(Path): + def _validate(self) -> None: ... + +class ExtantFile(Path): + def _validate(self) -> None: ... + +class SpecialResolver: + class ResolverScope: + def __init__(self, paths: SpecialResolver, scope: str) -> None: ... + def __getattr__(self, class_: str) -> MultiPathType: ... + + def __init__( + self, + path_class: type, + appname: Optional[str] = ..., + appauthor: Optional[str] = ..., + version: Optional[str] = ..., + roaming: bool = ..., + multipath: bool = ..., + ): ... + def __getattr__(self, scope: str) -> ResolverScope: ... + def get_dir(self, scope: str, class_: str) -> MultiPathType: ... + +class Multi: + @classmethod + def for_class(cls, path_cls: type) -> Type[MultiPathType]: ... + @classmethod + def detect(cls, input: str) -> MultiPathType: ... + def __iter__(self) -> Iterator[Path]: ... + @classes.ClassProperty + @classmethod + def _next_class(cls) -> Type[Path]: ... + +class MultiPathType(Multi, Path): + pass + +class TempDir(Path): + @classes.ClassProperty + @classmethod + def _next_class(cls) -> Type[Path]: ... + def __new__( + cls: Type[Self], + suffix: Optional[AnyStr] = ..., + prefix: Optional[AnyStr] = ..., + dir: Optional[Union[AnyStr, os.PathLike[AnyStr]]] = ..., + ) -> Self: ... + def __init__(self) -> None: ... + def __enter__(self) -> Path: ... # type: ignore + def __exit__( + self, + exc_type: Optional[type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: ... + +class Handlers: + @classmethod + def _resolve( + cls, param: Union[str, Callable[[str], None]] + ) -> Callable[[str], None]: ... diff --git a/libs/win/path/classes.py b/libs/win/path/classes.py new file mode 100644 index 00000000..b6101d0a --- /dev/null +++ b/libs/win/path/classes.py @@ -0,0 +1,27 @@ +import functools + + +class ClassProperty(property): + def __get__(self, cls, owner): + return self.fget.__get__(None, owner)() + + +class multimethod: + """ + Acts like a classmethod when invoked from the class and like an + instancemethod when invoked from the instance. + """ + + def __init__(self, func): + self.func = func + + def __get__(self, instance, owner): + """ + If called on an instance, pass the instance as the first + argument. + """ + return ( + functools.partial(self.func, owner) + if instance is None + else functools.partial(self.func, owner, instance) + ) diff --git a/libs/win/path/classes.pyi b/libs/win/path/classes.pyi new file mode 100644 index 00000000..2878c48b --- /dev/null +++ b/libs/win/path/classes.pyi @@ -0,0 +1,8 @@ +from typing import Any, Callable, Optional + +class ClassProperty(property): + def __get__(self, cls: Any, owner: Optional[type] = ...) -> Any: ... + +class multimethod: + def __init__(self, func: Callable[..., Any]): ... + def __get__(self, instance: Any, owner: Optional[type]) -> Any: ... diff --git a/libs/win/path/masks.py b/libs/win/path/masks.py new file mode 100644 index 00000000..761e51f8 --- /dev/null +++ b/libs/win/path/masks.py @@ -0,0 +1,85 @@ +import re +import functools +import operator + + +# from jaraco.functools +def compose(*funcs): + compose_two = lambda f1, f2: lambda *args, **kwargs: f1(f2(*args, **kwargs)) # noqa + return functools.reduce(compose_two, funcs) + + +def compound(mode): + """ + Support multiple, comma-separated Unix chmod symbolic modes. + + >>> oct(compound('a=r,u+w')(0)) + '0o644' + """ + return compose(*map(simple, reversed(mode.split(',')))) + + +def simple(mode): + """ + Convert a Unix chmod symbolic mode like ``'ugo+rwx'`` to a function + suitable for applying to a mask to affect that change. + + >>> mask = simple('ugo+rwx') + >>> mask(0o554) == 0o777 + True + + >>> simple('go-x')(0o777) == 0o766 + True + + >>> simple('o-x')(0o445) == 0o444 + True + + >>> simple('a+x')(0) == 0o111 + True + + >>> simple('a=rw')(0o057) == 0o666 + True + + >>> simple('u=x')(0o666) == 0o166 + True + + >>> simple('g=')(0o157) == 0o107 + True + + >>> simple('gobbledeegook') + Traceback (most recent call last): + ValueError: ('Unrecognized symbolic mode', 'gobbledeegook') + """ + # parse the symbolic mode + parsed = re.match('(?P[ugoa]+)(?P[-+=])(?P[rwx]*)$', mode) + if not parsed: + raise ValueError("Unrecognized symbolic mode", mode) + + # generate a mask representing the specified permission + spec_map = dict(r=4, w=2, x=1) + specs = (spec_map[perm] for perm in parsed.group('what')) + spec = functools.reduce(operator.or_, specs, 0) + + # now apply spec to each subject in who + shift_map = dict(u=6, g=3, o=0) + who = parsed.group('who').replace('a', 'ugo') + masks = (spec << shift_map[subj] for subj in who) + mask = functools.reduce(operator.or_, masks) + + op = parsed.group('op') + + # if op is -, invert the mask + if op == '-': + mask ^= 0o777 + + # if op is =, retain extant values for unreferenced subjects + if op == '=': + masks = (0o7 << shift_map[subj] for subj in who) + retain = functools.reduce(operator.or_, masks) ^ 0o777 + + op_map = { + '+': operator.or_, + '-': operator.and_, + '=': lambda mask, target: target & retain ^ mask, + } + return functools.partial(op_map[op], mask) diff --git a/libs/win/path/masks.pyi b/libs/win/path/masks.pyi new file mode 100644 index 00000000..d69bf202 --- /dev/null +++ b/libs/win/path/masks.pyi @@ -0,0 +1,5 @@ +from typing import Any, Callable + +def compose(*funcs: Callable[..., Any]) -> Callable[..., Any]: ... +def compound(mode: str) -> Callable[[int], int]: ... +def simple(mode: str) -> Callable[[int], int]: ... diff --git a/libs/win/path/matchers.py b/libs/win/path/matchers.py new file mode 100644 index 00000000..63ca218a --- /dev/null +++ b/libs/win/path/matchers.py @@ -0,0 +1,59 @@ +import ntpath +import fnmatch + + +def load(param): + """ + If the supplied parameter is a string, assume it's a simple + pattern. + """ + return ( + Pattern(param) + if isinstance(param, str) + else param + if param is not None + else Null() + ) + + +class Base: + pass + + +class Null(Base): + def __call__(self, path): + return True + + +class Pattern(Base): + def __init__(self, pattern): + self.pattern = pattern + + def get_pattern(self, normcase): + try: + return self._pattern + except AttributeError: + pass + self._pattern = normcase(self.pattern) + return self._pattern + + def __call__(self, path): + normcase = getattr(self, 'normcase', path.module.normcase) + pattern = self.get_pattern(normcase) + return fnmatch.fnmatchcase(normcase(path.name), pattern) + + +class CaseInsensitive(Pattern): + """ + A Pattern with a ``'normcase'`` property, suitable for passing to + :meth:`listdir`, :meth:`dirs`, :meth:`files`, :meth:`walk`, + :meth:`walkdirs`, or :meth:`walkfiles` to match case-insensitive. + + For example, to get all files ending in .py, .Py, .pY, or .PY in the + current directory:: + + from path import Path, matchers + Path('.').files(matchers.CaseInsensitive('*.py')) + """ + + normcase = staticmethod(ntpath.normcase) diff --git a/libs/win/path/matchers.pyi b/libs/win/path/matchers.pyi new file mode 100644 index 00000000..80acd0b1 --- /dev/null +++ b/libs/win/path/matchers.pyi @@ -0,0 +1,28 @@ +from __future__ import annotations + +from typing import Any, Callable, overload + +from typing_extensions import Literal + +from path import Path + +@overload +def load(param: None) -> Null: ... +@overload +def load(param: str) -> Pattern: ... +@overload +def load(param: Any) -> Any: ... + +class Base: + pass + +class Null(Base): + def __call__(self, path: str) -> Literal[True]: ... + +class Pattern(Base): + def __init__(self, pattern: str) -> None: ... + def get_pattern(self, normcase: Callable[[str], str]) -> str: ... + def __call__(self, path: Path) -> bool: ... + +class CaseInsensitive(Pattern): + normcase: Callable[[str], str] diff --git a/libs/win/path/py.typed b/libs/win/path/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/libs/win/path/py37compat.py b/libs/win/path/py37compat.py new file mode 100644 index 00000000..f2a9e8b4 --- /dev/null +++ b/libs/win/path/py37compat.py @@ -0,0 +1,125 @@ +import functools +import os + + +def best_realpath(module): + """ + Given a path module (i.e. ntpath, posixpath), + determine the best 'realpath' function to use + for best future compatibility. + """ + needs_backport = module.realpath is module.abspath + return realpath_backport if needs_backport else module.realpath + + +# backport taken from jaraco.windows 5 +def realpath_backport(path): + if isinstance(path, str): + prefix = '\\\\?\\' + unc_prefix = prefix + 'UNC' + new_unc_prefix = '\\' + cwd = os.getcwd() + else: + prefix = b'\\\\?\\' + unc_prefix = prefix + b'UNC' + new_unc_prefix = b'\\' + cwd = os.getcwdb() + had_prefix = path.startswith(prefix) + path, ok = _resolve_path(cwd, path, {}) + # The path returned by _getfinalpathname will always start with \\?\ - + # strip off that prefix unless it was already provided on the original + # path. + if not had_prefix: + # For UNC paths, the prefix will actually be \\?\UNC - handle that + # case as well. + if path.startswith(unc_prefix): + path = new_unc_prefix + path[len(unc_prefix) :] + elif path.startswith(prefix): + path = path[len(prefix) :] + return path + + +def _resolve_path(path, rest, seen): # noqa: C901 + # Windows normalizes the path before resolving symlinks; be sure to + # follow the same behavior. + rest = os.path.normpath(rest) + + if isinstance(rest, str): + sep = '\\' + else: + sep = b'\\' + + if os.path.isabs(rest): + drive, rest = os.path.splitdrive(rest) + path = drive + sep + rest = rest[1:] + + while rest: + name, _, rest = rest.partition(sep) + new_path = os.path.join(path, name) if path else name + if os.path.exists(new_path): + if not rest: + # The whole path exists. Resolve it using the OS. + path = os.path._getfinalpathname(new_path) + else: + # The OS can resolve `new_path`; keep traversing the path. + path = new_path + elif not os.path.lexists(new_path): + # `new_path` does not exist on the filesystem at all. Use the + # OS to resolve `path`, if it exists, and then append the + # remainder. + if os.path.exists(path): + path = os.path._getfinalpathname(path) + rest = os.path.join(name, rest) if rest else name + return os.path.join(path, rest), True + else: + # We have a symbolic link that the OS cannot resolve. Try to + # resolve it ourselves. + + # On Windows, symbolic link resolution can be partially or + # fully disabled [1]. The end result of a disabled symlink + # appears the same as a broken symlink (lexists() returns True + # but exists() returns False). And in both cases, the link can + # still be read using readlink(). Call stat() and check the + # resulting error code to ensure we don't circumvent the + # Windows symbolic link restrictions. + # [1] https://technet.microsoft.com/en-us/library/cc754077.aspx + try: + os.stat(new_path) + except OSError as e: + # WinError 1463: The symbolic link cannot be followed + # because its type is disabled. + if e.winerror == 1463: + raise + + key = os.path.normcase(new_path) + if key in seen: + # This link has already been seen; try to use the + # previously resolved value. + path = seen[key] + if path is None: + # It has not yet been resolved, which means we must + # have a symbolic link loop. Return what we have + # resolved so far plus the remainder of the path (who + # cares about the Zen of Python?). + path = os.path.join(new_path, rest) if rest else new_path + return path, False + else: + # Mark this link as in the process of being resolved. + seen[key] = None + # Try to resolve it. + path, ok = _resolve_path(path, os.readlink(new_path), seen) + if ok: + # Resolution succeded; store the resolved value. + seen[key] = path + else: + # Resolution failed; punt. + return (os.path.join(path, rest) if rest else path), False + return path, True + + +def lru_cache(user_function): + """ + Support for lru_cache(user_function) + """ + return functools.lru_cache()(user_function) diff --git a/libs/win/path/py37compat.pyi b/libs/win/path/py37compat.pyi new file mode 100644 index 00000000..ea62fa06 --- /dev/null +++ b/libs/win/path/py37compat.pyi @@ -0,0 +1,17 @@ +import os + +from types import ModuleType +from typing import Any, AnyStr, Callable, Dict, Tuple, overload + +def best_realpath(module: ModuleType) -> Callable[[AnyStr], AnyStr]: ... +@overload +def realpath_backport(path: str) -> str: ... +@overload +def realpath_backport(path: bytes) -> bytes: ... +@overload +def _resolve_path(path: str, rest: str, seen: Dict[Any, Any]) -> Tuple[str, bool]: ... +@overload +def _resolve_path( + path: bytes, rest: bytes, seen: Dict[Any, Any] +) -> Tuple[bytes, bool]: ... +def lru_cache(user_function: Callable[..., Any]) -> Callable[..., Any]: ... diff --git a/libs/win/pydantic/__init__.cp37-win_amd64.pyd b/libs/win/pydantic/__init__.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..e6293456ada79c2dd4c89e5bfd1bced6ede87b50 GIT binary patch literal 34304 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 literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/__init__.py b/libs/win/pydantic/__init__.py new file mode 100644 index 00000000..3bf1418f --- /dev/null +++ b/libs/win/pydantic/__init__.py @@ -0,0 +1,131 @@ +# flake8: noqa +from . import dataclasses +from .annotated_types import create_model_from_namedtuple, create_model_from_typeddict +from .class_validators import root_validator, validator +from .config import BaseConfig, ConfigDict, Extra +from .decorator import validate_arguments +from .env_settings import BaseSettings +from .error_wrappers import ValidationError +from .errors import * +from .fields import Field, PrivateAttr, Required +from .main import * +from .networks import * +from .parse import Protocol +from .tools import * +from .types import * +from .version import VERSION, compiled + +__version__ = VERSION + +# WARNING __all__ from .errors is not included here, it will be removed as an export here in v2 +# please use "from pydantic.errors import ..." instead +__all__ = [ + # annotated types utils + 'create_model_from_namedtuple', + 'create_model_from_typeddict', + # dataclasses + 'dataclasses', + # class_validators + 'root_validator', + 'validator', + # config + 'BaseConfig', + 'ConfigDict', + 'Extra', + # decorator + 'validate_arguments', + # env_settings + 'BaseSettings', + # error_wrappers + 'ValidationError', + # fields + 'Field', + 'Required', + # main + 'BaseModel', + 'create_model', + 'validate_model', + # network + 'AnyUrl', + 'AnyHttpUrl', + 'FileUrl', + 'HttpUrl', + 'stricturl', + 'EmailStr', + 'NameEmail', + 'IPvAnyAddress', + 'IPvAnyInterface', + 'IPvAnyNetwork', + 'PostgresDsn', + 'CockroachDsn', + 'AmqpDsn', + 'RedisDsn', + 'MongoDsn', + 'KafkaDsn', + 'validate_email', + # parse + 'Protocol', + # tools + 'parse_file_as', + 'parse_obj_as', + 'parse_raw_as', + 'schema_of', + 'schema_json_of', + # types + 'NoneStr', + 'NoneBytes', + 'StrBytes', + 'NoneStrBytes', + 'StrictStr', + 'ConstrainedBytes', + 'conbytes', + 'ConstrainedList', + 'conlist', + 'ConstrainedSet', + 'conset', + 'ConstrainedFrozenSet', + 'confrozenset', + 'ConstrainedStr', + 'constr', + 'PyObject', + 'ConstrainedInt', + 'conint', + 'PositiveInt', + 'NegativeInt', + 'NonNegativeInt', + 'NonPositiveInt', + 'ConstrainedFloat', + 'confloat', + 'PositiveFloat', + 'NegativeFloat', + 'NonNegativeFloat', + 'NonPositiveFloat', + 'FiniteFloat', + 'ConstrainedDecimal', + 'condecimal', + 'ConstrainedDate', + 'condate', + 'UUID1', + 'UUID3', + 'UUID4', + 'UUID5', + 'FilePath', + 'DirectoryPath', + 'Json', + 'JsonWrapper', + 'SecretField', + 'SecretStr', + 'SecretBytes', + 'StrictBool', + 'StrictBytes', + 'StrictInt', + 'StrictFloat', + 'PaymentCardNumber', + 'PrivateAttr', + 'ByteSize', + 'PastDate', + 'FutureDate', + # version + 'compiled', + 'VERSION', +] diff --git a/libs/win/pydantic/_hypothesis_plugin.cp37-win_amd64.pyd b/libs/win/pydantic/_hypothesis_plugin.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..480ba0ae985cf9c9d98794f3c1fb26b2193b7316 GIT binary patch literal 154112 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 literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/_hypothesis_plugin.py b/libs/win/pydantic/_hypothesis_plugin.py new file mode 100644 index 00000000..a56d2b98 --- /dev/null +++ b/libs/win/pydantic/_hypothesis_plugin.py @@ -0,0 +1,386 @@ +""" +Register Hypothesis strategies for Pydantic custom types. + +This enables fully-automatic generation of test data for most Pydantic classes. + +Note that this module has *no* runtime impact on Pydantic itself; instead it +is registered as a setuptools entry point and Hypothesis will import it if +Pydantic is installed. See also: + +https://hypothesis.readthedocs.io/en/latest/strategies.html#registering-strategies-via-setuptools-entry-points +https://hypothesis.readthedocs.io/en/latest/data.html#hypothesis.strategies.register_type_strategy +https://hypothesis.readthedocs.io/en/latest/strategies.html#interaction-with-pytest-cov +https://pydantic-docs.helpmanual.io/usage/types/#pydantic-types + +Note that because our motivation is to *improve user experience*, the strategies +are always sound (never generate invalid data) but sacrifice completeness for +maintainability (ie may be unable to generate some tricky but valid data). + +Finally, this module makes liberal use of `# type: ignore[]` pragmas. +This is because Hypothesis annotates `register_type_strategy()` with +`(T, SearchStrategy[T])`, but in most cases we register e.g. `ConstrainedInt` +to generate instances of the builtin `int` type which match the constraints. +""" + +import contextlib +import datetime +import ipaddress +import json +import math +from fractions import Fraction +from typing import Callable, Dict, Type, Union, cast, overload + +import hypothesis.strategies as st + +import pydantic +import pydantic.color +import pydantic.types +from pydantic.utils import lenient_issubclass + +# FilePath and DirectoryPath are explicitly unsupported, as we'd have to create +# them on-disk, and that's unsafe in general without being told *where* to do so. +# +# URLs are unsupported because it's easy for users to define their own strategy for +# "normal" URLs, and hard for us to define a general strategy which includes "weird" +# URLs but doesn't also have unpredictable performance problems. +# +# conlist() and conset() are unsupported for now, because the workarounds for +# Cython and Hypothesis to handle parametrized generic types are incompatible. +# Once Cython can support 'normal' generics we'll revisit this. + +# Emails +try: + import email_validator +except ImportError: # pragma: no cover + pass +else: + + def is_valid_email(s: str) -> bool: + # Hypothesis' st.emails() occasionally generates emails like 0@A0--0.ac + # that are invalid according to email-validator, so we filter those out. + try: + email_validator.validate_email(s, check_deliverability=False) + return True + except email_validator.EmailNotValidError: # pragma: no cover + return False + + # Note that these strategies deliberately stay away from any tricky Unicode + # or other encoding issues; we're just trying to generate *something* valid. + st.register_type_strategy(pydantic.EmailStr, st.emails().filter(is_valid_email)) # type: ignore[arg-type] + st.register_type_strategy( + pydantic.NameEmail, + st.builds( + '{} <{}>'.format, # type: ignore[arg-type] + st.from_regex('[A-Za-z0-9_]+( [A-Za-z0-9_]+){0,5}', fullmatch=True), + st.emails().filter(is_valid_email), + ), + ) + +# PyObject - dotted names, in this case taken from the math module. +st.register_type_strategy( + pydantic.PyObject, # type: ignore[arg-type] + st.sampled_from( + [cast(pydantic.PyObject, f'math.{name}') for name in sorted(vars(math)) if not name.startswith('_')] + ), +) + +# CSS3 Colors; as name, hex, rgb(a) tuples or strings, or hsl strings +_color_regexes = ( + '|'.join( + ( + pydantic.color.r_hex_short, + pydantic.color.r_hex_long, + pydantic.color.r_rgb, + pydantic.color.r_rgba, + pydantic.color.r_hsl, + pydantic.color.r_hsla, + ) + ) + # Use more precise regex patterns to avoid value-out-of-range errors + .replace(pydantic.color._r_sl, r'(?:(\d\d?(?:\.\d+)?|100(?:\.0+)?)%)') + .replace(pydantic.color._r_alpha, r'(?:(0(?:\.\d+)?|1(?:\.0+)?|\.\d+|\d{1,2}%))') + .replace(pydantic.color._r_255, r'(?:((?:\d|\d\d|[01]\d\d|2[0-4]\d|25[0-4])(?:\.\d+)?|255(?:\.0+)?))') +) +st.register_type_strategy( + pydantic.color.Color, + st.one_of( + st.sampled_from(sorted(pydantic.color.COLORS_BY_NAME)), + st.tuples( + st.integers(0, 255), + st.integers(0, 255), + st.integers(0, 255), + st.none() | st.floats(0, 1) | st.floats(0, 100).map('{}%'.format), + ), + st.from_regex(_color_regexes, fullmatch=True), + ), +) + + +# Card numbers, valid according to the Luhn algorithm + + +def add_luhn_digit(card_number: str) -> str: + # See https://en.wikipedia.org/wiki/Luhn_algorithm + for digit in '0123456789': + with contextlib.suppress(Exception): + pydantic.PaymentCardNumber.validate_luhn_check_digit(card_number + digit) + return card_number + digit + raise AssertionError('Unreachable') # pragma: no cover + + +card_patterns = ( + # Note that these patterns omit the Luhn check digit; that's added by the function above + '4[0-9]{14}', # Visa + '5[12345][0-9]{13}', # Mastercard + '3[47][0-9]{12}', # American Express + '[0-26-9][0-9]{10,17}', # other (incomplete to avoid overlap) +) +st.register_type_strategy( + pydantic.PaymentCardNumber, + st.from_regex('|'.join(card_patterns), fullmatch=True).map(add_luhn_digit), # type: ignore[arg-type] +) + +# UUIDs +st.register_type_strategy(pydantic.UUID1, st.uuids(version=1)) +st.register_type_strategy(pydantic.UUID3, st.uuids(version=3)) +st.register_type_strategy(pydantic.UUID4, st.uuids(version=4)) +st.register_type_strategy(pydantic.UUID5, st.uuids(version=5)) + +# Secrets +st.register_type_strategy(pydantic.SecretBytes, st.binary().map(pydantic.SecretBytes)) +st.register_type_strategy(pydantic.SecretStr, st.text().map(pydantic.SecretStr)) + +# IP addresses, networks, and interfaces +st.register_type_strategy(pydantic.IPvAnyAddress, st.ip_addresses()) # type: ignore[arg-type] +st.register_type_strategy( + pydantic.IPvAnyInterface, + st.from_type(ipaddress.IPv4Interface) | st.from_type(ipaddress.IPv6Interface), # type: ignore[arg-type] +) +st.register_type_strategy( + pydantic.IPvAnyNetwork, + st.from_type(ipaddress.IPv4Network) | st.from_type(ipaddress.IPv6Network), # type: ignore[arg-type] +) + +# We hook into the con***() functions and the ConstrainedNumberMeta metaclass, +# so here we only have to register subclasses for other constrained types which +# don't go via those mechanisms. Then there are the registration hooks below. +st.register_type_strategy(pydantic.StrictBool, st.booleans()) +st.register_type_strategy(pydantic.StrictStr, st.text()) + + +# Constrained-type resolver functions +# +# For these ones, we actually want to inspect the type in order to work out a +# satisfying strategy. First up, the machinery for tracking resolver functions: + +RESOLVERS: Dict[type, Callable[[type], st.SearchStrategy]] = {} # type: ignore[type-arg] + + +@overload +def _registered(typ: Type[pydantic.types.T]) -> Type[pydantic.types.T]: + pass + + +@overload +def _registered(typ: pydantic.types.ConstrainedNumberMeta) -> pydantic.types.ConstrainedNumberMeta: + pass + + +def _registered( + typ: Union[Type[pydantic.types.T], pydantic.types.ConstrainedNumberMeta] +) -> Union[Type[pydantic.types.T], pydantic.types.ConstrainedNumberMeta]: + # This function replaces the version in `pydantic.types`, in order to + # effect the registration of new constrained types so that Hypothesis + # can generate valid examples. + pydantic.types._DEFINED_TYPES.add(typ) + for supertype, resolver in RESOLVERS.items(): + if issubclass(typ, supertype): + st.register_type_strategy(typ, resolver(typ)) # type: ignore + return typ + raise NotImplementedError(f'Unknown type {typ!r} has no resolver to register') # pragma: no cover + + +def resolves( + typ: Union[type, pydantic.types.ConstrainedNumberMeta] +) -> Callable[[Callable[..., st.SearchStrategy]], Callable[..., st.SearchStrategy]]: # type: ignore[type-arg] + def inner(f): # type: ignore + assert f not in RESOLVERS + RESOLVERS[typ] = f + return f + + return inner + + +# Type-to-strategy resolver functions + + +@resolves(pydantic.JsonWrapper) +def resolve_json(cls): # type: ignore[no-untyped-def] + try: + inner = st.none() if cls.inner_type is None else st.from_type(cls.inner_type) + except Exception: # pragma: no cover + finite = st.floats(allow_infinity=False, allow_nan=False) + inner = st.recursive( + base=st.one_of(st.none(), st.booleans(), st.integers(), finite, st.text()), + extend=lambda x: st.lists(x) | st.dictionaries(st.text(), x), # type: ignore + ) + inner_type = getattr(cls, 'inner_type', None) + return st.builds( + cls.inner_type.json if lenient_issubclass(inner_type, pydantic.BaseModel) else json.dumps, + inner, + ensure_ascii=st.booleans(), + indent=st.none() | st.integers(0, 16), + sort_keys=st.booleans(), + ) + + +@resolves(pydantic.ConstrainedBytes) +def resolve_conbytes(cls): # type: ignore[no-untyped-def] # pragma: no cover + min_size = cls.min_length or 0 + max_size = cls.max_length + if not cls.strip_whitespace: + return st.binary(min_size=min_size, max_size=max_size) + # Fun with regex to ensure we neither start nor end with whitespace + repeats = '{{{},{}}}'.format( + min_size - 2 if min_size > 2 else 0, + max_size - 2 if (max_size or 0) > 2 else '', + ) + if min_size >= 2: + pattern = rf'\W.{repeats}\W' + elif min_size == 1: + pattern = rf'\W(.{repeats}\W)?' + else: + assert min_size == 0 + pattern = rf'(\W(.{repeats}\W)?)?' + return st.from_regex(pattern.encode(), fullmatch=True) + + +@resolves(pydantic.ConstrainedDecimal) +def resolve_condecimal(cls): # type: ignore[no-untyped-def] + min_value = cls.ge + max_value = cls.le + if cls.gt is not None: + assert min_value is None, 'Set `gt` or `ge`, but not both' + min_value = cls.gt + if cls.lt is not None: + assert max_value is None, 'Set `lt` or `le`, but not both' + max_value = cls.lt + s = st.decimals(min_value, max_value, allow_nan=False, places=cls.decimal_places) + if cls.lt is not None: + s = s.filter(lambda d: d < cls.lt) + if cls.gt is not None: + s = s.filter(lambda d: cls.gt < d) + return s + + +@resolves(pydantic.ConstrainedFloat) +def resolve_confloat(cls): # type: ignore[no-untyped-def] + min_value = cls.ge + max_value = cls.le + exclude_min = False + exclude_max = False + + if cls.gt is not None: + assert min_value is None, 'Set `gt` or `ge`, but not both' + min_value = cls.gt + exclude_min = True + if cls.lt is not None: + assert max_value is None, 'Set `lt` or `le`, but not both' + max_value = cls.lt + exclude_max = True + + if cls.multiple_of is None: + return st.floats(min_value, max_value, exclude_min=exclude_min, exclude_max=exclude_max, allow_nan=False) + + if min_value is not None: + min_value = math.ceil(min_value / cls.multiple_of) + if exclude_min: + min_value = min_value + 1 + if max_value is not None: + assert max_value >= cls.multiple_of, 'Cannot build model with max value smaller than multiple of' + max_value = math.floor(max_value / cls.multiple_of) + if exclude_max: + max_value = max_value - 1 + + return st.integers(min_value, max_value).map(lambda x: x * cls.multiple_of) + + +@resolves(pydantic.ConstrainedInt) +def resolve_conint(cls): # type: ignore[no-untyped-def] + min_value = cls.ge + max_value = cls.le + if cls.gt is not None: + assert min_value is None, 'Set `gt` or `ge`, but not both' + min_value = cls.gt + 1 + if cls.lt is not None: + assert max_value is None, 'Set `lt` or `le`, but not both' + max_value = cls.lt - 1 + + if cls.multiple_of is None or cls.multiple_of == 1: + return st.integers(min_value, max_value) + + # These adjustments and the .map handle integer-valued multiples, while the + # .filter handles trickier cases as for confloat. + if min_value is not None: + min_value = math.ceil(Fraction(min_value) / Fraction(cls.multiple_of)) + if max_value is not None: + max_value = math.floor(Fraction(max_value) / Fraction(cls.multiple_of)) + return st.integers(min_value, max_value).map(lambda x: x * cls.multiple_of) + + +@resolves(pydantic.ConstrainedDate) +def resolve_condate(cls): # type: ignore[no-untyped-def] + if cls.ge is not None: + assert cls.gt is None, 'Set `gt` or `ge`, but not both' + min_value = cls.ge + elif cls.gt is not None: + min_value = cls.gt + datetime.timedelta(days=1) + else: + min_value = datetime.date.min + if cls.le is not None: + assert cls.lt is None, 'Set `lt` or `le`, but not both' + max_value = cls.le + elif cls.lt is not None: + max_value = cls.lt - datetime.timedelta(days=1) + else: + max_value = datetime.date.max + return st.dates(min_value, max_value) + + +@resolves(pydantic.ConstrainedStr) +def resolve_constr(cls): # type: ignore[no-untyped-def] # pragma: no cover + min_size = cls.min_length or 0 + max_size = cls.max_length + + if cls.regex is None and not cls.strip_whitespace: + return st.text(min_size=min_size, max_size=max_size) + + if cls.regex is not None: + strategy = st.from_regex(cls.regex) + if cls.strip_whitespace: + strategy = strategy.filter(lambda s: s == s.strip()) + elif cls.strip_whitespace: + repeats = '{{{},{}}}'.format( + min_size - 2 if min_size > 2 else 0, + max_size - 2 if (max_size or 0) > 2 else '', + ) + if min_size >= 2: + strategy = st.from_regex(rf'\W.{repeats}\W') + elif min_size == 1: + strategy = st.from_regex(rf'\W(.{repeats}\W)?') + else: + assert min_size == 0 + strategy = st.from_regex(rf'(\W(.{repeats}\W)?)?') + + if min_size == 0 and max_size is None: + return strategy + elif max_size is None: + return strategy.filter(lambda s: min_size <= len(s)) + return strategy.filter(lambda s: min_size <= len(s) <= max_size) + + +# Finally, register all previously-defined types, and patch in our new function +for typ in list(pydantic.types._DEFINED_TYPES): + _registered(typ) +pydantic.types._registered = _registered +st.register_type_strategy(pydantic.Json, resolve_json) diff --git a/libs/win/pydantic/annotated_types.cp37-win_amd64.pyd b/libs/win/pydantic/annotated_types.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..6c9f0f37171345dece426e9397e0782b27a17337 GIT binary patch literal 67072 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 aPmW(0pBbl=m8wcLrM$3!um65mHSj;?bf0_x literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/annotated_types.py b/libs/win/pydantic/annotated_types.py new file mode 100644 index 00000000..d333457f --- /dev/null +++ b/libs/win/pydantic/annotated_types.py @@ -0,0 +1,72 @@ +import sys +from typing import TYPE_CHECKING, Any, Dict, FrozenSet, NamedTuple, Type + +from .fields import Required +from .main import BaseModel, create_model +from .typing import is_typeddict, is_typeddict_special + +if TYPE_CHECKING: + from typing_extensions import TypedDict + +if sys.version_info < (3, 11): + + def is_legacy_typeddict(typeddict_cls: Type['TypedDict']) -> bool: # type: ignore[valid-type] + return is_typeddict(typeddict_cls) and type(typeddict_cls).__module__ == 'typing' + +else: + + def is_legacy_typeddict(_: Any) -> Any: + return False + + +def create_model_from_typeddict( + # Mypy bug: `Type[TypedDict]` is resolved as `Any` https://github.com/python/mypy/issues/11030 + typeddict_cls: Type['TypedDict'], # type: ignore[valid-type] + **kwargs: Any, +) -> Type['BaseModel']: + """ + Create a `BaseModel` based on the fields of a `TypedDict`. + Since `typing.TypedDict` in Python 3.8 does not store runtime information about optional keys, + we raise an error if this happens (see https://bugs.python.org/issue38834). + """ + field_definitions: Dict[str, Any] + + # Best case scenario: with python 3.9+ or when `TypedDict` is imported from `typing_extensions` + if not hasattr(typeddict_cls, '__required_keys__'): + raise TypeError( + 'You should use `typing_extensions.TypedDict` instead of `typing.TypedDict` with Python < 3.9.2. ' + 'Without it, there is no way to differentiate required and optional fields when subclassed.' + ) + + if is_legacy_typeddict(typeddict_cls) and any( + is_typeddict_special(t) for t in typeddict_cls.__annotations__.values() + ): + raise TypeError( + 'You should use `typing_extensions.TypedDict` instead of `typing.TypedDict` with Python < 3.11. ' + 'Without it, there is no way to reflect Required/NotRequired keys.' + ) + + required_keys: FrozenSet[str] = typeddict_cls.__required_keys__ # type: ignore[attr-defined] + field_definitions = { + field_name: (field_type, Required if field_name in required_keys else None) + for field_name, field_type in typeddict_cls.__annotations__.items() + } + + return create_model(typeddict_cls.__name__, **kwargs, **field_definitions) + + +def create_model_from_namedtuple(namedtuple_cls: Type['NamedTuple'], **kwargs: Any) -> Type['BaseModel']: + """ + Create a `BaseModel` based on the fields of a named tuple. + A named tuple can be created with `typing.NamedTuple` and declared annotations + but also with `collections.namedtuple`, in this case we consider all fields + to have type `Any`. + """ + # With python 3.10+, `__annotations__` always exists but can be empty hence the `getattr... or...` logic + namedtuple_annotations: Dict[str, Type[Any]] = getattr(namedtuple_cls, '__annotations__', None) or { + k: Any for k in namedtuple_cls._fields + } + field_definitions: Dict[str, Any] = { + field_name: (field_type, Required) for field_name, field_type in namedtuple_annotations.items() + } + return create_model(namedtuple_cls.__name__, **kwargs, **field_definitions) diff --git a/libs/win/pydantic/class_validators.cp37-win_amd64.pyd b/libs/win/pydantic/class_validators.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..ff6f576ce4ba8615dfc203387eb4a23bcd38883d GIT binary patch literal 183296 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

-I<(rMoS!>(%0#jRB9rH8@#rh%qfkK+#2x{t_V z|96i9wqj^fwdy9=C?OjSOtpfDI?!RyN8hO#d`O2)3O>Z?s@Y`hrolw7H61n={lBcQ z42v3l6lAiOh6cc6mIz=#rg8s^aNuBM1{*;vw69_^)zImDNrdsnO<+|TBYH&#JkIr; z55m5RM}R|9QZwF|ByVCQHbufAS%)I=759J~7!13Nwk$u=iPF&#flc%UGB|;yqvK_L zldVmZqTfl&$>>+hqsWfF0tO_^*#C}7Kkh|MMhQl#?x6G?cL@?^ASv}u9ibA8HTeXtK-rW1wJuRRyoURY066B0|}8D6_HOUIKVsK z)p(AWqCQka=5-i)V3bGfgQuUNsv2|rw2D{mm}4gTg2WsgqbFiMYSAx{P+;kFu*K26 z;vA0d-D-p#%crFbJMIK=4!a1A)}TYkXOL%;;;%ySaYL~qC_8i!gGE+_KizY%mKy3eyD%NeP_(yb)>YI{}`-_YT_;FTztdC5W!eYu|F zsV#as1nXTyuscz6Rf5!iNNNa4)v7l}L3CZ_)) z#!`fxNwLNdA~~Il5?2-3=<^Vf};Nde+i8LP!QbzT}HyWNqEQ`c$ zA+cIY?|%ZL{9%HJJ-60i(Vs-M9jRuJD%4YR7s|MsZrxQc3YX(g-Hl3?MvRqx1l)UW=rt! zDtM_GJfH)=hXu<=96Ufj62Zf3=m-)#1W{nzRqsoKc@!|)UN z536Aul&8`5(1UrH$X>)c7(KX_6?r2IFsw5{k@_`^Wu%6yQZ@#G!zjEO=Vlzsat984 zfWTp*{4AM5aA?Ui{6xlGWmypoYLmpqO=RONvVpdS+>q&cc7H4uoq<0RD3mPG77^cs z3jNimHCyCXQuzAJ1O?1b(D$H&!k!gG{at}VPEw!%A0-he;3g3$fPx7WU@V}B5ik65 zSI@c{jJPE_k&Ikx7^&&KXrPc2eUIO4IG#7rHH^w0`-oB5Gz7jb*ZF6JvZAu1ra~>J zUt(1DI^02JcLEBP-A1?i{wq{K*+E1E^juaWJ+tU&$Ud<2QLseMW&Iiag^nR8ICIK> z4GI>+L1r%ynUm!036g&|B*%edqJJXHlHeYd+dea1xkKn#(jVI)5OGzmIc}wL|Gp0u zcnhj5bC)0B4wd_Tx>Rl%UXHv7<<|aaDi_@quiQTjC*R61d`t}uS}slw4Wv6Jg$8I` z)~`k?n|^9MG+=Uyv3w?acg@g%>-yoR13^QBz6n>oBytB^!}L588gv26*g*(fN~=UK zz!eC$1mPnM4TfoGFc_i1Fn4G$DsmD9l<;lV?POUC;$^*uG12y{Qg4mwO5@4sRO2z9 zWJl+r&q!$SQKdEjVhi4&aI~I_SC8MhE%v z=pdiGus*j^6TNdVHW@5km&?xv)9LC{=AmB zm8rQ4?uVkkUTiu+Htx^~>JmBZKMpTPo*7`;SmzkO{0L=xr0hKu$+wuIP0WL2m*f3J zyzgPKe+<4We%rQVVjkr21fefU=ot_~4L(KHYX&07)*tCSh@hHzkd0TOPG%nDv#VJL z4(DoDQiUSfoCnE~WM(K-;<82cMa}#&e8i&VnMPm`(C$fp zJdEUEKcD$*^MkY;6x-Pef+vDtvTSRnOU%TXoXc{~eoEA_gz z0=$=AXzJAucj!E`i5&Ka@p5F?rKVn13!cLY2UD+;$;N9f$%ZEaW{bkT(_~h=4tGyN z5P{hUQD`g?kS%m1G)R1^ROr-!w!kisf{d=cIb?hTbu7C|^iWef6%&D>qsBM{(2@=2 zqxirve+up*d8P?yYkd{`q5@Joh`0y4M1oUcI$DS9=6XIu8NP~V1gCcmZ_QWnkUYik zW=fwW_gFA7a~iM0Gx@+ZjLe^d`^aYa80?%ZUE1qzDY;X;k zlr;|%%BHMdEQ|Y5k!H>G206x)njiOL7-8}VQ`$+RPHy|Bpfx&-@XdTgf1KyeZGR`K zssqWieTLqcE`6Z|1_f7N zXo6em3qMYzzV|kL;VaysFYJT6hrY0NGGGHQwoPpM_}|}0=?$dx!KU;%&E2EP=Mz$n zCVzk3wqzo`b#a2$b%s`d&_dS=Lj*Mk6qwRl1IiI(w#GAZGnuVvB_K+j5DSxPI6)yg zV9tLpUdvHz`X$X$H9Z(z%xZP*omPeoKylh*3RPe?=b8$ZoF6#^&(#>X0J>^%qMR`- zXMmK0yiwCPfrqXoivKb&PfK9lPRw?Oqni39>M43vt5?DK{3&`2#oN{UyJPg?8JJ|3 zUObFj(Tn!fi@pU$FIuWzj3aW`zZ@?|dcyfo{)}Es-U^8|61{lPwB?kOt5A)zZ~$`O5}!FbEoROy61tgPG6c%0v+}`7|*eETBbh&t@^Pgxd7ZUvK7U zFc+Ll^F)8hz+1VV_fd$if{}jhX@)QfyNX{USeR*;Sw%>ACLg#*gDtp^EQhP$8oNhJ zxv#{_y_4li?@Kurs1dFy9d@TgTruetZ5RwD8ds#F1fz0qnuhVa3z6Xf-ec0@CNhy- zGp@jATV~cl1`TnPf|0&)VajmuB<4#^am!F#^o0|(LN%Alu=6RA8g(&oMShC7;;+!2 z+Hu8j)K-UsNiQc42QBeNd^l)Gwi-*v+hnBR182VS;m5ema-VT2&2l{uSG`P_Y|yU|l^2fUOm*G3y`>&w1$Hf4quM9UeRDkRRE7k+seFk^PradFUxndsEqF z6r#5Iqy&3kvK?9pZ?zqLZ>HfkAFddjEad26e5w1lQnuwicoSxq^O?gzCbFMt&)kvu*oAeqOXw;LUW zpI@w@X}Sh|>=U?#IKCM$?oh=uoOcU+VLf)Ke;^#9@5-AmAQHZRSRb!(E5pIFP05L* z>g$IK|kth$+lUD)3U)FMkULX#CK1&YaJ=Pzq*va^YF;m*{~ z-;UD(3lqj$!0Fj9(B$mUrBgK)S0lY_I`|cqR)qTExnjJajMCs2ysA zuG|s}*2aA@ym{5P&Bq4%^*cUkpvNXdN#rVdWnuT7( zLf<-;`lngvq}-TU*pXPS^4_zcM@68;AjNAzQRiZ`VfvHeP&Y-%Ld$>^&q8B4iiu#d zd2S3A-7ypr3GeBlpK;Dva#Fq_ta~*OQT*=~}g# zqnXx9$s{QNCZ&q7%Qz-ZbE2iALFbjxiqQ?Tkqhx;+%P;)ks-gZ_SdzR~R^ zxPxx@B68SYA1_Bf@2>KTXBS$L?R2O?VCmi9m=^F1FfHwl?83db{nzZmiO;y2ghqAK z>Nv@XhUEJ`l|!<=d(OQlUb!=^lX(N!c2(|j+)Cw|3`YfywUw)bJ5;VKk;DG4>12A6 zE7vo@$z;PxAvj^>uqYbChv!Z(U(?ByzMAA@LKCPP?!GEC;u!~o0n%6RLf=y-)5iQ9 zo7BnNfh+4|@@c}!jNmS^hRmBTY7*8J@6gGd0nVj`qTwcZE7x-i3i)pdYg2rInuG!T zvdQgRmZe381#EdT@}4ARJsvNs70XK9DMkHhb8Cm}ISI!y>uFVscLrHI1>@ z>nbEg!dmkTa6)Q2mKX|*W0_B0&@+*Ni~JN9pj0TBDDE{B7wv1xN{SWmsuHQuy2i1@ z+T2l|oIZO8IB)K(qKtfzS8PFSy=>vAk#UkNE3EB$S$k-}Sz=~(8ZxgEYwd5z75ISg9HBqcLj5`ze&01CgLg0y#S}m64sq``M8> zLFx@1!^8QMcvF4KcUHtX`;bkrv5_`+&7OoIc>}7&MubT;K4lf^166NEv6dr;gFen4 zC_d#DUgrlx1v{)OxtkYsE+f1s!NtCq|4b5<4kh}KlVIlPEHIN#W|CY>ZXm?NFpN)$ zZ`=JYMg{Eb4=XXj&;Mu|tu3 zzJn^UFsxyar3>_XN<8!UqhkXQ5Soe*!IyuiIb6kGio% zXo(~@_In~Zoj*o{86|AWDu0gcOpFifF+S{TLe9SfA#z{=MJC@hypE>{AJ)+#Z$^>E zhy4iXZXb4%mUnZaynj)(MsxcVv)tqiO&1#Rbjy znI@~;%}qLQ_yQprZqGK8ty1D%1P`}CJX)8B3%KZ(uOfpVCR3@QO4y99f!umKVM;2} zyQ3MV&%hlENmbRskC!|Ree~WaB z(S>Fh4aNB#&2cs1APm8+jG-sPu0%GTYf5fRD}(Roh#dBRS_;^5jIS&i4uY0kC#htv z5r`g*l8uYtIqx5Q1L`T`C`Lm42u)&)SoVP}z3E&zL8 z#do$xeEHNc8XUZg(K$Jcm9m3f(JMq!eGzK8C3Qae?N^_YA_MNSS%VVhu<_mD<64Ov zsl)}g5~(syCE74=tp!2vJ^0%J;8ym zVhzyP4mDT3{!?B~@HPt6$&;vYr~)%mWNa9J!ZQhUGX@I+=zMslWDJ?@I+2X7mN8lU zuokobfu#f7Ol?A^*G8z_hG?50-SZr9g|6d@yyH%L^jmd!L90N=cFc5{g z+k7C~{2F(05(MPir6^ho${dF<0PU}nl>p09$b%|UbZz~bWTW}Xm_Z_8ji7rAyLUlX2%K0J)u!#JHTN)TFBtk$T zB}9paq?(>6Mge04n%F4enY-OaAn#$^N(4NC=4Z{>#t7W1=4Tv{F+Twd5?S2Ew55*Y zzbypgez7|tO4b9ev5(N-wH4yYn-3Fc4$(e6nnuF2c_=yaA4D;%Dz;Mn4ee)!%BK?V zg!#^k@(wMmY_>N27I1S4HOn?P$JddGmmcIxWq2uhD3_v;B}$SW%m_LlTAjmeNyqmh z0VD!aw1Cq&%@#t;e7NB#iP2G-aM&GRPhnxBBqs0?eJ1&X4)E)#Vh4Rf5@1{*tK$kl z`t_82a$^RJR9{cgm_fBl`IXdAQuL%_JWvw{5DX~V-?Vct^g=FQ$;6rbK7`LBg8vHWc!RmiE9>`&T9Z-p^?-XxvY#=cER0#Dq^&hT4)`8QpgTEIT}NAAaIi z2j+(NFgFMB6M3|=Dg_e(zKRFY6L5wT`7YqQxt>Cl=c{-W&%r>F>6k{^-h+)y{6tQr;LzHVkAUdrp9&UM2z`z=wG5qx{y9+?X4o?B z|0pFITLuD)NMMqiKm*OSj{v#&S2p=n*};s8O1a3t9zMGP3ECx?ELnMxPh*yaD$SY+ z4t4m&Tb>YavG_-PY1*vFvKo@4kqs=}04~tc>S4vjqHpjd`3wHx=rzU8Z`yHcRZ?Q( zVniBPZCrCfhxiOBA&42c-)GGUU(!!C;)_|VRcy+g5_MCnR)`K5Lwp>piwrnCl zpGRM+?p?e0Ya`{?=7tdpJ7}^v26iJ&^gcLJXaDvywE(Jr_tESeocY{uN)=>~j#|@FZNzlC&0~eFt&;!}+w`u^n8q8PW?$V;>DzIecjJ z()Ac8=UwH(`_FX6Lni=In>fO;v2Q`F`l7U;;C8~3At|2t`5Yl(&n!zF6^xUN`PWVZJ)f*s_rCHvF}<(i<-mdra23hD7Fq17 z>H=TOiQo|hz@rdtW5nZ9M5~(OAYt2IXt!*vLNu_E897zn=H~V2M?X#=ud`b(;KRwQ zMscT8IVqO?DUJQfp1U<^?;Ls2bK$pmh25&W^)z{cPr<+-w~ThY6*uv$P!^Qa@f*5O zoLOYCOkxBwik#1bT|M*YPU2yf?B)CQjnF|8hhitaow&srzK-{?5?mBvi1{ln;-@#& zgU|tNfpWMdqV7L_jS%cS2d}dCda%-{x^2wAg&mJ$|LJKI*rv!&r^(B^5whTA*_*AQ zfMj>!N>GuLKAxvL3XaT4ACKZTx=E_)Ew~cb3vrFj(!1h1e)8K0G@kA@elMtt`xWxu zNQXAmxkTt4C>#{~Vvk7DWDW9H!~80unY z6+Qq#b4FU60~#0#am-K|rZa8!pt@ho|1l*5?wf+e8!%ywy~-D#2d#<@Ma0KMxBW3gHybFM5ur3g+Z4}pnY>ruxjxp?}TXr1CohWDpBqsaUPfpr<8|{xK;MUV3 z&~!*b1bQCQ1_^=YW#KmZo(gn78aKLB1scJ1T%gS!B9{kY$2(9#B*)@i%F9q5^I7x; zZj@;l&yFxq^(Z}G#Y~}lD+KzDuY8K!jDIqxbFAh=;KEzfO>g-m^E}F68CKYNFv)u+ODnVR- z7PUEY?KwohLA;FQs)$(2#qpjEf1KWki1iXoxQJNSP`%=M+MfC=(_rWy zk6(`KB`Vgx;yNzYRg@KnK+nf~Tg4h1MX|OYC-lB4y+LK=nK%`=;Q?vb3f@CvxQ}RvUE(K{kX-Q7P7JNtNwwQ@FKa{r!rBSbxBET&yFfvh*Dg>tuFz73&rb z!J!t{3cZ~aE6(lkv~_^0=kNL|W=Ip=#ls(cx>u+(98z5`U&DVQ?T{o^%=vC-eVeso z0`we+HBxqMB56!zmHuGFI`k!ob!TAl&6LA+;^AzLe0Pd+i>9o&S;g87cm}JR_&7*c zfse?WXAw1`bKRNfR3h6Zf<2Bjn-II!9+jS+4}d)wxsE%LbuniNTutRE#aRNq(y@a$ zq(KYLG-$%Y1&~T))AwRP*cZB5)`z=S;~1l$Ol60A*OLtym`mg--y=Ax@tAYQ>O2*9 zaO5fYBAV3qRs0>q0*fCYpI3q~X!Zw9U&X(rkjv8XeXFzFo+jk0*g$kF3YAlnICGBT zWKaKr$f$t$D3&!Y7+TzVA~1uYms``o6ggL>9azp2g{rFSf%S|7%Xy*@T-j2b>=mT2HYIn3bZUf$Q*$r&c+inDv`HD_;i!ybYj@vNvSUyJC0$$E zLzF5HU0e1s=~R2?ce`EjWe9>cA?7H=mfvTh8XZxMz~auRQ!xgOu(utC)4+n0C{1Tu zWd7yoPE|o?s`@_gpx!8D2btY^H`{a4syP%1oTvcLtGzn0VZ8WLRM2$lP)5S9n!L9! zcI0gV1cGSu+KRw zF7b&z#oNi>*7cRsI`T_q9dHVri*Puge-r~F?1aTB7dX|P3z@F)6|I2h-4d4p-{TVU zAs4#}*v$zAHbt5VlV1eB!Co0go+4lII$#_}4DO#*2vIHcgCXu`#YH4x?+ri;EMQlP zEE>R;=V7dnGenF@F7d@SMp{XY2hz{xsR6@bp>K!qM6?oybM$2n3Y0LKp?uj`U{*iomS+GLg9mUU|)>g#KRGZ$O@qw9Su{=o{IzX z;Aj@389Zg>pv<*~^?&fC-PX&U_1(53GdY_f;&xU+j}gei(mZ z`xA(-^S7AKUIaI@PGH$Z5GaVQfyRxKp|P+en7gjDJ$Un#Gr@=8CGDq)&qIj#SFf~w z$-y=|+j>Io>fB;d&zY!X`*J;~FiF zDNFR136u{PaurlTS`P_T&H{R8h=-A*(G4yrN}P!e>oa4f{6(16|eh4L0-wK8-Z!A&94Lrrl0GR*fH$zefnYvubWB~i4m z#RF`EVN$YYIxIxD;VFBrjHm*F!4Fj1dO?5Nmzhpqe5B#mX0AYC(Ei@o1>mJSk;T?aCzL!>W)_CRE>@wFVh zCR~H?86X@NtKz&)oTe_)mqR}`OVV(4^l?7NKFg9ZkX}9&qnxA}rb`fRw~g&wj$1i0 zX!?bkW@zyMF5*W9Juc$%z9od@kmw#D6byNa44E`ZnD66}K{t^}rWtM*g{2nW|Ncn3j)8@0h@{wfJ3>1%bk(+>Sgcx;jy1-Yx70EnlNz93=#v1F=hxs^N%r28JCoV%=4&p5yG+RS=sm3uC=a zxF!3FJl`jZwMTV$VgAv7ko-2zhza5h?6ug0ejZSQj;Hct)R+mmf|eXU20RCWh6>)r z|F?0H9uOAXg`#otF#U+vxFdb;mNM#Zv>1gHA)46-LNWgxqCox!fQ@%Ch=@~R@{L6f zKKh>U6=xUVU;L8fUwlTZt-G=mK!uC96Hm_Hg%sgl)J6Z$ z2fy*bKiyZ3PKGK;!5E>SO9KPYTfAIPzm48_CtDZeg)yGzqR|732e*SZB9%>PtY>9+ zitloM(76IW(9Y5hLFW#vF##i*rKoS>0*shN+Uud-k+sdJtGf}DR$~g;e=Z=A`J%sk zmU2L#Krw*8<|`w&kdYnWDOsa2s6dm?8zy$L3U*TQZzDbe4(Rt;t)W1L$eWk}2u;UK z%lRbc6hBvlAq%73C>omb-ypRjNF3)(`O4XNV7DVC1p=|H!YNRGl&79oAg{u%z0%6k zehB!|$D~)Ih)t1)+F}?{U#>s0BzLwbYZmiA#Z)jPoxZ4}2z4TPYb?CgJOt(k-_@PH zcnut;oNNNS+iUj|JpEUyr`}6pEldjLC!Ch(s~93Rl0*Bg(b{}8Zu zGSw9OuTSMPBTmnv2Y>$^a66UzyTN_+B|&G83Q5yHht zXZRjC2bmCGMH~FZcs^c);VVBGcZ)iUKpqB31c=8yc9=L9@_=i-EVY?&iZ?TX=PyOp z2wpw7a{IxbNh>G$!H;H&AKd*S^@EoHM?=zdcy(e`wna`a1fQS{KlnBH!Oy`DUKXi3 zRm^nyqAtSsTWrV?QiAsjNZ1H_;bj;ZF)QpTL>`+Buj%f*^O@qV5cTnn>4Cwq6!Gau zT*L>*i4-S85f~ZA^EV+W&hL#NiS+D2))5AvIr>}7e?G8{m)R?@comuX7}R6_4s1b` zdo0ca3&YTXcRP$On>(+Nj*y%B>JLUdq?G=RWC)W-iV8M ztG+mvEP7Yc&vC@%8ODew@`djD$RiC&0vKOm z84Oy@SAGT{;_a1|Q47RDMh5I_h$@;cZ+T80LxT;sH#F#Nn90z9*LXxCq*B-w#;~k= zAvUMZAW$R)YmOLuJi=%uQ?Vcf6^7%)hV&+~pnxnyBcQ~0L66oRZdP5eTh;>_TLm@k z8Sajq>kH5&H#;lPYko3o?NQKo=*2%puCh)X>c`x7VDYbH`YKwVT#pyDd=)R@dF{0$ zIs@UkQcAg$rJN{5_@s!?p!)I^OqmbnJiRAY+!Y}<4;+vLB90_4MBHBNtiXe#YNQX1 z8w}yqI}3cg&(SVbjDjp4{3{gtHdWZ3?FidcJvMwH_Njm4_IP&$twyAEzoFGoa)DKR z*C~Dtp#?_&(( zL_Uif#?H6lHabn3+&c*NM-E5skBfL0x>0h0`@rf1Aty$0G{|8Ru%i$=Pj2L3r&B|-f`c3E%JWGaC;5%^+2wM-`Y;B zj-AT+Zw`DNnBP?u^shx-Aqd#ZSN?XGK{oa1dKf1jBS*3mf0$&ngTVo! zuC)?H2izwxQkenw%>Z?bi+FZJV7@GMVT&AfqG5kqa$5Z#SF>Sew?0UrPFgh&KTHX` z62ftR-p;Qh3pi=-MB+Q1uQuUz@#tYouY-Zu3Olz33J*oCz7>||awcE)Av0Wr#0-|R zU=>Tj7W^qjVhe z$7wOe(nc1%^udr=C08T(*H_LEk~wK#`O~H zV~>^PE8mG~gCY{mg8JnsLET}!;2YzpQ!%R*M_Z<7yNy{W{|}25ie+6~XtNY8!ZEJ= zUV~Gy^X{9`mv+g}X^OoSh}u(dt^~d;(X}&ocSoXmD#u8$r+IJ$kYRt|Q(!Y49oc@g zbj5}X-$NIO!i519wn;*gXz*V~lK6l%(P^xV<9&c!g+2Z5#*b?;&1t;XQamTJ(6B$p zpk!j8#hY-DZ@2|1?lml|krK;OV#iowP#3O$`H-=IA+`>Dfmk&k)m;BVVk=0D^Y`Fv zA6q=^sWh0`D1yX7E@Bgu*gt9!+kjdwTue()S~z)cJzqK3YZgvE1kIR;D~_^Y;v&3< zd=xm#hSt;r@w4y*Vm=*oeUC2>PF`M*0C3UKmdbp4W)XA!j`t$r(BG0U%HuMY8bPT@ z`JewFx%XDX4GJtkFUR`lJofb{ckE_=k-k!+pAC1n@iY$AYnKjF9FL0Y#L!*FCaJ`2Pa_KZO7H zw?+fwX&#>ah4OmhR?z|neZ3Y;Hd8K=O3p2+IyhR2;9cy{7y`^`Oe1hB`N4j$2y&$Og<={ojoX9yf5?#0iQ}0LpF-wZLf!~3LwOy9 zQsPMQLN*57-xwj9M8a)=^)ROXCD7>;9v<$q4P<=`H_P|HYd%`2|7FjnRoDk zkpDAVTfy}`NN?OVbH0?l4G8pfPeh4j7lXM?bUMNVX2B@U=^5^I6y^@$31DVhCea5? z!`kp!k=xQ(7rN%Y3JtGLKifedT>y%KC1+Dg|~@t72Jak_I!y0aoNc|KVl zd#*x}Md1PSP~-wrB+8Rn^g+*~ym|D-5xN~%ky%zR=vCa*nf#IVI`B>rwAE~@vwqtfQ3>Lx{!O7i(M2r2f4`i-Mkm*J;V+@%Fba>@e zPKCkYbvB_Fz&5YRfbjlG$4&g*&6yBeq%tn2GV<0iL9{oCwgS=Q&*hQ>Oepn`?sTZJ zE?Rue50I9XNht9njjsv+rvR>6G(&obcWXyn*OTiO@8CM_ZXUczYl-jwK-4JVWKb*$ z<<$cLSyb{OWFo6cJg-A2g{ot51w$<5QZOvdz@8G&5H8I~RM>>W3=B;*O&z`jXQ_}T#!buw;6i^1aUkT zj~i$ap^pK|yg)~62M*>~w~8~FoKZCuoH4}7^^6kcW(&8q)KoJY;2BB^lTxtT@ceWk zLKPx+fd@- zbW@e#B=M3V(a6SRvY-lVLrVkPL!@)%@JQ*%E(MAUt>u0G7z=v z9&BV-OJ$wniCnVdcy1HczT}MkFn;BXH3g$2uj)ZUw;JQl4k#3pu^5()U({Qy#r-G- zVPbS_L$=n0DMilr9DnnJ+)*8RRUfWXo9nS(HRm%iWyClnC~wX*Z|398vi3lGDw{gJ zIdU8@U3h;tcp1R!xD$Fbb7gWbWBwZ-%rbpi4nc#~he#3y7Jyx-<)+9ybS$yIRp1*5 zG+4P84b>G51pnDMJ~`Okl=wTKm1QTR;~#q;jFP_gvU%+szLu0sDsp~hH_MNnOCQ|v zAJ<;%(;d-})aODed8Hu{1PNdHRy>1|xIm&xu@LJqsK@~IA{#kAKz05*Ze@V_XB#s> zy?~3jZP*1N(~vrzAH-9YQ1l)dpgIp0N?0e0P?Qr`&%;d?>z^;Bua9iT5Gz&~6If@- zvk$pQ#(ygjIdD;MeT4ljhW*CudP!kBDpDqeOGPgIi>XKe7p{t&i`(iefE&%i1qS#Q zyKxb($no)tv`JLt7?KEe{)u8j>?ajL3j1HsSTc7t4MoFvCAbwo_Wr>H)`uWw#syn} z4@?F6u)`%aVRD7!JFn{Np#xsb=tIu~&H*Eb_dzC_1sdjllOcNx$vXaGNZwA!Zi<`( z6^OHOk;w5|gC8J1Y(zf$DTH2zNx@#4G4WP1&&1WGCEfweSY>_CBm0$+Zqb20(C3*U6Y zL4>Io(5_F5tcBa8Qqv94153PTtF^g zy;yVwyB6NV8oY5CSYany&NwS++qnvF{Azr+RRDi>#A=+5RIhb$Xz1#!NXI&H-Dwn9 z(gviWcY;o`Sx;778MhsO1sK8fv9BDz6xk=p!1>DikpTP02?TS5a+$kRC&AqH1x8@W zMW(`C5Kz`0HzXZ|p##o)kuzsEhq%}_<_u+c^OZj%t-ih>d~00*Y=|xk&5&3R-+C0D zs&y%y0Da>f6g#i>hd|!@uc6xc=OMG_I+h}Yr-soIiscTZY9mdXh_y|30|o<7D~DC3 zBlA`=nVjEJSY(Ztw94qcM#kehuw*dG5y~(Lzi|4LeIor`3Nv zZM|B!{^hnBT)&T}*f^tN?Kn^5Ob`X7d7xzY?PMgr3L0J*9-G0b|AxiRSPb*`WN{v= zOOZ1s4ZRMXtqaUKS8$nhII_R^CKIj7Y^!(gd7KUTlAr4g#`ZyM7F>=q<9dm4M=$DX z%t{!8R>G|0-Hlr@E1olrSvhou%dFhW_Q1H{cq&kgaYT;-Ekr{-gi<0J;&&`!RuE1B zb$#TzANZ@$(5dpwQ(q)?ITjC#Q7Ll9VuAF5c>E*F)RNs(V^lQ$K^bME_`zde*p-}M zsGzUeiYgxcAi;%AVJ76DVZq};48-vBc07x zF_2e`-JMO*VqBv;9YFu_Rop9zp5%F!-75UR>l_Sz__=>Q{bCfJCYUJ!GlRhlLe-Jr z+~swqjFGGz)K3jgzZ(e+!>vPZIRzo#j=pmhTSnYV*6OkZ-d{ztV$~xl+4@DHQB3cv z3F0c+z8EsG8=V@VdaV%?(Fhg55|3D&#R>gT(Q4?`=E&0txm{pbcnYLZSd??9wOj%? zX0&-jWUL(|0juaJCTo*%F&g_SR*Eputb!GN6St*cw$>uBN(k}WIt%a>qWVnJ4gwH|nalz?ckT;%n3zW>$kiy=17=I*9{6Qq# zjy)L(1~A0WvbUx_FNK;xkYA#kZjRt(C6kYok&>&QJY#Tnbd z_AHcIGbKKN=1tc_<9o}Als?iw8{ytFkqvaDeFhDJ&%HMX{k`}~D0~|%=?!+p@zPu@ zIy$`?xnP|4dM+|XW`6xU2a62OE9)Hd=M4fKSoO9@oUO&U1*!2oxrLvgEdvX%sIyMw z(zeXHae+)G7RcnR{K0oc=Vw7coN2D0POSLPmIo>9P1+Y&6I&`5pA4@|~mO z{YV0d?U5)n)r@N`fp;PC>YRgTqGt~z^sM^sT8^OOxr?Q64Z(Rb^Z2VBB>F)!*UR!V zeult>mHY%4O%G2N-hZMVMDxD_c^MCSDJd*DnhZFdm)rr1g^64{rJ~;?KL>X$uwVeB z;(QP}zYXLPtA0c?YWe-p0-4B}@HpVfcVuP;oUQm~4n{TLEXUG8OaebqRk5WsH?}qy zZgC47<&bwgGgw2A(rb>T%h=Se58R(VaDPzfyU0W{`uyfw%#-7Rtt0Ew* zuRvtHf@L04h`kqMyE|5`w8=>Pg7Yls@8g%TJviG9x7zVM$Xht8spi%ZyH8$~Woe|A z|Gn_4Q^~(cTgrbZeeOS&|AZ3q^XKJ1Q`+r+lK<-S4=4Y=3@nZO=Md{iv6mVR{gsHK0)%piyEU!kaoR=%{Ky{@eL+gAm8p!`O%iEi4U}^o(tgTK?TnPc8q8 zI#B+t0sSxX|4sDa&&%I0?e;&(|Gw6Tlm9dtFeCrL#5w}`r@j9cd|N3NNoXWy~cv5r`Wh5sY5r=6`mZ2)^3x3I$UpRusD`@?nMJw<XG=*|muEmHP} zr$m*Gz_h075A!c&TmMme8T+xAxxD0TzJEe}ll`q{M3_e)kG-^-Ddq9?X@D5}u$ov$tcz@*^M>#OD)e^ptGsu z`6(=A$SZ!?k;}6cGR^;2d)Zmq;{TC6r(Gl6NX=kf$)gI3uz;0qz7B>^?|A+p19MXBI^y_Na zgOGPWE!dIkm!3m%ga$sTzkVRX{ePriXR#hB`|B7QYolMsh`s*b`s=-Dqg3+T)Qs{R z$`(9wdESNz!vAZ3t-$QuAM4xyVE<;rnx~fMmnSFWIfhtAtfOvy@ZL&C(8=rT=MRFy z+Q%2+%)k}BSj8R4CY5zSg4@B2EOG^h5NOEft(c!4$D~!L#abxy0<09koVKfVy(^lK z*A_1U8u=6}YJ(xqc60}3r?!G#4=3v=Y8qzN%7c|tD9iD0LZvwm!qiAxVDUN=-!E%%`)G~H&^)EHgEcdBn)`%KI9=#0HSdzn z`Fx~wzEgf?S$>8I9sfMs+x?!s?;opYQR7qjQCMy`tQDn*B?N;ZsE5cUu1j$JcTqJa zs__6RLGF);D%1FK&j zY-1k)<+33rBc!$~fCyki;ZiZZ9{>}{Hx?pX0wvC66e6`;{&jW%*u zr@N~xy4nT7t_e)Hbwlz>U^_^80o|o34p7@zqi0VSac(*$ zt|^U_xw%kW!6;XZ4X`G0O?eyWZbcqzSp<78NqeZKyv+d+_ADiPschU^0b%c5HWk^c zFNJ%0Q<3Ydz^h>tAaL4i2;2`&C}AUO$1@dREAk+<2|$Rvv)21dYdl|VE%iQt{-7dn zD$Qd=KH1g>YJ?SE-t981Xr2CzLF2G>O07n_k=2L(ceSRjgB0$$q8@5xhM!l!Dr)sA z9#Q{2iAq$Pp$L^2rP8Tu)iHXSRH8$?63+>rrV_F-FoZuCmB1z{-s4=AIOV@qA~Eua z-n7svJWHvwVQ!J4JqOq@rV2kCEmfGzVjTZ?*2JiOj+89z@QTv8i2agu&d@5{f+}e{ z>;;whs5IBr4y?k(>}9AD$Iq+GSejC|Qny3NU!)ygx61#*sUp9vDAJh8Cd%G<6c5?E zUoker6^twYabUu&{EID21gq+3c?ymtF^D??ubri;D3B9E&)6Gr@wJ zz11%Ewu(7X_C7HK%Mr7;tDCSV{uHIx9)+XBk3>(m?oJ_Cjrkp|$9`INBGywbi-gOg z$d2Q!4^G@%u61$Q&c)?j8`D`xDY3z z@4MOC;9_s83~egJS!N_VVj(_~D?-e&!$U+4arR_U19l_|j^bn~vLCU>o!C|vO19MoqNT#FKsDPj#=4>dI&jO%G;7=gL; z^#7fu$(JUc-NqFO;`z4U^m#t6*Tkjecm}de;A1I(C&xUe8^iv@=aAiJT7fI6a8!jW z=9>Wt1$^guJ|kQabim2s(5 z%*eR8WfS^|Pi(v`U97hIBUWqaCsy{iRaW1yUE?k-x+B`kjF!6uJ#%iNL)bw3l5+Njm;^zw!myecDr>O<_9C?RbON>@<&-?b53xJM&_A9$;Et!b&Bi1!Ud)2@8re`Ld?C)1xuT1R;#_t%>e7oij2acbvQs=Q z<5T8FSubyjVnluc28W&^XGP5awUX&*y{I8Tf(pOH0So)KK^)vQTlnUBD6#~;{qz%f z4P)egLdK{+V800LcU+s`zAjZE=6{5r|Asuz(@$UxA{kQj9NgR9vzP;u;}3&7oZq6X z4z>!qK=FeJODz5#5x3uu-VyWr6n{ay{(|qxxAZ}{6xYT4Jow+rODSzBc^Rm*x6uTd zo}5NL9slfhqpQqvwaXq1zaqOnirdY0_*H`IZSA7nmqU-^KM9ZUy_UhZ!@&&2e;Ep4 zd5KUT9DfJ&=$OB{qtvq}X^@wpia!wVTl{p=a{NCFeeUN2x$LqXzLVm21HTqOjjjXe zL)7s96n~qoYdyu^j1N}mw|LeKJ{|2kKrHVh$rRNzc&#h>Vn18+E7m-KGrzh}1tXl%#I}v4x9z3DA zvn+0g(Dn?ryx_fhcu(5(cEx4BSLp6-D)l_%l4FL-SWs|h%(VFuB%&@|7dqSiupS# zekZH9FDrggqJMg3;Trf`A+nhNXvLpF8kEa;!S|F}`aonJOxk8UR#>8*Q#ce7x3AL9 zM7^yH>nZICs6x#DoZ?GABz`9FL9dRb4Y|CGaz!q8DK7JDLVG{XZ^m%b&CNGuhVSx( z?>>sZio-8yuM&LERL~P%fVczr!gou>9cOLUETz2zOj^EoY2Tb6I`!Q-QqRGx3uzBi z{B#s-@%yt}$3GJu0@`2kC(>OYevaagv-*vC?ozMg6KT_j6n`Gzf}f`NRRCK0tJvO- z{~N)-M)4!IjdsX!%F-?dUv>OE#mi<{RVqPqBS6LwU);cvGYO z#wuQhrMpi)y7x!Gmz7yPyd!exqqy`Bga>}K51!+G26S!|>*M%uf{TgqPw}T(n>Isf z7rDldeBcZ1@9;4t`gvcv#caD_N_(E|TcAxl587V50{vI~H7t+#IfC!mhxe@>jeu-K zkESc`Y|BSurQMUhr|~xq(!MzUwIaJAiXZoTb~O>*m;s={_f8Q#LOY(Pxan4p<^h-O z=<0_fP!4Dhz$?&y#qZ1VME{j`Fu{v=kH`eHcOqPYOor0+CvJbGy#ZxezU!z=ewJA1 zCB-j~>%ZbRPw?#-rTt|&P-6bO6u%pvk^X+K@ZJd_g{5!u1CI**K8i2#KJiy6{?wln z_}Qw1H{lW5U-1vweltVxJ#Sk6A(VXRr?k;`__P6aO|!Z+OmQ<^?b#o+1$U+54m@b& z(hazv#rVLsPd;pp_yLb7ZeMGM(-n6C$}zawcW+g^9kyK}jfG~q%hoi9O%q-1p}0*k zrik1Y0~c*R(ADM@3MXPEXAMg!XKsl+<~8%A73AkemBeiAw;X-zmshj&>yD!{4DtW z6n}%|XM@29(CWz)lm&jeO20o%@n`&mXVjC~zz48@!d7`{m!y4u$`W3(td5UT++hh^ zPjg(0+}A7a%d89O_Eg+%=r5L!aS({$KB2hzcvo;Ul;_B^)laO`PfHU!49H{(f*3R!SX#7_yCq$+K_z}@I@Y9 zohkCjv3w6!+G#G`T8uj4^)H0>+loJqX#nz)t@y(d_Qdlh+u89Cl5zch#h+)}zK-J4 z4qM*GLq@>=K-%(h#ouA+Z)qU9lAh>mo^EVs%$JEA&s6-~R#)aI{yY$~^y{&1_}*6N z|8xd!LY`q3f0Uu`(%reVAC6!Bhj$g9ak|kP?_0E9(6WI?}+{PAn4<=&KHvL_+r>QO1_$62I`&-?8Q}GW$9=5Iv)IMK<*JA!g ziXR^j%N2hp%Cqx_+lSOe?O*MSDUytOqLE=@KJat$jjiXZ#P}>;`xlmO1CGJ05vZr|-BIy3*naV{;%{@cQ6@=UbjV_&6x&_(-@+M>>)=g%pAKHGu3XDYrs9xwVvcz+ztfc&SS zZ*3j=6YDw;j9S^8Mg2owKy2Kb|D6KFkY~5G={bgPD?{|x*4mdgO5b=$ z@u%%I^wX4=pi8$p0jB+5arb^_aChls&QS1Xc@h5%<5!HlbX5FR))u`CeAII&>TU2< z4;v}o9@-_=v0U*E{hoyP?-o+G8EjW9tsM+n83|h6B3#QDzDV&pscw|!pxv^q-9i0F zuwOX-&OnF#Q`{2jXnaNPq*b%P!b)8MY;NrLE5XTmmp%a@nUf;JEsAmHYuOV|-s*8u z!yXwyr%`E#iFch`r!+0*&qPyKV{WQn8a4sM2Gr}gId>yWv|xQybAbFY{}Fjrl(!x04TI6Tm5qk0-Cp3QoT3V4bpZ z65OCwDX_!D^+2fvr+Dvm1^r^R;zEMZ0|0thLErrb$`t-N1i=shbeDp9+CJ8lAjAs* z4OYZKkDX6<;V>CgS)CXv(f_htHbvZ$q0(x3OthZ3TTRgLbfdK z&{uhyfJQ3lS!ksQ>KKCB3g}V=-DM?TjX<-qoq*0$P?og|TL@||pymo1WZ#-k(Afg2 ztDqk&^N$g9j)1;wCepay8p(SII#)pJ71UGv2j)o#>L#Fh3OdP(w~(Mb0nJpI-V5j;^rA8#pq>hvZ(I2jf(iuGMnT6}HdYYSOF&H& z)Y6vq96`MW^q-TZ%Jr-rnMzPlKsyxlmK@qDPnFL)bpb-k1V5{sQXn=q&QPBDJt*;S1R$eZkE($s^YB=0X(3Jverl5hA z!#4>UD4;qD>T1pMqXbb7eR#4{?bf8lv1Bf0grwXXMf+pLtb`tcU zfX-CV^R`}91U)36#tIr~ZSOM#O%u@fCx|p2vjiU?Xu5ztRL~<<0d6H|hJY3+X#7{E z%KZtNDWEwDI@YRaSArfEP=$h4TNOQpAo>H?pIkxBzBB}nCg@QCU96xqE2s!!%*w|E z)JZ|_Sl!r2&_4upl7fD*mhGPe%@NS=eyQ>!mW@XUnk%4xE2!K`V?0662xyIh3T>lY zOVA4fdPPB9zA()9BIrc{{Y^pbtmNAf^ooGSDrny4=B;#sUK7wj1$nLHe?;h5IZr?V z1$DQA`k0`93g`?4y=~c8M$j7qYNVj1|2AdKCFo57?Q1I1sQk%*LIlkh&<6_YV&A%j zptl6HP(iobR_;g8+X8w*LGiekadPDX0hKH0am!%~f+_`clY+iJVAwc{poIduNI^GR z&{y>US}dTB3M#VW@&^xN@LYZbsp&;|j?c_$&yc&j#y zlPfn0C|}>IYa8Vwf;I{0bOjx-I=_^lEdpw&prdV1d77ZD0{ZSak;c6Jrpi+YdQU*x z6m-3n#z=zR7f_{wKDTdOO3*d|{X;>ISPsu4=mP;wR?u84`Q`+DD4<~qYGpxn3ED28 zVg+4o>-8o4>&hJhI#)sM?7*>}ppOM~qJq{~Hs%quQ$UA~l`7A-pqT{i63}M~de1iH zodkU%pw$Z6{;3hvH3V@bDDq$mnqiGYPl9#}Xqti=SPt6|^qGLl6m)@A0L&oOsr+0( zS1M?yed|AnHY)cB=r0P|^1WeW2SHy7sI`JdS`L>G6cJDZ1>O5E^VU-YMFsS2x=7vb&H&p&6kN>HUkJquJ^y12xJpQ{r-li>Eno~Ip zm5KSw_3;N<#nM)l{17(gAE}R@rA?1V%9FY2m&VC*DI0N^KUjr%TO+B#y50D}9x#q~ zusrZKpiVn=gRv@xx%lgNdnx38@))Yiowr=y_lEPXnaVe?-{_{s+)>jvWixsnH+yVx zeVA{w7z2c|7AW%_V&;0jZGsXg#j9{Hul582}5dGUDZWmU{66dA-Hokmnjc4dpFhLxuC|j>iw{*w@gyL}@jc zK&%!g11z*|B3`a%w4rsg((1>jp}f|+@DtAaVhVmptDd2SbTaGsO^8@6eg{}+74tsV zbB3XHiqbkyu=3KBR#)4O3mU4tDxtxk70`CP)VAZ3+KwNig;>Y;_#5&#+K&4<+=TO9 zvGN*WXpK}_^HpA}t-M5jxt<3Nt^1T#OyxCeuh4pO41QS0Ohc=c(t2Sm3vRIxV5wsR z-sgI{8(QZpt^e@tP~M1d@Dt9PKMp^nwXK2Hk%JWK$o>C7YZJgis|D||pD3itI)2OF zkf*+2YCts^+eZHNLRN$M$h!B4?o2uqR<}S890d z^m|bv@^LsDMEB&2Vx2NcWBX>D>vs&V{9_1EpYl01v%Vp8V3ZzVM43{RE2}wFBHs zoL21l8N}Iw*zX>@vSJ&`m|yG}_ozjzwT7+F70g$F1UHJrCIsBNF@6p)_nm)Qkg(xn zDUr+u$S@w{;YYfO*kjYbuOTl;wX{Q#Qw7i_0b!^0(^+rO?&<7v(=Nacv{TLlnQClE z>dhA6pfWrMjI1H;29y6+78&+GYl{ihD&`(r%u>(ci=h`M#jGU~WmbjqSd9APZMB%o zZ84`NifOO4$+pE@e%NBhjjTQyHMzkSF-VFiy&UUcS-G&ksU^RX4XDDp5n8yXUfnvS zCuljl>1lF*`tR_tCvYIRno^71QGB@b7_eO@mefm=LkEg*mC1b`MJpWdMo^TxuL6f? zr={4}RHVML`W?4A>-aX{vdaUm^SmbS9Sp5}>?>#*c3Un(F(2WlZ%^lU{6u;>2YNbR z_H@2w`?tqQKV|iC*wC?vKp~JXRJdKFW)S`L;6pl7bRVME$gA*QaE8DM*erkY>2>QY zMZ4Eo#ynqi!6SU%^V`wnJBX@8u?wU3j1R%XTI8eo7~{c5_`$vzP4RvYydNG_ci9rY zeJ9?=NsM7{BNQC-|HNhqdD6d3pf@$>ONrjcqVIy^8^b)gptt!vf&N8nrM`^l&4C{2 zu{zHB8UU5`3iicBOY7!)tx@wFYPyD}_As+82DSR7!&Oc~6jfWh#E9`e!0FufhL{_&tG- zsfbF7DeV7&Zm;8g`U_K9LrBHcX!~il!co5081F@H|0)(U;01ATHNoG^tW&3J=eyp8 zqIU-Q7uS=nzsE))-xK7K?@!R?JhuvSA77q_mt+2Kk0P?{k;1mV95`(2{ls_>7+|-b zunSA|@zKELW-2J_%RRUb`_HqmhwH}caD2R+1EdlJmB?Qf#_O>ERLjP%1h*l0UjqC= z9Q+%>4GDho$5HJpU<gQPJOKqTbP2*WkLN@aR`Z)kdRZ{H*#x|ME-@j;P9x%%R2Mz6Y#ca zf-~g>@Bc^Ko4`j=Y;EIV83@ZT5p9g15Cy$}q9`C>KoSVh0}~0d$}R{ZBBEvhWhX=# z+fl?FH(YQ<+(A(p!XhBbDx0{VxC{mq<+7^G|9MVzSNBZf{qDW*`~AQByOQbddg|<_ zPE}WT7a$!ajOvih_JG&XemQPWq{Uhj@%_AVGy;0##e$%hP~2*h-)z%sOY{ps+w?jp zlkdg+74L&d)ATxMdf7x2mQODqPm3XmV`E_$FEx-a>c+5Un8p(9U?N#x2OB`*iB)1< z*k2>*&-d*bk6{XI!+eU9$}sb^VVr9-v|)UG%3PE@px(-vg%qJo>L6?JjC!SUcM=eL zI~Usu$=obB!@Xs?ouX*+sk`-`q#~E{OeD8CJO!Qk51|x_KlheMu62L7K5gxf4W{Hx z?-$DzBqhs8($@&~=(;G|l6F?&p zsLz8+pF6fwzPVUfup_UPrZ3EdSNTFA3(<>zUL!fQ>-W7oV=;xI04Xmfw^7Ya5CJ=G=-_YC0 z_#wT8ZzSu}u<1=AI^@!OQULxtghPUw5;wY0?*1 zX>zH~Z}61clxr2l=f9rJNOc<=B{&ygJIQtwfPeBfs=gJtw^jcI?t(54K&se%Lhk2#FfZMS`qMb8T*>xq)M?9SKwDt zE*!}-5gGfK(e4EA@hz_<3wo|i=vfl#FNBa`lC`wPahSps6@P!0;&LIu^#HaV^g-n? zeYR3d0f=U6=^eCRo{Dz_FQj8@2pWw~$ zJ0QGF_IBe4pDJC(#!+JfQeJ!{Ve-Y8Gcg3$>|*C1h*g-J*s5@uOIemaoRK zQA9U-kByewjl7l#MMn1Lbo>!SlkG;Guu?0eocRxWiH<)#wo2reK76l3TiT7B5^6qG zC?(W7{z{6qC2~!dP&-Q?)7`HMA?>eUoT&(HAfeOBVHUx5Is0J+)of8RmrvT@jRb#= zg&sTDd;;*-LTQ;W)*aJ!y$S7?pPmK=ez8q%E5RdO zavKHUe;TI4`iD#IR2_%h=R~w9mz+1Y@#P{Zph_zu-Ywr%^aVz1TYoS76lbc4(C|3Z zVfdRk(-#=J;?1Bxai&jk1ZUb#Z;Tps0FIwKPbof_y;_{4IBM)eAjcQ8&OwrPNdAI#Bt`OPl57Z) z_BO1R|D^4XJ9YIMG>ncnVh7ml&%1=P(~j`FLOaF7e3f|+>B<`Z1fc5VulR+NSvdK< zKKX?@iFm`fb&d?Zha56PY%<44<{=@I;ta^S!6vQ4Ngs{!EoCvN%+lM@(W@w)9kYb2 z_D|rj^g_h=zGct@bt^jBjw6_58XHHAGXaj@Jy#^hhdaXtqIUxpc5`^HL)hyySzIGCIre&+k5ZvbCLd+Wnp^)u&is zp;Q6(R7s@jjMc{RnIY>inFvLOfo%@m$Ob))11$D!k3la`IbHG=q%7QPDfseDPy_pFqv607~-`w}=+ zki=c5IRDso+bJ$)BAf~7#3{0H1gF@It8j|C44m-2bP9a6{(A}4C0K9CjTSbl6FZ+Q zl+LDXzUD5)D6m3t5yRIVYM#WQgz8uhH35g>5H-|HXXB_*0C2n#D4G(gYlLJckX&9T z4cXxzBsmErZIeX~NlTr;&qB-S_&TvBY*!$xv6iN)rOvp9CZ<#Rd+-+v?TCpFwSCIz zQrzOu>Z#*4oThral)Y6%Z{_GZzaV7o^E#8A_4^^ZKqgbBV}lEDAMH17#oN%YlBX4W zeyND8qy)R=`)WOV5F`E!?TSj9uts-PS{H|+(i`A5@ejeF7;zwuV8lOROQ`fUfa7mq zWcRA{PzG2ylPc{%7S0zId}Caa6Or15%AegPJI8~F(CCRsD>4dxL7x6Gqk%hb7Xc!%TW~>vNS!f3Tn)55PZ+)(E>tr6_ z{V&Y8H{-WDJJLRzg|pY_vpwvy%((^emt~yPIrry)qI4B0ohy`5q7+3{IY#&8vR+lT zxd7#xe%kE}xSc1!`hY10*qO1b z$=2O7b=rOWpcqkm`-L|9z1eO!+ClQ6(4|Vd@OxiR9;ro!E=d>Ks0-9pGv@*$#os_K zm`uB8I2ZiY`AY>0(yj`YAs9zIqvX@Ilq!dlmmM?yy;!lMc+~-N=}sGZ*?o;-Uw5M~ z(smOseog}8T;ISjx&y^Net5^QQ@!Ne)k7t~pIp<>AAr@{OqvABi?2-$iN z+fKYI{7$^w%8rjrr+}$raSPa%U;FaS!VmQMI06t4An=t+&7sfP@33RODiyb~vf>Bd zNMd{lC`8BCjZI5oBd+who#f!EhE~jwE7Ya{N{hq>)H_4M&KyI&2&@?qj6A!m`RUu>4%Z5$i#cY#=0!vr9=C zt~D9MtNr0`F3o?4)>PWVYxoaOF3D>*on?;l}ypp9%B!0qK9CU z%URDkANq#8cS+LruX{=CeGQDk*N4%AaMK6xucI{LLzb`QTk3aK{P#skjGk^Y`Z&pS z6GrG#1NAB=2+zyAr@Q9^g>H>%1J~#ry_1QRTOeDi~Qy3ngS$Lf++&9_F za2WW6aTjc5GklS5{U%#qi`L~B_hD8bQGen&aj0Rhr#RF^`kU=g`*4xJv*ORZqBIGq zWJoSaSEhTLgpS{#2;n2h@zH2l)`?&FiHsjssVjdmDMRfZhpK?6phInOr5OSe%2-QD z4pT3xbU$_dviiC1j6Hv8jn)emqot+Ynb@roZL5*cZMyxkZAGRz8{ z_d;VoegqGXOw6)XbtclBsA>YvJE{sKY#cSdU;=t~ z2Cb(VKU&#lymCh{ei0bw_yZ-ihk)U>_;52mb&R4nX6D1Hc+cA_Q?uIIo9dYey*_*%;u}7UqF1#1Hm3NZ<&JAzEyIUf z;81*c%&XAkUtnFdJP1e7vcbktV*#f9Aujzb)5? z({Vc09N&YpgmERWczl@qFzCZ|$=YYP{a^6m)vPfiJ=)mXUFi7m6qY8g58s4C@!{(* zRK%Z#l0>_GaRlx5VB@GUnm+shOC667Z%cE0_&f@c4k090Djzl=aIz0q+G{uP_$z&Q z+c!AxIY%FU9hoU%R0G0e&*2~_KHP}(9=+A>?%(p^WeC7D`0%=ho3b~Ct1d%=N<*eN zQ4zUHGQ}2aQ^R%H+fp(GnyNI+rjmw{Da42K@V#P57CYg>Ia0&;Zg~mX!nzSgHN2$X zHyno;)l5_pd*gj%`mWa$9tH!ne{-?_E%2t~LIFC+ei;U2z3o2%^<&c{?tem6C=$5p z+6NtA)%CJi3-(}14=KsmcP>H%`51lO_aZpMbMoj2&r7+z1f-V_YgPU07e!6+kqqa-$XW!8k;%LpDsn&ac9}NH&}uKTE?y-Pj`=J zKz8K__4wEDyq3X4)lg(AMyQnOH%F)hh9(TP6P=-Ukh1ahP}C5}O=Eiekv@6}PJ7SM zM{6K`VLu89=kO=~3riYLkX{USmbZjSWBtj{2r%Rc z((z#44$`Tr;u-R#-5^B)7xTR592HO<103EfjVmbo9J74%r)`!2q<46n-QC{=X;*KF z@V`CKbak}+KFZ7d$TVj-{|*(nX!%;!nyxEejYDz8YY;8*2cas_a(5g-%PrYBYAgge zJ_kd+N9OgoH!iL?oH8eF(yo{R-Eg2O&lOd%l=!=1sfQ|-HhxjAKR%7qspgoB8ZcpO z=M~RD(+s>Za<3z6*MYUaAIAU7Vrd|z$oY}0oMC)6LRPeUAvEP^7e0J84#kI`!yGey zIUGZ@`w)(x-BX;XM2)Th$D5+0^ZM|Zla3FMr4Ub#wS7trG>af`vJcPSZ8z}vD}#6p z&wI|%hr57a!dQSS9($fRVcT;Y>0RQ``+w@gN00*H!_IJiC+4-HWk1RbN6Sd3r<{WS zq35B=&0t-$d>4+O<-Mxl4+0!tjiKHnv(J%v0%gv=QTuQRy7@1CxS#Uj>buJI;XOOc znqw&@Zwccx0K7hY!*S)qlgQeFG4SEP9mco*`@^`m;C}=ffe+`{d3b@7A%04pdG2y% zp5H8h25*IuM7vvX#5}BKo+FqcMzI?5V7=9d-kc zztV?a;CatE`tU5Iw}kN}u6XR(3Iru5%_6-U9eV$k5C1P0OF9o@8Z}fFo%69X5^{et_d?C>K03=N`3XzMC>n9IbtL4s`Qh z`mmjcyKFDlhtI_6RC63grIRr7dBu~57ambQd=FXs^7{YHJiLr08;eoQs^P?VEMbFb z`Tl$YdQ!z`It~xwFc|5Ao7yNw*UfO5Gg*A(=# zycH{!h3x1}bcEHfQwmrWJ^)}Gqea4a)&+GX=yHM<6EsDrV>j=8TayKCfOgUGtz%2s zs;{*24Wy#VE=n;teI4YQY)B~N2&HDKw>zsX85BSl5UncUP#kykV{p!1(4#o+035+_ z_o*SS9l-IfC@wrRn>o0558btn#mLw4k@PiLZP~O9j@uloE&0}|6r1E)U9(W!qmG^6 z)Ug9q9Xkpdei(w6v&eEi^^uZ3IwAKZj3;pgp#*8d55psl{;m{NLWY`wp|WKx%5A&A z;%ztHYx5Og!eQ&EJ*p-N?v^MITphJPABUo&Cmx3$E`bR|NB80gI;zUXQ6r57SVNQu zp5VR?93i2#j;$w4^RJ_PQt!VC&ZXYZw~nQh`&?5)xsSyRwX)$XMh(b~Vr;q@dK$Nd z{gkQqJK%Jxp6Vg-B#bbwz;e_R%YELjr$cQZQ$8^D_e0ZvI>S`cOSz?q%GLKz%!q8= zp8Jfg+Xa{axVmk1KMqB=dl6spZQw?9yA?;!?QLuvHNNN2wHAee$N$nHh4|k#igD!# z?SDNWEp_|%{#TxEvCv1|*4|vM5ANGkR<|+9CT9U)`yh3D>mjAv?PTiZ;r}XS{%0#t zNq&pE)%Pd{6I-`8J!|W>Fe$d%GvA4Bzkd|^n+O$&Zg=1ay6wuwQKLD)@f%SVc>H$J zueRTQMKQj+R{QN?=;1&2TZ~84?UIe<`t4mfo$9wEBw2ohD;~eC1Fq<|-;k+%F!lG- zg8xjn&I+~oEvi*tJH)cB+n|#Z+CWbpziom;(QRYuwjL}kx~;2pTZ4_GMos2~0Ez*R z-xmC0`|VE@MK> zyJonnPHMBmq#S6t_CrvR?4iTX^UixY+9w{wsYtFYJ#iS0@4&i%%_0Zs4YWC+_ys*E_-KaInLX6h7My6V>^f|b0xYG5x`6=8f>CVvQ5J`0A8BAH9SK)cj zIo9Xjfo{TRCrZ#aSRN`B*KHH4NqQRw+ueD~CEOXZZwj5~jPUkqWbN`sV<+-_pP)$d z+#8yVye}j1?<{8AYGoe|CF*KJ$MJ=bSd>*6M^M%pHjWxs0vvx#YB0_E7eCvqpF!3$ zz`9+noC^{EXY1k8-oWWpt=@xtkT8Da6;GLcC3vH6)gf!)LH{cD{>$Z#u}DXr zdqeNyR+?yc(bKMW;m}XwP+YM$!YJMqN)qjM!4b4OosFZ$B;J+FMs?+N#mV~}SFBGV z-WX`RhMFpV1c8%X@zr&91CQI$6({q&=Nw(JAIypOPU4Cui&h6gjQ(w6S)`Za&`Wj2 z|6lJ7RY8g4xi{1rAtYM_;10wXgNm(d&c13l?cxL&80s&K71L4 zIM5%L-Q|uGP(`v2|Fp(#;PF@b@KT=loTCpvfb@pvG;zh_!(Bj7e7Gg)O>yY`KlR~` za6jH0vInhg58GP4%#$f_f3qPo1vlQ`eJ?b54(u&jo`NH2*{3qa!vM!mL!IW4`RX5R zncGq3IsLQ`KL*|W&wRMw>T-R!F;1tNqcZYg!WhCUo;&4_4#kJ>xd$4IK}n+BX*hy*hq7_hm;-S9ZI(fvlHl+@$A`O6 zh{h1Y$y8$Q|`{oy`|Ddb`f7wHbSU#8P0A9ImC_#Y%bX_;XKcNh&t|m2+w8{td4eZ%1v2d zf+u579QIWCp1m7Nb61ugz#&RBwX!sBoQMPi$bG}tzf*3|n-cxl8%~vaKh9`$7s|{8 z-2ZeK0rxxeEZpc^3!S0LWT`rqT}*5f>&GshlP;3(bMkE%&Cwi+B-QG%;cOT}Lo<3# z56mb7OKK#HQ7hPj%Nv2&7xJ3r-@vjt;#&~YuU#p1yTETX^3Q}!-VL3lwjui~l;8yj?S{FW+#{gmRWd#> z#2c4~AGxleCS_Zv@azX)8cLg02G>^xR>& zISwVIZGvyayFuR)bR{@K(A8$+s8IxP{7RH)b_n2x@j27?N(i)z-EXt-*40$2@icu5 zTT{OQN1ka+0h&k0w~IYMli!7=DQjfV$ZIeNRGKipUoMm!&opf4!{RLhO}SHSoHyIi z)g;bD>6e$R(6gV1zJV=!eQxIpxEEBWl$(~jK$bwhEVja!GLLN{yb;ky*>6Sa8-RB{(Xnqxr zp!tyU(jSlu;*Vlb_B?yB`zva`uu;cY2`SbRipFygOdiV0$J1C_Mb&$M9Ex6;k6)ICqOg zzO@Fnj`ImZqY;SNL-cywf{#w@75kC>rlH?plW-cJSm=z04L_4H)%VwXWE2kt8QYLa zI=48OFuq$RJ#aVEUFbp75N8)3g+#V)5`q4KEycOp!O@(D93c1)^Pp3EM>^jdnH%j{ zQMq@GDM>TDb}E@TnBSb2=&p1|bkdniI?ALK(5#F}m3i>yK;IQhX`VH3!M&5w zvuE&mbeS^GXjhseI~{3il1kHZq)8Z!VQ^1;l>ieRKPXm514YaIc zuOGrVVcg&XYH7gP1atxbntGHOFY52vOpMeGBZm`tVx$}HbB(keEU379U=pyA&N|z? zy+di^9CrM(Ni}T8>lWkP+0Gh_Eb_T&ZHR|(m>NOMRzd!CaA2<;H^Uwb zvjwhz&A^3HazpYl9DJBfS}?nHLU!ALWr82D#WW zPKP@1UPoYTJAQ)Z%Wt3^FCie&mGb$XfU2Rxhi(-e{*vnG=VN;BIQsp#sC3w4Vv_a8 z+l(}4zb{I^l6_5UXZ#E_Et99^%?y^W;2kFs?YM(o4~~1a^a`{?E#2XYP*sc2lBC*! zR2c&#jJEG4akuqzs%c{ENdvuQ{co_({pIP989OhatPSfMbz{I zDtoBu#|uPFU7_V9S38CIile46G=V&L)ObR&!AzTzTy{Ji9gAsE2Cm1*vTj_HJ`T=uAomMMxeh@jg;W>^Kwi{32qCD0UBG zzU{2^^d?Euod&^&6UGj(ViTFH0X+$L0|0zC2iNViz)t(=HdnLFJ!k`Ywn*V9o9Vws z*lu3-nS;vZHt z$)%`oFP%pXeK$Ep{^uTnp_4TfxG^SzXHSDrF|aKH*TNA5eo+bB9N_rdEQq8SRIjc% zyv31tAX#XPe_WnxfoHr&*kyQ)ZatW-Phw0jhv5!%=cqrk5heD$KQYDIGboQe`b~jH zDsR8ywq)fF(4>Zv)O|vVUJU&pF_hk_NFxT~zw&pohcd2BWQ3HrK{zpCyg{^43#?IE zZ$R7%A7nsubfw<3+0oHRvQoJmsqy>{oW$!K^9g#45pgp?n=m(mGTsT(md3j<3?)ez ztH6mJ5~DTZ79ySm0;W9=Hh?lGD`lRI%#)NlRAw4ktdMMm$~KSC44vQ^(5YI zCFptTX$CL2Z6#=+^hL^}A?Y4!DgUu>HPuq57Q_KQfNqqt#nSQ<_Uk-APFm(TmWK@2g>2e*?eE z)B%i%l((7S6jlXLS^IXpDgs_|3+X0@MGH70!=ln+E$`e<9ql|!F4kOGR$k#nhFJHb<~_W%BxnWo^d>$%vMxI zjd+`g)AaM^TVtXpyU?4Y=ga!i&cyS?z^S9B$rW-+S6o1m$Gi(K1yW zI^U|BlLZ>VE@BjD1-p0@UHrX*uX>rC8vUgDPFC=%P%ITZ*_Aw9bGM3Jw-@eG6`W0* zc@(^DJ@{Egem)~89Uv(9;5bq6FC1`0!GD4iTfxt0#3mwkWRpia~1&q>ArnN$?#zE@1Z?CHgy1#wou>0hKj$#Y<(75r`jIw|KmcM7b(s-z@bMX;3Sl1ck;CE z|nzI>w5=p;Amtb0Dnp6`&JRRsKe zeOdjx5zq)6gWZoL$tOp^OgJS?+tby;*J~UtoFtjkK_*oTczy)}dm`W!Vm_s1D|ZIw zo7NHmPas{Y2v~`b$9F`)hpnaCHJ}OsivfU^vY7~?{wc#mOE=w+qNUGKeK=am8LNJ0 z#ZQd_))N8sb=OtdbuZ~!MZhXFO_jxsfWMv-H7$nzQzKvi)I&8jh1j+POIJH0*C3e# zmlK>E0et>VUZrG=fx&TeFZul(BN2}dK!3u8Wi*p~>)(MY5br;J zUUSfj9H6R6i=9ctm~uFvaFX=Aw@CR;o8-3|;KnQ7Qo`lzu2|0IdN}R_f{=Y5l2zV1 z3-Y zxNiV(+<+|h%|BA?t0`VUik70ty3(fj5U@hA9W#hc5ll71q0EO5Ace+XhgyW<*Ej;j z02@b*{s70HV>QG3diJYa_pNk;aTMByEUaxIPHi*&8qzSn8xB3$A$6T@eFa-ThSuW19+AQD z1>!RPZwyHiSvRI6iPu^8*{QT1DmwnoitiqttnU*m9LCy_)WtR_+&PXvg{CPx5vXYO zLYp_KXv^OXMDQIcm-Ux*e>v>$>&wcrj(S&|K;1^B(F+OsIt?+^ji8qS!uWFUNRlvG zlXrwKo?8LT)=)={2oW(+$oM{#idPoJdO9&Nj1_{8!uCCJC{cLmdYI{Ph$|-i4o8TI z7Ho{~*DxmTL&bx*=flqAaWl$M#bZ7x`h=qKJ94CCHuCq^)0)3$b?Y8%z4OvCs)Pa0 z5o-QvgT#QXk;s$ALa8fl0}dDk#>9Y`*9uz@N!V(u3H2nQaUjGUC`exMuZNY@J@mN= zj-uXc7nPL~zSpjk%XxgcBWE9WcurZ)@g6ud_oT#k3CXMg^9?2B=jNpAlXV!C633!G zka*fgpLFACH4Y`7K7j1;T2QGN<24+?7%#AK)VKuTctw_Po_Ol0NnT5m6G75WP;;J; zma<`hcFWW)N3dnSVs7}8XvL(2`GV!|%_H?b(BM<{1?DhcHjj|4n5yW5@jGNdm)%F~ zockP<`rN2*)M zKwU6kEBC_3sSoJP_P!5v%iBc$iz&a)M-yn}9uo|L(()Z}F8IIWFDhSNwyK7L`W&}C zL%|T;`DAwf06H(Dhkr2?bhr-M5Z#UhF5;{cBD#~|!+-KLs>`^msiFo2Xd2#V#FvJW}BdEEEU_Z@a0VCzfEvdhYo zF=`nLI6_#5@%<`j+!pskjenT<-!3FI=qxGxeHV~jl?Wez*ND6WlD(m4`D~q2KEtgz35)tK zu1bl02@JzY<5FMDW}L!e>4t?xXEZHaSfHrmoATz$ zsPF#`!s2_mk80KnbbkxjU$NbvSJw%n2<^QFu1C<>9GPArs6arzhp10wkY!Hp40=W; zYzw`DBNI1jpNoMvUI;yj1D=i}I3Vvoz#vnZJ4eH(JY~YmOC5@fNb&0?I=X*-C@KDC z=!T2g@Le=SaDVbJJ#`0Nj*;wJ#^Z>*VCVHm&_Yfw#4nu8iXY%$=E;~B={}dR&uh_V zik^``p=M5SoHvZBk`9k~8ykmEEnFyU2?Dmq>|Wx?vy5HV5;l|51bpO!;e;B42CE)8 z-r+lD;N9-!0o}`o>}6eJs>1iK5HuDuQ48G2Z>0e#i-;T`@H#FH$l6*e_X2Rdm$#bZM2an#SniNn>*wEd^t!CX=)6@{z})k z{HD<4TiH*+z_z^4z3XtliX?XZgIy+T4eMZN@3r1If-a=9en!x90`kSV3Zk6VkHC}c zaeyVUI~IL~Lm7(-N5CQ1LLPC}Q8f~ptCGOPvzR)K(tCQG( zhRtlJV_fzWn7uXiZ%93Ifv7V%&tjx6Qymz84AkYhBo zh)UE}{%DL^qI|A1JIY6gs!I`osJ zCs1tPmt#v0m&QMF_f`S^B%p}`)Y5=<$R!D*z6)5T0e=y2yrEF|3jNBuhOtcm2k+NX z%+r8V1guqnMH=uHXeEpfUBI;(kRae;0N{^%P+r>p*xV^h16Wjd{1Hvka45+j)*n8% z45ElXzKJ9F<9D1kL=CRH#uu|V@)V}Oyy0jetqVvt6p}{PTxGTRbPS%Jm|US-S7hrW z=ap;RF-Y;4Y*H&SCVYY3Y{O319r)P6JLsT{OZ$G7$-h+MF}R-u;3>L^t`*z=ibDy& z`V@FQxE6skl)ziq80%^P$3K$dNYCg`z3#|cl?=2H35+bwG1mEAZnx;h)!4X7x!iur zS$foeq^1PW1$|P6r*kNbJv>EVdNn+C?U|(4(V9>V5_ebi^DAU5v1xydD58?^_ zOkTcZ{^)IIJpb!X!8+bKYnA{<28L(xi?fAkAiF3) zsZeO<0=6!4WC#*aRRNyIAg2H)dy>MR_h=cO(SWN7*im1E&PJW60Bs8h*x&-jYrsGP z7Ain(*g*mI!sGD$PZ!WZ1Fj>WPyt>>T2z1-yaM}QT|g}jxQT#H3UFMrR7Y59;{v{V z)e(9E0ksuiC<-Y>A$m0_RCNK1G=Liu_kVki2wh9F^q|Db4oho^_obC<%pu?n1qj3S z6@@(lSm*+}X~6viOjm$H4513}od615z*!nFpMa|rU^0@N0{kX`PA(w+io?=#1e~J) zwUIv+AhQRBuI&PrYQQ1_4xBAQSJOiG5IcN(w-)+N4S1J;4-{Z7h9pH{lu&rX1@zH? zjfX*6l6#;iBz%k9zRPm*oUBDR{ z(2szi0@Tu3<9TuKD_y|87aXC75s;|>Bei>P6D|2&z*`z{0|7r}iqL21+&Wx*>B~E{ z&@(mQRsxnNz&^}il+fo2ORu_s0u7i5(T&ygRK(! z>>w?@#03o0fR_lEs{n&FprNo->;jr@TLOXtL<=)_|gk5pt}aNAz+3A4AwGq5ToH=xzkmSAY%L4ws6SPIm$CX+SRm4xTPTSJ!I?{e`9PW@@4D z(ttq(e5e3tVN_57)X$`)-*f?eHDDwGmIAcV5jRQzGhD#=8ZeH40SfS|%)poge3B}A zxPX5yaD<*nKobS1g2GL)^o}@ReHXAw17;9#ytWAanpW$+&XnQc3@!9L4Tuo1Rsr78 zNuZ*{^oK6sS`C;-z{3hq3FcBP?G}LL0-9^U;{=RUfZsJsX=1nmE+Fx=BlPnGv{Zmw zwBcHd;hMOBjT-P80hJWsC0#ny7om?&*Frz30ZRzjdYWh{pecORg<4wc0>)}UjDTkp z;3+-qzSD_-hh0Fn2CO4syaEi?TG}8KM!JCN8nA_c4hqmtyZ0DLl`UPs?x!3reL+Ai z1$bNweU=Da$pyTm0s9E}Dno>Bs#(euZ{0dgYiXhe93Wtk0-S(-m8Fk~(9gJlE*fxz zfXNE50#2;}wZzinU4WqhrwHh#06mbi6=1ut)WHRO|D+>y)gS<8DFE+}D8N6(HEOwl zw>2PxfOtTJ9*pr{0b1nIa9>T;LeJ8Gvj|wK0AsbKzmSMqE=b)c3maRHytceL~f0o4>>h^}U8iff#@Lks+v%LKfr0QcxrIZuRs!Ug1Nz*_`NP=FCSfbJKTZgc?|8t?%DofTk~1{@L!SGa(0 z9&?0VO~4rn5Ya4k5KC8c0gE-@GXnP25TQqFzz$LCuG_VirfR?r0^U-9gtqiTG2DwT zAfy4`5HM2#>TAPI5x@i&P)`Hm1QaL$*R7OmlnQ{~g0qvr&yPAn|3*Lq1vsE1uC54u zh6{LK15Og~OLY;to@VJpd-~G8Nt(hO4XD%&fR7ZQw)R$2D7@tY`e{H-0`5_Ob9Ev+ zQ)HOw0xr-1gMfhwFj~v-V>_}`-~x_3;s{-zfTju%(24AP$x97fz-kTn2LUIliO_X) zMb=U%{4!As{eT8ECt#fd9D%6H4u?fcAGv_x8qk)2M-(7W1BPc)hI?GVr5ezYfKdw2 zLaX&sVQHWXNYjAs1hi6sj#^8NMd+q3VAI2nmUhS9dW<_?viBn{pq&QXOu#J)FhtiHgJc96HEltvZ z2MBmg0hVc&+6aYbT|ie2c!Gc_3NRC*Dqp(!N>aGR1=P`ig#>h0fHbYvTB6n*7x2S_ zj?jwIOX@SU4 z*9F8h;Cll8=@X&1=*-vk3R2jAn-=0OxBN-WH+HcLAShz-a^|DvQvc zL;H%tWg_%HZ`DFSrU7*c*r)&(B4;Z=^ISk{4Y-Ja zu?ldOj<|lp(zPz2iUzbIAX@=epkPoeO%vB>?gF;o?`Y{t0;(%OKkZAOiMJ+h(Lz73 z0bL2$T}iYwK@YpD#SR-?z-<~(K)_1?@ID`!soRnJWVz@`7toOatdpe0dJ-@ZfRuZY z31b49+qWUB#|E%jw~BIW^&#|z+wpttodho+h0Bd~KkV+@SjTPEQ&^ajodkbDgYof@ zT5hcWiX-eK*o&*Uv3>)<@#|0<$xZ@!DdS+0`Ubq=18u*L!>cp-N`|&KgPEvrIp$12 zt>Pc6TEe&+r(@R=uowW`SdJjKn9+RGjD#9xg`)X~@aBvbTb=#ivNg7PYy<&QNg-uZ zmDSk<20IC-_76q*@zg$taH|}*+?$(GK9C}x1jb_!+>C(#`o~XRL8Ap`V_KXxYHrc- zL|}H7^y`nqMb!>v-&g#Zw5QWQoYM1y^XSBk7`=Fi7PagbOTu_LI0bp0u{~XOKYR&k z`HsgWpk}j57Rf4k1gptx#s@0)ibvp;k7aIG`#Ym=*)-|1Zh|f%zLsSfeIE%7wj84x zyvm~_NsRbqj+0H3qP&gpc>5UBI_Il<;bgx+9kIKp@Y?(}5x+`(v9b7r79Th*VBw`0 zfj}uuQF@t2MNKM%t7?__ei%!T{{k`*@ioAo{cl1OWgPb-IF0SNr-4Xc5Q*JK4(6gY zRC^F9K*fbx-zY|V)UQzfIZfI2e)4!dx(yUx51!qkIvtpQ1eY~AmWD(l2gLag`T)6k+UG-KR+m%>nT2C}ufKJS!)x&a!<_^gn zoI7afkin}yb^piSL)HwMH6I&#Dg_gJ&BXanjY&&WZ5XiW{mh~RS*CRYWNV5u?@WRD zaub{ROyVfuOluc;tc%8%C>|GJg2uP~Fx#9hY~pQF_&hk+${Olr1|&n)m%+%u^!!Mt z%szel<@U`b?dC0383Le<<2=WiZ-nUBY+` zj4-Jn1Ed8S*J6WYBZke#+z8TgxXdQ%-$hA6r`I)E7Hy4t>K^X zePTR+`1P?FF9|L!BQP7YLa|YwQKNK!5Gt6xJ}{fDsng{) zv{PN~DV$&yeGK%`@KX3j2J~KfqX}6@n-_j;mK?7XjMQ9P+Q78(a0Y&O;YPFM1Ws1Q zE}|M>A~1U*vRo)ifc04@ng=CCdpF9$dkbz*Y4f8~iA0MPwB9gSuQ{EH4h3SJFd>D> z8-c?REHVd7iNP-f@;&s5_vNO7EdNpZOVsE9Y!c|`Xrj?xA-$C7k7lH>QHJf5x1^ia z7iM;=?&5kU0<+_!oZV_0x(IhQt(EUX<7s9|yhG8U3Y{TiUJ3l%hYO|1i(NC!N~_H5 zt{H)%J;HI`TD(bEXk!~}VWT$6M@?(OXtVfeU^a&hvuIjoT4468_=)}shnmHEZXZCq zq2H?$oAGB-1GCaDyv)(GwwV@pj?>w7Zze*_@=q2K5fRVg2jZo+Qmd!kD(q*LM(6}x zmEX^*zY}i*#p?m_HkjExGH&h1x33w$xbb-gzRQY`OyUe-Nm>b`4vc0NU5Ga-ALqN< zdO^n<5?6z_au8j;@>!MFQGIS;n~|}NG9`vX2q@D!i7*XXInXAe6DvPxJBivv-2<)r z@~_7qm^gAm{y7TnAu{bdErX4=y-+c7czhit7|3_&apja(TRi^ z=)6lts1_@d&XrC#i%Ke^Mf${+aJTnX|CO+2-`&4m#Wb_h%EVr4=-KGSEZJAztg)-K zSJEMRF3lC4{7ju#yGmQg(P}cPwz*X?qx}=5=gI4U`CbDP0|^>ZarmkjUJ{H~dKUeW z2oFI$$jfk(UKm2}7{wmenO1GQZw%*g`uv1Z6a9wp=rh=S8B znUyVKZ|ewGm$8T3;G`bWr+f$hYr9)({*~QVtQ5N!T=^f_{dcjnWA{%* zcZa}!*lYLC*ywNU9!wb1co_=15_X?;9VJzE=XY^%dH~*Ihkk9lzljMhELR);p-uL~ z2&D2B+QgV8#eYA^oEk4Z2W=OVtEkZfNDX-l5WXjs%I3?0sCk5Yj>j~sM$NsceZ@5X zH_-m;9EUu|suEEDN3`QGFj$&5K`hTR#KiNZ3rF5W#!%&5V#$ke++AB&)D;i}j_IO)Hp* zql$%9uwylt_zwSf+N<$nY@-Yck?Fc~RuGj1-q^%~Vt2xL9vTH!$`;sa8;aqC@v9i0 zH(!zs^ zre}2u_rzUDBDAZuKP4Rosv~;kyUh30a^xC;GambO~GfdQWrB#AfNzhtvMtV2GqtiP=n2niu zwLj*d&;Xv$&1=*q4+qUd_@{9`W|W1jOI{mBmBR;p4?wS0`pgsSz}7Th^qP&ORZ31& zjGm3?n}JISGplX?tf|!##;rK|IHwU{YeP|#7(r_wY=2|ppmiIjfBU4Qaf{MaeXB~C zr6GvYRZQ!p8KQ}UVSM=D$Z*V&u=owtRwvb*ET#D)2u3L0fZ{7+O#sj94->^#Zn2_t ztT@>YdI#Rv>i+~yA(D04%#*e(11QT$$Z~bUcn4QqSzf@A$bu*2F+VtyP-lJs%OWMb zGoHO+UZAYH-Qd;K39Mk%ki3a>~OhxF~1DNX!P*F<$WBNf+ zb2KL-%e2O)Bm3-O_PHh#_J^)q`@>rBc4huzsqw|ZmaxtN)tPgZVqWFXbAeS9TCCLks0C7?c0^KY{*G z#YNu2soZ0CvU~h5CouaNoFIwOA!|f>?y=d8oJ)n5=4by{*ifFH!8`2_!Bil8wygOT z5oG!E2C#(rCl+4<#ZRF-zBpRX!7F3lmZ((P2;;Gs9PjT&7p3X^D9z~rs-=g(Y!;J9 z3225wDPatwAmz+vim}vK6HP-_4;cNM++%zL75|rmfe-T2lcGj-$S+G>NTNePWIyiO zk<JKdYw*GA+ zn5;t9UoxtqG#D+et9bs9JY!j^F}~}-pO!h=%>E7Q6^SZvTuh(JtTn;II*NyZ7bnk^ z!h`+ygEHj!L{?rPL{BhYx*2CC$r=AGyv`w_4K9Q%_zOcTISpnx!y=Lb#(I=`L3o${ zM{pcI4XSRj6@HE+(0Knq)MmKS2u#Dd@&0bC6vq2D6H8|Xt&SPUm6Z!?xqw%sjx{P> z%*TsXINi)Xu1dU+bwAgpLReSq&-LM;Rgp>G7sSK&wSrc+Olrahj!J*P5hA5x(7HN3 z7{TgLH8!loauX4WzW}c1-wNJ@?#8oe%_JqPzL?e|{MR3yWrQL*>7j_3QNF(ai-;C_ z9Qn|Da{U>yZbc<@Yo<8vZY)U#?)^++;$t&AGcfyW{0^d&#QIcz_QzB3&bRh^VK`R! zbY z87UC~Gw|Sw z{ePfi87ubxhF|dbx`Cpd_!Y7SNbh?B_pat)^lJFU%0Pn|I6yC%g`a3T8>ak<#Loph zcl{2-c&;Pl)Cq3P7LGx>E4``2fN?;X%vTUAG%6IIp za_V5W zthx#=q;k1_3h%!$lgp=^r$b-;@rM6Mr@b;rh5D z4S3ha3H%urjCS9PM(KD?5P@g5y|I6wcoz+X#lr%6Nn@`BE)=p(IWzxY{V*|L*KUwB z&)Q$wAorunIE{l^OAMzSEy*dY5{h%OX4Dm`kvgc+v{CaN-4vhBi ziuqAW){d{dK*s!A;AyB~k%b1MOrFA`e(EqY(wYDD$A6=_Y?icET5hR~YP=0=%JS=F zdb83BXCeIQ+&I8-k_0)u)U@Uc#_VM&Hw^uw3PcO{VcsgAJV8-(BTnhg;K-Q04BUSd zxm61LslhyLsk$=G0AJyEx0P`!$MeT#THwwmB)4kv0NSKymC}v+=|12 zA6JaZ4UAidAM1Y)3@L%;r}m&@bQ%`4wwj3rhv=5szD!UESN%PZk(*Jv5sh-FY_4a? z`nt*|SdTD=QMRe3s+^c%Z=s)~4BbV)?ui!2oW>_0fsrLJdl`Did(m;o5LkpGEaq?l z+T?PApqQ(m4v9j8N9uZ&Q3zl=aJcF%z4P7tO?rkPzrM?Rjw`WOA6 zxCt&I1?5>Kc~+0CT&pA(pCHHobBp#?#sBlNVHh9UENc#hL_1=FoK@&Y7P3BJtXA5< zHHYq|tbh9PZ;lzr+iX_a$D{=x4eyr9;5XJhQ7g1gP9EZ0MoU+ZkHLdtQM?ux9c-C(Bu~(u8#prO(ju znoEJ?;ZMb}@R)fF3nweh7HfGE6X6^JMGP)$ zyQNZW)7?!P9!`d3IxPK!;KRM1EHJ?TKJBCaI>%poj-8~L)0fGm4bx0Pi#^Q#sAzuX zs=~04^=*in>x{+9!_Xb>nxD>@_*u}jool+`1_d(6re@eBgXzv_yf+^_s*NR_+V+*E zk`3yHtk3e$T~^3i;Vcjgm1KcMZ9qemh_lmS%k|dr^98qT6TfWy>-I< z6jA?0KqL%qF0}6^*6_HnRL~eq`(Z_H5G%u@I*tlaKbq-9@4o~$PMcBUtlJxVtu7_K2-0Fzquy!F6KyWq4x~PlF32KNEi=*Su@hf z@0G@_g=)WB<@g8$SSZe z$~JVl&bZ&_ZR7aU?!^5I5UITJ3-_tv@Ju)6z5PhhTwbMz=VsyPQTxcd%}qQ60LRsp z{bfCl{uaIzMV(K0#XuBcf5FIH>GtnLHnRQufwg&m;o zk+@iRd6K%b;MkU*uWAE(@5=fSf}WpqcG-jPa^e6ryrk5?KmP|$R&Jv0BM2oAZccqg zy?XLkMAiviGiV>xq-oG`fZQbSW=)`eS(~1H+oUOb zQRejkAt<5j%RY*@`?OVZMZg-G1T@dBp?_{%9(Au1v*ukkIXE9(-JfN0oZMRQz z(=twr`8}uqpbJ~d_MX$6SM?I-Kc3??mvevGxxXNHDp_F#F}F zEw+|k4=SzE5U+LxfBr8aR=%ZZ#?czd1JWrre<1yjY zKi|{C3#tb!dti6mCf-{|In8K6mB%eMZpg@dfc}o8hx;?4KWio(2X5a8+eWeH<3zj4 z;prjV%EAtXWpHj3@ISPtes)0#h1ty0D1M(+Y=tjLt+pZEDQFS$o+LpS^=S%e0z3Q-{w=oPhX=v-qIT zA>1hOVO1l~`W^3wqDDl4f!P*RniqM4N=L**IyDYOCc_*9k%u}BW4gpmJWMFKg*!4C z)eDVuxWTtTo<K*fNrA~N511@(#f~FE8hnOeoaB(_Nyk0t!wY~kz@LTSD zs)g~_*jV=MByY;#G!-}Nu(bgpc6Ia8h7j~xp$G~4LqY^#7~gTnuY_?N|B6rTDZCc7 zWQ8jBGb>n-Iw&fhbOlb&N-*hQgCtJxP^TM)aARp0Cycm5U^Iai)P8b>JSNVPzvwvnL$w#6N$ydfxY+7{Zzb~a$-OW)i*ji$rRU1Kzicf-dttims?*l-)8m8?Va1l$r&N*hV;%YzR$Og=V866KyFvU8H=S1%l4gyz6#G_ z%B{}bK*#qtfP@L-yVm6T`2N#yl;3t?I{t)D!)=*_@hDj2!t7w2k|idbYw7sNioy`e zUv49XFtylqOZ+$p_6skB6NC(g!YA>2YD%nPd*ibiB!Gv6&IlGQ%f#=r!s?~d*W!*O zf6Jba2J9UC4K^)QKSvAuAV-04zU<}45OFgYvSX#G)ZVFgLiS*%IQ=Z&UDd{JbbGDF z34)?2jSAAjy~)ZD41ov@Y$M!|oA})0F?vlL*%Rv$zOSexENqAWVYay0hBvi6G2I&#ZF>aiNg6K9Ms~ zRI8jR4QrG~O&wGsJRlkl@`V(yvSLoXM*^*7%Ayf zD2tC5hFbfo`5NnV!fT9AE_Tb{U#kF z?^Q;3YpDgO0jr}AwZIP)EfI|VxS^qe<<;vsMISbr0U+`XcBG?9`Wb#7m^}+;5=Mv} zWycEYvyeBZbzKwPF@`Z=vhPYI^JL5;i0Rppmk4s6Qb`<%-P-FO9o6Zz&Q~wES z(BybKt>(JYd+^=u%gEb0#`Vm2zi+V{W;q&is0-qLSK%~lN!x!Z`-0wP(9}`mT*_>fP)d@h_cKBXVj}{L4G$m*!HX{xdK;mhi_s1L*9ISjdSslI{* zpIe|8*#3qrsY#R803xl;$c3eTGZH98c=MUNNV1l(M66<{t_4V_<{{rrnZ-r!lSdSd&ScT+$%qzqqXALo6e-4-YF+j&VVGAgAlP$UOP0NXZ`gdiWZBO^3H5oKH=hi)epKf5L-ZX&uAhcur+UU&XtFr^Z!c;DW(5WHCrbIby{n zQU+H7rvgL7tKgzjk9TE9;UyI8cq#EmjBc0M3-NaM1+H$_xW39omEX;Y7l7LDV(7T7 zID9gkg=J_MnlV zk)*HxC`p&}6FwrvZ4pJlo?x^hPkX0zzgWz=jErRq)ra;i$loF)H0rK$(=gEwVIVQu zk#Vb&=mk4oh83jK=mqy5qfqj9f=+%Nue#Wg!p}%`7(DgG)u061_TX%-M&%pUfVVYk zsLE@=;D*t}^L_gilEG-u?00{B3X9#;u$-PfQuye6 z!Xh^>R?|N34UFJA=DkYexOV$-0=3^;z2y7%TG1<_s+<7+vj}-375CW-p#qbea5?RmSHS(9Y9ZiW{vL-pYD_q@)y#yHDVH;{{bSF2DwyW;-d3eN_e#2f~jOuoQ zPK@e~%C0Br^{p($-lpeiR&pB^<;5;(DvB73?X@+IiVp0redC_#dVg)zq8vL12HHj0*)L_KYu3cj*O^$)V*qny&J+( zfzk=HLJ~kBWe8>Giv72_k}YJSq43H5#|52_gVNL<s09P6~ zsjb#`rtuJ>z+0{FK|A*qbg0QOA5a?Pgdcu zMpY+8lW#cofz8)hL>qbIG_wHHP$p-4u(8%b4%^=xCe7;nI9w_mD9K>~Czt|58 z?kDe+1~K5SoqiKcrn>M_gid`7t0wTfpQlOoTgvG`%)F!oX46$8pK#c)BcucKrT8`l z8T|HAoxv|Cgzlm|bD0YUXj2usOSm|wGKQm%N{2jt-KbTRNUJd~QE)#^vS6Pgc3i&z zgG^#|k**M;65qkuDk$mIGzO`mBVFaR57~`#r?sW*uapQG}piJAZ8?}cU%>f(D%&PHmvJKFYj?!O(VeU+Z zDbj0*`=hY4{i0O6n*1r!KYgFd6cV^r`206JT^qKG1+) z3q0SfLglHeGCJ;SBbmZw86EF|xeKVAYM74W#qf`BfJfd)V%AysGdb&xVbPpfdM1ZQ z&$NB~VkO!g`7cOG0^0QmP(`o;DVtu7IIve~Gc_rW5+l!b28IwcWTo2m#b9CFcvcnB z%Qz|72)8ds+yh;pkp_kG_f)^{YX2LGK+pcnr)WOXHgXd>!gXcvvP%0@6tswOZgP^w zJ0THeR5#2~tw)aPgb)^&k$uLni#)d^&B<0u@r&w&S&h}O05lFp--=AG%antW!fnJf zj5{IQ&cs)sHH!amMLPa1aWAjTK=97h(^RR61%(Y9C_P#O{!U`rucRF)r0EFayIcf)Iq|ngaX1`K7`@^o z`IPdVUm+677mR^*r!Z>6{P)X=`tQ;t&l$IBXmqd_`*4n)x;rr$9whIhYZ@sWLQPzY z8fxM`@azIf^b{;)!Q|9n4aSQjUN9(bn2-k8^oCK*$ooIF`3x^7lJ!rufgHaTZB!?5 z44C3P%tvFpUB|C*dJ}slaluI(Gg{9l_DH{B5E@Z%|92%@gHgjrd9;m#PB8x^R>!=w}EW>+G7qRb~QlFRILu1Tl68 z3OGSk>R5!(ucQ!7p<{kkt|iaLuA{D-H=y1AhvAm47p~=-BBU7}& zRK4Q)vV1St@e^qINMVsI!@l|=DvC^^^pFn{)m-h*zjQKjZ>>;Y!>oa?Z``>B7`Pk>Mb|6przLdE92#x{DhVq?G zH&&%6xoVMD8LMU~n<--jLj{9X)$RqsUKlGFEr^SG(&+;kE6fbg>{S>nPO^kMS<(tM zQGOeSymSNIj^Z}309Sfod8@=GgXq1!Cl9728f7n+IC&KDY>U9j4JTQ0yx%11U@0js*Lqk{p?x%GNB7*Yqj^5z- zy*t@>(k1XF9-=)K5Na>YPQWDyzC-Vc49lq%8#7;VbX#+fJ}C))S?!c0q`EDV1d@pV zo+NztR72(~1L%dEVZK6Lyw~vxEwH!H1YJ29R3kA<+GJvrn$}1XM4#anr|x^h z_OsLIJ5apbel`)?&uI4b${7JTE2a zhOo{S8k?E8MSp2Af00&#vaKq$CXr@6<_UAbFL@K=f z6Xkk;;ZLXILZNSwCW>tzk=?)#&L{Ojf6$Bo+RTtIQ>5y@koc<9-Q+&RT}V#$KXb#g zEYG?9NtrFJi+%dH$e+ASND{fenD>Nw>WO8XYrBBT9Im26iX9E!s*aWhRHJ*}}-)_IFuB`9&VHzNW>Rkhy(JBtYk z3lk=?E1iOJ^sqT?C%DpyG0O9*@}&4#mG@Kd809^6IhXhFw7*nd+IYI61p-0Mwh_Z> z=*tL3FCF&Z7a||&Q6wk?TkIsUq9f1s5JSx3=D?Gd^G5w-ItnL}lp>c&X}H)d)*>@W zre+f$?Gx!gcm-hf}fhQT6$cv})E_ctU=L zgw^ur2ju5x@#&}flS_VT2_e(_-;=4nQ%sp6)jaj7nr@dxA8jBp%Eq*5K9&0vEkt8H zG!@to<@slLh9qTvmNF^Q=pkt!1A)Uh(&T@lC&N9iC=jyoYt>e(Pzc`(M9$Vv5Q|;^ z*dvv>&_(u9j*n<`fSg%Aw=erPd01-T1CraEMD6XAHJagaI#c!-k=~Jyi#Lf`At0m` z7na4f%)qgDEIQo|GxDsx0XdSRLSu7elA99POy%v&-z-b}6Ez%o12?`uF`FzAUe1%a z=cRUWuu_Z^22g!|VL{OHK>I5@>~YGjGylh30PXhr&k!N@Hi~SwKa97;+s~nhcKe^H z9h2Af(lljec646qzPAk21nF}k0Hw!V?K_HT?-A~!I|qD_9Wu4~1Zwk6`#ow|h$h;~ zDmp)wHBv~wSqS;2@pu`I>Q`M3t$u;$Zz~GEk)5-nFXk+>#W8Px7&G^<7QonkI(ysC zP{oc<%feixFDB%o!F|Vw8jQ(mj}&|(uc+;$v+cc!Tfa{?w>(D^B|9sNamOYCuFD4t zKB6W8s>U5&Uhs{n~1m^1*JJ~Ar;Tyra=%||cEzb}mL!r?l6*irZH;gONJ z?WpVUbB>dr8%G00vVX9(i?FjgRzm+x!-?8h+Uh~#p7H2H?1^;%1>fj{B9t734@2-| z0V)ljx!|*MzW-zqHG9(kN!yw!r>K8d`ds2S$YciwD8#Kq+%Cj}gW!L8`8RFbm)X9L z$b$R7i~pas|L%KA9TI&&LUXT6yfP6<{*aCTW+Dnol?ApzWd8$_otT^_`{y}{TNS#2 z@5f2wJM)jy_XI}8&)OeCrdi0oe8I?rFC>mb{>pcZ#IH>hp{VabiGOHMQb;SPlS775&U4dgRkU6rl7~_`FULQG|h5hkQl6)s##Q$Ar z*Oc8YfABr%8`9t3cP~4eY`8}H+wGh1A#n?;DLG?oU-qllKy>`-Lo3_p!9h8gRdlJA@t7R1#fKsxh-)gurb5*h$7-TBBBd(PSC{~19t=!wPRC# zyDNvUTq(!4osK_Xh6ksz3KkU(zAVJOw0GqeKcSTl^|myah-`mn^-U_#IeIlYpN+ zoOnjMSoZ5w!7<#cqHr*Oa4r})60>g~85b{4mN-AHM4EZD=QGI@v4;SX={$w|%oTMb zh4&!~MZ>A_*zbj}G}X5We*X4j<#bQ9wD(DQmQFLAd79e%9h4+)Pka$fz~q6P^h*;0 z>a9=yEl5YZC;d&*^z-sb(9r#jM*#b1_6SD>Bl{|%=O>wky0g74nBn%<&PD|;I zO^_RtUz!7<{^d)MgMY?HT2m;4U498oMuw;i%TySC*l(rx4*NFOcmjdCY_RdGovuA0GUY^3mUBpZ2l`$*QduTtaD`V{M&0pIE^ z@X`P`@W!xI+bNN!P<*B_NLE9L8*1z7s1wV4r=}-v!8_cL-6}eJLEotfiB7!q+GK&0 z2F8CGgbT+1vnoHG*S)~o(HEyg=OiNPWkRA6fm3g#rBB?1n8bSg$C2E=5ccHR4U}W3 zJ&2^EClfEi2*R>V+x|yee2O$3t`5vb;}kgk79x%2Yvf9qGT#}8Yfc_PT3Odm$xJY9 z+?n43+e{TY`EA4{o>#fs6JM98U@X`3F@8U}2LYx31>dljlEr`STcltGl}C5lFCjy} z1!gdDH_(^^QxjqJG71c%3cvT6DB1GP~o2m*z-6H*pM_2fFdAG!=&isQ11J z`O_>iCBQvUPQSb`T%YH^3T>6#js|ARqj=hO&a4L-MOcN?AfEduM_^z%b&F z)S6)m7}U{xNoIY2KYfI?bi3N+{UJn%jI21+O{L1d;{KfoCiP;ey@Z2yQ;6LKjh?%FDeJL5N=-SfA7B8khKv?8hG} z9ssjk_Z=gi;a5G9K9S+-yzqi+DD|?b0CZYx9MvBt@J(1c`I8e%eiAvU`dG9fEfyx% zr8_VD?J}7*0g#@y$0F?!2r#90&+7w*7~kk1u7g8OV}>te_8iu;C}V}W4BeZOyP z4y>;1c%fq$+gdtT*j7#&D0rmezTaIJXpXmM7q6W3D)Pzhc#nE)?77H`-{RVy|Iq;W zHEa0VkplcM%6WJZZ9**T!wOKWWSMt-77m&(3llis-uvF4;9eP9i(MFCsQqTHf`2+3 zom$ypU-kl=&F%fR%69t#1W!#s+#CcBLC8d9r|XYPhPPcxWP^~(4su|!H5mm@{d{6H zcjctRNc+z7)Vc5UtIoZ$J^y|L3!eJ-sRi3Hu*1Q%{4gTEg%%U-7dEPI7erfuF(Vp9 z_O=0RQ8Vbq7gW$7H^R91=;EXCn>y@EfW5sx=UMw@2tckyyS)UVig%70v9j&`#C%MC` zv~Q99O<gZCI2sz|1XyRSIYla;r|z3?8Ob6 z*k&gCHf%?O7ymrnf|d`u(|TX>VODm4>>pNa|M_X`_NsVC;3BnGW9L?2Vr@;WJNw=(nOd;ZWvjS^G>C0TtRG7!8ZW64-Hq1>#r(BG0)v{^5);e zM$C$WedAFWCfmOB_)1r;U zal~}Vk4IA<6msc%8X3cyU%5JL*y%zxh6Dh6%KLwZeUBY0!yOy3%(KRuh+zVfa&kha zQG`rU`rLhGX!t%{NY!x|@!;iO|Na+p;QT+)&_Rf)e^ju9;c|vIGK?_nVz`IlA%?Fp z{0+lw&ezRwA;UU`n$GklTZ z5X0Xy6#t>hDPlO6;ZlZfhJJ?kF#I&bhZyc>c!c2q!y$&hXDHrQPx2X4t@R z8^hfU_cQzs!`B%8ilO*}%D0H&LWZjt-pH_yVGF|t7=D4_Qw#?g{)XWKZug6|o-+Ky zuqtsC&OljH4K+CbTXX5P%wP+w<`Z*4EHhI&F}$+F@~EMRxzB*a5BR` z{YK^YD~1CMpJw<7!(9yTVd!O8#qcVI7c+c|^~1sM(iq~u-CxLRqw$1>?tf74VH4E& z^Eh6=|G$Dg-f@zSa-V`aU$|l!f8kcYuQ}FOyQwx53`OR{`&56X_;4%7dpwQJjWLhM zj5lAUUw_^5iuvg{9#4HB)))&kaT1+xCVmRX^nHb-DlJ2grzzxbtZVf|Ya0Shz9bCQk7MH=fHn|+wcQ-7nTOGENSJQ96=)4_dC#?~8>ZQ7x#Wr#}%hmQ*3 z9W~!nHlndP7WKqJBUSN0f<4G5Q8vNyN*KFl^?L2t30FGh_TDL+LNY4 z?}M(g4@lRd4~Tz-lL?aAG&cQLWHk8uz|UxKsY)a${I?qOn2~TKfd7r!248c1!0_Wm zcD?hASOa=T_yF->z^L^#8=>Z4tFbv?z?%EfH$$sKhzn34nM)Wsg(IQbKr}jE2`A(JdrND<)i)HMbJ%04Q$LC1%EwRiaH=@Z&3(98-4!STh?>}fQs8+ZT)ke157&pxJ0_3Wp-_Gv*uX1M|o=Yebg=B}We0 zGl<5+j04g(#~XvOMxDD5wXLy+P_rizhZ9IO^>{Rfs#9kB2;sb9LFvLPue!Qyk#BRY zKOp;Ia_^YjQT!A3GkmdFq;YdR1|MYB{8DFhw&D|!Y?uqdC*nIWH_q0zKv|fpPWoZK z7(5qWRGTq@_ofhD11-MVSg=)SdX&#qGRKJd?g&KTf|cRFyZlBt6a}wB@B|I?o$)3# z5InW0Q9>W<8@B|S;S}L-RupN;d25P;Z*Xc1<&7D2p@?xupml2~;!oxv36{x3vRuZ2 z7{;S9l0B$NV{?6yKAk_LGfrkuiLPbNU>-S8j-e#MAgD8ZhFb~-JDEbP-B?v+L;_K8!PwdenTf}Y zKqLYtG&Tcwo%BULE0A2(KjLeQ1{M=%jM8M)eMT(es|{?1W*A6GuB^fq0wNjnHP;4= zKuc{PEXB9U*D5{R2H%zd2#N-vM?T0;dUq={!L!yIQ4kgMLq&iNgAk8ETnt%V&Kgee za$hvCQkO7SWjrRDj$tD);E)k61VXw2QUzr@N~KFC#&)Yl)D@-5(Tbv#YoI^{ zD{D%s$-Xo;*M=ey8V$*GX(UK(NgsYOMX=lC(tA89QE3h}&y$fxiOfZ58soD*DRXN` z>ojWvNb;}&b$S*o@{}$R8yaBj{l*HVJ!$!9I|dz~ftaqEH9plV)(|kZMyM4?TjxT3 zT0w7Zs43h?YD(qH;VG(-G%o=#Aw>Ej?TjwSt9Mi z8K)pcI#qoqy{mk6 zt!2IOV)|Ym3~lxWWtRY-P`xmUOi%hAkFX!YFB#uy#zFmgJT(1a%3m`MDCvBs6dq4H zU+F!AZ+K_-glBv_9*B3mHd(^b+EyY_8thpc4Rph^!dT)?^?$10#YBVdW;6TPWIw6! zxcin)nNE<=ColK;WhZ6S1%36T_=d;h#t>vh>nbKgc0%)wH7l!Ko^@4~73;6tpma}~ zGdOoie`w~Ybeg+f)l*TEjg7E7&9#lw*Mpl#HVpz5Yxsf3h@G`%)9C!>oZ%aP0j-4W#y z3}TijYHUUysND~Ne&NbAcVZN0ZKL$m(u{y|v;EQ}8U8qVGivsUgg{qp7BzEp@hsf~ z&=?QBH}xg#z6M$XwQ;f;G70SK>=^oZu$Zc}mb`M=K`3K(JDexf(?_nZk<1GzlVJlr zB)S*Bah)z{WlLjB#2O-@t-#ZE8vO)%M|hGRGQ+9(WIj4xiM?P$uHK9~ADkpVkpwTk zwm}aq$RRRnK_a?&m91ujXsk1I(V0c){(x$_IM=`*jQipg^~N%TRd0T>MiNbV8b*co zr&p2}wipCOqw0H*9Is@W`H?_#Zgb8`vn<>y+W;2Nl5`AH9_^Fjs8HYL`|-!Z=|td zvsP1jm(?YgmMX;VeMNp|P$`*+RcBa)~*7Y;KI+NfVfAZmb?Y~Hmf!4ITd`&(m&=)j8&Nj==>XQYJjoHN5SJhw z<&)knO_p?g_EL9FZhGr zrc`#DRNZY-l^5JSi}b@E@`L?ax>dc{+@N)+KG9%^22qq5{x(G~n~O(4gMyf95pwwo z@eN#?lpfqzQMGZU(!cpX6s3xFj+`klQO)3K;x<%znxVOAIzJiDF=m36onMIzJSt|7i94kJe(t>pUsjAH5{HrCtSdb1RIxz*h2= zuuiF_&ytg!)aOJo<$xI}>F1+LRKuu@Rw?Ehf%^G|m#l>s10g>JeF(z5c}cH1vbNRN z?46&RyIS%nN>hzAO-8v@RcxqM#bXu{bJ|fkqm6+AR$e!wtEM@=R-V9x_VVmlbZ#yc zEcsJX;+$(>1xx-nXU=@xTf*U4w#=AKWzWWBS}je@85h&*#VC-f=BuNXgNupKi|517 ztmL7(ln1ngvQJ9?Leze$IYl4a$#5_({U8q-kUr_YJ_=4~#gP3xrwfNLjgh9$l6<1q zwBjURL!JgTDuLOOfs^*+8Q^^u!ewsOm0l&0qlHYZG z(345yP>Tf`-Kpz&Oo_wv!p5O9+*Crgj{eeZB6=y=7PTbNj8FQf`zcvXj!$#lWQ?LC zWn?7XnhC&=HYzz`g~>efN9Gz>bHVfz<`(3n8}M{}^llk{AP|nG*vY> zpHyfc8D01QOgzz@YQ0qZDi0FtlD@F7)dzbU1`nF$P*;#JbM;_fF*f1NG8DH?&aLa- zj_fgp{Aue^>Anu(H-&1UsEyjZC+nqCVQY?DfzlRT@{1IV65~(xr@Ro2cg#P@c{NNT zL}HNu1WBR^$w&5tMEY?*Uy$t})#i+uCyZvDi9yXU;mmup#pw7lw# zAFAEd9C^B;j=E;8h6m`&)EJs5Yl5>^i;7C)i1)g9FenF7iflppz{3g|Bl9IDvLH$E zkG4v`l@PE<8EEwfXevkk!G6GiH%U3ic!*p<`9~{Iw4#w5-Xb>5y<_=R_LdUJa?F0t znf*BVRWQlEq`?`L?F^u1|cBye!%GR^a73(*KMFQux_LuQC|=Pe!Uk>mn_FUa>Ljt<8n!m^d)0njfggm>fDNcW`082WB>n9`1VKzr(vvwukJq)Yu;K z#dG8syGgf^`XeSo@=4>RsfFTSQkzrluG8s#uv9;aQ>uz~@%jBhjQD88m_BY){VgjK z@RR(6-i^k|D36aYV32x-YD$%s{*vmpX*y2HpPo*_yY5?6d+Qkke2{;`Z1-+1m#;%1 z1;y~c%6I%%ZquRvw=hR!?$g$}J9wO7Fx2r$c$Vl%=5GqLeNW8~nW9Az(^taK$*_!J zIYUag>m!+0M4 zY?k;Yo=|j3mJf3MBC*=y z)fKWFS4P~&WjXHjxN3!0lM$!zyoei`jB;8OJ>~zNC2EKsm}8=^8}Dv?=s(QS;(&oapi*PGyhqIMF*B@0+8lf9e`1_CT2D(|kP2 z7d_(y(7}gjq_)^8=YYJ3>rTZR+KA>{0>o6T_B1UP8LPGrVgJo?urJIJ<+xpPBc2mzo0*^^{oOV-M@&UoQ&HAblr?o1 z@?4f9mico;S@i_rTsU5gUyv2H;kQGwm!l3B<{|$n;zH1JA!xY}v|PAr`tW%}g?-cS z%@g;&R)k*=GQ>37bdfupGc>+0J3P*tECTj^2Cz2CyA?Kx#9|xH5X+e@1g90ET`?9apIgKll$_V;OoVC;^Ma_h>K3- zh;v_?DDr@xb&*m4o?{>7|8FN zMTBwnbcU>~6^VHj%yXF46mp5I@2be3N(wIR%~oo&cTzPUd%XQuKY)Z_pF| zmYIgydy6R_TrZMV?(~o32*<+ngyVSLaPCk}c!GDlq}_{lpFU@jIB($$ah`3ea12i# z${Wb-Qy9vgk!&a#J_j;91v2aqGj=7p7q*q;iIRr#V&=jkG4r@djxVLQ`G_cjt;`$B z9Z1iY?C{J_ju)S7$Q5@Tn;~-EzDPJ{*+e^@?jI=~OMjnU0(-ge0&)KDGpQu`CEb`l z+YVcFmB<+$KcIDn4&Tiz%@w657KjDal+A%C9)wO${vl+ut$B@*~9{uP55PgWRK96Y4#}nyKQ`yluKIyiCB zObXj3WQhs3b4AkDLpEn#1YLoxpAP+*LiQ7~?)ZXD{0*J~T^7D8`=@MQ`ghxTxoF?1 z;=HeA^366aM@&OMFm1i;#lrdCJh#-vYV;@T$EWNy%IjU6C4P>_^%LS1+v_vpA#-VX zwn^Dy5@?>Ze!|d9S~Mrq-7VVlIr|i%q&;?tBva}tN>5t`zVWf4g$`aeS zyv%pxXTq_ai@pc_&AAIFiF4N%4CROOyvjy8MDB6e$O5}4_~fMFi9-{@WSNjfd=tPC_%2M}Rh!HHP}LbcY;$LcC-5x&DR?CL zHbK6B8*wg*gTB%C^!M~MieBVNazyE&H;(mLqHqKHnq;2ig>z$;sK(Q)br8JGj6y(wSxr{Np3#8x~B%C~U5D13Xo$Ul|`K1`DF_u$*xy37;#g5ICR zlk+oG5A!?al}v+rrsr>4I$kUVe{!L-vcDp^u7{{d19tNU(Cd} znc&IH1s4uqFf@JOyuL!n3uKyXjHZv;H<%^9hG)jli3gCuGvc6=X*kMvgwF_`PDTDx zBhWEwi{<0oStNt94zNwoLq|AET!AM>d7n34ocDINn0#WAupfi(h4>|S+GM%H^iH}3 zzNDqM$u`D~MN_k+zpC0iUxXuBVh5ff%IAhWaRbU&b;2$xUPJqUxB172pE(kz19%B8 zkJ6;SXXJCvcySJVxP0)+4t|8UW{L8aEKw!>OW1OJ6Zl5F%KQcyNyD|}WNRPAsq{d} zik1!Mwk+{ac)Cw0`AdJdxpRaYcB}w)p6yWBmJfLb&+`{Zjd!bjV3RRcp4^rt-sF5T z-idFJr?&gD#B+FbS?TY#yzwG$J$lO__)};_*@nj^BOL}&+q1;=cozPGXhgjcFHG^a zyljz&{v&T!PFVJ5>ygLwTrnMOF%@l55QDv^{tEgb+OxzoJZ&;RYG?TA8F5gwwD;*3 zj1v=W#e!su`ggk6m;MM$A=?f)DMVWoqAdy+Od0Y52f2!pt}OBQcxcXm{{Dcl{WGa| z?swf&NM50TWS=N4YACJ+-feg~IqgD9hi5Op-;3~rY2WF+BklXd^U+T&#CR?O?>>C4 zm+~cg4+H1RyRyVn$cG^F%5B3>4NcsPI+46Yq)+R#DBYLVke2O$$!`+^wszMM6z+i_;0h zRe$4gr_Sjfyr;$8^(VX|t}QL@dBn9Lt~V|2lYhoLrM39`>-|59H-EkVNAcmW_x~t9 z{Pq4H#fQJ%|D*Wuzvcd)V_ELj4Oqpb^P8S3ES8I@=$Po(={j{pR<8Z|vTUXqqKuu-mgr9Nl7hBnaS z$kDH<)?7i_r;#Ll1FByw#1A<2O}+>c3(S?F#FkpmdUZIRqUAbxJ>rvTWuW`X!7)4Z0}U4tkrS!*HgNpH_!9ZHR0ep+#HT`ia^w^cu-sg(_@=`BIpwQ?J{ zXFcvYq9faohRvxQ;Y;COx5BfrndrGgG^b)Ex1(tiy#i+? zX!&-4xq>3-Je1glyrr~bV{)>iRhJbt#sR!q@U1q z4PKDc#5@&#zc@{tgwA9h4-?|DB>iC02HNa~d6YCRk=|T_d|2kzsM`)&#qm_jFyY;x zfkYXMXo-n8`TI=~>;~G{OlOPaf$}?$7ppo7l%g+kQ~49A;^&kWn;AUx9~lxT{gud_ z=)W;-zw5p;Y|@qh*$*N95jn6K1ueZy%PQUju}6QE%-fctXnkXC!wMXt#!hM>rU7et zC=~QatdA!7q&R*^mc0rGE3_zl68I}{kVWCINw$c>x1kheK1fis4Ez>YtW^^22;QZI zl5ba2nb;EISsmRF-yD;hL;fYLZLY`Jd?98qXV&2i4(-%c3OgrBuVQnP*bY3lW{6U> zs9nu}AS$G3BmGfvx2CwlY`ZNj1_yz}<kmZYboxYG7$k%v^XOK)b|6&pGmfB@K-M50hVksKIKhiL*%b%y- z1r`~dBep;uWR9(%DvB@aax21N`g#?~TPt?;DFG5&(`c^@P)9GsO;W~G&nm<<$RWvn z>VKu7SEoxJ24=c-5#mcahE!S{P0L*hn{cOUA=`)yBP>uvS`_RQ#4#dqYqGawsY>fD zBdPSOqpSJa4sj7;*>qUgPR8bAPnsy9QR8!4TPKf0GKFuLXV7I29i`G2eK{P4j zt(v#OzlClL@hkBVx2Ndhlvt5Y#Zg^Z9fwgK>qVdrUKN}hf#u_*y;|W>Jy$6xQ7uKh zQFK%^`^j4oMykHjQs0@zXKh+GpDDw#uxP3*sqykqx0uKLA|@!^{xQ)BPX*#9TP2pB zj&?(0bxT>xwQzk@nz%m=@q=ji$AA`rD(aSrFRp%sT~np8fm=`^jvVVxDBaO(+23>h0@`rDsOdN4C%!RI^ThFmZ`QO@+up*;B2e7ggBG*kW?K` zA_rxcm4~ciCo#>^#iBFo@+A2$P`hMrB|ByEQNNtl?kOpOJf+os3=cW zD0D|0^JLr8YE06#HuWw$x`I@Vqy`AFm})~=NRpq!_oP3f7%z?x$7Clns=A1Mqf)Nr zdo_5#%9fOU?6e}vbt|YY#7(1=u)OZ1^y>M3>XrX9dwndp!WYKw-vBvB%OuXC*Fm~w&TlOMLzHzJ6hWE^MWiW z{|a)gn`3TuiD%8+X z@!&Wz5p;>yU4aeMUAfTrU_;UBXk}n?ydGx(HI+B4T)%c@Rp|o7^BnAkUE$G(z;LL8 zmT(N%R+UnJ7R$j5tsq(x^ z$je?)@g{L~D(ne}YXz=3X`rjm@Xv5}U{8 zwC4q{n0LiIRgooB$J!?7*-{xwUS?}Cr~5&oU%J&eUiaF_i2l_jJ(o>$*lOkjYY^&B zzUujK9Vt&px#=*LAy59qaWIa?XzDmUZr{=8f#CAta+NbrCS0M;Sjqnl{H^2jk?Kr? zLDxdyU=hyk$sM&xv=3Z9<`PCJowp;)bANtmXX)&}j-@LTFcW|}s1wbybjvD8l7!JTPzR&ptZwRMdx z*VNV3d5seFg7c8gNMm>}@y<28&K7xq64wtjfRs6D*#t2*JR_G6nvs`|mn@B3GuK#J zPycPcW{%^CK{P*UV7}rUsCSNbaO~(TP-4!?mG`j%NTQIUJaeiZ{>!4%{*j zS9fC2u{j*wZ^liFQh-8yHVub8<&mQ$06_!yOp%!Y3eLSYHYW=-pR~o5w zN!RG0&G3(?0bOtn=*CCGRlNr9IHyVn4h(sBff1&&(zvCWu6uA*ZAeE~T^kg!R-TV- zji!~e7$ZnulOlF8om~Y@5fU%lM;46ZJ`JK#Rz==T*&GPsCJb3gS(_xipcux@m}lS+ zj=U6WPBI6TTAsDUJuQtf5CUtBOV)^=L@uRN@}cTZ9uIQDnR{QWyckUqBD0yBR-hcw zrtm_T;Zu~RkYr11dxd>HZ7G|E8JmaHyGb0x(07#nV%1ju?O>?$;a4%tcv{chX1sq@ z`8XMBJQ#8LXU>nK#{~V~R{0Lyt)RBf103J;Efw#5KtWxOlj(hkVfa4vUE8I796uHT z!))IiAJ5ExtaSSO@HbUD$Abzw8J01hG@jscy11Mk#&etS!u;;&Q2FWfZ6-V&KNd`i zSh_ucsU>@mvbaldW*Eo2i zq$nv5F6shR|C>B7uKQeRT6G6lI@ee@*SLzZFC(+bqe5JPK+`9b1XuPXZ7mF}$~9S# z&$w82wHJ?aE}iVLDh&Msu7Hg;(yg1+8Kh+x36R@`8{O#s0d2Td)kxZsRg-~avFY+Y zO7Du=SoN!1fzeCoXMOLhQTl1zoT;apn!)#pH^g{e&ZoyBKW%5m!qav}+cSghjiyUO zhshr4cr!E@ub1-~w#d)2Z)pQLu2K3g2=5j8 zbw;dmTmPbZ$-PFS(N^>n*TeMD=~eNj=rdn8zdt;0?fb(M<=WFwMPa|D^vAHjQ$kHZ zi4K^cbG$lV=(Z{7%^m%`;gBygKc^|5v;C_5Eps`&k1M(`*`M*(vvG7kGy~~uyqMa< z`LPd)4z8QyEb-y=0mb*>^Hu$D;B&$yYz8cTdht&)JBa zdWBck%<>pg(9x)1PnhF5!4Q{MzDt#-{db*T59fF2j?8rWM~|%JYl!8mNN1$WyYWM6 zSCf2&*D5-C)_pkic+V0abbEC*WVTn$ekE5upBufMbu(GDXX3HZ?M2xA;qcFFzdvky zF?5#XsO+HPyD>}gS?gyx+lv$X)OY7PQ@e71dwYQtw+t7l+ zu&?TWMtcw4@FCH`d?-IleAveA6^>=Lr#D}#sIbdkph>i@D%(Q$!!``k^}Z+Le4e7>0R% z!-W3fy|yblTiA~gS17sH{%jZfDOT-eCOpjc*85Cmd$sVmc_=&6?=h#>?^fj%S@f^Q zS?X6bJ(kcUA0M{9_MD~poi-lly1O&|Sj`u!_8QjXERD#pZ}tBS`|4%?vF$ARk)~>& z@mhYC_|VJ!CGLO97?bPqSaQ z@36wd)n%D~jMvBY>^-LN9GO_Ch|15+^mTDP&auF2WBRP{aC3r8*~|0=pHt=PeH_Vb zxm<(!U(WTwjar$1jMvZo-Jvn?y4hcK9#`e!)PLq5=jUR){udP<-AS17$9U!3zJ~@B z-t-J4yf9vZ`8@o*!n10RA(pG6G4S^Be7N9tGtW=!a{Ia6TKZMFQ!VHlS zNp!BqX{N7_%RM)VzyZc9;&O*x`OExsbGz02o5H)uBENmy9^Kq-R_!6~RQkG;%eA7< z$#Pou@?UO`Zf@URmV2vmPxCx=IrG`7+%7IRhwD*nQQvar^8mMpmAvfa{05#?^)TBF zEe9=(*TDK=)xHhfZV9f((lh8&5iKl#iC0y*xaBGHkL4iD`Sr3qTjBLFp22cpRgW@m zk8|_zk{X?9e6`qUv*TC&-WlwXs9tF%7-A`#|>vt#HjW=1Y)ZS)|mFfp~a=CLk zKRw>jm^!~M&Tr`$`3*9C+qiwL%I#sh`!<(r#?$)I!*;0u1=SwrenGeIFt>+`<=)Dk z>iLu&wv$%vF~Ia$;puW6T;E})&&m$Mg!@&q{As)*rf(CMYtB!%TMO6sA-4Cp4Jq@F?Lj&7Zxid0 z6`qUjZVuy_>#NIkvAi^lVK)wOekE+ztjbMrJ$kr3tjaB7ywj{7X1UV*)AM?H7W$#< zahmO<6`sy-C(CKe80C67zhlf7bA5GwVb=4x+`d-zIL+mrW;}C0sPpS#`|=j|3ubxI zc!O;3``Aue$)B6$Zz;E%6@5DyZ{HYpW02*b%EGSc_UPyQYPjFGvO{5(zuhb^=KAXV z3@*2f>9eZuPHs1Y`C?UWAJf;*^|11Didf&CW;rnPPt&KzSqr&b^EgW5xmaEv8e_Z= z*8QLbo|c0lu16V{Yxcvmoh;-0`q=*~$+Rv!nh~Om^|FTXto(=pZjU{TXXcBhFTwKM z&;7KO-0$RayV>6`m#gz@VYwe-Ju&Ha%T-f70`VZNCCHO-e^wpWHl zzo79BaeMT#y|U7`5|%%M+s%r;5-kU8@2&FdV)_znH*l?e#-FBdi1}Q?^U7B8=i+jQ zxE@yaWsvPlH`@&>JSX$T%lxyF(-PL-L(CVe{Mxu&FZ(6tel=NNmebQ*53Ba=;re!s zAqQPtZkXlSD!*aY^C9Mo6fJsM*^Y=Gs|U^`?bS0&899+oRBJTKRyYYhH1Fnuj!$d#M%N?1S4e9`SMOJTdkp)c_cPa6^l!R7y1Cqa%s(qR=;8YIu|2S|8&0logGGO- z%N@{oWAqA~%<`w{OE8|7`D`UuH7uuX7Is6^H_UwA zY2jb#atB#I=CWP0>IY9V|Av__W`9HHmtg+=iTzl!{As*l#>-(nH_N@oE8~8;n&~s+ z>H2nYe#IpM%@2i|xG?eP!G)3~_r{ z;k9voE|wQ7d+*lvfc4EvUYslkgG`^59C%rt1=D9WJ_<8m2Dv?~@D8!v=x2Y;3a^*j zL$Ews)mLzRE4e>6+ZQb_VXp7M7<_i=axLtT&aa>A`-H{(iHON5e_`%t%=Brz61E%VT&{WD zN|#&4^%!EiVWmfX+Hd0gtmO1G(|3sV!wRp6^XnO7zR9b{joiPP_Y3HH)Udqtvwb%2 z7tna8nJ-0S1KJhDtDOk+sSxlJ=g8g!t}MVTv_p@jrme!F<#L1C}DjYX8U4g zuX_s>Ul~xi4cmuxgJY&hP0l{6s^y+ZcXC zALDHr!@ksLyTN=m)2G{QXbe1E-)^3N>18`^)xP@tV>ZjZm0x18JeRY)nDt1P>ty>} z!~8SXL*w;welDiZD!*RlpBTfh>t(%c8^hlatRDko=+PmjZ;H?E~XuLkwj~13^vtDXE7nj?@^x>x$Gyix!)ZqNQ7V@Xt&C7i5 zvKXgmyd389F_tT zW9aW7*Q3G0uhZ?(&*io;pU;#l)jWe*e;Lo*AL;xWxZMu29$Agc8kjySJk1xU?k_Fu zpDwqI{iZVZhpg<&Amg=I%pd6d+E|ZrEZSG&xmZ8Kte58Y)p+I1XBUqzt=e~h`BKJs zR`#!f>*QaJxM{Mm@Zo-@Y;Yy0GqNEXH}dzBycv zgWS(p(bvG`)>zsz|(qpNSAA2*K~dc>(SfH7b|&jvR$*n z)8!5@-V+w`r`KV_EH7e={v*MB>0>-A`t~ti1KV9IKcbE8i=XY4IX_LGU_C$0b_hSq zoAIady15>0ET=0ouu}f1VEUeB`mF4(q3s{*k=YLEa{IKuVbPy!yc#Yy!Syir3mPwn z<)zEge^wRi*5gZ-XR{sG`E@a0T6o-OHLi8A9y!ODf5~Av6tlJg!YgBW-Z=)|KGw@NmQ!=Q-^f_72=W@Sg)ow$~zcQ}JYzzAm zW_gK?(GTup{oP~PA8~z|KCgwI>w5GuUKh)sxxSjug7xE=h27Qp?PI*R#^B3oE_b1Y z-0S>WxIL`!G<^e{pNswRk67@zhWR(Z?O~QbonH&vH3#<#X8F_f9pd)&Ti7*?C)oZK zS=duuZVt=oHVZx1`5DaTmND9+m+M-kUOUEf){$3^>bJ?yvWc3QYkwTJua z%yu*;@_En$>U-bQncsW({zRRRo~P0Kh)UQVn#+5F<)-b6qsx`P4@o#i|6auD9lJB> z(R9SSb?C3~|0@TuKs5u4>fXUDVF2!g!R|sB_Cs8ZN!}+A#vNB;5hiF~M7SJqBc2lo z6I@g*#4y4HH{zL!-~7g1EMgHl++u{w0Uw4lS%z>gV0MX+zYC80lf=_=gs4V*AK>b% z@hdEp7H}7y-3Sw$fdTOzgb6-~=V^qy0H4D18o~rmFA-u0VS*7l2>3(%4l>~GYlScn z?g8w>vlL;1h3kZHAx!XcJYj^(0sq-AL>t1myG?AWQ?z*jzjM0~4^djcI{aeCA%xoi zzlvu7VS;tr@$<|G6Woa>?~N=8-$2+v823wxPv5Wd>;n8M9w*`nzVR6$DiJ1_yGw{5 z!UW6kv?1&Ugx-iQgbBX>S^V@f!b5<&J_nv4+zaS}4)r7K1&n_YJV6-xD(?RW)s9_& zzv~g=ZNxhs7UJGVK@S9JAe&E24h^5~~83>mH{`os9AMvlC z`G^p1#5(|AI;!Fa03Uls(b)_5BRoOi5S*NE6Kx0+yd2Lygb7yR=|`C0C-9s=nBbT2 z{0U)#YbM)-<452L;6F~W2?OCCz{L4Bu@qt4^C^Bk!zR2G2An#}Cbl8$1Z>CCjWEIQ zJ8j|+!UW&L^BTgq<3uE`M7anL173a=enuh2M!UVhUlp{2NaBwG&_%R-e$2~>Dw^qf&*ANresd)Hb;xl+CPxwCK zbv#rq?o$-EyA=-Zm=v=ybO4{*)~6_5MO#8>f9 zJo-d&eYJ{*pCIfTRXpx`6<@$ZbmIP7vGGO~k2^ZW>v$ynfWDhlJno_rf51cWxSvaW z9goZ(@cNrMe?a@kIe)+(ad-&uo(CXTNZSUu=d%ib81Q$WXZ$bN#NXf<01m-D581?< z2opSt=T8XZ_ael~t6+zIg5ProJdTHG7y=ZFvcy8f6FjguOY*80@aK43h$ndd(kxMp zFu{3vf(R4bhGz%DZGcbW*^Mwk_ch=R!USV@o+cc?iPx(9%K`rj&x?o`B1@b= zI1IRPd6xJS!d^hJ0(v>5;B5#OBTO)crwrjXz*{O+o?gK7SAu556Rf~fjWEG&cp3;F z@GU%4_hCTiDttpc!5i`HMws9ZJo^wP7;qtfgbCh*hvM4+-@-$(=U$x!y-<1f0sia; zRWG9|OZ@8^gn{1&*tQn@rnG?H#Pb%y1kZ7!z6cXshG)i4fdlvio}~yA{5BpJ!USy} z%MzOqCO8dG7-52?c-jyy2Ye6@$(v(6`iTwDb;J|A2G2u;19;g+#WyElH6Fqz_&9}u zL(sS}OB_R(;FTOE*nnpc@nOKNcoGN`ya&(Q2orn~PtMO2d=KGbgbC)~gtkMN;A}iD zgb7yQsX^Ec_%uDFgMiQ+O!PF2J8~JnmcdJXxXzG!vZWMPG_A!4fMI9cA57_3*5(g1a@HsqBBTVpz zcwR%;*bF(ZWxW7g;8)>tzyKbixd-sm0q`Gu>jGR}r{vHL_>FoM?gPA_LGg9~@YwC( z3-TWTj0B-)KL-tfU&Av4VS?8*fo_BeZpX6}VS=CIFu{WyCin^-H*f|3ZDF(z!VbVI z@Wc=%xCBod!UVhT#Dg%wV|boGnBdRo9pPa>Uj*`oa2Rk0o*{$@cHl`MOz`zMc!Ds& z|G-mxLcxM9ux|*5w`Pg*7R4)qi(9iqCE^J#$Kyqq;2J#J5OxE8^%LMJ!hL{qw<*3k z0sje4H{uCiem86_!US)^a|mHC;1BQ+4u0!KeC6IO(T{L1;N-R}@g~9qcj0*pVS-=7 zBYuIh0Dbo<*=PfN4iDu+Fz=J#C2$D7ji(r4{CuIf9?wFA3EsK`^+K57jSs+9AdKJB z5x>L}Ll}3xi3dKVbiWJm{++5`xQkA_jfZ4Xv_oF;v;m*sQ9L^lCiq)C2N5PX=|Rwo zFn$L|d8Hdlt01op8?+xp9A=5JkDP#`0ZVg3xxXs|BQ$FeerkT4IZi&!STBxW5CG)Y{m05 z!rK5#K8rR&nBWa~sH_&izvJ+3z?V2Y0GRzbg+p*Uhi3p*a+u)F9Nq-@G#={L2)@Pf z1jXO0dhUx{+3?b(iAlCn>^9RQ1i0c zSIl?LHUiD~m0yei<&XY<6oPI{Vsd@^hEc5C1i7#&4-1 zgXZY6+3`s8;wXMwu*nyl*VI@W2}MJ7v3a$jrp3N!)BG)0%*N05H82lsmSH|!7Z-?_hQfA{|0{fGAV?H}Afv_G+5 z9LPD~I8buHdBA<3=79G=%Yn87I}h|6*mt1+z`%jw1E&uZ9W)M>A9NjTI2bK-uC#u$9o_DKb6-ZlcYKn1>jVT zK_ZbzBoc{4B9TZW5{X12kx8ICNzXu#NW=;x5{X12k$aNe+Isf&FW~0f@7(HT+NVO- znz&!&7rxt}4L#{aA4-_RJm#~2#Vlbd%UI4zRBp&r?KqFevlGd1K!$bwUSj-b% z@s@kNkMF(vr+0>6h=*-R@Qw1dBBK)tId9kIlf84BkI807G7n}j-=Bz7l=%8iP_c?l zT;dk4^kgJsnae^pvX!%3Fw-fCa#Wx~m8witn2su`Hnpo;J<9v|pZJs5yiM9BYm>Ce zIsA@n$|hs^JtN@*2@@n7AmP-$i%HnzYtl8@Mq@nYV=*>kJI;8YV?0MPIa4r&Q#xff zbBZ_Hkoi45lc#+h>qHlL!B%&A(W^f7rAhcj2E3y~T^iyYGn(6Xlys&$J?w6ny)av0 zHlkyct=Nf+-OS}4k9f>;UhoEQJ@bVh{N$u}`k)W{6x&kubx(WQZ~bml@CF|#B(PKt z?a*P1*5Mp3>&k4B5maN3Bpew-&x=@_$vd@%jL#KzuJ`?Rv11YTD;I@muw66u>ky|P z(vg7-WhygS$y!n=bd=*Z?$G$aqYshE zR7~a6P903H(>Yy}qg@^9NM|~?`z`gXcYWwb18V#yBVuGP8w=lBwYk&3^oVY_cL_>zg ztA}Qg!#wQ6frcZt_l))ORlPbmGKx&gnFfu}p82~#$F(rDz|d)XAP^x8WwrsRkTA5v z&?7wQ!%zZ4B@A^iw8GFO9p%DM1VcFtH83>8&;dgPh5{H$(U}ztQ5f1_=th5dFchOH z3m9r)Xn~;*t7`jGha$zWfp&Y&0*yh}) z1BM6;1u&G_7V0#Gp$&#^lTrFb3OI792SqUy6= Any: + return self._tuple[item] + + +# these are not compiled here to avoid import slowdown, they'll be compiled the first time they're used, then cached +r_hex_short = r'\s*(?:#|0x)?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?\s*' +r_hex_long = r'\s*(?:#|0x)?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?\s*' +_r_255 = r'(\d{1,3}(?:\.\d+)?)' +_r_comma = r'\s*,\s*' +r_rgb = fr'\s*rgb\(\s*{_r_255}{_r_comma}{_r_255}{_r_comma}{_r_255}\)\s*' +_r_alpha = r'(\d(?:\.\d+)?|\.\d+|\d{1,2}%)' +r_rgba = fr'\s*rgba\(\s*{_r_255}{_r_comma}{_r_255}{_r_comma}{_r_255}{_r_comma}{_r_alpha}\s*\)\s*' +_r_h = r'(-?\d+(?:\.\d+)?|-?\.\d+)(deg|rad|turn)?' +_r_sl = r'(\d{1,3}(?:\.\d+)?)%' +r_hsl = fr'\s*hsl\(\s*{_r_h}{_r_comma}{_r_sl}{_r_comma}{_r_sl}\s*\)\s*' +r_hsla = fr'\s*hsl\(\s*{_r_h}{_r_comma}{_r_sl}{_r_comma}{_r_sl}{_r_comma}{_r_alpha}\s*\)\s*' + +# colors where the two hex characters are the same, if all colors match this the short version of hex colors can be used +repeat_colors = {int(c * 2, 16) for c in '0123456789abcdef'} +rads = 2 * math.pi + + +class Color(Representation): + __slots__ = '_original', '_rgba' + + def __init__(self, value: ColorType) -> None: + self._rgba: RGBA + self._original: ColorType + if isinstance(value, (tuple, list)): + self._rgba = parse_tuple(value) + elif isinstance(value, str): + self._rgba = parse_str(value) + elif isinstance(value, Color): + self._rgba = value._rgba + value = value._original + else: + raise ColorError(reason='value must be a tuple, list or string') + + # if we've got here value must be a valid color + self._original = value + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + field_schema.update(type='string', format='color') + + def original(self) -> ColorType: + """ + Original value passed to Color + """ + return self._original + + def as_named(self, *, fallback: bool = False) -> str: + if self._rgba.alpha is None: + rgb = cast(Tuple[int, int, int], self.as_rgb_tuple()) + try: + return COLORS_BY_VALUE[rgb] + except KeyError as e: + if fallback: + return self.as_hex() + else: + raise ValueError('no named color found, use fallback=True, as_hex() or as_rgb()') from e + else: + return self.as_hex() + + def as_hex(self) -> str: + """ + Hex string representing the color can be 3, 4, 6 or 8 characters depending on whether the string + a "short" representation of the color is possible and whether there's an alpha channel. + """ + values = [float_to_255(c) for c in self._rgba[:3]] + if self._rgba.alpha is not None: + values.append(float_to_255(self._rgba.alpha)) + + as_hex = ''.join(f'{v:02x}' for v in values) + if all(c in repeat_colors for c in values): + as_hex = ''.join(as_hex[c] for c in range(0, len(as_hex), 2)) + return '#' + as_hex + + def as_rgb(self) -> str: + """ + Color as an rgb(, , ) or rgba(, , , ) string. + """ + if self._rgba.alpha is None: + return f'rgb({float_to_255(self._rgba.r)}, {float_to_255(self._rgba.g)}, {float_to_255(self._rgba.b)})' + else: + return ( + f'rgba({float_to_255(self._rgba.r)}, {float_to_255(self._rgba.g)}, {float_to_255(self._rgba.b)}, ' + f'{round(self._alpha_float(), 2)})' + ) + + def as_rgb_tuple(self, *, alpha: Optional[bool] = None) -> ColorTuple: + """ + Color as an RGB or RGBA tuple; red, green and blue are in the range 0 to 255, alpha if included is + in the range 0 to 1. + + :param alpha: whether to include the alpha channel, options are + None - (default) include alpha only if it's set (e.g. not None) + True - always include alpha, + False - always omit alpha, + """ + r, g, b = (float_to_255(c) for c in self._rgba[:3]) + if alpha is None: + if self._rgba.alpha is None: + return r, g, b + else: + return r, g, b, self._alpha_float() + elif alpha: + return r, g, b, self._alpha_float() + else: + # alpha is False + return r, g, b + + def as_hsl(self) -> str: + """ + Color as an hsl(, , ) or hsl(, , , ) string. + """ + if self._rgba.alpha is None: + h, s, li = self.as_hsl_tuple(alpha=False) # type: ignore + return f'hsl({h * 360:0.0f}, {s:0.0%}, {li:0.0%})' + else: + h, s, li, a = self.as_hsl_tuple(alpha=True) # type: ignore + return f'hsl({h * 360:0.0f}, {s:0.0%}, {li:0.0%}, {round(a, 2)})' + + def as_hsl_tuple(self, *, alpha: Optional[bool] = None) -> HslColorTuple: + """ + Color as an HSL or HSLA tuple, e.g. hue, saturation, lightness and optionally alpha; all elements are in + the range 0 to 1. + + NOTE: this is HSL as used in HTML and most other places, not HLS as used in python's colorsys. + + :param alpha: whether to include the alpha channel, options are + None - (default) include alpha only if it's set (e.g. not None) + True - always include alpha, + False - always omit alpha, + """ + h, l, s = rgb_to_hls(self._rgba.r, self._rgba.g, self._rgba.b) + if alpha is None: + if self._rgba.alpha is None: + return h, s, l + else: + return h, s, l, self._alpha_float() + if alpha: + return h, s, l, self._alpha_float() + else: + # alpha is False + return h, s, l + + def _alpha_float(self) -> float: + return 1 if self._rgba.alpha is None else self._rgba.alpha + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls + + def __str__(self) -> str: + return self.as_named(fallback=True) + + def __repr_args__(self) -> 'ReprArgs': + return [(None, self.as_named(fallback=True))] + [('rgb', self.as_rgb_tuple())] # type: ignore + + def __eq__(self, other: Any) -> bool: + return isinstance(other, Color) and self.as_rgb_tuple() == other.as_rgb_tuple() + + def __hash__(self) -> int: + return hash(self.as_rgb_tuple()) + + +def parse_tuple(value: Tuple[Any, ...]) -> RGBA: + """ + Parse a tuple or list as a color. + """ + if len(value) == 3: + r, g, b = (parse_color_value(v) for v in value) + return RGBA(r, g, b, None) + elif len(value) == 4: + r, g, b = (parse_color_value(v) for v in value[:3]) + return RGBA(r, g, b, parse_float_alpha(value[3])) + else: + raise ColorError(reason='tuples must have length 3 or 4') + + +def parse_str(value: str) -> RGBA: + """ + Parse a string to an RGBA tuple, trying the following formats (in this order): + * named color, see COLORS_BY_NAME below + * hex short eg. `fff` (prefix can be `#`, `0x` or nothing) + * hex long eg. `ffffff` (prefix can be `#`, `0x` or nothing) + * `rgb(, , ) ` + * `rgba(, , , )` + """ + value_lower = value.lower() + try: + r, g, b = COLORS_BY_NAME[value_lower] + except KeyError: + pass + else: + return ints_to_rgba(r, g, b, None) + + m = re.fullmatch(r_hex_short, value_lower) + if m: + *rgb, a = m.groups() + r, g, b = (int(v * 2, 16) for v in rgb) + if a: + alpha: Optional[float] = int(a * 2, 16) / 255 + else: + alpha = None + return ints_to_rgba(r, g, b, alpha) + + m = re.fullmatch(r_hex_long, value_lower) + if m: + *rgb, a = m.groups() + r, g, b = (int(v, 16) for v in rgb) + if a: + alpha = int(a, 16) / 255 + else: + alpha = None + return ints_to_rgba(r, g, b, alpha) + + m = re.fullmatch(r_rgb, value_lower) + if m: + return ints_to_rgba(*m.groups(), None) # type: ignore + + m = re.fullmatch(r_rgba, value_lower) + if m: + return ints_to_rgba(*m.groups()) # type: ignore + + m = re.fullmatch(r_hsl, value_lower) + if m: + h, h_units, s, l_ = m.groups() + return parse_hsl(h, h_units, s, l_) + + m = re.fullmatch(r_hsla, value_lower) + if m: + h, h_units, s, l_, a = m.groups() + return parse_hsl(h, h_units, s, l_, parse_float_alpha(a)) + + raise ColorError(reason='string not recognised as a valid color') + + +def ints_to_rgba(r: Union[int, str], g: Union[int, str], b: Union[int, str], alpha: Optional[float]) -> RGBA: + return RGBA(parse_color_value(r), parse_color_value(g), parse_color_value(b), parse_float_alpha(alpha)) + + +def parse_color_value(value: Union[int, str], max_val: int = 255) -> float: + """ + Parse a value checking it's a valid int in the range 0 to max_val and divide by max_val to give a number + in the range 0 to 1 + """ + try: + color = float(value) + except ValueError: + raise ColorError(reason='color values must be a valid number') + if 0 <= color <= max_val: + return color / max_val + else: + raise ColorError(reason=f'color values must be in the range 0 to {max_val}') + + +def parse_float_alpha(value: Union[None, str, float, int]) -> Optional[float]: + """ + Parse a value checking it's a valid float in the range 0 to 1 + """ + if value is None: + return None + try: + if isinstance(value, str) and value.endswith('%'): + alpha = float(value[:-1]) / 100 + else: + alpha = float(value) + except ValueError: + raise ColorError(reason='alpha values must be a valid float') + + if almost_equal_floats(alpha, 1): + return None + elif 0 <= alpha <= 1: + return alpha + else: + raise ColorError(reason='alpha values must be in the range 0 to 1') + + +def parse_hsl(h: str, h_units: str, sat: str, light: str, alpha: Optional[float] = None) -> RGBA: + """ + Parse raw hue, saturation, lightness and alpha values and convert to RGBA. + """ + s_value, l_value = parse_color_value(sat, 100), parse_color_value(light, 100) + + h_value = float(h) + if h_units in {None, 'deg'}: + h_value = h_value % 360 / 360 + elif h_units == 'rad': + h_value = h_value % rads / rads + else: + # turns + h_value = h_value % 1 + + r, g, b = hls_to_rgb(h_value, l_value, s_value) + return RGBA(r, g, b, alpha) + + +def float_to_255(c: float) -> int: + return int(round(c * 255)) + + +COLORS_BY_NAME = { + 'aliceblue': (240, 248, 255), + 'antiquewhite': (250, 235, 215), + 'aqua': (0, 255, 255), + 'aquamarine': (127, 255, 212), + 'azure': (240, 255, 255), + 'beige': (245, 245, 220), + 'bisque': (255, 228, 196), + 'black': (0, 0, 0), + 'blanchedalmond': (255, 235, 205), + 'blue': (0, 0, 255), + 'blueviolet': (138, 43, 226), + 'brown': (165, 42, 42), + 'burlywood': (222, 184, 135), + 'cadetblue': (95, 158, 160), + 'chartreuse': (127, 255, 0), + 'chocolate': (210, 105, 30), + 'coral': (255, 127, 80), + 'cornflowerblue': (100, 149, 237), + 'cornsilk': (255, 248, 220), + 'crimson': (220, 20, 60), + 'cyan': (0, 255, 255), + 'darkblue': (0, 0, 139), + 'darkcyan': (0, 139, 139), + 'darkgoldenrod': (184, 134, 11), + 'darkgray': (169, 169, 169), + 'darkgreen': (0, 100, 0), + 'darkgrey': (169, 169, 169), + 'darkkhaki': (189, 183, 107), + 'darkmagenta': (139, 0, 139), + 'darkolivegreen': (85, 107, 47), + 'darkorange': (255, 140, 0), + 'darkorchid': (153, 50, 204), + 'darkred': (139, 0, 0), + 'darksalmon': (233, 150, 122), + 'darkseagreen': (143, 188, 143), + 'darkslateblue': (72, 61, 139), + 'darkslategray': (47, 79, 79), + 'darkslategrey': (47, 79, 79), + 'darkturquoise': (0, 206, 209), + 'darkviolet': (148, 0, 211), + 'deeppink': (255, 20, 147), + 'deepskyblue': (0, 191, 255), + 'dimgray': (105, 105, 105), + 'dimgrey': (105, 105, 105), + 'dodgerblue': (30, 144, 255), + 'firebrick': (178, 34, 34), + 'floralwhite': (255, 250, 240), + 'forestgreen': (34, 139, 34), + 'fuchsia': (255, 0, 255), + 'gainsboro': (220, 220, 220), + 'ghostwhite': (248, 248, 255), + 'gold': (255, 215, 0), + 'goldenrod': (218, 165, 32), + 'gray': (128, 128, 128), + 'green': (0, 128, 0), + 'greenyellow': (173, 255, 47), + 'grey': (128, 128, 128), + 'honeydew': (240, 255, 240), + 'hotpink': (255, 105, 180), + 'indianred': (205, 92, 92), + 'indigo': (75, 0, 130), + 'ivory': (255, 255, 240), + 'khaki': (240, 230, 140), + 'lavender': (230, 230, 250), + 'lavenderblush': (255, 240, 245), + 'lawngreen': (124, 252, 0), + 'lemonchiffon': (255, 250, 205), + 'lightblue': (173, 216, 230), + 'lightcoral': (240, 128, 128), + 'lightcyan': (224, 255, 255), + 'lightgoldenrodyellow': (250, 250, 210), + 'lightgray': (211, 211, 211), + 'lightgreen': (144, 238, 144), + 'lightgrey': (211, 211, 211), + 'lightpink': (255, 182, 193), + 'lightsalmon': (255, 160, 122), + 'lightseagreen': (32, 178, 170), + 'lightskyblue': (135, 206, 250), + 'lightslategray': (119, 136, 153), + 'lightslategrey': (119, 136, 153), + 'lightsteelblue': (176, 196, 222), + 'lightyellow': (255, 255, 224), + 'lime': (0, 255, 0), + 'limegreen': (50, 205, 50), + 'linen': (250, 240, 230), + 'magenta': (255, 0, 255), + 'maroon': (128, 0, 0), + 'mediumaquamarine': (102, 205, 170), + 'mediumblue': (0, 0, 205), + 'mediumorchid': (186, 85, 211), + 'mediumpurple': (147, 112, 219), + 'mediumseagreen': (60, 179, 113), + 'mediumslateblue': (123, 104, 238), + 'mediumspringgreen': (0, 250, 154), + 'mediumturquoise': (72, 209, 204), + 'mediumvioletred': (199, 21, 133), + 'midnightblue': (25, 25, 112), + 'mintcream': (245, 255, 250), + 'mistyrose': (255, 228, 225), + 'moccasin': (255, 228, 181), + 'navajowhite': (255, 222, 173), + 'navy': (0, 0, 128), + 'oldlace': (253, 245, 230), + 'olive': (128, 128, 0), + 'olivedrab': (107, 142, 35), + 'orange': (255, 165, 0), + 'orangered': (255, 69, 0), + 'orchid': (218, 112, 214), + 'palegoldenrod': (238, 232, 170), + 'palegreen': (152, 251, 152), + 'paleturquoise': (175, 238, 238), + 'palevioletred': (219, 112, 147), + 'papayawhip': (255, 239, 213), + 'peachpuff': (255, 218, 185), + 'peru': (205, 133, 63), + 'pink': (255, 192, 203), + 'plum': (221, 160, 221), + 'powderblue': (176, 224, 230), + 'purple': (128, 0, 128), + 'red': (255, 0, 0), + 'rosybrown': (188, 143, 143), + 'royalblue': (65, 105, 225), + 'saddlebrown': (139, 69, 19), + 'salmon': (250, 128, 114), + 'sandybrown': (244, 164, 96), + 'seagreen': (46, 139, 87), + 'seashell': (255, 245, 238), + 'sienna': (160, 82, 45), + 'silver': (192, 192, 192), + 'skyblue': (135, 206, 235), + 'slateblue': (106, 90, 205), + 'slategray': (112, 128, 144), + 'slategrey': (112, 128, 144), + 'snow': (255, 250, 250), + 'springgreen': (0, 255, 127), + 'steelblue': (70, 130, 180), + 'tan': (210, 180, 140), + 'teal': (0, 128, 128), + 'thistle': (216, 191, 216), + 'tomato': (255, 99, 71), + 'turquoise': (64, 224, 208), + 'violet': (238, 130, 238), + 'wheat': (245, 222, 179), + 'white': (255, 255, 255), + 'whitesmoke': (245, 245, 245), + 'yellow': (255, 255, 0), + 'yellowgreen': (154, 205, 50), +} + +COLORS_BY_VALUE = {v: k for k, v in COLORS_BY_NAME.items()} diff --git a/libs/win/pydantic/config.cp37-win_amd64.pyd b/libs/win/pydantic/config.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..689773e443074c6c715ceb0bc99b486f7d8476d4 GIT binary patch literal 79360 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

N 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 None: + pass + + @overload + def __call__(self, schema: Dict[str, Any], model_class: Type[BaseModel]) -> None: + pass + +else: + SchemaExtraCallable = Callable[..., None] + +__all__ = 'BaseConfig', 'ConfigDict', 'get_config', 'Extra', 'inherit_config', 'prepare_config' + + +class Extra(str, Enum): + allow = 'allow' + ignore = 'ignore' + forbid = 'forbid' + + +# https://github.com/cython/cython/issues/4003 +# Will be fixed with Cython 3 but still in alpha right now +if not compiled: + from typing_extensions import TypedDict + + class ConfigDict(TypedDict, total=False): + title: Optional[str] + anystr_lower: bool + anystr_strip_whitespace: bool + min_anystr_length: int + max_anystr_length: Optional[int] + validate_all: bool + extra: Extra + allow_mutation: bool + frozen: bool + allow_population_by_field_name: bool + use_enum_values: bool + fields: Dict[str, Union[str, Dict[str, str]]] + validate_assignment: bool + error_msg_templates: Dict[str, str] + arbitrary_types_allowed: bool + orm_mode: bool + getter_dict: Type[GetterDict] + alias_generator: Optional[Callable[[str], str]] + keep_untouched: Tuple[type, ...] + schema_extra: Union[Dict[str, object], 'SchemaExtraCallable'] + json_loads: Callable[[str], object] + json_dumps: AnyArgTCallable[str] + json_encoders: Dict[Type[object], AnyCallable] + underscore_attrs_are_private: bool + allow_inf_nan: bool + + # whether or not inherited models as fields should be reconstructed as base model + copy_on_model_validation: bool + # whether dataclass `__post_init__` should be run after validation + post_init_call: Literal['before_validation', 'after_validation'] + +else: + ConfigDict = dict # type: ignore + + +class BaseConfig: + title: Optional[str] = None + anystr_lower: bool = False + anystr_upper: bool = False + anystr_strip_whitespace: bool = False + min_anystr_length: int = 0 + max_anystr_length: Optional[int] = None + validate_all: bool = False + extra: Extra = Extra.ignore + allow_mutation: bool = True + frozen: bool = False + allow_population_by_field_name: bool = False + use_enum_values: bool = False + fields: Dict[str, Union[str, Dict[str, str]]] = {} + validate_assignment: bool = False + error_msg_templates: Dict[str, str] = {} + arbitrary_types_allowed: bool = False + orm_mode: bool = False + getter_dict: Type[GetterDict] = GetterDict + alias_generator: Optional[Callable[[str], str]] = None + keep_untouched: Tuple[type, ...] = () + schema_extra: Union[Dict[str, Any], 'SchemaExtraCallable'] = {} + json_loads: Callable[[str], Any] = json.loads + json_dumps: Callable[..., str] = json.dumps + json_encoders: Dict[Union[Type[Any], str, ForwardRef], AnyCallable] = {} + underscore_attrs_are_private: bool = False + allow_inf_nan: bool = True + + # whether inherited models as fields should be reconstructed as base model, + # and whether such a copy should be shallow or deep + copy_on_model_validation: Literal['none', 'deep', 'shallow'] = 'shallow' + + # whether `Union` should check all allowed types before even trying to coerce + smart_union: bool = False + # whether dataclass `__post_init__` should be run before or after validation + post_init_call: Literal['before_validation', 'after_validation'] = 'before_validation' + + @classmethod + def get_field_info(cls, name: str) -> Dict[str, Any]: + """ + Get properties of FieldInfo from the `fields` property of the config class. + """ + + fields_value = cls.fields.get(name) + + if isinstance(fields_value, str): + field_info: Dict[str, Any] = {'alias': fields_value} + elif isinstance(fields_value, dict): + field_info = fields_value + else: + field_info = {} + + if 'alias' in field_info: + field_info.setdefault('alias_priority', 2) + + if field_info.get('alias_priority', 0) <= 1 and cls.alias_generator: + alias = cls.alias_generator(name) + if not isinstance(alias, str): + raise TypeError(f'Config.alias_generator must return str, not {alias.__class__}') + field_info.update(alias=alias, alias_priority=1) + return field_info + + @classmethod + def prepare_field(cls, field: 'ModelField') -> None: + """ + Optional hook to check or modify fields during model creation. + """ + pass + + +def get_config(config: Union[ConfigDict, Type[object], None]) -> Type[BaseConfig]: + if config is None: + return BaseConfig + + else: + config_dict = ( + config + if isinstance(config, dict) + else {k: getattr(config, k) for k in dir(config) if not k.startswith('__')} + ) + + class Config(BaseConfig): + ... + + for k, v in config_dict.items(): + setattr(Config, k, v) + return Config + + +def inherit_config(self_config: 'ConfigType', parent_config: 'ConfigType', **namespace: Any) -> 'ConfigType': + if not self_config: + base_classes: Tuple['ConfigType', ...] = (parent_config,) + elif self_config == parent_config: + base_classes = (self_config,) + else: + base_classes = self_config, parent_config + + namespace['json_encoders'] = { + **getattr(parent_config, 'json_encoders', {}), + **getattr(self_config, 'json_encoders', {}), + **namespace.get('json_encoders', {}), + } + + return type('Config', base_classes, namespace) + + +def prepare_config(config: Type[BaseConfig], cls_name: str) -> None: + if not isinstance(config.extra, Extra): + try: + config.extra = Extra(config.extra) + except ValueError: + raise ValueError(f'"{cls_name}": {config.extra} is not a valid value for "extra"') diff --git a/libs/win/pydantic/dataclasses.cp37-win_amd64.pyd b/libs/win/pydantic/dataclasses.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..c672f8d600c29210a50543e50d477e3ac4f5e407 GIT binary patch literal 182272 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 NNz6`+$V)4K{|$(>CJ+Ds literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/dataclasses.py b/libs/win/pydantic/dataclasses.py new file mode 100644 index 00000000..68331127 --- /dev/null +++ b/libs/win/pydantic/dataclasses.py @@ -0,0 +1,479 @@ +""" +The main purpose is to enhance stdlib dataclasses by adding validation +A pydantic dataclass can be generated from scratch or from a stdlib one. + +Behind the scene, a pydantic dataclass is just like a regular one on which we attach +a `BaseModel` and magic methods to trigger the validation of the data. +`__init__` and `__post_init__` are hence overridden and have extra logic to be +able to validate input data. + +When a pydantic dataclass is generated from scratch, it's just a plain dataclass +with validation triggered at initialization + +The tricky part if for stdlib dataclasses that are converted after into pydantic ones e.g. + +```py +@dataclasses.dataclass +class M: + x: int + +ValidatedM = pydantic.dataclasses.dataclass(M) +``` + +We indeed still want to support equality, hashing, repr, ... as if it was the stdlib one! + +```py +assert isinstance(ValidatedM(x=1), M) +assert ValidatedM(x=1) == M(x=1) +``` + +This means we **don't want to create a new dataclass that inherits from it** +The trick is to create a wrapper around `M` that will act as a proxy to trigger +validation without altering default `M` behaviour. +""" +import sys +from contextlib import contextmanager +from functools import wraps +from typing import ( + TYPE_CHECKING, + Any, + Callable, + ClassVar, + Dict, + Generator, + Optional, + Set, + Type, + TypeVar, + Union, + overload, +) + +from typing_extensions import dataclass_transform + +from .class_validators import gather_all_validators +from .config import BaseConfig, ConfigDict, Extra, get_config +from .error_wrappers import ValidationError +from .errors import DataclassTypeError +from .fields import Field, FieldInfo, Required, Undefined +from .main import create_model, validate_model +from .utils import ClassAttribute + +if TYPE_CHECKING: + from .main import BaseModel + from .typing import CallableGenerator, NoArgAnyCallable + + DataclassT = TypeVar('DataclassT', bound='Dataclass') + + DataclassClassOrWrapper = Union[Type['Dataclass'], 'DataclassProxy'] + + class Dataclass: + # stdlib attributes + __dataclass_fields__: ClassVar[Dict[str, Any]] + __dataclass_params__: ClassVar[Any] # in reality `dataclasses._DataclassParams` + __post_init__: ClassVar[Callable[..., None]] + + # Added by pydantic + __pydantic_run_validation__: ClassVar[bool] + __post_init_post_parse__: ClassVar[Callable[..., None]] + __pydantic_initialised__: ClassVar[bool] + __pydantic_model__: ClassVar[Type[BaseModel]] + __pydantic_validate_values__: ClassVar[Callable[['Dataclass'], None]] + __pydantic_has_field_info_default__: ClassVar[bool] # whether a `pydantic.Field` is used as default value + + def __init__(self, *args: object, **kwargs: object) -> None: + pass + + @classmethod + def __get_validators__(cls: Type['Dataclass']) -> 'CallableGenerator': + pass + + @classmethod + def __validate__(cls: Type['DataclassT'], v: Any) -> 'DataclassT': + pass + + +__all__ = [ + 'dataclass', + 'set_validation', + 'create_pydantic_model_from_dataclass', + 'is_builtin_dataclass', + 'make_dataclass_validator', +] + +_T = TypeVar('_T') + +if sys.version_info >= (3, 10): + + @dataclass_transform(kw_only_default=True, field_descriptors=(Field, FieldInfo)) + @overload + def dataclass( + *, + init: bool = True, + repr: bool = True, + eq: bool = True, + order: bool = False, + unsafe_hash: bool = False, + frozen: bool = False, + config: Union[ConfigDict, Type[object], None] = None, + validate_on_init: Optional[bool] = None, + kw_only: bool = ..., + ) -> Callable[[Type[_T]], 'DataclassClassOrWrapper']: + ... + + @dataclass_transform(kw_only_default=True, field_descriptors=(Field, FieldInfo)) + @overload + def dataclass( + _cls: Type[_T], + *, + init: bool = True, + repr: bool = True, + eq: bool = True, + order: bool = False, + unsafe_hash: bool = False, + frozen: bool = False, + config: Union[ConfigDict, Type[object], None] = None, + validate_on_init: Optional[bool] = None, + kw_only: bool = ..., + ) -> 'DataclassClassOrWrapper': + ... + +else: + + @dataclass_transform(kw_only_default=True, field_descriptors=(Field, FieldInfo)) + @overload + def dataclass( + *, + init: bool = True, + repr: bool = True, + eq: bool = True, + order: bool = False, + unsafe_hash: bool = False, + frozen: bool = False, + config: Union[ConfigDict, Type[object], None] = None, + validate_on_init: Optional[bool] = None, + ) -> Callable[[Type[_T]], 'DataclassClassOrWrapper']: + ... + + @dataclass_transform(kw_only_default=True, field_descriptors=(Field, FieldInfo)) + @overload + def dataclass( + _cls: Type[_T], + *, + init: bool = True, + repr: bool = True, + eq: bool = True, + order: bool = False, + unsafe_hash: bool = False, + frozen: bool = False, + config: Union[ConfigDict, Type[object], None] = None, + validate_on_init: Optional[bool] = None, + ) -> 'DataclassClassOrWrapper': + ... + + +@dataclass_transform(kw_only_default=True, field_descriptors=(Field, FieldInfo)) +def dataclass( + _cls: Optional[Type[_T]] = None, + *, + init: bool = True, + repr: bool = True, + eq: bool = True, + order: bool = False, + unsafe_hash: bool = False, + frozen: bool = False, + config: Union[ConfigDict, Type[object], None] = None, + validate_on_init: Optional[bool] = None, + kw_only: bool = False, +) -> Union[Callable[[Type[_T]], 'DataclassClassOrWrapper'], 'DataclassClassOrWrapper']: + """ + Like the python standard lib dataclasses but with type validation. + The result is either a pydantic dataclass that will validate input data + or a wrapper that will trigger validation around a stdlib dataclass + to avoid modifying it directly + """ + the_config = get_config(config) + + def wrap(cls: Type[Any]) -> 'DataclassClassOrWrapper': + import dataclasses + + if is_builtin_dataclass(cls) and _extra_dc_args(_cls) == _extra_dc_args(_cls.__bases__[0]): # type: ignore + dc_cls_doc = '' + dc_cls = DataclassProxy(cls) + default_validate_on_init = False + else: + dc_cls_doc = cls.__doc__ or '' # needs to be done before generating dataclass + if sys.version_info >= (3, 10): + dc_cls = dataclasses.dataclass( + cls, + init=init, + repr=repr, + eq=eq, + order=order, + unsafe_hash=unsafe_hash, + frozen=frozen, + kw_only=kw_only, + ) + else: + dc_cls = dataclasses.dataclass( # type: ignore + cls, init=init, repr=repr, eq=eq, order=order, unsafe_hash=unsafe_hash, frozen=frozen + ) + default_validate_on_init = True + + should_validate_on_init = default_validate_on_init if validate_on_init is None else validate_on_init + _add_pydantic_validation_attributes(cls, the_config, should_validate_on_init, dc_cls_doc) + dc_cls.__pydantic_model__.__try_update_forward_refs__(**{cls.__name__: cls}) + return dc_cls + + if _cls is None: + return wrap + + return wrap(_cls) + + +@contextmanager +def set_validation(cls: Type['DataclassT'], value: bool) -> Generator[Type['DataclassT'], None, None]: + original_run_validation = cls.__pydantic_run_validation__ + try: + cls.__pydantic_run_validation__ = value + yield cls + finally: + cls.__pydantic_run_validation__ = original_run_validation + + +class DataclassProxy: + __slots__ = '__dataclass__' + + def __init__(self, dc_cls: Type['Dataclass']) -> None: + object.__setattr__(self, '__dataclass__', dc_cls) + + def __call__(self, *args: Any, **kwargs: Any) -> Any: + with set_validation(self.__dataclass__, True): + return self.__dataclass__(*args, **kwargs) + + def __getattr__(self, name: str) -> Any: + return getattr(self.__dataclass__, name) + + def __instancecheck__(self, instance: Any) -> bool: + return isinstance(instance, self.__dataclass__) + + +def _add_pydantic_validation_attributes( # noqa: C901 (ignore complexity) + dc_cls: Type['Dataclass'], + config: Type[BaseConfig], + validate_on_init: bool, + dc_cls_doc: str, +) -> None: + """ + We need to replace the right method. If no `__post_init__` has been set in the stdlib dataclass + it won't even exist (code is generated on the fly by `dataclasses`) + By default, we run validation after `__init__` or `__post_init__` if defined + """ + init = dc_cls.__init__ + + @wraps(init) + def handle_extra_init(self: 'Dataclass', *args: Any, **kwargs: Any) -> None: + if config.extra == Extra.ignore: + init(self, *args, **{k: v for k, v in kwargs.items() if k in self.__dataclass_fields__}) + + elif config.extra == Extra.allow: + for k, v in kwargs.items(): + self.__dict__.setdefault(k, v) + init(self, *args, **{k: v for k, v in kwargs.items() if k in self.__dataclass_fields__}) + + else: + init(self, *args, **kwargs) + + if hasattr(dc_cls, '__post_init__'): + post_init = dc_cls.__post_init__ + + @wraps(post_init) + def new_post_init(self: 'Dataclass', *args: Any, **kwargs: Any) -> None: + if config.post_init_call == 'before_validation': + post_init(self, *args, **kwargs) + + if self.__class__.__pydantic_run_validation__: + self.__pydantic_validate_values__() + if hasattr(self, '__post_init_post_parse__'): + self.__post_init_post_parse__(*args, **kwargs) + + if config.post_init_call == 'after_validation': + post_init(self, *args, **kwargs) + + setattr(dc_cls, '__init__', handle_extra_init) + setattr(dc_cls, '__post_init__', new_post_init) + + else: + + @wraps(init) + def new_init(self: 'Dataclass', *args: Any, **kwargs: Any) -> None: + handle_extra_init(self, *args, **kwargs) + + if self.__class__.__pydantic_run_validation__: + self.__pydantic_validate_values__() + + if hasattr(self, '__post_init_post_parse__'): + # We need to find again the initvars. To do that we use `__dataclass_fields__` instead of + # public method `dataclasses.fields` + import dataclasses + + # get all initvars and their default values + initvars_and_values: Dict[str, Any] = {} + for i, f in enumerate(self.__class__.__dataclass_fields__.values()): + if f._field_type is dataclasses._FIELD_INITVAR: # type: ignore[attr-defined] + try: + # set arg value by default + initvars_and_values[f.name] = args[i] + except IndexError: + initvars_and_values[f.name] = kwargs.get(f.name, f.default) + + self.__post_init_post_parse__(**initvars_and_values) + + setattr(dc_cls, '__init__', new_init) + + setattr(dc_cls, '__pydantic_run_validation__', ClassAttribute('__pydantic_run_validation__', validate_on_init)) + setattr(dc_cls, '__pydantic_initialised__', False) + setattr(dc_cls, '__pydantic_model__', create_pydantic_model_from_dataclass(dc_cls, config, dc_cls_doc)) + setattr(dc_cls, '__pydantic_validate_values__', _dataclass_validate_values) + setattr(dc_cls, '__validate__', classmethod(_validate_dataclass)) + setattr(dc_cls, '__get_validators__', classmethod(_get_validators)) + + if dc_cls.__pydantic_model__.__config__.validate_assignment and not dc_cls.__dataclass_params__.frozen: + setattr(dc_cls, '__setattr__', _dataclass_validate_assignment_setattr) + + +def _get_validators(cls: 'DataclassClassOrWrapper') -> 'CallableGenerator': + yield cls.__validate__ + + +def _validate_dataclass(cls: Type['DataclassT'], v: Any) -> 'DataclassT': + with set_validation(cls, True): + if isinstance(v, cls): + v.__pydantic_validate_values__() + return v + elif isinstance(v, (list, tuple)): + return cls(*v) + elif isinstance(v, dict): + return cls(**v) + else: + raise DataclassTypeError(class_name=cls.__name__) + + +def create_pydantic_model_from_dataclass( + dc_cls: Type['Dataclass'], + config: Type[Any] = BaseConfig, + dc_cls_doc: Optional[str] = None, +) -> Type['BaseModel']: + import dataclasses + + field_definitions: Dict[str, Any] = {} + for field in dataclasses.fields(dc_cls): + default: Any = Undefined + default_factory: Optional['NoArgAnyCallable'] = None + field_info: FieldInfo + + if field.default is not dataclasses.MISSING: + default = field.default + elif field.default_factory is not dataclasses.MISSING: + default_factory = field.default_factory + else: + default = Required + + if isinstance(default, FieldInfo): + field_info = default + dc_cls.__pydantic_has_field_info_default__ = True + else: + field_info = Field(default=default, default_factory=default_factory, **field.metadata) + + field_definitions[field.name] = (field.type, field_info) + + validators = gather_all_validators(dc_cls) + model: Type['BaseModel'] = create_model( + dc_cls.__name__, + __config__=config, + __module__=dc_cls.__module__, + __validators__=validators, + __cls_kwargs__={'__resolve_forward_refs__': False}, + **field_definitions, + ) + model.__doc__ = dc_cls_doc if dc_cls_doc is not None else dc_cls.__doc__ or '' + return model + + +def _dataclass_validate_values(self: 'Dataclass') -> None: + # validation errors can occur if this function is called twice on an already initialised dataclass. + # for example if Extra.forbid is enabled, it would consider __pydantic_initialised__ an invalid extra property + if getattr(self, '__pydantic_initialised__'): + return + if getattr(self, '__pydantic_has_field_info_default__', False): + # We need to remove `FieldInfo` values since they are not valid as input + # It's ok to do that because they are obviously the default values! + input_data = {k: v for k, v in self.__dict__.items() if not isinstance(v, FieldInfo)} + else: + input_data = self.__dict__ + d, _, validation_error = validate_model(self.__pydantic_model__, input_data, cls=self.__class__) + if validation_error: + raise validation_error + self.__dict__.update(d) + object.__setattr__(self, '__pydantic_initialised__', True) + + +def _dataclass_validate_assignment_setattr(self: 'Dataclass', name: str, value: Any) -> None: + if self.__pydantic_initialised__: + d = dict(self.__dict__) + d.pop(name, None) + known_field = self.__pydantic_model__.__fields__.get(name, None) + if known_field: + value, error_ = known_field.validate(value, d, loc=name, cls=self.__class__) + if error_: + raise ValidationError([error_], self.__class__) + + object.__setattr__(self, name, value) + + +def _extra_dc_args(cls: Type[Any]) -> Set[str]: + return { + x + for x in dir(cls) + if x not in getattr(cls, '__dataclass_fields__', {}) and not (x.startswith('__') and x.endswith('__')) + } + + +def is_builtin_dataclass(_cls: Type[Any]) -> bool: + """ + Whether a class is a stdlib dataclass + (useful to discriminated a pydantic dataclass that is actually a wrapper around a stdlib dataclass) + + we check that + - `_cls` is a dataclass + - `_cls` is not a processed pydantic dataclass (with a basemodel attached) + - `_cls` is not a pydantic dataclass inheriting directly from a stdlib dataclass + e.g. + ``` + @dataclasses.dataclass + class A: + x: int + + @pydantic.dataclasses.dataclass + class B(A): + y: int + ``` + In this case, when we first check `B`, we make an extra check and look at the annotations ('y'), + which won't be a superset of all the dataclass fields (only the stdlib fields i.e. 'x') + """ + import dataclasses + + return ( + dataclasses.is_dataclass(_cls) + and not hasattr(_cls, '__pydantic_model__') + and set(_cls.__dataclass_fields__).issuperset(set(getattr(_cls, '__annotations__', {}))) + ) + + +def make_dataclass_validator(dc_cls: Type['Dataclass'], config: Type[BaseConfig]) -> 'CallableGenerator': + """ + Create a pydantic.dataclass from a builtin dataclass to add type validation + and yield the validators + It retrieves the parameters of the dataclass and forwards them to the newly created dataclass + """ + yield from _get_validators(dataclass(dc_cls, config=config, validate_on_init=False)) diff --git a/libs/win/pydantic/datetime_parse.cp37-win_amd64.pyd b/libs/win/pydantic/datetime_parse.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..6f98d735f9038f8313342bbe74080a32efb20ca5 GIT binary patch literal 96256 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 literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/datetime_parse.py b/libs/win/pydantic/datetime_parse.py new file mode 100644 index 00000000..cfd54593 --- /dev/null +++ b/libs/win/pydantic/datetime_parse.py @@ -0,0 +1,248 @@ +""" +Functions to parse datetime objects. + +We're using regular expressions rather than time.strptime because: +- They provide both validation and parsing. +- They're more flexible for datetimes. +- The date/datetime/time constructors produce friendlier error messages. + +Stolen from https://raw.githubusercontent.com/django/django/main/django/utils/dateparse.py at +9718fa2e8abe430c3526a9278dd976443d4ae3c6 + +Changed to: +* use standard python datetime types not django.utils.timezone +* raise ValueError when regex doesn't match rather than returning None +* support parsing unix timestamps for dates and datetimes +""" +import re +from datetime import date, datetime, time, timedelta, timezone +from typing import Dict, Optional, Type, Union + +from . import errors + +date_expr = r'(?P\d{4})-(?P\d{1,2})-(?P\d{1,2})' +time_expr = ( + r'(?P\d{1,2}):(?P\d{1,2})' + r'(?::(?P\d{1,2})(?:\.(?P\d{1,6})\d{0,6})?)?' + r'(?PZ|[+-]\d{2}(?::?\d{2})?)?$' +) + +date_re = re.compile(f'{date_expr}$') +time_re = re.compile(time_expr) +datetime_re = re.compile(f'{date_expr}[T ]{time_expr}') + +standard_duration_re = re.compile( + r'^' + r'(?:(?P-?\d+) (days?, )?)?' + r'((?:(?P-?\d+):)(?=\d+:\d+))?' + r'(?:(?P-?\d+):)?' + r'(?P-?\d+)' + r'(?:\.(?P\d{1,6})\d{0,6})?' + r'$' +) + +# Support the sections of ISO 8601 date representation that are accepted by timedelta +iso8601_duration_re = re.compile( + r'^(?P[-+]?)' + r'P' + r'(?:(?P\d+(.\d+)?)D)?' + r'(?:T' + r'(?:(?P\d+(.\d+)?)H)?' + r'(?:(?P\d+(.\d+)?)M)?' + r'(?:(?P\d+(.\d+)?)S)?' + r')?' + r'$' +) + +EPOCH = datetime(1970, 1, 1) +# if greater than this, the number is in ms, if less than or equal it's in seconds +# (in seconds this is 11th October 2603, in ms it's 20th August 1970) +MS_WATERSHED = int(2e10) +# slightly more than datetime.max in ns - (datetime.max - EPOCH).total_seconds() * 1e9 +MAX_NUMBER = int(3e20) +StrBytesIntFloat = Union[str, bytes, int, float] + + +def get_numeric(value: StrBytesIntFloat, native_expected_type: str) -> Union[None, int, float]: + if isinstance(value, (int, float)): + return value + try: + return float(value) + except ValueError: + return None + except TypeError: + raise TypeError(f'invalid type; expected {native_expected_type}, string, bytes, int or float') + + +def from_unix_seconds(seconds: Union[int, float]) -> datetime: + if seconds > MAX_NUMBER: + return datetime.max + elif seconds < -MAX_NUMBER: + return datetime.min + + while abs(seconds) > MS_WATERSHED: + seconds /= 1000 + dt = EPOCH + timedelta(seconds=seconds) + return dt.replace(tzinfo=timezone.utc) + + +def _parse_timezone(value: Optional[str], error: Type[Exception]) -> Union[None, int, timezone]: + if value == 'Z': + return timezone.utc + elif value is not None: + offset_mins = int(value[-2:]) if len(value) > 3 else 0 + offset = 60 * int(value[1:3]) + offset_mins + if value[0] == '-': + offset = -offset + try: + return timezone(timedelta(minutes=offset)) + except ValueError: + raise error() + else: + return None + + +def parse_date(value: Union[date, StrBytesIntFloat]) -> date: + """ + Parse a date/int/float/string and return a datetime.date. + + Raise ValueError if the input is well formatted but not a valid date. + Raise ValueError if the input isn't well formatted. + """ + if isinstance(value, date): + if isinstance(value, datetime): + return value.date() + else: + return value + + number = get_numeric(value, 'date') + if number is not None: + return from_unix_seconds(number).date() + + if isinstance(value, bytes): + value = value.decode() + + match = date_re.match(value) # type: ignore + if match is None: + raise errors.DateError() + + kw = {k: int(v) for k, v in match.groupdict().items()} + + try: + return date(**kw) + except ValueError: + raise errors.DateError() + + +def parse_time(value: Union[time, StrBytesIntFloat]) -> time: + """ + Parse a time/string and return a datetime.time. + + Raise ValueError if the input is well formatted but not a valid time. + Raise ValueError if the input isn't well formatted, in particular if it contains an offset. + """ + if isinstance(value, time): + return value + + number = get_numeric(value, 'time') + if number is not None: + if number >= 86400: + # doesn't make sense since the time time loop back around to 0 + raise errors.TimeError() + return (datetime.min + timedelta(seconds=number)).time() + + if isinstance(value, bytes): + value = value.decode() + + match = time_re.match(value) # type: ignore + if match is None: + raise errors.TimeError() + + kw = match.groupdict() + if kw['microsecond']: + kw['microsecond'] = kw['microsecond'].ljust(6, '0') + + tzinfo = _parse_timezone(kw.pop('tzinfo'), errors.TimeError) + kw_: Dict[str, Union[None, int, timezone]] = {k: int(v) for k, v in kw.items() if v is not None} + kw_['tzinfo'] = tzinfo + + try: + return time(**kw_) # type: ignore + except ValueError: + raise errors.TimeError() + + +def parse_datetime(value: Union[datetime, StrBytesIntFloat]) -> datetime: + """ + Parse a datetime/int/float/string and return a datetime.datetime. + + This function supports time zone offsets. When the input contains one, + the output uses a timezone with a fixed offset from UTC. + + Raise ValueError if the input is well formatted but not a valid datetime. + Raise ValueError if the input isn't well formatted. + """ + if isinstance(value, datetime): + return value + + number = get_numeric(value, 'datetime') + if number is not None: + return from_unix_seconds(number) + + if isinstance(value, bytes): + value = value.decode() + + match = datetime_re.match(value) # type: ignore + if match is None: + raise errors.DateTimeError() + + kw = match.groupdict() + if kw['microsecond']: + kw['microsecond'] = kw['microsecond'].ljust(6, '0') + + tzinfo = _parse_timezone(kw.pop('tzinfo'), errors.DateTimeError) + kw_: Dict[str, Union[None, int, timezone]] = {k: int(v) for k, v in kw.items() if v is not None} + kw_['tzinfo'] = tzinfo + + try: + return datetime(**kw_) # type: ignore + except ValueError: + raise errors.DateTimeError() + + +def parse_duration(value: StrBytesIntFloat) -> timedelta: + """ + Parse a duration int/float/string and return a datetime.timedelta. + + The preferred format for durations in Django is '%d %H:%M:%S.%f'. + + Also supports ISO 8601 representation. + """ + if isinstance(value, timedelta): + return value + + if isinstance(value, (int, float)): + # below code requires a string + value = f'{value:f}' + elif isinstance(value, bytes): + value = value.decode() + + try: + match = standard_duration_re.match(value) or iso8601_duration_re.match(value) + except TypeError: + raise TypeError('invalid type; expected timedelta, string, bytes, int or float') + + if not match: + raise errors.DurationError() + + kw = match.groupdict() + sign = -1 if kw.pop('sign', '+') == '-' else 1 + if kw.get('microseconds'): + kw['microseconds'] = kw['microseconds'].ljust(6, '0') + + if kw.get('seconds') and kw.get('microseconds') and kw['seconds'].startswith('-'): + kw['microseconds'] = '-' + kw['microseconds'] + + kw_ = {k: float(v) for k, v in kw.items() if v is not None} + + return sign * timedelta(**kw_) diff --git a/libs/win/pydantic/decorator.cp37-win_amd64.pyd b/libs/win/pydantic/decorator.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..ed58a1342df15f5333eb053ba1219136a8c7619f GIT binary patch literal 134144 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

IGRXYAV}e^hk$0K+=hW@PXN>UoMEGCJ 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 F{|2O2{}BKH literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/decorator.py b/libs/win/pydantic/decorator.py new file mode 100644 index 00000000..089aab65 --- /dev/null +++ b/libs/win/pydantic/decorator.py @@ -0,0 +1,264 @@ +from functools import wraps +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Mapping, Optional, Tuple, Type, TypeVar, Union, overload + +from . import validator +from .config import Extra +from .errors import ConfigError +from .main import BaseModel, create_model +from .typing import get_all_type_hints +from .utils import to_camel + +__all__ = ('validate_arguments',) + +if TYPE_CHECKING: + from .typing import AnyCallable + + AnyCallableT = TypeVar('AnyCallableT', bound=AnyCallable) + ConfigType = Union[None, Type[Any], Dict[str, Any]] + + +@overload +def validate_arguments(func: None = None, *, config: 'ConfigType' = None) -> Callable[['AnyCallableT'], 'AnyCallableT']: + ... + + +@overload +def validate_arguments(func: 'AnyCallableT') -> 'AnyCallableT': + ... + + +def validate_arguments(func: Optional['AnyCallableT'] = None, *, config: 'ConfigType' = None) -> Any: + """ + Decorator to validate the arguments passed to a function. + """ + + def validate(_func: 'AnyCallable') -> 'AnyCallable': + vd = ValidatedFunction(_func, config) + + @wraps(_func) + def wrapper_function(*args: Any, **kwargs: Any) -> Any: + return vd.call(*args, **kwargs) + + wrapper_function.vd = vd # type: ignore + wrapper_function.validate = vd.init_model_instance # type: ignore + wrapper_function.raw_function = vd.raw_function # type: ignore + wrapper_function.model = vd.model # type: ignore + return wrapper_function + + if func: + return validate(func) + else: + return validate + + +ALT_V_ARGS = 'v__args' +ALT_V_KWARGS = 'v__kwargs' +V_POSITIONAL_ONLY_NAME = 'v__positional_only' +V_DUPLICATE_KWARGS = 'v__duplicate_kwargs' + + +class ValidatedFunction: + def __init__(self, function: 'AnyCallableT', config: 'ConfigType'): # noqa C901 + from inspect import Parameter, signature + + parameters: Mapping[str, Parameter] = signature(function).parameters + + if parameters.keys() & {ALT_V_ARGS, ALT_V_KWARGS, V_POSITIONAL_ONLY_NAME, V_DUPLICATE_KWARGS}: + raise ConfigError( + f'"{ALT_V_ARGS}", "{ALT_V_KWARGS}", "{V_POSITIONAL_ONLY_NAME}" and "{V_DUPLICATE_KWARGS}" ' + f'are not permitted as argument names when using the "{validate_arguments.__name__}" decorator' + ) + + self.raw_function = function + self.arg_mapping: Dict[int, str] = {} + self.positional_only_args = set() + self.v_args_name = 'args' + self.v_kwargs_name = 'kwargs' + + type_hints = get_all_type_hints(function) + takes_args = False + takes_kwargs = False + fields: Dict[str, Tuple[Any, Any]] = {} + for i, (name, p) in enumerate(parameters.items()): + if p.annotation is p.empty: + annotation = Any + else: + annotation = type_hints[name] + + default = ... if p.default is p.empty else p.default + if p.kind == Parameter.POSITIONAL_ONLY: + self.arg_mapping[i] = name + fields[name] = annotation, default + fields[V_POSITIONAL_ONLY_NAME] = List[str], None + self.positional_only_args.add(name) + elif p.kind == Parameter.POSITIONAL_OR_KEYWORD: + self.arg_mapping[i] = name + fields[name] = annotation, default + fields[V_DUPLICATE_KWARGS] = List[str], None + elif p.kind == Parameter.KEYWORD_ONLY: + fields[name] = annotation, default + elif p.kind == Parameter.VAR_POSITIONAL: + self.v_args_name = name + fields[name] = Tuple[annotation, ...], None + takes_args = True + else: + assert p.kind == Parameter.VAR_KEYWORD, p.kind + self.v_kwargs_name = name + fields[name] = Dict[str, annotation], None # type: ignore + takes_kwargs = True + + # these checks avoid a clash between "args" and a field with that name + if not takes_args and self.v_args_name in fields: + self.v_args_name = ALT_V_ARGS + + # same with "kwargs" + if not takes_kwargs and self.v_kwargs_name in fields: + self.v_kwargs_name = ALT_V_KWARGS + + if not takes_args: + # we add the field so validation below can raise the correct exception + fields[self.v_args_name] = List[Any], None + + if not takes_kwargs: + # same with kwargs + fields[self.v_kwargs_name] = Dict[Any, Any], None + + self.create_model(fields, takes_args, takes_kwargs, config) + + def init_model_instance(self, *args: Any, **kwargs: Any) -> BaseModel: + values = self.build_values(args, kwargs) + return self.model(**values) + + def call(self, *args: Any, **kwargs: Any) -> Any: + m = self.init_model_instance(*args, **kwargs) + return self.execute(m) + + def build_values(self, args: Tuple[Any, ...], kwargs: Dict[str, Any]) -> Dict[str, Any]: + values: Dict[str, Any] = {} + if args: + arg_iter = enumerate(args) + while True: + try: + i, a = next(arg_iter) + except StopIteration: + break + arg_name = self.arg_mapping.get(i) + if arg_name is not None: + values[arg_name] = a + else: + values[self.v_args_name] = [a] + [a for _, a in arg_iter] + break + + var_kwargs: Dict[str, Any] = {} + wrong_positional_args = [] + duplicate_kwargs = [] + fields_alias = [ + field.alias + for name, field in self.model.__fields__.items() + if name not in (self.v_args_name, self.v_kwargs_name) + ] + non_var_fields = set(self.model.__fields__) - {self.v_args_name, self.v_kwargs_name} + for k, v in kwargs.items(): + if k in non_var_fields or k in fields_alias: + if k in self.positional_only_args: + wrong_positional_args.append(k) + if k in values: + duplicate_kwargs.append(k) + values[k] = v + else: + var_kwargs[k] = v + + if var_kwargs: + values[self.v_kwargs_name] = var_kwargs + if wrong_positional_args: + values[V_POSITIONAL_ONLY_NAME] = wrong_positional_args + if duplicate_kwargs: + values[V_DUPLICATE_KWARGS] = duplicate_kwargs + return values + + def execute(self, m: BaseModel) -> Any: + d = {k: v for k, v in m._iter() if k in m.__fields_set__ or m.__fields__[k].default_factory} + var_kwargs = d.pop(self.v_kwargs_name, {}) + + if self.v_args_name in d: + args_: List[Any] = [] + in_kwargs = False + kwargs = {} + for name, value in d.items(): + if in_kwargs: + kwargs[name] = value + elif name == self.v_args_name: + args_ += value + in_kwargs = True + else: + args_.append(value) + return self.raw_function(*args_, **kwargs, **var_kwargs) + elif self.positional_only_args: + args_ = [] + kwargs = {} + for name, value in d.items(): + if name in self.positional_only_args: + args_.append(value) + else: + kwargs[name] = value + return self.raw_function(*args_, **kwargs, **var_kwargs) + else: + return self.raw_function(**d, **var_kwargs) + + def create_model(self, fields: Dict[str, Any], takes_args: bool, takes_kwargs: bool, config: 'ConfigType') -> None: + pos_args = len(self.arg_mapping) + + class CustomConfig: + pass + + if not TYPE_CHECKING: # pragma: no branch + if isinstance(config, dict): + CustomConfig = type('Config', (), config) # noqa: F811 + elif config is not None: + CustomConfig = config # noqa: F811 + + if hasattr(CustomConfig, 'fields') or hasattr(CustomConfig, 'alias_generator'): + raise ConfigError( + 'Setting the "fields" and "alias_generator" property on custom Config for ' + '@validate_arguments is not yet supported, please remove.' + ) + + class DecoratorBaseModel(BaseModel): + @validator(self.v_args_name, check_fields=False, allow_reuse=True) + def check_args(cls, v: Optional[List[Any]]) -> Optional[List[Any]]: + if takes_args or v is None: + return v + + raise TypeError(f'{pos_args} positional arguments expected but {pos_args + len(v)} given') + + @validator(self.v_kwargs_name, check_fields=False, allow_reuse=True) + def check_kwargs(cls, v: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]: + if takes_kwargs or v is None: + return v + + plural = '' if len(v) == 1 else 's' + keys = ', '.join(map(repr, v.keys())) + raise TypeError(f'unexpected keyword argument{plural}: {keys}') + + @validator(V_POSITIONAL_ONLY_NAME, check_fields=False, allow_reuse=True) + def check_positional_only(cls, v: Optional[List[str]]) -> None: + if v is None: + return + + plural = '' if len(v) == 1 else 's' + keys = ', '.join(map(repr, v)) + raise TypeError(f'positional-only argument{plural} passed as keyword argument{plural}: {keys}') + + @validator(V_DUPLICATE_KWARGS, check_fields=False, allow_reuse=True) + def check_duplicate_kwargs(cls, v: Optional[List[str]]) -> None: + if v is None: + return + + plural = '' if len(v) == 1 else 's' + keys = ', '.join(map(repr, v)) + raise TypeError(f'multiple values for argument{plural}: {keys}') + + class Config(CustomConfig): + extra = getattr(CustomConfig, 'extra', Extra.forbid) + + self.model = create_model(to_camel(self.raw_function.__name__), __base__=DecoratorBaseModel, **fields) diff --git a/libs/win/pydantic/env_settings.cp37-win_amd64.pyd b/libs/win/pydantic/env_settings.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..1003ccc388fee0233aa9ce101126870184df90cf GIT binary patch literal 169472 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

#Q1`eeMDeO2P9-p*nqI=pCg zAIx1z_yG8GRx#(0mW1PVgOU^Wce$oheJ5B=WXxz>2Kxk>|7t9j$zed{j;*EaDtsr2 z1DiE<8*xHKPPnM?0Xd%eu;lQ_0*6kuPbYrC|$o)LGYCs&6VcX#SM`MY+IuoGJMc38cbpA8QMT$f&HeB5tg)&YRS&^$dn+0 zhVx$5FD|Wlu>B6*qRBglhQ0WURL7P0VjY~g1S4j)ZhlGKJgUFk5H>YwStTkrs4~Vi zYrHy7gmz*Lbn-B$Da`YL`}D?KG#UlzI|&Ep`Opx9i+gG^ji*pkgrd9aPG%d!nK(k_T%nH(b zR8h!jZ(N-i(ZHiX^KJG56r+i8GeB`>RpR8{LeX?U)KHuZiZfW1h|ISm^Vo)Bu6jqD zf5n{VYdI|GWxU+pY1fiwJ8-u;@CU)qwMY1&xbP3o*@$K=LuL zq_!~K2guaXf|tC7}+nucT<4kvEr#CQut{raLMt1nlt)P21(Lr}WmF_gN6%29- za~J7TG~>T^FE3p;ChEjc=_^4zslh)4S4T>{rsF31ElwHJ#iO-4=5jGDm$8?|P+{jo zy$tvCf=#DN4R#*KlR51|t+E0@FK}cK%Sv!r>W24)c{)gookLd=XqxR4ivDj8Gu@@V zokNF`%Vt}*?*WZHkhily)IV3Z%qNFaQ>k##Atba%hn<0Eae;&D9<%rzL&3}Y4chU= zq_Mx$W!!hF2WxA=5?iMRrGqz0%oK0-H9N8_xzBDqFs7I52(zUaKBzB${VxZqoxIxh z+PGTnbery_Qm5O5uA(bruQ#Xef5>y%7rg7VD7!(9lesYRo#M?6j5p`CC2rG2R@c^t zjjP+z?i9fdyvsqFCcxGpv zuRRO9uN01#=E+!DONb_Jdt6kGH|r-Au3Bi6;t`bMf-o3!v^ClgBr= z06jQ=u%>y~pFJv{|5gfqS;fSdeb!$ilJ$t+yVf;e^X)l^cG39y7!Fi0-L9A?tMqZo z%^Y-`ozhN3jO<+ z@hBS`Jj5QHJf7?>U7Ek$Yu=VA5g5D)ofH_Ho40wlr_D4IR=!jQc`FVTQSQ;Q(epG_ zS08rXA+b7_$+@MtRLtzOcMO$;IQ~Pgqw9&_ewOVapS-rQGZ|b=ZW2Y%@v${L(8Bxc5dolNV@yjJZ(n(Vf{xGrULF>5&Vv#(PvNko%V@q3&i6 zI9CmnKyfS~Z>R-#60|`yAw+d7La6m4ukKLlcF#;1eN^MnmvGVPdHhaO8LakRXj!! z%r)q~QXX*vDWUAkHfMgrH9$!C_CY_x6)!3GCVrR&;85!(!4icm+^z6EKw&nFq8P#D|?DUbU~V8sgqC+w@@{Ad;Xq0o8Il2lI8D0h;;B)y^$}~UiY_9>t-5E9nVP& z3v5%qEv;p1J`>9!A~ZI2$4XdRiy`(6-`87PE58PV==cWngq{sbK7nC&7hl#@gE**0cNQK&3oX|WMi(5BHiYhy1c&uw1~eV5rA12N z>(IJibmT#9e#O*}Ce4z27gG~eOE}p5oCTICuSoWhkzn_vbPv9AWufUR>Bua z3i&Ha4m&_<<+4&V{N$K(W=%L=y^8A@{I16pi;t?|Z!&)~Qp{%3gp{!&%T>CYsbcwz zr`rxCXm?yuvV4#_5nHcMv^Z*DMY7TuX4V{xU}`s!amIp|jOmB;V}di(`X)4qDz3nh zoh>6<$;BpfkGcd_u?LfH?Wd&IPaUi!6B%D(GIhZ+BkUcJTyNIEQM`F1`{pm+n>Tpl z6@H0F9skJQuh2cK>oV_?UKPYO^XPN$5%QFI^s#EOq%?E?w(d{op7sySw*RCa6Zd9{ zJ)rx;v-h*P7v^*=Q{-Cj(T;lbn)R=Mbht|O%0BwVE47va3*@bZTKDlvy_bEoxA#cu zYr%6?YNKa1p5gAwGL+`qSHQ}N;GdO>${MXzJoOCCVy{LcHBfE!zT^Q!GF@M$&Z6JH zy{q%_vu>T#M6cMx-u+RY5iR%be?zsOHD&#GL$1twyq|Y}uy;>ps+RdGTirp8Wz=w| z3z@~8Tu{qVI%Apd?Y_3nolvYMG?ZfzuU-mkweZ`*Z#%#3{LbYUZv+2WJXgb$2A(wV zyPDtC{LbTdUW`?1#MoUI&*e?4Y{3myiY{L~uJk~UJj514eSIEnG8)y+3VA#EOceu% z7h3+FTu0BHn>ANHletfMz;5BwZL!t=O&l}}4H;bZ*|~BfU#4wKWQeu&Y)Z>gnD}wE zX=dvPU$6{2iB;k`)+)y*tFL$2VYaMQUX38+u2uFn(&XPy^S`@3`LN4`*`~15<2>TK zcU4f~?J!vNJBqpLZI!$a`xvadKKZ=da*uoEV3wZe5vNc_Kc3Yo(sY*KjnSjREiKsfDv_APfy-8RcZqRXl)T)7GeT(4T13cCz|0th6;optQ zp_VtnI{8lMe{g-W=vA!6rdY;kY2k^sH?Ll~MC)(Uh;e(^iVKuCywjs>;=>;`qb(n0Smz)h*=G7U;gZr|aZ; zzVbqD%~yT|#*(i*ogRgoxNS+#bLr7Qqby644z3gVU8lFG^<8T)SWJUQ zfUTV;ypnhgZisT|YMgB#o5RxTM53HiqZQHVV33Afe05r5sO=zCw-enoRPM*zgen6# zn4-03aPczTtUXySQb}aV5|U!feof2m`UeJTgh2g6UAHAO4Xb%7km|3RoE~+Cti|zY zb&DTqEfXYxxcg}c$$Pf=VYX5=R&hlsi%WJ9Sn}cYzmC--u>3Jj-%ZMwq?e?2J=UrE zNsEtkvn>-XOq@sywGxO5>p?m@ODZ6bc6R)4h%H>ETg{H*x^rNj>%=jzeZV4wf%V*W z+^23h{-^g*@e$*8(GTR#o3>qXvBpWfUUwOF#%S0Q!P6~ZV6_Bs(zsft63AMb)cY%ac!`ZpFk9Pw_@3TF|C=4r*MM z{JmezC8aualH6`;k?=%8Lw2!6bzzt=%L(=i<`tj^F7i-jv|doUzUOgpzKcamZ)bmX zrVlJ@+j1Yg4t%psrUUD>z^=0c1BCqs!+yPx=ZvafTiaccSLRUaFY0W}$2aC6(6cx5 ztA^KbpFM5Y^ju$hmKXyme1BDkIii4$xGPra$mQ-}FaRHENEH2fgW;VcwZC;lYgIR? zBS!m(fCUpw$XmsT--4*S z;$wLo0MSLaKyYV0WSPB4vz|Sc<7B?D?TV_%7yC(xa({ex$%Luzez31e(rtRyDM=%) zW}dYm=_=e_C*rP22M_V;45N-oGMNL;i|?ClD4>SCAGJ(cQjG#qsT_ zl|aFvC{ws_y5rM*krHUTZFm&}{aG4ssi_Kz3Q$3b_b)R=U zz++6%In1-RuBKq9Z8;_=^}E)O?Pihek!-4W->&;tviGgJpP#*dPWOMy-p|*)CM3N2 z&*=Vo?rHP;1Z}#_JjLTozqhoOUy}_zh9K`e3Xw>l=@`b;%R;fFm~qHVc6XF<+xihW zgxVgYT`)NhOf>$1=1aTGZgtGymiJm8;MKTa9XQ^7d}#LZ?RtE;`*;sM{?OoGug814 zj|;PpFW2L3+{a%tukDqt*W(SWc2s;fWEC&U*TBKv+q3m{rLBdmmdr8e@JcX#zIb4% z)X8vyV5Y(L<$g`FQMdmLrm zFLj@XC9ZN_(wDjiA1d*|5(w8T__}TWxoWnrXtOg@=6J@MdYGY&g){TU(Vka=SKiaK zbO}Q{vv>rIjeMDA;;GtmpZiY}>SV|M-}yexe&=We(5gM+!Gu329$b1Z#c;SPGZt_m zEaJw4{@il&ymDcUaMayx-uZo+y|GwZiU+?(_au+{S!Xz3w)OlGJ2Rg5sEOQoaDjj) ze9tK?%-OGcpBIA?WBS@%Yw{PbNH!k)$JxYh!vNbY9z0Ve9sguNQ~hdHr<;lgPt%)( zZ*&HF*Ld(u!8-B_;7Orz_AO_a z@hn#Nr9)17*s~3^Rl5yFztKKvbJ`?3o2*{E6PBk_shDo4LOxV{yOw_rITBpiny=V0mTynR9KOB%MRyArPQ-|!ZtxC;|EC31fjvY(1H+ED>cVJ6 z9f8TWf>h!A1%%|AG4Xt>)gnC6J_>!SZdb0q_O4lp{8}jeCTMc51y%XnTd_B*QpE>v1 zl>pfsHox%L;Cr-!wSG+tIx9D-?`7o`~nXQ` zN;+Nb{Oq12T*gVlQx?aA4*)FY-1k!Dqk{fwOr|NO)Kp|iU*>;B;sPk>o*K;Z=9}fD zWX>`1UzW_CO%u}wta-! z9%(^k*J(5);c~boG3E$24#A9cq`nW06ry$+V?J-1586FjXo?CQXNJz#b_Tu+U;mOGJ|^N^fF52`8;Uqru_OyU%(2u+ zch^|o7NC<@S&=;a2k{&MnBsjhFB#ot=SFMVap#{z+D#d?*_mwtap815nPw01i-gkx zg{l_vSq{?Xe4*g3;Fyt#WB5Lui({uuur(^r=Xgk7S@P!(n>%q_)g8x`l8w3_h2tuj z3J9#EP)2qzBZlTD#PA-P*9c8QU%K5*T(I!YhGg+5M=cH>;r)4p*tG zp0-H&dW?N0i(NLka}bL>6mAe$pN-zKFOnq3pJ)X&M)GRy(pw~GAF8k3WMc8QT;R_AvqeW z3&(#wt#TkcC#v@?C6V}WA30V-ZYUJ&gPOVHJWh?VaVr@M)k^r@-#~DjJyN}D_QOr6 z%c}Up4g7FgI;-c;VF}(jCHxKIuZ%yO!gDGWmw2bBPZm4(wevLN=hP^|Vao!^M0Vlo zNcD4O^2d?tJ4;r2j%afK!-Um(q_3_l)OtGvwm|^v6<4Z8H*Y{)-W%jQwp9wbJCSgM?#OJ`J_rrY2uhlg_{nY1woiI~2^rXp&z4)n5Cqp$)h7dR?(T zqp0m`UWHm;QK<$lpM|d&zIhC}r)-9MMP8){0tKz^B{9?;59z;SOxCNivaVCPeZEYW zeLqg3UVJ3F{Nj?-5Dp;!4Xv~(5DB&J33Qj84ypotl-zB?|0Js2KGXVka*zEKlYLBpdaXQBhn4eHKnqZ);k#u4 z2$kD%{~8@vuDK{6w4$E7aB+gR|68-H@lIp1BX zu%BShHQ4?OTwpUZz-R(Q{WUqjN?l;%dH~b+U*_)#FrA>9?xQ2W?R3jsRnqbA2xxHm z49lL0rMJ_Ygs*o7dM1`eJ0ldk3f|$sLq7j(QMbRH%AuBTd7Ye9YOyp5k+HXn)nbgFaUtG>cKia468JN*KA(^w$K)q1Nj~*Eh{j9bFW5X2|YZG(8xGgc6OSL?U<} zv93ka2b`jdAx~RnN0o1UEfTB%-+$-$dQ<~i=kV;k!LkQ-hh)-8ZGv>sne8QpFW(Srf_d-cZ z;mIxHsOrvXkN}I_D6=ft3l6Y=7*F5_F>ZHTQ8D5dh}kVp{fJ4Bb)ag__lSM$N@q`H zrb8O3;!cPB$zXQ<(hk~tdbDC%QQ(HBNGPJs?o+QVNWD{6-NQmw9p-+}cCFv&wkn=vbk5@b2S?oG(E}<*M z>h<4D`>5=+rMj-ve|SFA9^|t)74q2XfNvgK)1omC%d1){O;V#Zhx`@unOoep0`NvF z9i+k5N~_c^UA~5+3T6v#){z7<3bVP;2l4iX@^o_^4{-qSrwc+0x7!V29nUWF?9zj= zoAV0SdE?Zc`B0h4JE-!`R@r0&+carY-pXaF3}%&VzRqnvC8P+KjO-6BK^q;y$ z{gde5VIbtD?$ycCaK(kB_&#+t9V+Ixr1a2HS`nIV7XfFa4spx0TbbIgS%uK8z_w}P zA&pa@X(fehHx)KRC)U80=Yr!vs{vsveBS`5uF#_Ck5W~@|C(}&Uvruj zDvNoX`%I|F-$@78>x~zFJj*ckj6$`tIUOv7>=^{E)o^<3*STB{Ma~Ad+-SPkRINez@pKyV zx%M#cj`A(7C#;?)*P7MK)wrOisy>|{r@zkw%=5O%#Dx}42L)){F^Y|bp@k#3D{t3< zYWp;*jMNGYfRuN)=UT2@*%3SnF9Xnx}KbT?0fsJXH$a~M4|Yd zZ|!`awF7jkmEWb>J~NwSpHs_?^oQzmYW|kd z`kdNg*L?6%u0`vgH1|J7w9a2~jDSCq3HZN-oLvL{%mL8fZmnb}Vr(B%Y~2jM$YQj@Q0bcWj5|T)Y$XzztI#0tBw~VFdlL_@%gZqx1o`>e&w{=&z1H z(7;bDerA}zG5nSAH;BJ7{)X}=#b~j8B!1OoajAV%O%#vCFOXfcGYilOT3k>0nfwv> zm(Zo|3u%?ODkFT%VSzx?CJj@!)RZx12*IrIj{#1`@MD`RNtQ}tEBr?uXZ{*jb)&P% zQp6p*`o4kx&Wm>W31mB8DXTBVD7N>*5z}oy%^z0IQ z{kq)2G-?hSFzQlpnG@z>&MyY>PgbzI+K@>NyE4#2vULawWTNrn@7zGL=K+rggI1R= z={u*MrTEP^TcpJIQN3Elzz3QZ8100Z<69wcGMSub%Bd|d4GVHYcD#eqEGi_)?=rz< zk1gxDGCArqT89QEf9e@7K4v77GUPF#N9tGPfs?y^AyHm#D#9%(H(%DF`zb#0V&TgAD^{HV2ztn+li9cD1-8SdGVtwffR*-sZezld*sp8B=&CEv* z#6O`ujlr`J92p%Bc}A}DM8qwTED!vV1O(>>LZvQpIL-1BzAKO6ITKcFf{GH6pakW} z5;Y$hB~#DoArDF$6a0%Mmb(T)^Ub-Tvnj!6A#Q<=WW(#N@Qq^7>c)tPIF-Z>P+89* z73-Zv@-THklD0{omn6*ElpM)Wc|>Tw*|=PT)h9bx6Es-&X=p2aqX8UfzMEqDnnm|* z+Rav-MmZ9t5biDPek2Nw;&;Rl0B=`zm^?(@UD@8KtOt!Pc}+;VXx2s9m{g?BwH?{V zgvFUS$SAS*JvfEhk!`g^8+IP(+aI=j{}+T1h>>{omlCLCfRbOl-$|RMs{qm6*hQVX z)fp!?6K;5tl~S0`5Fi51xYq=O^GDA-$Y2wrV$ zME&iPH~vcQWuS=!HQZFdi=O7Ru0cTuXV$ToFyru|2KY`mOhy`UcUKJi0>Tr+IU3nl zV0`+~knzIUxjfH3)`Z0FWV9t3f|W0LO=94ZWI0Jmb63Hq`C5)h>ak3~iM1%W3fnel zJ{qIs@l4wYJqyh>ZEnYnUQ(`$PS{PzaF8d=*o^_F=?$x*d%n3;Z^**;d~>eeU>4ms zh-&s*SXvt(VM?#-gp(MC+!tlI81Nv)Z6r;WJiZ6K}Xw^9MH5m zs%@S8<4bhk{mqwpL+-DKNkEq*Kloe@t<=kk-e^<}4R2`Q(8G1e zV=itl=;6COEN?e#MGv7KTDVwmUNQ0YpFK)CDYygSKXVpx{Dp$9a=a?u!=N0F~$omuHp$j(^+%U4bDC@1g~+{yn@=D*@rnVqSOTL zp$-Ln+19|zSzx*=*j`eTmm|U4OG42VN;thG8s=4ljqG)^1qIr9^#YM1r*0*%&T4rrz=W^ieiJR=Mi z-NE~-mv@ymNW89op;AmeiEo3S7E+p@V!q!V1ygD20KOQ*bZKZ|U)aU6tZ+fcj%0On zms{rjzEzR3{>3@dT73M8uka;~?Vk?5&)kCR2idIm8skP`04 zGvWmW`s~&2na^ICDo6$R>{Xlh*(-x`^ZcA;$xt;UvV1Yo@n>tgYVDCj0D=*or8iVXhTvnedZrns+ zx3Al93W4?2I@;$Fx1*Pq(b2MGrlb3EMMsBv9c^Ry^NjB7Bh?w}L{ZxSW13R+oHOz8L2K^9{=C#@>057sxJ38PNmbLP^QzHb2`m@ zPL;EQ(XEU$wvVFY>psV3^m$1~$lxKf0tRe-@A42Dgpd+lCb9BTRf>5wFObzn)ZRvx7TiV4j4=U*SzqGu?tN=WA8Wxs;fa zKt(+N|MmAapBZ5+kmq}wyRL>d9E4!=)8oY{*r3Wxe&I!pynSzT!ACje4))50U2f^| zz0Kt?lz;-Na}%yyf)Wh>zgIE!{Mrg{>bcoO${3OJ5Z$TgrFQENsgZ>5D2z?+%Im?p zcLDpRi*Y&c#w(Itc|C&u&c7Pink~-x-sTz$%Ke`ofuJOO`>8shwDS5By-E1q)Q_NN zW{Xi$xWsFQ1Me2#FLi~o1`cb_Djw4ScV zdj5qUh!MQ~-J2ky$6eAfx%<0k<(7NhD;HLz(tSPu0%NWG`@0|b8?1E^=Rw%2hVR5$ z_js(;xxYIl;0fPX1TDE-^``DUuBvgl>YrYbELVMTIK#5uxXQk;dA0&)rVejcNyk42 z&~VkxIb4;{n}i#O_vEVE1+Uj0##OtXqLThvJmFAFP=mgiAo+js`%~wZ&SAcECN05L zO0F<2{ys)QwX1gAi7b~QMo z1?MKgsqinN6uI1&xR#oxS_^ z{rx>2nR8v&`}5vE@6Y?Q(?8V^W~zDP?t6-Mv^$LjLyB6>`s%+K#MlklFQe6zr|A?& zvbS^8h%!#pr)d%eo~G7v)=j+k!&ZHR{o#8{N+t{9kq?w~aMp6HAvy(wu?BBnL-)qy ztyu?A9sfjo>icjJJ9ktz?Va*oP*qXaw%iz6;SZ-eI%PyGiWGd8o<`*&kLFtXi(BVez;|R!vk} ztd*CFxgB$?yz;*zSgRMV90E>z=%$l!Otooi_Uj2~+3TX@0LoJ7WIEhKRvrIVOVq?> z&kUQF2W-yks=<%FI&+n%ZPx~&4Pe-y2lBUhx48WKN#p2_;1g`1-vI)vjt=yo1@bHn zoGzys0Ezq@2F)Cg3d4hx+&+hj>iDTB#wL6FIK||y)nFZo1b%OoL#QMdFEv(ST5Gyj z`fJe!AC&G&!CJn z?*A$k=%dzH1Wq_S!^GnO6CdqXO!aoJkqw0P@h_ovGtaVM3ZB(_s}O??byX&x4A4w0 zf`)1SHsCpzpCWOP;gOIj1F+DTRSOx1pzM_09p+|kpBL$-H*3_lRr?VTSkRaw<; zZV0Vv{|$sx?TLmiyqk@>_pM`lMY8n)3b?6c=4#P;Jn>x?u=v!(z}h_7;wK zn}2RI9`rNW>Lo!DNY=DkdK@m*|}pdRNoD+t1V?Hg(D{`@E|#S9I15E3RuWH2_otWf68mJ(RUU~&1*Hd6b?@4STll)*#DU6&209+5c`MkD)zPfCI~5tr+E=x z?IcZ(#<<2O_m0EB!YY8b9r`F|gsFzS6#1rnC+m z#^9k@43a7J;n9WD3GmSF4H!HI1~=nJn!!ySgU_fni`%J_*NdZu$nVD30;Nfz*=WW| zsg^2Dnze7hrkhz?>F*^rv89WsoObh?1y$|Tpnm_2&1qF+tGW-VG8R9lqk8v%j?HVx zv)VXCf-yl;Ua~}3))Nw_v`sX0Iw=iP|4L8P-ZSJ&mQ{4XAY~pjin;yyU2yNfgL=t> z6uJsSh}Cq?HG*X(r*&w}7wQ`KX{x~HZ|^NV6|9ZAU$66`=XO|(^JMuFcs(a9Id@(~ zcQ~7w{l&~dFq7YEV6~qx7N-ZLyk$MoVOT-s>O33=2*(DxK7|5h#l$vnqnOCL3svHN zVOZ?-e+Y}0Gv+|p3lhr}{yAnGMz4xg;M~|4=9*ct@g=(R*{T>UG0IGg+}Oym5#iaD zekqY8zviQoDIu=P0j_5cj~K0oM;E>K&X z@Dlo?Rac$&(vRMch6nqkW$QkOUE^xPurM%r>F4lL@s*>rtE7)#9jj!Y;xd(K%$M}?Y9^W-U z@GW;#F}C@H#fS+{G;x~`&17P7iE!!A%M>sl zaCu!x{a%zR=wlHGYoJf$s^Ur|t*+heO-8_!YDKVV%6k@-g>+YIk4{0COX@&o>7TVX zgwGk!KOMXLjT=Xb?N%iga{#^oQki==HI z_}umdb8jw-9A@%wPJt|TtU0q==#mYONK@rb@S3L;x#f|!;j6ZTo#0g+-)p_CT+o_~ zsWY2)t%;xcpN`pYSc$<|UZLPag#oXbBpxOe&Mr}RT9KR^1J?Xi(%|a+t;n1=&A5}> zn_qQ#kVk9&8r`<==sGpI@lI9PkR?XyOJ(^}Xv*KIwqZkN4RO5`7LT4Q&q;XN5oD{G zsH+#CJuWGXclvdiVRSc0JZa9e&Tzog$hY;)dMP)nPtnk2EBK-*nA}pG*CuX}h+$15 zrL$z1-ta$SKtHR|D5<~OK7_sPHOs|A!6Z>7oQF$sj3e*n>ApQ=Y7*<$Sf3kmjumoxt#k1; z)~J}b;3D_PMQYVm9m67(7BP-yW|2x)y_m#9kMvzS?jEhuSVL_ef7U!{Mq#d`{m4r2xvc%vf#!{9RA!~LM zQRcpZsTHs`B3#oF(Z#^GoUv)6u!; zo#CMixMJW>Q=?AOmeP_e{KSb1g7u*b^?iQ76qTdL5aZRPoL zGn2SXqyrBMr;>xh@V~`NMeTIsE*aj}s&&fCOR(385|0xBMQKF7K*3frM#R>HaVF@% zn?TF__g@GFGP7l5`B{!TR40!u^H)o1Hx4iq8=8seN0ij}HkNWv3Zy$egPK00Sd&yU z&DtX`vQ%Ofwbng5XCz*zHqPynyGV-2v)2C%`d+)#X3@m;3S7QGTi5wCkL}Zfnh@V^(qEj$BL-_r9PK5G7Rmi`4m;mbH;TZC;srj~*O4%}}{EZ=H91p-g;zGHPX9aFS-YGD; z3YwAYW9Ds`FhjmEK#FGQiX&uX!h-ck?BBt*#qah)`T0!Iyfl`$2KrO#1s7REOgqdO zNzA!_ul6ES2CZ{j+^3^kXqvtOsD{<2qlkF@?c%-3o0h%O7}q0BZns8n9#GB<)LQ(jkKLlYij$RnLlab@yS zKD+jpw2AwYdFj?@u@AaDvJgeHQd7aHQHL&g3q&((^hdkpZp?e9PF`zLmXx>1s1g}D z((yIy5e(IL$qdzVUt&d*faW_HoZz>u5_7dbZ}2QtjYx%>v0> zyHpKfJn||}ZgG{_Za9iI+x1tsC$JrTmNFjggzXLU_`$qWzwh~xw%u3apO_kt{N0)~ zvt282aYXTY(P0PmZ`r%Zjm#j0$NMr$>W(NT zzu9!LMTEe9sfxu9t~twRgF zB%1b;K_vsZM|D8kL3Gp_M)zP*7K8JVU0%S;S(GK8S9j2yB+5%IO!M!3CNLGe`?O;D z-9PKJrMy2nW~#~~fW;a{uvhW%EWt11ErU~MS^!vzZmy?-ro4JU6nSdwGncQiQ}Z?d z8XP1HyE_`y{JCXX0nQ{?d&C9f{dkXSXd{QQK#0WNCE2QaIM&hRt_3zQ?nTZYiE@W*2|0)VvMzG@^+I zzN@A57P57>FN-m3@}{xMDnWFAs{~%xJ>_5wAbh(`dYJI+QW_TzF499X4SLgxHzv+} zMip$NX1QMfXxgNglzzQhuRq{*W%8b#i5(p(lMm}}o66)o{T;WNYNC zOnxGvB}?NZ!)OONL?`0>YWZ1~pmVh>{_go=5Py$T9L>bvAv{|AT@=ROx!LjeOkBgo z-|ehMS^WJ-KN~u=HB6cK+ZwmE_#3y`mX-dUv&E{5zvuHVn0@Z!g_XFrdu8%RXSV^& z8mGMbsNag4+J8mG)ZYsIZ$#sRCU#`YIReoBD2pF|Je$)bKGp#tX%3oOd-w!&vLmJ1 z!}`2;ik|BcC*?hyi*&6`EE%|}De|1! zYj*|Mt5pq$mlF6o68QQ)$LcLQE19UbJ8#r9`j0)K0=D87nk{#M=J!gyEKkS^Hmo0N z4|l<_^wjUaaJ0T%<@JuuZ$6?LW9xGACy+S@eVN~f{D$6VI1L;wbl1G`cs%VvJdShE z%@Ne1l`W`Dc7Ro-H$w-yZg_)9q3LY?MsD!ITk((nj^v!bUM& zBECF5&obwq`ksG8MDMNOt1`JgoTR)77#_dTJ{g$OA|n1erkc7U!{=16%H;PLmHf`Z z7W!B$b2k{bX{)?024m2)bu7+QDO(J57%dlqaddbCslBcV;{}PvZu6~%YTAL4myU?B z*`hje>X@qdrk$%36UX!X1ViSgvJtu?tW{ORrk&Xt-b~!VaZO^X6{<;`GDa^ds_I^{ zQhMNvZTwKk(ghpzclyJUZrGq-x=Leh+VBA%)*olHM^&6tYIfj;vZ?qP2?f-lXShVP zNXMe+_$7HUgKD`+1bu)t^O+^$1o+RmE9qvgNSX;3>lCr*WU=wf_s?foz^bmcCu$I_ z@pWpyYd;8E)_zQqvp-ev`YgS^E&ZCwM(lPrc5A#c@8wx~c~0KTF?u;F{gSy;iVxSz zSl-KldRdnDvQjU1%zIg;mmCWj2+*gwaDKiEFMr~vlj;C_`GH=t{yFF6dwNN~Bd7Rs zy?iG9vac0iq?dQ)z5JJ6#`9i2rI+XNQrl_N{5k~p>GkM5*uU%L;JlaD>t*lsODEHn zdRfX#5*vrsy`Qf4t<%7J^Q$u1b!T4wNX>PS?qwIf{4nq3HhTFAFX!)JB{!7vtgQmB zq!NnCWRqUroA+|9US6B?Qj{p?|mZzs~x(aur6&R@et}5RdI%j^&ukg!=@N)E7zcD zyqTsqV^rJ60C*Q~?ka}9*xkSz$yACCxfGqOaM?&Fn($!r!aeU0b;&5*G4x|xLa7~; z8VD#DnJ7xX=uk}2^${DiI)m9q9*G4+nA z8uub2q-%(moxKwdbpb7GdXH5jJ>O>Or`PiLUubNq)b6+{wd5rhe~O3)v4VI z{0-orcjT^M9xpcHk*=^aPq_dw(WNOJcoVbTRchb7n;ugFR4{SY+VHCXR=fGU(d5*6g*8`b^Za7~F4%vES+EYP- zqu#2eWoPjQdAs_{Ed#U!r`5dE5vggrutCX~^W~-?^G@I!y6mSeNq&oyz1hY%uC$g< zSNPpWTV6Sb4Is_pZ~Nc9r5dUo4?VQArjI&473xC8Y>y4QYn**cv(E#o`wEYaOg#;{ zTGwt>ulF^ZbKkkzw|)b+(46CU)$!BYvc*mdZ7m;-+4#0jNu&com-TzJRTY0por#@e z^omQSljtMRaZF4u)gFsj$~zXM8PHllY4W(LBc+_o{(6oAPzHD}~dXFQd&Y{vSyrG7siB)xf zG}rlxgS5Bdc_sg>gNHE42MIZ1XvfSy^(7HGwWE90HQX_S(a6T0-wfw@4JzzvIheKp zqjscl<(&R}_dC5QlQvx}O~%T5|3WJ?d8DQ#fnJCPtI8Kn9>Qq0E`N#MC7~1E+3MY@ zTiX%TO&r@F-N`ZKD~HyFWeM*TU~1x39mQj*0hbAQtC~0)Z(b&&^2^|kfq5MZfwUHF zhJGuP-qv}kOj7sar0h@=h7b*}m*!oPchqp(tC>E3?ql{-tN{muF?P=Rge8^nwFLV+ z87;nc5XW;j47zDhoV5=V=JW4y{#}{!;u4Ot)0rCKJ9)i@kD0MJP07>}1N-a1BL7$sbbFTh3-9H7UZAdgVWiVhd#JGf38#gf*-}O|iy|8awSuiHR4P2wDS7K0dLXE?cG(69V$TitLP|GM#qaPlf| z=}1j|+&_d_0>s;)iktl!5Sy#!v2`ros=8sHnufir8}@8swHF`kBVX+6pxH(V1o8sj z%~pGK2rZ!Q6Qk4cEjg7RqrlDr%Y&;Lm`)wEGS)!&9rQTw z!P&OZ?nP4?IeR*Lu!ZnAv2|O>}0i6|YtCD`w&d*1uB-orFSa5VNL49lbd9 zMxDKQ4RuK8k#c`+en+f$suQm{wej{%g&2gjON5MAg%UI|C?%*rj5BACESm9(ac+DR zBwofV^Rfq>hUS-kNK{Kc0b~ zE%?t`NR+APtE>5Aqq&5@W@Nw~6xck#YB@bA^3H5|Iz=MO^^3NzrHyZ+2zifp_yfv= z7DyG|r<>a5M&av|!S|H#O%U1qq#$0iB#6|n+{9-?xSm*2D-6Hvk{0wCVc63!l zPja|)wo9VROBGr;Ex%!^V(*pymKibc7SbW6y~RShnmAH2UF)AYj}z|2LlFMN!#M)4 zHtw}oUZNEqE- zEp-xqsQb92jzf7X9BOk4_?c0~fcQHqw+H2@S_)m%p=SvaUs~%-f|?j~6U ze~+lB#N#knA2-vMB>sb+ig@wbYYVF$W73?a0*+H2FZMCqr}Xf>2t)uXlJ~Z4E}@r( z8Bcep;WGc$TaF9R<%Mpz>%driB+F!4Y4WmQ8`3iWY{gUD1UuZRd?2jx1dcnKHuKLR zrO_wcP)$xfYe>@JHC!%&Kh&tfe@87bZ4~EdVFxu(GYmR+D5R)D$x2P3H#xgpja^j! zX-%Q#jbRmy85`*d)x-&wQ|C7-Z>W6XS8Up}OXUkc>F;)xFMOfDTx2xprpgyS;&%|& zP;jD)hNpfNk@bdh3; zh2e;3xPxA8{ADkiGSdCMk)ufPm1`Ht?{6Q4GX?p*miueMQn@^bu_@;rQKRYMAIQDz z==YfA^xIQsNdIJz0e0wn_w1wJx$pqy&*|z`1;vjmt26N6%!-!81W$ zzv-96%&~_2DKjytYy`5;gCEv(0kLral@36c&VNB~O#T#eN4S^NPgflwtB-r1GGLU3 z(|oPqprfGAO3F0c@NBrh1#lzW;B!g+&2n$>(Ki@GG+IGkA*7(Pefh3$a5AZK!qYvH zes7vf+dMtF3(-aWFRkt$k&)552;43+@DGAy{S>RxS}qXX0@7sdCH1H9j?BGex(4Y8 zgrA6~g!hznafyJ(QL^y}_w5Ax78$L+Zr17Yhw9n!7}*|{DLya&$($}PJkL!Mnis;WFNw&#A@;EML$g79|t)TjOj+ zl6X}91F7Rh%JpfkYm?un84Y&zX^7m5V|0-Bk)&E8NP-;nX)gXm%HMdOCc8hwrAkNH zZBFBrK3o6z4LjZrH{9V4xYp@$__t2ejNhz;iX5`K;oi>E_*tWg`pVRsO)XR2PQOEx zsxn4%uUb{7N>riVbf2IF@7;?I+PtGsLgoC&WxKJqv?cO3C98C*8!OcYRmDejRQx$m zs}Zy=o)whrJr6dirkCNd!g_^&h`c4lp#CYPlkPHQaL>Ovw_YZ6LvmLN{|$5z+l{ zbJm$Y*bx+be_7u(fv4@n@o(5`r}@Ra)}pG&C2`|sGVWG;fY__C`{8B?NqOW$xRRJz z_rvY*9qQ5ja61l;@4)?V_L~dAIS}-nFk0+tEHbonTjy!87>hR*hT}kYnEbjsm7)}k zV)g$`C9PXm|AO+a_>Fd7D=obL*h8ct?B6Y!akgb-xpO+&_STp8x@}fRdE_}{ zai_AD+_;G6C&6!vcO(9K{nFw2uWE%bLtlpg8(*a*yVjwM|5U-g|B~r_h}9Xs-^Epn z@O>57LPfY!7{k?j-`!fYz_C`qB@-2*kk?luhuKZK2rgzKjT!CSH5Nag-V8%!En=*g zF6yrLUGMM}xT{j{2W}9jfxDK}Kdl&9kRD$hT#~DK>U|JEy}Tk)-}tL=t+B>pq!78) zpc5n;b?nes{0x}>TDKnt7e_OFROIGpu4!87f6Lfn`YI{hPp2v^r?#uk|C6kgb z)=;gJd*$h?at=xa0(Yc8@KhFK_ZW1pvlK{N-f1S<<}`liEV8@~cPQ_48JKVwem(n3 z=rDHM0t2cZMeJ6+_}^0^FW``#_(G zI(#Moerhp`d)auAiCcCm-n^s1Q91u7!VR&GQj9Gx(?}hmreykjVMuq+8=nx1uD}oJ z0wzex+fjba&=H+}Z>$+=saCN}d{J4!LfrGQTJl$$i+FAIk=Ad zr|wHIz^G=k^)cdsMLsF7#*{y#Evsl51K5fSu^5@i**h@2HESKviFDwbMTwm{?T;eT-2l|b0ksJ%UPG>3`YG z_*c%=HgqB`IEk4Ne-JyHVZ_vGau>!X9P6wvd&l1F${S;uZVfS-QF5DTVM)I{bhMd1 z@15@7%C9fKV51`SrR;VyT0?ZT{PDlkmwnBZ{vYd0C$sf`vsa+|q2i)weYxs3z6AAU z593v8_^b6L-=9m(pZC5e-=AF&`4c-gMBDPUm_KI)kxoDSMIX-d->50`zv*M+{u^lO z9Mv{7Ra)Ss6cbkc=a*@}_ze$8&sA3|`^jDAs*47W!8&z_7E4ETn} zgm)x8Bin_+$V%)hUNv-@0t-y)YcwG%f<*^k3-*RiBl+roI8~65`RYHA*u4(Et*__( z%kKT`zq|Kyd0%!7?;msTclw)qe>d;X75v}ad+UdQr-Aps3;vP-kCdU|stLwTbboyt zt8d0xL*#w|{JLiQ1;4IIEp@Rr@F1pAZ&pSXkGughc9A7H>B|sJc|+xe4UvC3E=%e! zAo=3s*(k^W?Usx^9nif_#FF~q4(P=M*j$3PnS&V2M4mC((?L8WdJf`CQ)r}uXkic~ z1`!!L6Nr|^U3B1e>O)36Go5!0*xdk8JaQbu+PD+-=6?9r@6wcagTvV?Wd8XQWBvu6 ziC!r1Ik0Q#?<5AO#_tFfI|Xb|qLP7+=yF3;tr59s^H~C{)<9%6sW#{<^ox1pY8oyu zbS-;BgIrn(lNcOHc@^@YhR6}OP)=5Nn|pi`~A%y9g43r+L{8<(N_Pxy1H zn0>Wq2CC?pr3(6;(M5*Tsp1!@|1YS5K?qdANL6oE;Gl{Qp=EnJ(r5X&5Q8P?fJsuW zjW<_X=YW3;fm<7Jum!g%D6;Dr=$l?i3OaHT^$ z(^adI`p2WDfF~g26mW?tI#9r|=cq8uoeUz$5L$0a$UNU# zXEA=@e`CB-Yi!bfEZ(`73=_fl$)V0Jf;a|v8rQRxTyT7sv%<$S6fAai%mX6CMS7x|;liw-t83#B{Ru$md%}wAB;X2Lb&X^~g%WJc^{Mw?1<8tT!E0<%w zFl~1WO+CgD?<+2ywmUfXzLg!t-a!uHU}H}pIKvO9JDWX5w{SQOt1~8$#opzCWBg?$ zF8tisdqX%xeBoxI7uiGX1yycu7e)?Mh=_a5_!3mPQBJhILpPc3%B}{`HXBj{{_e{D z!<8L)g)6Iw^8gYBcsz$^$52K643BpZ&y{l`P62)M?4tpvPyscriCq>tBDOIzG{9>Sk$JfHwh%95a|5n@j9feeZ=#)RRHHLQ_ZU z55Z{?Q1=8{8_(~fgWqHL{b~@vU_EkH5RcWEJsD^x#_!buo(g_%m(`fvQSb08mj68{ zE6v`Y(d_e1xXGdCf7(hsd!O+vZ;D4{=X5x{FVrdRI;&!$KO0h~*KUE671e8AJWLEG zmXH6`^m>{Ymb%6p>Bv9pP*;$q9EI?xYd6Ue_jb<`=iDrD=4WF3R}SY(ABt)DM`h)em z22S3?@qUX4OCKW)fp;vm-kIW~Y~HC6Y2G84;&fAjGsPX|1OGe4QafU%So^W@{;$w; z*HWk8{UFnO^n4h_cPCLdF-Fzp#{J**r=h;{G~+{8f5ao#n6KDvQFfM9q*GwAF?_r% zaB4a7+re)+^07gcmm_xy-dFJZh`>qv@O!$!kRQ$^l?{|e-WDjZG{t#=CP1wWDBbN~ z0(hOMvrc#A#%^GDMj6t&Ym4soHd0P^V*?-fYj)@SnY-5+>HeYa?j|T=-3u?n?k;>E zkh{MHdHVF3Mi9wtN%E-cw=t-oz1q zN^a@c)BGQfdqn7W>u?L~eAzT0HZktJNBN!du62N`LM1;7Ad=1@pr%_%;mww#U6ve6 z0xL?6-vgEZWjPM`$hiD5Y|9TY;*mYEt2P(QL1#l7#{EmpL4VU9s+asK68NF~s(IjV z@~hjCOE3zMX9w^Kkb?qvJnQd{?&45?i%)CnMX4#(Qh2j!X7^#fDWmVRBR_p&J zajMP!kE*=LF@)|Y0r8W8M7^NP{<$ zvPB+PYwX<}TI2yCjz?~}1omk8WRVH{#v;E+&2jI1o}_JA;i*9LvcjD~J(d+l2JdBs z-2;nYh4xO+Kcqsb;y`Fs$Gv{|EM#`X1l3{6-d~@T`0(KzQ*ir61^9r}+pojNLBg-DWCbe=R_(g0PQaw4L7+$S-`ba0}SplzW98+usXSda&ZM7d1Yy*bTG<59!gba6B?r*YAhJoi(3&&t(4q zt(MeZPEqEPKH^)+PSbd3R`Ra_+itEgwk;<2oOaQ6%_gI+7`AG{mK;%}tL;;->ZFq` z;E;Wh@AJt^c@eat1OAxZOud@&e&IF4j_YGuz&&8SmZvhRSDo^HmI$o*n_R($fv&N- zi`F-*y;_LAal!{A zuC;BWXAwc2Zv{OgX%Yj02c1I!O)s7WFRqZ_|Y2W zWkJ&`hkzs1)&0A9Z5hsBaUB=$snKZW3M)r*wO0A6$)6EmFNO-koiBYRe2jIrf5-L&g;30% zR`9vy=X_=ojHZg!F6?d50wjXRj%!qmB??5mrB)wVRB|jRY+Y%5jTQ^1_busEk$)Hv z3kl8?P_XKS7$Y8@F&>tuyruR{SSRy3RR=Tn2Tc=) z97Ow=au8-G5Q();d`Wqi32nj~7m_)#fXu-mnbo-5#>lL~gN)4U0+P<=Ku=`;#g~+~ zog=eNNM?g^W72eY(tP)+3L?$Kjgq-wf)+$Z&k9K#Wh5pa!~P$kOL%V?4wQ9k2K}jc z-lmk8+`-YgE2Ptkm)dw9EP4qoGH7~gN=?zpetBuIg9(%416q1en)aP|^lf@3Ci@GZ z#!ktUw~H~dxap>)CSc7*do2xtv2 zbbf+&;i^-)IE@IaDnHZTq4JCYvGSK|+u8icn9Rnak<_W^3}=DYKM8oOfZ4E?<-#^R z()ljv_#Ng-iYX=YaFk}rhxTGcNyW)39r@r*{fQxaW9wK$)WcU5-tW`vhRA9q3``tE z6XTmFA5*c-C|33cwfF(3vtCgKY>4bvp9S~0;66SnfSYD;v!uL+$Q_qw!95|kxxj%f zasVUzZLc<eJ%{-HY{Y8>xB@^@lpi3EgU5w99r*eF|_4RDbU#j@eC&K4RpJ(&=mENz_`!l}Ce*cZ$zohpq z)@Q%}QSTqs`&*yM#{Zk%&*D9j^+itG4CU{BnKWtJQp_`(cL!>sL3vvPWk+2^r{KKs zi@+I8v=HPVAj88gY&!x=(!hTm3Uv6FOv}c>85DIdluB}|tXp{IsQa*s%-oDwCjgt|k= zD-BGSILwm5%07H}^X%*oFX^eFvVsqLj@~X+n(8arlvmuPHoCC!``?us0N$Luty2< zprXjj1LXgJpKL=Oqas^4Baehc1@{ua?n2N-`SAlVy z&$&>XzqcZr^HGAVFN%C2YLr?Ur{;1#T1Ad<$ZrS6As=bTr{*9(QINYAMZRgk`PF&I zPg0SejyKNNrIG(RMVy!BAU{QruL`ojperXj&iBbfeyWPx6_p=w(NG8zM}3!zrGL@-34ygkYqRitK~$uz)qEUD=*@F7Uo`hD9lr z%VKJ%H=%GQ0JcirtKyp*p~!AXfkJayvUZYQEm^cHje%cxLADZFB_CArWh1~@;OA@5 zv%ICplw69BsL0JK68D}4#(B#7$Tmfhmm{f=pPPsLOBH$lDC2w^U>x$#iKr>BRSxn-LH<*a1!_4jP)mnA zz@Ukjk$ci+ShV zr|ML5h9HiX>&dy#c;_X-hvS@=kibTFN9q1?le4X|d9uac5WMHeVzucQ(V{lBs?FuG zrHV|X2wqYKOwj)!4AK92DNqMX7Mdkn3vy6V|^+_f1M?( zYl5!smdWjfp~`4QXMtO%y3~;DWrW=_*-0>61XJLP7p7$|g*_T!?yCd_|ITW|+Cj;>k+jAD3X8o#O~x5BT;W3Ec5V#ZwFSV71e{rViiXU^u2YT&s>X+d@1Jxrm=$Htc=j}^sD9K{Y9ii^W~J(kiL*?JG>(PaDgiD11Q z?VD^L@C3!)0#0~W$eWuR#dN(cNsbhyn-4SD9#I8zTHK7ECR;Prr9g|Zc&G0}EshYS zvXIhXN9j$c#n&X;P1Gq15$`hyct%NblnCtuA?H{zy#5t=J-q;VJ%N%IUXJB{`Cm?w z6?{Hw5V0gVTIIj3k@a&Ot4M5)d?JyZB%|>yljJc)qKqVW@@P6cYYg0;hOSL#V|YSm zmkBuG?LuLHxy3btT_DLx;^Y)K!5yY#2(=7V){jCVA@&IF&7%?OB0|kVLfbe(Z3Ue0 zUXjX9hEP_}ElHjtO21d9L(RD_K-A5xFHI}vQ~|99sJda2I#)*v$YM>kfmfEg0kr%$ z6N|I7ewov_e)+W%jeHvML?NCE;(~UHLo9T|dbe)rTbYBz=8flzFnF%;^cJ3Y5Ca;< zmnuftT@jPIswT%8T%9irhp?%$E6g$U%U^L;E}NH_{6mU_1=y@+vvU@k#G3O@2-Ays zQoRlVVEhM7*#K^d0?p;ZSZ^3}T`lgtPMNY-`~%L;=Am8kYLys93H0A`v?Z$yYkx+K zhvMy&snKd-uIH8Yy6RV{|1WSjV>%aam%K(;wgd}h$5W`9LUHd7uuwHrntwsz#&ZM} z4zagO&Q#IY2a5r30tH+&eIGAoo)e>(aP1`A^@5xYWI+@yRF@K1XjWto1t4L)Dn}3} zP6=vP1wXQ!z9*07^fQjfvA4kZR=Y0biQ2WbfD_(pC-ZG06(Y;&J0$NAgDp)IddSn} z=4z=!@-BVEH;qH>`|dP22taraIQHveJ|&R-9WO&H{k6oT z2eMmOYNdCXu(Uo@+@Y}NzkwP|aeaA0aql_B{df}J_B%`}2*Xloa-ImSi0NhI6TvwP zEg>`;p+od8AjGcd{X;_IMuP0LkkAO8AhfL`bd{p~azY)a5^^R@ZAoQwL%NFQdsPsH9^I~OSvzol4YVupcvGx$vr#noj_Ghl^-3))FT%WL*D7#k?E0xN{5WW%cKs211j05$ZnNt|DIo3c z-WVQD*l&+TpbOEw3Hvcm2-{!432(9N`XN=Jh+TJ0el0F07#EStG8BIaYjUTonoI?2 z!($UmN21+FfVFi`MIFi`sCTIpB)drp@QsPmQ- z?V9{v-{0eVF^A{OcN`fH~&~gZt-LTnuAa=VVHBH#d2_D`XmDFy$Q( za5v8!zxh5ueKw$gJDSa^r=$yoh!Uuky`S<@Pn%%mpgShFP{D^)Fdq3*7EDB2A1*49 z)2QFJev;;ar3dlIT|r~fmEXON0hETL)PI8^#*F@VOtu%ob6IsmDaS(nvEWaZg4Epwf7CVqoAUw5?~+CCdXg3| zW%~DC#8t?=!WAV|y4P*X>iA#|Z(N9Bbh^@mPRk|EKzoSv0FlmhAMWuq`-BeMGuca! z+ZvOR?zmH+kN0p6)5m65G4w3Vv;i}jXT7Uh{4{zreJpde_yfM;S+~oxI#S>0jpui* z%900(;_OPPCGtFw0Y$|Jqc}e&ZghDfj2l;qV*ilh6i4xT7dLk0kAFXYo^64$WQ9l_ z2&tg^{qz%14dQtwK$a!@3$DFmX$*R=isOMURhBPXE+5nThW?Bjj4kzV9cQEhuPRFp z7J@e`irCRLgIf9%;LB+cy*&^kubE+8*=zp{nwg%sNb)ctKM&-^nwcp|qMQ$pqe7Vm zUsBCVN8T>~;?ZnYdn8(FhONzJr}Bgk-)z;;>&74dWMXT!274t(i1vnq%~)+Rq;?Gh z&n9x2G%4>#>}jN~9|pQvXw*p6^8~54W$lFb1%LeCs7ghGe6QqjqBsMJ7(tC%k5in@ zFdc%f4^-YOdA#7p2(Ga4bxPMlt6XhgO&sC8YX&;fjXK&s0o2y0o3_UYZ)-_hP$i?P z3r^Sl@pRL*{4k?{$mu+q0yZ0tkT+s9Q^4;|0o4Ldco7Qw>+$3w^`m$4bTM${L6X*c z^Kt26slVsRP6=wOGmhIkd8S}T8f@rZ`_ytIWH{`U)xOWc+-0d6PHhQ2QD@7Kg#fZg z6BBzTCkj~`L*^8itG!4Y)ov$#St$O$WzvlO-w*A-x!E5rn)v@Y!t6iK+5Z=1JHO$E zMeM&{a*DW^(a*$x>oJM{s=wDsPJH=5W`u9Qd3)#i_`Z2>6$R+_rcgwi`Pgvs;%$*aUcYdEm_x72^)M6tRqsCWA( zuhw_JTpVshRsSR8jfSbhkoWE*+4h(zB6SccQn@2n&>9AMsiQ)hC61GbX+P{Tgh#W) zzN&^%3~QF?%oFuJ|uNM6)8i?8_%PW`cf`` z4~jEV@46a4SilMId68;qqzd{geUi6{;;aMG%~bTEV(#82d57R80EZ*YeOMM^c-pSo zjz=EUGsD`kpqs|;QvavX4w0q!E(7Y5ykA&$2TKv%I*VH1%pW4IK%lH|3kCcNnC+mAi{%u1v?2D^$zf1iO&MJ_jXYy$g z87(4l?;@)zOZ_?l27HkY(s=tb^(r?DLVf)oB)j4o9frKU6RIt{%Fe3Jz#ElS4bKs4 zt|)%pNBHuz6Zt_d8sV}WWeJbwC|4ktKLrDrqg=ofKKY=4IcJr^{#yLC zNNhYJxmXOGDF&41elc4=!c^{vThak@_>%ME$J#qe2z%Isv_H4k;uv+ z7?=~cqTlcXRr z3&q0yOc!sf1bJlKyCG&MI_IJI4@D)&XVfRt1yf$lk{g8L5{KgYG>Sfh4aF^hX6s^Z zfa2~D#W6zBq6a9-9g4#Veu0aAfU}v4o{<|ij}ODr57DN?I?OH%JGG^N~avQ&tp%z>9o+A<>9MzHq+Yau9qKtj-X(4F^L_edE_ z+}i*PQel?$mmsN>_BaMIrHzopTM2cQv2nFqlAn_TMykN-Y;k^-DRL;qbzH4c%|bsu zK(FtH{#c>kUg-bb%NYFg-VoJShZw4;aA%?D5}=5ND2@|~&O$L86zs23fdc)EN_H1W zy`yq7xkO;Lqe8Rg<{e!u@6bTUWJL0J!rW%IaS|{Q3G$APGFu(tQaPbBNM<}~RB|7Y z+{#FL%Li%v`bDZb_vXQ(i9brb_Y_o9S&_DbigDOK%wSlnJrPv{A|k{6&*(`gG(eF9E+ zXYt3MLe(th2^S@g5y@6Y()-7Nj3?|5i{=SaSKCLMY4#=-b-PBCH|ZpYA#NmB-*Dy8&^A)h-#m~{))ew3$*Cgs2+dkB9@F_w2f_OIa8BZqv6Zqs@V!l^rW zWkWGP>sLenQosFCu6%~Vl`1@#!bKFxo~yhe0lVc}=Wlpp)xOxStaR8q^sa0R#f4a- zy^gEgM&&1|EfMY1*5cS9>a!#jALi;DHF#c)~nAbXi9RHsKkwmi)1=Kd&Nnj zTC6ogKmHSjB)^TlAbGb?Rb(@q=@^H&Bjsqa>=hTvR^lwSK`k$yjmA?I&vNx~uh45b zVlmEAUOTgFuqh7nm(06dQR6X{dYDo)7hfI>J)2;SR%({?9eA<$VvtV=@-hcG&mg^T z01K(5ya#f?|0(cc#!h4$F(jxjbz!yMSMP#qjW6xWqdD=uG8~%rv>_)fy$Y4-R5oQHZ5D4+dNy5<2H9u zg+jOK#ixwhte{7p&(gn4exnl_cd0*1fE#t3^T!HJj^mWfyG&MEBxI3nri-{vv)eMR z^BHbk%ym@1YGxg#X^>na}I7-QY`3Dd;vg}+jm;oLhY{bnY$fICzMM?qPgHn&q0a3gvowM8 z-m}+uu@ZqBl5*A|=*_PZOY78huN4*Rs(#q+7i#w_$Y+uDf`JmWVDUxYp)#SJQei7; zO6E04ns3F>Rox_OD zsqrb9ceOrlLSxm~-65}}K@Nh%Zs^8Zx<{$YVUXYwojZ86w*PC?=r2V}79>8BQWKGB z0#101;PJKkGFY${klIwF7Iif_RtwU#-|y2r8Y%0~q~lSiCRi|1I&Iq@6_UEqky@_C zDdF9r23Kq9%{kr=rD`cs$3QA*R9D_4W^9Q>z)WjF^mfc#hEl8IZ>w5ZTY9#h8wPc( zY8X}OzgQC>Ppho0if-6l-j%cDPtL~D9{EFN@uPRV_>C{dlUZHF`4iwaUo-8u7pliW zmFH_%`fAG2e*V$gEPelhnLub$fwOR-FcfwxcfU*hCCBG8+d&j+#4L9fvYu)d5c!MM z*b!dAMi7V|Y`4f>_1)T66p|C%n02Qp)DVb-ab`z1J?$Iue@x4XUf4_5rFuC6Qhk{uZKZ^U!swAQ}E%=h66EC;pyC$;O|~ zX@I|{1f1~dDeUi5z~3IC{7e^9#VcwmoGLB}NzKY3)%}W))GU!28j`xwks9wvRf^Qp zR1{oYi;x3V>?KlzAr(}HMK@Z_bV0z>u(u$(I%X#SO}@h2kt-bXABHJ^1##p`86y#0 z^@qqurW}x08D=O8vZgQ|*#Tqgcd7r}vH8p%C=wNr2wII9Kor)z1JDmE35`+jKB3DU zWEqPKsU8eQGZ|N^5bn=*l_GN4PkGxSXFB>^uZl2Oz|R7VG(Yy%z|eB)-1pRD?*D_l zp*6^AK_-Bt%Dh4lKnr8{wvbRqxiF=+kZ`#oMxccb`-fV1dW6ba%ULqdP}T_L0pc{y zWhKk}%Yn#e8fs-Xh`n#zYcj#FrWdgjO`VC?b3x}pDgB&HulL{#_FpV{H^OMLgC{F{s zk)bjwh+ zk$R3N#XA8L?zmhSL=roLr}e=6hZ5(sK1%#G}b|nasCkDA&2peD?}C z;dPh!CJ`dj=A%2%EP1~uw{&t1gD0(derRBp2@UE2L9N?Sa^>;o9R(HF2AjS9r17w- zYxa6reIAeeC!szT z$%eNJ4wDx%cfZbsgOVJxJ}-I?b}Dd(l=sm!S-jmRL%bx|slY<&I#q6G^P>rf=F45O zY|hq*4x!E0%H|z0p!xDjXY=)@FK=54`xje`B@iizHd0GOs-2PY+Uz5hDvM2d{b9;% zXHc&Q>Z=`!s3h{e#a3Hcyc#}?zh}gA;FIuoKab{f2}3x)j; zEKFtdw@j4J5#@N~iVUe``vs)>OS+8vm+@$%hKW=(BsI{H@|-HJp|F28q|)whLM|7n zR*(u(s7vF52>KHSu~HD9Z*R=>#06a2>Qbnk^-O=FreSKSKe^J7yJ%oV-%-(rR5aJA z6bG&4%IQzMW)*1(mazWBGxQ@e#&}<-MuV!L0!A)IPU=RN4I&@;1$*Ws4}*fVNp<60 z5)4;2&L5i3>{?OyV>=1BT0vkC5Cu^z^6OP9_lqs~_r^jiuO94#3#nObg=R9`Yv{c3 zZsE=iAB=;UzSldYy`_54B-mPD5#|=CxiO9N_flSPH_(RFAioym5Fn9kw52iTk^ey- z=8-pKd1Q6GcYWxQTM$0{FVLlV(r)WDCQond&h^!l?(baEn`W_alr2VH?<^&Iw#A2}$W*dHqTNk`E&(8UGTlwy)5;AFBiHXZ}m9(){f?|vv$vO*w^IGL9cBLYH|+y=iq#1cNc|v zC`UX#Q9p2FR=kbBmFqP?`zew5OB3-&+l zMJCc#ygP^Ogp}qG$7eY#4SY@LuwTg`ZbI4S5Fa{+*vC2SIwdE+ThIv_cq6sHNL^>7 zyqevlK9_(jL`ZX3gX$}&GX#~}e8S%(p?Ca!9Xjldx%^EJ`D?EV^(#6s{#v>Ub*kg< z2@3lo3-~J+AKNGfFr-S34bmq*lU}Q5maSDcoKfoc*gxNn$E)Z#isoxj8n40Wi{>2?aL{cRH?`@{R}Ev|^Cw2(l%Ri1vxZOhkA6+R9ZUXig^mJE0>C=+~km zr-kl=1RbSXMPIo$=X{bGNsS1AMBKnoWm#c=i5MOF|A&1}dh5TqC z&uxzo^mm0`8-{BnrZNoo2_0dHZ50)09Eh z3G#zB1(X?vvm`LH5Fg4VVE$7dk7%P$at`VuTAqA%Cml$uq zxU?{(R4r>5?r}tvl5PrFWmQ763CPqr{K{z421%(yk-!aU|Gg~W7Q()%JF&5Zr!F;mgF zc}y?oF{1>W@K&QI|6_|#c0NYQJR>zvq|P@|-npHuI?|C!d9#tw^lwn}1$6{a1uBUg zo#C&EpT^%Jd3lDvr+75}HX-QvYte!6_mksqmVgu9V-)r)3;0_o%I|D$s%Rp=2~<&v zG)8J=7AZV>K}hOZsp6cF)Ps)HJ&x3;O3+qY2nv!!6LPUgoe8O+OZ(Xr*(Dg7F^HE0 zG1xKlw~OQ}nJ(=WdJem^@9q;+7Y)=}(d8;yLeV@8s%{i^X?u#_OqX^$aA%D1x=_8i z859cA)aHuntpESSD#P~qmEj?U>7a*j5XN?u;e+h{w=w&sD2#CY-1ej%7g9YqGl%_^^DPUJ(Zp8LVPrLo32-a@`+z9a z_%RoVCfy_jgMEcAR|%IQyp(Wi4!gc^HwSl~R^j)4GrgA8Tx}9Z6O_ztRF~mh=}>F! z*AK$?&sJi^JBnh)PV{+de#%=5ho&fl{7H~k0+~nI8dXd04rRT`O4gfj&a!07X)OE8 zDk-5D2nx8JbDq(B7n-d12`L#^^D@9X8Bew_=Tn8clO!RC4r;aDuwXf6+B)rd2 zw7<$CUl0WbNV=#nDYJx_ohZ;s6^TS!hV zuJHfUN3z<_<^bnypQ4_p54kzCH9Xr=GVgILq<=%^hMRSM8p$t!aGcU z+LNlA?q(aQ!6LO}6AAB~i;`T*nDTx-H(=hNss(j7PdoO~XNNd0Jj==GwoztSQd{UnY@;>a@UlF=I`dSi^9ol4bu_pI7x5Jw8)ARzKo ztQFi9s5N&rt~c8J%|;4z z<`Gnz)A;C;npXSeGkly#Bt$|P{&N3qx`KJWjh$P8!3GMVQx!HfbAH>|#_5($Gbezi zsVbk%ly?bGLAKZ`IZi;GL03vX<()Gd z%o%4OO>S3Jw^!%pdB>>)`@f4^Qy(mxFY-kzvWvbRTI6+Izv(z-v&ofQ+tq^b+H7)r zjVvUhE9o3@+(>-2e+pp^*FHhc3*I5(JhmhA&pz<$r^Rfrffxcgv5XTrha2>wLbPXbi6>cMk8C|H>fTO;9-(wL5aJRmVT5 zY8ctNs^N@|c9G7}b{$j??E?R;s$oFen#7Q${9RfV_xZD`Cc%Yf>|>q=|JCsys^cHW z61^5xC5Er!{1Qm%nj+Q7aV0y|10wD^umZW7dObci{f)_9EWW6^Z|litOAoQSg{`IQ zZ>sbV|M1so4_KLIZAE8PUF{|e}I6xa+CjC-TLJ0rN4s7X*`)tOiW+}(1CgtrIJIp7P^;5P=&5&C1S z;mpo$l?ZfnH^pJDDn|U{Kg8ni#^Mi56G0YwZjth$=%evwo>_N`I#Ly-y4xroiSkh1 z`Vx;yc@A{R-yw$oZ(6pX=}hxgEelSOb45P^1*eI`x4LY@QV?AdNgTJLspY~AngT@$ju<4XvQfv7K7H zZA2zR#PFxQsp5vOx=Oh8O)trF2H%9DjU; zmd#YTlo5OK;gol{sM^^6FrBu;@`rIa#IFDNhIfnQ!?jPK8 zQ7p9}R{qk(UuZEW)3V!xxH5G}sSbDvS`+FOUxxLlOdZDS0+q4|DJHoqPe8GG{2x>4 z0?e3Ld`jD@_;=OuvpZJDH^kz{f~k@Dcc|es1D)5r!_z?ArXy}s&VT{_b(*!}VkaHiRu^}5s8P@%%O-NJ^q-{yHBL7#{e^q%Xc@cO z&5Qt7l`p8>K9(5Xkpcp}8qlUuLiHAw{bhb^#Fh{lJRvlyiGj#XnUb$ns$6o2q(d=ZH#{wR?mGN_k=CzrY{E`i*AV#^M`(sc4J;O=?X%dcO%#j^+5Su>_2C{HoyrN8A-h ze3D*g%Bx3!jn!wZ(+}47GHM3Z|JTm0}WAFRpqb#nyXG0c3NZf!~ z42t@oAVDAof*K6iU6Q~?Hn2j_SjA0977_``c7I5)h|oaGx~8RGd#kPYUS6-g<@VZ2 zz1E`raT7p^_$ykqQQMkY+ir|)qqT@yyYKhRoY{SLlNEdW@$LIZ7dG=e^PD+z=A1KU z&YYQfmJmYdXE_gHlmtHffNJdeKZCvCnS=T(#*zx_Zh(b5SmY;qb3z!t$u!4~Krc+7 zCT(!C4ru0GTXdo~OX5d4Ra>Y)>Vc_zyx(;5u%w6%Tp@1MOmv>4wil9EOUqtSt<*G1 zZJ~Fz$yfS55&QIeT18TS4wA|;gSaSZ0sYpcn@o94j;kX75^y#=8QNEd7g`+$6N-mc zlEzi!Z^sk(&p4lkHH6q>3#7Dh+;v$2bR|1kRe{Ja{~=U7X& zn#M`Yk8)sr!D#vsLF+$}5NT})zmj}J=h{C+ZPZ1;hzE!fu()6bx$xTPN`p&HlZaqn zA?mf-th%I6_MVg83*6_7zJ&QlQ-Yn7P{bw81qeXj_0x-msXx1MdEDKn! zs_4-0xy~PDBO4F#)ERwL_F>!d-YVPjA()KP=n9yQd!@^9zz9t};Bfx16!3>!_)}%8 z8g!5Q?Qpg`y2({`0*i~ME4DkT(qzlPlCv%PO*b-gwLwkI_CM6V+>-rc>jbT}7(T~y;rR|S3? zID8f+Ycz$j-T$=Pc7IRJxF_L!#g1MDSLh6$2pV!*6?7a67bn2;nkWv*h46Fk@kc=? zJip)DZo4W@GCt;xs;0W4igD5#bHm(_f+biR&Hw2JkPW{qNYumkIG67E$1$}DgX43M z^b!3vN4gsB=#}*t6&qlET3nGU@e`=d26v>U1@C{N+1Z71cD4+T*KrEM(3CA5B@Ixc zrhL@Rq_U_%B5i!oieum>Fx}FSr`E@yeKm_6IiX%y!#Sji-S%Yw zl3baHnudM}XmYiqZx50FLFkbOkmY>$^MoEBhi&)&K?YUP;*K`uINw!o(4j}61+^8w z37s$JcueDD;JN zFm+fqwA&(G6**MJ?d6iN7zW~cBK0O%)vrh?K$WJ%?wK#8`x(dqeFlWAM>p9{gW$~# zu1Ga~>+x-Ib(P4N$8yL(9(^6Nt6+2}&)i=~)~Z+2s7ROk_g!&MW)6LN z+|kw?yw;#Lda??=#v{EhbgVu5NZ=LLYrv<_*(AVR8VyelQ7{7gL)H`fP7Y1RUG3s; zA1nedd|(O!3V{z}YQ&`GXS*gwRK)NQNk18RhMyvR&wj=GTcUv>iNugl^5 zYNttw@PozGQHKFAA~50lX4|GGzAQo zcVsrguBvXo1;5d3lL3fW0KOn{cYyeRqbj8Le*n++>Tee-nVi zZi$1&bw&?$xX9I2EPJ5`;_QQvfwe|rwNC*8o+uE%R}zYev3KBMpj<#JN3!=KV(C&5 zOR|Zimw(Ohr}{0V>B%I`Q8gk&Q(uFipDR*~K{~a&W4umI9jssdG_@IFI=sK6Ci)hg z+=EWqc7I5`AR|@wN@N(OG0T7DESpYcg&(}2wbW^))OzrliM1fV8X@yAff-s z_>!aRhckDAQ?OTvaE!R3Z$R&DyFZ7Vxcy#2R}l-L$L9;x$KHZ&%C36|&!oJE4x@UC zs6p*sB!+j&h7RC4iQyq&QVtYE4L=X1DMkDSg7jl3wC&zb9Sgao{It{+u?%gJnFv)@ zSic8UVQ)Vf_Y}8J@xQY^SitZ;5zaT_x;rUf=L-_&vg_34b5;>s_&Lp2Qsf z#{fj&3a;bHtk4cjX=(sMmNI`o3A`Kc6{aHSf;;g*)p{!-NB@_|CQ`|pFT`K6aOIfr z!Vt7=LP7?u+dhNlulA@eJnYfafBQx9$!8KzE^#5uBY*$96|;Iw@XhN6uE?dX$lT$4 zSHw1q?p;Omk{mTh)!i1BI0Q@Fb<~k+e4#^nes%UM=yY&)@IG`n_r!(}&h=3L#ATxz zetu$d{4QsQ?}wyMDnv#vX|>88-7nd4C0*0#bzXAzg+9d-xcrxii^RS;fJ@}lC`dCr zZRVwZbJTQ~9QdI#(N28pq45Roh$F`xaTSd1fBi2!{IvdLiWj=00Yt6>MbeRdNzTQd zl1llQtD?xZ`xm&bLFlimC#SaJvF*cHTiS;fmi>+*_!TePcK=8MSLSpblD?>|dowcL z?b42^ZTGbjU|G^_ZF^VF5uj6!P=hPlRZjpg@^jr$M*-e#gueJitXP6$J@{p|g3v-& zyqD^)sp#AO2dFyMxWQp`ke#YG9LDSh()@#~;-|JddWJp#VyP!XZ{Z3a@R_!*pW@0L z{j|jXitUR>>9%_f=Iw`hzKOPmjwkAQV*4M^32o;(aFk;=V9DmdmO6DKZ@w|}bbxXvdCK)CR)iS`7QYk*16B!>TR)+lPl?XpiW4D>tSW{US~FFu)_)3k{f8WJly=sa{SK==gVOps8?fku1)|CU>A*T$u-Y@= zinO*+P$SY>4=atNp{9G~Ab@i4zI*C`i#ONX_6&fb)T2El^|^1PK2x8l(Tp){dT5Asg&S zpKVF=YjQeih39&#?!ezjS$ZiuK`RoAFJAu$arO<{o?j6Q7hk*%_qIJRN`6|)<-`0r zGJ)QttT@3&|AtHCg{^7&aCBV6g!=dZk(Y@4#Ye9W+ ztqhz#O}gJy(~ad3^xuj^ze4{VcJul|qVr;1O?F;;`8vdJ9y4ow=v-6+F~eJo*mtQq zi=&=`uGhY#?$N{>kWJRDG*o@U+J+lTXbBr}Iv>hL+%LV1e)|0^xQZvNl>p2NO@h(G zd=%HiOR!!@=_1|=RFN#Zh{h%|kC7G>MkpFe)d>a5e;0}xd;4{Y0ga4yx1|Gw&@*-> zC`L*iayN5aMaI9J2=|n|Lej)w_69{!8nAfkrchrs7Q6l!{eV^-Pp8PkL`a5Pa|Jo> zQM{xSy9wZUwqXAZ$W?otXez&4f|55MI@29}stV`~yz)#3L}srgOju+=Q8&dyX*S+K zMAoOwea$W(lyj`m5`6!zqvfQLsUP$BMvJ)bn-;gVs`aeW4WbvN=f5X!F>ns9CNmJC zmFsoX5bQICOQKh<7vgEc;Y_fU$G4;tj=UPuWmUAdD!STmMthyTu`K*|b`4Iz|Edbub@J^VDMb(M zUWNd<5z0r@GJ2d`sc}!xn!`$$Q)c6@!)2@Lca8fgWnb-b!T}3Utg<~c(e_Z*a3OB9 z==S>)ZQsutwpK+aMzg9a`fPjdCEM5azQwltK3vt>?mrxR!AUK2*zS0YPU1;L)t>qh z>`=P2mO5fh#Q^%^p2OjdH5DfbcF$YkYuT5Rr&8nghXANlGHg$nDhw0}WZ-A)GqfWG z{!(hZ8h(FT#fd@6R2rno;mL$j=^6DHL&k^T%R;~2z#=S6HUd^~$=NTcGxu+1N2GDEpy2l+YteP7x?Zg zBu|&EdSGZDz@x`f@`i80j)iPM@vZ(Rh%bB#M3AB?V_4lJ(TU!CKc zG%&n2O|?;a3q5+? ziz`)-Lx#`5EwT^}vJ28zxE{K3Bf>}*&qkRr`14Aq6#^c{{Ag7HwAEFys=(Go>V_B0 z0pSwVPP4n=@1V@rfjT^s%N(IH%TWePOUny_ACD1JB+WzY0Z94lS3l`1~O1k!|@JE>Of3w+qP%yjmVX z4h4IrgvA{9Pox*h%||G#}Hdb!DecSUa~fMKJR zq~GnRbiic~V?7`dL+$Bcnq1Xz$a@UW(N|sZ$7)w224qEU5q^ zP?GReiu>92JT8&RK*$h$9~H7!3p-%~29WGf$(V|a{lGcbp~&I$(a>vTjcB0*Ere!; zkz+i2J<|E5S0UgA3K)*Y>0=*qVn7cxeYTm{OM=CwkEQv^2 z4hNzyEhl_HawCv{2K*Yv&j=kY_5DC*bv{VcN|yr`;ond(Y|eh^L%urvHLzL77o0BH z^LoNCO|)eIM+j)xh}*{zvm=!*(!;ZLaKQTWYUC0(tUsYE@DppUbPqszqa~=;qk(r$FPLz!|lOT5`afm|I-%InV zMYN8e2$2-f4!W9h%(ZGF9^goyu`ngz@|DEWZu{+@Mnd&2KpT{kfc10}sj|u7o5z|3Q9od*e#b}E|13$l+kTm@|GQNmU4H`@0$y7e0}iC5QkdW;`T;C$PZ%N|B%wqq zOGhzMuB#?vJ=DNtdk|{tw!d%rij%ZF z<=zE25s@yk)2dxPglNx$D3I13L$>Dwl2EsOrf$zG z0Q{)-$cmK8n%XmebbBNqOp$KSLP_%I_JlqK^6W$&!nY=N8#0D`og(jhG9CqXFG(Q} zEEvwBh3W{|d$56$jAB)qto|nCBTK0EU^CWwV!FwWMP%HO^e@GlD*p*FpSHwS)t4xO zS%W_RIM$IOn;TMN&zQ97Cr0`c+4ZOly18keJ7#Lq9MTh5($psojm?q%1QuRVfB_)2 zj7LB5q(7hC(vtQhD*Gj>Ds)BuOJ1jzjB16X=khx3xt0_?m)EJ!KkKLX zz^BM9D2@JU@#fAQhAV0#YEn-F#1StzmQxYz+&&0~`Q!HCPeFnhr7<(x3}4{7ndRi+ z@FIIMtgq#dg-#2}yz8^YB7`kcaF-sJ7@mktlg{}QQu0`Dx(C@w4I;+_<_VKVwM!OO zyoO>ZH4PNK1evGdr@5T*7iFZ?LL?~-IL#G(fwSq*II^YqP1zJ~*0MKczpk>S;7!?2 zscb2AQ?^`simsF*H)a2uf|l|&W$#tlQrL)MDgwh{S2Q8zWUd#vTDHmD8Yw6_8FodL z>@F-ju{hYd<9r>DmcmPx$WKb{S0o{l7$yR6FKC+}1STCAxwn_NPL9I_NTJOE?ohb4 zH+8_lc;mprI6TL<5m5x-S(lr|rS?B1=L@`2f>kS;BOtajRE01gZOwFcy=HTEy@BY) z1K`sYB9pAi z4(t;{82CMeSFprWB)MwByxV?;Z0`!F0XTa*P+PT4%`-AKE7747_Tb?hN%-C15_~aOp`LJ_HUVECc3~?v_*LmYR@q5ybRFy3iG)g- z#|T&C%gS@fQhJJeH6SMM4^WYK;y#tXdT);_I{&WUlJwsLd%hYYc8_4mY}PO6#L?S$ z4+?QpGT62|3WQaWgL{#nM@1@&-I32?jJg(fsA?GHT3pzg15LLE8)mJ5vlBi`?ZruCa$nw#tvDeYrlLT2g|s9uM|4g z(-J)yy&Hp$+S{TO3O>vL~o_gKUEI3br#@!5F-CD1-*#; zPsRozS~={+LR1eT{|n@D+inyi9wg%blSyV+yt9`>o6OPw@HyD26kUwC(WDxhyu@ey z$7NLI;rbO9=9Z!sbUJI<2pZ#b&4Dw^Gg6*R~Y4s=Ux#qsS! zWj$<`9BbE+i;iJ|LW%j``;BZ=cp`qv46~K>v@@1MVF;wVC`gY@TTLw#M67p5gV>TO zR|;HFSlG>_Pq;P!rc;R}s`Ty3_|v8HxZBd~W?Y zC4K0aaB%KG^C`>`u`UCMi=sN1Vn*`sL+Rmbfo2j>8nrKyg~nXbx#m)WkX5e%-ne~# zIb|%J2o}+klAIw8$KWJv&0>O z#)kn&K9&7He@5u@1HYzrUnkp5Dj96RNCTdMT~IIZ?6VED_JDoD;3U=`DH_v?Ie}1f+uqixOChI;ioay6lyz?loAgdC3_)QoZN7&Z63;sTq7kZ>g?$dHV~d zhdZ*M@DfRC^-t1q52FfOqai%E+S%(NpQMF;g#-<9Mh8f*%E?B!z-j#86B=Jcd+hsS zUW5RnBj9*WRkX+X?!fT4DuguP%s?00=qO2OX0g=4YQQ*Qf-ZjzBEX)}i?RQlE~8Jy zK7e(tu%3;(o6mCH=^EElwYcihoUjelJ_^&ceWriNpM}siHm1~KG_S8kRzod#-QvOm zYeNlG9J`;8M}Jzd-Fo*UP}eFPr|Gt?h9+SoZ@>Z$et+Q-sxU^Hj*u$UZ82q_iz6B* z515*^YeiojzK{%DC$)!GfaOnh5*P>Mk{i2T2_sPUu}`VeHiq3#!!l8{+_vW^T_wWh zLx{hEL{%-$C(7CdgmWN-_o{lKq9I)i`KtVxg zEN~Cs9JS^EK}9TF(%s?!3Rlw$uHM(Oy5o0o*_AO~EJ@0G$}cj>vT@9$lV%vbyX!H<$#kcso_q;EL{2 z11Gk~y0PcS8O45)S9VO(`$gz5EY{6=ugFif{{aBBU8Gmj>E%N>CYXaDllZb#`U7&+~{GP_mtIQCrx;~B9I0nNEfI*aIT5M9W_LRd$9=p zoEPpvF%fY1i23}RY&#H9{b;+p!rDpoqjrLHN&@Ig8A3U@RvZuK%38@pgMEqpG`8;V zfYRii8r$xF#XW@=s-p7nFASTF&RYx9)}hascnDSCtwTE?=boZ{wC`YRH{NE^@)9Rbbc86S(IcRPKsnw1ev6Rj3AoQFZr9OG2JlmRXkAU*tEnvzZhoU~23I z*v$>+2Cmj~J60%#fhSQAT9w$Rbr{~(d?<@qUI~9o?=Qk4cn=w)UZ~IMHE|p^Is(V; zRoiWTtd7avh*nY4(ZSHmXr@78Q!E+&CEdUgE5qt8MC@2AH#8XT=r#2;J-h}Qj$`0g zV)S^=4PME?&f&(XqS60n%U=GNQjDl#5b z(%k2Id4#I76nRms&%bQj^J5YQDgk$`4Z76XSK(^-O3d1^;&nWXN#3;%I`A<+p@G?< zDufscELf3**pKBN?9ipOXSJS=&^cV##p;RM*DWAA<R>vu=D|N+3CH&u(v5CA z{jP?b5HH39q7b1iDbpj^AcDQ4l8cB>&u6gP=ca+l5DmsX5-E-{1LtZ3emre)rq=a@ zU|~G?E-#`R%>7Uut|QBk_j#Jk()2q*C)8hbMZPF!x6x-F`vT3sEb*%`5UwtVmsQrI zve1hd=IT<8$E_%*wqd%y1~{%jEizCE^r@jg81h8Z5>iU?i<*wfa1AT~?VDCeR;21d z++HU;6t)lJbYAR!^cux~xFXS?#BSlp09baq9^Z8cfx`vN+LZdii_lC%hCX&aET^4P zYM=3dAk1x|`OjPk)^^(uQOue`7hl4?l9Yp3AR}7XA`d^X95Wko*5E#i$972;g4wVh z*0V72BCq1KWdZuy2scM+b&sI_>M9g&5K4ONofm*nd1BPeb5s886D%iVVU%9Xt0h4yVHj zquV_v!jm0)?@jG-mSq?e4@^i)1HNOLk+HUpjb%n$v~DiL zSuz%pkb#`P6|KXuL^u)#4Bfr2Kvb{LmbvI#*dvFXJmFdB;<0Er9ep5dhL{qRacBq|GOpTR%0QP+P$v&wlmqS|M4F(77)oDd8 z-Xnpm;W->Ln@SuT&1m#_X(w$}CrMZi=VPB&YH4OgQn4|Fs5N&o{8i6+y|S+}d=SZIZ51H{eK66@@aP`-L;N38dcQZ}^I@feUo z28DV@&qMOww)<7|^0>W7)?wW?i>M-#EIp(f=$4$L#9V~LfOwZa<6FuSsHJnh*LZL& zQEsPuFGMPTAC>O5e}%%UWFp&eFV#uDX~xTeF@$xRXZq=TTsC<7zQs-BDWlB(uCxJ?J zQW&dAV6S^|gECg_kc-(^!BD|qxg!lAxBt4U3M7q{+(L`S zgT)D!@E}XQ0zMsj)rl9;tLEw#B;iOQj#J{*w6rvUVD}3&G8(Z~Im*R`jv$|H5jfd( zoK`4$Xy23EpB+7)nj}rq_30W7c|9l}Lr`CzDOKgPs=eQ&{*JW{4|D|Qu8@zRKLeW? zdg#lNmOEzdL{S>D;0NU3y)h8}a3Q@y1>!ao?KtO47^Sg`k*kGKQI0B%Y7~uoerMbB zq(r;gLwFj-7C7)q;YpXEA$B)Zh?Kg4q7!fl+D_1YY;3vUokP$B3(6-np;j`y1S<0v%Jdp5@Mo68Hm7Q`e)PqO+_9(frFO1{H?SaPg0GCt9zvp zJ1#Y7rC*~(k4-Jysh@PFKao~~Dy&a`qLdd;!0=RTQlF?yOWG66qon~&HOPtaJZ_&s zUAXJB4!yoTWZ;EHKcJo{wx0_%!S7AYpk9fKc3ePahP)X%Pv*wHEBkI@9sFx3PWC@_ zKa#AkwCiDs76EbFZGQlM@-m@G_7vTz9Dehbbf@0I8UG5{NVQSp|PgEXu3!x~FhrSw{k{gvwd zZaCZo^5C0W7oP)4Q#L=L8&Uj<)~jI%;Z2*iy{P?g^=eT`DoW~bB4tg%u6(BfyqFi# zc6b^}XP_QEZ8q&hQhoLm^);yar21v5?^*B|^sEiH6E`AI5a4PnGLp}bdXXNAE@-Z|l%8x%U zA0I=>UHXwq* zJ4M{?L-YBD6@e4jr(JIvs2Q5KcN>zjqpryAne=Xoxc!zhLAM-0Nk$V$M%~tSwTwf7 zv2thkm059nA83I-()_s`uRe0mMK64U8HL)kgIdqSns@AhsBqlQ_e;Y0)rgXx#lh1F-OKuyOx&7>ik*84aB?Jj`_r=UBYnhc;47wM z>g70JJqa#8T6Z_NE8RqDpCfL66Mc|HN8vz{?U#`?R0SW8SV*Diiu?<}UMH3eqy32W z;{N(+v^H@VSB1nvWI8AHPwIyaj?a1ks*y5902WjHxFX-u3G-gy>g_Gq_-=1J9=05D z^*&xO^v~mHVn_B0wsA3b;)IIn&s3Z^3Ynt)u^r=K@~yGeNNf-FKyi!lb6NeA4%yIX z__(&O$oTwF5s5wFugKuKp7$f9{8riHF?yx@ZY+@zw_;(d5VsD1{|?9ZEnQ0&Jc3Ny zo=5Tbm~{qjfK9}D00eQbjy*FGckgH8&kSUdeI#qvoj(^zjDAW3U1d&ey#hDzJXbyc z0IZC~FpE8Aeez+P9RyOx!uYLE#GZrxId;dxpNbXb027Q>SGiF7e=Z)O(jx3`d4vkc zw?1RNEC2H(m-w@B>#zSCHkk;-wn*q4Sw-m`Vc?R{C+w$snDjgLB>wJ$M3Q#WaqD|g z>o-t-PtPsv9I~N__eHF?;X&+LG*fcM=vsOv5gooXMz3R!Pa+H zq`h3=ntB2Get6c&M_)BR%7^l)M_qAC_!1yph+^~-wx?rnf#npm`$})@G3gRnx2lRm zI0vj?@P17615Eg=UGZ^YN210OQ;ifUv@T_mCt}SXnprxGHwi21@H^i?p=cN$j~9F3 zDFzIP5^m&C2SPXUY-CcOrIQQin*zvhp_7EIv9E&(nC#0SokMc~Iu5IZ*nk z;B)Lh@sQR4%CV^XAu`Aim19{6(*s(xs zERR_)=Bq>K4#Ks$hkDn1DtRp1LcJiFAI<-E5cv^zwxKgE7!3F6OcZ<)7AqDf@pT<7 zhk4?4CI>u}xV__al#c%QNgyr5id7Fqj~i(AXpO#2wz7{}!6 zHxXz=rk`$#%dkfbv!}S7erhg$tSg?i{ktSQT2JCWXTTSF6TCFQjgtW&|G~n0UY&mz z`3)6E!Xa0euL!l&V#m&NQ;4W)1fQ!5;`Zsl80~Q_pz9oU-Cb*_`w>7!s|^%`RUI^3 zWw+`VKz!Ec@c=fZJOAgnANmWdDn^`N;u;7 z<;;xzMqOl~E_kd|SL}Wi0;6a6T+!@Vr6h5j=NY!TXkoalXT)XuZvFuv4F7(iviS!s z!|xJLsccY{oe+Bn_Goxo>{{HzZMZ{aXD{p-o)GKC%|VN-kjlXLFNK=H_eKr*J4jKbjW*X5)8=3#m=H|oqO(K z+xM?5bafpra*cb|_I)SL$>!~Jcjp~T7Kg|c@)7tV{FKmm-We?X!eOgh$WwH!ge>YDWuL1R$~@tAe4?)zpsXt8V8 zo8+KGUt&xB^l4HQ+0iGSnj`((*irO6(A`}-;ylz(qxaRoPq$cq0I)0iFEOBXb$?|5 z4>2~t8piEc(-V-sL|eh`LHSeyB`qO3dv}Z;kS!#fbYajybB;v4r;i@OT6$cOJyZ=5 zA~T(b?xb4fSg~g>E@M43=tflu4CW0O;yre#FH(ASJ4T`NfD@hojWWPTYtY@*Bepxh zkt!UXMWqkttJ)kmUx`boUmjSW)9o4;`>`Cy@1EHYX1R79C7!LPcVQ&fg1gT?%Sok| z79yeD#p9^`FoA`qBb(m(Uh!&RNR6?OAuaBi%KpJ2%f^tH%MMH#yX;{oFqJQ$h>3g! zI(7`{zkU`k1BKcNa+8+6Bp{?u7 zDudoD{{vW75jlGZmw0woa2x(k4+eqW(vK}=hHFwkz01xZhr>AU$Yn>uS4XWs0CZPh z&N1t^Z~?s*5$ge5IZqrhLgih3#xd)caSLJN!IyA#2vGf1=MPj>41^I+0;ZXRO9sRF zUHN`IbwtkIh=hcU7q!VX9`x4&Z(>JQS$dk08nCv&UkCkIRlHTP89X5}?*IKv->)C;Qz2_qb=VsnmV`vo%deu80;=;Hm(_Dn%AfR9VK^ zLX&I{A?+F*agXbBm!X=+uN}JPZPkI&zM13h)*x+4U( zR;5pK8sqfOoE9Gho6#OWQJev8u+oW9Iy-a1u}ZfXhNZ{)P@D)oFh-(SJ^ z8vcu%e>bP!;k1v_H#q$qr{lT&IcazbSE_nua(X$ZpXT%iPIqv6JE!+@`T(bWoDOpO zdrtqtX|7wFb=n&1qJxs;7X{VoopNbUCN> zoNnawMow?z^lnbS#p#bZeV)_ba4P5pEcg_1dI6`GaO&Z71E-(k^lnb?6|ba{5J1zs2bxPLFds!08*Dp5{?_FXYt0=^9R3 zINi?at(@M?>4Tj1arz5R-{y4ul?wlPoL<7Io73w#ZRd0+r(fiBKc@#dJ<93xoW?l) zGpD(0RDIJqE#C>FP&guJ{PGS2nlhZ||@3zY!uTkxOgVPr|eT370=5z~N;*Kk_SX)&jToSs<0csYHV(;sr`U_Cv+_u4KN z{?W3N{5PHU|4H4Cq@^1E+nlfO|JKy=FIlqw5l%HexGpIl|F-7F_E2lnb-wl+y+L0n z)Y`r&SkffM&i8NAc=Ypx>_(HXjXd?nz^3pPUwg=C+!*o&j0-O`wuFNrV}s9V zG`2MQ{b6po&JEVRuJ3U8@EW>DMvqSLhC!Wv<7|NU`II6 zlz2XN`(yja!M?8SvCVN3{IcO1eu@v_J?5 zzOk+CRC+Wfo|J-KF9a6&U*Sn9I5t13+i(2nW@KppSmlyrw}yOMNJr^2TkG*`qhrGj zzNV1T(int-8;zk*pmjqy&I??rt*I+z3F(&^b#(Z zijA$EiS9dw+*?WPAp^=0Xxz}I?b^rX`^W1CYkf@tUnuwyIz4uMnaU+~`mZaO?0PBc zM||S(D|I|cha&xN>S)Gbpyjl&wY?c81vbv#7;4FcCmo9HTAR;g)-u%Z_4>DUdV@_J ze%RqqAl!rzFxB{vP4^h(7I?L3m!yB}atqav_n|FYgi-gMRe>*&5XwO+DY zLG}y?Q4QjJ0kDz=`=*x0_Dw#c88=NKU$Zga2(_SBZ0TqYxA}~w#&)Bly=@!$0&N|Q z%>Za^4|O2VM;8e!@GlI1paVl?utW$NQ>h-WSC)|@g}S0#%9k1-y_=3e>!#Lro$qgK z+T6IwhoOZWg7#1{Kh%;OZ-U_siaxZeG0@b4YML5DtsU)biE0(`v(4?EEp2>b8)-E) z$JcJOZt-^n(B=|jjc-1ASgnn1twD*%V8Z~sSF*6Ql*%#;#LRvk`WN}E>G&c2F!@VLH8Nsu3>j^{#vn@z z{v;^tz^$*du_@HHO(gK@`a_MIeL-VZNjd)9)NJ@Wf?$3}dt+OI>RBZVf<`et+|+ub zuO0hJ@G-Wwz;Zw-+uA@aoKue!01x6qtXk)G8v$PsTrsw`LN?)$;R^)7l-72@u9joH zw-Uv6pcJ_(np!AU zs1Y<7zRo6}pEw5he48A>S{iR8Z#_tkbR+y1sSvuHX4tGXMi5MCYeruHI1E5I0JSn8 z<^<}FjRraF)w%}d_|IBHxR~B#?Q$Mrq8uGlWu;?Ll$Z)OhJ(-mseaAA07PtT40LQs zty6$`wh^T~$rr>}&5|*|$ z@I7d3Kp)U%OL*DPmwFd2_LeOaYg;flH5--6`bce4lF{}Web}tBnc->PK~!uFkd>g; z&qMd$hOS9dfmSkeXunrFOPH@G%(V|nj_Hb_Oo{FrUhikZjcp{CQ^S(XH-_7#0?rN^ zCRNlX1w($buMK`dV%%XL!Wg@pB#2l|xClMyPDV0D(;f=b$fZlgl8cI7Ghd0m z6u#k}-Kj*p3F;kgO4P8VX&aF!2b@{!FiSRO`7Z}zrSur_)Ob!4XtvC$V|N-Hy9LsT z)CE$;`elvi#MBcvwl!`F(%|j&dN3EL+_s#_kb`)MQCnT-@~(DQIoGUMtNNZCZsCk3 z9Jd)`(wXkcsIDGv-_Q|mhpG3$cW8!xg281inn(6ONTZ~tmY9kUn+44qZ%4qZimJzA z7O^3C*(`1GX%d3bnS25ELw%jTrZ9yI6~4yy*)W?vkU;&2hJH1asLp-^oHf|7M)FyW z1TK_JTpRFEFibTYD|AiOovk4eY6)~~1)R2H7$@Nx!K3t&nM&p-@aTM{7J?0(x-&L5 z!U=08k}&IQYSB{#a<~i?1e4Z}c|b|)MnhMfT7|Zk)Y8jx4SZnyE=y8xEHzj)OA;-T zV9Jv)oH|}pOqkKw> zq3d&u`IjqooQ*roMri7nkl?&r| zN9toSbnn`E0Kax#Xv6yTvMyC7=_aD*|E<-LCDnFQUZX#wRjQ_hf>1XhAGo#Im#k5f zD>k*#9Ist>Q@WSUC6|>N#O~MzU(#y>CpK&|W=k;X+RmPr^yX2X47i%-!Ra6mAkj|X zqtT`n0XLWdnhB1AK>3XUo?}z}%jsq`m@wm<)m$=559G?X@X@5zxX~8~(nJEb3iWUo zhj+F>`qj-HaEr*7+akL<&vZ?NsCt3f&4yMWr+GcJAhB*i^KS@Pg#FE!lR$r27UnoA zt|^|_*xrm80bD+~(E_HwV=H1x6g?+vL&Ks`jPnuck>O&(M6raW;zpFCiAyaQtEYEC z6?sE^iRS6^n>#{)*Bx5Uc+j7k=NV|0(co|Ot631n9X&U{Rux&_AjEmVpD7}zBWpJV z5e=X~2Zoa-4E5%CnXeND2>F|Qm=~wTW9VMRD!pw!c>Ai>#|$_DuD+eT#*k!NxNoEzX*V(N~Nr9ht-d&jGF zFlc2X)s?!UlU$rK=K~D-pyPF3;cVYFX56^C6IB6LO`3(E$x)IY=v$}|{#IKDFNY}& z1CIcQRjiPg8i0?EPn-S88aYvsV*`PV)*md8XxY*8QSp2{G_Om+|7FLDpouPXX~h?{ z8l<0ZX@t}gep>qa3$;^vnjEZPB^VXAu9AvdmsogP9>&DocXeZcO_FSTdXQ4mm+H5g z2RU#s4RAgM?9RqHx<;*ekG(8+# zvP91DgO?|kJYX@&e9Dgu$zu?wsM?J%2*fAWk@k%p6raOln4i2zjOS#pFv!yyg+WY$ zT;+N(FiHEO9+{hqIFMS0gxv_UIg$19{7|!bjCQ2=Fh#Gl*~@wH7g?)iYzqSie^9wx zLQxh@+BzalBqgH&tJB8^WG8!#5L;D`NzjMoQE4Hxp39}Yb{`zYW=yBrTDOqEfrI8- zwDzpww3ab>%J!HRG)B<@J45psT^{pdIqw`(AJW#0sg6brudtGVZPG7?w?^Y5rscJ2 zZGH?sk8Kg8JWUFz`b&C)mrDD~vPWdQU5=;HuVc>X;W2f;gWA^smL=9%Wk1;ru5)BL zrM+pJ2WTcjhSD?*AKSi|7PZ%owXy~rqxqlSe~7D)YuaXn#JDR*)Un3VVpEe$eA3ni zI58Y0^o#U_+Cv%Ix2AgK%326sGu_|=-nNp5M1rMz#HiSlqC4Cp{I$8wccXS}kx?HnjCET zjjEC_ygNhkd33i0pUJyT#;*`<1B;apL*;3uQ0?4F4d_T1IKCMB(K;Pc06(NtZ`NXJ zGh71n5n7wTWOz)*5){e2#Hc|89~Z=1>Ghun`14?P;WcXsmKbY&KBFZR@&_-w=ps!Z zoY$scNsF(|j{q~K2PLf?7lngZD!WJv{-X0ub^C_iIJz#%*4Rlg!50{;tV28`B?_Jz2SCqo3paPH1B} zS2u<|Nw=?~83n@72QmIoloN;)d%*+tcL}#1*0f26-=!nnQb=RkH`7?s+Ab{z>kou* znL%jfm}hctu$GF|Q^_g$Sl+j_ZV=5rpWn-qvxJcbh>S4>skbWlITd={2!=$3oaY%> zDn&3>8Xg6O`B5m~p^X4(+m6QIUn)fU4uLVYQh_F{BydIN!R(-W(!5kot91P=73d}A z#~oXE)FyjN3tejbCs-X%*X2lk!AZ4xi%jkRX&xe0CIh!hUTR)OWp(FF**AfFSU}m$ zbpQdQzuItzXKIY0(nEAT#j?$rA0uTwKHpH z5$c?W>nfxM(pQHq;@USY!jJEa-&@3`_)d7sBHqV$-rE+j@*Rut;QKXvMS&0_KeY%W zW)VGkLd^V=MRWnj38c3pT~S%*CYYXITSN)@GBdZxF}VlN@%E8K-pta{L>UD~+uO24 zpA|6V^)$}Jdqf28vjiF3lG4(qjWizMtXK}+SFXX4)k-HWMNVoSPGN$~l)M@VSCpD3 z;f$0#kAy2u&69AYDS34gt~@nQ!a0!Fb0O#pP#Zu9$rp*bpLt_PTWAa2liaU^*g5~E zn{H~}K+WqZM0vC?`=Qeka3o$K8nT1~v+ELWzT;oAL;;TO zmuv_s|Fl9E6$&@{7j0WL)Y^6pILNt!7CR3D3Nys$M-5Vl1~ z7f$j|J7>Jev)F~zpWQIdlT|toI=B-^W-Q4OOWv6xie5im6g*!ja*m!Y3MLD&4&M>* zYX)G<_m=5-VtTVpOs_jlOkb2Qrmra)nL1e5Kc%O@KkdRv$U9q1w@eWQBc~1K_2>5F z_$M@s2UDrOy})IeGEPi+?X;0RKk6>ZL%q48@cBui;Ao!6Yt9!rz?;3OP>kR$9eH@) zOXnh@Asb2p!QokIK9puu9_TiewG`!wqUHioRA&=Ki%t_ow-=5~87%Nyrsj&Nb$Mdy zqDf-vLge(H)|2O-)Gz~m%=%8QFu?uQB<+h856t(LGscNC4xc_axd&}HKTn+h&IB?2 z`5a*nO%#)xbJ2!LXhWWGKr=SuyF}sut$<0*!#I)x10w=l1Sfz?0G9wRk%nv9xjCW$ zJSuoDZzOk6ahUkq0CK0D4}RiV;RC4>py%~?ZaFhooEfr-Gn-EnXV&G5GlBce+ouky z{E5iVLH-2fj~8byoH{t|f?RRNq9Sp|+oSP8gkoChBysMdDsir5$(S-9u%OPV0E_^P0E|e3vE+;s zIUBNjvWV7;^29~&WQ*CaTcM-qN1!LSc@k*N6@yiG%|5; zLXWw>N&e$iExBvPk7N&K^-G$MW{bj*6*L1kWNlrPD+<0T#AWz)O5C6sFaj_FFiIa% zVN|~>MZYT^QwH=-mNb1IDHv4xuF775vL$1dZ9rM2Q`1D@bE9>Dbj~s_SIo1VC5(}C z2B-I**;C{{qhV^P-6Q3G7?!~UUV8E{ZcY#@U(XTC!Nbd;cZJVGMxk7>A3vGigKu-W z;$`YR_X(5}fER!lC{KOD3}?YuGk#%KsfG9p-OXJ%-fzjai0oycZ$g%sU^!h#*)Gc- z$s&3nqjO%*7SlqL&}T_ka>NLJ-n|_^690~*1NGs#z;l7;BJH{58@b{eb?Ac+$UfLV zz9-v1t^xI*f&KzrJ_GcfvF7xV$%D3@e1Bepr7%YnLgxz6w+caD;X>FTX`5hs>n6iC z!A3p6w#g1#f;QTrXZA%Cg?-KBL1~vlIilw-^z*M-#NCS(ugv!rTQ=-HbZ;TsvCw$Y zgLl!~bhkx3FX5?ArRG`6vqd@bB=2m{!_P^*^^Y$FkJjdhwMQq5DbMGKeArOgNB_kl zev5D6WmG@O1Yf`iJSSUx(DYojZxY%E8;o`oEmZB3Z8@4F2LH_>jQxHo7uk1AV=)cDz?#1^(!a=q>G(p~f8+kp9m!6yN&1KYhhH0 zF=4|ve-=8VdY&sh-?fOV@$Dyi?Bj*~o$(?c=k!ucI=-T9%9# zO8}G0e3m{9wHx-0p-j65jtS>l52XofEL;Vli1TSWO%wDFAb;tY%%r@an) zel%C+Pr|b*dPepV*U5Y8lM_?QTSy*@fUhu16y9FI^3E5ICoG~4-+Kwq$~??Pvc+uaT%JArED3>q# zU$KZYe`XOUC2q7E`Q&$+^DTMVA`iAb@Ae$O9COwH2l*b5MImHi3*|yzp%c*4{$Ewb+%S=IfM!s7C#$ozUGMUB)=!_k5u|qEQ zg_8#d-?2~);sEBNXAD{7e3IaA!u1~0J&%)~$x=qDE-H)GivI!JFYwJjp(=Zj%Hewf z-^X#C`$qCP-A}^3em?O`_>AzU&J18i;6J^A@De5`U}g_n#AU!kDf7)^nP?FcH=s?V zI|0_6eCXmL=<>qxo{2PmpNDaQ@pwlpVhCS9@K9>WLYqA(Z?}REj|jWvkf6DSn)|?C zTLgJbndB!vF#BXG%Ym=yA3Cr~dCM@rBY6ES$Nds~9rzB;v4{;wRisu2mP?xaWtYy! zih{RsOYC?hgw$w0sXvB%e*xx!COALxb^>mn zDX$psH8?0Gu1lt-|9HQH;^{x$@1XebkM}z$KK$eT4vG)|c)x?R7s_M`Cnh$FZ6coQUG$O-S4k;gn*tGs*8qC9xp5f9>kO`?^C;dByaA$y zHfvFfu$y;_cV&CW)^=B8utl8C^{n(!lRF@XFCa(lyz{CA+k0@9R7A$kchkNGW|R0n zw_;UCU<+2^Z%Up+6JkfQ&1D5^6Rgkv>hwMMb9 zh`1W`${o;bL7qVUDByKAH^T!}y?{h3U+lorxiC>X$X-h)+=O`0#82u8&rw;`i@D-E zi8D|;kc_=MKjY_D2UZh`YZ%A-@5uO+@?_n@}i7Sy7;I*C-v@DG6Eejw2v z#=W#J^6pZqlXia91lNW)gyaY?o%ygDn|C&1E0Yr0oCI~Ou%ZiaY-f)nvN&R@OO@~> z+aTr8iZkS}2?63-l~0X~>l33FYmRC33M9+d1Zi^?9j_MWAeVbiwa*sb!O=_wf_$*JMv?2n$787 zn`r!4gWs8?0sB4Xsrz(%o^w?FSfP=h-JEJXd@C9lPSfd0gY)zA{b_JeXZcCT$JwV$ z%FkBx9eh#Iues^q{DQO8^U_z(D1|5_N0Mj zyp?z*twbb_SkcyMI#+?cxboc_dYi92WlKjl2#PlB;?OXkg~IU(NhLj{^Igf)5JEVL z6u$>wQ}l^nsq{b^KRp_b+u>)po;0{Yz8~c0x?v+}a611~X@alI=zXC|PC@m;pYwPR zJRO3-0X@|!lCBwNT6xn5KnD@!Tbm%waH}-@@?A^xA^_qP4qnjVYPie3wy|+jJqi3g ztkWqDI-*GLd}ziN^AI_G5)o$Wc-1MLl%{h&P_*_C&Z1CFR3!Z*750IH0F`SrBYuXX zx1g7rnW$2qw!t}xRo$maYaQk$7GvLwq_J2&cgACVm3Vb~u6Rw}(22X)+@MFS_Xt*CM{xxu_+nGq& z4i26Iu7KeV{*S^}%4q@*Ulm+z}!9F-||=w1x5cIZb;k4&JNEr|0W?UEcVHf-7b^ z^m9$`!8H6W`3l~XrR1dP+Q)K8FW-|^KK*$)w>yW^(gOUFlrNB=4Mam7eTPE70)EPo|w| z)r`8eq|2MEb|!hH z6I@_Z?M=_`{?7K|VBROwkF>wy zVSnNP%iHzMRDE#p_am||IISPrKhgO*ZD4*oA zw7fF$^Apeig!rKQr}iKArP+Z2oGl4uXZ-NA6Fvr!abxV@|wo#!ch zI5n2~VYrj5MWAU(kLm2$mz z%u{eUVUzk{eES*S0hWg~6)Mr*P9A6aPoaMejPE43V@d{mEi8|nEZ4CD`NUG!Id+eL!S{P2S9-N;6&ck}; zVYy|(x0C4`Vg6;p=U}+|SfBMeRib*pO$YQxA%wK-!k=&JGs3v zmdB`hA-A`m>pjT&m&uNgu%7lXTqb+4lleDt3i?W!FXEz)wj1?aZ;b6)Ci_>+`qIbp zI5&-dT5dZTUmxSk1Q%nz)EkPvOmKqnwVbcu()C`;&BO9=Fkdq1b1C;X2lwAIGPGkq z>p>^mp-l4K$#AzZUo!Q#5$0bW>q{oRI?4D1*PCfP7u=5Nr|9Q{jL(><_?Jol`j~%P z+5Tz1YWC>+{Vb2?8BWJz)8Sl9b|m_xL;<{=K+T6XZdCt zKk8W?cd|S(^*23#-_7_k`Pp|epFJ0RbpIG&KHtau%j93RFuop^Zzg}}PHyk(r_lRO zhAU=#nZ{ooA1LL1o=I+gZO2(2>G-rB6mdHSxxED`+JYM%-wK$%{mj2icCv@z2Du%0 z!$Zm^Q7_xIyP3XBd_KhT=wbP0()&)Fw3+7-YNl=M45m!+E$Jdl@bhpX;?B z#(J7b|MoJU@5=zE=UaNcs-NYNsUPX}z6O>@Ci+~=zf5qtUcEl%=Xx{sOTE6>!hFu8 z_j_3$nc#H2F_y}KdSk5j1>8R}@oyjVWk1U!6aV%zz5{G0 zGuitArf)CvB~!h3GQLc3nlFd6KC^r?`D^8@rz3L|U()%f^|^)dWrEZ7?qj%O=5u;` zb^k4Az2D1x&cr_#x3`DwUnajquTvl7{+4N+sb{%mg46BLaoqikFH;<3klVYL^&pd7 zYv6X2p2F|+vmV44E)zZ-SGtq?TPFVXaC?i{zt4ov!Ehe#N15c-!*=Kn=1V5K+raWY z$b88pw<50hPL^-Fz1R9z%5Zm|!hh~#{=LrhrTc#xpN`MHa|-`2#`QKZpEI@N0M~nx z$E{5Bg`K*;u|3GtUW4)Zx&LOWx1agkc?v#{u%7;m+nY&l#oXQk)|X6nXn^Z2;(ne9 z&c*uTn)T84rHJW^vD`A^W4;_@K4r2B-g)fsIR>1Au$@VY3y?XpO$ntQrKBvn=*X!4M#dafoUZ(Lia63vFUnY6v zFur$AVgGWNzCqT5OnSAK<<`P*ndDKx^lfK(WSY;!n9udh=S=k$b2~b@9hur|u)X>r z_oGbqw4d8MFM~X^-F0xi+l!SRWSZ9wGQJq&%fy#ESzq4a_GaQsDYs+qDdwvOn16$F zKAOHBrtc8zRVIBt$Z~U>qMv&h?uRVjOne#Pb{O10GV!IH>H9PDFO&VNXM9gGTzZ^F z%k2>3yOZ0Isl73l?{pqNGPNUzxkEZ=Eq^AsIO+RN?zzvZ2O%v)6%$InX)D}zCWX*vz2 z#D%vQ2c03N5(W(tEXmXw2NsR7!$3;H3yoW}Ca9GxP?W?fLyOGh-u}G(UCAuq<61%cvrn&^*Z0_v_JgF3Ltb_sYd;O^_4TrgU)v?3?dSEoKw4ji z5pwpMmml<8JFm08LA`DV*YW$g_5;6OH?RGn^!$8!J-qhYMB62y$MdptO3%-y*Uih$ zNqxN|y&hiU<@Nen`n+ELZ0PxU^>go+hW3M=_LmDh{3@=m!_x83YkosLzdQAKUh!b8 z$J-xz`?wp`*D=uF*S!4C((9Yh{^E6i>*@Jrw4J@y*U0L?e|fAyS67d?(eJaecGM4d%ttpMu@hsXKPxsSRF!pA`ft@uHD$d}~^n!RP$SlESLthFHZ8ty+|seQBy z9|kS7@GD>yExds*Gh;OGVyG?Km71a#>nljzg@YhK-2~xFE+hvoda+i5)K&QLWlF_p z7d`~iXyK>8KD2P{6H4tz^SrO(ogVcNTKMiyGY2%!`H~OVnFH?xsU5q>>o0xaZC6wK zg1P}bqpNr>U4_uXr+iWOhktN8bD*7grs{V%?LFA7V<3Fh-Q+Z)kMLe#poL9v5KSyo z4^X2(?66p`KXvK->FHBd0Iz!XE_%v@p+#D+?`r-X?N& zqj`>A{S=JRyz`>AobKeRCN8N4kUqp}b=?_GAL6BY0f?XTu8O*bM9R{K_jlBbK*r&n zBX!feop#>CQm3BjwDWANS^;t_&lRiJfE+u6zk8O`hv%Ht-+;8M%}eT=Ks3+ys`tOg z=@W!M_FhLv;Wy4*Qm;t=W#$g-G2!RQEo{#RcIyxb@B1)!EAsaXmp~9rUIg{|yOvZG zorPZl_ObBEKcvK{I)Cv&30^C9$;k_V_7QU*uqztt1O+eZg^ZhT@0+5;juY)7>5k9#@ zE_k%?2f-X2hPPIjGdc0o@R{WI--=$$^)EU9$6zPz!e?95Xg~{xwHCfYYvCKfUKtZM z8`vM+gJVs{AL8)CK(2iNztnctYX*O>%O0WsV*Y=r18^m|`yZlxF)#mO&VI@F@8RI?t9@^K@csx;XdY#7Cr|=(P8)ikog$!cMfV_g5BKy!Y3ah?>ha3H{QRbGHBrh z*pJS_AL%>S5{0V|IJyU)`ZH&IKfLKd^4!zk52t|aku+Qd;!C_guU^*eGx#$PIqkeB zuMTU?yYA{jAjk5)yJ`SARz19=J`1Fs_qf%sfwc3^wz}XEr=9n)RSnqZg8!-8)qr&a z(w>D60U2iiyEO=euLrBlUpNECa_#UTVD}e()Tuonyk!-CqmS^1fS=s`X}I~AvwwMC zTHX4%qx0~yK*sSuv80ZJApI9>5G>XhkXi$&U$8Fp5#A3nXyN-n4n2UkKgk-S7wZEo z)(()G0`*@msR4b29|cpi@C#rr$Bvl$VaGng8=q$HkWXLuOt2L#d^U)pgYdVHP#XfB zhmQmCvBmlTQa9iqAVnYH#k{#4*~1Zw0Gp z-j7q;pLJ}wSRX*@1{?)P=p(%P9M_0mtN|c30=7NRb&=O!_}mw;Kbl-F>JW&a2k_Ms zXOAS|t6p@ji}wiCDv-5X%>6HQ0`7W=7{al_kAO5<_&Kl-P0kXv8;I|bmqZ=bnj9qR zn&0U0;h+4LHKxA-U;8`VA8!4g*eK&nm(&M9A1$@((!d@QzU>dh5ZZI_X@BIt6Ftf1 z9WPUR0v(0F0VMus;e$Y~MfkQ?m?wR5@ZZ6m=;N^UD)9;}{3MWb&Ed0NbM$8TlUm2& zeOe3OqxAuJRcqmAv_1-7{3mB$2;T@~eBrFt!aoNx&!^ze%^aP8XQ0g7gg3wLvC}`U7s8v`Pk9&Ld+99o z>ArvBLH4JMFU_pn7$iOE9um6jSl)hqc$xe!MYG}oTe;!OU%7eD&DZah(#RL> z-m`N4SGO+*Ng{W{_2gZv4S1~G9rB{)8 z&6ty_2CBhos2Z)ts;O$any(hB{pz4PsZOiDn!gsVMQYJnqL!?sYS~(@makd0UaemX zSYaz+Wv#w7u%_0`np^&QzFw#sb*tX159-7Eq&}^yMz9fTgd5RDtdVFW8|g;2k!u(Y ztI=!p8-vEMF>Xv6v&Ouknt^7p8EHnF@n)u(Zw6Y0)~q#eh1${fusv$WI!4Fp^gDyj zxHIVlx?wCg=}x<|?!2qgC#e{=${BgvT4Q5o%#ENKG81OnoSUkcDUOQc;-omWEhTmm z8zoDrQo58a^KCaKTO=68W*2pvpSVQbE#R`6G zAQnhAQ_UPU=r#MzadXmCEnh3t3b*2|L@U$Ewv3k58n#BZeFE(u7K*h~?Q}ceF0}jY zL3`4kwtXFcC)|m25}jlx+sR?OUT1{u<{i}yc0=7*H{MNmGu=Yh=nlF=+mb5FJqSIOh8 zeR~h7st->Mvx^edOf_3Is#bMa9aU%5c{NZA;-@jZG>wlI@X$eRQk&L%mLE@z;Hycz zHD_5?&l*`{{8iP1^-w)lkJr=njP1GNwbS~n?r#Jd5qvh;Na3w{+gHU;RnylDHN$vl z0w2vbji%KcHb>1_bB@0TThUgmm1?D1d3?9u8nh;@Y0KC4x5Mp7JJC+Iv+Z2lYWMKw zaeLlYonR-_iFM+gbSKj(;NOGJuruw*nn!F~-|f{v>rd>!S>x z5i-I?oOqEjvW7u~7#btn>jP%cjG8gxMB2;~CHm&ToS0M7SM(Rd#R$+zn z6oZK3#*+Zij8F9lpT~}2jz(? weRj}<9ptm4N``16`$r None: + # Uses something other than `self` the first arg to allow "self" as a settable attribute + super().__init__( + **__pydantic_self__._build_values( + values, + _env_file=_env_file, + _env_file_encoding=_env_file_encoding, + _env_nested_delimiter=_env_nested_delimiter, + _secrets_dir=_secrets_dir, + ) + ) + + def _build_values( + self, + init_kwargs: Dict[str, Any], + _env_file: Optional[DotenvType] = None, + _env_file_encoding: Optional[str] = None, + _env_nested_delimiter: Optional[str] = None, + _secrets_dir: Optional[StrPath] = None, + ) -> Dict[str, Any]: + # Configure built-in sources + init_settings = InitSettingsSource(init_kwargs=init_kwargs) + env_settings = EnvSettingsSource( + env_file=(_env_file if _env_file != env_file_sentinel else self.__config__.env_file), + env_file_encoding=( + _env_file_encoding if _env_file_encoding is not None else self.__config__.env_file_encoding + ), + env_nested_delimiter=( + _env_nested_delimiter if _env_nested_delimiter is not None else self.__config__.env_nested_delimiter + ), + env_prefix_len=len(self.__config__.env_prefix), + ) + file_secret_settings = SecretsSettingsSource(secrets_dir=_secrets_dir or self.__config__.secrets_dir) + # Provide a hook to set built-in sources priority and add / remove sources + sources = self.__config__.customise_sources( + init_settings=init_settings, env_settings=env_settings, file_secret_settings=file_secret_settings + ) + if sources: + return deep_update(*reversed([source(self) for source in sources])) + else: + # no one should mean to do this, but I think returning an empty dict is marginally preferable + # to an informative error and much better than a confusing error + return {} + + class Config(BaseConfig): + env_prefix: str = '' + env_file: Optional[DotenvType] = None + env_file_encoding: Optional[str] = None + env_nested_delimiter: Optional[str] = None + secrets_dir: Optional[StrPath] = None + validate_all: bool = True + extra: Extra = Extra.forbid + arbitrary_types_allowed: bool = True + case_sensitive: bool = False + + @classmethod + def prepare_field(cls, field: ModelField) -> None: + env_names: Union[List[str], AbstractSet[str]] + field_info_from_config = cls.get_field_info(field.name) + + env = field_info_from_config.get('env') or field.field_info.extra.get('env') + if env is None: + if field.has_alias: + warnings.warn( + 'aliases are no longer used by BaseSettings to define which environment variables to read. ' + 'Instead use the "env" field setting. ' + 'See https://pydantic-docs.helpmanual.io/usage/settings/#environment-variable-names', + FutureWarning, + ) + env_names = {cls.env_prefix + field.name} + elif isinstance(env, str): + env_names = {env} + elif isinstance(env, (set, frozenset)): + env_names = env + elif sequence_like(env): + env_names = list(env) + else: + raise TypeError(f'invalid field env: {env!r} ({display_as_type(env)}); should be string, list or set') + + if not cls.case_sensitive: + env_names = env_names.__class__(n.lower() for n in env_names) + field.field_info.extra['env_names'] = env_names + + @classmethod + def customise_sources( + cls, + init_settings: SettingsSourceCallable, + env_settings: SettingsSourceCallable, + file_secret_settings: SettingsSourceCallable, + ) -> Tuple[SettingsSourceCallable, ...]: + return init_settings, env_settings, file_secret_settings + + @classmethod + def parse_env_var(cls, field_name: str, raw_val: str) -> Any: + return cls.json_loads(raw_val) + + # populated by the metaclass using the Config class defined above, annotated here to help IDEs only + __config__: ClassVar[Type[Config]] + + +class InitSettingsSource: + __slots__ = ('init_kwargs',) + + def __init__(self, init_kwargs: Dict[str, Any]): + self.init_kwargs = init_kwargs + + def __call__(self, settings: BaseSettings) -> Dict[str, Any]: + return self.init_kwargs + + def __repr__(self) -> str: + return f'InitSettingsSource(init_kwargs={self.init_kwargs!r})' + + +class EnvSettingsSource: + __slots__ = ('env_file', 'env_file_encoding', 'env_nested_delimiter', 'env_prefix_len') + + def __init__( + self, + env_file: Optional[DotenvType], + env_file_encoding: Optional[str], + env_nested_delimiter: Optional[str] = None, + env_prefix_len: int = 0, + ): + self.env_file: Optional[DotenvType] = env_file + self.env_file_encoding: Optional[str] = env_file_encoding + self.env_nested_delimiter: Optional[str] = env_nested_delimiter + self.env_prefix_len: int = env_prefix_len + + def __call__(self, settings: BaseSettings) -> Dict[str, Any]: # noqa C901 + """ + Build environment variables suitable for passing to the Model. + """ + d: Dict[str, Any] = {} + + if settings.__config__.case_sensitive: + env_vars: Mapping[str, Optional[str]] = os.environ + else: + env_vars = {k.lower(): v for k, v in os.environ.items()} + + dotenv_vars = self._read_env_files(settings.__config__.case_sensitive) + if dotenv_vars: + env_vars = {**dotenv_vars, **env_vars} + + for field in settings.__fields__.values(): + env_val: Optional[str] = None + for env_name in field.field_info.extra['env_names']: + env_val = env_vars.get(env_name) + if env_val is not None: + break + + is_complex, allow_parse_failure = self.field_is_complex(field) + if is_complex: + if env_val is None: + # field is complex but no value found so far, try explode_env_vars + env_val_built = self.explode_env_vars(field, env_vars) + if env_val_built: + d[field.alias] = env_val_built + else: + # field is complex and there's a value, decode that as JSON, then add explode_env_vars + try: + env_val = settings.__config__.parse_env_var(field.name, env_val) + except ValueError as e: + if not allow_parse_failure: + raise SettingsError(f'error parsing env var "{env_name}"') from e + + if isinstance(env_val, dict): + d[field.alias] = deep_update(env_val, self.explode_env_vars(field, env_vars)) + else: + d[field.alias] = env_val + elif env_val is not None: + # simplest case, field is not complex, we only need to add the value if it was found + d[field.alias] = env_val + + return d + + def _read_env_files(self, case_sensitive: bool) -> Dict[str, Optional[str]]: + env_files = self.env_file + if env_files is None: + return {} + + if isinstance(env_files, (str, os.PathLike)): + env_files = [env_files] + + dotenv_vars = {} + for env_file in env_files: + env_path = Path(env_file).expanduser() + if env_path.is_file(): + dotenv_vars.update( + read_env_file(env_path, encoding=self.env_file_encoding, case_sensitive=case_sensitive) + ) + + return dotenv_vars + + def field_is_complex(self, field: ModelField) -> Tuple[bool, bool]: + """ + Find out if a field is complex, and if so whether JSON errors should be ignored + """ + if field.is_complex(): + allow_parse_failure = False + elif is_union(get_origin(field.type_)) and field.sub_fields and any(f.is_complex() for f in field.sub_fields): + allow_parse_failure = True + else: + return False, False + + return True, allow_parse_failure + + def explode_env_vars(self, field: ModelField, env_vars: Mapping[str, Optional[str]]) -> Dict[str, Any]: + """ + Process env_vars and extract the values of keys containing env_nested_delimiter into nested dictionaries. + + This is applied to a single field, hence filtering by env_var prefix. + """ + prefixes = [f'{env_name}{self.env_nested_delimiter}' for env_name in field.field_info.extra['env_names']] + result: Dict[str, Any] = {} + for env_name, env_val in env_vars.items(): + if not any(env_name.startswith(prefix) for prefix in prefixes): + continue + # we remove the prefix before splitting in case the prefix has characters in common with the delimiter + env_name_without_prefix = env_name[self.env_prefix_len :] + _, *keys, last_key = env_name_without_prefix.split(self.env_nested_delimiter) + env_var = result + for key in keys: + env_var = env_var.setdefault(key, {}) + env_var[last_key] = env_val + + return result + + def __repr__(self) -> str: + return ( + f'EnvSettingsSource(env_file={self.env_file!r}, env_file_encoding={self.env_file_encoding!r}, ' + f'env_nested_delimiter={self.env_nested_delimiter!r})' + ) + + +class SecretsSettingsSource: + __slots__ = ('secrets_dir',) + + def __init__(self, secrets_dir: Optional[StrPath]): + self.secrets_dir: Optional[StrPath] = secrets_dir + + def __call__(self, settings: BaseSettings) -> Dict[str, Any]: + """ + Build fields from "secrets" files. + """ + secrets: Dict[str, Optional[str]] = {} + + if self.secrets_dir is None: + return secrets + + secrets_path = Path(self.secrets_dir).expanduser() + + if not secrets_path.exists(): + warnings.warn(f'directory "{secrets_path}" does not exist') + return secrets + + if not secrets_path.is_dir(): + raise SettingsError(f'secrets_dir must reference a directory, not a {path_type(secrets_path)}') + + for field in settings.__fields__.values(): + for env_name in field.field_info.extra['env_names']: + path = find_case_path(secrets_path, env_name, settings.__config__.case_sensitive) + if not path: + # path does not exist, we curently don't return a warning for this + continue + + if path.is_file(): + secret_value = path.read_text().strip() + if field.is_complex(): + try: + secret_value = settings.__config__.parse_env_var(field.name, secret_value) + except ValueError as e: + raise SettingsError(f'error parsing env var "{env_name}"') from e + + secrets[field.alias] = secret_value + else: + warnings.warn( + f'attempted to load secret file "{path}" but found a {path_type(path)} instead.', + stacklevel=4, + ) + return secrets + + def __repr__(self) -> str: + return f'SecretsSettingsSource(secrets_dir={self.secrets_dir!r})' + + +def read_env_file( + file_path: StrPath, *, encoding: str = None, case_sensitive: bool = False +) -> Dict[str, Optional[str]]: + try: + from dotenv import dotenv_values + except ImportError as e: + raise ImportError('python-dotenv is not installed, run `pip install pydantic[dotenv]`') from e + + file_vars: Dict[str, Optional[str]] = dotenv_values(file_path, encoding=encoding or 'utf8') + if not case_sensitive: + return {k.lower(): v for k, v in file_vars.items()} + else: + return file_vars + + +def find_case_path(dir_path: Path, file_name: str, case_sensitive: bool) -> Optional[Path]: + """ + Find a file within path's directory matching filename, optionally ignoring case. + """ + for f in dir_path.iterdir(): + if f.name == file_name: + return f + elif not case_sensitive and f.name.lower() == file_name.lower(): + return f + return None diff --git a/libs/win/pydantic/error_wrappers.cp37-win_amd64.pyd b/libs/win/pydantic/error_wrappers.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..a9af44c7a141b9ca6833abaf3d5c89269eb7a16d GIT binary patch literal 117248 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
NMs&r6-3<%pv2*8@3 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 None: + self.exc = exc + self._loc = loc + + def loc_tuple(self) -> 'Loc': + if isinstance(self._loc, tuple): + return self._loc + else: + return (self._loc,) + + def __repr_args__(self) -> 'ReprArgs': + return [('exc', self.exc), ('loc', self.loc_tuple())] + + +# ErrorList is something like Union[List[Union[List[ErrorWrapper], ErrorWrapper]], ErrorWrapper] +# but recursive, therefore just use: +ErrorList = Union[Sequence[Any], ErrorWrapper] + + +class ValidationError(Representation, ValueError): + __slots__ = 'raw_errors', 'model', '_error_cache' + + def __init__(self, errors: Sequence[ErrorList], model: 'ModelOrDc') -> None: + self.raw_errors = errors + self.model = model + self._error_cache: Optional[List['ErrorDict']] = None + + def errors(self) -> List['ErrorDict']: + if self._error_cache is None: + try: + config = self.model.__config__ # type: ignore + except AttributeError: + config = self.model.__pydantic_model__.__config__ # type: ignore + self._error_cache = list(flatten_errors(self.raw_errors, config)) + return self._error_cache + + def json(self, *, indent: Union[None, int, str] = 2) -> str: + return json.dumps(self.errors(), indent=indent, default=pydantic_encoder) + + def __str__(self) -> str: + errors = self.errors() + no_errors = len(errors) + return ( + f'{no_errors} validation error{"" if no_errors == 1 else "s"} for {self.model.__name__}\n' + f'{display_errors(errors)}' + ) + + def __repr_args__(self) -> 'ReprArgs': + return [('model', self.model.__name__), ('errors', self.errors())] + + +def display_errors(errors: List['ErrorDict']) -> str: + return '\n'.join(f'{_display_error_loc(e)}\n {e["msg"]} ({_display_error_type_and_ctx(e)})' for e in errors) + + +def _display_error_loc(error: 'ErrorDict') -> str: + return ' -> '.join(str(e) for e in error['loc']) + + +def _display_error_type_and_ctx(error: 'ErrorDict') -> str: + t = 'type=' + error['type'] + ctx = error.get('ctx') + if ctx: + return t + ''.join(f'; {k}={v}' for k, v in ctx.items()) + else: + return t + + +def flatten_errors( + errors: Sequence[Any], config: Type['BaseConfig'], loc: Optional['Loc'] = None +) -> Generator['ErrorDict', None, None]: + for error in errors: + if isinstance(error, ErrorWrapper): + + if loc: + error_loc = loc + error.loc_tuple() + else: + error_loc = error.loc_tuple() + + if isinstance(error.exc, ValidationError): + yield from flatten_errors(error.exc.raw_errors, config, error_loc) + else: + yield error_dict(error.exc, config, error_loc) + elif isinstance(error, list): + yield from flatten_errors(error, config, loc=loc) + else: + raise RuntimeError(f'Unknown error object: {error}') + + +def error_dict(exc: Exception, config: Type['BaseConfig'], loc: 'Loc') -> 'ErrorDict': + type_ = get_exc_type(exc.__class__) + msg_template = config.error_msg_templates.get(type_) or getattr(exc, 'msg_template', None) + ctx = exc.__dict__ + if msg_template: + msg = msg_template.format(**ctx) + else: + msg = str(exc) + + d: 'ErrorDict' = {'loc': loc, 'msg': msg, 'type': type_} + + if ctx: + d['ctx'] = ctx + + return d + + +_EXC_TYPE_CACHE: Dict[Type[Exception], str] = {} + + +def get_exc_type(cls: Type[Exception]) -> str: + # slightly more efficient than using lru_cache since we don't need to worry about the cache filling up + try: + return _EXC_TYPE_CACHE[cls] + except KeyError: + r = _get_exc_type(cls) + _EXC_TYPE_CACHE[cls] = r + return r + + +def _get_exc_type(cls: Type[Exception]) -> str: + if issubclass(cls, AssertionError): + return 'assertion_error' + + base_name = 'type_error' if issubclass(cls, TypeError) else 'value_error' + if cls in (TypeError, ValueError): + # just TypeError or ValueError, no extra code + return base_name + + # if it's not a TypeError or ValueError, we just take the lowercase of the exception name + # no chaining or snake case logic, use "code" for more complex error types. + code = getattr(cls, 'code', None) or cls.__name__.replace('Error', '').lower() + return base_name + '.' + code diff --git a/libs/win/pydantic/errors.cp37-win_amd64.pyd b/libs/win/pydantic/errors.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..50d8e049ab81e0ef0403e6dd71c49134914481cc GIT binary patch literal 184320 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 z z1wDBqx^hQa3rTQq))eh3yf+=MK{Pi7lDn`ANi@ipa8JXi!a+rLEx33)zG3Kl2YhipsZs^81GTm~Vry7G!%>_8^sA-IhIwv|mU(x>My;#yuCA*^`GQ zB`#nN`WN%7o-_Ctn^6iH_u3cWH8jKp5Z#$zuobOyDu=4E;0Ig`geH#vP zrlR3Ef!(E{Z&JWQJ&D1g1k3{(eXn#DVmL$; zXAxm>L9pOGS2*TJud)9|2hm;{1)O>aMO~%X)z3lkkwwv4C_bY$**}%Rk}j{p>MDqg z{eJ2O-I2_1X=^3(NeGn!s00=GyImFRq}L z^1M=cPLx#X-q9Bp@EaMn^jYAxcmijzQ{3S$qvSp%_xBR=nl|}RlHW~o>up^-;9qE5 zL&>+^EaX4Q{uXmVH$d|OvH*3G8-NgceOi3WP}0lkjw!E1h);qg(_ zGIa>qaPbWC<1*D-hrfv7F!XgQ`z~AdV$x=V7JajMHsE*HLILK> zQMptD3M|3RI=oZ#JzDQ&!X~sWcpgNdWn$?<64Vo1xep>UhnFeV!T3#K9X!F$?9kjA4D7mrnI6hMR4UMct#M$ z{E9TE5xLd|tLLMfgd}mBU2AR;KBQx;dYqCZJFgThb0$% z-I|ex4X?FGxuK;szk5APf5ixKJlya;x8fyQsfv9!a_9w&^6Ot7{BVK3wKafL*wI|Y zUpaW|#N3@v+k%1ij=<9|{0hdj>-o;k=AZe@mEP=o604c+Td<}l%=)M6B4T>%vzECTYOr=oOL9Xi_m|jc&{U&Py*9S#7EiREq*(b{jGR!MlE8-dvz*mS-FDf`cL9L zc0AsKY#S>cZ^rpbuDc^w{xip;+kbZP_?L`3lRf@69_R6ZA!a zYM5FX%6%QV=hk=`y@AusNa+f~>`0xNpMu{XK74*iKmVQ+!sj31^SiFc=UesjTGr<; z;`1da(gTb5xd0^B^%yJCU-w+R;@3UF^_mwYGW8#y`K5R2kEf&>a&3dG^xO_dk>Qe1 zg5xrP%SZ7lNnGy7<=xlHCAYUPLv4Ke2`(2X?Rs4HSK1Z0yjm~wa5+vd7vSRsG!DXI)IvtlED2FMytbkG_JvV#27}E7+4{43jRQ^lGc2$j#>OmOL%(EM6Yf6Un zC2H$RnO=4^ZQUyq$gZrdL)xc54B;9NS3*zzs2Su<5CdeN!Vg5Cb*@q#)z%`F9?({t zQtsE*7doRo+M1y}Khf4CrChJA9%{1{+WJ}h^0ak86NwBPATKHwL&T5w6#%Z zbm}kh-(_Bz(NS$Zpsj$mUQo^UYpb-{Y>&1^=!`zm)>@6T_1cP43$D=CdrFz7tvM=T zfwuOkp08WubPg|Q>sxI-rL9bz!z0>ir+w44Rk<@WR7d_~v1n%7=j|7>wh!}V5p znV+}9^+tB&<{_h*Naog4M}70>sG@?kO6+(67z7k0~cOn9`4e}7QF7k zf4tNrjaRMsPcsjH-{6L%hRr|Y4`h{*g87~t(NflN3eQk2uXbp8D`W?aIMuQW6F3Qz zRLgrXJt}6pe}#KP`tdi6DRW>azo#@hpXnIZ@n+;V_QllEp&)+BEzaMiRM6NtO?2GF zxl!~RsQY1{t<+J={=qtn%a9#~;z6bO@+O*)Bv9c)kULE{$yO14e{=||w_L)a81-VA zu%)VZl`Xu23U3-#Z?#e!mGReh&2#|EYRUW@{Ysyo|!{ zfN%g}KX}@4SoQu=@NiAlaNpf z+k?M-@G)?(P6rLMCtoNp<~Gv6L<6U$#D*2va?)f4PFZ+n(AD6FHiNsK0I(R(I0A=} zErBx!^FjsVM=}$A$3Qf6%mUc$sprBBL8GqfIL9XBk1k*qb6~R&1TVy*>2%N*hl7@Q z!dgz2q*RQSvEt|CRMB!9QwOcO5x=E^#5J1nV_CH>uA$GDFotE-J9TPb&?Fr61b=|V zG=6}y)T-;naF$gM+qwddv}#3%zS}tI62LKJ)y}H#ZJZ}XR~LO; zmbT}Q$&auZokKdV#%d8t8Tq$BFh#6-t(`P7AsklS z0FfVYDu{z73_R0#0LBO!iK^@|!i%%&sLDQ#@oLZuoyxX^I9u5=P;hbku(Fe64Jal6 zBuqX2YfJmP1jEYyGFg-@%M?oC>yZ1P;Bl-zwn_KH96@7(&T6|IsB`&ym!|OxOsrbo zDGQe6cHCkKX~`^H)uE;ABhKjdA|}mHE!WyHS6j90=FqZ@Xt_fPJK0*EsvufsgtXiw z%dMp)&#!G;Qp-{8!nV9p*5WhSvWS+iO%husa)qWXCqg)E`MLx2vtWmyak*-_&W@1l zRLj>80cy*7PA#vG(sF%jSj!o*^!+0(OR1K9I6rE+^BmE#v_s1yutU(8u7p)=TfPZG zc)V0d%gM~Rc3sdnO3OM9Ee}b}@{hFad!N{{t(}^hs+Rqj@U0rgD_VZ5gnR9rP)@b% zi%?Npe$EVLYdJVd%X`~~ZJGAZwfx{-(Xu}4FxoOVUTnFD3DnZ^CD;MKcc@xs*n|T? z2wQ#ttyRnBPA%_<(sEZySj%Uy7@Rq27KzIQ)pEQo{JZj^Wo3t!f5HxUzrPZ$qXrs-v`o{Lo?F<-WGXj%H7YdP*7vE@@tBh<31YPr5u*yBUsE&SfS5kRGa^6oCsefe4Psc~b<*TTSkk!9+Xt@k_2pYXr%TMj4 z^j;9cmTaq*-JM!4i_-GvtHN3?lJx(Nv}~+ezR5H~TLw{SK+A>5kv4j&iI(pvVYZzN zc7YIDHV$d|hEzY6E!ReA>2qjV`JZc>4!ARW1E=7pK!q zwal@$DyF-PQ%kvl?}*EJEyK3FT^6Z-WXrGb7A>dSarr({Ic&MdVav_1L(sTYr}LVf zFCPLSZ27fSuj6~&QubK3JQZcjIER+2CH?;+EnBOW_cM*qL~hmccW||BSzokVp@fa> zxI92TOrv#3%MUTJ&~%Z)RL2RYPqmQSj+LUNc|&Q9?ldkyKyA7T*(~)&SQ`xt&NcT2iO6M zUr#MeW3yOAPFn`)4673j9GfF0zVQW;6{`NeSpI!>^)Zz$qHWPp8XEH&k5;(X!iT)> z!GHAZgjcQj4}N=g0~s{5Yj%|IW&B-Eb3cXWT2*m39TPg-p1S%J1g*-$L2A%zH5_N% zywv+2-t5%-zlWU@rcL35{Wb1GOMX8*VNr*RDs-skH7jObF=b-)xXk#V(Fz{I(@nS) z>BHj{-rz<&tCLv~>fv|7Pzw|qcz+7iDRh$r-S~b2wKKb(^5)`+*bb+>W<2j@)xz&u z(q`GGg8a?+RSmt_6Hmou&5%2WxOu92p0^V8haqg+n>se`^ni`??YDmQsT zrFD(r-;t`u1au3p4WvtP-EZ-lpuFDar@5(Bi9&yB@|PB`5f-mp+O>6!)USkBH*^cH z=SY|0YH9JhTzTp5$fPz?y*}S#@k$h4<2~SW@N?nA_ZSJEPHd;Rj=&C_-y#0Zbu|^L z)E-Dau&MLzBX0bJtUDlVUD(&}F4&L3!FpFi8sej;{4OC577Kz#1FC0wE93ih6oB7j z+*Jyo40^MF4`wx?A0hNHe1<1_6Q1}u`-f6l&0+i(6cL$M@D_3Q>V}>H{a1NYKFK_Q zb+{v>;P#M<1t-6l-*${VCu39LZfzR6JF^=%MR6Xwg+E!;+lNMC(751E4m%}qTQ7M6 zKU+NrEcjFdZbD^M@S5^)0iG?uv&ae4UKS$!irc*;l4m;-reS+S9Zs-NGq(hd71Bqp znOEQ)Vd&Z_U3k1KYqaw2XdZR)?v!&fVfs~IQ&B*Fc$nTI^)X@)`*Z_3K7 z^37Kibg9Z|xo=lHHLk!m((Pc`=3a(!e^3-+9@f~O0E z__=pHb)LE&;)BMOs&yGwIAIAHr2Yidm~MberQdxm6ha0F8a;GG6Af=B7KDEy`FbaS=BE^&FChA%P0N1%pn<^kh$c z^t7(A4rNkiGca9y1=yf|YtBFJ{c@Dp1(tM<>%(zJD$~dfMo@UbG5wp_`6)U9m0Xsv z%qx3H1`}Nd2{Tv+`Hhiw-zC`UJGl=egGaz1FkyeBzC+n_H+y<~6WMbcd-}0w*Qv;! z5$w5|JxhD=NpFTEq~W)P$Fip(dieYH#@o=sXMbO4*#!2Ti$3^p$mImgiga@)%$sgz zpdxVfz-O|eyZ6Cffjg^{Qf~Z%@njC(mVl>88{HR|RUzH%gzvy?!Sg_{>xCSMZ?)9A z*eULQj(83uKyji8AJfBE{@n9rtKVPE1HRKpH7*8UU!#-^^9ZxD{9Y&|$&~iu`hbv51Yka2Ddgn4s>zRu}N?HsaCxhda@NuIQr#$HW z7Yu=E20DdpVGWwiLCY}+RJ%bXUs-f-kI#M<`jwv+QN^=q~bH?JGE3KsEMY@VeOwA!PdsrO(eZ_LR7S@(!Xq?d zC0n^3nyxe47Vc=pR<0)z9nUp(c09~hu7`Ik4-jG@R=e2B_3)PFstDm9sPI+@h+CS$ zDXwY}Ud4R#Io|>9nDN%0@(^$DV3ZZ!^a@6;;HX9z1+QELDvi0TC|Idf$Pe$x5x}4*37?TRE4GB>MmmQz7erfW2S>G62??OmIb?{0;H{B! z*hSj&V@qhxXosf<7m=`sqrR#jb8v%7B^1im`?)9yUy$})(8kD)8<>9}p;QqGUvkt$ zmGCmCR6?#uNQsiLkF?!mNGK*xzCVcB?FgQX6o6o_=Me`(l%sg4ch?aVcgPz17=1EX#o_tk~25y9o8f!TB10sJR z?Hxr0#K@D#D1&&+V&V%(t=*>q@T~gyjC`>qXP%2``OGG>(JX9?B;#&?8BM|5r3?<% zhaP^{coO@Kl^7g2fSiHZX5<{sO6cUjue@j3X)3cXo-65=zz1DR#hC%s6{phBH7*g| z%h4U}aV%OnhjBw5RI*@QIwZo5@t$QBIdmF^Lg9r;;)sZK_yv5X3sz?sEKq>z&EZKf zs7wYOV#tP#2Xio@?eX)Y#h%YmZV_vwf=Z+9Vq{|6SH=AkogLR7&oYCw-;^&pyI9e- z5B1NN2wF&g>r(!4uSMDl8skGuaaRva8H%M75x(vMTD!LE>Pj zUZ*ZXxOJ!atnz_%uy|p)py7BwFfoLoEje^UxuSLfgNy1gy7A!dCWHX)tKMRpluy=p zmbK>4nHcJ8)Q(j~XDrEEQPseB?Zs-Fz@r9uq?>rQzirg$6prq}(WYxWh#&>zx1#V0 z8kM7H+mbd3v@qo?Bt%r-Teix`eHh6@H$24C4BHRWRYMkNebDG8=2|{z6lhS3W95qy z*1S{6@>3T--VU_`Cu(vY(bdvq+XC)2$Y!W)f<`9ntAV9f@Q~4TFp9DQbosm?w@sMe zKuP*WE((JTb3Km+no+NYa!3%kv~GlQ<2=i{l4lF>#CrfC&JkA=JGX_N6NKtQ=r3S_g zi59?cHZf+PZ38~T861$I(1;~n{VcD`t~7+lt8*7YIt7`?<8Ve23Ie?d+TT7 z-fgv_+}ln{Id$&@q(F7A7v~p_%nr@_k>$^2D0(~7-36qGcCTvzbc0hRZy0^yEkuI1 zb?5l3bA4tPd>4NTj8E7Mi&A(Xxz7Uk==tItVnBo{lRV3AC-H3{hB2Om5upx@aUT*P z_GO^fVB(Wjo@FCQn<8qvDyk)hTu2bQlIulTq6LCUf(U^&2I*fd(e9FnaDn)dWEm*U ziSA??Jr@+wYJ4n+0n8p{iY%Cbrr`XX8sACwxnLh<-Jo&3I9}FkoH0z5 z`AsBsUr{i32#O`v0h$D6vpeeB%ghGMGU>AwqV`w3EA0x5f*vr^GDTzc@ zyO6N^DC|fn5mqiNtSdsE-%NAWv4B!lmR9%qX!>$z$XQDvP6gc$0kwe|w$OXgg3!a_ z6{8%815=ria;M1%pShmD0T2>CnZoZB;l>-t{^{n1z#!xp(ocsiFv~FUR1$XtvCq`A zo(yKx@LL(6Y$wdpstxKObYud9I4L0An!t5vMoeHsO(@w9))uQRK?@VOjD!5fSIE$T z70e>VOkf&yS`a7JThD!x7A8$#ba7Q#%X(Uv)H?yYh^rPN76ad7E+TZE7AD+JLg-Ph z{#}_X&HWiU2f_w;fWkVcu#5XLR`ER_W6&kATkDQVT)|ve^ca7s{iqQS3&W$QbF>Si zGa9u`%Bq--Z?R!3zZpxB++Mb^}*M_lQQMZf#8k2wL?9nm@Z8F<;wOuK69bzCk`F(Pn1CAIt0|P}R_x}K;pwSOns{O{rF_nKn+A%StH)@w|o_5wtK=*A@ zFG()U#HuC$yVycE0fyH^or|Ub?0g6gJOHB!z+6ZtbF|OjS;0MV%D0WT~BD~3m zV+3mR?Vq8qg|@rV=?$g%m^8~kRJxAsIH&@zY)3;2TfKL6=J-RgK{~@bQQ?5 zu^aY%4T}~Q5UF%f@klgiv6EVzJnU6L1#c#gPQt?&Da+j^@deB)?yxu|271VG+Tsmg*Cw{e-k%{y~UDB??3xP~bc(LpdiWS&q84QF~Of zQCN6Oss{1gGsu$SxktHUu_`dHnR-8(;<=l+ifx9f;<>K6iVY#L-{{Y(znNq}WSAg5 z$2)SKWnWR}hS1r{Wz%{(ouD*dlcp?an83Vz!H;VsKxlccGrk`!r%`t5(m~&I(6-;j zb4{@}U>rR6RW)AW@Ell(^jx;^usx?d3dqA09>&WU=`(H5t+hNSoDu`G5jsfvmgjVE zAqRKU!M9?tdafTr81IehWqVF(50kbIXiMZd_z7o_;hZJDjKZ9;37BiXA@Cy(F~ULZ zkE6|hr?iE?iD|0Vph5692G=te@yd7{<6>0tLn88<^7)f|Mt~1S_roxsxeW}i6Fyrd z#KlUAjJqQ2s|-$)L1R(GxERCqtf4hBchD#d-M>-VxZ0o%o?^O-*v24#m%tpZ11K=9 zHU1ndc@oIph(JzmZ3lAR1qjwM@P-8P|Ik7Tx>y5wGZJ**Hp!883VKwGdM@=F0R7|; zA^$p>-Hu45s6>iXQ1H8Z$U*Qj54KY zO^R-yV8%k?g1ZOcj3*owO4g2K4TQ|~pg@Ot>IwQNW}ezBJnTHBJkrSHyA$H>C87%5 zy#XNuR$ma|4tGBU>(kw15f{38%$6B-A(Oen#JGSlUtF?#Lk=2kcdG{1bMPP?{JCMf zdo;ijG-_XK3sTyiq)i5GiQHWxbeEH|NtUT4w!5ptbzyfWS430X{X+s=S`P*ncYlc% z+#hbVME3+vO}*@z2u_cJo1EHZgV znLHR`@^(3U7>N|a~jO0^_0Qy1Qsn0XJO>&P=NqbV^nwi4nZAM=!$ z8G;sKCWpj$PdfetYD>Db^UTX)oQ>4^BIqnt#JDcbJfjqwN%8AXw18bj#LN9tyNXb< zPf7NPkhz)>%~C~dMdZe=BBlusJ7$!}cJi2^JcfuWjG2$Y4Kb6#Kyu;vRx^kcv`CnHG@gYha4A2p*+w0!@*C z0hht)JV899hpD3~f+bFUo%6@MnP)G?B%MkhmidE!^tlD5*&b?#m)WSQ>S}l-tgL$E zS2Fwku!MhU4Axsh@tADTSPTVKu+siU+O43C7A%{=hzB)FxEXu_i-T2Er2+^N{Rg<* zgfr$&G$s0{#UsL(W7-n^ccX>q|B%FfBMyTDbtRwK8FRh_L%BLo`C_On(SOf1&Wx!P z@uc|eM;gE`swz})f<(#OB>POrTvt}6)-0;hP};>VsvZy?cJwQc1oD`vJZ=?L82zik z4Xj2INDlAw{jl_YjgS-Glo?$_Ch5wgc8Ez+h0uP~9!@4lF_=vDcx_L`zQ02f6R>*Yj z_--Q}H;rDPtGJuhUgprlC_W?P^|?1XuJJbBn5qdYp0M_=X9TvTDm zc(A&H71sl&w@bsz^!5*(Z6~}dGs+;73xtW$jYbI7;ZX^q_Bl>(s|LL|`11nsb`=a( zZ+{Qm1&ybnk$PKcdz1Dp(3Zs8B`T>V6W{9X5y%zd?fHngu(wm^pef!SToxXki)o6t zd!hwzPa?73Xo|ss(vs-y1hG(TGn6X-9N^u)0_JAUsAPQX0pir_ABzsrL zTvd=rH9JpZ0Ct> z9-+$TLS{Z2wWl85BzPB*|6@nX4}Bq{YxN#9VA_kCU6VHnx?= z)8sK(dE6+f(Az_iDd6q7WaaR7eR!GPt`u^@M>3|E>s4wZw#`aRN%@V3y6Do_h?``jNqf+FP;?Dz4Y`f)V zD;UXkNy$DY*-jyIC8O|AY?qO%SlH(6-7vP5$7=F;RCx>+Rp{+;0#H{&Ovvf&R#&UH z6GKkOmlVkI||!3B4)$hRtz+Ak26O(hu+sR$f6mRF2f=72iQ}OmhwBYT_NbEOW#o$0INpCi` zSBPy6QRQY(S-d?n)roDT2#}%@D8lP@ExCbUZ*-LGFv-6EmSnDLWVPnHeYjX`KPxTRVhOWG6Pl+4>D!uC3rCW>wDQ^nhN5bq&xr}jfry!|+_ zeF&P0w{sNR?MUo58enjsi=;Oj+pEPkRjBgSP+7eFLW&dHN^w3Z55#! zQ4*PqQ6}CHlU{;y*KO3t5i%EAOoDA~Pp%avO~|CNFfmdvCcGR(C5V=|XC6)vI*pbb zeB^7I!Z`gWH>Z4D|4$S%_#Oc?(vVTwR;2wHv?W;%N|YdGNzo(;;x|O8giIpK=1|Ba zS3y%kW*`&9`g@!fWImFu6*5zb14}8z+91 zpa%&CsgTy9D`V%6-V>5@m9{6(>w4rCq`#8!mRn z)GD}`Oy-A}Y!W7e$z=CeJa1V5MZ)JTTcmpgyYtYEboq&tLgK?txRi%(meMWoq4m(s zTWIp3o9P%VPYoS_8iDVjqxf>9| zY{(dhp69(3yL~V3mGW7cu)V;hE7&wYoI4^353+8;pN8_3$5t;c69Zcv&aft;@%;cf zP6bD=$yo$k0Ge7>`=_&i5c-QG7|YT=^Du;Og~>Ab$gTSZlwtYEDmcki$BF+?u1YPf0S_zNpnt!zOD+et_%o+gC{6yfFV zI{TJ^1iX^XmH7*qYXTP$Ik#$sjEUuqE($%gVEIdU*ttr1yg(kiKBp+x+oB4y$hlb8 z5YTImgQ;U>x(^Ou1Pw)`sXsrH8U2q;9#tm8LrlgYcEF_fiAW}`EGCH|CfkL{`()x1 zCPtNWpz#uV&04>{P1pos`3iJ(4=s!#+acSTboXzcHZpf%81B4`L& z$dFA)>^IusPoR+`G<&t%C8pX$^=m_YS?wlYN!Qz}olM$-g6f7G zf`K^L-$y3hl}UpTlVlCUxlv(w5`!6r`_ECxr1v*kn)HpkL#4j zrJ@QWX!>swK~>1qk%NANBk25ZuCN_~^otptM<#A%a}yPP9ib~=}eM1e!7ldAmdjcf@Z@DLBorgX#^>4ebV*=?LUp6 z66K&evI?$w7ZKp~dYSq!h`dm6FI51~~ovJSeIx3?lANM|yGPD5VN3?M%|{+4j#Ps6;tvF6v<`f_}lJL{J@m7K)(c^U;(Dy8j16 zNj|ie2+BkY5p;qjiQiZRqCjoQs&*ZO6JeO@S*m{#)Rzbv*NEcm9HbP_k>b~_bgNwl z#oPA|B!ZOeC6aw2WUgj(w&b8i#nwU7gohnL%HtLCn4vs|h$@VrkHHNQR58l=%`ejk zx;W$z+(*TX-X@c4zy!}fTnarR9eh}5J|sr!B7`=AfhT_(oX%CQPfos6}?jguM5SrF-yD_@K0E4 z_0M{;`f)Q&VSI`C=?U2HFiOyP6FRC`rQJx{6`+k4i?R-T)3exBK1SnfMfVz@C|Kx4 zi-)j~dJUR_g}c8;yuXV{3l@f<1uQfovER5Ig9C=-Iy;;GEK#wWD!ZYwVBwDX6lZ5s zrTCl_g*f*KXVX9Btlfr;lIReL~0yzsQV!Ad?hfV(bktXk!**UbrmmYnA^ChsNp97cf+PT?wTm z-WLUZ)YnRTg0wp}mdw{B%6s!<<&oN}F;FJH{+*wNe4Si~ruh1ygYf4XXez$G7cKaD z3yJ;45!frx2nDUk@TNaE-x%RA62_DW^rhi)ETnB1&6_uwgr7=y_?XKdj|uNw*&Jr2eIIFTmby8 z6cYQ5%P=^QfCOkC>Ep(Q^&MIjI+{X*t0~mjjr9g!D8cQ6ps@-z)gV#2J4v@2bVVNG zguQCk;-nAS$M0aZgG(2WdC;5Dtm#&5#fME-V{O-) z0*~PUB7FBnmCGd4He||IF7bI&ymvxSw-Yxm0^K>J$dSD(P?G{r%2#NN$6+>{gxFub zb;5H2e8y$>si>(;q}0``VweO5n7^NsvL7gndcOxpM2-9x@-2k`C+Y-vaCC=fw9DZReWl^b}-Io{xvib?iGvGUk(M%#g zg!0s(XbQ^be2q9P4-ZL<&O{3_dJT#FMr8~R+#$IN7?zBV2RBgT&!*0UKekZ5@)CN; zhObgQMG6ln!WsR#ui3Jbfs#E(vg$(Snjm?c8GV7EJl5^)t-`}bx$=0PJa(-lb9}Ev zf(4d8_mIS{!D`*Hdfx}@Gh~J$#MBFAWkzq1$)n0-c!Vz`}&*U!aj{tF-x~{cc5!0FMf97M%gW%d4(d=aD8*({xIqzK8EV?M4kQ~Z*{38sv|Rk%`8%@V%5dNdUd8%~ z@-xE2jv3{#ojhJr9uq_rRsnm!4Xmaz{2VcpUPEK%ijWu1kr{nOCjFI3a)?O>4ZIQ5 z$HAnm#pK6}ZC6$hCWpwRnlLdEF{aqmRCk{6~8KsD;4~ox05zaF|d|@$?m{Bqp$=(w(*LeV! z?g$4;^u)?Dx8i_1ydzW|<;i1|^5`t8FlJs6oV%VwqIbI6fSZ|T{<_HaLM53|6*6h0 zOiG2AB(S(LU2)8Sj+prbE+mt@5R(L9Qk_f=ETxLZ90Y4PW}@=UPnbq{In!y><>1$J z@Bj?fJo5octe|llG}4$++Ipm&2-*_GOo{T0Pii@dnQQHsnGVQ=VvQf)uZUBAjOy*|!HI zW|XWo$tDSzYu`SyVV+qnSF!TUm2%_O&NIp*g*@6QkMl$o#!RC4%=Io3r_AKkRPRpc@D0>EL(_R(G#O)rR+%ZdP#6_3 zD6=vMMu8YjAV^0#fFOc^f})6uh>!rvOo$qaR#cq53W|yo&f-h}8AV1#5N8}Z1};ua ziuS+O-gT<0JI#IJ{_oxIyV8|fwaz|g?Y+-Fr>d(V=@bl>$lVD?ko$FlLpI;99{xr$ z9V!SZMPNKik;`fGj<;R8&uPHsOevy>VMM$ML^MUL+0G*niQEdiny|YBX6^feG%Q7) z+RjgjQbc#TOKap-j*;Z(r5vY=DU|yxsW`21^c-Jw|AuQQ_vf}z0lK3{V@Xm|NbDA9 zJ}P%ybk~E^M&(uuZsEo2-V$Fa!w9O}pJDVOb_py}xfMH^*na_ADY+{Z-D8-+RPK9` z(?srZbOBH9j1f2#x%+K{q#^WEhf6uC!ifuxV2pCb1F z96|2Y1c&UOP+*6vNt!g#-9!fGHQM~=8?M}gQmKxKZbiI7#10^$(OtHcM<%)z_6}jM z2+XR7N=c*pL`*4(qx%}U6KmvFj`zrMqjK~RQz&w9|&6^FpG7AMt5gekvO_1$n6Ltw{rYM zj%mtqshC2!uSQry?o~__zUXcanJIU&r^4ydqhCqVMM&(oH}cY>>^$VcX`|7t7W~PJ zkGv{!Pr=11cOAqG-Zu}6RBpu{A$Bvcm6E$s(Y=t%UQOohkRc_yr$V}@+*xCAC~_Bn z3`tATPmy~fjv#kmf+S88%fyy7e#K?4I15NY~-gzmHD&6VdPehQRH|IPpS)U>$^@SR?jv9!07xOXh^_R8&(Itu_dC|0Enl_|)K-7!;K|fUy8Jjv zhAPR~9!a;YLgK_ZRdtu79M-7TXA8+QYrQ|VmByuiicf~PDSjwaoE?1U7*-Q*aKJIH(`6k9v+8%gV+LKF<6%{ z--eR^9wVK66L!Sh8oH6imiq|Kv+#1gH8hcXd$A7!sl{)S`D8NlrI`4p#fFGISi;kM zUj#2X{y5w+;oTLh6n4u?j`?+w8#bb~*sqJs!%#DAPm1f$`)qa5vl!C~_nz!W*Ro?r zDbgP2E$Y~Qs5`A8V?QuzC&JqSRAu!1I-c){^A!RbmbXTexY1)CMZ%+QEinz@Ya
Hf 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⋙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 literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/errors.py b/libs/win/pydantic/errors.py new file mode 100644 index 00000000..7bdafdd1 --- /dev/null +++ b/libs/win/pydantic/errors.py @@ -0,0 +1,646 @@ +from decimal import Decimal +from pathlib import Path +from typing import TYPE_CHECKING, Any, Callable, Sequence, Set, Tuple, Type, Union + +from .typing import display_as_type + +if TYPE_CHECKING: + from .typing import DictStrAny + +# explicitly state exports to avoid "from .errors import *" also importing Decimal, Path etc. +__all__ = ( + 'PydanticTypeError', + 'PydanticValueError', + 'ConfigError', + 'MissingError', + 'ExtraError', + 'NoneIsNotAllowedError', + 'NoneIsAllowedError', + 'WrongConstantError', + 'NotNoneError', + 'BoolError', + 'BytesError', + 'DictError', + 'EmailError', + 'UrlError', + 'UrlSchemeError', + 'UrlSchemePermittedError', + 'UrlUserInfoError', + 'UrlHostError', + 'UrlHostTldError', + 'UrlPortError', + 'UrlExtraError', + 'EnumError', + 'IntEnumError', + 'EnumMemberError', + 'IntegerError', + 'FloatError', + 'PathError', + 'PathNotExistsError', + 'PathNotAFileError', + 'PathNotADirectoryError', + 'PyObjectError', + 'SequenceError', + 'ListError', + 'SetError', + 'FrozenSetError', + 'TupleError', + 'TupleLengthError', + 'ListMinLengthError', + 'ListMaxLengthError', + 'ListUniqueItemsError', + 'SetMinLengthError', + 'SetMaxLengthError', + 'FrozenSetMinLengthError', + 'FrozenSetMaxLengthError', + 'AnyStrMinLengthError', + 'AnyStrMaxLengthError', + 'StrError', + 'StrRegexError', + 'NumberNotGtError', + 'NumberNotGeError', + 'NumberNotLtError', + 'NumberNotLeError', + 'NumberNotMultipleError', + 'DecimalError', + 'DecimalIsNotFiniteError', + 'DecimalMaxDigitsError', + 'DecimalMaxPlacesError', + 'DecimalWholeDigitsError', + 'DateTimeError', + 'DateError', + 'DateNotInThePastError', + 'DateNotInTheFutureError', + 'TimeError', + 'DurationError', + 'HashableError', + 'UUIDError', + 'UUIDVersionError', + 'ArbitraryTypeError', + 'ClassError', + 'SubclassError', + 'JsonError', + 'JsonTypeError', + 'PatternError', + 'DataclassTypeError', + 'CallableError', + 'IPvAnyAddressError', + 'IPvAnyInterfaceError', + 'IPvAnyNetworkError', + 'IPv4AddressError', + 'IPv6AddressError', + 'IPv4NetworkError', + 'IPv6NetworkError', + 'IPv4InterfaceError', + 'IPv6InterfaceError', + 'ColorError', + 'StrictBoolError', + 'NotDigitError', + 'LuhnValidationError', + 'InvalidLengthForBrand', + 'InvalidByteSize', + 'InvalidByteSizeUnit', + 'MissingDiscriminator', + 'InvalidDiscriminator', +) + + +def cls_kwargs(cls: Type['PydanticErrorMixin'], ctx: 'DictStrAny') -> 'PydanticErrorMixin': + """ + For built-in exceptions like ValueError or TypeError, we need to implement + __reduce__ to override the default behaviour (instead of __getstate__/__setstate__) + By default pickle protocol 2 calls `cls.__new__(cls, *args)`. + Since we only use kwargs, we need a little constructor to change that. + Note: the callable can't be a lambda as pickle looks in the namespace to find it + """ + return cls(**ctx) + + +class PydanticErrorMixin: + code: str + msg_template: str + + def __init__(self, **ctx: Any) -> None: + self.__dict__ = ctx + + def __str__(self) -> str: + return self.msg_template.format(**self.__dict__) + + def __reduce__(self) -> Tuple[Callable[..., 'PydanticErrorMixin'], Tuple[Type['PydanticErrorMixin'], 'DictStrAny']]: + return cls_kwargs, (self.__class__, self.__dict__) + + +class PydanticTypeError(PydanticErrorMixin, TypeError): + pass + + +class PydanticValueError(PydanticErrorMixin, ValueError): + pass + + +class ConfigError(RuntimeError): + pass + + +class MissingError(PydanticValueError): + msg_template = 'field required' + + +class ExtraError(PydanticValueError): + msg_template = 'extra fields not permitted' + + +class NoneIsNotAllowedError(PydanticTypeError): + code = 'none.not_allowed' + msg_template = 'none is not an allowed value' + + +class NoneIsAllowedError(PydanticTypeError): + code = 'none.allowed' + msg_template = 'value is not none' + + +class WrongConstantError(PydanticValueError): + code = 'const' + + def __str__(self) -> str: + permitted = ', '.join(repr(v) for v in self.permitted) # type: ignore + return f'unexpected value; permitted: {permitted}' + + +class NotNoneError(PydanticTypeError): + code = 'not_none' + msg_template = 'value is not None' + + +class BoolError(PydanticTypeError): + msg_template = 'value could not be parsed to a boolean' + + +class BytesError(PydanticTypeError): + msg_template = 'byte type expected' + + +class DictError(PydanticTypeError): + msg_template = 'value is not a valid dict' + + +class EmailError(PydanticValueError): + msg_template = 'value is not a valid email address' + + +class UrlError(PydanticValueError): + code = 'url' + + +class UrlSchemeError(UrlError): + code = 'url.scheme' + msg_template = 'invalid or missing URL scheme' + + +class UrlSchemePermittedError(UrlError): + code = 'url.scheme' + msg_template = 'URL scheme not permitted' + + def __init__(self, allowed_schemes: Set[str]): + super().__init__(allowed_schemes=allowed_schemes) + + +class UrlUserInfoError(UrlError): + code = 'url.userinfo' + msg_template = 'userinfo required in URL but missing' + + +class UrlHostError(UrlError): + code = 'url.host' + msg_template = 'URL host invalid' + + +class UrlHostTldError(UrlError): + code = 'url.host' + msg_template = 'URL host invalid, top level domain required' + + +class UrlPortError(UrlError): + code = 'url.port' + msg_template = 'URL port invalid, port cannot exceed 65535' + + +class UrlExtraError(UrlError): + code = 'url.extra' + msg_template = 'URL invalid, extra characters found after valid URL: {extra!r}' + + +class EnumMemberError(PydanticTypeError): + code = 'enum' + + def __str__(self) -> str: + permitted = ', '.join(repr(v.value) for v in self.enum_values) # type: ignore + return f'value is not a valid enumeration member; permitted: {permitted}' + + +class IntegerError(PydanticTypeError): + msg_template = 'value is not a valid integer' + + +class FloatError(PydanticTypeError): + msg_template = 'value is not a valid float' + + +class PathError(PydanticTypeError): + msg_template = 'value is not a valid path' + + +class _PathValueError(PydanticValueError): + def __init__(self, *, path: Path) -> None: + super().__init__(path=str(path)) + + +class PathNotExistsError(_PathValueError): + code = 'path.not_exists' + msg_template = 'file or directory at path "{path}" does not exist' + + +class PathNotAFileError(_PathValueError): + code = 'path.not_a_file' + msg_template = 'path "{path}" does not point to a file' + + +class PathNotADirectoryError(_PathValueError): + code = 'path.not_a_directory' + msg_template = 'path "{path}" does not point to a directory' + + +class PyObjectError(PydanticTypeError): + msg_template = 'ensure this value contains valid import path or valid callable: {error_message}' + + +class SequenceError(PydanticTypeError): + msg_template = 'value is not a valid sequence' + + +class IterableError(PydanticTypeError): + msg_template = 'value is not a valid iterable' + + +class ListError(PydanticTypeError): + msg_template = 'value is not a valid list' + + +class SetError(PydanticTypeError): + msg_template = 'value is not a valid set' + + +class FrozenSetError(PydanticTypeError): + msg_template = 'value is not a valid frozenset' + + +class DequeError(PydanticTypeError): + msg_template = 'value is not a valid deque' + + +class TupleError(PydanticTypeError): + msg_template = 'value is not a valid tuple' + + +class TupleLengthError(PydanticValueError): + code = 'tuple.length' + msg_template = 'wrong tuple length {actual_length}, expected {expected_length}' + + def __init__(self, *, actual_length: int, expected_length: int) -> None: + super().__init__(actual_length=actual_length, expected_length=expected_length) + + +class ListMinLengthError(PydanticValueError): + code = 'list.min_items' + msg_template = 'ensure this value has at least {limit_value} items' + + def __init__(self, *, limit_value: int) -> None: + super().__init__(limit_value=limit_value) + + +class ListMaxLengthError(PydanticValueError): + code = 'list.max_items' + msg_template = 'ensure this value has at most {limit_value} items' + + def __init__(self, *, limit_value: int) -> None: + super().__init__(limit_value=limit_value) + + +class ListUniqueItemsError(PydanticValueError): + code = 'list.unique_items' + msg_template = 'the list has duplicated items' + + +class SetMinLengthError(PydanticValueError): + code = 'set.min_items' + msg_template = 'ensure this value has at least {limit_value} items' + + def __init__(self, *, limit_value: int) -> None: + super().__init__(limit_value=limit_value) + + +class SetMaxLengthError(PydanticValueError): + code = 'set.max_items' + msg_template = 'ensure this value has at most {limit_value} items' + + def __init__(self, *, limit_value: int) -> None: + super().__init__(limit_value=limit_value) + + +class FrozenSetMinLengthError(PydanticValueError): + code = 'frozenset.min_items' + msg_template = 'ensure this value has at least {limit_value} items' + + def __init__(self, *, limit_value: int) -> None: + super().__init__(limit_value=limit_value) + + +class FrozenSetMaxLengthError(PydanticValueError): + code = 'frozenset.max_items' + msg_template = 'ensure this value has at most {limit_value} items' + + def __init__(self, *, limit_value: int) -> None: + super().__init__(limit_value=limit_value) + + +class AnyStrMinLengthError(PydanticValueError): + code = 'any_str.min_length' + msg_template = 'ensure this value has at least {limit_value} characters' + + def __init__(self, *, limit_value: int) -> None: + super().__init__(limit_value=limit_value) + + +class AnyStrMaxLengthError(PydanticValueError): + code = 'any_str.max_length' + msg_template = 'ensure this value has at most {limit_value} characters' + + def __init__(self, *, limit_value: int) -> None: + super().__init__(limit_value=limit_value) + + +class StrError(PydanticTypeError): + msg_template = 'str type expected' + + +class StrRegexError(PydanticValueError): + code = 'str.regex' + msg_template = 'string does not match regex "{pattern}"' + + def __init__(self, *, pattern: str) -> None: + super().__init__(pattern=pattern) + + +class _NumberBoundError(PydanticValueError): + def __init__(self, *, limit_value: Union[int, float, Decimal]) -> None: + super().__init__(limit_value=limit_value) + + +class NumberNotGtError(_NumberBoundError): + code = 'number.not_gt' + msg_template = 'ensure this value is greater than {limit_value}' + + +class NumberNotGeError(_NumberBoundError): + code = 'number.not_ge' + msg_template = 'ensure this value is greater than or equal to {limit_value}' + + +class NumberNotLtError(_NumberBoundError): + code = 'number.not_lt' + msg_template = 'ensure this value is less than {limit_value}' + + +class NumberNotLeError(_NumberBoundError): + code = 'number.not_le' + msg_template = 'ensure this value is less than or equal to {limit_value}' + + +class NumberNotFiniteError(PydanticValueError): + code = 'number.not_finite_number' + msg_template = 'ensure this value is a finite number' + + +class NumberNotMultipleError(PydanticValueError): + code = 'number.not_multiple' + msg_template = 'ensure this value is a multiple of {multiple_of}' + + def __init__(self, *, multiple_of: Union[int, float, Decimal]) -> None: + super().__init__(multiple_of=multiple_of) + + +class DecimalError(PydanticTypeError): + msg_template = 'value is not a valid decimal' + + +class DecimalIsNotFiniteError(PydanticValueError): + code = 'decimal.not_finite' + msg_template = 'value is not a valid decimal' + + +class DecimalMaxDigitsError(PydanticValueError): + code = 'decimal.max_digits' + msg_template = 'ensure that there are no more than {max_digits} digits in total' + + def __init__(self, *, max_digits: int) -> None: + super().__init__(max_digits=max_digits) + + +class DecimalMaxPlacesError(PydanticValueError): + code = 'decimal.max_places' + msg_template = 'ensure that there are no more than {decimal_places} decimal places' + + def __init__(self, *, decimal_places: int) -> None: + super().__init__(decimal_places=decimal_places) + + +class DecimalWholeDigitsError(PydanticValueError): + code = 'decimal.whole_digits' + msg_template = 'ensure that there are no more than {whole_digits} digits before the decimal point' + + def __init__(self, *, whole_digits: int) -> None: + super().__init__(whole_digits=whole_digits) + + +class DateTimeError(PydanticValueError): + msg_template = 'invalid datetime format' + + +class DateError(PydanticValueError): + msg_template = 'invalid date format' + + +class DateNotInThePastError(PydanticValueError): + code = 'date.not_in_the_past' + msg_template = 'date is not in the past' + + +class DateNotInTheFutureError(PydanticValueError): + code = 'date.not_in_the_future' + msg_template = 'date is not in the future' + + +class TimeError(PydanticValueError): + msg_template = 'invalid time format' + + +class DurationError(PydanticValueError): + msg_template = 'invalid duration format' + + +class HashableError(PydanticTypeError): + msg_template = 'value is not a valid hashable' + + +class UUIDError(PydanticTypeError): + msg_template = 'value is not a valid uuid' + + +class UUIDVersionError(PydanticValueError): + code = 'uuid.version' + msg_template = 'uuid version {required_version} expected' + + def __init__(self, *, required_version: int) -> None: + super().__init__(required_version=required_version) + + +class ArbitraryTypeError(PydanticTypeError): + code = 'arbitrary_type' + msg_template = 'instance of {expected_arbitrary_type} expected' + + def __init__(self, *, expected_arbitrary_type: Type[Any]) -> None: + super().__init__(expected_arbitrary_type=display_as_type(expected_arbitrary_type)) + + +class ClassError(PydanticTypeError): + code = 'class' + msg_template = 'a class is expected' + + +class SubclassError(PydanticTypeError): + code = 'subclass' + msg_template = 'subclass of {expected_class} expected' + + def __init__(self, *, expected_class: Type[Any]) -> None: + super().__init__(expected_class=display_as_type(expected_class)) + + +class JsonError(PydanticValueError): + msg_template = 'Invalid JSON' + + +class JsonTypeError(PydanticTypeError): + code = 'json' + msg_template = 'JSON object must be str, bytes or bytearray' + + +class PatternError(PydanticValueError): + code = 'regex_pattern' + msg_template = 'Invalid regular expression' + + +class DataclassTypeError(PydanticTypeError): + code = 'dataclass' + msg_template = 'instance of {class_name}, tuple or dict expected' + + +class CallableError(PydanticTypeError): + msg_template = '{value} is not callable' + + +class EnumError(PydanticTypeError): + code = 'enum_instance' + msg_template = '{value} is not a valid Enum instance' + + +class IntEnumError(PydanticTypeError): + code = 'int_enum_instance' + msg_template = '{value} is not a valid IntEnum instance' + + +class IPvAnyAddressError(PydanticValueError): + msg_template = 'value is not a valid IPv4 or IPv6 address' + + +class IPvAnyInterfaceError(PydanticValueError): + msg_template = 'value is not a valid IPv4 or IPv6 interface' + + +class IPvAnyNetworkError(PydanticValueError): + msg_template = 'value is not a valid IPv4 or IPv6 network' + + +class IPv4AddressError(PydanticValueError): + msg_template = 'value is not a valid IPv4 address' + + +class IPv6AddressError(PydanticValueError): + msg_template = 'value is not a valid IPv6 address' + + +class IPv4NetworkError(PydanticValueError): + msg_template = 'value is not a valid IPv4 network' + + +class IPv6NetworkError(PydanticValueError): + msg_template = 'value is not a valid IPv6 network' + + +class IPv4InterfaceError(PydanticValueError): + msg_template = 'value is not a valid IPv4 interface' + + +class IPv6InterfaceError(PydanticValueError): + msg_template = 'value is not a valid IPv6 interface' + + +class ColorError(PydanticValueError): + msg_template = 'value is not a valid color: {reason}' + + +class StrictBoolError(PydanticValueError): + msg_template = 'value is not a valid boolean' + + +class NotDigitError(PydanticValueError): + code = 'payment_card_number.digits' + msg_template = 'card number is not all digits' + + +class LuhnValidationError(PydanticValueError): + code = 'payment_card_number.luhn_check' + msg_template = 'card number is not luhn valid' + + +class InvalidLengthForBrand(PydanticValueError): + code = 'payment_card_number.invalid_length_for_brand' + msg_template = 'Length for a {brand} card must be {required_length}' + + +class InvalidByteSize(PydanticValueError): + msg_template = 'could not parse value and unit from byte string' + + +class InvalidByteSizeUnit(PydanticValueError): + msg_template = 'could not interpret byte unit: {unit}' + + +class MissingDiscriminator(PydanticValueError): + code = 'discriminated_union.missing_discriminator' + msg_template = 'Discriminator {discriminator_key!r} is missing in value' + + +class InvalidDiscriminator(PydanticValueError): + code = 'discriminated_union.invalid_discriminator' + msg_template = ( + 'No match for discriminator {discriminator_key!r} and value {discriminator_value!r} ' + '(allowed values: {allowed_values})' + ) + + def __init__(self, *, discriminator_key: str, discriminator_value: Any, allowed_values: Sequence[Any]) -> None: + super().__init__( + discriminator_key=discriminator_key, + discriminator_value=discriminator_value, + allowed_values=', '.join(map(repr, allowed_values)), + ) diff --git a/libs/win/pydantic/fields.cp37-win_amd64.pyd b/libs/win/pydantic/fields.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..2d31a5e9dafb28d9d17dd42897315140ff70619c GIT binary patch literal 391168 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%0AC7u#7y!_ICsVg* zzwe7+>jU+g6qa1@^YYB*DdVUI6Pg(H=yH5ARu5e6Mv9#&VeZ=rCyaWa9LRoAua{gz z^X+a~FBXi-?ypcQoy*ng18In8OzX{9sYLPzMRFIGvswc)YZHTRG&6O*LyWGsF^m1k zV$X9GY^?5gp52h{UkuLCSZ85(wqVFU;;Q-wIN(FFmr*DfV%-Jz9K5jsA1wxZW9}}6bt3Bz zv$*krhPc&{1qHWopxuVP3=gSDYGGnU&M~EvR4ldx))Z8>k5ZYj@?~LBBa3H9;*!pX zBspd_MACauQq5nfwe)IH{<*&2KzaixdgnyLBb|K9X+iGvh`$2p^&cv@;?HVX% z>MkREU!>JqzKB*+D2jlB>N!|CkN8QPDAgw@sxL|{^%oW9jFtZps;(tfJ7h3vwc6Sl zBDDqgrsVo2tNd~)KZfNWi7S7ds()^3shwq&e@n`bXZfq7y!}EMD#{$dEQCbjlh0
7(mQXm~EL?`d@JMT)2iioZMrNm>3XTh7MkE_ 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

u zEPM)orRr={H=Pfto}U?!>nrlmdbubqo1yW7rZR7ds%PMR78KBdC8_z9k&H=T8Vzl!7TeH{1A>jRG+sY0irWBQ4Y;1hr0bH z=BuM$mf>E_@5kJOAGYWpkUCo%{Z@5A-VJ0)&n)aPgmLM~W`n!PY(p;fty0T*kxecS zG(<@(??m$-LJQG7MOcJ^nmYG*0JLLuB4~e7(_Ra-qi9*nsC7M63Cv0=T!}FN)FFPC zmV%>zx7bCkf5;(8lOO{d=9%-s!Xbwk9(lUj?Sn@$A|Vr-Z4c(1IdU2&JQ@{XyxE&B z3$OSbPA7FD1zN6zY(*-g>)rG4sWnCwknDDWj>|r`V?MZ@u8y-z>2xhfideTHy{Hx) ziU~`@uV`}r`_W{jancE2i#k%RM~NHI&MeH=!4E@HwbZ!*-!)K}Kx+cjOr2{RTpjuI z2KDpdQNBbB#?O?9x$4ap^JbiW^RjxgjBl{y1U+$`y!o48e*r{Bu(ld;^1%`5l8p1akjt|9;9UW$uw~Y&uFjJOSr+oB| zsRt@w>Hwxik=kQon;JPRQWWNz0J$D5xtiv(oN~PyH`Ct-@N1*jKzA<-+mAPu5#4UJ z6G(@YL|$sTUj}49yuLj>%f2U^W&aYoAv7>FAk_Z`7>&Qd>N;3aRa{NFY`JF6Vm#r^ zp?m!|OXZDp=Ev&gX1=T{U~|pO=kY_-+C|C5_$*lW4@ZzymEEoqYpa`kiM7YTdUrMo zpr%PgrX2Pe23a>j))ylaDX~+FPm#*rH)2I?1);hTNeCU$odf@qYZ(J74)a~fTM(AH zkAfE{{&_Bfx_ja3e1I=<#VMV?Y*0fDX$R^EI`MJ7qcc?0p@jr>2l5)j`QxBgLwpH_ zc#IQzIb-egs8z1)^+I>g=;qf7 zEtsbvn+jy$nI1rk^<+>$A?5U(htoRh)Ad3G+qE`Ra5$?2Er|DbWG$J_>rDq~!NT#v z28L2_JLd8MZU;Xzu%e9a;9BkRgo|EkItRaJ7k%7x5k8%^Sgj}l5~E+}6i~TRQ~3~- zC~1LQ$A>l)e$X5&JOw567;r1HbXs7f&{GK1w5j&hG2T)B-Smvw(lc7e_aKpEa zBedWLymntBZnUi`Psl-As0Z4@{UNWutRQn~KPt`&Teg&ek z{^f_VaAyyI;-dn}*xwj9FL$GiVUZaQ{q}4KvpVaU)d@jlF)-SN7W@Y6#dRVLUeHmOYhNJPBfoWY zZa$M8DH?k)UqFG2?gkl{bi}-en}$DFV~)_gcOR3t8^3!bl)$lhfM(JzgBGCK-m5BM zf_4us?12~mlf=})>lSgsFg?fK&r9eAh3!B73_c9Hka!Cgv=o4N?ZV@olb}2J zw{95ocfmqS*xDEIG=p=yODgN>8MbdjCJCuN9_ft_S_^9_lpsV_!2fffb-tdD!el)FKfgS&-77yE^RJz@%7q6>jQ zOz@!G5{?5P8y`I>|2FW*-N$SNwtd!CwO0p#%82KoEzEbPHTo&5QUx3Y${LW;PMe_O-~yI zAg9z*0o4_xI9Fq%DaOOepXXeJQF|EF(oUmegvns2i!}oSV3JTdN<&fP; zWS0S1S@*2*(Mq`76q+2s-!XH6`*?sF4PQ)a3c8@Mtu>O<2z;V>yViT!>h(t3GyvpC0;a=a_Z z!`cG3BHVA>|A`vOs&t)}<}#O$2;M-z- z$FmBFRb{W}V4`a*=;mp3ztiu@&;=63{9^YDe^g_bO0&F2RPR7Erj^fWOD7HR}@ z7<<@(VK6pfEJ7WW9m$y@J>G5u%$jo;`&jf$7aO#FxKBZ`MsTMDAMuecBm{_A4_xs+)>~90K|oGL0d-Xr58Tyt#)!9w zXa3(`bw6|S{`YcfhOQXdP}iSZ$Vvx-q2jk93sdBHsQ@f%r1< zQhC4DJi|Y5&kChsp{r+!ZPwt^pZ-1g2TT9JLKkxA#UJJKXBA3AB@dpMwp@?FA!$y~ z(`A)nKYAzVF}$YkbE;;6MbbN0kTPROmlkz`jvN~Fq5d+O*ae*6g4)p<{6)qHKT)EY zJBmARtT8|?s&TmSS;=;W(osl!WFZD_RV?(zaSkC|pCXQ&eC@>Nj8nA5`mrK;7Ke8k z;qZGl^9}z$)NxD`Zg`b18QLFRU6l5B94frsO!H?08|h&s7r-_f6(cXF_Iv62pUZx7pI?s>40i*Kkc#^oOILqxETS|YzgLSdu(zcW3X zI=E=-3x{NSHr{6b$gx(^wf?k+RjHryTF<~fV@OfhXJ*0v-c)AfAS>x$AM0Vite-Xs zdqHukZIK0A`7jXRFIiOk8M255wMAf4biznW29*NYXx!n3RyX(tk`Wk!5Iw*J7QEckjW@Em)eHk}2@aZ7TT) z>r^Jj=o+RNZcU!96o0ok?3^=P;RfY2u|Q0n!r%Ej!Gaa@2XHG=>R0;U-}~wP3%xT> z^ZVX~TfL0-FJJ5BaR2h9UIu#XKhev6^LIA@@9L$ie|bkQ5p$^6 z#AOuYYGpq6S<8HKBO>jT`+rDxDR?Yg8JM!=?`HBz&ES76k>d`L(y_(cjzI1Y4IwEmAf=|p6H7BDoHt$%VzL(IC={sq-kzqO`@VL zcF&xu#Hcy?FrJqMG<@yBpckuLUX^J38f9DA{;4ycwCV5U)ycSoEz1Ux3A10O3m2#h z7cjRKUwk1>bSNBsN@D7w@OZ3J_vp1eG#`x+j;^55S~`{=&v+(-`KWbZxUME~JRu5) zc@oT54>HWZ4luXS#+hrXVkd8ecOhWPZsQf9yUpQ?gT#AZz2m2E#buFsA52;e>;XsnCj@o0Du#dvOe7 zp(qyN9E)OY!h%qEAYYI-rNWB&^lBNXM9CZ`4!mO(@pqEvZzURCIjhgw=G_bU-{KIN zfR?#3$%`*C?G_6e$15L_BDp<$;j9$PWylEuFV@%@kS~ZSfj;;oSa;S{7m$D#T@FliocbdxP<^-*KI1T zExStp$IsQ0?69lwgE}}5&1RD2HA0@y(N%Fz%Ye8{5lt&7x8@4dtUfG=85;SBU?jX8TuS3Dqjf75T9r7?mf((S=eViR*l^ zRW?~x85z0kq|D53*aL0P~4$oD^K^BQi$2YW{EK}nrbLs-&K;=yQ=)i(r{vs z>Ln`h%FAOGAG(SJsaDO$QS>&*Rli48(QR{!4rjVkhn4a;tRPQ=^6{_9Hky9D0OU=0%0ilAuD#I76r^Xw2S)0N z2`3zVS=(UK0m#%`y^5&hhYK?+{ezyY^c_~32-7MVP6>M}d0W5|kqga94M!hK@p*TO zmC1eFdfxp!HHYTi%OAMr;S&N_?#@07eWtbpQpO$V{DJa4z)j>5!~0?xTl(pB_)${Z$u5%Ln>U9vV!Qx{*B0 zr%>HtvSpVol?b*(PPS?r#YPgG2UPt)RfnUft}8!ht)o*Y{rZs`nj)Kt0}(}9&e}L%0tVcc0I_CQFh>WmTV%o5=c}x+G)h}qfYxmtG$Nsp#h~Qw20v7qp<)PN}9&TMiMrV0wJtbgP)OLC2 z7Y+#6^)=6~Q$RSLjIIw)*X`l~yN-nAR$v46*$`bXwkN%0qQ~WuO-s+YXD=Ws-WY3bwE zL~yR4)hzKYlyBwAPy3>b326T#vHp=W5hR_I!|VUZrd52Wye4+(SOrnrR%vYzyKuC^tZgjo6c^Z~<0w0xe-m3GKa1J&G=5clS#!nQ=fyx_ z9K2)pB_8yIhEr+CB|Sz_BT@1?c67y@8U`tO@MeWD9D5A55Tr|k@$4~1VH<@k+h_E% zymDoJ#{;97(a;y=XlTr8IB{}Wb^HP}^kg*jDNaK#hAi_AI0)89-=;P6lw;6>AAxrY zbx6fwIU2f}j-#OuqZ`aUYh_ePLwBXK4Ah~jyH0gGQ`c+gzwPHWbY}{ghOSz+L;}$g zY3!wH8bs63ZB_kKRd@MMOh=QSJSf&j*``=~Q( zj3ZA6mMO+l!6K~~YbX&Y=uUJ!*Pi$g@;G~9XGun$a_sXm>hb1<{4Y9rP^^ zwPLpI_4GPV=*KjAsOw$z{RMT))HS>sgI8mddneCsr(Wc!>+$opQE}O#^S0L0R0H@G z_(FTr*d2|pmTNQN8WbU4PiTq!g)SD+*q`aMc=(dN3N-fN+XfnYaF$4#5uaAui{`Zk z37B)(Q9|Iqr?YoLBRX|}&hEvwpw#7AI=d$RJ~kKuS+h_%*XmYUaJ!l2&}Y>4jjX%- zv{c7VY>(X&JGYc{mDmJ=$Gx8F|2u1giDhL~@%Q49MJ)a;3|kvJHyM4SHa1~hZEVsS ze5Yu2sga3Qq&bU@=IPh}#_E5)^}jOxZ?OK?Bf7lqpq5u+kqN-7I{l@Z_yd0ZbCsg1v{iT7&UfOmn7j+zlhMCv$?9K2fMoEeK=~;Uo+!w&c8=^impga9b+Peq!=V&FZH5~TlB!`}5z{~B zQK@s5@3F$n(9TWWMEYJO=)9K5GJtvVZ8`UJRuw6;BNL(LzT$wc*kttPFzUCfnEsrm z-HOv0|lY8)w321VE{tcEbgCcH&!p%&(NIskRKdEagR3K_??5uGV z9?w7K-K#aEc^*5hk>5Z~__%*(Fjm~Xk>wE#afgu}Kj~Mgp?heAbMrx~*}WHQhu+X2 zSOAF?me%TI0KtFeo{DUpR&D7#uv3)>b{b2%iNrYOo(MT~$V9xPf|i-)KS!<&fuZq5 z$x&>+&PTeU={7Olc|s|+d9AjsEU3TEyWv2gd1_1K11OGDucPPEM?4b^=%#M$XKAeg z#(}V0jBT`u74P$VWC;s?7-%zFD5L}~9mMUqS5f!hTLD(Y1W|TEqL#~~yEjjGi-P4-BTYUYsdoT-eDSyBjRw71hn_!uXzjM7iajr|WOTpQ5ou4#GfwkWYTgxkONH*~S~yD4^&E(F^CH$@4HJ;NV9?$&F)KQW zw=P8C13~W#3W)8$bY4>lB$47*^d$TC3T)E}Jfyc& zuJmIY58Z6wEc^CUz}3Y19Y$?g$9=Jmo%fx6Cl<9BY?xWN?+ChIeOS8t9}B^Icaz>f zQ9em<2|@5?sJ$Zj!gHpCfm#0q)wa!4`$*N!qgnxP7l`a@fJ+|9+-xWIYVcpFPB;Gv za0rZ~$_-Q=L-K=G8Sk+tF`)hqy*4Q_4PCQD23I@`@Qtv14$vs-EBV<1N0B%qn7ja^ zHEVwPgHUpnzEh>Ym#J&{_~2)m*oPB{e{6}oxO-M>vdAl%HY=xM6|L1`bCmkclA3DA zNm;S(9>OTFk+M9r5M1hxvynN=ur{Mwq# z_)#I&{+5v^zWUZ2erU6Jr2lS03jB+pwNDmW7YlNEXh05Hzfd4RYli}~o@Ia?TD|@= zv`);Rb<`f4M(Y-G83Jl4&P*(rv8*kd96^;ZMKJ1piF{XJvs9KgZ%2F;?r(_E)cmcoXW}UOS0K@WpXu_KxlTwe$Jg;g+oVv}#4;yZvv+ptQXqDQR1X=rioz<27})4PnX3-I<*(Vs=`>Lwa`V z?U|DOueK1d+39fEr?GxB4cLadp7hgNX1uB}^}TA(nNfo+A~v2N5F(iCrldWelqrF2 zv!Q-2M4xhKn&{_vqHje{Ss(5KnHAUw&OM;;(V4>MQ8@MSP7)ipaQWRdKn@bY!ews{ zs?06Wjl%6Rpf0d>lc}44#`s2XrfB<#_6ut%2A`1Y(zhl)3|AWoueEe%Ph~Ho1T8f- zy$^*zg$yd`r@`~k6+lC4vj1K>C3+7ZYO;3SN`T`_h9)ZQBvgP|c1x4(xYd4-Tlqct z&}^}W%`UrDG)*x~&+ArZY^ogp-cV)W5X9r{9o3vm6sjx93CQZREiDJx(LJQo zoVAzQ-YLh$@Id{QRqIbJNjFxbUge~z%9rCua%w#~U2?ETK&hxjqrO2ZUZ6F;H- zhK06ycUY$l3$;ZB$8H^mfxKMN@@8`z{^wUn(F&99mH7x)ptD;||h7xf-`7{$+LiEsX1y zNE>mSZON@C9M|i-!D*3r(8GZQmNMw!Ee4*&rZE(33uS?d)0vX*LqES>=Twtk5rO3& z>h0+OEGoyL>A;tzMhR0KRFtx@l*n;dL(T1~mo0=r2;Uvcm~xnHU>2Qqy&^{h zUqds+H`=+Z&AMG{%3lsA_Qe|UhEe|`;scjsVpX>+RCfKi=6$Th)|B9vSF(S>W4V%$ zlIPKeD=8vb8mnOY*c=4MVq)#Hq!pvNiD7_VvO8HR3ZRq``yYzkAiQ;M!JBk zT{A{%$_HIb;k1op4A(Acq^{5qqr%RT7mZ{DIkQnm6^{!?U&ji{I3V(VPCdh~l8n6B)@Ua|EMg`(K|aVN zW4R0(JB-f6!mET|J&Su0{4UfF_)71i@Ee~{l#4RNPjVxKG0vxrOVU+ z&>O}|1UMIyQIY1r^Lonqz+BpekEuf_P|@@j^^mlkSQt56H2j758;V)_>PV3Luk{Oh z3j?YpvYNK!W_02wIz)+chxV2S1m*T47n!&; zupo8XHh&HU5<|efECP>^vEH4UJ6NMvfj8P21#B<`p{@3XXa$dD|1J z@ik1RC486cO1tD%x`j#wvw&G?X6Qx^fkNEwm1V1?ookp$w#o8+5XQZd(@K}zR`#=2 za$P){YA)I?SR&N#QPFe&m2_7%sFTQNMvBc|WyT4q&r3ySbN7*E7Wu&BUxr%&Mu$0! z*i_mVkj;P3cPFap4Y-B8AE2a>WdTxkunJGhYGS8S@j=lhK7(15%IB*NrfRAZ*~xDz zFf(U#2tXAqe;0R1V^Z3ve2a>v!vt;vx=v2Ctv53zsm9!|HTrdpel<;#aYssV-v@x8 z(VaHk=#hnujucoIDzbg}(D?P8iuxJ1waVsI>S{RIXtDeOf*#Af+0i3)pjeo1C2$KYp7{lK0F~k=G-O+r%l8il#FQT8im3s(49X z)+Sz`oXXnB^vRR9hDk4o?&dW(V(5H`>{H=7pK1j6hoJ3(>kDw7?kRA{A_uC)LSe18 zV*SP%ybX2xNkcf@H3;{$(At;-S<|!Dl3q(KK+Uv79*1wG9!ThNrd?yur?QHs zKl(oPNX;uzUsfc)x<|{VlCd5Mw88c13cWKGyog<6wMx#}fi+$Y6TqoFRIz~(uLAr3 z8Fj6M*#B?PY>jt~T-mYCYZT#RNgJGT)ZSqkjvgqZ0FCrV!($C)e1bJ`vM})cCEjEN zUBH@neO(2I#9&0?bLPZ}_y!$^lI3%@{aKnblYcO`vySMAbAWed-P}x`p=sE^JmOTK zT+^^*52aEE&S_gQZ?J{IANn!HiGmeP69a}wJ+L)M=gs2gQ6>HS$K*f~lXSek))gE3 zrmIg%SN|i`3pln=3TnEQCVLZ1M2-BR5f3XU%m4<;FZDS`C<6WV4D_=D=-%}1k=l$_ z!VNpyb`2*4D{QoiE@j8!uJGEfv=JXTZQTaM)Qxt!ZApdmZOaF6!2zD->$9d%;-+V5 z3QgHmTk`pqJS%+^*8Gs?^c31tLn>YmeP!MOW075e2+Qwb@HTJ&x-9e1znNndKU)gt zxcC_vEJ6G%-0+B){gs-;pg-^YdrK@bOZ;{EOSSQ)W#e;0X-XU7A0ewLy>r59zimTU zjU1sXk$(vcZc{HX>c6Qe;!d8dJw)}`mg>=pWaC|dt05dc8l7$g^C~W=Q0C{T9;uPk z%8r=^c4t#tAG~{p2Sl(QGGqnsw&^I<+N-6#$k%Jc)(YNjY2-slh;z+tuLO!escs^) z#TqP2a(1d>hbnkCczR<4^occ2)fmJku{Ctk2>zAvuLu9I6({xQA3g`tWb7WL*tuh~ za%RrW1n=l@P3-h>lpfDNf_F<`m0*Do1g;p+1Gg?Nt&=m-`lCG1MWl6AGB!` zsI(>@FcZhQx@>KkBd~#gE4Dx4=Gga9FDelomRBIF&aOUZE60xB32=C(_7j0PrRKIT zGD8&v02FGh;Q*$13-{+YN229Td>?gx5F0WhKd%AZ9yVV}Mr=?yC?3cI9pRqM4d!4GO zU_F^Feo)?|wkep@N!kgQ&z<5fl#v!bl`MROMV8Tde<)ys0=xENWYF{0luT>ycwDzC zimT(T>6-^Y)8^+T%F?_P#QSDI&G(?*3TYl1G=zBl+*arzNKe#!D+*R6N@io%7+Wi9 z-sQc*s5vm#^&(@Y=}rUZ#90dVY{0fe{;_$QZl#S!7#Dv|!PMs8J9~E*9QZf|Wbe9P zztFGA?~2>Ik7ikcucYnubT0#6?wIUGkF-XA6xbU8i#QCn;FKMCdw&-{0k)Oj1JUtL z@E;I^)YDS9@si6Bn$%zIx%2ti0@S0u1hwQFTbm$9X7h~%A`{?jP0t8Wmd)3JPvNMG z`-YBTsipQNI-9SO*VIzlXo<{~_~%Sv>Vcoaexe)3)uQlHeMc5Il6eOnXL~#_`x1>o z9n8LuOIXE{DyAc|{0^~s$ytp~;EsWY;z3TionY>w+-!=}{aI~+t z{LVL2oaI+$-$I{<#7IQwaFAzPe*e*2GU)mL%Um*ZR(dW;OM9RbvZQ^`-mtObge?a- zv+HGf>hh)4bcpP}p)Y0ZzE+vaB~*68exX<~Us>c&CBfQk*TNM`cS&Rqq~{(|N<3=6 zWJcGV%zM%X`!3pKiO^BT&AWj{YSGtDgx>wu?Z!Za+^@Uq*Zb|)&DrI%XOWyHl9SgnIi9lzCD95jMD^2S>{&RWaWjvj~oCyTS`8 zExw^?y2zP&MR(E_0lz88{(!&1g^oaBd6Z#!c*Z^2d`Q7ySH%Z?$+Dk(@#cY?8TC(| z8?j|DFO{Tq`UP~_pOr=DKIhOd4#%pAUtAhKj#IwR z>o&HUU|sy%n)pw4Le^mZ&ykbz&}Gp zpCPOj2q$VUQsiEmLw$Q7I~b4y?f;|fn5;VQzK9(Ct5}!tgHFmi8Ml*zAuLvlpe>wc z6uC3IP=8;j3MCP4I5AyldK-zdht$y*QVL4A!PbxlX;JH}LdF-MJlYD`7Jmv&`(-mT zV>^9sn57TWS|BbmyRxobGYq+Qayj|#_iX9#2aKJ6rJEzP`LT>7_~*XU`ByjEa(m0U zP0~l>jY%NB(nCgD+y$a53=08|Q8Mj$-Hfnh$>|hLS@+^4i)ow2`q3Ch(eInliA3Z` z{DGFA{NnGeTg`n&;B}lIbMP%fH4)lZ-k_|bw6@o~Lp1cc=FCK-qc2j1L^xm<3D{!- zCbb5zDhKT24jvdyfJ@2CdiTKYbikJSA{k)a1nfb8HD6vm?e{jy@gJt6w60Uhc*%OW zgl?Up>VVQwT373rL})?)oepLlrS%Vd7jst#-d3UF9N8XTiy;|?R`@Br*^>VhADbUB(6Uh-F!_n${6$FPqH5^%sS82q6_TlIW41y9= z-T5~d+C}1I>vU(B3;41@e~|LP8b{M+MN^AL_iqOaVIrqEzT%NPm_drbmdV!~7SFh}8X6;4F1 zqjK^Ic-PWR)*6LxMSOivcJUNG2`maItb0-li2O@9`p35Fd8qo=)~yEg*Zsp1?DEjr z*5b)_y?YaUjOFRx;W}* zx;XJV-^Jm)!9>edI1za{Oc!6h%lKG69r5wAU1;(oYjU8PypjIBz(Nr-_mzz~!x~q~ zlda@1l|0%^g-~DS2D_?B5-4|hsHAA~6@z>%PCATF=!rSPS+u92>mLV!fM+rn=4kdfCT>!_2wg_?4RuZ_Z-IgdYAOzTrT8v>`D<; z@eQsGA2zPX%T-UvgKL|J9lMY*esS9Zm*qnx_G%~OtVmWq1fkGAXa~7aZL+{~)Vz(0 zOeF8WLF2ck&xU|IgP=OBiGgIYRxLE0tX(TK+ks{gUGg$^lMXgqku1Agjpk|Z_@K=) zaApY3hrrRI1Vybw;D#`Pp|Xo8>NVdBNwWCdwKp%2Ce(PEG1=XM^B3UsSC7-_2Y?L1$;+-79$89#}XGia?#qpr+@P?|&*P z54~tAYr5S=piehc9~bCmK&L?*ReVbM+-@4P-fFsBL1v5x@gyKv@ug<;)8Ej$v?adi zvw_~5!HQ>OKVuMkgG+Y9S(xUM{ByDzWe3Weh;IKtr1J^4c4ma#p03duJT!4=2=ho= zdUdxN+OdaH6=G3k-?+IU79Gqp#~^Zmw7XthKAW1@ydL()T`ztZ+C6I&zazV(qG=&r zvfia0?JH=QNQEmdZg3R~%YF(+Wl#Iyb*hGEke_PE&v3oTy`hrKLf4(q!X&FZV+{{du3OrT09dAko(l+V9z z6cb)z%w{^?YNOsOdDqMG#K_H(-*YhsE}~taYzX)-s6f%@Gw6d-VU1qW4eYBDp>A!N^;kc$!g-oUg^m-E@p1!m39i{Z9j%*# z`UZ_xG)2_z`u)XU?2==Cs2gXeTfP3ZKt@_q+wHHh`fu{J`GDH!f{DFo_Ax6HdJNAQ zHPvjnFi1px#oL)~^DavDX)&Uj$?&yCZ;V<@5CAV#&NLs<_JMq>Jy_T z%uin8w_nm^bfml9>NSgVm`!=(R^F!E(YwIim5PJ57zj_k=a;MIYluS>Z`)-E_ zx?WFE3-9b(DCta{(OWEDmnP@@FE&Na^|p$)$*;7Lr8!f?Q~^E|)NPLc!WhsY`lKOe zhoba*m5RBDot}h=bJ)wXf~qf8KMaRz8%1Z=%HDN zw#!0v_X0#0Lhm%9@8iyCbns>fUbI(HiZ(oL-U^NzaSVFqH$s%`!2&1v9d=Kc6e-Mb zz9D*t0DmLEakgU1_Btz7)S4MXU2n|W@i~4vFNS(h16_6N6+FlZEw`Xo}J1& zbF}K$#2$NyKgsu|r6qHhil)cG+vW+Q0kenvQ>n^*lx|VP?`_jyINAq5KHi$res^ZQ zjv!q>SzXMz3i~`^##vjp%u%sebOC?TT@d22=yLty@n6kzHvUiY4*seP{%iP?d@mZ{ zAC8W;1l#9D`#M?wq|{*Em^oJcqxL6vdfG3(T@$Z4h6C zi)5)cCzh7!vo|M}W}6dBnHn`;EbX6+PYKXT^U)h>=N;O~pJb$D!qJ@|Zbs3hwzAjG zZRGlFX_NX@_2QvlvHHEI>9)3Bp?CU$Z)s1{pe=Ycg}xw(LLYgBSLjdkhLfOK%l1U% zBq}E#oFN=dp_evZWW3&XFgS)>Ti0jWdW_|)IV74?-M2+%&11Y;Td#ggTc1txZN11F zZOw3Pji++5oVJh+IV6I%HdkA>?PdKM$mj%%w!?xv--`b#&)27*b!?yy%0FYlgA=h# z8Dl{pvRSr#@+f0$_p5ZgtjhbhVf0;(w-Xkp_mss$%0PC$0OY=(YoH{uOb9&N5&-& zo2tP{uj0Ndk^R3X$Qs_MM|+50i$$lzoVZHxRcXWB&(>~5`_z|uC=X2ooBERqMWrS=yv?e$$#6Pw5?10(Bl`liUApF;Nf zx7Od4d@7hjj>~}W*f_!D>I@*u%6kO3@KwKG(_*|WelruTck$u{qD3y?E4-R$ebbEi zTsP5+*1vc|v>sLAMC2{tB-h0~T{d8sx#rID&6U$!U`(?lAWn4?xcOy=mdi7@f{3op zIIFWhHDpgv%r|=qHe7K0U3tGhew@Q_0c>Uv&lhmMNZPv4awM`fC2i6!^{t&t zYpIzul|N*nsq`-gsW{5Ymr&VOWQ$z#iGsDbnH0q5>Y*?HmF9@j#yTVPC4xItUEp41 z&`=5l2P0|5-5aaFla8f9c5R2C9jTSxA&6zE9fIz(VDtTyhkgL<`cwT}#r+Ws|KQ5R za2<#}D_GsjZx!QEQa4pqKB?ovf`$E+*Vn|(zco1-&UHk0H`sezuMw_`yMb$Ys9B`+ zw`dQ`oh!K{%;w5b3$oj1c|{z4jM=EIwH+b!-uQkVu$qf zX-PfU3cg7k$$`{=|0gt*V)a&g0OA&bXzxL=3YpjmBB$5kkO}<^GH#`E-XcGBE&@z? z>RgmPbuMD+T$vmNn|tmI8hStt-L*To=DElM%}}snlh>}KQFv?hy%WX(^xa)7*`RY; zj2~o}BmJZdQ^H98phP>(P|CUPG{mYhF?ln6$Bn64y3 zx5>T5ok*;SyW`B$aV?3+r}#qC%i`%2^bNnQz8*%aa>?2n{G!QPU)LI}$YiPoYJ=mT zj?7eiN)g7d z9Y^8hIUsC$mbZrW9~0!@dV+zK?utq-VPZu`MgS4={KLvTmq_<+*cnpBBNwg9RU!|6 zl*M!PrbNC{FI#p~@zAv!(yDq2s|HimyW-8vQq^HzO;vyRFVykJ7kgE`nm1JSH(CrQ zB15R0?Dr?J9em@=kX`Y0G`c3gQIl`eq+8132Lmla`P1*Cu8=;>!JtVtAC$BljyiY$9p)o8`y%Tdi zkIsqtclj*?C*~0pL^v+Yv_4kd?MiobqqZr~`pNr2x~&alWDvEp6zDd5#UbgKrd(B5 z?vhcVYt|YXYw&A$r{-D0C=uzNjl(OHN>kflTnmhv1ZUhikLDzlXl?vJ&bP#&d7wOH za%biahVpNuJax)ewmVa^a+MAKN1M{4Eq)MFv$uz;@yK3la}~*H?}2k>y>jSgjMSy3 zNG?-{%QQ^!&_J}HU%xK=%4^f{UuSF6L8tO++O&tX=}qT*ZMu`wriZF}?YWbe))b`?kJv&I#aYi8dIUJ zYz1DW1*2EsBeIn!r^{a1KY7_j!5Fx6J3YQLh3~C8-h+G1L|ohITd+V)>+Z3%JTBd` znv7MB51O5r-Rx+Z9h-a!c~1|$Bhh_oat}3GTx}b1><%N--4DH!=Im0B^do}s;f`Wy zEl#mIw$jlS!NmJN_8ldUf!#f}vK4yH4kG>$S*CUzs{^k4GxPxrsa*1Hz&v7;}M}#TNC$B(iOZ6yE$N51>4uF(i(O>em z_@$ot7>BZNVB9=%{gSqHC|?_rtJ`VIvhMv z?5E?G@QS_cJFnQM=$m&I;?Wq-t10&G@1eZs{?RM;9eKk{K3atnk$=gNxDAfPEHn8> z(t>=Go2$tun1KS?bMO}WeI7V^btth}nyJv93KE<1B842R2`|q)P%L85^9-ixc%CN# z*++K<{q;>fr>|PXo6?VxX&pZz)9O}2v$H13e4|U|IXlj?og4K|#ozEjF5NrOTGoX6 z?N1Qla-;k9g1(9lLH9Q5d6tiZt-Tg83w#_FG0Qj1b9@{fkpFs4kMSV|Y_lvkgB@j- z*Vp{(&~TvOuHA*uH?0;1Jvw!aQ3DcQ~w%}76v3=_whX`dU=iC zu$q1+LJc?wy~f}6lR)FImJ2j6?I%#sbHXL+azEOw!L@HT{W+GH(BEK1&Zb(Rb81W&aCqaPx_rgIgt| z>^q;xt10_!v0Rg{o$8f+Ti#IigH$*Xd6CM=-Rjlk8r#tkj87;j0&Zk&J6O_kJLHaY+6xk#KX~{))qOm@l~mQdM*#mFjS`*s=2dFJ%=p1d9M?# zf_xc&(#UIuiA8(p7q_g5_U1Xg#9+EB0a{F{)b$j|oTn?UsM~rVu@VogvOSX1+H|x^w5iv+Vmn z>EEX%*#^n;gj5pPqu+RT@=0K8)anIWOP>}*Kc&ob%}Dd)#3N(C-s$@Cm%qe!(H-s!Xtiug=+PJN%NSrJWk)xWw z=tM5|z)Q5{X*QimW|n=OmYG(E(&nGlX3s9!t9e^Pn7xcQL@wp*j*>tb|G;%nevwTY z&8X3PNOCRIG|72m(=*Y}FGGk#=x3I;-pMo_|Cw_#4a2RPo{3Tv1oEKncBjU1wK>0T){ZvR7gEw$HzqudL>u64Oy=48Ov*ocE`ol zIK}i@S9Pv$a=Ekoq(?q8^xmQ_>=Y?IPH|=6H{p*<6rZdmhr0C zv#WVW##KN0EaU3=GO8FE9Xa94bVvHABOR4_S036~;t+j+GHB~O%l3M{257aCz{H~M z`IAOV$i$+hCQ8nz?Zk67P8-#BY@RA7KZfzWgp07RtWV=pE_|l7S7T3!(OTXlUPMa; z>9(&3cUii-i*Dti1K_uCgB_cy72=8d*`_os#BGi9#PAoZrJ>eR?xbz{(Hz$DD`yl_ zI_;JNK60JbHGIgZqe&;H)lvU1(j#)Ynrqn{1dDmBU8;j!Ynm@wShr_GE^pmFu!PPe zLJ!CZ=(2D7;?r?D<=gkNzwJ@jygS1X@j_Z*IGSWcpES)lnuQ;xq zoSv+zov0c(Ho7=8x`2k)F^>tOMC5{O96C@cO>cwo50vKrUMjAbyNXM7H>IXq*kh=) z4N`W?JHHPb_(a{#vli>wT@u%{NY7f@bAbtNs+PzJl(aV4L7 z0||E*aCON&PQJZ0cI3jM)>sv=y?_R=ZWpY-87xfB;f9n;(%dS8RKMRV@Mg*|LM`dDY=eE)@uu^nEncg_sBFLxGQQcsWYj+0z z3fmcVD%7eE+`+e0wH7O%VQCrKcQJzZjK2bZSadXB0^N@K&TaqI`O6;+5 zyd_^hAsDW3^fAV_qNz!JxsFHF%Ap!7yL&v}MIDYlt0I27nJB0~_SmhwC4bH6O0qMTfRJ1Ch}a1DTc2@X(u0BtDG5a8Mt!s) zM91OSA}9L1<5_e04aZS0Ip>XynVOHz4U+4iYrN!D7Hc?+pDcDs9N2#9_FdilWQe4K+pN6 zcXBdh@v6RYzGNrV_y&Kb{jTheYFs!vCMywXhs!u^$~{6sPr_2QHyFr)j_0f>@HS`0 zxdtyX6SrZOoMv#1}sUh^phi$zt8 z6eKK$8=e6b>$1yb_LLxOo4So(ssfict5WCkCQll}Q!Z~UO!G%;+CJUzgRr=^6Oab$ zN_Fnr0-8+=a<#I)16Jt3kYO|LG& zccfnRZSIP_V;O;$dAnli3 z=mcMAv=w?uI9Z{t&u2mE=L?PX=W!gRGED1#ZVP(&(<+xCs`LTOvkv9B0zI9GY<4P6 zwx%OYJ8e1lHtB{x3twy^z(K>*e0wb!p+*v+lss!XM58UZpl@E+y8|5hfY}d_D}9kN zj0ylL{?*9Y6SoMq1sUTdZ5%N3CkhxWC14F%z^-?|t||cb(OiJd5U@`Te#vth*+l3_ zU$Qry7O+2L0n@w;W_=5Q-6&u&0lU=!JKF(k9RQ>A0`~c9nQm@?O9A$oK7o9uo0S4K z4Pebjh>7dYlo3GX$5b+2vJIdajptPzis^Wdd-Y2qbaMb*OXvV(OXLUi&)i3W$B`W! z)~RI4ja06f6NO&M?$_zaj^^QZcYS6`B%cfw*330Z|hdUfjgWBQZb5SK*k%Z zgwEvTAQS$EZoTbGL$`+<6P<`dS(h+!1>@J81d`Mh@3Z(xCxYla5KjGAT@(LS=>{=( zQ-!wDHFTQ_g7MGUUDs(SCx#3NefJLTgV?0ywegKQA!K4ra65-7bGvJa{|(leA>#ze z*3@=@2ro9${GA0*l^Acg5$J!t?WCJ8@l7CZc3>mNC4I!J9oRUzi3iqko$Gl>AGkV) zL6Qv+4^3XF&upiQm5ce_^A7c-4eCK;ym=dr*Qa)}?MOAp z4mZD@Eg@Atf4$iMkRD)^x1RRf*_P5nAMosV?elteyTl%NPS5FpCpva0C4+!xzcC+R za<~@0RtqtuROHQm+Rk<~Q3Jml4}JU1b4Aw>U1=-5N}6G4|0%Z-)mi zhsEp$oiQ)-jbU_$2M!v+t25I%U;1fAauOrCHxKEN{F1)8k(~XiKHErM1~^7?TLaco z*O!qDEF+gZG#1SK>ZX?CJDw z$ieq(hX>scH~h=KnMa*?y=OMd|NczTF7NkDnz2e7Z?G;OsLGd88I~`V zZgC@cCERZ#DElHag8e?_)kg5wMn8hz@sJ+D-#ty^p~d2E$M5?~l4AWHF-ROWiz=4p znyb;)2;NK#LL<22Fh3w1H9M7Wfl#=s&JG86w=hz|P`_i|MJQYs4pJ8;Tkb=?OKny1 zzPmj;t5TOtrGcvS@a}~}E&ZW8)1gNz>w|IhJgES2^gvuL8F~!r#jDX{pC>&%cIP2Y zk1sva@z89{WlxWbocw=_AuX#s(BzMZ!93fVOe}QiSJ>0b>!J$NEZo}$Em2zh$q}XmvntsDo?ONy8Q}h5HC8q~AJ(-#wSebn9a4Htp1FMpq`B8dcgVO^JjXw&FpUQ+r zt~x>im?B7>i6hzLe5?vT&fsSzzKu^5?RU>7vb4ZW*5S#je33XOUb3Zz&<*PjuY0av zNfbSc>*w=oT))lZei%bMq`7{hCu}_Qq6W=rffcKHj16iqNExo5ts&PiPF5HLEzog@ z9~HR%9KPjpeI>Z3mA1qEYT^E7m*VqNKINPw%(yd461IGcad)7i0@c@&U2-*vrnza3 z>zfy=OUCtOEYM6Tyd!SSOmoY5HS+wC0WdBh`#chuJh2?28@9 zp%vQN$~31#U5ie0zsUSBLvds7G$*6t;EZh|<)gf|Mu*GY!exJODNr`#-Arx^d%JSi ztK2G$GGfij6S3a$v7#M5Og@ERUcbdUJV%vpq%!Qix9kZweuH0S{JPQUF@BPhUB@Ql z5xl1UY{V@Yi0)|Sl$y?cct{W7_E1R{T0HdrOZsd>_zgx2w+d}bZEck8r--HFUP9?G zUQ6T}Lru=T`XeC2^*Fg29fnQ9a4y*rEs=Y~9xzh~ZR;$%R)<(?QVmZ~?f6W!xvDm; zSPDqKiw{c#c*$FC&*J>j450Y}bh{;|=c*bg_7iiQoSqe(BnDF@1_MHmGJ6^Cchv0e zc^}%f<+b?~YMuKi548~PG#=7~`v3|!!riNh)Ddp1ocys~FTd&t$2GN;tz;qG3Y7t! zQSmU5JFx4PPPAut+zo_ zb}=Df_>%+Ne9kbq4FnF6wL;`cnLy0G+)c03FWt#)^~ z{yRf8h~$@+{kG=SbWigmJZOgfCl6`*pRAtAR~Fh`=7*#IVA*}Key_{u&YEF&L~|JV z--KdP%@YT@%DM{xCg)o)!(Q+}QS#4!$c;AqF7nS>1^I6^^8cW&yh0jCzRdwr4M*CRC zLp*dNL`-KWxUF#Rh`Imx@UU47dN?}M6q=kliJRRitavyU@R2kCjs=i<4|Wmb^yPa^ zY_^q4_73J8MDYuLXuQqFa1T*!1GyXQi?sDwsJe*oq-3XMK{`A z*RKdhy3~^@RUSId5WR;cYRO@!AU!v8<7hZ~E#DQ+vJNOoLT;Qj{2iJYNe8m9U(QEi zuR^u)(Ykk(b@GDdwkQnUJzC4{*?D)5`lUsw?^`e7zLT&j7F)oZe}$bo@caFe2#fP< zo9^AqOdsI~^uZj?XOFi6)VRWMSokX!-@6HICs`p=6eR{LK zzuv#lYE%&c$^4H~AEG(_Yg^aew(%@&?*0N?4+iV;9;o@!#ygBh&QRl>0B-&_j!#3$ z$tcH{Sf#VAhS}LxFSkSnJ`hx#X%#O~#gAxJyDOY~yd|t*4m*u*nyvpBEj{Acf!|#E@K%XA5DtvfYLL-)DxRfHtg^QFsx_5Q_OF~!S zhWCvy*O^mQQhaMs3El?j%OY!8PlnA$zh_jOYynJ_KmZ#5VDZg@$`_T^?k9MNgRODJ3BmN)7+-RNZw z(P*9FV_ClRB-}6*LA2h4qXYD)fNFk^uAvjt7P7H9ju)dQzRno-0%)Ng^yaN@%W4D; z9z0LuO0Uqj)$xCbsyZTk==+`Yb)tVMvz+6GZc_nU8>@Stv;iyBJ9+4V8CrAfHv&Px zw|=WEq{K~mo)V{;BhP~yNsR8IGw9z1-V5?cVf-rn43gj{w_~_r2PjaW+>N1d*sLdL zoRt#bYOu1V$7J3PP1J9uyZ}dt+xT3AdPas;T7rPUM_Ea?O5RI97h^M-ArqGWXRdullM=T*mF7cC>7fC2Xch8rdU-F|i<%-!vdJ*xM4L$bx7Wj9rm zY06x~+!imi4vXz#O>x+;Z|eP@WbP}{!hOC$Q(c3mtWs(YWzceYKA-|cT|I4bDcm-I zA@t_JSlk@W90*6-@tHZR^J3;VtWjb#vEfQw`Xtq}RBvAlb8oxRcE$Yf{hJQy%(?p) zJNR~>5@%e2<0kOU5RaW{ZS|YC2>7!MejnhcJ~O^hrg(NbgxfLMJK2taACsxp^U20O zz?)yLN=m@?K=#)A23ALnXn1se#r$LRb+Cu{T02p&%7_!`$m>X-X3Yxdy@B-$P_rm6v$_` zT8!MKA&D>7&Ch2{5J~H{YKe5^V`?b{eEp|X{~;~8xP?JBkT^3ox)Yj^Bk0Of&$812 z5m(BG=2d3ZIoNP=wGaXAFSkpP+4Teb3EtvlgG#>_$+2ksyLImg=q2`gg&x5*v!6<@ zo-SjNV@uag5Ah9T{lTDH@M=rfIjjwA>G}i@>2=dR8b*tXjx$)cZt4Xr+-57az{>Ka zpMtJ16}YFhz9KoVm#eI(=(cz(cpnq|{&#q6KWb+}I#B=~H7YLj0B#3B#`D$X_M*$}5ljQV z8^U9Mfx$-x^S25I!Tgq;YcijeK1up!o!D!;u2BREqwZS-mhxA}Xgt86B zT61mMU@TB5C^qOSgOu@MzOI4Od~`MB)LO9jKCZF`;{v{=2gB^e)98g~sZx*rTF_6e zFSZgYq8AyCC$90s5dip50QM+0nsRB~Wb7X5U{bWQYQV7e^%kT$v?Wq&oUvSlIksxR zxK8!^<*CEaT6$+oyU1lYV3ER>>-(Gjwo1FX1<$+6VeB7{Zf2`t3`X=l+TmNe#6V4d zk%7X2&OoL7Ks`di%y{p|O09_Sjs0tyQX20HfnhWN)8fILZta!)!MyV}-q$fkHr~JF zj`tVAc%P10X5)PV59#sV!&pl`>t;AA@Ef`DekyOgKNih2-cgMh<2`t<%y?hKxAb_k z0BMO_OfS;H=g@Cc#c=)B?mra1h0!eG8#pgbgw25>4OClq!g z%xJ>>cs1cW@J>G%y?96u#;ry%4aO-3%Y-j3H(zYf_Y%h}O?XVuy^kTM2IH9?nZbCC zZ|T7>;roJmhR~)Ykug=w=|2Iz8FF;()z-of0~F!;Nd@;tZ%p~ zOJ8jLLYfF?dLpRF0$vxZ4z}fHlQW*;N4Ed*s)t||{%c!TZ4>z_^*Xvhm;Cg5h6I(y zXN|g(Jm9xf-yC3Tv6&9!@az>MDD)PR&Y_Rml>RMWHmYc zaTjiP8=S{6xigZ|>n>g`2y@BxJSYfrJ`d@^8SN<;5AABOY;Z;bt18y(41=^Dza_pW z1z|c$3^Y2wYHi5qT-?pmA2)TZbpmr~619EIr$IA5*OuUA+;s z_YJUEp3_dvbS)oZLdA>rlILUcXE_JNPm!~eP*ib7`W4jM>7PIaI zc31P2!0iZJ-`FR9e6)L;Uw)dM9=W&uFFL=1Up~?=j;Wvazig(qwR)d0LwG{Yoqjd` zeMV);Jfkx+ec87Rix1H_66==|Iof!d%43XEe!FU?)bCe$w@8CkucbU*DxRkDRLuc` zsn#^^HTYQCXdVWR<$~iT-kz@A<|DmTxS7gyrOXa0<5mXm4!5?N_x9_ar`$V*zI}#P z9Jgk+Oh__16!5Tlqze7Z=0$b>vo2Zwv*vAm4(CThjjAyks*SI#N|dz2Sh1Z5?<8lA z5q0Xijes$VZ)lM3rf76V*sw#OsoP*1wb|XY|D`5=U$+r9R!!YT+uzyU#@gRUyN$EI zGrLXI-y)tX=T0y7i=6O9D{R_lJxhaHqz-PZ;-C8$`>ZG!S^=TxVNSFWEGd?o4}FOo zz^t6zp%gJ>D%1?iq*;-{(stEvEW)D{P*`) zoO(^xMuzjQ0|t}r;K1j)vy`xHcz8Iw+)!UmWX;}Rar2+EfOYYOMp&WD{)$zJtU^D> zU5juAkX|wwUV%5|B~tA1rnqe%Z}~!Foh4J3zrUg%HjxU0dBOgQ4&B*baZ+a)1($6( zH-WO)#Qut})kq=~)4Eon0n86=Jh({j4shr-Gjbyr_#&B&2e0DMm>UypzrW&M2W(&f z3{53q-Lim9b-;Ej05(OyrU}@mB1gRBSO@GY*3O2RG$O#>(Ywd2j|27(UnGOs0RncV zfSHiROSW*p%s-@V!t4TeZ5FV9-wfbHKQ%YY+lw3{aia9SrujH~5{{QT+2wzG|x%(@wJ*#!A zDg3*Hf9Lb>4E~+SzhHlbCdT&i?3LOz=cCwaHL60JtrF*TdzXC|3v8f5>wf^UltSeW z#5gY1ZraKRhmz_XyYe0T|Ei(d2zTWSZHK<{F8=+sCRRDWCDLTF8+q$b)Q?p@LHtxP z$eMT$rtP{=P5I~bEP^mk(1f9?_`>E-YvNC6%#T#At>TxOMR*|afWm8I zGhi(Z{36JjZ;xfo!nM~_gpda*Atl-%_cGr1d1pqK%TzfOdL!F(1QZ)kj3^0(2n9Yx>3(3=dheZCOgc3ndX;OUh|`vbZcv=WHw=KZ`&PpKeinq#n4zS>gkly z&PbL$idTPWb4fkQqWOxd_@MK6;G6?ah~oCtY9^CI1RD8@K#<^3mFd1lS7#F%Qk&BfNVFgyt$B*?Ih&Z?_iAptN!`mH`ES2Ivn?d-&wge zzqD7aY5bCZ-8%U7$8l7Z7-=c}EZ`==jV*P9YvL0K&a5EIu{!>t?EuYA>BnKbG8rzT zA_k|zZ?Ve1*6-{Ol)HlFKN7{OjQdgSv&?ZhlCmYSBPja4Y*UfgIVvO zbSvU-C8HyaZ1410oBGM|-+b#23RG7E>yq5;K%@04@579o5;gH!IN>cOi;pP$MDjlK zZY)hbDd@4vcbL(h*HqM@U@4?|saO(*hAjGqn0GIe@F9%iD|FDa$BHT9QS_xFs7JNO@~11WJ)@%`58 z)JP(9nVdvf>w#1C?yc^S%(g`26kjA`bvIp!Vf(3I`}M$04%j{cFj!bt_jXyp=E%56 zL^>1zyHLPB5-`6W80LU|BzKcAW4;!!WqS9Ro$G)t_C+$7brrC81`^yB@gx;?}KZ@b6FjyOMu({5zL_!FquG z*2iJ?o8urJ+K>W(WIsq&yUsgH8q8Ue-fxW$RmZJNNV3y|A`^Y!QcePu+l(XqN7L`(?svZxAP0K5OgsP)=}&UFUO;8@f#u7`9N4)&E9o&-HZs z670Rs-*)YGcdPJt{jb0N*IP@RD)XfN9Ct>r%QooT%&U1)f1d0-se``ZA#KI>W#D8+ z#zQ}w>)fo^LqN1D*7-?;v{pO!+Q>!zH5@1n5IsR##;{J0EOC`BzGdG+uhQkf*2E$2 zY|WunX(Y%5m)wYmr z&w672Sxhaj!)NmjI~?iQ&(7A(HK@o_tz3`3=I{jzO}T z40mlMD7tfMVMh(Gw%8Z!oLZS|s~=fSvCt7JC#O+4N2rX~Mt3tqeeloNf{Yz^Rd9}_ zgCjMy4#nzva=fa~R!=mlj~jWv=B$#I`mlEQwVHRe3fyEH>0LS|m(X9aAdKtTBqoF5IUu+9|{ImbE+iE0|_jK*;nunw8u z)x27;XXB+jAY6mK;vvmC=h$E-8KK?=%UGu#SnRjhhN`me(p!%95US!Gx5sr=vSADB z8->CRe}bPfTaLE8q$n{~VCH!HE?&D%K|-63#a8@6b|D$XdHYSN9{l>6Y451;PcF>5pmizv*h;WCoH z!VSwEb9Ip-cg%GXykX3xlLNDu>rq~fx&Af5F<0mJcu0p*OFZkxLvLQI&&FJ(z=F9h zqG}FvEr*K6TnAb6E0W#YWteME`xd&dPFiGCd-S+VO5dwCUT+8N2itv=ucvtz>Srd4 zMj1KcO?&`P(MiKffgo%7LfAhEcC~td#{XW~uB`dcM#w;AYmmlW8E82Y| zLJv{ySb69fpogRP@mqC#RB8OMoGm&D!BWFYDPN}-8cy=pH7pl|WsT3aeLGdOu0l2O z6AHHI;3X*BqO%6-p<)cD&xF(CTPcOS$o;^OFLf25ZI{ky>>QbE{pFGYLI($7z2k^; zJdE@)`Ypj$oe|`ZBLK0w#q7k;sd9_UkcQ-L?E@MGxNHqcegEf(tk<=(wX!D<&@Zm{B@6ZO~|95*IW^aY@7&6@eKBK|oQ# zow(wbbUTV@6mjj}=X>hjp5DlN@AuyOW8ik(s&h}BsybVpIt6oSXfDexRBs0y7$hnmMR+5f>O@tV5BLUIZsSeuByEy3g@f$R%NT-fw)?plzM>N!n* z)7{%9>GjvWMe3gDTy}RL`YG@0z4r}he6M}--GNHNHc@R6XQ4F=T^$UuqHZ|UOY9cc z@u3?-T7f$8;O)ZsAspj)iomXOUweIty*~LnW^UK3t#zv6RVPRyEqeg3L7oKdSt?z188GHR10n|Z{= zXmWH!T2hA1s<`*1UdV8QgXu-HdtphnRnV#sr}U>Gaqh^>(RwRC(P;k*omFw~C_F1V zt8fqzW$rdIvPQ?fb2+PEw~<|tyN!&cQzD?;UM|i!u|DfynY~zd_6QylPd@l>jvvir zkn6nfHLsQOk6Wi6bS6p(NU@FiXfy%o&r-Nn$=*6cJhtBJ%tkNMfbwowyc4j6pOv4x^k?mc`rh$nbrg`dXmIR>%!=>D{3i9}q)$ZX5XHu~TN zf!Y*ldBL_!qL)wA=ay?@JKD-?b?q)*)zererqpULdTvus*y$Aiy-ox*c+2eI&&u>= zJ-X(t-RN619frJ7j$yl~k->6KTB-pw4oyEz2QT`vdZi;icL;sXeevN)%Z-K(K~Pij zXc2=MmUuax>7fIHT}vfcC2u1dd`7-9w^9P?5m|48ibc4>RtjouxAar=P;_CBv71=P zn7kBSN7U)Sp{YsIMgn7C7Raz}EGaE>}%W`+>F z0D0_ek6gCY;KRkod)ykS3O{|m49q8GY=%?k>e(Iexeu>JaKL9PJK!^#n%-(4>Uhsy zbg?;Mj8VsXxG}{Woqy)0VfbkOc+Z}8yk|6=5q_wgxWgnPr*$3l8C{W?9h~uD(7G{b zcE;y+q-as2%w=}aryeha_fmTEeRHMw6+M$x40_dE^h$P5x< zdkvO~5PbGJ_t|-P$MQa#q;%0*eRd1s`&+duS%B%Dd0%}z+ud)mwOUM}g#*xCKac0< zkT(`7ND_40_Ey>9uIvN9>`;~M=gQvo%PLj26J=L%+9LdBlTj#Ki0a#vx-WgK?tZM% zwX;A2av0f*mw4goy{mdl`Dy7=UD;Zd%`Gf@M`gDbmc6Ai&7i!tuc)lKuPrn36NvL{uhLkD^FI#kv_S7xLC2xXmDUB%XO_?5Ga44dP*${VrQC~a$1tx>M~ zd;HMdFBqDQZoyhLk+h>bb+nhw))hK+wC+$%9i2LQ5K3k?5(3wDIdFz_Fj8*f3Ik)I zLw}dTFDQFj%7)vY3l76-8)q~plF-GkuFM<^`hM0>tksM8oNp@cipG2#Q1TZ>M%1~I zvF@z%SJSCyf^V0;=rSM#_<+hHYjQPB0Jj<7N+ojHJ*jf`hV0d0fOEKwK<@|NalaHb6f}1l$^yG%Y>qVz zQyGe*vbCHij)hq))ws9Kg9q(!uL9xRnciD1KyDNJcJ4gyro#Om>^~5Y<@fRY6ZQ(g z>!txLBQ7=_Q0FwS@@-~sLijidRj$n@V(MfVGg}c+g~4-iDI33Z$Ftc+dqR7S*DRGw z{FEi7`(rP@$m=2h^L)hrak1MU>vjY1{zv;`vv7EzHvV_>5g*W)w-Gf$GmrUJQ@THP zd49d^{CdUvV`rR|2kg@`9I)d3u{+MptMrUt33CT^_el-1h3DNkIj_>6{7TGe84e}! zaw$~bP3@0uJ)ZrseK&N6LlG~xQR1Nd{#b`Tk_w%GPbYtWET-R(gh0H|02xZD=%Id< zu3e~GPh+F!3&HmH$1ZWeeiQ(MJ!u!}3+;mXz}BEU0_-ytvFp_ZY>a@d6R;0O4llfi z1GdPoIT&dsVE5($^Bl0dOMvwdu(W{r`(uCCG)aXn4uCPg1?~$K)=5<1^ z^lyj!-|UaQGlnk}?vKrf|3AdvJ^bCq-%b2^`~~}CHRF%#3Xyw|gzuc&zUJeNVsKt) z`SZXND`-vIc(p3Rm}5EhUfWonNKRg#Z0Lx2ZxS0fH=Z278VMIq*4{#dOq##x{LSWX z4uA8cM8|np!QV{&*6=q=g^fI{%|=hRMIOE46h7(JX%JZ_uje#59Lt2)tyORd3LB9m zwd>=_hK;Ic;dSDhcnG>{Rq?+@QT}B4<}}UX*oEt@m$rQq!ugp%j|x2~7duV1vnE4t z(@$*Rrp#+@#%^{hF=p-dT)h#-k#ont(Fo$W1;D)tIJaU``fk(vE*6ZT#~S1f&F5Mm z8{P`6yikhny3_%~5APjmz1{%-tgo4|*VvDXE3~^J6oP#;6x5jXV(dY)ke^S#R-tjX zxUIy=c`;jK$tTV#QGeLwdN$T}5;L;%7;WXXeAXSL4A=E`YU_CfW~B9OjXyHK$*((r zD=DNmfBAKHrt(^}3&KMpt(TjHZPm`UNj~7#7BtOIncPz7o8{vvz9b1Fv)6PouG!^0 zguhd-;TCxK}rk!$Hl1Xc=j_#Z2YH^WA>E(yKSKAjT7hnr+z9Y&Nl?7q7+; zh|Sa26-zUm@wKxU^(hHTqK#9vx5QKIwWinME`wWE5>ax?qV?3T_XfN-gT`&Ypc}TK zo7vV(@$*3~{2H^u5>i^e8Rt;{!xhXFZS;L}KEn!Swb941f=+(gM&FGm^FV^K>Ld@j z>9KIKbQnk-`VaH7n?rpJuL z`9LO!ZeR{FE^;7O0(Kx^2WuJ=K=a{Fd?Rt`ZzdgrndIv8x`HZjs>`@=nXfMel_OE#<) zS4zsYO!35ubbC)*YRN}MK5z0w@b#{0c6i-6dOy1vjw#qXN4yxbU&;(n#$trBss(@n6{&aST-aDb4*>*PM$V2PZ==TV3zcfQsi_p8}5#Fg}@ z)m^gaOZ)T*K+W_7WIg#LPlAi5Si0~Rh8A^p$cxC*^dnyxPliu}v1@jckId6#T=ZOv zsWu~6cHL-+yY=ljEOw&pMTtcVoJMSFdMPTG?1Vw=wU{Ta{YRo=!yNhfrZT{D$_-t^ zJaw1p3&`4er8R7mySrGTzhQB_K}B8iqNibpkQ1WvDpZ{w%4ro(Znrp|Wf6_4=p-{6 z+w+T{3P{b|%34vdOk)5i)TRlzH)(5!$Pnskv*arb=Sa&c+q=_Ma;1~r)?0M$aeNu( zUnb;Y%J?o^FEl{fc9K7Q2H8xB>WU+`^? zRvRm3kK~bYU4;2PTS~<)N`Dhz$Q!25&s$47UAk!9_qW9MrWyE;Or5R^V}mKQohx-W zG@6>Sl&zffww*SCXRhT(!(Myj?=r}D(?lohJ(&V@va`BtyX!C7txFL%rqo=-jah20 z!$?N}5p-9TX}yKfT`Y?gC=x5mPOzEs9$|Gh(jkbHn5kMw)jY2~HHboZ5jXwz(9Aey z;J1GT-$>xM|LoWv0HHWcr{-laWi3K6)$zW-Grt6tt?Dk5NT!2_I_gX^qXxWB9CzYo#dM-VPA4 zb5@`1pSN@7_KC95ALx!2aBpkFtO#l5;H=i}3qu{x-X%f*9 z$8K`%-ggYJ*~IZ#jWQDIlFtq~H|aTxWd(7RUg&qwRqo2+vEGScaqn^%4{xRX>>c+m zlDSjwtt&Qm=1Fhmwl;6|NG`JBT4om$avS|goW&}hH!^kjX2|mnaf@W@Yz@8^XR=jW zYUD*t-E3vSVUadD4eFCA?fh^>pw>{jvTL2Ts$kLgCJlBSi!@lTD8s5yitj~QALC`6 z7c07rb~dFBlVcqw$<`IFNNB9((a^9mp^5 z;+%dQ?@M}D3VJlNW%qO}`%-65{t32I-v`wK{c$wwXBA8&w-z#20z7pjsRk>@cCm&h zWN1P9EuMuvX({amZ%;HQ;8wAY8!Bc0an9n=Q6!&@jt!vs${?jPu|>dI&YFOW z{gO|@#S;53%G%<&mc>JO+QSv1@AwtETGwlso{g%WIFsyAeN;Eg)^sUN#Og?Ca{9El zlEKI4W@-)^Q~I~q!!&MvX#?JhVw$?$$EAGTm;DDcxal+2#`Q{G=m7rIMVm28V{P*s zf_*@+ey_^>-M^&TrK0okpycf(c`B8`u;?r6V7qk1*CJ&neENs?g{Tq%KAZk4&-o3P zsp0K3%rAUQg~?pu*Y=5bD1?R=Q|z;(JwQ4$iQh#izgll7_bNnr4W)j=DQehX@a>pV z*L3zxjC6e-#@%@K+nuj=A8(aIV3K~nsoy<}ig)rG6rWMa4~Fy=u4Eo1maVYLp>`gQ z(L8EaccB&+$RyR7<76wG@m}uZ_U1x?b_}^%HBagKy{~?c>G~bk@52Pi#_2o5r<)4* zFDm>F%4T*dD*Q%;pjN*MHFKyf(j4n`?^-Z+4%*u&DSZS3I$(_(oS8D=PklE8e@P_&Qg-ZBcQnEB+4M zf6)e`!8BL$VOL4BD|xA_>4FEOj$JAWod zi1b5q9mwHHGViOvsNTDBH4-9pq&7`f$tEph1ngf2+2IjH8HtN34Zaq5$foAY3_K&Z zw|zRinfYvEeYtAj-4pQS?TJECAx9m|*PU1H*PWl4*(Q9#4WoGer9D^2c+UCrK0Z<- z4ciX=m4F4`)B7tRa*m=yCL{L!fr?Q>_KXc?2!_H-+2{#i>*P*if{)`GP0pE^FWi5o zbpkT355xtyUc9OrXPQMseyulrS^Gxfj{L4#rI=Ykg-Nzp-LOfsgbOvk=ZCzJKH*?H z`oPU-{Amh4b!_0`Q1-VnOI(EHcxiQ zPeacXuwjSyyD2bbP9_EF{>Cw5zID8;#dmoAmwVZldmh7=>+H+n-DTD~S8d05e}MO# zpaIDZa9@4~n?}tV;1)N)P5A@dM{~*s_=QP=Xb#&8fXD#9cD&%d(Y!wc9E|NtSW4OG zmFlc!qNZWPB8Oftp?5!qeKvZVrVW^E!@#4A6IqEM(syFVmfl($nx-tp`WKKT%|7`rouUog?9M{LIXB zYvh2#ad=;b!+RhPxdpOPlrZ|;VBm~?$BUH7e!ub;$WNeO*Lc4>reM4e*Kv7LRi2}P z@JZI&hI@N;<;32?bya%7njFdgwkYrYA-vBlP zu4N$wo^;qdS{x_Uamnw2f{9_rsd;SEHJZkG!Rcm`V2;S<;R4C3Py|#H)6k8l*Qa85 zL2J3vVSG(Iwb^q}ijHIMNZU`;05Sd7w?I6YDgknP3Aq+oYx%z5K<6B?L6acTx&&xl zL42rxnIok}RfX2YWu839>w52~idsyRnAg#j8QmoWt(^{56Tz;rK6OlwJnY6g>?TT! zj&11hEe}lfzWmbV68Xu_^Vn^G{DDG#Ic8tk*b9ezzF$Cy-yp)wSd8cX7e_D_KyCDy zcmQ>{pkCxd^{<^khT!Pys5^Z*NzNDdjip9+M}7b=e)@{KICa$e>V*A!>JA?x)*v>RgLLApr_;!m6^@I zRrYO*ih;QubVR{q4{5S*PMl@eC)m1}BIxHC^zc!VEpAb+WuYXPnW3}%MY%PfVxxH? zKXu3J*v@lU#qZUzEXT1d|IR~hSspY}eF%S#S1axvgT)uU5oqybXlEZ5_BXKbuZW3x z>pS7>1|%lCmLDUpEkO!(*p29EitOI2b?%A?w!a!-W$zF#<>h!8U)^vvB3$u zVDA^l<8+h>QRnr~feShPL2FcYjo><4Gm1NR)NHXiNsuYr-?vOXYfyun32CwZ} z(YA+VK#_3}%>To{v0&Z1c1g8+hM{*0%B_G$sNCRv<`%&{{HRODDl^?TX0!g+rm2fjEwusQA6jUWYBBj zBsShB?)AV!Vni}tE>D2$MA)2wvtHQT zY~nZN{!6ybQiVX$2(8#qc|9M(36K;2UXW8TkI z=gC)dbYOT5vjiv32+U(1%;SG77XG~2+3_SVy@oaXp6y16XRl!;mCFo>yB-gnfnFP%UNWYVlv5w zC(_MP@a1?bOC{ht6ihFLURGJzWFC=*dF3FKNsD9DD(%XqHaFLl16zj11>v0&@Xfew zb{7v+r=S`?M952}HGPLXo4$5$sCA9@=(+`&Mox06MhfF68{^z-b{}2I^r;nsUH_Q8$mr3JF-?yh2#)nOr zkN(WBQi&h~5SzPeh7*ieE!cjf;6n~rJOBosAQ~Q=2kZ<7Y)}a>Prwcam_-WqY@VVN zRy6*X>~=3a4$$B-K+Wl}A_X(%`3k+R|3rfzQc(D1qg8@87I-Ld6HcK@D%_36v3Xm; zhSKNvu}DGu?T1&Q51?9VG8kL3e>lEGN}XrZ1FWx#zF@Yl*%L4`mNwc{J^7T$lTKO^ zg!?^9yx;L%0e>zh-fU|e`ujaJ)5NXajf-iL4G&2hu6>;S2u{RhQov9(yl7pz#B8?g9sM zmS8#?n}l2WB0$u74M>XhLpH?P7OA||jNVo0>z0dF z>(M|GkNB_7(W@d8jAb-rL;8^2yGXG_P!6-Ig-fV-zgVn;d6R5dF2B+jrlW^v;>7id z^j57;q%V%4tZQ+7$j^+avR?S_`$MFwA<}9dazwhs@2(dbZs3ea*8`4~b*}+?LqtN^ zf1fqbmDXYgA}h~zTrY#WAshXXW**<)4u@P{7>;Q5l6pDW%1$9z_Ym++)(3aanal^x{VnxDW!yWdLa7*G1Vz&@<{wiu zztZDO3|-Ag;?LChuL!m#Mt5b*d#W~7+rv+Ph*yb|^og(1C#?iul9|#eY!G!R*7gsf zlH#$v9%()$cPPn1Pck|LgAFvB&ywrL*xOOXX%c4|d#@!^==ca2?I2u0DVGWXl`)xM ze>N}1Q=TL)&MS)X6t0fh1?YY%bl*li{u^}lc|TI7^NLui0S8ju0gM3x%Xc>f&^8F# zEFW5s48dsWy(WZl?j@U-_r*Ph<0Cn8c_ju)I;s^?M8)pM0cbRUipQ$hnGyFU-J4lJ z#cVWnkmg179y}O;!~bvM^2{^OjO^Az57dX@adOT|gAT>3z7cDNi!dQk?N)TYTkoC9 zhR4~2;Z7mD<@q|_tZ4RLQm!p|Y%bm%cC5YhP!&|D^WLe`g`5Z1d6xlfL-T%h-YNJJ zG|`Gzs-pxZ*UI!Pw%l-*>frVGhg6VdE}8eVtQJkUIKh!r7;pz+G>dkzsWu!UZNe~# z_9k{j5u^>AsK;zxB$cA}ae3{?q?`T;zB*}{zhUyZ{D>RTK7Dg#N)OSoVHH8F%(&V` ztb^t0N^8NkML+xW2^ybjT6Z}Vc7?s>E&9OAmfcU#;C~$w1yj_{j&ynb`WfTJk>A3C z_8rGmIZIXEvf&E7$5_^JmlE4Mo^$&5Rtbv;u`BncGMy?QPToNHMbP|qH80_?;hqOc zk$N>7-CJ|SAw|^jIefA6f?^{V0XoDmd^LUgGr9Ofs-LgwhZTcIrQDaUGNBc-NYGRI zdq`FclmUpfT?~LlyFy1yRmQ$yIg@x1L%WoyB#n~TIpH<$FkSx1^dK6nfqY;u0?k{l z4;P680v)N);62x%5bM{{1E`sq0|jDje`7r^+JP_8k`J8D2P_9ec>}Oavd^-Hb9q)# zHYKQ=Tz^1~@+VjCZYbG!!m^1iI(M)m1_4N zPd_=?w+eIWcA5N>7yp4~{|o2qep2Pm*EOyH-v8))ox8UzFdYY&={VZ{JyZXZRazaF zLE56rwlfR#(~G_^FwY2lbCBkVS(I8=k(Qk$^UYY?aj(33fAi}(i}D^;tE;rx;Jiw| z@+;v90a91~$-__ta%Sf_ex-?4smnG!aL>F-wSJ|>V%yX>S1R-rI?|?W(~DMPn?Bp_ z+otQp0?MDSYt%bDF&?7>OW#Zu9?{VH8Y;zsO)`S+1v`{(Pn zb-*4BfFVW%?4~?m6%N=9CBQz#O)>ui0sGK~D7%3V7}FSxdXOM0F1E{uy1_ln!0(Z1NN1Q3Qqow7qB$|D>`4-rkY-OS3uMJU^Rzg zvYH>!n^frT0D53GqfjANLxR_R90+*fACFbd@HRA#&8vj?>4U%Pj-crr?X2dDWi<~o ztC<2bpYbgmK3F9a<>TX@SLFmAizThI0CBlntX^e$gb`9FBv|oR_vK54=j(QQ3LS~R z&H4L&X^(DS@Yl&-zyTCe*L(c&6S{2f2m23phwN5s@_V7vehW}LWY=NeY8_0u4)x$y zY`~-9wGN|zLv|F*t@XYD_1?AKcXFppjCo&RsL!tVo{1;N-+~+37j~@9CHu%QvtxGC zb;4|#J7#9tYxr5IpB%$E1E(ne3~P|e;cr5%mH)u)*;Fjp9fHQ%hC=Gh-UC3ms`_1M zAB)_y6dk{+`dRAwHhA?d1AQAj*5}#8kJy{YMki5sB!~5!7#&&UNtzD>_s`HszOgd!^F?rL`{tc zTy5W4UBm6w&W3gIvy#U-{Eufz$1rOL$M}2@=sKw)9Ve4|ZaiHNPE!v~++8X*2@8J4 zm+g2?r1e5Q=2CfBmIhGx4JZU*uQg@EUYU$o0yTWSrq-_6uAR+u+{cXdW|&Px?HlG} zr_*5Ua*WjBO>bJ>E=Als(sn7Z6S!mBZB)F*1>5Kx8>O-Zqi~M;@SC473QB;fm|UqL zZu`4y3(Q?g^6TTcX`s5!$}%u z`_E9lVUGU{)G@%&S#F(?ch=zIj^7TLq(l> z`3{_O{od1N-|q$JcHaBbH-mhI)@$-sPW}|$rhguUy$r%Vf^f1yu+Re5z;}bnYRa!* z{O2aWYdlAdcT?k{^$YT3Tj{ec?t(SAb1N3O`VXl7r!>{2BH{#>N zSk5aSskOi~q%Nz;N2*^FKReF_se93kI!^?t+f7C4Lh3Oai}2M3*LL4;0v1RO@*!z2 zS>8JdLE`2K)7M_|S>i&%??4~FWsholQO$CZb;>y*`fY2kji=qTuTU?`)4KlzXndeD zFuVPMdQ1Z~YBy0J^d)ubhS&B^jBD`D$5-(Q+2YJsK}@bbYKEjPkY{VvrBPL=Ig6zd z)<@oX5i!Pww{aELTwAzxo z1B{QbUg_>ES-zaVJq646jpie8b;4g($;ATu@OOTDi8Nqr2YYN6{U&WT+AjL~!U(yy zJIO8w>sgilj96ue&T>%Zqx~)Mk!8~g7P1aCVDJUlz9MWl^ebH`5Ql~G9y@S|#=MoX zMh%{_28HGn7MjVd54O?Z=tN`mgWWa0E5+x^7`VGu=9cYF3-)Er+jz&?KI98}9GIER zXZ&Np$3VH}v*7ZpY1KTLW$Z7@Z1e(3eC|^Kr!xmZaukzu<}3k>F}x4{7)&&>yVh5oRS`+;X5yO| zt8x9Cj`j{(3*5Tw($0bIZFk;M`mSHP4Z|19av6d%OYn5k(Td$ag{&W=zAa=g5)_`Qs@-pXVz7{ z!;OYqqVNP=LjgWH2P?7Dg8jNic%SjX2w$P2qS9_Tn8&=YBLNX~+(md>VA3``QCL~Z z#(#h?d~;3NW1$G0aumxCR|}3VZ(^f$S!O?-*6dg?s0;0#b7((R^p5yCo3XLB9jTMK zhu7KY@tO@tgIyS;pD`80$w=3980XX}9iEMTuWlB}Cx7MK&)}4t;!Z>9%TZHJ{Q^d)#SU&z{O?#IKK@#RY-@5GOilV)Y3 zTT$v}1f!S-Zejo~^B8AI-TIoX^@XJD!1tHfA58P=pO~wEt?J_n)Cm}ULk;S=%BqMK zL$Zk35IyS~)~v z-g1b}1j0PkvwR;pkErGaE>brFb~bb7E@hYF*E?w}O|cIzIE1l`wfzPDmOnl@ zjgPzfG^lZlY8+DRXd9B1_?^k#qTScCC%-Ni=O0f}7 zdrQoXJM#?Mp$grEUx)Ehy!|y&n-cJ#>1@Sllw6LLei!K{O2xp;d?qAq=BN+k&)8A_ zA$rSdF;zQi3aM9azZe54oYk~SMF-$FC7do+ExE;s=r6c_dtIeU9PxDYl~~#$Mt!HJSaM* zOrO(K?K}mDyE%xi&xbH6?Icavqv9&b|%>qy51Xs}Yu|YcUx;jrv<#UK` z9Rp<=HU?)w3Bh*pdfaTphQ;&gci8Ke62U6YH!N&2Ny{WO;<@x8k7%UU7jr;=Ee&HO zMp`b>es*cz+R!>-PJDQSw@wSMF{Xp3c7@sSdhc8g-7<`?~h9lCNwLwHkk8}a!X*M>}Snp_d&VXmrXDu6P>(etHq8ql9P5j`L z#S^A)mr3*hNeo>n7r|k29k82NqBmDnZ_5IS>1H+pbej7QjNG&&MhH|@^}nL#*x_mM z_P$%E&q{?>;MKW~fy2goBQmp3-VS;o_O%So!EI@B0Qqc_Fn?l1T6#eY1a2n8|A?D| zp+({<68Yi{D2RJZoNXEmo(1||OSbhBddR%6JKrqf`uQja2?TTL=5$&$hXs0F18+p+uyPpYj?x+}@ebHDbc3F3 z-dHK_eBQ>s={5Hk4b?XcRk5hs+=RR5)ERWl%?yGqT|DDg}Agn-HVrKC1 zYH>z@@DY{S=n;%k0qXlvliiv*rW-{!>#O_(+f#`JJ+qs8H&>+eqTMR=?i>29cP~O0 zOD$z~(T~&@U&)=ro6=?UiJ48TgvxwfR^8R|7+A0{Z8k=m=#<_KvopUxk|tjjTB-Tg zLRwNj$Nt+FxDoQltYurxDDxn6&1pZ3rOx}Z-ZS+`nn?ce5zz#=RcftL>% zMi=#_bQrt6?n|B9)k&5s^_1gLnG5Xa(a=hn&^hJHuE3>1YKX}}CiKbh!sMOBXG47`HkN+m^;oHoepTT`=x^TJ% zoa(#{76@-gg)4+iDjLIsmq)d2DD`{apkC~tUf5CLiEJb0zmaY2|2|wbKM8(oqdTUO zH}XqrRPuCw$)PHFJSY+AhQ-=`N}%W^nZLMo8l<@Aq>;{Il?)_8vQE&P#IyFnt22LvJX_&XTb=YNNe~(8UU*>OhU6p z2SdjyhBl7P@%=#>RdXsf%+rFlAwfc~NdMxmY|S5U+B$lO$&*o<5}${IDUsF_Q=;4m zH)wyqVFfO~bPPa>mY=GRPRq>yRKo2+tpMLrUu`kxD`ctPOtuJ056?!Aqp%b(x{B|F z0{Sh;s4tLFMV3HZCVSnG7kxu`T>nb%bNPb?#@a508g^G&=2G-=-@o}cx!2C@`u$h^ zKAzv%=sJXuZ-?&=z*dimn;kOW|`67$P8)3AP{pHM( z^58b)z`bg!a1C5Fceh3pJTft&EE*eg?QW+XAwO98(mJNBCgexDa+7&yi|H9p9ffV9 z;|DMB-#o#OGr|+MVr+&V(L3?u`l{10{$r-J;Zqww^Js4bF122`)C9b9A6Eg-32wC! zxYcrRwnkOWvU|Ew0<`5x^a`ncM1)Q+6%1VtvNN|UYmuLYFbhB(3n-tNO|@bf>X8-& z)D`JJI#P`OBf|S=tkx>bsXkjoq~7ezdx`ZM+`GB*!Emm;m)>O=e!V-^-pRUPEYn-x z*`@keyo#}CzY_=p+`VO#x?)By>84%H=*9HH6rS_NxT-?0^U+94qkc%?>6zE}872@4 zgH8SK>ZIx?dD@QOV<}PKJTi3wshVC6v{!NitJM56PQ%glU+E?~rtY%I(XBxmPFJ50 z(W{-M0LPyucf_W298&u*-=@k{SfT+8c~RC?RrTZQqPr2H`j1UggmX0$Ww^uZnwWUZ@bUAGPLAlPOVx0( zQLG|UVL9Ccjbd{VHbtIHC7U8Oi%T|DpG!6+rNZ=*?+Z1Gb^K%(KuSRLevr33O+Uc! z3qG9rBl+RA2~ZRb{HdG5o>MKO*Y6EwLAYB2T7BO5f76)1dIfZO2zJg=Y zSqC9spd66v>&u&}GB{V|;Z0T9FIVOIO;y<=SLIx)7$&i{{uB}v=yXh{&-w_H0s)4& zK{HS6_5gP!!uFcF&d2@++9Q&?5BJzZCtF`8FJo=n0krczlKHG*n2kqE88E}yMzPZA z1$X^Z0~XzM z--IWkiF@A&(5;;<5Xo9J9t*&j#{UFhv`(iwre6?(ab;tD@=*mWr`wrMnizq00K)GH zVd88z;meVPiL`!1aB{+^s%4IV;=Tx3dg4d&RJQQ8Q|zmWCoyrtF_SSU#I%lDd_oIM1e(JEI@Sz zad2Sf2bm>FCK~rr9fCm+);FI^EZ^E6b3oyjilPd_FFES8Bz07Xb3{D@MIu3P?B}4s zzC7Re)Bl=-AODSRf&6cUb}-x|99TXK@s|GlmV&W#zPwo5<`Y?E4R9E=?(6o_GRjNp z8+3cqF8)$sTCj_jzb{x>T2~z#Sf;q#ZiDJJmZ?keu+m}|H2W7cUVjVVC3g2s+lPIa zzW>bovYGd1wvI4q8SIK@2Jtfphbt2gd)icp^uG`fyA7iLaIfWwss94r|0o`|lI>&E zcmF8me>om@@%LCV!J)`!djNx#UgLOLemv|JKjhWB+piZlcH0#X`vnXy2kdIU(pan1 z6%V_Aex(!rN)xTplUgkne*2T}@;*1zuhh7Sc-ZgJlJ!|IC!P~05vxSGC@T?@H{3-$ z?80A*{c~3HXUy|W#KVr&M^d4TTzGl$urK&7Jq3#1ENwj%ecrFq6%V^FvDou36>L8q zwxV&DJ77HmU@#&9`v~WqMqb_giv#vg6&1w8)(Y4e04s`z{j+L%;jI8o z^9$A7#6>FlN4-gfZVI3m#>0Neg+}vJz$0pDYy2j}!yZfH*t{`tqV%3G{NKdGUib+t zurMBW@AW;p?Z)5s{Dt}3jK6O`{de)O=k=e?jT6&NiiO6X2kv49lBssDKD%dx?%)AfvH;spduXkD-6n zpeLy0y%V{4Ny&~9$_Md5doaLljKA&GjiWMeu zM#9Z*$HG zqbpP|DW8%d759cg*|`#Y!I7qTUr7|yj>VntvgwGjPS9tvwj*xd2zR7OHQ2Y$yRah| zjHa*4c6d0S^#@~HNVt>GJYF6C1~fZ|`%!2+<8^etm`Lk=VbQUA{f~p1-%+z`!1o34l*9&Dn#$)B$MeL!EjY74SPW@YpBPo%yu}Y^@Z-z6`_J1eYy18BFDH7}$O*=ysmzhZC|Tga08H zo=~Aw6!}|-xmfjsfXVQ>c@Sxxk5vljtpd>Pw*$5GGECfNCe*MbLyFnVzN^TM|ov5W{<>R*Xkf+;MQ>>(ijTw1cgkS0xHU%~6jS78w#OnB#rcL1mXmOjK!cXB+)95!j zS7Tz!_LuePgn^G{G|`s_d{>l zzD5lR!6-9-vE1=7S=aJ6U7_8GuLz0Iy)YXTO+;`bhVOoL9-CccrcL5vor_W0qqMhtWNNgXHrA#wvHQuyTHL&8&Y!GL|AT{3wut-@*|NP; z$WN9`EoXZK0kpN#$-F=%-vOD~pm|&s+S5MGl`w^ejuWRCHi`!5!p1I@No)iaCQ1X6 zCGWs-`AcQA*aL|$nLUd3FNEt~`LqRZ_0VNEnu$KE+Oqvyy}wbY(U&db$*Fcopmw@p zGvsM+IZCp|qDhx?%R;6Og5eA4u4-~2=v-KbKgRBQ|TezS|e(3D-z zdP^M1obE$w8+iNTg2~1xEEfn`x-N^T5&u)<4t*Gi4|R^1jkzku&r08h(VCfSOmZY@ zlG%ES4IS0DE;+ffU_VbUOZWT;At^`)q%FkalA4l|LdeBP^%hd=K&q4`x@eO)M)}jq z+0h8W*%C#h%`U)-gBfK?71dX^*yQ^r-eGeU!w3HkC^`>k^IVDH^yuGej3=$g+)XE( zynY$QG$*g`eTw(KyylpUFR#a@Pr22X*Av9}chNKpJH|f=_U!ZH|JdGV{C_8eLtNJ} z{sGVMGjo$>CFkcphpk=#TaEINW2m(AS*)+Pp= z|3YoH@g>Lks~h>5d6X|@qi<<(IL`k;`(8qrycB$7WqL@fee7=IXlun=?{gIhE)y0f zp~UHMM89Ks$f5YBe`#`WgmIlqL!ardmhzpf&LFVl{MZ>MKlj5~O&Z^0Tl z=h1~xwtXL!KV{5#W%|w*gRKJu9q!Eo_Qu%!%U}IFHvjf|I@84`VDtM6^10SNdJAoh zYqM>$6mOL5;r0Vm;Yd{|^8Ul-4<@Oe9q3w>UU+Q|vh`)l_91G>E-ABL84bJkV#@3< zL8p@l&qVC9_cWY?7l}c+WDI!;21gxy*6xm!oyp8d)CRo0Zx=VE zxl00ydY&M@t)Vi#Wzu1cw!4O*ch1oEQNsEp@%O6GG@zkeGePR$8KsU$c~66H4c50N z0md-HG9E);WzP;K{1y*OQ?0D+T z41qkkGc!JuPpuOwYmL6Y1Bv!C0kL4BF@x$F0zIT7Ln3s3V>;KEQ`U~o$(kY>r}d{2u?d8VpQz>$RAsmrqDaFgD;;8Y2Q^G)QVwRAT4M(wCSiBcPFy4-1YWcALQ zYJFkQ+D5l zEzRmRnnu58f1Qn^bnVSzlaZFMB7uN>1RXv$PyNF%y0%^YL4z{uND`8rmT~>ZrmL;p z<=e^AT)Ci0)M!45g*pc~FvDG0He@TjWyUZVP|~msoCg2;q%7Sx>(scXMROnM*#i0> z0(u-khrEH81Ad@34CrHh5NOi|pw*+UiBzi&0w0kFvOJiMi^zI_fj*TL!Rg;cAhAIpD6Zs z95dPIbP*LiNPW*}!@d`ss~UHx#^dI?S($$J3U$dWOY)IuQgqe%wbcnGz~|)`UeAof z1s16F6U+j`zlBy#daLc9xyAW71`DzChIJ5R~5;6yhkNK0j;pw^DtSt>%-ed7)|+ zp$wPm_pyQsxL?W8wN8Hop^7^FlpqW;2!+8ZKsXMy&M8IdHB39fY4nAwkAw}>DuMV2 zr&O`EW74|t*dsIRe0t9PhnTXQ58-&6={!U0*d=7LQ53fvJIy)WhmcT-QGY+TtnPCT zlQA(Z&__6H-DTHG_d&|kU`)nQNyetP!Yy6MEzS|mKT;lqTKt9Igjq4JF6MvJa`79)9?uSs#^>ODU% zOXtwZ0Bzf%bh4BhioPCIYuK&T!rnFDB14{DAQVlYwr?Yl=KxaTE>L8~28v9B!q`g` znNpkA>O@+u4M~?cP)SN^hz=j~0aIDx=mOrDI0{kXusB_cJ~m$)*VTb83pP-&NSRn>G>p z?rl-q6zCt6a{QsM+Z>7RmM+UaEBHp?lr`{s2>dC4_Z?na(7nVk1Qs!E z#oQ^z-F|SWC$b#anNyRvbaA@JjJ3T;iIiwuq%%C7XTSni@EtkF2rlcLy>X_Bi8G1* zPF>6^3sd$ed%)S~D!=m_^*33RbVFy@4HR~ZbueXPk44#RMYqVvuSw@tp@{>7`gtYX z@mK1;5u()*0xHIO1AdQxlqE#3_Z+c<@AfDykW{D%7 zKwdI0E_z3_H z?HuGS+wT|9qr{o;#qim0cqx!$B}}$#e^9UY)i)(LvicVl~+-b+_<6d|-gNEIjj6Mi7IP`5kti1dp@QRI4P5DKPFNj%>Hf+d$ za*^wVab+?Io0b)68ECI{XLj@;SgnX##ScjhwFxqsk~|&xWNx0JdBNU9PhP8;O1vA+ z>TL8(SA|_BRng@T#Tc6^pqOJXI(&_W#M`MS%T{3;tPOM~JO z-Y?tc8sO)$xay+&znT~NcE}slR?La*rA1n<6*IF4xoP>;wsqB@Jm|loep{V0*lpmW z?#6>pUpG*U19j{efYq7(W?r3@u8x%2NXwq0xYfCdo#-5#dtIHiR%dLk&a~I^>dbI; z(pCo!XK*-Tef?zcCr0dnf0)wgN9;9pOcpJU}xn9DO6HMj8yjO2hp<9B_Fa|l; z+344=0=NUfxcZ{st7iBwG>*-?jJ~G#xzA$%PWAJ>*mAO^q$QPGV!@INmS7Dlg(ay! z4tF(hyo}74v@nD`R;dP+_iOY}nLg9V)39D#=ESGeja&P#Q5jr@|MKIrBfE8b3109t ze~bBhg1?9PyN|y+`TK^yAG0@E%ir1jrTBZ8zaW6P-g|RA7g)qo=k?DE8{Bndz?dcy zHrT-@hdfO>@4Dnky@$L}m;CwKA=!rHxogl>84QL9{pHr?^5qFzBv!wp~ICN)f5ld^R;^v9h=je)%$j3J}QTfqS8 zw+n$FY+K;{18C<@DB$9*t^yAEJwplwxBu62x?mtCrozW0D#KG7aA11`m^(iGt1+>iIH!R5?3; zTBj@NQBK)fJzL7DZYotK108A6q40!`oT;nx#WEYbr@YtEt$efjM|3;VI$a})(#1KE z!$b4~bWy%Emy)%NbnSHhuTViH4}Enl{P=EN$3-?G=PJ`To~sTx`EjUZRsOzLkZS|Q z4^21HdY*AkY$>z!GL!VPD)bJ+9BEx>$Q0jJe@_>R#|p*40e-`L{AvRH;)dT~!!LQ| zKo|Qnmd!LQ=>P6D^>~I0JA$u)j3P`MzaxJ%v~nF$d_(F;PIR0{2(xB;joiBusU|KV zN$yAo)JFDM2+nhwAjy$$_H})7KPs(X?s=f=oBJ`CUEMc_aiXL0tS*Yb$%jjgVva{L zElDz%QA}^X9RIKjnX_J(;UkFav{u6HYay3Mmn4tg{;Z(^THm%oPBrnq@ucf;kXk zmV)JU*(^YN(OEd3tg})j`w}Je~Q00z%~4fHRN(k>NHp!?{*l+v3W*x@8$IM zg!^jCvx!BJiwmkukDg|h;l83nQ>^_;hKPX}{v}Np-oU8nlvJgQ2oRAoQvk220v*D; z5f?eSTF?a7^Hg|0I@l!%1#X#MqJk@LYY3|;4p7Y(kukw&{CTy`<%VA^O3$6M< z#kRlq0dBH*vieU3Ndey3UY)pmpVIPVS+-sUtChXp|5Vpl*T1-AK%qOIrzkZ6iH!Uu zEOGB3N9T{F0Ld9tkfRgqmF=k=jsZlbTUF>GzM{)>2{liRUk%e*Gcq-*hi+_JmE)eo z2qY7$)8o#Rk!xCW>wf?tw(zeIF7vs7RfU!TDAIbZK^{{au#(`qH2XrDFRUM#I$mE0 z&hkxK3;47=AGuf+43aTrLREa1Rqxos`C3pv-^41&Or?XVqq)B%`7HE-#j!WF5n6I` zZDEI6#?%rvrwbGrR0SIn2SPxKw@io8$i~M}=lbQ9P$50(w61RV0&r~MNg#j7yW2Wy(6vfzkN zJ{e74W)=^`Zy-(hpWfloL!%+pOmbpH`jCV(V2+dM@Q!AyWE5cn7fkdQ{?U!3h-swV zbRXU{Mr~$YauO0?SKwqMD2g4}#XcP0<=1Pakw?TI0?k%@W_EbY`ysY)HDt_2+nK`7 zRS6MUWb6_emtLQFjYDpVzHHQ*ov5I?`eb9@`eajOfgI4=!jfWqtM@!2Tj zxA@_Qv(hUr(4eD~X4rMtU`Ieaw(w3vxeq971lEh)q9WS=as3#aIYS5aQlp?Aspdse zM9bK^8Oxe9ErvOfldOfX%nzph%z7^|$7ZOIEXvjEhFFScO)gQ;G{%#KJ$_z1DR;zp z=G@qdGEDuyJi!EhSe@6#e>?luQM>Z&?g!H~aVgJS91VmP+Tz%+=FDAh2<^XU3Z8 zV(QHlSy86moMiS?(6LNCKMg>z%;MbtyPSU5p3Nb8B0WGoH?}mg_UpX|`-{iw1{dTi z|KHjl3R-wdi9%M--JebNGT&Wjnc1JU%sPlnG-&51wNtW_>tTahtmaM zW(&-=Qf6G>9ZQVa?Q~m5i1yr3q z>G6-Gr?7Su(}V;1d&M!`Vq^(tR`T4!Gbgm);u({n0S-sb_#KS68)^R58v&#{0+ z<5{4sKv{)oJh6H3S>CfV@f>p7uv;(ej`p!@7k103#5oYHKM>ir&dd657wYYOyw&#J zw-ZE61b#L#C;xqt_od`2+Iv7$rhoqk#|>Aok)W}Nb}|-@LW}j4je_EBPE2R(h0smc z`NWf(%Rd~LSbpvdM&Q)v%No)zE)jy(y*{ypFAC~C0_8}@0`icNl}#{z{K9Cjrm7xq!b%F8a)py!;Xn$H653WX#uGI$*h8CZY^?A*zDnUR3Wuu@{hGT*F0*R}@#mO+ zZ5F{s)t48;*RNv>9k(zA`{-pT*gubv(@VL0rS#UKuJy2xaHZBq&xVzu^_<5((q|{~ zo!rFO@)SC{ie*vO&@GwCW!^gEO*n8+U_ym=WQF$pQ`OS}o8YpWrS+iI zm_y4lfa;!Z&}kG-O_F{a7FQ-Vt7n68!(v@E$o5?RUFU{xq;&!!B(`unaPHhShFXgH zz2#!MW16rzT@sUH3wPoDf?qI6Sy>DI$!l>&Nju0amD!n|z7aam8f$44@=dabp5(ee zuIp8&WqGzRbGFgwnQ8UPxJf^jR5o~@(y1kV(tyvoGivYUL$z zIlZF1L@z&F^l>l}oog@nsHRJ#wM|dhJ=kQKhpn_QbgWpXhV8&=z`T&#oF~Q6BD=e& z!G*x0s%=v3{1D40b!-3We4@@fX>gr)ZcUwcNxaT`Kj%hXVm*&7{0ECmAvU3-wIa0+ zhK|$|#}0oJTeya|#)u%-_a9QMW2QLAUwE#&jB(3j@p8Hk;S~yu_$1PL29qK)m45wa3b|H3L4XWFF)!K_b~epuj^37v$fqvolKqaN_h<}=Vk() z5RNcq*(#_M_e(|ZG><2{Gihw*wg=Q`fw40Sfp}zbSzh)CI^IupP3{c?a-h3?@Liw@lG6i?n{)sOUcc^}Za`e9d| z-}Rr#O8-0;J_PR5TDA7jgp!l`mg=bxa@|Y10nnF0!{0>)!GJ>Dqy%*75T7AhGItw} z;Sk&O49^}Al^qf-i!yTJ7Fer^_70^151$J14AYIcRTOBeeY8WNekW{U=vy5IsNNfe zG@Au&o#W+r@bcA=KkAFg>hmPu@}yZkLuA}xqRE)&(+`aCKZ@gJl$A*XjJBX&Z34~D z7N~{sn3g`)BD6u6Bda7vj*NR3LbXqtWB6;Bez<9BssF9KHF<45jNFiFReFx8JZp;W9?XzP%M8)CNXxOP49+_dkP+1YTR_GxE8?jbj*rn5ogl?U zoJ3SaASa7!m?oH3du7}UW)%s>BCYpYHY=0v=CaLunelknwocPkZlShLo;t5?dsF{S z8QvcLd2emC33WFs8+Oz`sg-LDnRl&rquMgGgsV6Ie7hl^Scwyrm@ou%k#T=#|p*&1Aey~X#bD+-LExWjo;1U34V8t z{u95uS`YBMk2N+vzpD_HoDb?1xP{|)zlNIs8NZuwo2J0O<97)@XZ&v5oBwzGt{dzl zHt)BN-)&3eN*R7fe8Gg+1VWyiG7?%!8Xey|(?onl3OjVj(<8mm3TCRp3*v14CeN*q zTwn5Cwk~-I7l}6{Pfw%l5OJ^;g{N-D<&|h2_`(-9rVI8zKz|DSR{?Dv#|$##(LLPDdDm6 zcxWKDbTkjS?VxWS)##^Lr5yn9S81yrlY<^J&cW3o(ham9^r+UDmgz0K2#b~J?MA!S zx;3PQGRbsA=qGIgRd$)4h+o6!CU`c6R=tkFb3J1hTl5~2C9`U00S?vwjavR4B60RF z(Nx}OJ`6`S(Afq?Sy(5tw?I)@Zu-LW>Dg0gi>d%$m!1;n1$J`?t<&95rFh4FBLdh) zP^L_Gy1pUF> zC>=35=mvxLN%Q#{OgnIjlk1CzwcsN&hwj8eeS@%iE(*zQg6B@?7I#`2-2-&Oca7W& z5Z`e!dVvx##}-9SrE|XrXf}F{CK&w)5BVgvsGG{4-_cE;*GBs7Fw)LNMe$!hWUoV8 z{}rF7e>NoCU)?c}$TttGH}bOBtgm8i>8woX_mW{ba#ef$%uF{Dg(p19#J><)9nC|I zR^9!H=!KR;a-UWoYo|0>-C)47q=HgDefb2q7yB<(iwRgTud9@m$@V#AY_JklCa-F`qa)hzOm1MV$J%RAQZ1`jbQRZeUl<9aVENHGO9aXxuoz ztOC?ifSlJxFg|!S_qCk`<4VDB!@{j$+5 zjH0IY-0TnBenKw_dYm}{G-p)iWwWGSjf^Bb{jv(Tmz2D+lIeKKpP4N-Vb9hRxA=0gT-ln~`1zXvcKYX7c>2nYNwHAaXRwmBD$pGB{Tm&g1pQscLsa*|%TL z&4NRO`eoZ=6Reo=Zm$_%6YdloxB0s3xXlx6H*nl0#(A3oI&ZW2$kgT2I(O1>o8CSx z!@0iKa^QwLs48mZKD<%~Zu-#iBOmY4ts!^dMj<;C4y6zp3`;j_&Nu`$^wnJm)(XK_ zqh(lZJqZA{bzD}R+DXmBK%#98p5R%iaojI``k0W0DNe1`jmrxc%i0ciuIVSR(AfLxV zK75gZcYSD7A1)V=q9vu!tRjaU#2xZUy7CYB{nxPb5Rl$G1|cp07(@TESo6h9sw=mT%r2%5d)d&uCPArBSVjWoHeh z&{=wsmM?fl%12r{d0=cOvlrBmysCm@aa`oKQ4+@Mmzg6*TYU%}LQVq9&D%%|YYd(l zdb(3L9AAbGIGV#HaLJmPkGJsQJiG$sb$t! z8g)_uKNl|Jt0&5nYnL7}r1i-Qo2WaLziH@Q3~#A6zA7E^gqCa`o|04|-+IAL?qJQ1iGoFWll`_RdwS65Wj8XJm$Sv$(ge^lCR` zhW3;;JDIlsMmIa7*6C)XcyR)tR4r5dlHbWzVR_ru>SWPOHdbs3S>`Filst!R%nW~Qt;-fxGiQTu!8GivE z%V~W#*^Iwct*;TvUU-bwzEfjvW%8TW_iK3!b85_>7Jgqbu0HaOJ_08D=VNmJ zb70~s{Z*AtD2qv=lJQ#w7UroslMnc99#fk;4RCmj$)xD8dp3z#gJI^I1-~)Oo)mya z2Vg&EM#(HV3Jbw@P;d0j0w;5Z&fuqVLxwM=|DET+x6U>~_)}vS8{_p%jrYvQV^bq5 zWjZ-DZjd%K@6KxVi8yp_398l7Zx78z=c}{Khs}m;aQf|z!_|9u&xXWeM)2Zip@EEW zt&wNdi7mJ^HXA+XPgKj(aCfBcsQkLmtL|G$x#5Mziyovol!F>|bh0!1NbnD9;cPgp zgiFwNmP+kh^bXUPs;% zay3E@9X4NmMPRK*<&wZ!`p~8Y*0@I`uS zBLZ)d+>(+UrPGkvUL$AT(;|U&trJ+I5LlxSSfdbFqYzl55LlxSSfla;)?@^h3*E0z zUW&kS!i&MFPhN$*8il+Xg}e%B97_bx^Xc&|lxs5hzS?baGv+-JdcKYz6cL)|mymeZ|e(at6JpQ!<&ik&<%04Y*OGi!hR2vDA1>I_zZw%>F!sTdmi zYMxgCx1h5RdASXN4HQKS}#)x1ao!#T-(5@%Z^#(YaD&rE|Nk=C(b;)i!+n915UdkrcR?_d~?FWgp-w9cm3TcVxy zi2hB&2_wi&Cm=-)JvT``6tIbT{pU)MmM(l|LaE5 zu(c?a&MQ+#u|a?Kom!V`;VlfRJ|G6Ng+B2Bd$gidALY*CEVxWaZ;3k%paDxZFXeJh zl6x%eo31)oQ^Tlj_V02QvBP#dftm)W(zyQ;xnycX#`_lF@iJR6N+SAMZ# z&=`IJWHg39pat6GmBw)UC6pCScW$X!w3hK^6Zrk!IVrW>oh1x5xbP&#cXEXOoymeh zLVX;lvj~176Ur$IJN(U;1%Hw6r_27hgP&%9yp6;$`{NZ8J-#fcV0+5hAFrCv$YjAv z99O6bXBebB`(x!FsVw{BUlxJ3GQIZ@*IM?+JCp^%QqKN38RY#z6#1ttgF3Dc2dEEU z3rG=xN{C-a*wo$E=P3odbwN2uP$Ht^jN(*#xMZane8KgDkm*~qxXesTBRx%IekF<6 zMW!@AjZDA#lTW5=d4R#xdq=QMo3U|_HuaFfGBVvNNt_(?XM>bSrn^N`kqP?%5G&I? z59}h-|D)|az@#XmwP8{Vg5x6E2nezy1<6qm7I%reut?6)0D^*`EJ%>B!UDrEpaLp_ z1QjtLn8*wn$vG<^sA$7V5F{x&-}|1bp6Q+$yn65dKR&oq-KS2jQ>RW>SI@vTJ+T&^ zLkiC2X=vS7rFFGK z48?_c@5U@7twd4Z!OqN0A$A&*$Y3Gjo(rL>Srj6wj+7j#BPHW|V(vPU{Vm$v)}`j? zD--uAcO6L%0N7)-K%&97|4}gdN!BSj!#uSkPhZIH#>j#Zrle>1M%eF+=W!Va@!di_ z;h)`#-&)6y6Txpl5H#1#3i&YefO#7s`7FjGjO2a<>jp47X%MR}Ss)W^m=ml&!5$@8 zl$+8=6EP8MhsXo%-^L+oy7?&RBruo+4udJUdR`7)6%hu(FU8ewp*k3L^@Q_i%Ko~Y zm_p^`pN(oRRj&TGwzbdLgkq~MftI0F(LMAAPp7YZ7xY*qsokWiu4ofFf2B2+raK$?nY%8Z7!d&keR#MFx--JskeGPA#^RRyBtzu zypJHSS1fTE>4HnGT88}ds)a>#u05|bL4O24gxo=`9S^Ip6KAe#T5bP)%C94>#Z?V0TS` zTL!sjCI?b!**SQ`+K1=dj>hBl_8>MgJGwG!6-R*Y`xGgc(`v&n$fOBDsVw%RGSANNA zsAwKtY0ZOA!!_PTzJ~gd)PbaryiTs`6bde$aQ8}bXpEcAQKApm8p;MA(8+@kK7BR2 zy&f~wXb#kRlMwb@m9JzoLH)EyT2q=7j!XJu)Io_RMdud{ab8*hzF=A>#fK#@pHrcf z7mO$j=uK(&R))xMa*i+TFtmL<6NfeLvD#IVF_Hp(VT_Q6g{!n8G!He%LkI8>xminV zXW_Jv2zj*vYq858$N}Jb8E-ihGXxE6Y{Rk2qhL8v%>3AjsR68DnARav_eU_5L<$>0 zK{N5NfJ+tFW}-ep1}P?b%*dwZAvLMAL{lae@5uO|IgsY%#GptmTVLqcee zHTzXe_?A3@P7_o#gPzWp3Nn?l1KG<&HeZmvLS)^E%xCO|I%q1riDYkTg?Y)`PN;VD>B0d%Q5}6VmrgV+Y$HR4fp7D?%nXAM7kf?%Wf&Os zRB~%vfl5nTg&NVoF0D-`?g79ZnN;d=bMZBoH-5e>WX8AIa{_z%j2Rp+JSJX0%k;|l z0ZVXp*wUJ}_*RfF$>h}%&1K&|Folw8T*gLm0I6Z0{aSw8p87fBK@1Dla&uLPTrCji zT0+d(=!W}n#MxAM+HGwdiJ^UiuQdUvZW!n=f%3;7%%S&~ zbha6o8++Jfbu;k85-{+IFmRf0s! z{o~I>gK-&?0Iw-!qQ8X1@=pUP9YE$0PTVa9p_n9YAW1APMCUm%k1dONltLi3L% zS7$AUtp}b&D#HqPCf>t{SPJ9GPcz?{sJx7+Nskn~6odo^89^81Bx5$k<86$tNnN^k zb7mus_Z{=HZdgEPAIA{*=!hTssZdD|@ODGOvtMV;vZnkqP~~J%W&Htsb(qJos9)Y@ zD6>2#=8_db&NWp4ocSnf>TLwm4n&M^{jzQW6r3gJnrehFwE=4o3Nu!-HPvw$6t8|o zZAUxM82Bb)_}LJ zFs0(tz7B=_ zGamaYzb%Y6RvQ)-^X6VT5_UZMI(uQud<&jWfX6=&^6Y$~9CJQv+*o-EI_59@^5U8- z?fvG)*);r3DVpO*EhBXf+Ht8HaPC$y{7i~_7l$8#dI}Cf@|zFxE}+$u0H0?hnfDuy zbIy!wh7AVheT3jE9K%uLSvdtnQQ=%fx~CHIz4dR(=Y^Nz1>4|7AYPj?Fj<&0i+ouH#>@ABI8v z%CDv4SLg`7f}aatAI->`#d-i7W#-13CLc-_s1c<2u)@TV1zcv#8A_pMm7Gg<$872m zdg1E!?>8rg))&e2R5Mjr+Y@8Dn&<^`_+uqzk%$e69GHv(PlCHO*TC=DQJAipy%Ex_k$6Sc^HRG#wGa^AB9ixF=LOC-$4HU8EJEQ}@Uotx(i=yz@g=9RRtAuybbD2<96 zp{~B$I)s@|;u^+yWL{atud_&z?{s*u^IzTEVNMG!%;e zw5ysA8JXkd)j`Cr=Xipq9G`g^CuSn(N^mbDikC25(iz_AE_66F^Cz8kfl`ZXgEZ2E};s8SWJp15g;II(80~HTY?8Q5NqrHtC zXygDzl^!q80KO5xhfsO&Q$l*qV5OY2d^sGzI@exi{rFz$JUt&QATukhz@xY@{T#3! z(&F`CiqxB~GC&=jGiFnZBv*#S2v~smKwI$w;Nr0s-$M7TFlgWmcw+$nU4v7_7(tE3 zLNvG#at4Ved6L%7rFvh1Ad-T@3pznN4b1-#> z^?fnN?#?mPtxa?x5$1IDYmL%y434LvUub8O;${&$Z-K^ilJ>fw)-@vq@;O01pi;d< z3W%Haj+ayVedha^U}DfI=cKbzq+UlP>wrWbfesxn!Z?W0`69{)S~#4JUVZP!SP`re z9NU2-^D)h+C1A3QdVH0laS->>V>Wt3>Xw`I?up8!8PpqRR#O|Sa6Aywfx{3Iet?Zu zkBcTGK-SZyJFW;M2!W`)6+09C)RGiu$M9FUaP@L@o*S{O$0_N_-t3%)5y!%jej}@y z@Gv>U4tajJq^@|4c_Ze^WmEuH(?vexFC1&VFKO+Eio=;7L20y}s*`?zR7uxKKW-xf z=wpV%@OdaP*9YU$X^7DJpfPZ+xu+M*_z&xYCSj%JT$3NbvOcILn7BSzna=e=VL-|H zAf6ER`XE1{WPMNumoYIMT7V1xVSV61tVvqF7Gh(fSl3zv{ZH!yyl=$Ui1-c>Umn6) zrJ?B|X+R2(>Z;ynG?juSfp_4gWFH)6GkRDuR~(_q;ZgA_|Nl-rpc6*SR)Pf0cGC4m z=3~ea@SH%k&|y#+NG%C{oAJzwbi}`3th$Z~{ZTbTAn1EwNDla z{W)O-)5B@}K=9oqi?-O)Lm42l((cvMLtmPAB6}ffBA9ZHm?hY-e_$$qaA`9(gTMUd zEtZThn_{}fy4DznlMIvFM}5Y7 z$?LSgC$&=*dC*|}8_%kFV*O>DD9Wc)4^P+1R}lU^z-tYy#=aQQ zQ1;1A4JG`JDnMorXsG@${Ai94^%#CQzohmU%q!WEkwt`*l)oRh*?1F{qBoOG`#8gE z94Sos)rxwD)fPWwhQNGz3ua#dju2H2zrxEBukhN#Vep#y6!!~b6B7Ih6)dLQh%cU1 z2SxfH34zqsEH#3YJs$92Sf&FGp~;3hLzrUr>-2l9iTQ{|l-N9J?FHOjwI9e37)rm7 zI}tNFqd}}^XxGx7m8$NOjv1nDRA)Q#wM9;{i%G4XF|g4RoHEJXm{~)}W9ugQ%(H5b z2sRrHaP%fDrQ-i_EQ{^<{{%;ljBKVy7~}lbhpHfTi!7K#jFuj6aUk+DEXh^JOncAf64=AmM!Z=r9DfM}amXUrr>X&od9G5jC5zyUv$u z@Q&Yj*v9V8mnRTkGVmc9d@z@gp7Q9NwEQG|!CILrf%5;ueAy8{!~PHt&L72cTh>qK zbTyzCDk>5kig2+Xik}I0vk1TsTfO@-exMpqWEy^ic5)T99lJ8n{WVW zxid6;M?)|)l+VuSzr%X$E?i({jL=X}t{KaQQYq^AjHdR>a`paclT#|zY<$kY+sacG zedRg-CHM03WF{8P+(c*fM*WWwfwAQ~mQbp*UKMzmj&l)#DRNj>-H%szY8NR3DdVPX zz%J(6Ma&`mjn`)I`?UOCmuG99?SnA$<9mk-U|`?gjQvA%2Zj+TawibHgJ%xYtJEoC z*_~MmLene`-o{12XhP=Rw`fYf)1kBsUDUWXk(xB9yPjhHFL^FC!i%mr~7^8|xk z15w|tkLZC?$h}DC3(!p^oxdBu=w8O5!SxQ>N)((>;SHE;mQtI75>foUdGQIdXWjF~dY|WSjBUF0IwUN318i?v?cla#f05RV08g*?dQS3(uQ1jx zJCe85$6G0gTV7-tTe8FOn8ROv8G>S?Hi&fI=zIxGPr5&lgc}2KH---J9mc z07Loqo@DRvysn}p>qD64pZ0Vh7h{IS7l@m-Zp_VGiE*>GWNb-$5b^pG1{iPQ?LqKb zMR;|T*sy@HTgk!q62Y5BgO&kppH`R-sIq^s_UFjWT36muvw`z3fU4#Xi{D@ z^Ro%d$VxBzw+4{>Agq5wjQ3CaZ(6{%Oo0f? zG>y0K#7ErGHmfsQ*{o)i&EDi7*EY*fsF0P!%|fkco9X-}tz=$Xh!kcZ_@cD$GTFHk zMhqTC%2++wr&zxeg&nz40#}4(ECEr|MY&Om={)uuzKd;UFnz?ejXNXl7ccg^11kcz z{nVi8hP=n?u^6{v*w10JX5vr(V$ej`tL-4#`hRCHZIveE4kIZ($|`eFg0ihrl29Q# z+}o{!Xob47v9QQ1WBy&a|8k5**t_Sz|FgXdk-M1ozBDXs@840``#1KE z91kjqo`23ZUTi>}56)LqE5PXO&<4m%5_SBJ@>V^!&dYAOB-K%SAb$$>@02 zXlPiIKS%;&&pNjsIm+c?>+^5uEtWo+mw7#>Xt#f_&(r2?ZvRsA*X}{|FNysz{L3+a`TPA#r9_O+ z>7vYk(#P%nNo#5xpOD9lXL-TBt*IXJ9Q}VDg|YS137BH(ryDXeucr>_{Ih=g_5I)J zXOQUi|D>PUX}8nQTxME2>l#9+f8j|^`+1tP5b8^q(2swRLdAT|>WAJGUFvO>Q8D=R zc{KgzaTZBfutTAELLXf67D>UBgB^%`TgYK2&%^=bvPfCnwH`#R5G&VT7!FX4*av)1 z_r&!()b%Z+)b$m-{vxhl_*38?$Euj{^Kd=$SzJG?uD`{hj_Y1r-}nNquTj^RNsR&< zgZc?Ko{GJ3?>%*IDjf++?ISNDD)56`K4nKsUX>fT23{e-%= zm{T(Q{e=%mfR_dRaj%NHm&d+$THU+yJnrS^J<*caXvKJN{pbVht{)9LbH2RD=eW{JHCHD&R#&YPHO|@0SNXN)$bDg@oU*BD>npJgQ^|Fg`u$Kb_;f#3b075+}f?{r~6_Qx2dG)zrg z|E-&Xsf6D>^>5Zz%7}~@Tlg+&Pw|ZJRa}o7TeYYZ$#a6Lyb%DQf9wM+_?`>I!t+@T zZ`&w4;Bj-xtIBhIo_;cn^zfIBjTq8B8v2v6W7uC3!Bhx1IFQWU#yuS4AIBfygL-(I z{>szB>IZfVoA97$zc2Wb!@XdpaokSWW*l!-CT-vl2=DXL^zjyNnX|8)^j{{Se_ zR{ueA?lVmY6Eu$~___A@91D2d%o}2LvdF1fT|<|1sQ*Rr4W<6JFHs@?v-(4<%K2tq zBfwG3@PDU}HmcK83=o3)zrb&(zZ3QDGoRKfr^me<_PG0$2q(A{A)fVxMTBNZl^FYc zo&&%Vnn1pBh=7e_o<)L4iSPy{|9>w6Jm`xj#n7#|z9H#GiuB4Z5FslFA^trj5Y`9{ zQBpyCj^PoC(ybwvGfE$`Sp<7=4)(4{T6G%@$C~5vDfZrHkRf{u5cHtCub|Gz_*YSM z8;XB7Fa{j)Z(nECTu07uK90Vt<6m}(I%D4D!3H4NilOJP;Tzv&XTRs8enIGPBU>iRkd{V`38@vonbk@UtdWXP)c*Fy|m(bjoY z9P9}R*TMmmH(nKddO)3|QuKg&0OpPtq{)wXwteG9^w3}Zlcw(v5yzTjpB z^$yuf!>Evb9_7G(E6oF4>_HJ+xmZ5!Cds&dSi_K?LRv<;*f*Lt@{>>VKz=TSU95!S zXCWsM^0W7T@?&-xZoAlH(oee>9!rN@49_+_0T~O*#pcmb{xN35#d7L2Y8Ub^_3EAxHXj@WHL*Xlj>)o$^Q{?)Np)g9jAw{04)dG<}Qgl-|*VFad z3SILw)UBf1G8xHQpo{V25@deJ7MjAHY^@YPd!B2fep9${`Z|Q$q4C=b-ywqE%n=gq zF;S2f?hdST?9k1$t*01U375hQ_g~u+iA3*?B3dz9uYcW3(aaaYs7@p*DCUA(sZsdv z6vVSwScXOw{mnV53fL@yy>G;y6?>n^w09fb#~M}JItY7zKodf|n|ig?e`W6x#a?}z_*xvs2``w*m;@Ts&G3deNdO{KzTB}2H43LT4$P_{b`d+4zy zc=Q!b`T-&B`Cbjr*W{0p4lQ6d83w-v{||^qsjvL-<3OV+iex%qVgP^j76;_74shkN z+5=Go;it<0l(+(?XNo`=0%nO;C~Nyc zcS#xkgP0@n5(4~Si|woTDlxCOfS5XRcZQ!qOubI)hdZ=XGQ@dN2ed@|HuZIieA;2z z%{rN&W$)225cz_ld%sP0W}LYG!vk%Ri->n?k?(`wif_U78M!A2VP)CAl8OA2$cWro zvBC~VZf_fR{CH4^dvY`O`iwuDi`Vys-5~aP24|l+7#GQbtDvV+HlNmiCEhQ+0*C8~ zf*|CbO2}*+oOIu%I93z5>LIKuyB-yVXd&gSN1$La0lPmu?~^jx7)ze<)KesRyPg

lV5%6;@8nCX25-l@apU)sLljDf+H4bsa{vxXqXSt+h|3RE1EkvBpZR__H(nc1FgNQ}z zw*jLNCxLSK%x^@5(5k$#mSPB`%hU#_St5h0{WkJbz| z`J$GHnmmzAj#YivtF=u{mKRCX5KD4s(vCOOTn!L{*-AA#Y19Q`$FTQm} zpBxSR(Bx@4Bl3T(3OK+;)%TJeo@Ys4vvi2*cv`CqBg*IQfg7nH>z=0L12Rn$5wD$!!T><}{- z#5^eGRbnm=FAbs}k4B|4IDX+s6A`lmvv^vtFGxeCw;{|5y`(w_ri132N*~X@paJVE z9`}G}#pAmokLEGm!6TPcl^i_Y_n&ygvyQ5Y$7yy-yA{Y01HPu0feZ3mlXD>AJXlS| zc*f3Ky!?jzU-kUbmX06Q0$8CC(?{#0pFJI@^YBzO;3I?K5-OBpyUPsxZ-W?^9+@JF z-NLa<#ojAS8|@jyv|@)hpkfmgk85CT0X)Z0ioEz)Td{Q{C~L*ejZo|n34MykReIg} z?|d9Qew!>j9<*dK`t_gmt`;GVgf@qg%Fk(s#Ak3>=QBOv zOcyb>D~KKT-1f49$PV^GMT{C?g1p+!vBYK)3_bE3E`dK~dVboh6#^+NGf4@=JzCa=A!F zgAEQY2jd?0%P7G09W`Kv0=y^0CG+x8yMi8_tR4jqD8sPwIE_r{__;*EDtv zkl+=Nj{p+4w0^oML!xB#^W)U9gv zKrYH#Fb!^HQMYO_?6X%6-r`&kG|wn)54K~^SzMKsIlkYbZdJ9{S-W`)DGPcnR<|sB zrud4tkig;AG<9nP!!T*_NtYya(1*G;(GDadc#Cz4pxI5`>aRR5t(QDO3Yv}8<*N1s37BTu@!kttOGQVzM9)n%UIlft234y{xl#r!joL$GN}N zpU}M;VEI+7pV1dmOqhe1hXaUe73o6kNM;TW}R&yS7n7emC|nzP)tj)BS+GB$`u7@F zVU6n$Tm>>FoDy75;I`m;mvFU>J2bAp>+!ZRo>#pIpL29TU!+gI_5zABdKIqI5@L#6 z#%-l9wrd+Ji39rjQsF8qPzh|fH*0E=U<}#x8 zCFc#A=M(tLT)HPKCM0~{?T_G~@{D0n#(TJy8Yr zN!@W8NbS98KVd%I1S;4bTb(5a?u{*3SKi{Yp?LlrZa*cFNzQk`DV;c7L=IL9nspy% zH@rKG2(p#d_iYWDF9HQ$WyB_2zL#cy*b6Tss)#GEs7@k~yj&kQb|icH%_71Bj#07X z9-H{nsB$$StpC5v((%;P{r){5Xx(EONa z{pN1L1v2STWER+D4%fLonZ58PA#<8Q)Y(zcBblYR6Ey27GNWuVg~DXYD``5|WcuHh z%#eOO(b_Z8CNW4zq_q#4KTo;Y-(L-UXXq5= zlWVUZloQADHO5>AEuB&tZ^3w$p}095CE*3rOD#ZxV7+tEP<9U;)Q7MPIfeM ziWJEZ>};-NuO|`ND(C!ln65F9k{AMb_=A5))<9c!YlUuA_hX1w2dSW$mlAu8d1`)B zaP0{9hz;ivxLoAVE6=w>_}UXL8{n*AhLgRHynb#6u3vuGdHpF~-;e7&{TfH{dK1oJ z@gFoBPz0}WUd`i*hv9_%kg#|T!yA5225SyMz`vs44OM(l@FNI6Sa1`z4`734YXx{; z8;24`5wIBmku+~)S;cRr60y(Im6ZtMZvdTym7UHGh0(#vaV;1OUmwHkIdHvJkui0% zWl5_5gx_+?_L*f9_{VdXNO!@7Z327k-p)bRkR}qZS0YT}t*>wkENx@qf$=|?BEW!; z0Q+j0m(9=Yd%xFo@;RB^)6m_Tw8zQkR9^4G>m~O&uTSUo2E5+)y7T%wyk3sipDE?U zKbP0M<@N)>YkaW%-pCihN;|f+(;SOiml6Rdw zUp|T#5DuNA)2Xvq{6n$_wv*t-t+5nfmH{!me{ZF`#Lphs#XeKm$7hZJVWr-$u-FWm z0oxszqzCp8vS)1U+0m2OOGIGb$3B%6_V26M*xL&B?k?;H2$?fB_VbS`?3*F4Q^AMW z=fD=>eH&mD@7HCqn$?B<2q8ZvWQ1$*v!cnq6Z}L0zMYE6v_&Ot%?_A3!^+JO_<<;T z2{EGqh{2oqt%)GyeuCDlglo#0b!&*x?CWePYfi7_yfL0FWzA}pVa=Rpozmq9oF~Dn z*xVZZ=~Htf;scNA_zHcTOkQH2_2>g@&H;>^>EvNu8ujuT+L^ho3S1`STd}c^kf5`} zY8!$5clLQ&VNZv}754Fh{dE`iYlN&78~c=+iudc5oA(>+V<_ycL%f#}>{VUZ{~+Xd zn`3AO)=l+Yb)Mm|0^6A&{KV?cv3WZ+Itq zbij>`wVkMzu;oqafg6QfT-~L(>Wv$fD>{3WV9T2{05^`>Tp7Fhiy_gQGz2&HDB^PB z7ULuikTF(?H0h&ZOSGoDbTeLblRiP+yQ#*QR!^pkvGmu}J<}y`PLVfV?`GZRl5CYo zmOfYdd6qyNtM?hFyBdKf=t1o^f}x0zf}wXGSYkN5?`QIB&t*oSCHoX-AD?*%s!#!| z5o(M}}a+6Z_!Y&CpC~q4pLuFIUmnSpx~Q zC*(V^v1fs>#NHtSdq?)^rLZ4IfKa?o6ztP%?74`&Ga>85#{LPUCiXvma`WDmeR3)6 z<3gG#C)jJ)*zY9v?u0zKKBi{I!jp)7Rs{AZ+2<4X@tHjUqj=wqdLPy)m9=Ja6Z_MI z9330`NjMC#*Nwp5lYLSZ_LYE9*aryqVK(+W#QrQHi^s;kuAIVt>PNR``moQ1b;A2B zz$onb1bbl{`(4ETJRvs`GTI|w!T=)guSQ_+$3Cwq>`wqjVgDLc)u6eilGY3>RDu44 z>=hgP>hcPE$q4K(vQHI-{cXS~?Ck`54;%a4#6FOaxng7Qrg{J72e)PhvCqM^qM64+ zyx(X*-m}@*u`LOQND=ZALPl$5olaePM_?byK7$qZS)s(}9l`!VMXed`n+OaiWNK{e z8?;q(M_?bpJ_Qu^*&(ae5$ug@?Dr7+C_-MqYdSG_ucpW9!qaZeq_fXT_Q88UfKhrs zDGzL{3YzzP#6E_Quf@jRNJp_JBCuz$PZx!~IA9d^(Sm)VjUAgsvjoNyvPx|11`uiIZ*!}D?S7C1l7{&W0 zc?z?;yw(g;hQJg;4vvkzoVIGU2<)%3Pd$Y_SIDZp1p5FRJGPW(2}~tqf!NrWYRw$} z-mRJG?DNxV(aalwQM~68?D=f$*qNUt@D?Fg5;9sdNA+kL5`ldN`;1fAzYdM2Pp~3F zU9_Cm3|^DS5|~NIF0rwHsePtU1on5?r?kR8Ipi~`g1w!Mo$s>*<`DAlRWW%liPAK! zy85JBGxOMIJNw}I5@3{OE?~J7G;iQBm8=o*)=rkd`-Geu1ADB6KsNLUn$3YAoMRUW zEFy}oLd^KHZ1h6l7hF>b7id+_n&YIQ6#XGcn#oPUQO= z(Z|Wl3ijEzQUvc07?qJ<#Zn|_1|QLa7op&*2)O`|F|Zrt4A^@{U=Og*K!yD@!neZy zmSCUf!oHS}DY3A_0V6VUsW`C`ajlFqCodYNG+01(c#e7pzOl-JCGb0A&UUh_IzYT0qE zr1OTwmRdf}M_+5}w@%sO1LsI^>2esnOkL;l7NX8af<=1|a%nI=aGqVppbKEq0i*1_ z01F?y7irfETFbOGmk0Hctf$8suYUbjnz!ufSV&WVA%Ozj9im1iIY~?xX6uNkz6gj!MB$f*dAu%}ba&!s1K=D9n zcKHTfpr!6_dyIprIPCY$B$XPLwzt2Gh4W%8&gVrSuf{Hm(FJO0 z7>eNsur3aoCrauNCu*rd$cz}sqejLGH8Ive_pqmy2qY0f10iL+q1?w6zenPl3USkD z!%)>@99wE)^x>!V_aUc#N(54f_t&qY{2CIK1xgN@PY*l&r$iu?T~@G*&&&xJHE3A3 z37Wr@&{CJ6Gdw}aDKU{>fT4-}i3sE^*rkg?z8x?M`Dj5t(S^JfA*)0qk1-!BV)+44%U zY7Olay79SKEh!#7suy+Mc$h7(6svX?ao$+NmMT_#TG)BxUADYQHG%38&gCH*g=J<> zO2mzH7mb0628&gR#hpE>u;oo+u__qvyzv`bs#x_9XQB{|0&IDcdLZPSfvncs2b?Zb zGBBB{9`{A8v2{kzIt>px9kXQMb#`fuF7UGTp;_l;EV%F-70>-8eJDjQn@Y$sF_G7# z;xTY7@Dq+_B?Hsh<=W?h{64^_ki$9~o=4lrA0qO%2)PrG(KCH#&ABfE`3!cMp^!fs z;yi$|PSD&EuQ`91$Y&C=e@x_!XajIwAp-fk>{3S|FAf;Rc@IJUoQ=FRk~s zX|?Rz?^eq^cKLp>sKpGaCA%Q^*vQKe`TK-i0?25!^ra($^Rx)$^V#K9g*+KBit`V# zq6nIw7u9Ncgvb{VvO`SdYYQpl_eUWAm|aRKFyI6y63BanZ=F3&6EF9Jp( zpCZU-*vQKh`B#KYii!NA2Nd!w5y+RY%iRk3SimUcRRnn*8+ipHUq;BEK8vN65)Ufm z@9%Z1Wd*x@fi6%>5MfCnKZNCN(EPrLR!c=9Uq#6AF_F*K-qI)nd4OHoDCEOJ-ZDgx zziK0|MC5A;`AAIU>3R^I-Q(tbJ-b|AD4cf<4Wb7Gc_|xtWg_25$X$Sp^z-O>n*~(t z<1Fl)x2pwq6Tu`QWn?QBozq^BkjhEscZQSDy!|suRRh=9r4_sQ%&mY?nZRHy$AaeQ2ef-t zqmgb9vUE)3b6{N}{{{Rwk^jLiS3eQt!vUj^7Zl_rY~8*|xG!RWlJ$M>oS*PzGmLp&J2&8gA4fy(4$5IBj9 zt3FfmT}+hKwmU;e-9R;VsVB^vABCoyURVVO%>fWp62iLFQw>5Eh>84V_#J2ABj6{T z5Y`RUWS27^iiKMPM$Kh+3i5kh$R8u*DnLea{su!ckPnMMUWZ*KDC92yMj>B_)hNDO zp5MuNT|#z?iQKO_FA{+~kzL9vD_UIOrjGQ7r@xZlAkL=A0srpqW_~E^!t? z(W(Xm$(FkkZ<>aPepeHfD4vcsXdY>~ZXcXwrTZ3^6NZaHkQhc_-oQTmBG(P~W_;Mq% z^&%lt0SR^ffxHd7<$lb;AYshH5R-RS@J>9o2>Oi9vd|+tcn=af)@$z*D|P^EwQjIn9;q|q+kE8u1R`Rx?`uII->$}8s!>vSE{cG zK3i1nY1X!htKTp5#Dn&n4P zYI$a2aVhR}4o>ZGr|;0r#BO8HCoqe3209XVnuQkJDL`Pq*$thoTFa^FX-Wr7F~qG> z0-DJ-%$>H`Or5xcsJsEZ&vhv}cqNzqyJMb2wv42}~sZjq`Z%FoWD?-gjFTezzbm zXPk}VGUj#Y=*(Jba5_pOP+-eS*@7&`YJ*k1W30V`67zO!BLq<<3 zTpsV;09KTeO4GeV$h(DUV-nJPXrcN7a%h}{{#{xqBBdCmg_cl}(!xa+{@tS|H87J{ zmt#Qb(X*03Zlcx5Yln+%P#KG)65<{eKDG?1<;X~Rb}TM)gt?r7sYAHT%WGjS zv!W?n#>at^&ai>#G9Oyd<&Ru{`OPlqY%TuE&E;35+mCd8rq53PFt+F1?bP8CLN$)b z-AS$={hm2N@#-OWMR;{%S^Fuk9*zK{yt*JN@ZquDJg|)Te|eV|Wo(~Cojbzs;Ltnn za*XX7pcHFtKLqcjH|KY$cNGbYBLTM)U?4V=R1PzYIg==To(Aa2?{(szo>(Vxe1%qq z4Fj8rt){SR_ChC>F?Yc-4&&dW71xl?w}p^*N7IeYm?7T-K%m`mE7m?@=<5zc<7}I;?1b%i6ic@1spC5va2{R7lx1l)|xUNVc$p4H$u0NCGRF_@hqm&pPU~L1ZN%zZ{ytu<^d=p>fx+F}s zB~w50=5*e48yx8bUYr^GqKDn^n7Vl$XJ~I1xWIm01*uURGjil(>W6VnJp%M_I;|8C zEkhn|%5N9A!tM{oB5R(DANr> zt|z2hrdZAd(b95rxY!%W+Xu1_LibmNkdYT&8@c$p1t(IXodX+I+tp4!+Xr&7dwq0| zc99M22_s~4X`_8054+@5qRj@3&VP||;5{mEC!)2dXdXiTJR=%;)Y3q#HsemG)j9+U zu=@gZhtFliu-c0ut4)F6*05Dht91wzVfWtb?p7=;@+f-JY7e`#(IF7eF4cvic`sm; z)jDGR8Z@5g>`Jh=kw?w$EcSMi26kJme6)!T)3Kb4dv!&_*Cv!S)>}5;sn>ayrytcw= z=}v)WBsh`;qbz;GP?k<`X|PkE1-mpA9?cbiQI_s6OQoTZN7T`Y>S#sCVlk0d0>gBp zQ{X2&_&WvKu*-!vdC|NJFba7-L0;H}yd5Do5i*MN@1P|j9}|JR1G~JgkS_y_LcRpc z>7cpx4kzcG2>EO@@>o7{3+ZopGs4;ALWK4{WL4-Y6mR+oq}BA@Qlc^VY}+!lMXU4xo_%HYx^Uh~Ei; zS$uUSTrJ~^suz)!+GK^T;#hADk+ z5AgA<%!aeJA!rJvU;fUT#X1M^h0-y!K&caf{pLUp@VcNBHe}bp6cW1ix)6FKOsGAF z9ZPn9qmxYtk>nzpLg)^Plx`Ecai@s1kHCJj5IyG*Qd&nO=^A*Ql->X(ZRF!Y0?3!o zG0eIKrtFUq?HW)fWq zpo?&Xlrkeg7OyR(_!`2RyZ92C^17xG49y{i)2~rA%7?*GGQP`>7y;_#0j>BbfnUPM z9R4@{jxO+yck z@`xr9{ibP8($OyiO;_~$nlna47))IELp5V`R~}_?9X*Cs&*(mMb`e28 zB5>;z77NEqXB;vEFjF&r``hz8SWfl*6*OOh1Bscs(M|gZdr_I! ziDK6zI6xelIOmN~K$Rlm){Y}YmcfAd6cE7q+aJ8kQhx9+zR`XRM8z-ynT?R?3UW&b zvQ&2FgNt2|c?j8FLB1P;Y<-hBGhC4O5wg6392kP!2OkNVon4Sc2$@|$ri36bLK#7` zvJ3JdLLT#pL`6f8S8ot9rwg(oAr~vit2b@gcZftMVE(Y|H3^xaAa{fyXNZ=*azQ2$ zva^Dm7lO-^M)<^MUm(xTK8N~qTX6~P|@ z#nx-=%Ruoa>G@F9`^?pMI{UU23Px4o#WO8a;?^LH1lNO$XJj$1O1y8w{Zxs!#s*=U zu}~}ZO`^;Olqfu{%ms^b%{pg27zx9?O_-D8#l~C@Ya6d;c32jA9e{b6I=n|R5YLlr z;)uvZo{i=?a0}CGH`qfIxfv}evMxdV<|w9!U(NzzgzZE;a>Qw9He)kLv=4~ln1BI% zq=L$CVzM_^vfoI&|5gxerg+EA1;bWLa_ja~Fje&$`8^>{vMA$g7FQGD z@x}cLGQPU}4!39w^NL$Mffn4NKY{&bGCEr`-w}PYR35ihNUb5M_Cm^>55efE84E!< zUi&Fj5VuBGtDZgH1+RV_*~UrSnF1zBra55xPvRK{)9q zDVJLCwZUQ$=4E-|(ddud{qj4v4ron%?)U>^KE#E-1J;?{mcTOMGK zYhy^!C`mz7EH7in^4Cy{ux*L@K{}dZ%bM_0YdEwmwtNIF*z#!t`^{fjYufWRaY~g( zlR89FK1FH;RjNomVJGVeNc?S5Sa4QAQ%IeMPOZE)sqfJOsk{XCoA;oz^$bXbrVWwm z2ua0*lwROH_ZuNj0Xw`!AdV5@?^i|cR46>fcaULNmX~$dh7pmd`U;J?O?6yHWg^gBrpyH zBILz;@M0r*N)osB7=7~^VLJg9%9wkRHe#@SL6YAIfEKI*d4rIZgl*#jrWGw+kS%mFJd1C?9m!F=fY{Kp6AogRNrns07bP5H4C-BXiUK7R+gV5o($xC z8K^1}mCx*nt~`Xz=V^_l8rCr|mZ<7UD)ml68Uh&^>F|;zCtT+i9jR4#)y56y3KFYQ z)CG9OE{w@{5%E4JB-HETxV0xqFh2=S8%5R(J~z?BzM>srPBLVMW{dKB(3D|+4aTtw z!ln{oEVMA}zaX&RyvzvGZyHI-8a;09_aqfhQe}jcxeU__R>!Q`nVn%H(SR^ioKV>T z6=PXkEX?3i(2(gY0}kh4a4?#}p#KsW90E-WgQL&_gB=L$H;0nJol_kQo+g9kNP5CZ z(Zy0IKy*dbS!{b>W*70 zq$`lL2c%K!h9g;z&nKjKyq*sPtP;U~9uZ49s+!RdN9VaK6mYpW;O|whrDCS?DkxF= zPv@O#uSU$1fH~6JF}gdQMSpy8)GWhkj(MaYc;AJf1`#v`0(2;Y4pId(`(I}6HPi+9 zC?Sg}$e?9IUOi99<}S#ZguMQW7^DcO6*xwn|lybP6! zH7=-praeKho&g4H2Wnd3sKPY&480(UL|;`zKZn&c(XNQm;sqb@TG$Jwqv`U3<5z$? z2=RpOZnWTd{n^QH761~fwa`^N{jf1ed4Z6wPtrL-T0aMDc}`pu)NJM&65`Bo(MVHR zgQZWVA@=f;Gm^}b6?jusX7fPD>S9)E8vyAX$60cwV)_?haS;-n5{ll%j7Ds1|dBKbR9${Gcdp=c+hdXQ9YkkYoyu*j5i4im7a2zH<1 zXc&e-vTt9=mSV`Byr^CmsRt!1L)PRkZ&G}!w-55#-B#Xt4o4BZ{fKwP9p z=x@MFgJvfe^ z44TKmdU*O7MaZ!Va##qm#}9=3(giu1kew7{?_X^3PyR^A2`)%4AuDMJ~ zPEwHXAQ&s0TSZGNU62b2`4k|LF})^L40#}KV1khtvJizI&JQ|Z8u3{HRs z!@Au_s7kRJdD$gMYGu$SymZXU99&STCiR% zf*{|85v>tkAP&WMW)qV19wkw}5`*b-03SPri)Oz1ESl{~@n+10F0I1gHsS#wv^pE3 z4_d`?p(OZ}$4F&=aw_)}2^<(0ZGEWI%iP3w9%%M32f%sA;52BS`%xoko)tDcM+9#G z0Xl4z1luflQlP&S=+!oK3qoHZ^fL;2BC;spUUf>K#|rdh8@eT-ZxNbjDggH@m|Xy! zfba}X+6i)vsTA-`g(5(r5H=)0MNpQD7i4V9telO5} zNFhFl4c&&&_Y-=dg1(G}7odF@+`zq4pb!6`b<&p5@q`|!pwkem0DXp2uFo@Dpg*#q z+Y!19p<5{E7nBB{RnP+jdYBE}p3qeYU0gvYLN4IGM?u#U=u{iJ1EFgZnrDtegFkTX z>@yD_%z~5q1o}Z6x+9?*5c(Sh{gcAo^MpYEj1?Nb7k64q*@@822>rH#eiIoEa6hgz zxLlw&*wCE`-Hy=DDQHXSq@&_wqCiixp}P>eJE7|UT7Ms+5u6sWLk-7ngy>C(LV&<< zOa=x$9Or`(2~#^cL_={jA%LcYsaL+kXyXA{G7?`v3nOt3f&FH0=4n?lNJ=(s#H|%l z&ym#P0iwjsn4mEZxx>IbeM+lCp!yQZ3#h13Xnb@v#GipgMELuFJ{RV1I-0`YLMYq{ zLN4KNHd^5CWdbA4V+>fWo&0sDDh88soZ_z;bZYaL1j z5A)|iQ~0ZP96WTl`FjX0@OKftz~5fj!TJgn%8>qgkiS<+xj!hw3Cm;D*!;~yh?6ic z`eW8~HYFy1y)ijz`+DHS!e1I!*kS&9qAC3Sj@j8-3uTD@ent!YH6}3l!+dMq>*ViA z@;8~3_q-td8Hg`7e_37py+){y0Tpdu&cB+!1bCA0m&0w}s|a?&-*HUDR#BV3-DrWo zBe)CxvY@jyaEwELPm#ZONV%fo@6gFGe@|jw3hQqcq3(>yU+FM^yX-t;CnIE7e*rXw zzh9}pQ80t(@1)Wn-#Y+*uc5Pb;8h2IPm{k7NqI^?(cgIpWb1GJ2`7Ia5vmWMqV+dH zqKD)`Z86h`{@S3><>0R&n!?|G7=YII5L5WO11;$9VFF`)jLue7Cx6e7zb{GoVqf8} z)X^}1#a#S-O{i^vissM4pw;#bVCokBcDlz$AT&Nez)*E%u!bO2S`Zikx%lHs@9f#IECS(0J*?Me#YvhQcoH)^xZ4w=kExV?~5gbN}{g@r4B2~82MD4nCYE!;iI zIrbCSZ%$=!AB@UnC`W#dq<Ed~_00lNdU}<9LJ}XBHj;x@Ay`=y5h$ zuyc16XL_Tvl}AYFc}__EOj29=2&tdTHZWgLm*UNCNKJHQ8)=wzp_OHCX9Jke$#h{sV zMEkqkzQEfvcspVPmbl+;DPqLAdR$_UXQfBPw$n7$MDhINu=w7w!%jMv*{d>oMU`T{ z7MWB>U2>W2>iRpoUVAo1S93ZHB#(GJd9d)ZD>^~bbJR)u8WAi3f`|t?a0ao9a*%Dn zAij8m$$7{ZtDi+v+&&9!R2DWC8(qc}1{>`lu-}}7&ekZ@#zGJI`qAyPpn`L@Hd$wl zfBYf(jP)tp z$qEsT_+;Ng(P^^pkmUoWu)l_A-br-tDRgtmmd|X-!G$^s7fH2}LR-zU9fQDlE_B&; zf)^;*z3l%K`s+`e^#xSunaV^$6edI>Ab|71{bU#$Ld`CS)IswF+r9$%AR+TBUK%h& zDtp|t=YSrJyCHj&Z;7VZqX5)k&4k{>9=XwiJ*pDeZ>~mX>mn+Op)fR=Og&6epY{|j z9y=EzRRc4In0^F>50NVM0-8d~a{}lp*`$JsR0{(8&6^AhV};bIW*I-hszR!a$PZF@ zY|DokFHIsfEg zq}-mA@jg|U)FKvLvYQ}d!cO2piDIZ!OwUfYpvmgFgm4Fye#Fb8k zRBe*_^=TnhC`{@Ipv8POm_dZhSN>r%h142G^%reYpR1^TCxQLuJ0!Ik5hCO%LMnlz z(m_f;p5L(#R55nnmiUVuK^#f~`MAihn3{ip_TGo*>Z(LNoo&>un|b@hTLUHv5l7d? z>{=LIW0?DEAq7iE1Wb9@vBN3>WHvwQLt!>QO^I~NQ@HK+1U~tXoc7H$>Ovk_!0GUP z$o)>AYEDce1XD!$+?XYcUP%{f!7XKuYoW)fn&Ui4Xr_86i5T)eM{lMLnUGct-btkm z52*3_JIC_lFNbAH^=)k?yRKfNk98y`SDwUe>|5PS9rH=tg53x!3{^R;v^hYFDD?^i z2(7TCYiD*{E?t#MBlHP8;}Q9)USoj?j|ORA46&fO4HgfNuWm&1BG5!D(U>BY3sJ_e zR0dy7=!}%!;fkqfiYsoU5`KnGMF~rk5-JebZ!Tt(c?{*XkSo4U;d_(xwH_4S9E%ZY z*B48>7<`UUdjS=L!3$Wf>IhKws%CIMa#9C_8_^U7J0VtE4Q&Qf(ZaBtPhh{v=ZDse zK@JArAcJWn-BuVh#)L`Dg>Q*t#8E#OmfA70py_gqDI~ccx)q(IE0W(5k>Bjhq5BX> z+Rh$w3?V(3q`&P>lVQ~DvhEsBHR&iT5JL#DoDfmoZx68;Pm7;{Yw>CEMwd%0-Q#qL zSBSYAFh>kDOn40;gPQPmYzLz6aQ=m>>qvGjfv$k9yqnx}a@+$y44N%nkmCt?vztI3 z0WJkOe=i{)c0o=cIWlDF*KYTvi)cPqg0|Ef{%U zDeUAoR|1Juog~B2Rz(6KJ(Z--b`^tTHIpmZXe<4wR-^E?+f8|Y(5M2n&BEqZ!49K447*;+p z7&a3_Epd;`4;O7#2&7vFnk#KTesW}*h32Mb)t2!iEfYe0U#p%8rsO%#+_s5 zP%T=&q5G$>~OcAzH`A^UkE48E#r$L!wrTWT;ClMIucb&t% zttfMaX53X|$|9+;LdxX$v}fFmfVWw;gGibUPyg;Y`pkgri9Rs{#Fd6F@ zVes+8E(R;1DGV-#3alzNgY(dWpXVd6-{ig;Yh1rb4PGMYdcvTQxCI=@Cedq~n6Ncu z!nSd`@|+!8T>(V7s2JfgQ3Ts-?(>Cr+NAnaQVH4nA#OMGt%nCo%*_vEVf$Pqf;B*3 zNB*d|ZyZ9}skQJ3hOflLC*dJ9lg?IJ(P5mES1|}-mF%d^buU`bMmcu!n`iLH8iLAL zR7_k=zY3D0a>9|(DNMR3yig4AA&nAVzr2N}7@!6QhV=!sDIQW9Esz{aV88hTS7ioB zhFn-kWgP}m>)TOy<03#rMa8P%qe9`fiMVBO_;G0?1SoU>D|fR4)L&^)p~?R%XwTndDtn~7MI=A zb=7NJE!lHPILKh!2ApWf?gAo-{;9M54f!a9rhElEy;D z3msQaZCAhJt&vk4Os}McA0UM$pn&oj)00#{L_|S6wOq=|f$xAdQZhgtmsha=!|b0s z7Khlegv`ZfT;9mZ5Z^;Fd&Bjdm6{G1XPgO>T{1sHjLX|Zv4Q8HVkb=mgsENMtv>hUKkfy0*{l__13&>cI9Xj>jup-E{2i_wU1ElRWJCv zghiI-ue_ZMH{g)aBMtmjM^pGKN&Xt!{N-2t-A`b@c?m9J&14DFcK=NB*OZjoEB=~c z-m>}g!cbv_H6v8znEbT}^H;>4D_&td3G>$vP2q1fgU7d8H9tvigOWtLT#96hlCBDnSVbsZ zT#ja619O-(^8D7VRQS1$kxA>^a zCKf8O{6Es(1iq^B`2SCUD?z;8s2q)ZR8U+{6c;d}xsbq#-Uu!Tib`5H+)-{66%Y(j zugB}sYSpUMTD5B3+PdJL0J5uy)q+?>ZR?3~0o$@@+xvfi=A64Ge!t(}>+ef)&vVW^ zGxN;MGtWHpJm)!v>Kvgu8&qBLHsou%4z_ko+2vr%g`I}wd|}y53>BMfcN3K57*^L5 z#on-+H?fO_@9nYTsx;3N`HE>tsQ7X&P4Um-D)WjT^lOTy__l>edL&vjE&PEJif<8c z+F9@?p4~+zEjQYHEgQR1q)&o0vOVDq$yV=#^nNWj-2W*JI(*Yds3j{?X7Yi048>JK zQJLkw`{91({G#E0ACTpnKV1mk86zG7t(J@%__Po3X?hRBc?*}OnRJ-%fiIZOqnasH za|~7FL<_{Ce|%OwJ2D3^ot>@G);keLc34ag%`P?jjElr&+1odgL0BmIy_`;A8W@2^UbN(J7>=o_X2&-a4X zU1nT|n{BM>!>am}RqfV7z_Uwxcm3>jL~7PyXnrd+=YpoRpJ5;Oy&{g3%((#JTTnW? zsPf~gyl=pM%tGksiWAMW%8^3WwCsr7p+uxvl2Y8+Bf_S#$l zy8t7NQ%o9i1*g-vjB^FhhSnfo7UXU~VnowFlJ29so@}Dn8ply2ia{C!!tm=SV%w&* z8O!~I0gR!1MJSgYCsEk6_AMYvnI`@^5OfI3|1Sf5j(cA61&xn2xgIa`?gN6@kEUGOs9TQpumc&&)tuY`M$aChlPXCu`dBcmmS4FWC$ z7%7Z;QT)gj`XTU)b0E+r1%uoq$PZkT!dDim@||~+!WE^q@HdU(p%iv}Ju8J5uM?Hf z77XQPp=<$VXbY`ClroJN&V{d>Egalc3=3Zl#PC89zyA^Py@kBg7S2ShIYu@~3carZ z_WRK$h1wUyk8ELU%sAr=1lpuvkbMNX0!a8874(QVf*vvV`H~*-$@07uwo^woZ}R)u zq7vGIq1;j^XMi%ag=>K*;Td8-fvub^eDw#=7285Pjh8L_zKGqeg?kU-?qUlQkZO*R zem#*wm4N>_%A~NZNkO(y2`$bs2il}ykUI%-DUcaw8$%On)gJDwhfnbkuGcWN2}kWs z#Pl|5-=G0FKWa~-STt(?mU+3qABwY4`yNUJh9|00+W8|${FxKMT^gPn>0L$okbrbk zp7d}oEf&2)^NRd@rBmJm#&kGNp}0AVv+?kGx;JEi~G-P3|{@`vZ5C0O}dUx zM~YC%>+Bh42c(wM^k8+MBdz^FBh$^l7o*D|w&)c}>QjhY2QtW`1epR7Nu8(BEgcSOo_#7zbT7|12NZF8nxOs!RH@a$;CC7e zf|SP>*_rR7nzrQ`yo;hSxP=&O$TGMIoxCW@+FqN@Kq#@e%|CbfY+ zCuN0v2^R%I)_oK5E%;jhDwJbFo<#|L#s!>q_T*&vd%2? z$Kbl!zkgc3k%4`g1GrXr&jv3JUteU=TQS+Ji=9&Pwto`0N<0!lQa5goytXzud66BT zQs3f8M`s_#vci1DwTN0GzqF`vtzzPn;SzJv?j-!b^j6w2TIEh|Rh{3dju%<2DRp2- zA21=X-g+_9)T|+~SM5xS7KTLO$RCVO%#bn&4@0UIaN4I~wyQUi%%D{@9PS#q3!S>vzVcL6Jeeu2D6{_Vap}fXW z77ecS!RypXh*Ui1M#d#^LfctfE*D^hjWSndij%x_bTFf*oNDMW$$? z9Vq{PT!u}xo|L<#PlXB6`zaPpweBPQ^WQ*5W(2oT!U(QZCEgzaiNBqauX!IABuL*7 z=~W`VXs9@HW}rgG8I3>AW}0pKGX_5t)UOSy+ffFA&(+j8;Cle$jPZT8^p)p(9K|BO z7oa4+cb4xLD8ctZretR=KmJ6eKD*`nBXJZnjv~YJq%S9^vi`CPj zVdeGHP_z0=vDb^Dn{rT~dAB*TTI*cAWg73|d(8?eB;%qEBWh+tlAUkT-x zhj;0&be{F*#1yS;WSFroyG2pmZ&deb>e8la93Tk|~)GBAeG>I*8=nGiS}D`%Bo$*WRGoKchCXxm&Z| zbaannX(-<(w+c(-d4ez3{aQgfCHbWH$urG_v+4n&FP2z-)O z^>=wVI|KfMyl27t7uTUfN$T>V*7lqZ^3M+KrnMQTs?eI>l1qpR`Z=JX^qE>0^y(OW z#k$s`x)*AmNy=RmP4nApC>n+?O!F1NP;`}v$61NF`DyZ#x%l~Qk=j9|8jO^ac|a26 zg$3pU*U&%{w=uM%p!O0}u`7kY5qbXhp%WW_=fY?Kf8!|{f2aHo9_~TJ#-B?G%N!=) zwDYAxwy#N674x^VC_g^LMDb^)9ib?`!r>UH`30mB-tgzLr22}~fmu@jQI#cV)B)b1dCjYvSXiVX!S#d8qzsG9kan(5*N@TZlv*w z$vo#4h8OFK_ZQV2q`LLu$%{<2gpLK2i;}ox0CiaM-=@2MfhrpioO$cg~&` zmksB^_d583>6*3n85EhfFJBPW}$jl;J~bh-K3*+r-h6RNF();y$n zZaRAJDD|PppG?vPUT9|xaG@6(^Js8g?SFkizLkNISa&;Gc%K_A@i2@n_Fn+3i<>lO z6imf#c|Zcq4tLI_zZ4G(3%$};h*M(ysEGd&qLYA5$$-Z>Na&`E_&en=5~@?BI^^v& z@e6#@M2yUg<$KLYa>g>ClcG(@uKq0saX+#$W4VYD#`2bc)6Q;G_Sch}%<3>V;rU7= zPZ7yS4iZUcqN$cVE>p5U(`?hLF*ZR^*8 z=^`;z8PAJ0_XBnw; zMC!&Ysqq1+y9Jzf&Zn~f(a3@xWTZ|Psk;x%d8yCtlU%|nnL(T>h%10VLkoVTpZt{U zIhC_hvRlU$cqglRuBz5hwTle@w<+0sjP>D^tQH!1wOk;S{ve?&osxZvUkfH4|6=5^ zuG*`p?nSEmBz0-YhtgJ{!Hry+SYI!WfS#dfVjTrK|6tT%8XT%&EgiXCz`U>`#D%Y!144rK%^p5?=P8>JtV^o9nS~9 z4z8>Ho8Z&6MmK6e)3CSk&a%BC=-x zE=|rj+tI$9Shwy)ulEG|j9__h*0Sq1D$T>^*wp4ST!{KqI3@e3JWAod-}QJ3{{Ylt zM({Z$jNm9$N;@+YY|K(_Ge5ouQ!*o+7U@Hcw6o_u`6=1CG~1M5P`3(dYlG@`Ac5}z zdA@%JW#juL#kP6ApHO^W$oIhy!CMkV7~gwQg6}!1ly(|H;xAUNv0J`x7e~|gGm$+Z zFB0^ZF$~GpU(O^V6zOorFovS_myfXvzdTEF1tmxxEa0@WEtUOokjw>3*7%=`)HVUB zWAda&^*CjS_I$*`3P%mq&|K=v?&mmuZY$ph{y@so2Uj+v96G zp-mT_P>Z=g$;y1$hpMl+YPfTGao9>wjpGO>PLi#U3YJrfxrD#Ih zK&SFAL%1d+pA!0bSHNj!KPvlg4lfnbBceSU+K_riAy}aL{!D(1RHtI+oIVD9MA1ks zyBl;{WJ$e72~w{MIPH8vXz!n9q{1~G6Wnh_YWsjxU7plxJe3*vgkl44C^hi0^3Fd; z@YcE!fp^|3Fz`D-;(u`z&FI#^9~bF+_pw$kk$ncO+?sA?t=#pM!d4F7nxeJxKfeNP zb(Z9}lxXETO$^h{yI8NEgk-US|4yU^2c)du1f+haIOjlwyb{xuKtuO4UzSWaeyogk z>AT@KiR4pA$yzx*AbGzkrJZvX@05qFRE^wAk|yA%MEd!?a|WNeL-MHW?-p3^GlIDt z7?&)zP`G^SJPZM4`q;dia;xb9{$q`*J|}?6+y9HgFh&@P?O$HrCHl=e^@4-z!->(Q z-SG2@u$33{qgMvB`~)8a(SCIyAK5c6tikhDdBK2gI}XfP>`{1pzVn)ma%~9{ica5O z$hzm9g?(|6P+kVgF0G5K#l{#gHxET)tT*0PGGJbYabgKD z8E2KLBS4nhqg$;Z^v|kzkyVWRlE^jeE~Dvk)?IGVWG{3I$jO&7V!B7MeEjEh|h*BpPNt?-TK!8=DXcg_V2g!WFdcl6XjEl zzsL=FQvarZ+G#VtQ-FX-blMEoaUVsqGCQ651t|Edk*CS!v4GxHszF?-{ys?bWRx71 z-e_ITgz|-m{&mk>hd%IjbKgOCHi!;E%mV_?Qi+)`@k?;xzne=d{O~hwf|=x{%<)eR zA)x{s>xE;ca1;x*n@g8K_;)Je+lCO#ueSLk&@>sZ`oDon?&@|fat}yNu-Oh$!k1C^tD=KS$Ag8**102#`mgvs8#LS?w^36 zwB3XRyvGBcyzKrX9P6sP@o5O@FSH^M|34UUvm#_4ZxM=&P&@?+MAX9E5T~`gh30#a z$j?fg)~lLIAp<2j*GZ#hCAV1mX>DL5*6}K4fbuj$d5860Ip*l$ufQH+@%Zl9!BG~DjYOv^tSm6?@9DPbkot5Vw8L6i2M9V#oydC4H!A1l(;B0b7T zJO92Zn>orj(`dWt(-_=SP}K(2)d|Dkk$I+HBxX0JpALiIFh+QQViD7$egR`Cv|&sS zr3BMg1;Oy;ng;wuImT|8?k{$3-_7JDf0&gQEw(PT4A)rDrCyZ}&vmJ9un>QnEZwz~ zpnH#M@V!ki_~#hiLO*7b+FL|-foK>AoO`qAhjU?r7$}JEcQv-$TlDi@=*L2#1?Rl$ ziDe;1R{MSGRgkYUhiPaA3(X%5O*g{k>#M0J%?b-Q`5B!c&pGP0VAA|Tx=@3M3h9}K zv}>=PdaLznlMzVhV<#Y%j5DtI2c`04ka)OeAh~nQ@O@i4;(F&zXGLYMVI*x0?{Q;g^Xt1 zWc%`h{KV%%NX%8>uGS(ZiEBj>!}=$CVTpJP{XH60wDb+APnc<8J0KN*8e0Owl-e4srP#X_;~O zsKV5AWW0dW&QN)z7X=(RWPpy5}oE6_agH&E=Q-$~KDsk4e zbAHZ1l%Sd9fe?C-m7|lLPF)#aSNceqG zoauU7O6a;J&~<-}Op^wM!YG#g6(YKQK(rrn4+5(_ugm$PyXcteU=P4+_ez;26z}a& z(DYdNZM6KX!r3&tNCYhCaQ;2?@)Ep8Xl^z%U55!ob~H{ZSVn$sPN5!tRfJ`Ru#5r= zHR_N;P~$Y}W}IXZCV)P%KP#?}F_mj`y_Qvru5gZV2mrtkn*~u?ggKX{(zFWG^gCqW@NJ64`Ef^m!UPpD#gFvz)Hf_#i^}d3dY6`)Dh%og zL0x4~-O6c=x_8eK5 znXSiF#(9J)hTkAx6=b8~k4&`*W%Q!mO)h6J%_=h6(=|;C&Gt5|E0D{9jp8k|4@3Ey zP=3FyZs*N*W1{;eAe=wVE->4TGKX-mD3s1YNJY}wJ*#OW)h<%Eid3n{oh$HmL)u{1 zzVybdFrlxOadwAN2lo{AwTsJ<*fL?NH>RB$IZE}T==sc{h=0+ZNz5SM66DTZX?EGQ zFk}g5x7sniN}!M8%Y|>Vqgo%ev-eDjzWi4Pp=^ADcd&l6oW6jih1pf-H3bH#JNiFZ zh9s0-?XP|`2GvmSfx)@sfSgHOd(9u=K9F!>57p*aQWn8 z?!Z@lCfq&&`HhU?LN1ri!47#34{e>Hl>}pzR zQh$sR-Yca_Y3FK?_=5%n0#aTum(w=Vn?(B4m^J9q*1Y%H4kpdM4C;G9y<$*Zdpr_( zpSecJ^wn66F@0(nxzL;rGuny+0+G?jM9XTA%f&_5U%Z|1EY7Fm@uR zZBc`BKN$Qn=w`zmA}sYzH%JAmCLbm8;oHUs7 zTIeObhlz4GTl2J@A4Et)vGauYcfNmDRC^26-WU~BDK49=qRuWVS%7wzFfh|R}FGTfuR()PtQ(}oUk)mp3=GXt_ z$h^P_`Rhl4qSRGiq_5z8jHH%blig6*2TO5z`$y+)ZI$qjt>XP*9D%y}Zjj5XXsmK@kXl_8d0f zkRlX534>E8n(*somy=PN3IB-DE(OeajuQT>BqVbQ10!{aNKG?R&P>{pO&I9Z31i-% z4i(giKy{G^0@pdhK^GqjVv%vW9SH>Z0{q&w)=KI5M2%9k!b?>*xKZ*6}sY%5 z80bSuG5%ICMla-NppDO3OMOtDlLgfC=()MhWTSMwFm7kuIzIt{F%&(*rbcn3XM#4! z(Sq!#=!Ui>4RpptJ{YoB_3TXj;t%E$Nj+)Y6b4fn=M$uni(TH3ot-Rd*FX(vKc1F& zEHSk;7Gq=OImKa>BK?e-?2+Ke9sf#7le3nwNS2b^G%Wp-JI(N=Sc%`Eci6D*M}$;LCZb`I7o{(Owx*!<}_OG-B4$ ztBAvyf_f6D?l}Ajb4eV}vD-k7^|4D!9M2OPqC&^>@zudK`MqNb1Z)5?mvu}O*(xkA)V)p zd8Zx>{w5_S%`lj$nr&Ez`niZIrnlI_<`Ie(>@42;^#m5)@?30jC;WE#ScY@yC0WmO zzan|>Uwm&QS!e@Iuu?OK z%0O%GrmtL3-jx1rDKfgaErlO0Q#v(EZ(v|bs|CXROQFJ3%1suTk`aATM9(&&xS6;8 zU+gQeATG_FlxL7H3GzrFOC)JqKM`e#hj~pb=yL=_z2;%+E)Vr$*j^L1ugW3T#mo0) zGzrB#ix9!Q{0(y0v_16l(L%d*49ZC#q7~sR4=qv{I0zqmyy+hB*1D zIPo0!G8rSI6Cvpxmlg8cE~ujns#|A^B@dZ`Y|N5}K|kwwGtO~Eh~^8?KP-HRTo%lM z_WOxM6`6QNiJ$5r{zE@?I1hEr{*EK_EkPtiwAPFT!h0`x!xsbY2dtaE8!(^n{zhxR zWDu~|w4--3E@hmDXaM8!Rsq7rAna@`QBTHc1t=>>k?;N53IX;9-*-q)vsEwZ8om<^ zUo3SNVtZ{RP_B2_Zg=w2x+Yoaw(MVCxJKL9x*=KF&~hL*^I0LyUTu7AU6PEtE&G-? z_YM~W8e6|kZqv|mahbu_lSO)qEE2Em2+2WqGyC?387SVf3x>ZYw{2)SpnrLh6A;O} zrJgPoa#QJUo@kY(>+P1|2V#3=$++7x{7`&kS+ZY(Tw6L?J=+EqKI(ILt;7=T4V)01 zs7AVrBLBDrX#Q)CtG%5=`3@3RBzfatqnj_~I_-QoOLhBXoKr7G13Ub9-1Iou+>NVt zZrivjL!$n^{PYyk5K_;my(`QVq$T4VkrWX28sg%F348 ze{SmZ{uSfhmanQ^Z!=6hDVB9;KvA_wJhMV!_9*Iw6P=v^js+ao!f`?;-oo@(1_9aA z88liJR8N{8(8>Nycpo*SCRQ}0F049beEj72DRB`WJfyAB+uV>ES=pFAZZW@$8$6$% z6^-eUl`i>XC_v)7g!ieNK6G9~`lJ;Z=PF3Gw#DY0fKbnkDObvWuD3lAe1ZkG$!_b) zq~m(?62mHzm#IN+OM8Wc{Y`@k-p3nfJ!W;vDr0j_28k+6bGBs&-LU`LZu{n*4XIx5blhaz zag&)=!F|`;PBkuV@IFq|Y)Ce^UQgGnfQ8tc+o@5)#yJISyn9K=#*4sZ*=RBrYCdj$ z(WNg<)5>JEy{*O>_IC#YYrR46>4Y9EPo(RRRQlxp19@NbLKA4~-2Y}W+UIq8|0dVF zh%`sbg284}Sk!zhbd`1bXb0$&+rQBohVIv0P*yfK!+)KE+EzJ?Rai;8Oai;6RuOo6 z4*ZU+bu8zlH5uNG>Z>e;$X-9iULU2Y0gTzJ#-2*e+Nwg!jpHdcx!!lKx7zg{nXTh==f84jS0 zeh&)Q+vIIC`}@Tpni)x-_IBqM?ceuE?{XsRlRVA1)x#!K&)AZ6CQ1uy`$Ij`yeIoJ zR274x6Gv+TDI`pG2qjDL3J;_wj5A9tu#euGGQq_!UyXBrjb_^t+P406wI+ef z&^$f?p3a!;^4>Ij&1iB{_4+q~f0JGF<}NvYD&n1KtNgyav&*}AO0sj)Q_b#11Z%LY zOR+5u0*lh6*-cO`Y5|-NlnXtyXq-R*7fv<-Xe}>3m-vNdAk~Yxn?*HnKKKT9e2+Ef zQI^<`T38)7`842wBpex0#yOe3KwiU4VKFHRg1U_JTW$vKFL@fmTfs<6OM1SCvCXW; z1=Z>C)^7TW3O7^kddF{aQ(Mh*Gi`3oo74ZUBSU%1zXgfMGoz|8sqA2h-{8rKgX5Xw zx!uJi5Tz^0#LvW+mheA5bf8VHcU5JBw=UsbR+aF+cfC`=)RA%O;TWT@3#|SiN_Cih z6=we%a#k5<(0Qix-b30tzD0&D*Y+!GKE37I>XFT-D8IM6d)DYmw`O7U_Kk9?#C?nm z@Axkw(vDWiymdqKAgP%JCmc1v4K;1eJG<$Vs;D5)n*r@S3ZL9sI5f4Q!4NmYdU)&ZF06B()n`! zP%6IRQ_JenDJr2I5cIkX%<5kWz0KTE;nqao221lch<(UPty`)4c>l>{c+wAYbaVF8 zDr2;PFcfcD)!>b&L>9f0Tjwh*MdQHDr*nWPi>B`TpcmrbE3wAPgg3S#zM;Ju2`-TY z8>%SvNN#~`G-N*G|FFwS{#7!HO6#OHjMGJHB73R9-s7I!r(QrU zSqYz+6$PY<3NIN)xR${gXUJLNbCYz_PhN5GkTro8vfeL4o7-drEI5j>oi@`3+$n}2 zk2>Bw>WNqkb={(>5|QM?P>7SaET%%LaiLGBPI%{6kaTSHHr1uh?mw3J37^p5wOX85 z6PZolN$v_`$t}hGrjFfVJLCNHr^avxX_m6aVUJYs)4YuWai`XtMeN2ixJ4JWd$Q}$ zB_?bK{n&~`jdQ(FAIilH9w*uH?bOZC(&$qE)uFPSX57O=B#;^7|C;RA(DHH>*Ja5q zJFi_-*MF?8T@lnd=Hl-R*JGI3kR0b`a1$RidZUmOsm3pIvQ6%%Rg5kp)0*T-=42c5 zhkSJswre`#dZ!@Sw{g2I)BBGtYd%@5oQYrJF2nw^c;-*4id+PnJt9nl-Jy7!aT1b_ z?%Bs3c4<}f9)0L%e%zp z^g-0wQ7G5MU}RT3>OHs?RY(%{_FZyY1ZE{OXSXgrrM$j16SIKQ|JlY&2F=c-Y40?t zX_0rxyEL@?x16Zu4AM~g4s6=lnS@^$v1FXr0qjf|j_08iqDSKgxh(@tNn=sRVw42d zs|>621ev6Q5&s&Y=;QY@>dDKq%FRb7%qZPpMw!pMcOSEK7p?@s1TJOlk7=U|MMCZg z4Jo}*IFM+vNL%W!*`cJtTW?dYME|j5*;-e|TDO)qyvXk-@q=x}=KM!8Q7|@SO=?FQ z1$Sc-7n}1A_Z7I0)k8+hcm03;AmJwm*kFP^Yv^sq`u9m1@$? z?W6)tZV&Pxpn8*#d(k%xSs&G$u^)dmqxl1qXdFY`6n->;Njv4#$Nyz3ca9BvdD?lA zEJ?<>J@@2rmoS&H!1d0rb~E)@T|o}XO&#H;_V0|ksaPk@L(BB3iXcYFc4Iti63^PQ zptc~=3k=EZCk*vw+dzpL9QQy{j) zINh41u{kfAh9m!=)$F3;Y)kKL?}OMK?dBTpnAiGl;J!DEte(}pjoIVffj!>1A2m0O z4sO$PW{0=glYs(Hs!Y_3uZ*>hGW1gTm@2oXT~oMC8RGGl%{cUZdFUO-w4uGu8&e(k z+T-nh5B`t0tnJPJbu}bEWLqx}M#1S31W47%=!W)MZ>dz-bD1K#<6MjHqWrCOV|6Rs zo`2Tu@opRgXzo)Nd!bM4g&v*#DE3hC#XhkYdvr$Xygpu!x|+qY)`!8}(DHqGY|fKh zHO8Kq=MNaK9#n@~+wb0~pU$OY}0FBx|;nh|SS)!rumOXW^rLD>xR+&7+&9sYtL(Ssp-{Q)4GKA=ER^aXCVbo~& zTes%V7(~YpP%))+tQS8of4Wnw<2=c(p-z++mFK=aMsX zGxLJBteD=}$$&aPn@8(QX}h-I;xFQ81^QE4t= z0A_?{uHc8tgWSxUZp%Uh_D$^OlbHbJOgEQ*Do8dMh0c$Q2Uuom6L3$>TiDb2_`&9$ zL)wt}h>HAB6l;BiS!2iG10`JLdn?0yujX)cv-kuK8&8c~Yol?zi6k!x;gPFsf)bxh zc6XJVI)AbpVe0$|jN1G(HKdPQ3s6PISx+x_hg~=!*1Adx!o!c1l?>EqTg_YX?AtLn z5xa42;d62_Auw>3Q;J%aMg_y+olJF7z}vc+9>T?K-LYr%y%aOYpKC;DNNt_)fVjHC z#d6#f22clFY6NAA$wpKv)y_bv5VpaqB{{kHM-ye;jS#5sB;%kVb)c*N59(&TvDS87 zo!~a&C|wrGIXQ+tO)8YpJ(Fy1kWaGlF5#WP!>gLeW{~(hVL~DmZ%U*ZCbQ*3ZQ0M- zGJ>`&{eNmp(P-Drd^K1AsOI>Bgt@;TPEw%8G<6-0G45p&HSNuVa@yu7mUS7M~)MJ%NI+6(DE>b%k-{S=&f4p8~!zm!+<=6^QdW2*CAM+V)}p;CX~R(#|2*?t_G^K1DPNK8(6XH~>E2D{k-u1y}?So8PfUN#qI zZE?joAxQ4RKpLCFQZi(s2SB9J`zMpjSnIFM97h&(lw^cSqgL78vy=gT92A`usjQL#BkfXm!4JEfTRHmM=q1lo!cw*oZbjlmQ@iRXP0i9Fg5Zrc9@nH){UlrBA5 zBDl-gie4vztQj=AH66*LG*`+w<~=sHW~GsIl*eRl{>sTBq={hiXN+}+jlgUF!Q|##H?EwmB%OGUV8tepuJ-}* z>%4#XXMUr6)C?aXMZ?_b{$G<2#g&J%ujvfMY9;w)pQxZV$)muT6P!2P)s zm}l+B#a^f^Nd%8f$8t|=tCpk4FR#{lpLZVE;Qg21j@RIkeV70Oqz6v?RV;*iuZ*Q~ zrgsB9Op|+pzS{#kSjqzvUpuvAeV>qB=R60bK@&nd-4!kZ?Z@Uk!E?;(d+M2y;(%Z0 zu@-EtRrwS96hzFq25{KV@-c*JZ~(sz-WCna?ii;E){5)N${cGGz%2z>QJ+zfw`c*lXDg5p1* z2%VeH4(UvVnNC8bXb&!$$#O(*hXfEKvJfW-0_LOBxPUjCMh*z4kr)0%=%fG9PcV&q znWSLGIa`&s%grF0?dBLED4eHdldHk-*s{RQCE3oLc!p(e6dyCjUlit7ZK-ImB0lD1 zHIZM@m| zWnh?lZf2%5wJOU#2;*}WlO0R;w!Cxac`V1DW$)xGV6V+MZzUue^Ts0^ETf#Tbn*(D z9;4aRWK5%{|JrAPyCDHs=x(~GlQ6K>4dz(zTi`ee8;UYowWla}7%DN1<)t8+KqvT8 zqjVFC^$F#`>sdVghxdb4xwq5E_IRUs)ySrv?W5RFF4o2$@|=7>jE8s)J!Gi(#z3uE zJ0-lg>a<$NUX<*B`>pjI7QLvNP<~wAzDfK}(0I+1Hn7s{+)d*E!BMyCl?xdahAJW| z{;x0}piKkc7i^};?urjuO!r}1(toTvx&33c@mB`} zKiB0?U94_xqURT#y%OGeoEPPNV{^jidD76bh{?<>uILTBDS!GkcM93@hc zpIih4$@EI8_tHfAP`37Lh~4;0?t1UGf7zquv)&uXBy2;*Ah|^%eca&AE&1z;;&E=x z$^8d6@64iuKJXWN=Iuo6nYMNB^7WV}Uz-to)EZIg7{Ou9+ z?K$7A8C@A`Sz`jKTf|5MA{i}G&8=ZxK?uj-{(^v7W>%HO=KPLJ@FgeF6|Z8sTqAq( zL{^$w+otXA_FP4it>IeBDZ=KmMahe9CmCxXI+6>ly_?KN#`%Q-NqX!@=oZiXA8Xz+ zHE#^fTc+XvasmNN^$P16xfR+5v$az8id%8N?1Z#N@Bpw)tg+=~6TRZkUcg6U& z7FTI!5{d0xm2Ih_?3RR$2f|CZQfzI3YUZDNTNGjF-w#g&zuEFv1?7V78t!+}^mI$L zqozI9DtFk(5;+?piuAOHEMbc{P3Y_~q|IBradm@|we^e1f@KD@z;XlH;aXa{4O>jGOz`>%z)Vj?z{|~YGek?qUP90jp1Llf%5nXT+4~O-kEeei;QMAxv5e5H-UdYGJ7Tb z=(;JYwkR;kt+{FuLq?Tz6h<4tAdP`V$+b#ba=924pyTb8_LV&kLJZj;mVHm%%j(7v zg0`tflzxbKtdZI$Rj__yi9OmrFc<#@`$M(Ej@5b0jGo0B7}meqpYe&UJE9$SNSX8F z_A-CrKM^QBS<`OT5u@2Wqm5X>h8KU&j}?mMR@e(;G$b7kjbZyEgQQEn3q3aBoyz75 zauD(AdT*Zl?xsY|s(9>yw#2YgtNEQ*-#U+oOBuX))v>95s~XZHnbO58!>00GCq%^% zv|D&10TR#o3$D|zw5Y)3vt@xWmBwSNsI9Q+S57j4)fNu5o7wI294ia>CzJF#43j9W zV3^d%NnUDvRTvb!Zg3iJl2b6!ik6oilX$21LAO_fsT0#3UCrW8b#f55?&21PJ%twF z+X7E^O`LmSoSQW#0`ZdhSinTl_8$;^QY(Cz&j%oZhea8u&N#v`pM-@Wrsu@1sTQxi z4_e^fgIb66KI!}=BB*79h5Bn;=AiZt8?4}P^sD41^f*S`C~@j0Dm;P zK{k~dIaHi6X*SM`1q*5>1~Y+xe!KF*?E5H4a#w1{Z^KZSX-JI)M`^}28B=G8H z^@`J}(D@dUXC+-Nhv<*AJRpcX#|H8o8_3g(+%w$Th3(zSRdMqekCg?FGz&&1SI_>< zLYQp(S7&a2und^Mo%YT0Y}U;Xn`%+`6cDbabaz-PbhKt6R4B550{I+_U;6qeVZoWD zgs&lWo1y)&Cc8Dxt5irLp8`wm)%+S(Sfiekb`mU&m=*p2V3zB^)f*q#_JwQTrs9L$ zVY45Ed~y%}KcsZn1YeQmoz<;uL$h7`NMkwd)8@a~xU9*)+Oun}J(39RF~R%~?fI&v zOM9xVJr~M4(?MQYy-FXg`=8olgaVT-XwRUo?a8SsbX6C?ffO0IrM!NU#~|)TvB!3V z0&!Q{0KHrWly-(I?Jf3h1~AVaDkX+v5KGD5BL@BaFP0pbNlrgjBWMqsPv4YW3;bBh z)>-px=WI*^Pms?FH#w|UOxr-8U&21A)P+q&u>h<1)!8T2rBAHusSe$|Aby~ZxkEj{ zlNLXz&0?!9eS(J%IA8!Mt}{0KWNhh^3E3x1jf(3`&OTx5T+tIR+kyJIso&Xk$@8p1 z>bYH)JkM%M&+WSS`889NUphu%!C>!S!!DdQv)c7y;->gbrwsX~MHMwur%hjrz^3p% z*^#moY9Tgafz$gBrH_TFh=R9hvic_#l#|>MHeGS7he@ASZ8)mRX;XSyW zQ@^eE;huN_GuZWx7bnn`1t^ILn_F}GNIdg_LTc>-$y&hHuJ?X;d)wf)slVX%4>I9U z_XW5A8r(L;7uJL=!R-eEXw!GW?HhyJrfe2Z0tTC#T`#BQ{M||1 z&FVIPx4{&ppq}_3(A|DRHVm6OZRTFt^>JoMQ_9gx0qrIJ-aDaI{xKcBfHe~UuNhjXu3&vu`l8boyzj!~aFy*9>ZtR^63$Gi zh_`$ei?@8qZW*mhan&O>=icC|Jb6;Q<@;Vq?K*vK7*x_uvxvzr{qu0m0y{lTc>B>H-Yc2N){Cd<@Ax zn>gimF`$8PXP5k4MTz{p*)kl=zCUTM??{Rr)vNhhW`*$i_RAPI0sLEsNj|F(Lb67F zn&9`Qu$630Em`~Uq8}e&QoYOCJG$0d`57ok3f7Rfwv6No@*Td$o9v_qbz~(CmHFrIT3l$H5Y*rw;EBCE#~z89FC$b~g>{^O+zYv@0b zDzO`0tF3vftjky=@shYiz9XkB8aYieaTm4B;zzZ@q0lh8soU??txS)=t|>oOTrQS> zc5k}t4cdIHUM$^=aqI)fw%|W}K#dktzvKJilBg*lHpc^DUFumWjUJa8Igszm(j6w^ z$3`~E-S)HziS}CZ;aQ7B71nEId1@_1GGrr}xL-&h$TS-}1D-kIaTD;8sgctN&t{2b zNg<5e!hkK+@}NDi!IX3N%_x|@BgK8%Ic}`L>4o1PV)nT-XG)OjQrieY;`ezI`LrXs{lp-(gIo-^e-+%`ORrHjX~M~hhI8r=y&}ugS;14B$b33* ziC56r@T2O;%iQcG48=CT)RR_oj$4*b%N_`cb^Krlh-FRBlC(=d!_6 z!mg6!%~hXE#GstPdj;9Bqb(Sa`$r)biVDnGI?s0;FYiwcy)wL6f+P)gLl&eg&A~Kh5==7kp4`pxt*PV+wek& zb{@8~nA0}>+s=b+yWSkCiO1aLzire)Hvc)(;G=NQT=QE^7- zTH0g*ekxn4Z2j_@CU?=uCgXO|$O+-^Wc_kphZ*lWSl8kx&53@NfW$Dj3is>{zw`L= zvW^sx$nBm(WQU6xxR?NZB;}H!OGPdRM5`@I!K9)OQ@e8_X!?p%&egC=-KJ8{KTs%) z^oig_&j;zo@XHX1G6MC(kI;?M%o6^0U$=09USr9MS{aqaphY`MPtj zjMG7hO}gJfMsp5lH9Oj2>~dH8T^Crp<&vj15s4u)#D#lBX4f=nZI^XPB+2@&#fHVf zv^Ex1c43U#wLh}hi+1SYfx?Q^8^l}nL)O%#Pb7$59rxzfx2~L4)p*v@#-2+?)zmGi zm|3BWAzo5XX6_&N=Ee7)f6xB&-rW>usq8GaKQF1PsasYtgRRWGG(WSdE-EO!I+kKl9y^od8OF*-OxEXpXi(f+CA%7`G4fe-&bcNuzDn=3 zE%qm|>(X0?#4GB&w)n&DC1GBj}~CTmSluDp)dN7IovFb#qgmsOgK^Rq#+E?<_uyP4Znx=e-TwVp}TvC>v<}KkD_oSAOJ6WxXW7KLp~6&9NC)DzX%~MUhweTMOi($kSZGe_3h@@o$wy z_}-xVxmo8e)EjQ^_?4JT;;eNwZ_eP1gN3MiSaMMXZ|{0r@!{EB$iVN5NUj%IMtIcF zIm3%IfuP23J}^DG78LGT@4M}v^~yMZJ3vsIq|6DaK{Wt*gAV2|{^$_>ob`S~%?C60 z*8aKnPkXsN-^uQuj#b9jxtXPIx?x>x8(uD{`QX~G8hdWYyqOxbp5qlpq>>vej!o^d zk?;oJv9LBcOhqepY`EOPJeE<7VnTJPX%}(c333S>21ZHlScZ?=7^u)f(_|Q*;~wD!CrMnrO)7#QE9%dx8x>;ENvtZ5&_h7k!o_i*}*{AmSp?*gvz+b z{_!<4cg*e|*Wng5xxM4>P5%}EZ69yX?qBz8JZ#_%kACW0-zI9Jlc5Y)?2dVz5u5MK z6$yr5w`V(qxAf+5euI%^XMJv`H-iz{1@%}apW<+4gP2GRD@*<*+#nCfVqo6Vk|L1G)+vp$)F=FW=I{A{R}E&+V^|rJsh={Jz%MoL^B^`mN5h z!#r?oFQs7YXmX7-8F=@8xv2v+=K8 zCN<80pb70+&|oDwS7KW-FBkL>Z(2B1eI)S=k&?6U_|bHgDC~=JX;2Hc|l|M<|S*^$_SlS&Kw;W z43R`-^7!0)8}o>s24O6P`pU&m+4l{2>8MT4hf>DrR)Y`_6Fu3+6?NZ zc0<0^Y7n>l*V)5BCp|*zvlFxtvDW3SMYhMjHc))j$pN|ys*yMMwx-KsuI4>!xJ0>A zg7+7^F+^ckHt|X`ljhM}t6FL_H-t1by4w-1y8x^^H=E6Y8_SZ6<@8F%OKz9udX4o7 zl72VhOa+U%hO;D|Dx6ir_Z!r+7@`z$Fc5IFWc|Lo z24xLCOgM>Na8!ghdzNg9%~#%LgnNkSoQ&((X)ogA;|P2omu;|*JuWDwOXu@I9FqDq zozCYy0;X6-l>Ja3iR1N3t6Ik~4ft&SjjB?ir}YP} zQzN){{cZ55^c3Gi(ZL9*TXchwec=t7PnBoJGZ2m$O4u``Ex1K53Sq_*ms!4g^iZ{p zbk>RBI2J0F$OnCKY8*$NYg$fAd3mYnB!e380D3<*Kr*`64l>TGCI(&?J-Pp2{~3Bs zAb)KDd(Xc%%$y;z?XvUn>;yGTr-h=;(a+A0SBvtjS8Nigcr@A}ZYY}^AEZCKB*Fbh9T>Wt-Q+wm@L;(H8TJO*WeSIE{?ZjM{`8Vo_ z4x6|&Uzu@!2{m`v+6AL^L^i^B)0%jjmA*Ze-aNU9f8F-z?m7UT z{>OYRFO(pZU<|NKKscV$AF9T&pH)sD$8#U=ow7Z_`;xbP*b~ggwB`YHIsf5uwQ7~M z@CjO&9%-6I{Ys`!I%EFA*`bKv3VNw?8p5$DQ8znsf3>@?tpl5|M>kp#C4N(Fjt*zd z8!UY&u+IUxckUbJc)y_wY91NRDn=pR;E1C&=C@*Xn=FcqFT7sNXu$Z9O~%3g6=OVS zYIgCX_I9s$Ogl#n7w51#kuqJvM5)fuSZre_*PD$!B^%oj(^??&*>cFrjB`27BJpO1 z6x5O3Xi+j)66#3VMmOhYyNObGuUN>^+`bQg^tYl00u#|afW`k^GV)=Cl; zzoQU6I)G*yshf9&6p8wG{Ht~B0gjFnqq-a+afQIs&OuoQH>g%yfnVZWF2g88OsWIj zXQnfZtCx|hdQr{1WWudklpL+0G~BQ=W5-+utu`4A4vq2;)+VSO5ixm0kfH;!he3w- z7Ax~=4SksR#!M5Da+nENv54inT_~cG;#btkKV>(E4-PfZsQ2bhr=k z84n5x-XF+2*D+(wV<%GQ6?^Q~4bwPJXbE{%d;f|2!XjQfHATI<~vtVP7G_B zpqylMZ<9#gW8tmvT723YhMVwMcrMJPBx?A77_xCz_R0W_N5naigoB=Xh4P{`k#9(Y z=#j-E}0RrEA&tio6*RdczbJ{|ur*E+b8?CFR=k>TFQChUy- zfsSdMf+)10Fii=wS~=8ee}MU9i77}kbkB36OCE!XpA*b1%IH=oWd z#g!}=-2QBLj^&Q^%G{ly+^H^tAtQ6#z@j_&sN)6~-C?tF7-Z%4`{&pT@}=SW#cFbt z;tVF({Bccb{1>pNC*<*qHf02C>PfNlaMQ65^Cd4j-;v6(%o&g7CO%xe)usYA|<=e*atlls#&wb}g`_f&D9-Ye>fWz%=JVc@PE zWz38R`nVuEtF}VB>Ji5M-uiBC-^Q_27rEjMVn%Op%S(oq1a<7@Z^5q|FP6k0tYDAs znN9R&9M7Lwd1RIx|w0U`$t$sE~lm{LnK6W&}yjVfQ_8I3w)yI!v za4`P<_IMKfZo!sVZIE_7Hbk>KI+41|B;^jL)ib~ z(`48!ub)Pq=x1W#>Oo!Miw6f*%zj?XkgV#I{ll#4Vz~~dUF}8reG6b& z9G_+r$6W2u1(<&leM0}ue9sO02*da}f5I@qzMrV3ozHE72fuhEWrB(u9|<0NEF1Iq zBYTX6?HoQ<-dTZE+F6}_RA!H+T?*0&YqvbQ#WFb5`rCFwI_+e=#L5_5O=W76#*D6^ z_RHmr*}NA3kWBf&E|HpFc@pq#0QqA3=y|G2{mfiU++ww5s*7PAU6qs z0&)Y5+_YUf57r{k1-Ow#krlfJ*?;Z`$&c-4huVoo?MW#P*$~Dr_V zOoVg_Ti7Ww&aS8;EQE%TwFg@qjSLXFbadef&uF4| zvk`NLEcY#mKYM|=A%A$*yx0p{Rn6)cJZp2GD?iXlmrInmxUsH3??!Rq?!PLwyS*tf zIMK6xMC^rrJ!gG?U~`mr;yAR@R@pmyr$?+fs?U{tf~h@zV;#7Wlu}lGc z19j}!P|nNxV}EPieQ3+VPPMO=@0H>lLQ_z>Pqwlnw>s*G86`@ko@=5{V?J?~1icmH zaw-3!Qfm+MxH?-RjKVVC>P>>(4i5`3{Q_V`Zy}k0>jqRCCbNPI? zeMx19?G@6(> zcBkdvJF2AiT>N9n^K2f0l=1o@OZ;y@GKUF@q~$k9%F1q9h5T!4Uo3AK{_d7kkF~zZ zqeYQ+3KYxyHh@s~82_CMRTW^u0$YZb1^sDv9znE<{Vy-80>>Y?9_v}r z?LijLyqk%%_9_p~Ceo{2f!}4k9IDiMb_>r-vTuJme{VytdB0nG(`GMHPyN=mYr|kO zbX=LmsmK95@F&ttlT3BX@R$3*bn_AZrL@f7QtdBC5-kHB;(i&;=nH`%D{F6h#~;Ae zhE+SSY5Ba|zYJ)0xjYmwFM5{`%2{GkXaEyi$J+*A+(woxj+4UV8 z<~-K3yzE+?HTMlINRPqokY~(2e5dNO9 zbU`h1ZhN;pZ_hSp6U-|?yq-?d9P#;%rN%tXv@sA3wPpm0IXiBJb@ZN#H`UV@VTKl# zy}$+ghOD^wRr`VkqVvKP5tKdHz@#?x?FAo2rM7e(IXj>s;GEaOVLToidfyqZgQ zD044tQ}239H5c_NS1-ulCr^2`vDvFSdy^Dgv@Ls+il^hJ{EXDsvS29gDO^XYCE{V9 z$(G{$kDEX`gcYeaWrv%Tx^vQcLR*KqEob*13I~aBp8_ANlvr2~1H_9P-d7gYMa%tD5=ENw?*kDyTHF zBd3QkRZpV5zB1z^D0yw}!MYwAT&EkWgL1XX_0?3vtFEnfhj2ZlzS14i?!KhCzuwh% z_o6T)Pl|xI9ZfuP6_2nK*WI{+;w>tod0tz@56h?+REF<>w=ZjEFW#T&>G^fl<%l)S zDSlYV3p~K5q@yz^cl;Nx%7` ze=FNY1J%NJ(9WmAa>v751pPnuLZqiW{*qVJ z)naw?Z;bqduIXQa8}w%Y7D}L>KP4#iL0;!@+4<#7pbaOL0j^oY=TfzdqqNUsr}vc? z_m6DminoIDUI4>>n>Y2^K=nzuOfkJz=5%K*R@ujWTZ z{Zeei%UjbhRaRxdp#H%uK812Qs>8 zwf_#H9kLR+^qsSYIOzuGY8+o6%B&nO6j(o}n z)A=m}t`am0Z_MAux#=hS*D3`+`zr+~-s;d(|2GhGFK^jf`&yjqFQDhaH^(2v=dRG` zJs$ijW}JHfcD?(3^}Y0+`c4*O1Ku#>$mZk)kIH(%^jdprKzUC{XHWZjfMaA+IVUV} zQLTaIcthQ~SP$`*EYY=!j2N+-@ws=4s*M$`H*)E>Y0&k88Vu%54Dn-$OKbVn`9+LE zCxVkmK%)%!w7#3JUl+RriSTZ*h<1e3YI#4EOU!R8L|>71d-|{2IDTLM72<350?CZy zdU7#QwVU2`nJZq0FW^VJ>wBvGxWI?ymGzaDnoln82*y~t1Cu=I!G>h&J`mKsyQJ>q zAE`SJ16KV?Wnk=+B$b??za;h$=cj5bp|>(Vd)+0;b1sU{{_gxs&S|LgmU-*gX2P4v z^?g^w9*WOiKl+?Ynp3^{*Y|xFJiWZl8nM{}u~qX#wb4%FB`ihc|7}gBSCLPtng#k!LsmoA9do%Kk1Bj9?&kW4~#i+ON)wM7a@fSzKP1 ziuB;Jvp4rPGqlVlnk%bIyFb*do4&W$hLJi?0Zgwf8?l!^?=yAF`o8VdT}YKhk)g05 zJ=Ue7hjAHu`HOzBmfM3H)!cXm&svt+b;sb@&Qq@fVwb5?L0`UtEo0Sg-xa}WNdz3# zd(J;{e)D)Q(s?;1vAAMU#|g26<6^M^Q)6XTNYOn$5TYvJa~hvxj?O`+iO)_ z&8lYdQ()@9_NcYZ(U$0gJgrUb`U`%fWDerCH6!|K<)qw>t08T}A~yrU5R#klWCkq7 zax()yvcC)MZzZf`27G4Mf3?4Vx4*vq{nGya)BbMY@ABo(md{_#wl5po*d9g{zf`Bx z;35l0U&S!>9&CRYZ~1%^yRYIK$~fre-Q;#0(ooTO*4SPfS0#GB%cjx9Uhg)XHUC(z zpAun}wt-`0#fG}_p0Q-#*bDr&tX-Grxi~QdGD{|QocbL;V!&R;P}CU0?-c)+pU-91 z7C#9}1Q9QuJ%`Q=QevdKmQ;A9>Njh!95~cmZ-`- zx(Yr<$7OMN*W&f;L-gvWc;i^+X>9V7Bp`)pFnt;lR%6JL*+Wr$+yB?z+rYPRT=$|w z5tLzxvSC}YAX~9ljvPS_MZ+>g}eF?^EY z7{k*HOAKFR_ydNmTyHPKjSLeEHFHM!c#7d?Xhw@)k&jRFvBs}*`HvZT`1~CVcQCxb z=VN@FXQ=DRzg@L6%J3w^KVbNm4F7@QD-1p47Vx``p`YP4hI<)i8GeA_7{emN-(&a{ zhTmlP1BMHCt9HB$-@x!bhPxQL)8 z`xvGf<{5sB;W36^VECsDXBfW1@R~iUy;~S|GJG4ucQbsN;l~&j8I~A+mEqSJ&M+L{ z@w({c&mSKtEpE9g4bUmipu^8UNu$$q#7^WCL&F~q9 z;|#yRu*~pV3}0q=O|NR_4u|xl?@BqW#U|3}M8HQ5~ry2eO!yhxe<`=j>3_BQh zGkla`jNwxZM;T5qoMQMQ!zx4fJ5>EE8Lns8&F~!zQw&EKeuCjihM!~j6^7Fcf531r z%fU8=9Sm<`xQOA!fTHIw8Ge~zk>N88^9)lA_cH8axRRlZ;XggX^)mc2!{-}GfeLodUH3}2$q7r$wSzsK+_!%r}LieZf5E{69pY-9Li)*mk)%gXWZ!aut5 z6i;bb_^vuGH9(F3J}%eC|5jM~R*P&u^lb%oeF!D$eyQO|IFXI_?d^|82O^pFK1OUT zPhlm3e!*Zmno0+Q>WGf}lBr?maXK0q>Wk`)M1K->J2AN*;q-o0QDZyK>tv4=X8ZnV zBAQF3MJ77XPdw1aI6X8NO=PWbe>R%7?zqDm9Li*^eNiiH4Te*xcw&E>l}Ki-oykO$ z`pOKv!gkS47MxCGvgvR|UR zB0Q+cmHcPPlQlN-(Q!R7(nbx^Q9lVG#IHYj*>)RHWjpFpMF}d167BT6O#4nW$f=YY z+2vkBY(r z!stWd{qoiom2D3o6aGCn& zyd;%O4GmC5tVPMRBK9)%%yEfr<^-x4ilU0Xfp8|{s8l%g#X zMN9kT>7475cn0om5F^MA<1+oMLzT)()*>|!rV!~e*VUocG)#8mimy}Hmv2XfXm)5L zFPW3BKstT^wqg@Pg__s93_VVK5*pjfQ5+b34@F^D(2hiOR5d4kjpxC1go)vS1L1V= zU_2YsZPUn81&!^#TKr%zHJl4(5U9e!WYa@^h$$Om#JSp;I2VHaEuMf^) zfvGL}HTG+c>+gP*?RC6L{5QQy{Ck3Rl77Ygxc61I)9J*QaT5I0cC5>%;dvK z`=eF_2YuOS#9C)%WAThNn2Zb!M6JGX!b&CvhABoLNQNUoKxCanS(Gw%Eh*HLN+HXr?brQLH1@peqrt5%FtOf7i%pKRkfgAwnIACam~iDw#%a+pS&Ebu{CN!{cUT zRTer=Q;^J1igAS4HxwVp#%rzg4QFErb<#ta6jJmX3~CHTYlA!rYQbtO1f3MIV&<`D zjcydSf~I+@_lVoG)<86zVQ$Fd!6Xi&xo}^0U|8sG-`>97@6Y(wTG{Xu(TsI_dnf)q z8L?8y47!$tMX>bL>-P4$GM0}{?vEdcCf3TPZl`PaqtkWJrNx~ zm`q3P8YIDrLc3kYf!OeT4%Pu4(WXz=4`~`AtyiLEtl2skgPcJ41_n?ICWisZaGtyg zv2)Lk9acJ;0ksy{x#UpRil);bHl6_PBXW)x+>FZ=o&D)3btxUE5C-&T*5GPP6DUH8 zKqAmhOhGf5`2K{Po}w0<8UXjux-@sH9!wI6(e^BoMa7=HDlE*il1a>G6T_N~P?(_v ziMZvnJC7ky%*REED99KjBC^m%IdpOW9B335;B#gljjh-d306I=)joJ?qalxQ1k(lR$ccd56erg#C z2H!Ij9=I}G>YJ96H5tpH;#&3K%CU?Ce{cI4Gz<5J(PH_kzfKaANG8@%T~s~j=AahK zf|t@RCvKW_#((1A<*uNLofibLHUWW9u6?d18ZIEZgOOyPY)sLY?1L+o<-|5Vq4{0I ztMQe}f`}^y`fKrqs#o_~_8SKc=l2gJ_k{O&UKLj3XtP?LuW?b~JNZi2*YOR<94>JLwXtuQNFtLC(*PZ@Zcp8ZijK_R2C&On2g8|GWHVBB56htT-xE-syXRx3?)?LF_hSs97@2oMiC=K5EsFF??yM3$%GNnR1=Z- zu{qE@3MSJ*b*VaS|3_h1`3+j_g&oaqklJ1=hd&8J%g9ln>$EIn>q*%1kus5n_hr|j zV>K5<7Q?Os?uKd^7=RhhSo`4PbT|dO4>o5u+^!=Cno3DS4RjUdMsv}=A<}6{GwkRZ zM6^+`f|@25tsJg0Ht$Bz271C25nFa$xYEvBh>Q@PM63sOOIvgCtjNaF$%DYtb`<^$ zp%@}qUY*nBc0IaWiKSpetB$PxFoM1ak%XwfFQ%s;6yRBXAQA4C7yaV>*4$O=IGTF6 zVUdL&jP8aS)z(`rR*81IClXD0dW$Cc@_xWpiY7OJkW5CMAE3a;zNQ_k=J5=?qi=3H z)-H08SkDy$iJLX+93*`Am3?TlX2~>M{U!QS2bZ=#_Z8coQ z<3xf+F(6HvGC`_MU|l^SeGEY#bZxD*?mi`kYjA{F4^1U);b>c=0z9Z^E^7_b?Er{_ z41_7Ll);>}JDW^xmthI0##B@Oq#XJn9FMmF{qeT!zIVP;wxzDAg>kSv|JLTnf@^y% z^ROrAm1@Zr5K<3{QR9(ltwl|)*dM34V?wJZ9n0=gNJ$;yFl}FyoU#hSz=?gs)*6W> zL(esBwP+jHljBhHNf-^XBX&PgA9=YrCc{vFnsHu&f$RIzH8&}?(ZQu?!dd6-k@nkl z0HI=_q~(ov+vszt$be??TDUVfOv22 z-n#jr?K>aDxq)aRjzzB^rjHyANZAmLON2Zh%3%E@-jAg$$QXhQd8Z$9;)u=%`=Jxb z^suvkbt}=gNfjK%WP{}h^ZumbGA25iY#c#H*xHs%Lv|y(qWx{waB|2RjPH+SW$Z*g zn&#*hXqWaG9B#vbbJ3r4ZRQ8+c@C{(C{ld_)a!q7Tp=TE?xpCVyH7i!iT&A_bnvK-#zii$VR_lnZvCou zqntQ(3uHO@+&E;4KWGQuN!t5OiDA&08A$TO8FJkU9V27I>jzsJZo?B_5x426N{F3F zSQ%7AD_nZ6EEoP!N2V_p9fUC=0fZR9@&_Sa=rNA9)sXZPZZxY^Ry-L`Is0J`*?tU& z?EfR_E#%YnJ&Y*$ZyP_VD;Ac|YrOY;TKa_uU=|)tCxq$#lasF$+UZ+F?Hg%fcOY|L z!wn#*d-h#O*c&IK$e>9JuX!Cr7!idFR?EZmdRt;SJNh@r-HS_mDdiJ{wOQ@$?HIrVL7IwWVB^)@ zT&k0PI}m$1>36OV(0L_vZzTXo5VJ`qk{7Ud~hHER?n#Q}Mu-t=l&3+0nCQ`)2Yb^wW5H>a?IsyewZJ!#U2rf|8i&Wy7|mqwFI7ywV4Lliw1Cw=@kL(4`CK2#gVR^w2^lCd1#(&u9ZwtxLE~NatoK@FuIj9u@ z+#r#+-VlW-y19Pp2g|a2cmPj`)j9zjIX~S)4S~71>6A@TeQGq7fXJo1Hho`*p5mdY z4OT;kFk8T4x|~_W`)Dp19murH3TgeJ?)EwElN?mfTRCK#NQ7M?_YtAEmX5W(c>5lu zmpCsUPNH-4v*o4-SK+2U`34FUXxU(UW@j?Hi2}Q5L<^xq-ceQU5eRO_Hb@RUXXq}d znMcEErfYl8)?J$(Ad^wUS9EE;l!g~Y4{r(t5FrM4Y=3BLP&T$(BG#^JzwC2fPCV&f zYc4_7Lu2C{SmH14O32uq5S;M^9cx_eN9x3mPRggC9C&ihq9PRMbB1K4rF5W9;tkbJ zKgG}8=<<%OJ@{@to<@~7YGn|I^Ny7ViLY;029xqJQ^ES8<720`Pv4>i4%HkiHa}u_sXRNakWY1LyQJET-2e4e#TrIgoVeQChiE)r-s%@l+5u>S<+>mf+Kld9Kt4;OWubMi0*Lb&dVuVu!wJ zqe0Q3md<)UJ0GOZ3}S5+3;F69Z|uuLG*S@96-%0f2UWlU|Ls^`sB@_`OQkNv{f0Wr ztSN~nupX?!9Ems>&e`@_ugTE~w&{2jR4s16KI7qtA$booq=PG-Ooo7O`vs189m0vF zayd3stv%0hoS##85qBcmR#a-d55NcPhCjDRSsfP0k(9+0A(#0;eBs z#9cc_FL*xhxc|xetJa!mBF8^xy>mS`r{)%N)a4cRvr8e~hOp8RZVDPNryatxLQ!ZM zO%df!>CNUx_Uwc!K}l^~^eUE$y?B@)PjcR(!#B2T2q9T9cftQfAsBic!(PVZ_MHAT zD6Okfm0juq7`tQi1_NE<;0FSiT7ZWo9E#92Sv2>i=*+$mDeZ+^Hze&;Ydln+eso5^ ze?hH~5217Pqv(O&H*mCD8-IB_QsI$*lX{Q4NwhAgJx~49vSjy_fuVV62A{EN9q zW2I_qn17-W@=i}U1|deWa(lkR*Vc%dLo;ywqvS!M@hUoW`q6p{>+C(QBVK4NAQP+U zQ*yFn`)-~vsbh{RfYjhGwL7f~Gi`TC>u+2!$!7$QZ^;E2lu^j1`$qh7zV9M=$JfcQ zZgV(=$2g)HJQM<-Nh^HGG**LY%{YwPb$B^MMUFZM#I?@%75ec&nYNp9yzBjr^Ys&5{tq5f=bJs?PnlK9CU z1LB#NOjJ)Mag683=su;b;INDO4x=n1E6;NWhv3vqF8m*cU%ehg?WnkgIIC2x2a;|p zDYa)Cex)3>wPU*4x&CHj%5qgNa|JS<490MSL&pcSQm=lt+;gLLEkTDd2CCL;e$R>4 z)+ND8PIqrb{JwKD;$(F!=h?xnJ9caj?B2ecS|TN*3m`S@@03ZT_NAFXR*y@O03^OP#X?>5|cj>`F|eOtSo%I*0L z9pJY;AqQ%UGX$dY+W6M5%0mw5tuKm$q{UJ9)12e2A9`0eIU1jbcqlsT?6xpXF6jAM z^+p`sO~n+R88WB+tv6jnzK%QOToU(-m2#k5+W+kkTj-LLlY@AyQ7`6eS)w3M={GHn z3V{VKS`wB&*dO^O29c$#iz<&&+=ZJA(J-DJh2N)}ZTcRzBOJs14#-mmcShA^&UG(Y zf>|p)q)Md76-Q}T9GrU;p^$PNs#Y1MY1ZqDP!n`o-nW}$aZt9i&0c|5gz&sVwF|+g z^%Xj^70*eg}5#Ro!WS#^z%!Q@5P1}7w&2i7jAEnEqU>OL4HAg3}tP| zKM!aDp1a@@Z^TYVT}a>mmP=gqZI}2f>^Sq4e{hLckZ%5tOIS$nMiSURtAx#Vs@OHB z)GEY9lzk9&{K0o!;u*jPH}~uyoYB8=iS{f!+v-6X7meclJvgt+R{Q<-HL46Rk5pa4 zhrLqTNlU`3-vo4lF%q40o!{TrkH=O*ICj(V=3UrgYV#(-iPe{3*ChCmy0YyOFIQhC z@$z+L0f{$KUncQJ>&kj0-dKH^#4DhzvH|p^sSntl20W%4sOot2f#g7TkdA3w_F{av z{K+SujO?SQa=JQNRR7Z1zSY||$#%Ny%HAQ{2{_Ao6kcy#nZgU9tb9G%$timL529V7 zC#sG=ies8zGtbu}D_%s|(puTwR8~cqV{AI8jNaQWVxLOBmWCGt)FLK6j51ZdnD`dz zzYE9vGUSqluojAE=^A=B7W@(Zg(3vdp3bEER{Md8Do{37E0Z))`Fy{on-+;?9e$!gpbbSaJRuu?+OMBOc-E!H!RBz%!(2jL9m2!3SP_ z8G2ZULkfn3x&-PHs7s(O(NI^@ibY~Y#|>h|Gs~(sRIV#uTUwH84J{5dc^3&U@V!0P z3U9|X!u!n9>h%>*YQ=3Xv9#%Kv9RO{yaN4=H3_lmjjiI17u&_^3wMfJ&ijQodzZLA zvR=44?hzg+UK03pUyAajC||lBZLYdX z+|aa9TvcgFxkAnU1rR!FyF_ibFBI+gDERf~-y+=4Zxs`d3h~cKuW)(3bp@rN|1#~yPy;ZzDd$rinL-Z{MZHtID!Y(zvWubTr zXucctE?mDLwF>(}wSfLS9%TEIoDk36qx$YVUU92icsiB~&kL>9MHST=^(jPcUAI77 z_rj9$s)1|pjK^XT>9}63zUUUOyKuF*@%csIZ7XDAi3q)4h+jl{N!AbJ2ONR(0{Hdk zV0-D@CFPK#hO!l}TPUviC+2iufuCqffhNVHHt=ZmoIIk9gjZNDaZS^5aaFmcMAwbr zx>eUN6xUz8UM%jp5%O@8=sJtJHPZOK;E8vk@LsqwX^)<75pRzy z6x(~Q5sUX-Rc$FXrxy6p$Cnq2mpgi)&yRx_yTp>};Q#Y-{#7esZ_v->=dTvmLpGK`p4`~1IE8)9K7rKsX5uwu z1~>vZQhtCV8gP_7fK7m1^MZ%o^~xSJ-O?&<0sbwKMdB8my9MWNS$|X2Te-2k;#Sbn zbhCi1ND=*$pnp|otLVJw6&)8=i1zb02~Wfli+XN_Y(V$^ut{_xJtt{`t#BNh^hNUI z4J~3>(~|Q~n9qsxsVOk*8A+3B1^_gsk zg)v_Z{kpy39O)g-T~bay2<3J4pkc@HirGbCHnL6J)O5d)9D`jT>rJvSL%bn9$=)Zd zUta+KvOqisS|oozbt!*)QT2+%Vv)$M6yBz#LR!r-B+KCs#t6s182a@9^lQVM`awQJ z=};$h$Ui4eig0|02Rd#RH~rJ4dI&a)71-_i23!v*2x*z?r9R;y*tHki#PSR4gy(#_ zSd_gJ{O%Cto14YIB8_e&euH;7UtcEbj#sp|!d|R^z3`$xH;P;T$sT#BOGJZ=P11`i zSEt+|sp}N0T!f7~f0bx?{#p@O-z=U+TKZN!#u#Uu6OHE@uIswDS!9vsy3ToS#Y)oe z>%_vU(r?m%Rrj`vdoNrgUVr{t$h$|}7`YL)e;IhNRQNYGi@iu6lk^Y|u4yPkNaw(5 zdaPAEcA-@~(z96H*s(<1xc>U8r+iJRHMKaT?Br6h^i!9P56O!5!J+-l;!LdB_QB5M zrUw^^2QMy$A8r+%^{tgfW#xxuoPc;~1!BP!@Uts$9`R8{#fVoUMsy=aybAKMP~5a0 zF(USigx~i!VH@y8D3fsvwv}}~fHAsifw&4^q-t_E3-<%AD#b3VU_)+!k68h`d0pgc z(E^((KHV(dk5syk#tO$cFK}Mqyl6Pzw3K|r^GwjCFQ73$;u6mxZM+}tQM{79N*;d^W!+Q;9@2T|vGW?`53YwlxDNgRapI@g zA6)A~tPC5uez9sRyHIrfnoGQlRFw5%+#AYNe7pqlF=FHn#A43)cvY)dg_wI4&aFbs zwQBwAsyA0wl$V#5rDVV0zlqs)+5}!KTPT)YTqu@2-zr+rS1SK5QX8G4@y9%Yj@KT=T%O7>{*A|V*WkRf z{-$eN#I+xgc3aMaR_%6+-Opc#xZEw4U>?x|x%3}%iTy|gSwCbP=LB%nyrlj->y$mN z)#EO)pop~td951P`ZCNj9XL&kU1D)|u~@w8s>&)khg*a=L+P4z(j|TY$^U@rr}LQG z4M?6qw)|&YVh|}txKt#A{c(#g0k4eoG}qgB?5wM4<3h0!buD7~m9`u@dTj^h znwV#*_7{rL&$z@7f7c}{T&MH6$phI&pFGevvR|vn{y>jg5Vwv_g3q6Y9&A>9bRJ7t zd7v4Q3uHxJ1HQnfmA`~F9Hbp|&GLm}`9;L@7Z$^pERy9v!nt0qkML^8q|;Z|UEf4J z>1Yy7OBaxx;&EIe{Lj0@7Nkk4=b={d5Zc&wp+#&u4}PF8OP(kC-4f>^;FY*Ny2g22 zR}alGvhYRVWea%f|0CGWueij7w51p?oTD)#TTp)v{>FjZ;^;sXHdVf|l|N@E`xPMvL>fsdb@f-Q}(>tYG~Cqb$ex`D<|95)nA> z5}!b7+e&=^Ur;U@%9~nUq7^=*^%-|c>ccM7LF)t;Ax{^e=UM0y`7Ow6;Oj2YkCc=3 zksK^)C=+$Z(q=Er9V^>2E9v|@=qA#l?AgWjE6O#Yp-9NqW%*d z^dl&*126TDHXNk%wNg1v4h zP&U`^=llICe*S#FU&RM+kAgqn?^p5R=llICKKy*YU&V(!@8kQQZNJ}NXbKG5&xQo) zsT71X3j)LXK6FstE?){CMsMWsHa-$9?81ft^jt%5XY^nIPY=<)A0m%y84Hi3($n;~ z$Jrbh-lOiT2l1dDUOz&MgLq|3zI}B+>fXFfZ#tkT*i5zT4rUT~VIq<3$6Zb|MLVQY zTbt=Yf`{e)0r(yQFneP3hW&0lDi;kth&Ne|w}7(XW_ojDmwKE%nb?6nRI}pGQ4j8{ z2SJ)5QuI>mcwmAm-a44VYUZaI=RrIKpV+GRuz8qXj>VHL-=SV}2kBXCoABM}J|4C? zSnL18^lU(%_$#jOv2YsI39LebhFo8epVXsb$%p+k5_N2NRE`ba`z7M=@s_~w4s2Z# z+?3f(ybj_~h^RdV=n*}o7JMj?JeZ)Dz_7Ze+NnK3^2;dMuAbgj01p>nQ!eoUk z9*7Pwo5b&OFLu(CVFPI1=8O>Uul0F1HtV2AeZ*1VOX1ifH{!+Gwc`9Eeey|-2z?Bb z`y+)x_h?_OF8Rn~ybmKP#b_0zsE4*SdH}Dq2fMLV6ec7z($3-ElaMd$L?a{zuV)U_ zKNI;Klq%_wY!$y$Ymp^ZOXlx7DJ0g5a1Hmt&A~khqUQ;bsFh02XB_g5=S=(P;kYvQ zA5G9J4dUaPKOmF_?lEkspq}}72CYgh!2_V+q%GFlx8P0{Y9vJ{SCTE0xW={tc1_R8tMs!i zS~d>r7Fh^2|Bl$@kQaP%#4+B)P07*6P%7VTXWP?F$Mig5ki=q3a!9^g_{Wl(Y;aQ~ zB4$x5=}+UEI(OLggB81JCnc=FIYxqX=mok~=|2-WM%)IQ(dk@PyvXMt!%JGxJqg-D zK)x#RL>-@{fQv;a+c`A257!b|;_v8MJV_L!e`Hdi>~BKtL@S>1vETM8USgdNM9Go} z@!P0@4Jv4vU|R6R5uU}w9Y1|mn#iYW6zz)l#WrILBRs$+#ErnBchnR+@3eWM?CPX! zdmG;4)WiM(;L`>b3jexVpSC9g^y(UQ?O}UNR4q-wQl^7MMN7f=fW>+x(Y}mhX|Lqb zy+jGTOK^K;_t3tq^fRA!jLzGzUlqPi!u)y!&miNe(t}DP*4n*bWf30)9$PXLDO!kg zLcB~=NV7(IqRQS`;}tXWU5*lLL?_NNuWh5I&AkZLFro2Vq61=At;Fd7zy`bljOksk z<2<$sOg|P4!wvQ0Os;kYFEnAs=;;5Z%$}ZYokARTl#vGL(f@N?3-yw^d6+m$?|G0& zi?7ic5_fqxRO1YWjt#tcGjWi(zl%0p#8W#pO28%3B(1X_CyxTl3m2J)h(6oD1n@5Q zY39;q>X!ITO~oel`u;%&lO%rz7-WlfCLfOCtv`&) znC>H!r^n>oHQM+L-j}PDQGZzpt7w6>A=-~v3n7mP)i5E!%46M)mL3?!8w}FQs&+Od zA{4`j_c(Z~%}Sq(w-9G;Gy)QSRovS z9YAbAn@g(7*K$3(hp|7=psHusN#!(b)_#x_%UasMJ(GS!(X6wd} zNUoX77-Fd*8&#WXi$~J6&9q&j5U(fx*-@10#oq&0S#A|$tJ1|xwG6}Pr3<;g)aR%z z$-1rdDnG{Xe-WkH?@3oqQSNbv6p;>US>8+irUrsLlF28Aum<-*M~_JUcGixiTYPWr zm|ltz8>k0Vfh4myXFFP!7f@@OGs+zVXhxEf+X>!%Z+nFN?*De}$_{K+??6zfLy^G0 zQkf!A2jyE6*ttpwR}0QO8c)+c4to+<=>reG)v_mnZ9*g1EXy`<+ps|`y{kUn0`416 zuU`O_-mD&84yfIF#q%va(X{;JLsS=uV)OP4A0*S;@Ukx6*Puxk6iK99Zy$=LhXe4L z6f0nNPyOut-IvzBJtFRPl&atvgc;)Bh6%GXs_NUqq|8iy5V6&0n~1Z?i<>VEg&_O4{hDGbL)<~*DId8@nrsH_2N>0 zyf3Jj2X5Vt@=R8JPJvz%N#YHTOg5by#x^hXa^8J-s(dg*+Z8;zc^6)`+Wzp?yE^=; z&U=J>L>*io6!+Hh!Kk>Oo|}(h1(t>+NQ3Uh&Np&<3GflGqTnfXyvLm0e*hnoR9C7l z=~L0ffjIV!B)f%KM;!)2XzVN%%&K>4Zxh(#0+UWmMe9!7i1r8%Pl%`D>jpElM7*vq zon4n!FKn$FxNF^A>r_YHLVfHTgl=q5FwCqpbX}!>Y{wF`tUkTQ0+q9ld z_XUJ}@>OQ!A(cCS@;xC7KMW^Dn({$&^?*4()`C}t=p8iq2086c(atZVwBea_9A!ye zt!TEdeUV)cTmiOkQyW{Wy#TS#%^i0nl39F%2CuMSo(lVtwS4=cePp^U^_rM|UE1R9 zKWmt4+w8id?fcvD#=Y9An0EbgY@CGlF@V@y^@bJ*iE1>8$tyKu@4Z+E<+Ed8glb2a9-_D zvW{LXp?=Y15Uyo|MVges=BMOF0ijJ9(CFA_P;IbBouyF%hiKPpXb1Y(zYd!LM6G>T z*?0n1flrAjZ7~jmK!irsHc^|UeYLxiRQ|cP;{di21h)>xhN<^>e~NTR4g|l*k1aB= z{V~>W=>4+;(MIND2u7Bu=k;-SQvNK4E{3lb*z*4A=6p>jged)vI&Q4bxlJ;tUn={9yQ1>v;qsYl)%l6PQs;F$ zDL(%q!_o`tyyoi+m(NFlJ@#t-M=AO?y;+CcJ2Qd}F|06#A3M$VBSgTC6V6xjv6&w2 za z;*hTvVY-0ENDC5J_DW-Ctz48h>A*G#_%sdnBp~Xs5r(Xqf)7-ZRy!ET7i6(kNnfRq z`y8`s&~_&z#;6Kg1?o4nWHa&X8f^KTBBh~scmSTj%jl#8gV=;)AbJ4%esEj-E~KMk z?7T@^e`5O)7_sPpW$#|aS8Sjyya)BBC2A*ByZ7JBe;k_-^B!dg+=imENA=g}jea&r zJIeYAGe8E2c0VEON(>_FhcR^4CQUPTz{Y9BBWmRB#(9*s_p7baLVRUN@FY}kc)EN($b7S`-TabQ9n0Gw3V7d?q=$V`zkDkULm-`+G^N=8G(-!2 zA>MTZN`TRiH)@We#BLA%O*${CTDeJFcN^R3+pH)&ErKJ|l$KlhW3M{3Jv?MYzEcYd zGS=I6KeDr4L1q2+{xs?20os-mf%oNJKW?+4SS3X_l~`e8UMc))do|KUrb=~7dYg7@ zcXALasrOEn&C2}%lmUR+VIwZA;b}YL3x!}0LZLP*6q4^Xt1K2YXgjA+Xsu*uMpjB+ z@Ug22g%GBOLIwrIOSXOF;lMlmA%w!(n)L0Ot4^iFXu>1+$J6)_pQfBHBWuOu0=mii z(V(y(w9#oR%C8+-=m$0|BYJ^~If}G{65k#~z4eBy@-@|d*(6i`e@ye4Vn}cpF%5Ad zg~eiQSmfMLwbnAD%RMK_s3pjX(FY+gY#0g2K50>@CM8n!jIqDZ_fuRQRl9F)fP~Af ze3T@pkx(Djhzwy5`ow;%Bt7!0AsO29Ra$8H6SaFiiKnb0#3nPuRnoDRatNhl2xLG8 zjv;GMhS;ih<^I$jSn{r@}tDkBt@o^gcQJ-Z06$~IFKhi(1 za3LtG?XGbd+9ckk!oM@TlQ@Q00y2XsnD33qQpq|%$NX9ax0tRZ+S zUhR@1+eQ4WJg9W;?bdeeN~m|k)>biW;VuH11_T{yj>=m*Vplyx3d9`*E%Ngrutl;W zc}0}B%;OI6Dc%qAr|lHhF|e--*v>%Xgp|+>Glu}+j znA?JC-Yc6^Ba`XEyoQ$0GETedw5TwsXqoPZXXcf45)s^`9fb35w5L}@Vx4$kyM$Lk zVmNnYB=QC^ubN7l;X-93Gb31~k-?h|{jPwAs@*H2kw#i=Y;`FgRcJJ?qVZs>TIA3& zFX#40S88SL9k+gJ!gz?UoUk2oTjqI1PnlW0$vD1jgvo3YH$@Y?Ou;dU3^~XMwp((Q zP?|ujyCI}dAqPEQfWRbd(Q1OcFN6g)$N9Kkh*O)@Vm3!BCbchZwOcYivG=IAHp|sZ z^<5L1A8;sw-Q;RtQiEU-O>&6XILVD5Umch6NCMVl!u#m~6EaA8k%Tt=LPUTKPFMzD z>Jd&QILy9`;xppB%&*&SiHXM4r+;Wb`4W80#eqUI;Pxll!|ezeaW^8e*3x^f!ggYl zHZ_ODS|okaBuq2NLGV}(j~$C+ys!Z4_zri7W@9vrwW$UQoY#{2Vj_%<)Dn6S|gQYX)>P0E_vx zb%{*4AD*1|%eO-@d1JtCjpTuLJ{yc@*6Di!brW_i9hN1zl;U-v%7j|)>H1{-x{qdM z{tEF%7%$KDlnnLhb*uUC^tzQ^AM4`vD@~V%lMU-zy1WriF=oj<`ToG@JoS065YNYW6Z6#9d4+i08t*y9H$Ow&PYrvo5HH4f`QPDj&`?*z zFvoa-&nUdI0k7e*c@J&Hc~swjLiiy!@zg8kbUR6EE3LQVE3IUiuzp4XH+>3AyDG|H z&tlR~>1Oq8#PRtYj;yIdn=ZS3+{9M4S*|6h-LB+X8Lx>b&x_S~ISrwuA8GY!*opw< z5NI8)eu2SmXM@_wO|3lDuEzQ&{H}H(@(#9riA^jrb|L76-`Qs08IgBF;7^kj1IiCn zwA*_d!<-^C}k{eLwa2>UZkP={XkqndBk0K;c`uA%>}6n)|+f1KR)j!v=Y< z@;@UwxM$VZsD0CT_zmNc|HYpX9}MG>e~tJuuRy&LPIuTj3Q zp2DkLG^UMut@{)E=lbh(xrQcrD6l+qYD9*G5B$fFhtc={jObuKcwQquXnR^gN-H$szq3xj-@-}f_;s|I`bvzG6! z*N6`@TCTn{_qdwIt85sr>IZ*5UL^CO*N6`(j`y@Z(e|a$o@l+hQv2nv&aJnm@$YO_ z_?B*nVb_QMV~qdLI$kV&=(XWPH{0n#O4YCZL^Yzu<4VU{58L!ll;23*q3YA|jz6aA z(|)7!j{5WZdXs#_4Du2B<=2KUnjRx;u;)K(`KY``dSaRvYQBvANR4axpA^*PUH_`& z!1{jEW#d=VcncnHuda}x|25KshGs53Y#8s#Q!IC{ksrO3fclb&r(YYnw|Kr1`f|Ph z?h2{#ZIp+?MOE(Q^@AynPknk_f#bIl$EhVgPO;qdGG2-OMfoLehs*OE4;MK;wz$1n z#-HZ6car5V#P!CwolY+Ia((^=Io0;9%Jph44{-d8eYor7ca-gz#?#kdX*_R|_i27U zc|=#tu<|vI!yC$9>%*o7dGDH@n~tsqLOd@hylS5s#{ffXzdCL}|Ct?P|2H|Vg;x{| zeOB2i?XS9WEQf5zMmy@)*D7IkzQX!qJyUhro^x}SPpUS|8Guh;9V zDeixP?Uc5oQw?#mmY=|W#TPA~y8YZN>)T!R@>Svfd3fAKy1xJVdcCgOu|n}fy_2ZV z0yZfL%`;slye6UWEVlEZrK-NhanyLdJnx7x-t~?qWtQ6wF#k+=y1o&;E^?b{7dyk( z|G2&!)3=iQTYr}TmuNipHzRkd`tTKs`XA$YxIW*lm&ePoTut1h@UTO2{g3M_@;aai zuZj6Q!}8O)Ox0)VZ;0#bex1V8@6FkbbGsGpuL)1LJH`E-TBYj4F3VJAXSpM?2 zD7;nmSh^edMvpo_&Ewmsr&_KG+>cR1yUZ35W4zSr%hQ))xzDXrcpd|N1?F?=jS7#x zl~niR{ubDuwDP#=_a|*!#B+uT*#~c14`w`nq`B3e3MoxzhC& zSWZ){myLLu&r`fUYOx$N(x>sd}p}6PL`|d40yea_Z;)tG#+Ctr`;?sM!U=Q*~@ZZ8n+zFsbG6$@(ZIpzV5YZ z+#2n!?r(tgyu|jv)NY04YKHxmN$v&9OE=5uvIhQXc?qx{&9YxG)t6)X^4#CXe(3tT zS^j2kRQ+w#Bi&yQ>*drN6rQQwPNwfgmIIUB=;d+q8|$wR}(>JT_?mT>%VY%vLxi`skg~!9k{Wa;idmcPZUl-%e zvVAe}&&_&1&3G&7N6n5WOWcnt^Uq`_t1N#Ltd}bd^?7-G%PcQ98}LTh{uNm-Z!zI% zIc5H>GT@CdUq%?unki( za*u7z>wis3GXtz|vurnBUyo&vZ-Dud<92T~;FXxqIks!2ahqZKW-UdZN$!1YPe+z3 zyyb>=XJ1n1ds(hb`kUwRD090vn(AXd&$9lS`Ws;Rb2Hv0&qpzztL(QbOrI$ps<3`^ zvK%zV5!w!w*RVrtuhKK3BQF zruc7$X)Agko zZ-V0-Q`{M2d7fCN#@E!YhxL4h>uZeHv>sKsz7XS?;=eK0%K*pEjeODdmASq=%ZrK6 zqpTk@jA!!ay*zGR%)iF@uWq-(cDKxWWa@{T>+`aln)sY!`5WQ*-bCLl%fXmo9-!%) z=5~E-4~+a{z3k$+(?nl4k4Kf~d5!v}+Z8+>oxE;l;-8=8Z-&R$G;S%Ds{qqy@>>NS zj{y4xlblYl92D7Jna0iHew5j6G|IDWUpVd@VEr(y|8?{DcCntD=<_jODlAuxc1X7y zVmVmK_QkZ$+RgUags1JnB=gx?uJqi*modg0n`b>|hV65;UDaoj=Pu^om{;MM{DPP5 z_=I6Tt@%>a^2c(}D9;+t%Y12LIW^78d`#cyJaQjkeeZjj|q@;<`@m?+lNxDW06-@kp_pn&RRT47VF&xoVUHJsvY`|4ewA&oeA9V{A7}<2J?h3C1(EJHdKx!qe?e zu-zSHJ7m(MDvw*|eEx&&@>tIO?S;dp$M`ErrR zx6xkd>%83Gi>x1)-tXb@W&S+YcK0IF*NCU(V2b%S!u6T#pT4iw#(Xi!X&3j` zgr~=MitRz3$JZn;qs$i*p02N`^=+Q`G{=5$gz=31WqmW@>2_nRA2ZAsQ$Kv%4-=lQ zugrL{dHjc)`(eV<^>y=j^vN?t_e@KTjF-Rcz$FYU)FOIp000<^*qM)nfN!x^i9nZZ&bM5kIkdM zQ!FomdFt!pc1?J?AH7^(f%$BTOZ4-cGc3=h{!ZyQ$AG8X^|L(B%=6qxitV!rPuDle zcqyLu>@@g=D(kt$^D>j&9o2TjfT!E-;jc)iZ#7plxZKg*R#o=eP^G48L4e+9;Cn}@yt>+gBCyC%QtV>u9vXKFXb{Walf z`75zJdpWK%$xAQmo0sD?6aU6^eFi+;?$k?a{5!eb#(wB{t(*DM!T0G*?dDjXb1bK( z`$rR6?wLN*ddU>aUxEFqX?6$FrW9bpJ{AY*XLn*_HuouxMYUu`zY(1NzW~oQ$Ndr ziGNj&|J*ztjr`N}O>#W+6wen-@l}rX&CB-X()yG`(eF`2m_C#J^KgGnc$&TlPHs1~OyQaC6PH=;r`T_q#;wfuUiejgCi^nN^>y<)rfJ-K zY@fTC&!+qPW4zw!p65B=80)2*{j`Zb!F=)Dsrq4>2Ux5hvmDno%7Gq_0^79!>$!=~ z-KI&Hp6A!{!t;2O z9*wXb3T%SpQLrmW^$91OX z8A3cB(;VlR^s<-vGRFF5YPZVc5m?b8?VoAh7}EBS?T`ttllfQX_`np8dst3KxjxhQ z#@McHoF_glaNN{8kKOHJ`kv+aph=JNEPoO9AC3M^%S)d5mt#IR>XF9lVtGl;bDyM} z<;7zCHOXI*`(eV!o9>tp|6(vLj18({llil6oSr zdFh&GUNOe{X2R3;#h8Ct=1Zd-Xg*J{-RmF>7G{ws02COl1_oBOea<;6r_jP0|J$HTP#muLMo;puj(tVczbds9C~c-%&r ze~s~#w&NAX3o(5rImmOng8k~62K~_WO=^8xp~l1H7iL-CMmQca*_U3f&&P6V>Tj9H zEnw7hMX<$kT48(DXb&`>LrhV%5rbQ)BW{xeIJ`IzM2P5*EhoL_HvwK8ecERofgM0CV5G*{Ee}HGu1cB zdSt@W^o=r~pJ%x@*=IM8+X%~x39rC-PqEya@ci75ud-a3{PZ--{je2jOXF;Fxhb*%Rv|0Ns~Pl+>Zc{hsnMaSzb!>#LuOR ziZ9blpNY>omID)>=3kZhmtwtaw3FK2S9yF*c)Gq$#@opL$YducxgP;;*QDp2ET^a2 zRliO0;$=Ph7~5SFUWw(|gs1zV_xBi|XI*82{f7xp*Vn~zu#)-GNT0^@Ghd$KILD;F zC2lv*_QfQp9>(iluJ~uN8!>J-#{RdFJ}n1+){hS6v&sJXSpJr>zM1eQ*-z(hQuLYb zi%+wDbaA`4H^e3SzTXt%`Ivu=@sQ^8G}Gs0eKYB0FVknj)Ad!@4?eY2^~2O(KiiEw zuje#A*Qfh2&HgvQ_Qj-^Io6N1dGw>eeEBNddy`&TEHA4W&lJCe*dKMX{5A4f%S)B{ z+{5*m_>$s&WH}x($zPfIvW4q2#pAQw-)WAYP4-@}z4EYLn(R=K@rrDBO@3yI<-mle z_zxpW=GUAFr=hpV#%J*k0P@+@CV{=MsC& zh;3p!c=Zi2q)&VZXtj_5PaW_r5m!YtH;w$x;6Kx#d{z+g`X~Zh5HA zs_Vr)_2*L&mQ(g`S1Nx)WB*5@y|%F zAW!f&9tVB*v`9FCdP76`-&ma-acu zf*Xc~IE_5PXP*?JgnR+;vG)s6Mm_}ii%2gaPcZdy(2YF7k0M$3wn%sk`HjdE{3E0u zzdyyyj#xDuchP)rJ=gXi6`4r$2e~j-UA)g2Q$k#y+@&&+8d;{ZxJi(REG>Oy5 z`vJdqv`LhZ#~z!a|3s6RK|Tez_p?pH{bu9=KY`SSJi#A+u1RzvPjKjqz(YO{*z=_( zDOVxD*ZqEz$fMi>bpK(K7(?Cz*opKU@&vzFZ4y(+6I}lNCQ&7Pz~PJVDjQHI;OCK6 zB2VytAax*5@GTt+L^tvTdy!(u6Z|kz4teaSioPOI9`K7uyTEyrA5LY|LOwaN1ou#A6+2!B2VzmNIB#Q zz6)s-d4l+ck{Cyxp!e5Rofe??nFZoGloQ4W4}`|b#t>wAzudkSENzo3Ep}~vnV1@ za3j)JktY~Osvw^SeAD`7QAIug_%zbex3)<5nR}YWYUBy7zqeU*A>RdZev}h@>fOy^3-b6*i1^Szv$T_=fWMk-7Ck5*1^o4t zsuO$Ei}$9R#Q@<09v*6zGK`o}{LVpjZ3*y?-wR#<2R>YEe+um)kGMwsInp@t;(g8H z%}5i-<2xAQD@cTcZ-a;ryjeDrnPxEw z{4(IR6AIr0__v>8{7<95NG0G9{Mhe6_K+v|X{48sF9GJCc8S*e(HFo4A9BgIJb-Wb zWtUiu@&MqQMqElB0G~tJh;o8oMCwMKVAHR-#9rhH-iVY!p5Wa`dE~nQKa51Jl$f z9&o`kE-{O|2XGV8(ykT>%g9^E6I}LRT%rScfG0BH<)g5yZ1 zktg_}-*$;FAW!hWBT;#Q%8s~18Tk@mXdGjNJi*^XdIfoc=aD>{AXk9jMzWA6_+6wn zJnYZ6O1G6MV{dMkW$DK{BKBkci7N60S0l|LPw?$Xtq-(F7)IVgJ_UI5NyS?W@E4H$C?{Aw1vx~X;L_6= z7v%kCTw)L@hCIP9A*GNfSVnppd4e~db%|$@CwMQ?1o8ymic~_r3-Ak6PC5d3|2fsi zF2KJ;qVfvhUr(T3;N!c+qVtoe6Xp1Ju{eN4IQXux_&k^68^mJOr&KwfCRBtBr_v*0hv3I09OYUByNjI7&RKJdE@#@)Lloo(Db1`vJEgO(IY5 zA*2%W1V8?V&>7?jej4c&oNVBC=>cDe>SF-#X(Zw&!AJiW>@#qB0sjc;Ipn_znEMuF40(dTiA1zb0sbB5F95#o+p63G z?BP7YIOhidKgM~2Cpdo^uysc19l?!AR6oH0=LvosiRgS5aLwPVybrL1^i|MC@B)_; zT=EYJ#{zufA6?=ia0UR2NW^o37dSry__6Q6hCJ9JUIAS3T}8u6z=KGuQC^gj{dqX%g*nZ%yHP&D_5$}&?vX44jqpI%Ib>UzR8vj!lRUxxrfbW?9Sm&{>W8KGk zj}?zi921@vLC*%biO9nSsQXahQ12lWhTvxa%7=YNI*$a7 z-6uUKeJA}V11Eb=hEC>A=1-2C zESxN!oH|)PSv@&>(tFA})pe@-RP0ph)aa?PQ-xELr%I=$PE}6LoT{F3pZ1*gVhu&) zTf{WLOhFv-f&P(0qlYFBl@3iEsvHU(jvdY)9ywe%Ts%B+xO8~x@a$m^`r;iQ883|c zj{1)lkBVdNW7aXBB{Mu)78_nr+sI- z&P<)@K3h0jJUe-|bav`&`Rw%B%Gv7K*|Y9*o^#%F-RDB*X3n8QqnNW`$s<-M6{ZT6 z!c1WnJ?umer_r-s^k)+NDIcCbTsb^*xQd>MBkm)fBi=cd?$onztk1ZLv62EElWbt>SFAlpm5Fk{yy9k{kcYPAN4c zGsTk=keF#mjDW=WATa?*OioG+$qPvf$x7$xuG68@vC|``N9DNCsE9M}GrlwaGl4U` zXL4uqX9{PE7@zW)>Y3Ry-m})(uCv`|V`o!mN6(JQ@v5Aik>lh)*LkiNBb7fla;|u8 z;#~RM^tst{qJa4i#!M8fg0IkB2ozF<9JH$-$8e@lEqD%jrKW`r#iXQ8Kvroy#bNhh z-(mmZz~SD*Imm1Q5=)~?<4Pk+V@abp3hAZMqp@>C7yZz~-to|Q9ui#~pBOKXPs>rX zj{1&v9}OH$9nHz{q_LbiT0QDH=4DA&BT3^pjWMJVBt53l%VFeb)TWM?<#>@MkQT&> zsp2T)pQOK1oGH3bcux3Fbe`xv5jv5Fh8LmVWoY*-blZYvcSEyN(Caa1bqQKM1MTpf z@}BC1euSXaBhcyz==3x+TAX&D_MP^h4xH{iojaYEx-$jMA)WD_v7j~GXJThkXGYJA zotZpSI#W3_bH;tvbJl;h^K9?g(AoUi5opwe)TY_9;+%EP2Tcl`OP$M|8#`AxS2{NZ zt*VkxAz__lW>(a1J_DfDTPThpHz$C%w?2 zE?C|ebZ8VhGzlH5K!@DWAwP7e7dn)O)h$AY%Fv`^Z~Mi;zl>{trca7^053hba8R?rV$NPdv4UlEqCe0*BkJPY2W8=fQuFER!@ zSAw0Jft~ZfgLJ}!gka}J;6)~2=cZxj1pK3qy<-l(v2YpBI0?U4ft_>1C;DOMdSU1C zuyf>p%J4q3uyYpdTsQ1o3U+P`cCG|FHv>E8IqQWEbwP(>(4kT2(4_Q8;+z{g|`;PkEq0ozS2VG-w1GGyx5oh6V{}kPjLZfClBDK?P{gl#C5LXS~p$E@)5; z8Z-(GnuG>bph0eEkRKY<3k}N4$YBb0u8N4k3p>{ZI~RkU8-<;lgq^EU^iXLLMVLBw z!2=EIga(D6K_i7CtXvsZZWdO~f|curl}jDUL4yi1Vw!=K^BndK{P%^j1cJ%#Sv9$>D=%~mW(C3rB51zE|Gi$Q0|u8lx* MK;qATuK@@CKcFoCIRF3v literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/fields.py b/libs/win/pydantic/fields.py new file mode 100644 index 00000000..cecd3d20 --- /dev/null +++ b/libs/win/pydantic/fields.py @@ -0,0 +1,1247 @@ +import copy +import re +from collections import Counter as CollectionCounter, defaultdict, deque +from collections.abc import Callable, Hashable as CollectionsHashable, Iterable as CollectionsIterable +from typing import ( + TYPE_CHECKING, + Any, + Counter, + DefaultDict, + Deque, + Dict, + ForwardRef, + FrozenSet, + Generator, + Iterable, + Iterator, + List, + Mapping, + Optional, + Pattern, + Sequence, + Set, + Tuple, + Type, + TypeVar, + Union, +) + +from typing_extensions import Annotated, Final + +from . import errors as errors_ +from .class_validators import Validator, make_generic_validator, prep_validators +from .error_wrappers import ErrorWrapper +from .errors import ConfigError, InvalidDiscriminator, MissingDiscriminator, NoneIsNotAllowedError +from .types import Json, JsonWrapper +from .typing import ( + NoArgAnyCallable, + convert_generics, + display_as_type, + get_args, + get_origin, + is_finalvar, + is_literal_type, + is_new_type, + is_none_type, + is_typeddict, + is_typeddict_special, + is_union, + new_type_supertype, +) +from .utils import ( + PyObjectStr, + Representation, + ValueItems, + get_discriminator_alias_and_values, + get_unique_discriminator_alias, + lenient_isinstance, + lenient_issubclass, + sequence_like, + smart_deepcopy, +) +from .validators import constant_validator, dict_validator, find_validators, validate_json + +Required: Any = Ellipsis + +T = TypeVar('T') + + +class UndefinedType: + def __repr__(self) -> str: + return 'PydanticUndefined' + + def __copy__(self: T) -> T: + return self + + def __reduce__(self) -> str: + return 'Undefined' + + def __deepcopy__(self: T, _: Any) -> T: + return self + + +Undefined = UndefinedType() + +if TYPE_CHECKING: + from .class_validators import ValidatorsList + from .config import BaseConfig + from .error_wrappers import ErrorList + from .types import ModelOrDc + from .typing import AbstractSetIntStr, MappingIntStrAny, ReprArgs + + ValidateReturn = Tuple[Optional[Any], Optional[ErrorList]] + LocStr = Union[Tuple[Union[int, str], ...], str] + BoolUndefined = Union[bool, UndefinedType] + + +class FieldInfo(Representation): + """ + Captures extra information about a field. + """ + + __slots__ = ( + 'default', + 'default_factory', + 'alias', + 'alias_priority', + 'title', + 'description', + 'exclude', + 'include', + 'const', + 'gt', + 'ge', + 'lt', + 'le', + 'multiple_of', + 'allow_inf_nan', + 'max_digits', + 'decimal_places', + 'min_items', + 'max_items', + 'unique_items', + 'min_length', + 'max_length', + 'allow_mutation', + 'repr', + 'regex', + 'discriminator', + 'extra', + ) + + # field constraints with the default value, it's also used in update_from_config below + __field_constraints__ = { + 'min_length': None, + 'max_length': None, + 'regex': None, + 'gt': None, + 'lt': None, + 'ge': None, + 'le': None, + 'multiple_of': None, + 'allow_inf_nan': None, + 'max_digits': None, + 'decimal_places': None, + 'min_items': None, + 'max_items': None, + 'unique_items': None, + 'allow_mutation': True, + } + + def __init__(self, default: Any = Undefined, **kwargs: Any) -> None: + self.default = default + self.default_factory = kwargs.pop('default_factory', None) + self.alias = kwargs.pop('alias', None) + self.alias_priority = kwargs.pop('alias_priority', 2 if self.alias is not None else None) + self.title = kwargs.pop('title', None) + self.description = kwargs.pop('description', None) + self.exclude = kwargs.pop('exclude', None) + self.include = kwargs.pop('include', None) + self.const = kwargs.pop('const', None) + self.gt = kwargs.pop('gt', None) + self.ge = kwargs.pop('ge', None) + self.lt = kwargs.pop('lt', None) + self.le = kwargs.pop('le', None) + self.multiple_of = kwargs.pop('multiple_of', None) + self.allow_inf_nan = kwargs.pop('allow_inf_nan', None) + self.max_digits = kwargs.pop('max_digits', None) + self.decimal_places = kwargs.pop('decimal_places', None) + self.min_items = kwargs.pop('min_items', None) + self.max_items = kwargs.pop('max_items', None) + self.unique_items = kwargs.pop('unique_items', None) + self.min_length = kwargs.pop('min_length', None) + self.max_length = kwargs.pop('max_length', None) + self.allow_mutation = kwargs.pop('allow_mutation', True) + self.regex = kwargs.pop('regex', None) + self.discriminator = kwargs.pop('discriminator', None) + self.repr = kwargs.pop('repr', True) + self.extra = kwargs + + def __repr_args__(self) -> 'ReprArgs': + + field_defaults_to_hide: Dict[str, Any] = { + 'repr': True, + **self.__field_constraints__, + } + + attrs = ((s, getattr(self, s)) for s in self.__slots__) + return [(a, v) for a, v in attrs if v != field_defaults_to_hide.get(a, None)] + + def get_constraints(self) -> Set[str]: + """ + Gets the constraints set on the field by comparing the constraint value with its default value + + :return: the constraints set on field_info + """ + return {attr for attr, default in self.__field_constraints__.items() if getattr(self, attr) != default} + + def update_from_config(self, from_config: Dict[str, Any]) -> None: + """ + Update this FieldInfo based on a dict from get_field_info, only fields which have not been set are dated. + """ + for attr_name, value in from_config.items(): + try: + current_value = getattr(self, attr_name) + except AttributeError: + # attr_name is not an attribute of FieldInfo, it should therefore be added to extra + # (except if extra already has this value!) + self.extra.setdefault(attr_name, value) + else: + if current_value is self.__field_constraints__.get(attr_name, None): + setattr(self, attr_name, value) + elif attr_name == 'exclude': + self.exclude = ValueItems.merge(value, current_value) + elif attr_name == 'include': + self.include = ValueItems.merge(value, current_value, intersect=True) + + def _validate(self) -> None: + if self.default is not Undefined and self.default_factory is not None: + raise ValueError('cannot specify both default and default_factory') + + +def Field( + default: Any = Undefined, + *, + default_factory: Optional[NoArgAnyCallable] = None, + alias: str = None, + title: str = None, + description: str = None, + exclude: Union['AbstractSetIntStr', 'MappingIntStrAny', Any] = None, + include: Union['AbstractSetIntStr', 'MappingIntStrAny', Any] = None, + const: bool = None, + gt: float = None, + ge: float = None, + lt: float = None, + le: float = None, + multiple_of: float = None, + allow_inf_nan: bool = None, + max_digits: int = None, + decimal_places: int = None, + min_items: int = None, + max_items: int = None, + unique_items: bool = None, + min_length: int = None, + max_length: int = None, + allow_mutation: bool = True, + regex: str = None, + discriminator: str = None, + repr: bool = True, + **extra: Any, +) -> Any: + """ + Used to provide extra information about a field, either for the model schema or complex validation. Some arguments + apply only to number fields (``int``, ``float``, ``Decimal``) and some apply only to ``str``. + + :param default: since this is replacing the field’s default, its first argument is used + to set the default, use ellipsis (``...``) to indicate the field is required + :param default_factory: callable that will be called when a default value is needed for this field + If both `default` and `default_factory` are set, an error is raised. + :param alias: the public name of the field + :param title: can be any string, used in the schema + :param description: can be any string, used in the schema + :param exclude: exclude this field while dumping. + Takes same values as the ``include`` and ``exclude`` arguments on the ``.dict`` method. + :param include: include this field while dumping. + Takes same values as the ``include`` and ``exclude`` arguments on the ``.dict`` method. + :param const: this field is required and *must* take it's default value + :param gt: only applies to numbers, requires the field to be "greater than". The schema + will have an ``exclusiveMinimum`` validation keyword + :param ge: only applies to numbers, requires the field to be "greater than or equal to". The + schema will have a ``minimum`` validation keyword + :param lt: only applies to numbers, requires the field to be "less than". The schema + will have an ``exclusiveMaximum`` validation keyword + :param le: only applies to numbers, requires the field to be "less than or equal to". The + schema will have a ``maximum`` validation keyword + :param multiple_of: only applies to numbers, requires the field to be "a multiple of". The + schema will have a ``multipleOf`` validation keyword + :param allow_inf_nan: only applies to numbers, allows the field to be NaN or infinity (+inf or -inf), + which is a valid Python float. Default True, set to False for compatibility with JSON. + :param max_digits: only applies to Decimals, requires the field to have a maximum number + of digits within the decimal. It does not include a zero before the decimal point or trailing decimal zeroes. + :param decimal_places: only applies to Decimals, requires the field to have at most a number of decimal places + allowed. It does not include trailing decimal zeroes. + :param min_items: only applies to lists, requires the field to have a minimum number of + elements. The schema will have a ``minItems`` validation keyword + :param max_items: only applies to lists, requires the field to have a maximum number of + elements. The schema will have a ``maxItems`` validation keyword + :param unique_items: only applies to lists, requires the field not to have duplicated + elements. The schema will have a ``uniqueItems`` validation keyword + :param min_length: only applies to strings, requires the field to have a minimum length. The + schema will have a ``maximum`` validation keyword + :param max_length: only applies to strings, requires the field to have a maximum length. The + schema will have a ``maxLength`` validation keyword + :param allow_mutation: a boolean which defaults to True. When False, the field raises a TypeError if the field is + assigned on an instance. The BaseModel Config must set validate_assignment to True + :param regex: only applies to strings, requires the field match against a regular expression + pattern string. The schema will have a ``pattern`` validation keyword + :param discriminator: only useful with a (discriminated a.k.a. tagged) `Union` of sub models with a common field. + The `discriminator` is the name of this common field to shorten validation and improve generated schema + :param repr: show this field in the representation + :param **extra: any additional keyword arguments will be added as is to the schema + """ + field_info = FieldInfo( + default, + default_factory=default_factory, + alias=alias, + title=title, + description=description, + exclude=exclude, + include=include, + const=const, + gt=gt, + ge=ge, + lt=lt, + le=le, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + min_items=min_items, + max_items=max_items, + unique_items=unique_items, + min_length=min_length, + max_length=max_length, + allow_mutation=allow_mutation, + regex=regex, + discriminator=discriminator, + repr=repr, + **extra, + ) + field_info._validate() + return field_info + + +# used to be an enum but changed to int's for small performance improvement as less access overhead +SHAPE_SINGLETON = 1 +SHAPE_LIST = 2 +SHAPE_SET = 3 +SHAPE_MAPPING = 4 +SHAPE_TUPLE = 5 +SHAPE_TUPLE_ELLIPSIS = 6 +SHAPE_SEQUENCE = 7 +SHAPE_FROZENSET = 8 +SHAPE_ITERABLE = 9 +SHAPE_GENERIC = 10 +SHAPE_DEQUE = 11 +SHAPE_DICT = 12 +SHAPE_DEFAULTDICT = 13 +SHAPE_COUNTER = 14 +SHAPE_NAME_LOOKUP = { + SHAPE_LIST: 'List[{}]', + SHAPE_SET: 'Set[{}]', + SHAPE_TUPLE_ELLIPSIS: 'Tuple[{}, ...]', + SHAPE_SEQUENCE: 'Sequence[{}]', + SHAPE_FROZENSET: 'FrozenSet[{}]', + SHAPE_ITERABLE: 'Iterable[{}]', + SHAPE_DEQUE: 'Deque[{}]', + SHAPE_DICT: 'Dict[{}]', + SHAPE_DEFAULTDICT: 'DefaultDict[{}]', + SHAPE_COUNTER: 'Counter[{}]', +} + +MAPPING_LIKE_SHAPES: Set[int] = {SHAPE_DEFAULTDICT, SHAPE_DICT, SHAPE_MAPPING, SHAPE_COUNTER} + + +class ModelField(Representation): + __slots__ = ( + 'type_', + 'outer_type_', + 'annotation', + 'sub_fields', + 'sub_fields_mapping', + 'key_field', + 'validators', + 'pre_validators', + 'post_validators', + 'default', + 'default_factory', + 'required', + 'final', + 'model_config', + 'name', + 'alias', + 'has_alias', + 'field_info', + 'discriminator_key', + 'discriminator_alias', + 'validate_always', + 'allow_none', + 'shape', + 'class_validators', + 'parse_json', + ) + + def __init__( + self, + *, + name: str, + type_: Type[Any], + class_validators: Optional[Dict[str, Validator]], + model_config: Type['BaseConfig'], + default: Any = None, + default_factory: Optional[NoArgAnyCallable] = None, + required: 'BoolUndefined' = Undefined, + final: bool = False, + alias: str = None, + field_info: Optional[FieldInfo] = None, + ) -> None: + + self.name: str = name + self.has_alias: bool = alias is not None + self.alias: str = alias if alias is not None else name + self.annotation = type_ + self.type_: Any = convert_generics(type_) + self.outer_type_: Any = type_ + self.class_validators = class_validators or {} + self.default: Any = default + self.default_factory: Optional[NoArgAnyCallable] = default_factory + self.required: 'BoolUndefined' = required + self.final: bool = final + self.model_config = model_config + self.field_info: FieldInfo = field_info or FieldInfo(default) + self.discriminator_key: Optional[str] = self.field_info.discriminator + self.discriminator_alias: Optional[str] = self.discriminator_key + + self.allow_none: bool = False + self.validate_always: bool = False + self.sub_fields: Optional[List[ModelField]] = None + self.sub_fields_mapping: Optional[Dict[str, 'ModelField']] = None # used for discriminated union + self.key_field: Optional[ModelField] = None + self.validators: 'ValidatorsList' = [] + self.pre_validators: Optional['ValidatorsList'] = None + self.post_validators: Optional['ValidatorsList'] = None + self.parse_json: bool = False + self.shape: int = SHAPE_SINGLETON + self.model_config.prepare_field(self) + self.prepare() + + def get_default(self) -> Any: + return smart_deepcopy(self.default) if self.default_factory is None else self.default_factory() + + @staticmethod + def _get_field_info( + field_name: str, annotation: Any, value: Any, config: Type['BaseConfig'] + ) -> Tuple[FieldInfo, Any]: + """ + Get a FieldInfo from a root typing.Annotated annotation, value, or config default. + + The FieldInfo may be set in typing.Annotated or the value, but not both. If neither contain + a FieldInfo, a new one will be created using the config. + + :param field_name: name of the field for use in error messages + :param annotation: a type hint such as `str` or `Annotated[str, Field(..., min_length=5)]` + :param value: the field's assigned value + :param config: the model's config object + :return: the FieldInfo contained in the `annotation`, the value, or a new one from the config. + """ + field_info_from_config = config.get_field_info(field_name) + + field_info = None + if get_origin(annotation) is Annotated: + field_infos = [arg for arg in get_args(annotation)[1:] if isinstance(arg, FieldInfo)] + if len(field_infos) > 1: + raise ValueError(f'cannot specify multiple `Annotated` `Field`s for {field_name!r}') + field_info = next(iter(field_infos), None) + if field_info is not None: + field_info = copy.copy(field_info) + field_info.update_from_config(field_info_from_config) + if field_info.default not in (Undefined, Required): + raise ValueError(f'`Field` default cannot be set in `Annotated` for {field_name!r}') + if value is not Undefined and value is not Required: + # check also `Required` because of `validate_arguments` that sets `...` as default value + field_info.default = value + + if isinstance(value, FieldInfo): + if field_info is not None: + raise ValueError(f'cannot specify `Annotated` and value `Field`s together for {field_name!r}') + field_info = value + field_info.update_from_config(field_info_from_config) + elif field_info is None: + field_info = FieldInfo(value, **field_info_from_config) + value = None if field_info.default_factory is not None else field_info.default + field_info._validate() + return field_info, value + + @classmethod + def infer( + cls, + *, + name: str, + value: Any, + annotation: Any, + class_validators: Optional[Dict[str, Validator]], + config: Type['BaseConfig'], + ) -> 'ModelField': + from .schema import get_annotation_from_field_info + + field_info, value = cls._get_field_info(name, annotation, value, config) + required: 'BoolUndefined' = Undefined + if value is Required: + required = True + value = None + elif value is not Undefined: + required = False + annotation = get_annotation_from_field_info(annotation, field_info, name, config.validate_assignment) + + return cls( + name=name, + type_=annotation, + alias=field_info.alias, + class_validators=class_validators, + default=value, + default_factory=field_info.default_factory, + required=required, + model_config=config, + field_info=field_info, + ) + + def set_config(self, config: Type['BaseConfig']) -> None: + self.model_config = config + info_from_config = config.get_field_info(self.name) + config.prepare_field(self) + new_alias = info_from_config.get('alias') + new_alias_priority = info_from_config.get('alias_priority') or 0 + if new_alias and new_alias_priority >= (self.field_info.alias_priority or 0): + self.field_info.alias = new_alias + self.field_info.alias_priority = new_alias_priority + self.alias = new_alias + new_exclude = info_from_config.get('exclude') + if new_exclude is not None: + self.field_info.exclude = ValueItems.merge(self.field_info.exclude, new_exclude) + new_include = info_from_config.get('include') + if new_include is not None: + self.field_info.include = ValueItems.merge(self.field_info.include, new_include, intersect=True) + + @property + def alt_alias(self) -> bool: + return self.name != self.alias + + def prepare(self) -> None: + """ + Prepare the field but inspecting self.default, self.type_ etc. + + Note: this method is **not** idempotent (because _type_analysis is not idempotent), + e.g. calling it it multiple times may modify the field and configure it incorrectly. + """ + self._set_default_and_type() + if self.type_.__class__ is ForwardRef or self.type_.__class__ is DeferredType: + # self.type_ is currently a ForwardRef and there's nothing we can do now, + # user will need to call model.update_forward_refs() + return + + self._type_analysis() + if self.required is Undefined: + self.required = True + if self.default is Undefined and self.default_factory is None: + self.default = None + self.populate_validators() + + def _set_default_and_type(self) -> None: + """ + Set the default value, infer the type if needed and check if `None` value is valid. + """ + if self.default_factory is not None: + if self.type_ is Undefined: + raise errors_.ConfigError( + f'you need to set the type of field {self.name!r} when using `default_factory`' + ) + return + + default_value = self.get_default() + + if default_value is not None and self.type_ is Undefined: + self.type_ = default_value.__class__ + self.outer_type_ = self.type_ + self.annotation = self.type_ + + if self.type_ is Undefined: + raise errors_.ConfigError(f'unable to infer type for attribute "{self.name}"') + + if self.required is False and default_value is None: + self.allow_none = True + + def _type_analysis(self) -> None: # noqa: C901 (ignore complexity) + # typing interface is horrible, we have to do some ugly checks + if lenient_issubclass(self.type_, JsonWrapper): + self.type_ = self.type_.inner_type + self.parse_json = True + elif lenient_issubclass(self.type_, Json): + self.type_ = Any + self.parse_json = True + elif isinstance(self.type_, TypeVar): + if self.type_.__bound__: + self.type_ = self.type_.__bound__ + elif self.type_.__constraints__: + self.type_ = Union[self.type_.__constraints__] + else: + self.type_ = Any + elif is_new_type(self.type_): + self.type_ = new_type_supertype(self.type_) + + if self.type_ is Any or self.type_ is object: + if self.required is Undefined: + self.required = False + self.allow_none = True + return + elif self.type_ is Pattern or self.type_ is re.Pattern: + # python 3.7 only, Pattern is a typing object but without sub fields + return + elif is_literal_type(self.type_): + return + elif is_typeddict(self.type_): + return + + if is_finalvar(self.type_): + self.final = True + + if self.type_ is Final: + self.type_ = Any + else: + self.type_ = get_args(self.type_)[0] + + self._type_analysis() + return + + origin = get_origin(self.type_) + + if origin is Annotated or is_typeddict_special(origin): + self.type_ = get_args(self.type_)[0] + self._type_analysis() + return + + if self.discriminator_key is not None and not is_union(origin): + raise TypeError('`discriminator` can only be used with `Union` type with more than one variant') + + # add extra check for `collections.abc.Hashable` for python 3.10+ where origin is not `None` + if origin is None or origin is CollectionsHashable: + # field is not "typing" object eg. Union, Dict, List etc. + # allow None for virtual superclasses of NoneType, e.g. Hashable + if isinstance(self.type_, type) and isinstance(None, self.type_): + self.allow_none = True + return + elif origin is Callable: + return + elif is_union(origin): + types_ = [] + for type_ in get_args(self.type_): + if is_none_type(type_) or type_ is Any or type_ is object: + if self.required is Undefined: + self.required = False + self.allow_none = True + if is_none_type(type_): + continue + types_.append(type_) + + if len(types_) == 1: + # Optional[] + self.type_ = types_[0] + # this is the one case where the "outer type" isn't just the original type + self.outer_type_ = self.type_ + # re-run to correctly interpret the new self.type_ + self._type_analysis() + else: + self.sub_fields = [self._create_sub_type(t, f'{self.name}_{display_as_type(t)}') for t in types_] + + if self.discriminator_key is not None: + self.prepare_discriminated_union_sub_fields() + return + elif issubclass(origin, Tuple): # type: ignore + # origin == Tuple without item type + args = get_args(self.type_) + if not args: # plain tuple + self.type_ = Any + self.shape = SHAPE_TUPLE_ELLIPSIS + elif len(args) == 2 and args[1] is Ellipsis: # e.g. Tuple[int, ...] + self.type_ = args[0] + self.shape = SHAPE_TUPLE_ELLIPSIS + self.sub_fields = [self._create_sub_type(args[0], f'{self.name}_0')] + elif args == ((),): # Tuple[()] means empty tuple + self.shape = SHAPE_TUPLE + self.type_ = Any + self.sub_fields = [] + else: + self.shape = SHAPE_TUPLE + self.sub_fields = [self._create_sub_type(t, f'{self.name}_{i}') for i, t in enumerate(args)] + return + elif issubclass(origin, List): + # Create self validators + get_validators = getattr(self.type_, '__get_validators__', None) + if get_validators: + self.class_validators.update( + {f'list_{i}': Validator(validator, pre=True) for i, validator in enumerate(get_validators())} + ) + + self.type_ = get_args(self.type_)[0] + self.shape = SHAPE_LIST + elif issubclass(origin, Set): + # Create self validators + get_validators = getattr(self.type_, '__get_validators__', None) + if get_validators: + self.class_validators.update( + {f'set_{i}': Validator(validator, pre=True) for i, validator in enumerate(get_validators())} + ) + + self.type_ = get_args(self.type_)[0] + self.shape = SHAPE_SET + elif issubclass(origin, FrozenSet): + # Create self validators + get_validators = getattr(self.type_, '__get_validators__', None) + if get_validators: + self.class_validators.update( + {f'frozenset_{i}': Validator(validator, pre=True) for i, validator in enumerate(get_validators())} + ) + + self.type_ = get_args(self.type_)[0] + self.shape = SHAPE_FROZENSET + elif issubclass(origin, Deque): + self.type_ = get_args(self.type_)[0] + self.shape = SHAPE_DEQUE + elif issubclass(origin, Sequence): + self.type_ = get_args(self.type_)[0] + self.shape = SHAPE_SEQUENCE + # priority to most common mapping: dict + elif origin is dict or origin is Dict: + self.key_field = self._create_sub_type(get_args(self.type_)[0], 'key_' + self.name, for_keys=True) + self.type_ = get_args(self.type_)[1] + self.shape = SHAPE_DICT + elif issubclass(origin, DefaultDict): + self.key_field = self._create_sub_type(get_args(self.type_)[0], 'key_' + self.name, for_keys=True) + self.type_ = get_args(self.type_)[1] + self.shape = SHAPE_DEFAULTDICT + elif issubclass(origin, Counter): + self.key_field = self._create_sub_type(get_args(self.type_)[0], 'key_' + self.name, for_keys=True) + self.type_ = int + self.shape = SHAPE_COUNTER + elif issubclass(origin, Mapping): + self.key_field = self._create_sub_type(get_args(self.type_)[0], 'key_' + self.name, for_keys=True) + self.type_ = get_args(self.type_)[1] + self.shape = SHAPE_MAPPING + # Equality check as almost everything inherits form Iterable, including str + # check for Iterable and CollectionsIterable, as it could receive one even when declared with the other + elif origin in {Iterable, CollectionsIterable}: + self.type_ = get_args(self.type_)[0] + self.shape = SHAPE_ITERABLE + self.sub_fields = [self._create_sub_type(self.type_, f'{self.name}_type')] + elif issubclass(origin, Type): # type: ignore + return + elif hasattr(origin, '__get_validators__') or self.model_config.arbitrary_types_allowed: + # Is a Pydantic-compatible generic that handles itself + # or we have arbitrary_types_allowed = True + self.shape = SHAPE_GENERIC + self.sub_fields = [self._create_sub_type(t, f'{self.name}_{i}') for i, t in enumerate(get_args(self.type_))] + self.type_ = origin + return + else: + raise TypeError(f'Fields of type "{origin}" are not supported.') + + # type_ has been refined eg. as the type of a List and sub_fields needs to be populated + self.sub_fields = [self._create_sub_type(self.type_, '_' + self.name)] + + def prepare_discriminated_union_sub_fields(self) -> None: + """ + Prepare the mapping -> and update `sub_fields` + Note that this process can be aborted if a `ForwardRef` is encountered + """ + assert self.discriminator_key is not None + + if self.type_.__class__ is DeferredType: + return + + assert self.sub_fields is not None + sub_fields_mapping: Dict[str, 'ModelField'] = {} + all_aliases: Set[str] = set() + + for sub_field in self.sub_fields: + t = sub_field.type_ + if t.__class__ is ForwardRef: + # Stopping everything...will need to call `update_forward_refs` + return + + alias, discriminator_values = get_discriminator_alias_and_values(t, self.discriminator_key) + all_aliases.add(alias) + for discriminator_value in discriminator_values: + sub_fields_mapping[discriminator_value] = sub_field + + self.sub_fields_mapping = sub_fields_mapping + self.discriminator_alias = get_unique_discriminator_alias(all_aliases, self.discriminator_key) + + def _create_sub_type(self, type_: Type[Any], name: str, *, for_keys: bool = False) -> 'ModelField': + if for_keys: + class_validators = None + else: + # validators for sub items should not have `each_item` as we want to check only the first sublevel + class_validators = { + k: Validator( + func=v.func, + pre=v.pre, + each_item=False, + always=v.always, + check_fields=v.check_fields, + skip_on_failure=v.skip_on_failure, + ) + for k, v in self.class_validators.items() + if v.each_item + } + + field_info, _ = self._get_field_info(name, type_, None, self.model_config) + + return self.__class__( + type_=type_, + name=name, + class_validators=class_validators, + model_config=self.model_config, + field_info=field_info, + ) + + def populate_validators(self) -> None: + """ + Prepare self.pre_validators, self.validators, and self.post_validators based on self.type_'s __get_validators__ + and class validators. This method should be idempotent, e.g. it should be safe to call multiple times + without mis-configuring the field. + """ + self.validate_always = getattr(self.type_, 'validate_always', False) or any( + v.always for v in self.class_validators.values() + ) + + class_validators_ = self.class_validators.values() + if not self.sub_fields or self.shape == SHAPE_GENERIC: + get_validators = getattr(self.type_, '__get_validators__', None) + v_funcs = ( + *[v.func for v in class_validators_ if v.each_item and v.pre], + *(get_validators() if get_validators else list(find_validators(self.type_, self.model_config))), + *[v.func for v in class_validators_ if v.each_item and not v.pre], + ) + self.validators = prep_validators(v_funcs) + + self.pre_validators = [] + self.post_validators = [] + + if self.field_info and self.field_info.const: + self.post_validators.append(make_generic_validator(constant_validator)) + + if class_validators_: + self.pre_validators += prep_validators(v.func for v in class_validators_ if not v.each_item and v.pre) + self.post_validators += prep_validators(v.func for v in class_validators_ if not v.each_item and not v.pre) + + if self.parse_json: + self.pre_validators.append(make_generic_validator(validate_json)) + + self.pre_validators = self.pre_validators or None + self.post_validators = self.post_validators or None + + def validate( + self, v: Any, values: Dict[str, Any], *, loc: 'LocStr', cls: Optional['ModelOrDc'] = None + ) -> 'ValidateReturn': + + assert self.type_.__class__ is not DeferredType + + if self.type_.__class__ is ForwardRef: + assert cls is not None + raise ConfigError( + f'field "{self.name}" not yet prepared so type is still a ForwardRef, ' + f'you might need to call {cls.__name__}.update_forward_refs().' + ) + + errors: Optional['ErrorList'] + if self.pre_validators: + v, errors = self._apply_validators(v, values, loc, cls, self.pre_validators) + if errors: + return v, errors + + if v is None: + if is_none_type(self.type_): + # keep validating + pass + elif self.allow_none: + if self.post_validators: + return self._apply_validators(v, values, loc, cls, self.post_validators) + else: + return None, None + else: + return v, ErrorWrapper(NoneIsNotAllowedError(), loc) + + if self.shape == SHAPE_SINGLETON: + v, errors = self._validate_singleton(v, values, loc, cls) + elif self.shape in MAPPING_LIKE_SHAPES: + v, errors = self._validate_mapping_like(v, values, loc, cls) + elif self.shape == SHAPE_TUPLE: + v, errors = self._validate_tuple(v, values, loc, cls) + elif self.shape == SHAPE_ITERABLE: + v, errors = self._validate_iterable(v, values, loc, cls) + elif self.shape == SHAPE_GENERIC: + v, errors = self._apply_validators(v, values, loc, cls, self.validators) + else: + # sequence, list, set, generator, tuple with ellipsis, frozen set + v, errors = self._validate_sequence_like(v, values, loc, cls) + + if not errors and self.post_validators: + v, errors = self._apply_validators(v, values, loc, cls, self.post_validators) + return v, errors + + def _validate_sequence_like( # noqa: C901 (ignore complexity) + self, v: Any, values: Dict[str, Any], loc: 'LocStr', cls: Optional['ModelOrDc'] + ) -> 'ValidateReturn': + """ + Validate sequence-like containers: lists, tuples, sets and generators + Note that large if-else blocks are necessary to enable Cython + optimization, which is why we disable the complexity check above. + """ + if not sequence_like(v): + e: errors_.PydanticTypeError + if self.shape == SHAPE_LIST: + e = errors_.ListError() + elif self.shape in (SHAPE_TUPLE, SHAPE_TUPLE_ELLIPSIS): + e = errors_.TupleError() + elif self.shape == SHAPE_SET: + e = errors_.SetError() + elif self.shape == SHAPE_FROZENSET: + e = errors_.FrozenSetError() + else: + e = errors_.SequenceError() + return v, ErrorWrapper(e, loc) + + loc = loc if isinstance(loc, tuple) else (loc,) + result = [] + errors: List[ErrorList] = [] + for i, v_ in enumerate(v): + v_loc = *loc, i + r, ee = self._validate_singleton(v_, values, v_loc, cls) + if ee: + errors.append(ee) + else: + result.append(r) + + if errors: + return v, errors + + converted: Union[List[Any], Set[Any], FrozenSet[Any], Tuple[Any, ...], Iterator[Any], Deque[Any]] = result + + if self.shape == SHAPE_SET: + converted = set(result) + elif self.shape == SHAPE_FROZENSET: + converted = frozenset(result) + elif self.shape == SHAPE_TUPLE_ELLIPSIS: + converted = tuple(result) + elif self.shape == SHAPE_DEQUE: + converted = deque(result) + elif self.shape == SHAPE_SEQUENCE: + if isinstance(v, tuple): + converted = tuple(result) + elif isinstance(v, set): + converted = set(result) + elif isinstance(v, Generator): + converted = iter(result) + elif isinstance(v, deque): + converted = deque(result) + return converted, None + + def _validate_iterable( + self, v: Any, values: Dict[str, Any], loc: 'LocStr', cls: Optional['ModelOrDc'] + ) -> 'ValidateReturn': + """ + Validate Iterables. + + This intentionally doesn't validate values to allow infinite generators. + """ + + try: + iterable = iter(v) + except TypeError: + return v, ErrorWrapper(errors_.IterableError(), loc) + return iterable, None + + def _validate_tuple( + self, v: Any, values: Dict[str, Any], loc: 'LocStr', cls: Optional['ModelOrDc'] + ) -> 'ValidateReturn': + e: Optional[Exception] = None + if not sequence_like(v): + e = errors_.TupleError() + else: + actual_length, expected_length = len(v), len(self.sub_fields) # type: ignore + if actual_length != expected_length: + e = errors_.TupleLengthError(actual_length=actual_length, expected_length=expected_length) + + if e: + return v, ErrorWrapper(e, loc) + + loc = loc if isinstance(loc, tuple) else (loc,) + result = [] + errors: List[ErrorList] = [] + for i, (v_, field) in enumerate(zip(v, self.sub_fields)): # type: ignore + v_loc = *loc, i + r, ee = field.validate(v_, values, loc=v_loc, cls=cls) + if ee: + errors.append(ee) + else: + result.append(r) + + if errors: + return v, errors + else: + return tuple(result), None + + def _validate_mapping_like( + self, v: Any, values: Dict[str, Any], loc: 'LocStr', cls: Optional['ModelOrDc'] + ) -> 'ValidateReturn': + try: + v_iter = dict_validator(v) + except TypeError as exc: + return v, ErrorWrapper(exc, loc) + + loc = loc if isinstance(loc, tuple) else (loc,) + result, errors = {}, [] + for k, v_ in v_iter.items(): + v_loc = *loc, '__key__' + key_result, key_errors = self.key_field.validate(k, values, loc=v_loc, cls=cls) # type: ignore + if key_errors: + errors.append(key_errors) + continue + + v_loc = *loc, k + value_result, value_errors = self._validate_singleton(v_, values, v_loc, cls) + if value_errors: + errors.append(value_errors) + continue + + result[key_result] = value_result + if errors: + return v, errors + elif self.shape == SHAPE_DICT: + return result, None + elif self.shape == SHAPE_DEFAULTDICT: + return defaultdict(self.type_, result), None + elif self.shape == SHAPE_COUNTER: + return CollectionCounter(result), None + else: + return self._get_mapping_value(v, result), None + + def _get_mapping_value(self, original: T, converted: Dict[Any, Any]) -> Union[T, Dict[Any, Any]]: + """ + When type is `Mapping[KT, KV]` (or another unsupported mapping), we try to avoid + coercing to `dict` unwillingly. + """ + original_cls = original.__class__ + + if original_cls == dict or original_cls == Dict: + return converted + elif original_cls in {defaultdict, DefaultDict}: + return defaultdict(self.type_, converted) + else: + try: + # Counter, OrderedDict, UserDict, ... + return original_cls(converted) # type: ignore + except TypeError: + raise RuntimeError(f'Could not convert dictionary to {original_cls.__name__!r}') from None + + def _validate_singleton( + self, v: Any, values: Dict[str, Any], loc: 'LocStr', cls: Optional['ModelOrDc'] + ) -> 'ValidateReturn': + if self.sub_fields: + if self.discriminator_key is not None: + return self._validate_discriminated_union(v, values, loc, cls) + + errors = [] + + if self.model_config.smart_union and is_union(get_origin(self.type_)): + # 1st pass: check if the value is an exact instance of one of the Union types + # (e.g. to avoid coercing a bool into an int) + for field in self.sub_fields: + if v.__class__ is field.outer_type_: + return v, None + + # 2nd pass: check if the value is an instance of any subclass of the Union types + for field in self.sub_fields: + # This whole logic will be improved later on to support more complex `isinstance` checks + # It will probably be done once a strict mode is added and be something like: + # ``` + # value, error = field.validate(v, values, strict=True) + # if error is None: + # return value, None + # ``` + try: + if isinstance(v, field.outer_type_): + return v, None + except TypeError: + # compound type + if lenient_isinstance(v, get_origin(field.outer_type_)): + value, error = field.validate(v, values, loc=loc, cls=cls) + if not error: + return value, None + + # 1st pass by default or 3rd pass with `smart_union` enabled: + # check if the value can be coerced into one of the Union types + for field in self.sub_fields: + value, error = field.validate(v, values, loc=loc, cls=cls) + if error: + errors.append(error) + else: + return value, None + return v, errors + else: + return self._apply_validators(v, values, loc, cls, self.validators) + + def _validate_discriminated_union( + self, v: Any, values: Dict[str, Any], loc: 'LocStr', cls: Optional['ModelOrDc'] + ) -> 'ValidateReturn': + assert self.discriminator_key is not None + assert self.discriminator_alias is not None + + try: + discriminator_value = v[self.discriminator_alias] + except KeyError: + return v, ErrorWrapper(MissingDiscriminator(discriminator_key=self.discriminator_key), loc) + except TypeError: + try: + # BaseModel or dataclass + discriminator_value = getattr(v, self.discriminator_key) + except (AttributeError, TypeError): + return v, ErrorWrapper(MissingDiscriminator(discriminator_key=self.discriminator_key), loc) + + try: + sub_field = self.sub_fields_mapping[discriminator_value] # type: ignore[index] + except TypeError: + assert cls is not None + raise ConfigError( + f'field "{self.name}" not yet prepared so type is still a ForwardRef, ' + f'you might need to call {cls.__name__}.update_forward_refs().' + ) + except KeyError: + assert self.sub_fields_mapping is not None + return v, ErrorWrapper( + InvalidDiscriminator( + discriminator_key=self.discriminator_key, + discriminator_value=discriminator_value, + allowed_values=list(self.sub_fields_mapping), + ), + loc, + ) + else: + if not isinstance(loc, tuple): + loc = (loc,) + return sub_field.validate(v, values, loc=(*loc, display_as_type(sub_field.type_)), cls=cls) + + def _apply_validators( + self, v: Any, values: Dict[str, Any], loc: 'LocStr', cls: Optional['ModelOrDc'], validators: 'ValidatorsList' + ) -> 'ValidateReturn': + for validator in validators: + try: + v = validator(cls, v, values, self, self.model_config) + except (ValueError, TypeError, AssertionError) as exc: + return v, ErrorWrapper(exc, loc) + return v, None + + def is_complex(self) -> bool: + """ + Whether the field is "complex" eg. env variables should be parsed as JSON. + """ + from .main import BaseModel + + return ( + self.shape != SHAPE_SINGLETON + or hasattr(self.type_, '__pydantic_model__') + or lenient_issubclass(self.type_, (BaseModel, list, set, frozenset, dict)) + ) + + def _type_display(self) -> PyObjectStr: + t = display_as_type(self.type_) + + if self.shape in MAPPING_LIKE_SHAPES: + t = f'Mapping[{display_as_type(self.key_field.type_)}, {t}]' # type: ignore + elif self.shape == SHAPE_TUPLE: + t = 'Tuple[{}]'.format(', '.join(display_as_type(f.type_) for f in self.sub_fields)) # type: ignore + elif self.shape == SHAPE_GENERIC: + assert self.sub_fields + t = '{}[{}]'.format( + display_as_type(self.type_), ', '.join(display_as_type(f.type_) for f in self.sub_fields) + ) + elif self.shape != SHAPE_SINGLETON: + t = SHAPE_NAME_LOOKUP[self.shape].format(t) + + if self.allow_none and (self.shape != SHAPE_SINGLETON or not self.sub_fields): + t = f'Optional[{t}]' + return PyObjectStr(t) + + def __repr_args__(self) -> 'ReprArgs': + args = [('name', self.name), ('type', self._type_display()), ('required', self.required)] + + if not self.required: + if self.default_factory is not None: + args.append(('default_factory', f'')) + else: + args.append(('default', self.default)) + + if self.alt_alias: + args.append(('alias', self.alias)) + return args + + +class ModelPrivateAttr(Representation): + __slots__ = ('default', 'default_factory') + + def __init__(self, default: Any = Undefined, *, default_factory: Optional[NoArgAnyCallable] = None) -> None: + self.default = default + self.default_factory = default_factory + + def get_default(self) -> Any: + return smart_deepcopy(self.default) if self.default_factory is None else self.default_factory() + + def __eq__(self, other: Any) -> bool: + return isinstance(other, self.__class__) and (self.default, self.default_factory) == ( + other.default, + other.default_factory, + ) + + +def PrivateAttr( + default: Any = Undefined, + *, + default_factory: Optional[NoArgAnyCallable] = None, +) -> Any: + """ + Indicates that attribute is only used internally and never mixed with regular fields. + + Types or values of private attrs are not checked by pydantic and it's up to you to keep them relevant. + + Private attrs are stored in model __slots__. + + :param default: the attribute’s default value + :param default_factory: callable that will be called when a default value is needed for this attribute + If both `default` and `default_factory` are set, an error is raised. + """ + if default is not Undefined and default_factory is not None: + raise ValueError('cannot specify both default and default_factory') + + return ModelPrivateAttr( + default, + default_factory=default_factory, + ) + + +class DeferredType: + """ + Used to postpone field preparation, while creating recursive generic models. + """ + + +def is_finalvar_with_default_val(type_: Type[Any], val: Any) -> bool: + return is_finalvar(type_) and val is not Undefined and not isinstance(val, FieldInfo) diff --git a/libs/win/pydantic/generics.py b/libs/win/pydantic/generics.py new file mode 100644 index 00000000..a3f52bfe --- /dev/null +++ b/libs/win/pydantic/generics.py @@ -0,0 +1,364 @@ +import sys +import typing +from typing import ( + TYPE_CHECKING, + Any, + ClassVar, + Dict, + Generic, + Iterator, + List, + Mapping, + Optional, + Tuple, + Type, + TypeVar, + Union, + cast, +) + +from typing_extensions import Annotated + +from .class_validators import gather_all_validators +from .fields import DeferredType +from .main import BaseModel, create_model +from .types import JsonWrapper +from .typing import display_as_type, get_all_type_hints, get_args, get_origin, typing_base +from .utils import LimitedDict, all_identical, lenient_issubclass + +GenericModelT = TypeVar('GenericModelT', bound='GenericModel') +TypeVarType = Any # since mypy doesn't allow the use of TypeVar as a type + +Parametrization = Mapping[TypeVarType, Type[Any]] + +_generic_types_cache: LimitedDict[Tuple[Type[Any], Union[Any, Tuple[Any, ...]]], Type[BaseModel]] = LimitedDict() +# _assigned_parameters is a Mapping from parametrized version of generic models to assigned types of parametrizations +# as captured during construction of the class (not instances). +# E.g., for generic model `Model[A, B]`, when parametrized model `Model[int, str]` is created, +# `Model[int, str]`: {A: int, B: str}` will be stored in `_assigned_parameters`. +# (This information is only otherwise available after creation from the class name string). +_assigned_parameters: LimitedDict[Type[Any], Parametrization] = LimitedDict() + + +class GenericModel(BaseModel): + __slots__ = () + __concrete__: ClassVar[bool] = False + + if TYPE_CHECKING: + # Putting this in a TYPE_CHECKING block allows us to replace `if Generic not in cls.__bases__` with + # `not hasattr(cls, "__parameters__")`. This means we don't need to force non-concrete subclasses of + # `GenericModel` to also inherit from `Generic`, which would require changes to the use of `create_model` below. + __parameters__: ClassVar[Tuple[TypeVarType, ...]] + + # Setting the return type as Type[Any] instead of Type[BaseModel] prevents PyCharm warnings + def __class_getitem__(cls: Type[GenericModelT], params: Union[Type[Any], Tuple[Type[Any], ...]]) -> Type[Any]: + """Instantiates a new class from a generic class `cls` and type variables `params`. + + :param params: Tuple of types the class . Given a generic class + `Model` with 2 type variables and a concrete model `Model[str, int]`, + the value `(str, int)` would be passed to `params`. + :return: New model class inheriting from `cls` with instantiated + types described by `params`. If no parameters are given, `cls` is + returned as is. + + """ + + def _cache_key(_params: Any) -> Tuple[Type[GenericModelT], Any, Tuple[Any, ...]]: + return cls, _params, get_args(_params) + + cached = _generic_types_cache.get(_cache_key(params)) + if cached is not None: + return cached + if cls.__concrete__ and Generic not in cls.__bases__: + raise TypeError('Cannot parameterize a concrete instantiation of a generic model') + if not isinstance(params, tuple): + params = (params,) + if cls is GenericModel and any(isinstance(param, TypeVar) for param in params): + raise TypeError('Type parameters should be placed on typing.Generic, not GenericModel') + if not hasattr(cls, '__parameters__'): + raise TypeError(f'Type {cls.__name__} must inherit from typing.Generic before being parameterized') + + check_parameters_count(cls, params) + # Build map from generic typevars to passed params + typevars_map: Dict[TypeVarType, Type[Any]] = dict(zip(cls.__parameters__, params)) + if all_identical(typevars_map.keys(), typevars_map.values()) and typevars_map: + return cls # if arguments are equal to parameters it's the same object + + # Create new model with original model as parent inserting fields with DeferredType. + model_name = cls.__concrete_name__(params) + validators = gather_all_validators(cls) + + type_hints = get_all_type_hints(cls).items() + instance_type_hints = {k: v for k, v in type_hints if get_origin(v) is not ClassVar} + + fields = {k: (DeferredType(), cls.__fields__[k].field_info) for k in instance_type_hints if k in cls.__fields__} + + model_module, called_globally = get_caller_frame_info() + created_model = cast( + Type[GenericModel], # casting ensures mypy is aware of the __concrete__ and __parameters__ attributes + create_model( + model_name, + __module__=model_module or cls.__module__, + __base__=(cls,) + tuple(cls.__parameterized_bases__(typevars_map)), + __config__=None, + __validators__=validators, + __cls_kwargs__=None, + **fields, + ), + ) + + _assigned_parameters[created_model] = typevars_map + + if called_globally: # create global reference and therefore allow pickling + object_by_reference = None + reference_name = model_name + reference_module_globals = sys.modules[created_model.__module__].__dict__ + while object_by_reference is not created_model: + object_by_reference = reference_module_globals.setdefault(reference_name, created_model) + reference_name += '_' + + created_model.Config = cls.Config + + # Find any typevars that are still present in the model. + # If none are left, the model is fully "concrete", otherwise the new + # class is a generic class as well taking the found typevars as + # parameters. + new_params = tuple( + {param: None for param in iter_contained_typevars(typevars_map.values())} + ) # use dict as ordered set + created_model.__concrete__ = not new_params + if new_params: + created_model.__parameters__ = new_params + + # Save created model in cache so we don't end up creating duplicate + # models that should be identical. + _generic_types_cache[_cache_key(params)] = created_model + if len(params) == 1: + _generic_types_cache[_cache_key(params[0])] = created_model + + # Recursively walk class type hints and replace generic typevars + # with concrete types that were passed. + _prepare_model_fields(created_model, fields, instance_type_hints, typevars_map) + + return created_model + + @classmethod + def __concrete_name__(cls: Type[Any], params: Tuple[Type[Any], ...]) -> str: + """Compute class name for child classes. + + :param params: Tuple of types the class . Given a generic class + `Model` with 2 type variables and a concrete model `Model[str, int]`, + the value `(str, int)` would be passed to `params`. + :return: String representing a the new class where `params` are + passed to `cls` as type variables. + + This method can be overridden to achieve a custom naming scheme for GenericModels. + """ + param_names = [display_as_type(param) for param in params] + params_component = ', '.join(param_names) + return f'{cls.__name__}[{params_component}]' + + @classmethod + def __parameterized_bases__(cls, typevars_map: Parametrization) -> Iterator[Type[Any]]: + """ + Returns unbound bases of cls parameterised to given type variables + + :param typevars_map: Dictionary of type applications for binding subclasses. + Given a generic class `Model` with 2 type variables [S, T] + and a concrete model `Model[str, int]`, + the value `{S: str, T: int}` would be passed to `typevars_map`. + :return: an iterator of generic sub classes, parameterised by `typevars_map` + and other assigned parameters of `cls` + + e.g.: + ``` + class A(GenericModel, Generic[T]): + ... + + class B(A[V], Generic[V]): + ... + + assert A[int] in B.__parameterized_bases__({V: int}) + ``` + """ + + def build_base_model( + base_model: Type[GenericModel], mapped_types: Parametrization + ) -> Iterator[Type[GenericModel]]: + base_parameters = tuple(mapped_types[param] for param in base_model.__parameters__) + parameterized_base = base_model.__class_getitem__(base_parameters) + if parameterized_base is base_model or parameterized_base is cls: + # Avoid duplication in MRO + return + yield parameterized_base + + for base_model in cls.__bases__: + if not issubclass(base_model, GenericModel): + # not a class that can be meaningfully parameterized + continue + elif not getattr(base_model, '__parameters__', None): + # base_model is "GenericModel" (and has no __parameters__) + # or + # base_model is already concrete, and will be included transitively via cls. + continue + elif cls in _assigned_parameters: + if base_model in _assigned_parameters: + # cls is partially parameterised but not from base_model + # e.g. cls = B[S], base_model = A[S] + # B[S][int] should subclass A[int], (and will be transitively via B[int]) + # but it's not viable to consistently subclass types with arbitrary construction + # So don't attempt to include A[S][int] + continue + else: # base_model not in _assigned_parameters: + # cls is partially parameterized, base_model is original generic + # e.g. cls = B[str, T], base_model = B[S, T] + # Need to determine the mapping for the base_model parameters + mapped_types: Parametrization = { + key: typevars_map.get(value, value) for key, value in _assigned_parameters[cls].items() + } + yield from build_base_model(base_model, mapped_types) + else: + # cls is base generic, so base_class has a distinct base + # can construct the Parameterised base model using typevars_map directly + yield from build_base_model(base_model, typevars_map) + + +def replace_types(type_: Any, type_map: Mapping[Any, Any]) -> Any: + """Return type with all occurrences of `type_map` keys recursively replaced with their values. + + :param type_: Any type, class or generic alias + :param type_map: Mapping from `TypeVar` instance to concrete types. + :return: New type representing the basic structure of `type_` with all + `typevar_map` keys recursively replaced. + + >>> replace_types(Tuple[str, Union[List[str], float]], {str: int}) + Tuple[int, Union[List[int], float]] + + """ + if not type_map: + return type_ + + type_args = get_args(type_) + origin_type = get_origin(type_) + + if origin_type is Annotated: + annotated_type, *annotations = type_args + return Annotated[replace_types(annotated_type, type_map), tuple(annotations)] + + # Having type args is a good indicator that this is a typing module + # class instantiation or a generic alias of some sort. + if type_args: + resolved_type_args = tuple(replace_types(arg, type_map) for arg in type_args) + if all_identical(type_args, resolved_type_args): + # If all arguments are the same, there is no need to modify the + # type or create a new object at all + return type_ + if ( + origin_type is not None + and isinstance(type_, typing_base) + and not isinstance(origin_type, typing_base) + and getattr(type_, '_name', None) is not None + ): + # In python < 3.9 generic aliases don't exist so any of these like `list`, + # `type` or `collections.abc.Callable` need to be translated. + # See: https://www.python.org/dev/peps/pep-0585 + origin_type = getattr(typing, type_._name) + assert origin_type is not None + return origin_type[resolved_type_args] + + # We handle pydantic generic models separately as they don't have the same + # semantics as "typing" classes or generic aliases + if not origin_type and lenient_issubclass(type_, GenericModel) and not type_.__concrete__: + type_args = type_.__parameters__ + resolved_type_args = tuple(replace_types(t, type_map) for t in type_args) + if all_identical(type_args, resolved_type_args): + return type_ + return type_[resolved_type_args] + + # Handle special case for typehints that can have lists as arguments. + # `typing.Callable[[int, str], int]` is an example for this. + if isinstance(type_, (List, list)): + resolved_list = list(replace_types(element, type_map) for element in type_) + if all_identical(type_, resolved_list): + return type_ + return resolved_list + + # For JsonWrapperValue, need to handle its inner type to allow correct parsing + # of generic Json arguments like Json[T] + if not origin_type and lenient_issubclass(type_, JsonWrapper): + type_.inner_type = replace_types(type_.inner_type, type_map) + return type_ + + # If all else fails, we try to resolve the type directly and otherwise just + # return the input with no modifications. + return type_map.get(type_, type_) + + +def check_parameters_count(cls: Type[GenericModel], parameters: Tuple[Any, ...]) -> None: + actual = len(parameters) + expected = len(cls.__parameters__) + if actual != expected: + description = 'many' if actual > expected else 'few' + raise TypeError(f'Too {description} parameters for {cls.__name__}; actual {actual}, expected {expected}') + + +DictValues: Type[Any] = {}.values().__class__ + + +def iter_contained_typevars(v: Any) -> Iterator[TypeVarType]: + """Recursively iterate through all subtypes and type args of `v` and yield any typevars that are found.""" + if isinstance(v, TypeVar): + yield v + elif hasattr(v, '__parameters__') and not get_origin(v) and lenient_issubclass(v, GenericModel): + yield from v.__parameters__ + elif isinstance(v, (DictValues, list)): + for var in v: + yield from iter_contained_typevars(var) + else: + args = get_args(v) + for arg in args: + yield from iter_contained_typevars(arg) + + +def get_caller_frame_info() -> Tuple[Optional[str], bool]: + """ + Used inside a function to check whether it was called globally + + Will only work against non-compiled code, therefore used only in pydantic.generics + + :returns Tuple[module_name, called_globally] + """ + try: + previous_caller_frame = sys._getframe(2) + except ValueError as e: + raise RuntimeError('This function must be used inside another function') from e + except AttributeError: # sys module does not have _getframe function, so there's nothing we can do about it + return None, False + frame_globals = previous_caller_frame.f_globals + return frame_globals.get('__name__'), previous_caller_frame.f_locals is frame_globals + + +def _prepare_model_fields( + created_model: Type[GenericModel], + fields: Mapping[str, Any], + instance_type_hints: Mapping[str, type], + typevars_map: Mapping[Any, type], +) -> None: + """ + Replace DeferredType fields with concrete type hints and prepare them. + """ + + for key, field in created_model.__fields__.items(): + if key not in fields: + assert field.type_.__class__ is not DeferredType + # https://github.com/nedbat/coveragepy/issues/198 + continue # pragma: no cover + + assert field.type_.__class__ is DeferredType, field.type_.__class__ + + field_type_hint = instance_type_hints[key] + concrete_type = replace_types(field_type_hint, typevars_map) + field.type_ = concrete_type + field.outer_type_ = concrete_type + field.prepare() + created_model.__annotations__[key] = concrete_type diff --git a/libs/win/pydantic/json.cp37-win_amd64.pyd b/libs/win/pydantic/json.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..b01a561ad61e156ddda1becf691252ca61a542cc GIT binary patch literal 69632 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 jW)iD|4}bqBH1IzG&=?GW literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/json.py b/libs/win/pydantic/json.py new file mode 100644 index 00000000..b358b850 --- /dev/null +++ b/libs/win/pydantic/json.py @@ -0,0 +1,112 @@ +import datetime +from collections import deque +from decimal import Decimal +from enum import Enum +from ipaddress import IPv4Address, IPv4Interface, IPv4Network, IPv6Address, IPv6Interface, IPv6Network +from pathlib import Path +from re import Pattern +from types import GeneratorType +from typing import Any, Callable, Dict, Type, Union +from uuid import UUID + +from .color import Color +from .networks import NameEmail +from .types import SecretBytes, SecretStr + +__all__ = 'pydantic_encoder', 'custom_pydantic_encoder', 'timedelta_isoformat' + + +def isoformat(o: Union[datetime.date, datetime.time]) -> str: + return o.isoformat() + + +def decimal_encoder(dec_value: Decimal) -> Union[int, float]: + """ + Encodes a Decimal as int of there's no exponent, otherwise float + + This is useful when we use ConstrainedDecimal to represent Numeric(x,0) + where a integer (but not int typed) is used. Encoding this as a float + results in failed round-tripping between encode and parse. + Our Id type is a prime example of this. + + >>> decimal_encoder(Decimal("1.0")) + 1.0 + + >>> decimal_encoder(Decimal("1")) + 1 + """ + if dec_value.as_tuple().exponent >= 0: + return int(dec_value) + else: + return float(dec_value) + + +ENCODERS_BY_TYPE: Dict[Type[Any], Callable[[Any], Any]] = { + bytes: lambda o: o.decode(), + Color: str, + datetime.date: isoformat, + datetime.datetime: isoformat, + datetime.time: isoformat, + datetime.timedelta: lambda td: td.total_seconds(), + Decimal: decimal_encoder, + Enum: lambda o: o.value, + frozenset: list, + deque: list, + GeneratorType: list, + IPv4Address: str, + IPv4Interface: str, + IPv4Network: str, + IPv6Address: str, + IPv6Interface: str, + IPv6Network: str, + NameEmail: str, + Path: str, + Pattern: lambda o: o.pattern, + SecretBytes: str, + SecretStr: str, + set: list, + UUID: str, +} + + +def pydantic_encoder(obj: Any) -> Any: + from dataclasses import asdict, is_dataclass + + from .main import BaseModel + + if isinstance(obj, BaseModel): + return obj.dict() + elif is_dataclass(obj): + return asdict(obj) + + # Check the class type and its superclasses for a matching encoder + for base in obj.__class__.__mro__[:-1]: + try: + encoder = ENCODERS_BY_TYPE[base] + except KeyError: + continue + return encoder(obj) + else: # We have exited the for loop without finding a suitable encoder + raise TypeError(f"Object of type '{obj.__class__.__name__}' is not JSON serializable") + + +def custom_pydantic_encoder(type_encoders: Dict[Any, Callable[[Type[Any]], Any]], obj: Any) -> Any: + # Check the class type and its superclasses for a matching encoder + for base in obj.__class__.__mro__[:-1]: + try: + encoder = type_encoders[base] + except KeyError: + continue + + return encoder(obj) + else: # We have exited the for loop without finding a suitable encoder + return pydantic_encoder(obj) + + +def timedelta_isoformat(td: datetime.timedelta) -> str: + """ + ISO 8601 encoding for Python timedelta object. + """ + minutes, seconds = divmod(td.seconds, 60) + hours, minutes = divmod(minutes, 60) + return f'{"-" if td.days < 0 else ""}P{abs(td.days)}DT{hours:d}H{minutes:d}M{seconds:d}.{td.microseconds:06d}S' diff --git a/libs/win/pydantic/main.cp37-win_amd64.pyd b/libs/win/pydantic/main.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..a100804c639f1ef2a317f5723937a31edc5b9010 GIT binary patch literal 385024 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�Vmff(jxlP-GT}jOq$R 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 Z2ahZ1W*d}*j8B4s)8fk+&HvZ`{y(*7BxC>p literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/main.py b/libs/win/pydantic/main.py new file mode 100644 index 00000000..69f3b751 --- /dev/null +++ b/libs/win/pydantic/main.py @@ -0,0 +1,1109 @@ +import warnings +from abc import ABCMeta +from copy import deepcopy +from enum import Enum +from functools import partial +from pathlib import Path +from types import FunctionType, prepare_class, resolve_bases +from typing import ( + TYPE_CHECKING, + AbstractSet, + Any, + Callable, + ClassVar, + Dict, + List, + Mapping, + Optional, + Tuple, + Type, + TypeVar, + Union, + cast, + no_type_check, + overload, +) + +from typing_extensions import dataclass_transform + +from .class_validators import ValidatorGroup, extract_root_validators, extract_validators, inherit_validators +from .config import BaseConfig, Extra, inherit_config, prepare_config +from .error_wrappers import ErrorWrapper, ValidationError +from .errors import ConfigError, DictError, ExtraError, MissingError +from .fields import ( + MAPPING_LIKE_SHAPES, + Field, + FieldInfo, + ModelField, + ModelPrivateAttr, + PrivateAttr, + Undefined, + is_finalvar_with_default_val, +) +from .json import custom_pydantic_encoder, pydantic_encoder +from .parse import Protocol, load_file, load_str_bytes +from .schema import default_ref_template, model_schema +from .types import PyObject, StrBytes +from .typing import ( + AnyCallable, + get_args, + get_origin, + is_classvar, + is_namedtuple, + is_union, + resolve_annotations, + update_model_forward_refs, +) +from .utils import ( + DUNDER_ATTRIBUTES, + ROOT_KEY, + ClassAttribute, + GetterDict, + Representation, + ValueItems, + generate_model_signature, + is_valid_field, + is_valid_private_name, + lenient_issubclass, + sequence_like, + smart_deepcopy, + unique_list, + validate_field_name, +) + +if TYPE_CHECKING: + from inspect import Signature + + from .class_validators import ValidatorListDict + from .types import ModelOrDc + from .typing import ( + AbstractSetIntStr, + AnyClassMethod, + CallableGenerator, + DictAny, + DictStrAny, + MappingIntStrAny, + ReprArgs, + SetStr, + TupleGenerator, + ) + + Model = TypeVar('Model', bound='BaseModel') + +__all__ = 'BaseModel', 'create_model', 'validate_model' + +_T = TypeVar('_T') + + +def validate_custom_root_type(fields: Dict[str, ModelField]) -> None: + if len(fields) > 1: + raise ValueError(f'{ROOT_KEY} cannot be mixed with other fields') + + +def generate_hash_function(frozen: bool) -> Optional[Callable[[Any], int]]: + def hash_function(self_: Any) -> int: + return hash(self_.__class__) + hash(tuple(self_.__dict__.values())) + + return hash_function if frozen else None + + +# If a field is of type `Callable`, its default value should be a function and cannot to ignored. +ANNOTATED_FIELD_UNTOUCHED_TYPES: Tuple[Any, ...] = (property, type, classmethod, staticmethod) +# When creating a `BaseModel` instance, we bypass all the methods, properties... added to the model +UNTOUCHED_TYPES: Tuple[Any, ...] = (FunctionType,) + ANNOTATED_FIELD_UNTOUCHED_TYPES +# Note `ModelMetaclass` refers to `BaseModel`, but is also used to *create* `BaseModel`, so we need to add this extra +# (somewhat hacky) boolean to keep track of whether we've created the `BaseModel` class yet, and therefore whether it's +# safe to refer to it. If it *hasn't* been created, we assume that the `__new__` call we're in the middle of is for +# the `BaseModel` class, since that's defined immediately after the metaclass. +_is_base_model_class_defined = False + + +@dataclass_transform(kw_only_default=True, field_descriptors=(Field, FieldInfo)) +class ModelMetaclass(ABCMeta): + @no_type_check # noqa C901 + def __new__(mcs, name, bases, namespace, **kwargs): # noqa C901 + fields: Dict[str, ModelField] = {} + config = BaseConfig + validators: 'ValidatorListDict' = {} + + pre_root_validators, post_root_validators = [], [] + private_attributes: Dict[str, ModelPrivateAttr] = {} + base_private_attributes: Dict[str, ModelPrivateAttr] = {} + slots: SetStr = namespace.get('__slots__', ()) + slots = {slots} if isinstance(slots, str) else set(slots) + class_vars: SetStr = set() + hash_func: Optional[Callable[[Any], int]] = None + + for base in reversed(bases): + if _is_base_model_class_defined and issubclass(base, BaseModel) and base != BaseModel: + fields.update(smart_deepcopy(base.__fields__)) + config = inherit_config(base.__config__, config) + validators = inherit_validators(base.__validators__, validators) + pre_root_validators += base.__pre_root_validators__ + post_root_validators += base.__post_root_validators__ + base_private_attributes.update(base.__private_attributes__) + class_vars.update(base.__class_vars__) + hash_func = base.__hash__ + + resolve_forward_refs = kwargs.pop('__resolve_forward_refs__', True) + allowed_config_kwargs: SetStr = { + key + for key in dir(config) + if not (key.startswith('__') and key.endswith('__')) # skip dunder methods and attributes + } + config_kwargs = {key: kwargs.pop(key) for key in kwargs.keys() & allowed_config_kwargs} + config_from_namespace = namespace.get('Config') + if config_kwargs and config_from_namespace: + raise TypeError('Specifying config in two places is ambiguous, use either Config attribute or class kwargs') + config = inherit_config(config_from_namespace, config, **config_kwargs) + + validators = inherit_validators(extract_validators(namespace), validators) + vg = ValidatorGroup(validators) + + for f in fields.values(): + f.set_config(config) + extra_validators = vg.get_validators(f.name) + if extra_validators: + f.class_validators.update(extra_validators) + # re-run prepare to add extra validators + f.populate_validators() + + prepare_config(config, name) + + untouched_types = ANNOTATED_FIELD_UNTOUCHED_TYPES + + def is_untouched(v: Any) -> bool: + return isinstance(v, untouched_types) or v.__class__.__name__ == 'cython_function_or_method' + + if (namespace.get('__module__'), namespace.get('__qualname__')) != ('pydantic.main', 'BaseModel'): + annotations = resolve_annotations(namespace.get('__annotations__', {}), namespace.get('__module__', None)) + # annotation only fields need to come first in fields + for ann_name, ann_type in annotations.items(): + if is_classvar(ann_type): + class_vars.add(ann_name) + elif is_finalvar_with_default_val(ann_type, namespace.get(ann_name, Undefined)): + class_vars.add(ann_name) + elif is_valid_field(ann_name): + validate_field_name(bases, ann_name) + value = namespace.get(ann_name, Undefined) + allowed_types = get_args(ann_type) if is_union(get_origin(ann_type)) else (ann_type,) + if ( + is_untouched(value) + and ann_type != PyObject + and not any( + lenient_issubclass(get_origin(allowed_type), Type) for allowed_type in allowed_types + ) + ): + continue + fields[ann_name] = ModelField.infer( + name=ann_name, + value=value, + annotation=ann_type, + class_validators=vg.get_validators(ann_name), + config=config, + ) + elif ann_name not in namespace and config.underscore_attrs_are_private: + private_attributes[ann_name] = PrivateAttr() + + untouched_types = UNTOUCHED_TYPES + config.keep_untouched + for var_name, value in namespace.items(): + can_be_changed = var_name not in class_vars and not is_untouched(value) + if isinstance(value, ModelPrivateAttr): + if not is_valid_private_name(var_name): + raise NameError( + f'Private attributes "{var_name}" must not be a valid field name; ' + f'Use sunder or dunder names, e. g. "_{var_name}" or "__{var_name}__"' + ) + private_attributes[var_name] = value + elif config.underscore_attrs_are_private and is_valid_private_name(var_name) and can_be_changed: + private_attributes[var_name] = PrivateAttr(default=value) + elif is_valid_field(var_name) and var_name not in annotations and can_be_changed: + validate_field_name(bases, var_name) + inferred = ModelField.infer( + name=var_name, + value=value, + annotation=annotations.get(var_name, Undefined), + class_validators=vg.get_validators(var_name), + config=config, + ) + if var_name in fields: + if lenient_issubclass(inferred.type_, fields[var_name].type_): + inferred.type_ = fields[var_name].type_ + else: + raise TypeError( + f'The type of {name}.{var_name} differs from the new default value; ' + f'if you wish to change the type of this field, please use a type annotation' + ) + fields[var_name] = inferred + + _custom_root_type = ROOT_KEY in fields + if _custom_root_type: + validate_custom_root_type(fields) + vg.check_for_unused() + if config.json_encoders: + json_encoder = partial(custom_pydantic_encoder, config.json_encoders) + else: + json_encoder = pydantic_encoder + pre_rv_new, post_rv_new = extract_root_validators(namespace) + + if hash_func is None: + hash_func = generate_hash_function(config.frozen) + + exclude_from_namespace = fields | private_attributes.keys() | {'__slots__'} + new_namespace = { + '__config__': config, + '__fields__': fields, + '__exclude_fields__': { + name: field.field_info.exclude for name, field in fields.items() if field.field_info.exclude is not None + } + or None, + '__include_fields__': { + name: field.field_info.include for name, field in fields.items() if field.field_info.include is not None + } + or None, + '__validators__': vg.validators, + '__pre_root_validators__': unique_list( + pre_root_validators + pre_rv_new, + name_factory=lambda v: v.__name__, + ), + '__post_root_validators__': unique_list( + post_root_validators + post_rv_new, + name_factory=lambda skip_on_failure_and_v: skip_on_failure_and_v[1].__name__, + ), + '__schema_cache__': {}, + '__json_encoder__': staticmethod(json_encoder), + '__custom_root_type__': _custom_root_type, + '__private_attributes__': {**base_private_attributes, **private_attributes}, + '__slots__': slots | private_attributes.keys(), + '__hash__': hash_func, + '__class_vars__': class_vars, + **{n: v for n, v in namespace.items() if n not in exclude_from_namespace}, + } + + cls = super().__new__(mcs, name, bases, new_namespace, **kwargs) + # set __signature__ attr only for model class, but not for its instances + cls.__signature__ = ClassAttribute('__signature__', generate_model_signature(cls.__init__, fields, config)) + if resolve_forward_refs: + cls.__try_update_forward_refs__() + + # preserve `__set_name__` protocol defined in https://peps.python.org/pep-0487 + # for attributes not in `new_namespace` (e.g. private attributes) + for name, obj in namespace.items(): + if name not in new_namespace: + set_name = getattr(obj, '__set_name__', None) + if callable(set_name): + set_name(cls, name) + + return cls + + def __instancecheck__(self, instance: Any) -> bool: + """ + Avoid calling ABC _abc_subclasscheck unless we're pretty sure. + + See #3829 and python/cpython#92810 + """ + return hasattr(instance, '__fields__') and super().__instancecheck__(instance) + + +object_setattr = object.__setattr__ + + +class BaseModel(Representation, metaclass=ModelMetaclass): + if TYPE_CHECKING: + # populated by the metaclass, defined here to help IDEs only + __fields__: ClassVar[Dict[str, ModelField]] = {} + __include_fields__: ClassVar[Optional[Mapping[str, Any]]] = None + __exclude_fields__: ClassVar[Optional[Mapping[str, Any]]] = None + __validators__: ClassVar[Dict[str, AnyCallable]] = {} + __pre_root_validators__: ClassVar[List[AnyCallable]] + __post_root_validators__: ClassVar[List[Tuple[bool, AnyCallable]]] + __config__: ClassVar[Type[BaseConfig]] = BaseConfig + __json_encoder__: ClassVar[Callable[[Any], Any]] = lambda x: x + __schema_cache__: ClassVar['DictAny'] = {} + __custom_root_type__: ClassVar[bool] = False + __signature__: ClassVar['Signature'] + __private_attributes__: ClassVar[Dict[str, ModelPrivateAttr]] + __class_vars__: ClassVar[SetStr] + __fields_set__: ClassVar[SetStr] = set() + + Config = BaseConfig + __slots__ = ('__dict__', '__fields_set__') + __doc__ = '' # Null out the Representation docstring + + def __init__(__pydantic_self__, **data: Any) -> None: + """ + Create a new model by parsing and validating input data from keyword arguments. + + Raises ValidationError if the input data cannot be parsed to form a valid model. + """ + # Uses something other than `self` the first arg to allow "self" as a settable attribute + values, fields_set, validation_error = validate_model(__pydantic_self__.__class__, data) + if validation_error: + raise validation_error + try: + object_setattr(__pydantic_self__, '__dict__', values) + except TypeError as e: + raise TypeError( + 'Model values must be a dict; you may not have returned a dictionary from a root validator' + ) from e + object_setattr(__pydantic_self__, '__fields_set__', fields_set) + __pydantic_self__._init_private_attributes() + + @no_type_check + def __setattr__(self, name, value): # noqa: C901 (ignore complexity) + if name in self.__private_attributes__ or name in DUNDER_ATTRIBUTES: + return object_setattr(self, name, value) + + if self.__config__.extra is not Extra.allow and name not in self.__fields__: + raise ValueError(f'"{self.__class__.__name__}" object has no field "{name}"') + elif not self.__config__.allow_mutation or self.__config__.frozen: + raise TypeError(f'"{self.__class__.__name__}" is immutable and does not support item assignment') + elif name in self.__fields__ and self.__fields__[name].final: + raise TypeError( + f'"{self.__class__.__name__}" object "{name}" field is final and does not support reassignment' + ) + elif self.__config__.validate_assignment: + new_values = {**self.__dict__, name: value} + + for validator in self.__pre_root_validators__: + try: + new_values = validator(self.__class__, new_values) + except (ValueError, TypeError, AssertionError) as exc: + raise ValidationError([ErrorWrapper(exc, loc=ROOT_KEY)], self.__class__) + + known_field = self.__fields__.get(name, None) + if known_field: + # We want to + # - make sure validators are called without the current value for this field inside `values` + # - keep other values (e.g. submodels) untouched (using `BaseModel.dict()` will change them into dicts) + # - keep the order of the fields + if not known_field.field_info.allow_mutation: + raise TypeError(f'"{known_field.name}" has allow_mutation set to False and cannot be assigned') + dict_without_original_value = {k: v for k, v in self.__dict__.items() if k != name} + value, error_ = known_field.validate(value, dict_without_original_value, loc=name, cls=self.__class__) + if error_: + raise ValidationError([error_], self.__class__) + else: + new_values[name] = value + + errors = [] + for skip_on_failure, validator in self.__post_root_validators__: + if skip_on_failure and errors: + continue + try: + new_values = validator(self.__class__, new_values) + except (ValueError, TypeError, AssertionError) as exc: + errors.append(ErrorWrapper(exc, loc=ROOT_KEY)) + if errors: + raise ValidationError(errors, self.__class__) + + # update the whole __dict__ as other values than just `value` + # may be changed (e.g. with `root_validator`) + object_setattr(self, '__dict__', new_values) + else: + self.__dict__[name] = value + + self.__fields_set__.add(name) + + def __getstate__(self) -> 'DictAny': + private_attrs = ((k, getattr(self, k, Undefined)) for k in self.__private_attributes__) + return { + '__dict__': self.__dict__, + '__fields_set__': self.__fields_set__, + '__private_attribute_values__': {k: v for k, v in private_attrs if v is not Undefined}, + } + + def __setstate__(self, state: 'DictAny') -> None: + object_setattr(self, '__dict__', state['__dict__']) + object_setattr(self, '__fields_set__', state['__fields_set__']) + for name, value in state.get('__private_attribute_values__', {}).items(): + object_setattr(self, name, value) + + def _init_private_attributes(self) -> None: + for name, private_attr in self.__private_attributes__.items(): + default = private_attr.get_default() + if default is not Undefined: + object_setattr(self, name, default) + + def dict( + self, + *, + include: Optional[Union['AbstractSetIntStr', 'MappingIntStrAny']] = None, + exclude: Optional[Union['AbstractSetIntStr', 'MappingIntStrAny']] = None, + by_alias: bool = False, + skip_defaults: Optional[bool] = None, + exclude_unset: bool = False, + exclude_defaults: bool = False, + exclude_none: bool = False, + ) -> 'DictStrAny': + """ + Generate a dictionary representation of the model, optionally specifying which fields to include or exclude. + + """ + if skip_defaults is not None: + warnings.warn( + f'{self.__class__.__name__}.dict(): "skip_defaults" is deprecated and replaced by "exclude_unset"', + DeprecationWarning, + ) + exclude_unset = skip_defaults + + return dict( + self._iter( + to_dict=True, + by_alias=by_alias, + include=include, + exclude=exclude, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + exclude_none=exclude_none, + ) + ) + + def json( + self, + *, + include: Optional[Union['AbstractSetIntStr', 'MappingIntStrAny']] = None, + exclude: Optional[Union['AbstractSetIntStr', 'MappingIntStrAny']] = None, + by_alias: bool = False, + skip_defaults: Optional[bool] = None, + exclude_unset: bool = False, + exclude_defaults: bool = False, + exclude_none: bool = False, + encoder: Optional[Callable[[Any], Any]] = None, + models_as_dict: bool = True, + **dumps_kwargs: Any, + ) -> str: + """ + Generate a JSON representation of the model, `include` and `exclude` arguments as per `dict()`. + + `encoder` is an optional function to supply as `default` to json.dumps(), other arguments as per `json.dumps()`. + """ + if skip_defaults is not None: + warnings.warn( + f'{self.__class__.__name__}.json(): "skip_defaults" is deprecated and replaced by "exclude_unset"', + DeprecationWarning, + ) + exclude_unset = skip_defaults + encoder = cast(Callable[[Any], Any], encoder or self.__json_encoder__) + + # We don't directly call `self.dict()`, which does exactly this with `to_dict=True` + # because we want to be able to keep raw `BaseModel` instances and not as `dict`. + # This allows users to write custom JSON encoders for given `BaseModel` classes. + data = dict( + self._iter( + to_dict=models_as_dict, + by_alias=by_alias, + include=include, + exclude=exclude, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + exclude_none=exclude_none, + ) + ) + if self.__custom_root_type__: + data = data[ROOT_KEY] + return self.__config__.json_dumps(data, default=encoder, **dumps_kwargs) + + @classmethod + def _enforce_dict_if_root(cls, obj: Any) -> Any: + if cls.__custom_root_type__ and ( + not (isinstance(obj, dict) and obj.keys() == {ROOT_KEY}) + or cls.__fields__[ROOT_KEY].shape in MAPPING_LIKE_SHAPES + ): + return {ROOT_KEY: obj} + else: + return obj + + @classmethod + def parse_obj(cls: Type['Model'], obj: Any) -> 'Model': + obj = cls._enforce_dict_if_root(obj) + if not isinstance(obj, dict): + try: + obj = dict(obj) + except (TypeError, ValueError) as e: + exc = TypeError(f'{cls.__name__} expected dict not {obj.__class__.__name__}') + raise ValidationError([ErrorWrapper(exc, loc=ROOT_KEY)], cls) from e + return cls(**obj) + + @classmethod + def parse_raw( + cls: Type['Model'], + b: StrBytes, + *, + content_type: str = None, + encoding: str = 'utf8', + proto: Protocol = None, + allow_pickle: bool = False, + ) -> 'Model': + try: + obj = load_str_bytes( + b, + proto=proto, + content_type=content_type, + encoding=encoding, + allow_pickle=allow_pickle, + json_loads=cls.__config__.json_loads, + ) + except (ValueError, TypeError, UnicodeDecodeError) as e: + raise ValidationError([ErrorWrapper(e, loc=ROOT_KEY)], cls) + return cls.parse_obj(obj) + + @classmethod + def parse_file( + cls: Type['Model'], + path: Union[str, Path], + *, + content_type: str = None, + encoding: str = 'utf8', + proto: Protocol = None, + allow_pickle: bool = False, + ) -> 'Model': + obj = load_file( + path, + proto=proto, + content_type=content_type, + encoding=encoding, + allow_pickle=allow_pickle, + json_loads=cls.__config__.json_loads, + ) + return cls.parse_obj(obj) + + @classmethod + def from_orm(cls: Type['Model'], obj: Any) -> 'Model': + if not cls.__config__.orm_mode: + raise ConfigError('You must have the config attribute orm_mode=True to use from_orm') + obj = {ROOT_KEY: obj} if cls.__custom_root_type__ else cls._decompose_class(obj) + m = cls.__new__(cls) + values, fields_set, validation_error = validate_model(cls, obj) + if validation_error: + raise validation_error + object_setattr(m, '__dict__', values) + object_setattr(m, '__fields_set__', fields_set) + m._init_private_attributes() + return m + + @classmethod + def construct(cls: Type['Model'], _fields_set: Optional['SetStr'] = None, **values: Any) -> 'Model': + """ + Creates a new model setting __dict__ and __fields_set__ from trusted or pre-validated data. + Default values are respected, but no other validation is performed. + Behaves as if `Config.extra = 'allow'` was set since it adds all passed values + """ + m = cls.__new__(cls) + fields_values: Dict[str, Any] = {} + for name, field in cls.__fields__.items(): + if field.alt_alias and field.alias in values: + fields_values[name] = values[field.alias] + elif name in values: + fields_values[name] = values[name] + elif not field.required: + fields_values[name] = field.get_default() + fields_values.update(values) + object_setattr(m, '__dict__', fields_values) + if _fields_set is None: + _fields_set = set(values.keys()) + object_setattr(m, '__fields_set__', _fields_set) + m._init_private_attributes() + return m + + def _copy_and_set_values(self: 'Model', values: 'DictStrAny', fields_set: 'SetStr', *, deep: bool) -> 'Model': + if deep: + # chances of having empty dict here are quite low for using smart_deepcopy + values = deepcopy(values) + + cls = self.__class__ + m = cls.__new__(cls) + object_setattr(m, '__dict__', values) + object_setattr(m, '__fields_set__', fields_set) + for name in self.__private_attributes__: + value = getattr(self, name, Undefined) + if value is not Undefined: + if deep: + value = deepcopy(value) + object_setattr(m, name, value) + + return m + + def copy( + self: 'Model', + *, + include: Optional[Union['AbstractSetIntStr', 'MappingIntStrAny']] = None, + exclude: Optional[Union['AbstractSetIntStr', 'MappingIntStrAny']] = None, + update: Optional['DictStrAny'] = None, + deep: bool = False, + ) -> 'Model': + """ + Duplicate a model, optionally choose which fields to include, exclude and change. + + :param include: fields to include in new model + :param exclude: fields to exclude from new model, as with values this takes precedence over include + :param update: values to change/add in the new model. Note: the data is not validated before creating + the new model: you should trust this data + :param deep: set to `True` to make a deep copy of the model + :return: new model instance + """ + + values = dict( + self._iter(to_dict=False, by_alias=False, include=include, exclude=exclude, exclude_unset=False), + **(update or {}), + ) + + # new `__fields_set__` can have unset optional fields with a set value in `update` kwarg + if update: + fields_set = self.__fields_set__ | update.keys() + else: + fields_set = set(self.__fields_set__) + + return self._copy_and_set_values(values, fields_set, deep=deep) + + @classmethod + def schema(cls, by_alias: bool = True, ref_template: str = default_ref_template) -> 'DictStrAny': + cached = cls.__schema_cache__.get((by_alias, ref_template)) + if cached is not None: + return cached + s = model_schema(cls, by_alias=by_alias, ref_template=ref_template) + cls.__schema_cache__[(by_alias, ref_template)] = s + return s + + @classmethod + def schema_json( + cls, *, by_alias: bool = True, ref_template: str = default_ref_template, **dumps_kwargs: Any + ) -> str: + from .json import pydantic_encoder + + return cls.__config__.json_dumps( + cls.schema(by_alias=by_alias, ref_template=ref_template), default=pydantic_encoder, **dumps_kwargs + ) + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls.validate + + @classmethod + def validate(cls: Type['Model'], value: Any) -> 'Model': + if isinstance(value, cls): + copy_on_model_validation = cls.__config__.copy_on_model_validation + # whether to deep or shallow copy the model on validation, None means do not copy + deep_copy: Optional[bool] = None + if copy_on_model_validation not in {'deep', 'shallow', 'none'}: + # Warn about deprecated behavior + warnings.warn( + "`copy_on_model_validation` should be a string: 'deep', 'shallow' or 'none'", DeprecationWarning + ) + if copy_on_model_validation: + deep_copy = False + + if copy_on_model_validation == 'shallow': + # shallow copy + deep_copy = False + elif copy_on_model_validation == 'deep': + # deep copy + deep_copy = True + + if deep_copy is None: + return value + else: + return value._copy_and_set_values(value.__dict__, value.__fields_set__, deep=deep_copy) + + value = cls._enforce_dict_if_root(value) + + if isinstance(value, dict): + return cls(**value) + elif cls.__config__.orm_mode: + return cls.from_orm(value) + else: + try: + value_as_dict = dict(value) + except (TypeError, ValueError) as e: + raise DictError() from e + return cls(**value_as_dict) + + @classmethod + def _decompose_class(cls: Type['Model'], obj: Any) -> GetterDict: + if isinstance(obj, GetterDict): + return obj + return cls.__config__.getter_dict(obj) + + @classmethod + @no_type_check + def _get_value( + cls, + v: Any, + to_dict: bool, + by_alias: bool, + include: Optional[Union['AbstractSetIntStr', 'MappingIntStrAny']], + exclude: Optional[Union['AbstractSetIntStr', 'MappingIntStrAny']], + exclude_unset: bool, + exclude_defaults: bool, + exclude_none: bool, + ) -> Any: + + if isinstance(v, BaseModel): + if to_dict: + v_dict = v.dict( + by_alias=by_alias, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + include=include, + exclude=exclude, + exclude_none=exclude_none, + ) + if ROOT_KEY in v_dict: + return v_dict[ROOT_KEY] + return v_dict + else: + return v.copy(include=include, exclude=exclude) + + value_exclude = ValueItems(v, exclude) if exclude else None + value_include = ValueItems(v, include) if include else None + + if isinstance(v, dict): + return { + k_: cls._get_value( + v_, + to_dict=to_dict, + by_alias=by_alias, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + include=value_include and value_include.for_element(k_), + exclude=value_exclude and value_exclude.for_element(k_), + exclude_none=exclude_none, + ) + for k_, v_ in v.items() + if (not value_exclude or not value_exclude.is_excluded(k_)) + and (not value_include or value_include.is_included(k_)) + } + + elif sequence_like(v): + seq_args = ( + cls._get_value( + v_, + to_dict=to_dict, + by_alias=by_alias, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + include=value_include and value_include.for_element(i), + exclude=value_exclude and value_exclude.for_element(i), + exclude_none=exclude_none, + ) + for i, v_ in enumerate(v) + if (not value_exclude or not value_exclude.is_excluded(i)) + and (not value_include or value_include.is_included(i)) + ) + + return v.__class__(*seq_args) if is_namedtuple(v.__class__) else v.__class__(seq_args) + + elif isinstance(v, Enum) and getattr(cls.Config, 'use_enum_values', False): + return v.value + + else: + return v + + @classmethod + def __try_update_forward_refs__(cls, **localns: Any) -> None: + """ + Same as update_forward_refs but will not raise exception + when forward references are not defined. + """ + update_model_forward_refs(cls, cls.__fields__.values(), cls.__config__.json_encoders, localns, (NameError,)) + + @classmethod + def update_forward_refs(cls, **localns: Any) -> None: + """ + Try to update ForwardRefs on fields based on this Model, globalns and localns. + """ + update_model_forward_refs(cls, cls.__fields__.values(), cls.__config__.json_encoders, localns) + + def __iter__(self) -> 'TupleGenerator': + """ + so `dict(model)` works + """ + yield from self.__dict__.items() + + def _iter( + self, + to_dict: bool = False, + by_alias: bool = False, + include: Optional[Union['AbstractSetIntStr', 'MappingIntStrAny']] = None, + exclude: Optional[Union['AbstractSetIntStr', 'MappingIntStrAny']] = None, + exclude_unset: bool = False, + exclude_defaults: bool = False, + exclude_none: bool = False, + ) -> 'TupleGenerator': + + # Merge field set excludes with explicit exclude parameter with explicit overriding field set options. + # The extra "is not None" guards are not logically necessary but optimizes performance for the simple case. + if exclude is not None or self.__exclude_fields__ is not None: + exclude = ValueItems.merge(self.__exclude_fields__, exclude) + + if include is not None or self.__include_fields__ is not None: + include = ValueItems.merge(self.__include_fields__, include, intersect=True) + + allowed_keys = self._calculate_keys( + include=include, exclude=exclude, exclude_unset=exclude_unset # type: ignore + ) + if allowed_keys is None and not (to_dict or by_alias or exclude_unset or exclude_defaults or exclude_none): + # huge boost for plain _iter() + yield from self.__dict__.items() + return + + value_exclude = ValueItems(self, exclude) if exclude is not None else None + value_include = ValueItems(self, include) if include is not None else None + + for field_key, v in self.__dict__.items(): + if (allowed_keys is not None and field_key not in allowed_keys) or (exclude_none and v is None): + continue + + if exclude_defaults: + model_field = self.__fields__.get(field_key) + if not getattr(model_field, 'required', True) and getattr(model_field, 'default', _missing) == v: + continue + + if by_alias and field_key in self.__fields__: + dict_key = self.__fields__[field_key].alias + else: + dict_key = field_key + + if to_dict or value_include or value_exclude: + v = self._get_value( + v, + to_dict=to_dict, + by_alias=by_alias, + include=value_include and value_include.for_element(field_key), + exclude=value_exclude and value_exclude.for_element(field_key), + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + exclude_none=exclude_none, + ) + yield dict_key, v + + def _calculate_keys( + self, + include: Optional['MappingIntStrAny'], + exclude: Optional['MappingIntStrAny'], + exclude_unset: bool, + update: Optional['DictStrAny'] = None, + ) -> Optional[AbstractSet[str]]: + if include is None and exclude is None and exclude_unset is False: + return None + + keys: AbstractSet[str] + if exclude_unset: + keys = self.__fields_set__.copy() + else: + keys = self.__dict__.keys() + + if include is not None: + keys &= include.keys() + + if update: + keys -= update.keys() + + if exclude: + keys -= {k for k, v in exclude.items() if ValueItems.is_true(v)} + + return keys + + def __eq__(self, other: Any) -> bool: + if isinstance(other, BaseModel): + return self.dict() == other.dict() + else: + return self.dict() == other + + def __repr_args__(self) -> 'ReprArgs': + return [ + (k, v) + for k, v in self.__dict__.items() + if k not in DUNDER_ATTRIBUTES and (k not in self.__fields__ or self.__fields__[k].field_info.repr) + ] + + +_is_base_model_class_defined = True + + +@overload +def create_model( + __model_name: str, + *, + __config__: Optional[Type[BaseConfig]] = None, + __base__: None = None, + __module__: str = __name__, + __validators__: Dict[str, 'AnyClassMethod'] = None, + __cls_kwargs__: Dict[str, Any] = None, + **field_definitions: Any, +) -> Type['BaseModel']: + ... + + +@overload +def create_model( + __model_name: str, + *, + __config__: Optional[Type[BaseConfig]] = None, + __base__: Union[Type['Model'], Tuple[Type['Model'], ...]], + __module__: str = __name__, + __validators__: Dict[str, 'AnyClassMethod'] = None, + __cls_kwargs__: Dict[str, Any] = None, + **field_definitions: Any, +) -> Type['Model']: + ... + + +def create_model( + __model_name: str, + *, + __config__: Optional[Type[BaseConfig]] = None, + __base__: Union[None, Type['Model'], Tuple[Type['Model'], ...]] = None, + __module__: str = __name__, + __validators__: Dict[str, 'AnyClassMethod'] = None, + __cls_kwargs__: Dict[str, Any] = None, + __slots__: Optional[Tuple[str, ...]] = None, + **field_definitions: Any, +) -> Type['Model']: + """ + Dynamically create a model. + :param __model_name: name of the created model + :param __config__: config class to use for the new model + :param __base__: base class for the new model to inherit from + :param __module__: module of the created model + :param __validators__: a dict of method names and @validator class methods + :param __cls_kwargs__: a dict for class creation + :param __slots__: Deprecated, `__slots__` should not be passed to `create_model` + :param field_definitions: fields of the model (or extra fields if a base is supplied) + in the format `=(, )` or `=, e.g. + `foobar=(str, ...)` or `foobar=123`, or, for complex use-cases, in the format + `=` or `=(, )`, e.g. + `foo=Field(datetime, default_factory=datetime.utcnow, alias='bar')` or + `foo=(str, FieldInfo(title='Foo'))` + """ + if __slots__ is not None: + # __slots__ will be ignored from here on + warnings.warn('__slots__ should not be passed to create_model', RuntimeWarning) + + if __base__ is not None: + if __config__ is not None: + raise ConfigError('to avoid confusion __config__ and __base__ cannot be used together') + if not isinstance(__base__, tuple): + __base__ = (__base__,) + else: + __base__ = (cast(Type['Model'], BaseModel),) + + __cls_kwargs__ = __cls_kwargs__ or {} + + fields = {} + annotations = {} + + for f_name, f_def in field_definitions.items(): + if not is_valid_field(f_name): + warnings.warn(f'fields may not start with an underscore, ignoring "{f_name}"', RuntimeWarning) + if isinstance(f_def, tuple): + try: + f_annotation, f_value = f_def + except ValueError as e: + raise ConfigError( + 'field definitions should either be a tuple of (, ) or just a ' + 'default value, unfortunately this means tuples as ' + 'default values are not allowed' + ) from e + else: + f_annotation, f_value = None, f_def + + if f_annotation: + annotations[f_name] = f_annotation + fields[f_name] = f_value + + namespace: 'DictStrAny' = {'__annotations__': annotations, '__module__': __module__} + if __validators__: + namespace.update(__validators__) + namespace.update(fields) + if __config__: + namespace['Config'] = inherit_config(__config__, BaseConfig) + resolved_bases = resolve_bases(__base__) + meta, ns, kwds = prepare_class(__model_name, resolved_bases, kwds=__cls_kwargs__) + if resolved_bases is not __base__: + ns['__orig_bases__'] = __base__ + namespace.update(ns) + return meta(__model_name, resolved_bases, namespace, **kwds) + + +_missing = object() + + +def validate_model( # noqa: C901 (ignore complexity) + model: Type[BaseModel], input_data: 'DictStrAny', cls: 'ModelOrDc' = None +) -> Tuple['DictStrAny', 'SetStr', Optional[ValidationError]]: + """ + validate data against a model. + """ + values = {} + errors = [] + # input_data names, possibly alias + names_used = set() + # field names, never aliases + fields_set = set() + config = model.__config__ + check_extra = config.extra is not Extra.ignore + cls_ = cls or model + + for validator in model.__pre_root_validators__: + try: + input_data = validator(cls_, input_data) + except (ValueError, TypeError, AssertionError) as exc: + return {}, set(), ValidationError([ErrorWrapper(exc, loc=ROOT_KEY)], cls_) + + for name, field in model.__fields__.items(): + value = input_data.get(field.alias, _missing) + using_name = False + if value is _missing and config.allow_population_by_field_name and field.alt_alias: + value = input_data.get(field.name, _missing) + using_name = True + + if value is _missing: + if field.required: + errors.append(ErrorWrapper(MissingError(), loc=field.alias)) + continue + + value = field.get_default() + + if not config.validate_all and not field.validate_always: + values[name] = value + continue + else: + fields_set.add(name) + if check_extra: + names_used.add(field.name if using_name else field.alias) + + v_, errors_ = field.validate(value, values, loc=field.alias, cls=cls_) + if isinstance(errors_, ErrorWrapper): + errors.append(errors_) + elif isinstance(errors_, list): + errors.extend(errors_) + else: + values[name] = v_ + + if check_extra: + if isinstance(input_data, GetterDict): + extra = input_data.extra_keys() - names_used + else: + extra = input_data.keys() - names_used + if extra: + fields_set |= extra + if config.extra is Extra.allow: + for f in extra: + values[f] = input_data[f] + else: + for f in sorted(extra): + errors.append(ErrorWrapper(ExtraError(), loc=f)) + + for skip_on_failure, validator in model.__post_root_validators__: + if skip_on_failure and errors: + continue + try: + values = validator(cls_, values) + except (ValueError, TypeError, AssertionError) as exc: + errors.append(ErrorWrapper(exc, loc=ROOT_KEY)) + + if errors: + return values, fields_set, ValidationError(errors, cls_) + else: + return values, fields_set, None diff --git a/libs/win/pydantic/mypy.cp37-win_amd64.pyd b/libs/win/pydantic/mypy.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..3611c95bb5abdd7363c9edf5ee8eee0eb341391a GIT binary patch literal 325632 zcmd?ScYM@U_WvKs0G4rL8I6S{YFM#EQAFcL)(j*%qZ5rvQ$bKbKtWJ4iXwuNtjxY0 z+p6o@3zoHakrINSpj0ckxQc6=7z>s~EbIK9uk(IS$z<@ezwhJo`~Cj-@py!JmwV4W z_uO+&yXW3_?djJQbt)<<>dap%Ra7*WU;V4H|9|_x;toYcJM@^hL(#L_tlE2Shv=%k z2aX#*rF8Ozlg3_n*2L0LXPtlkr25jc$CO?eJHK@N`K8q-omx6^(&#Y<`~BONd7yWg ze69cZ9X~uX{WoCzg=dDjf9>3jBlO#0y!-pwxgU=>&YpiVqQCwAYeaOKcb{yk>s&OH zI^mN$7mXIoDqqnS{g(QQk~`|c`&Z{Hs^7M#=*f!CMSG>675JTeWapwP7j^gTrcOmk zP}|zSgX_mkt>a0(Uh>k2@Xx@*|+FNdGP&bqL(O)9wZV_h!^JHyI)hn)#!6=A2otSUTfY3Yb1LWK4z!j-`q zs??7OJN>&w9e;1Ij8rbJA5`1;YV3Ca+)o%Jg3GrE7C^6}bf0E`Q~=n2J;kF5-_xJy zZB+>cU!Y*E6DbMDtIJBQ#vR!j$?JVsrg9#IMh66j+E9y+|9ga^gt!-=$G{#};g^$6rEdwdSqu7pNr|-4f zb}m|2r>B#wVoh<_2^WXy-67!rRm>3_;t&pdDh+42D7Tbx@}gr*;b;)iD+gJJU+QqkcfxnF6&}(2ub5emK=7JZt|B zu`Xe!BbB0#Z_X#3X#`$fo!oJXdUHsJsIy62mxkQB6DUr%Vk?qg)^~LQVG2lFG%NbFK zp73{ueM56kg#^yq$*ca3fN@rZmNm}gfrcYl)+CYAx^E;=TN;itv*XO{`1Ib%N1oO= zE%VB1`bd^lNtT5r%j&|;Wo1Jp&_W|ZXNHEGRLhFks=*Q@2nqi_-+^_aU*+eiRJG$9 z`fu)#JplTL#BVqnA6-^g)92&JtV>EuLe9#NvowlC9vZlDaa2O72Jv!NbK~;*--lAm zBcqzDZrmJb zNOA%5@3sYz;H-3l=Swy?OT+Oqi;?J&SyM|ZXt(hVx5a*`*W$qwC=wp^QrKCrY%=XJ zbEEOGG�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�%VdxUqQmP3i|H)&=JRF7EGWI)+;GspY?RVA8Z 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%0D3g*)(KmaNX)%Vx12SK3eImMJW=DL52`iYGjch$6 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 literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/mypy.py b/libs/win/pydantic/mypy.py new file mode 100644 index 00000000..6bd9db18 --- /dev/null +++ b/libs/win/pydantic/mypy.py @@ -0,0 +1,850 @@ +import sys +from configparser import ConfigParser +from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Type as TypingType, Union + +from mypy.errorcodes import ErrorCode +from mypy.nodes import ( + ARG_NAMED, + ARG_NAMED_OPT, + ARG_OPT, + ARG_POS, + ARG_STAR2, + MDEF, + Argument, + AssignmentStmt, + Block, + CallExpr, + ClassDef, + Context, + Decorator, + EllipsisExpr, + FuncBase, + FuncDef, + JsonDict, + MemberExpr, + NameExpr, + PassStmt, + PlaceholderNode, + RefExpr, + StrExpr, + SymbolNode, + SymbolTableNode, + TempNode, + TypeInfo, + TypeVarExpr, + Var, +) +from mypy.options import Options +from mypy.plugin import ( + CheckerPluginInterface, + ClassDefContext, + FunctionContext, + MethodContext, + Plugin, + SemanticAnalyzerPluginInterface, +) +from mypy.plugins import dataclasses +from mypy.semanal import set_callable_name # type: ignore +from mypy.server.trigger import make_wildcard_trigger +from mypy.types import ( + AnyType, + CallableType, + Instance, + NoneType, + Overloaded, + Type, + TypeOfAny, + TypeType, + TypeVarType, + UnionType, + get_proper_type, +) +from mypy.typevars import fill_typevars +from mypy.util import get_unique_redefinition_name +from mypy.version import __version__ as mypy_version + +from pydantic.utils import is_valid_field + +try: + from mypy.types import TypeVarDef # type: ignore[attr-defined] +except ImportError: # pragma: no cover + # Backward-compatible with TypeVarDef from Mypy 0.910. + from mypy.types import TypeVarType as TypeVarDef + +CONFIGFILE_KEY = 'pydantic-mypy' +METADATA_KEY = 'pydantic-mypy-metadata' +BASEMODEL_FULLNAME = 'pydantic.main.BaseModel' +BASESETTINGS_FULLNAME = 'pydantic.env_settings.BaseSettings' +FIELD_FULLNAME = 'pydantic.fields.Field' +DATACLASS_FULLNAME = 'pydantic.dataclasses.dataclass' + + +def parse_mypy_version(version: str) -> Tuple[int, ...]: + return tuple(int(part) for part in version.split('+', 1)[0].split('.')) + + +MYPY_VERSION_TUPLE = parse_mypy_version(mypy_version) +BUILTINS_NAME = 'builtins' if MYPY_VERSION_TUPLE >= (0, 930) else '__builtins__' + + +def plugin(version: str) -> 'TypingType[Plugin]': + """ + `version` is the mypy version string + + We might want to use this to print a warning if the mypy version being used is + newer, or especially older, than we expect (or need). + """ + return PydanticPlugin + + +class PydanticPlugin(Plugin): + def __init__(self, options: Options) -> None: + self.plugin_config = PydanticPluginConfig(options) + super().__init__(options) + + def get_base_class_hook(self, fullname: str) -> 'Optional[Callable[[ClassDefContext], None]]': + sym = self.lookup_fully_qualified(fullname) + if sym and isinstance(sym.node, TypeInfo): # pragma: no branch + # No branching may occur if the mypy cache has not been cleared + if any(get_fullname(base) == BASEMODEL_FULLNAME for base in sym.node.mro): + return self._pydantic_model_class_maker_callback + return None + + def get_function_hook(self, fullname: str) -> 'Optional[Callable[[FunctionContext], Type]]': + sym = self.lookup_fully_qualified(fullname) + if sym and sym.fullname == FIELD_FULLNAME: + return self._pydantic_field_callback + return None + + def get_method_hook(self, fullname: str) -> Optional[Callable[[MethodContext], Type]]: + if fullname.endswith('.from_orm'): + return from_orm_callback + return None + + def get_class_decorator_hook(self, fullname: str) -> Optional[Callable[[ClassDefContext], None]]: + if fullname == DATACLASS_FULLNAME: + return dataclasses.dataclass_class_maker_callback # type: ignore[return-value] + return None + + def _pydantic_model_class_maker_callback(self, ctx: ClassDefContext) -> None: + transformer = PydanticModelTransformer(ctx, self.plugin_config) + transformer.transform() + + def _pydantic_field_callback(self, ctx: FunctionContext) -> 'Type': + """ + Extract the type of the `default` argument from the Field function, and use it as the return type. + + In particular: + * Check whether the default and default_factory argument is specified. + * Output an error if both are specified. + * Retrieve the type of the argument which is specified, and use it as return type for the function. + """ + default_any_type = ctx.default_return_type + + assert ctx.callee_arg_names[0] == 'default', '"default" is no longer first argument in Field()' + assert ctx.callee_arg_names[1] == 'default_factory', '"default_factory" is no longer second argument in Field()' + default_args = ctx.args[0] + default_factory_args = ctx.args[1] + + if default_args and default_factory_args: + error_default_and_default_factory_specified(ctx.api, ctx.context) + return default_any_type + + if default_args: + default_type = ctx.arg_types[0][0] + default_arg = default_args[0] + + # Fallback to default Any type if the field is required + if not isinstance(default_arg, EllipsisExpr): + return default_type + + elif default_factory_args: + default_factory_type = ctx.arg_types[1][0] + + # Functions which use `ParamSpec` can be overloaded, exposing the callable's types as a parameter + # Pydantic calls the default factory without any argument, so we retrieve the first item + if isinstance(default_factory_type, Overloaded): + if MYPY_VERSION_TUPLE > (0, 910): + default_factory_type = default_factory_type.items[0] + else: + # Mypy0.910 exposes the items of overloaded types in a function + default_factory_type = default_factory_type.items()[0] # type: ignore[operator] + + if isinstance(default_factory_type, CallableType): + ret_type = default_factory_type.ret_type + # mypy doesn't think `ret_type` has `args`, you'd think mypy should know, + # add this check in case it varies by version + args = getattr(ret_type, 'args', None) + if args: + if all(isinstance(arg, TypeVarType) for arg in args): + # Looks like the default factory is a type like `list` or `dict`, replace all args with `Any` + ret_type.args = tuple(default_any_type for _ in args) # type: ignore[attr-defined] + return ret_type + + return default_any_type + + +class PydanticPluginConfig: + __slots__ = ('init_forbid_extra', 'init_typed', 'warn_required_dynamic_aliases', 'warn_untyped_fields') + init_forbid_extra: bool + init_typed: bool + warn_required_dynamic_aliases: bool + warn_untyped_fields: bool + + def __init__(self, options: Options) -> None: + if options.config_file is None: # pragma: no cover + return + + toml_config = parse_toml(options.config_file) + if toml_config is not None: + config = toml_config.get('tool', {}).get('pydantic-mypy', {}) + for key in self.__slots__: + setting = config.get(key, False) + if not isinstance(setting, bool): + raise ValueError(f'Configuration value must be a boolean for key: {key}') + setattr(self, key, setting) + else: + plugin_config = ConfigParser() + plugin_config.read(options.config_file) + for key in self.__slots__: + setting = plugin_config.getboolean(CONFIGFILE_KEY, key, fallback=False) + setattr(self, key, setting) + + +def from_orm_callback(ctx: MethodContext) -> Type: + """ + Raise an error if orm_mode is not enabled + """ + model_type: Instance + if isinstance(ctx.type, CallableType) and isinstance(ctx.type.ret_type, Instance): + model_type = ctx.type.ret_type # called on the class + elif isinstance(ctx.type, Instance): + model_type = ctx.type # called on an instance (unusual, but still valid) + else: # pragma: no cover + detail = f'ctx.type: {ctx.type} (of type {ctx.type.__class__.__name__})' + error_unexpected_behavior(detail, ctx.api, ctx.context) + return ctx.default_return_type + pydantic_metadata = model_type.type.metadata.get(METADATA_KEY) + if pydantic_metadata is None: + return ctx.default_return_type + orm_mode = pydantic_metadata.get('config', {}).get('orm_mode') + if orm_mode is not True: + error_from_orm(get_name(model_type.type), ctx.api, ctx.context) + return ctx.default_return_type + + +class PydanticModelTransformer: + tracked_config_fields: Set[str] = { + 'extra', + 'allow_mutation', + 'frozen', + 'orm_mode', + 'allow_population_by_field_name', + 'alias_generator', + } + + def __init__(self, ctx: ClassDefContext, plugin_config: PydanticPluginConfig) -> None: + self._ctx = ctx + self.plugin_config = plugin_config + + def transform(self) -> None: + """ + Configures the BaseModel subclass according to the plugin settings. + + In particular: + * determines the model config and fields, + * adds a fields-aware signature for the initializer and construct methods + * freezes the class if allow_mutation = False or frozen = True + * stores the fields, config, and if the class is settings in the mypy metadata for access by subclasses + """ + ctx = self._ctx + info = self._ctx.cls.info + + self.adjust_validator_signatures() + config = self.collect_config() + fields = self.collect_fields(config) + for field in fields: + if info[field.name].type is None: + if not ctx.api.final_iteration: + ctx.api.defer() + is_settings = any(get_fullname(base) == BASESETTINGS_FULLNAME for base in info.mro[:-1]) + self.add_initializer(fields, config, is_settings) + self.add_construct_method(fields) + self.set_frozen(fields, frozen=config.allow_mutation is False or config.frozen is True) + info.metadata[METADATA_KEY] = { + 'fields': {field.name: field.serialize() for field in fields}, + 'config': config.set_values_dict(), + } + + def adjust_validator_signatures(self) -> None: + """When we decorate a function `f` with `pydantic.validator(...), mypy sees + `f` as a regular method taking a `self` instance, even though pydantic + internally wraps `f` with `classmethod` if necessary. + + Teach mypy this by marking any function whose outermost decorator is a + `validator()` call as a classmethod. + """ + for name, sym in self._ctx.cls.info.names.items(): + if isinstance(sym.node, Decorator): + first_dec = sym.node.original_decorators[0] + if ( + isinstance(first_dec, CallExpr) + and isinstance(first_dec.callee, NameExpr) + and first_dec.callee.fullname == 'pydantic.class_validators.validator' + ): + sym.node.func.is_class = True + + def collect_config(self) -> 'ModelConfigData': + """ + Collects the values of the config attributes that are used by the plugin, accounting for parent classes. + """ + ctx = self._ctx + cls = ctx.cls + config = ModelConfigData() + for stmt in cls.defs.body: + if not isinstance(stmt, ClassDef): + continue + if stmt.name == 'Config': + for substmt in stmt.defs.body: + if not isinstance(substmt, AssignmentStmt): + continue + config.update(self.get_config_update(substmt)) + if ( + config.has_alias_generator + and not config.allow_population_by_field_name + and self.plugin_config.warn_required_dynamic_aliases + ): + error_required_dynamic_aliases(ctx.api, stmt) + for info in cls.info.mro[1:]: # 0 is the current class + if METADATA_KEY not in info.metadata: + continue + + # Each class depends on the set of fields in its ancestors + ctx.api.add_plugin_dependency(make_wildcard_trigger(get_fullname(info))) + for name, value in info.metadata[METADATA_KEY]['config'].items(): + config.setdefault(name, value) + return config + + def collect_fields(self, model_config: 'ModelConfigData') -> List['PydanticModelField']: + """ + Collects the fields for the model, accounting for parent classes + """ + # First, collect fields belonging to the current class. + ctx = self._ctx + cls = self._ctx.cls + fields = [] # type: List[PydanticModelField] + known_fields = set() # type: Set[str] + for stmt in cls.defs.body: + if not isinstance(stmt, AssignmentStmt): # `and stmt.new_syntax` to require annotation + continue + + lhs = stmt.lvalues[0] + if not isinstance(lhs, NameExpr) or not is_valid_field(lhs.name): + continue + + if not stmt.new_syntax and self.plugin_config.warn_untyped_fields: + error_untyped_fields(ctx.api, stmt) + + # if lhs.name == '__config__': # BaseConfig not well handled; I'm not sure why yet + # continue + + sym = cls.info.names.get(lhs.name) + if sym is None: # pragma: no cover + # This is likely due to a star import (see the dataclasses plugin for a more detailed explanation) + # This is the same logic used in the dataclasses plugin + continue + + node = sym.node + if isinstance(node, PlaceholderNode): # pragma: no cover + # See the PlaceholderNode docstring for more detail about how this can occur + # Basically, it is an edge case when dealing with complex import logic + # This is the same logic used in the dataclasses plugin + continue + if not isinstance(node, Var): # pragma: no cover + # Don't know if this edge case still happens with the `is_valid_field` check above + # but better safe than sorry + continue + + # x: ClassVar[int] is ignored by dataclasses. + if node.is_classvar: + continue + + is_required = self.get_is_required(cls, stmt, lhs) + alias, has_dynamic_alias = self.get_alias_info(stmt) + if ( + has_dynamic_alias + and not model_config.allow_population_by_field_name + and self.plugin_config.warn_required_dynamic_aliases + ): + error_required_dynamic_aliases(ctx.api, stmt) + fields.append( + PydanticModelField( + name=lhs.name, + is_required=is_required, + alias=alias, + has_dynamic_alias=has_dynamic_alias, + line=stmt.line, + column=stmt.column, + ) + ) + known_fields.add(lhs.name) + all_fields = fields.copy() + for info in cls.info.mro[1:]: # 0 is the current class, -2 is BaseModel, -1 is object + if METADATA_KEY not in info.metadata: + continue + + superclass_fields = [] + # Each class depends on the set of fields in its ancestors + ctx.api.add_plugin_dependency(make_wildcard_trigger(get_fullname(info))) + + for name, data in info.metadata[METADATA_KEY]['fields'].items(): + if name not in known_fields: + field = PydanticModelField.deserialize(info, data) + known_fields.add(name) + superclass_fields.append(field) + else: + (field,) = (a for a in all_fields if a.name == name) + all_fields.remove(field) + superclass_fields.append(field) + all_fields = superclass_fields + all_fields + return all_fields + + def add_initializer(self, fields: List['PydanticModelField'], config: 'ModelConfigData', is_settings: bool) -> None: + """ + Adds a fields-aware `__init__` method to the class. + + The added `__init__` will be annotated with types vs. all `Any` depending on the plugin settings. + """ + ctx = self._ctx + typed = self.plugin_config.init_typed + use_alias = config.allow_population_by_field_name is not True + force_all_optional = is_settings or bool( + config.has_alias_generator and not config.allow_population_by_field_name + ) + init_arguments = self.get_field_arguments( + fields, typed=typed, force_all_optional=force_all_optional, use_alias=use_alias + ) + if not self.should_init_forbid_extra(fields, config): + var = Var('kwargs') + init_arguments.append(Argument(var, AnyType(TypeOfAny.explicit), None, ARG_STAR2)) + + if '__init__' not in ctx.cls.info.names: + add_method(ctx, '__init__', init_arguments, NoneType()) + + def add_construct_method(self, fields: List['PydanticModelField']) -> None: + """ + Adds a fully typed `construct` classmethod to the class. + + Similar to the fields-aware __init__ method, but always uses the field names (not aliases), + and does not treat settings fields as optional. + """ + ctx = self._ctx + set_str = ctx.api.named_type(f'{BUILTINS_NAME}.set', [ctx.api.named_type(f'{BUILTINS_NAME}.str')]) + optional_set_str = UnionType([set_str, NoneType()]) + fields_set_argument = Argument(Var('_fields_set', optional_set_str), optional_set_str, None, ARG_OPT) + construct_arguments = self.get_field_arguments(fields, typed=True, force_all_optional=False, use_alias=False) + construct_arguments = [fields_set_argument] + construct_arguments + + obj_type = ctx.api.named_type(f'{BUILTINS_NAME}.object') + self_tvar_name = '_PydanticBaseModel' # Make sure it does not conflict with other names in the class + tvar_fullname = ctx.cls.fullname + '.' + self_tvar_name + tvd = TypeVarDef(self_tvar_name, tvar_fullname, -1, [], obj_type) + self_tvar_expr = TypeVarExpr(self_tvar_name, tvar_fullname, [], obj_type) + ctx.cls.info.names[self_tvar_name] = SymbolTableNode(MDEF, self_tvar_expr) + + # Backward-compatible with TypeVarDef from Mypy 0.910. + if isinstance(tvd, TypeVarType): + self_type = tvd + else: + self_type = TypeVarType(tvd) # type: ignore[call-arg] + + add_method( + ctx, + 'construct', + construct_arguments, + return_type=self_type, + self_type=self_type, + tvar_def=tvd, + is_classmethod=True, + ) + + def set_frozen(self, fields: List['PydanticModelField'], frozen: bool) -> None: + """ + Marks all fields as properties so that attempts to set them trigger mypy errors. + + This is the same approach used by the attrs and dataclasses plugins. + """ + info = self._ctx.cls.info + for field in fields: + sym_node = info.names.get(field.name) + if sym_node is not None: + var = sym_node.node + assert isinstance(var, Var) + var.is_property = frozen + else: + var = field.to_var(info, use_alias=False) + var.info = info + var.is_property = frozen + var._fullname = get_fullname(info) + '.' + get_name(var) + info.names[get_name(var)] = SymbolTableNode(MDEF, var) + + def get_config_update(self, substmt: AssignmentStmt) -> Optional['ModelConfigData']: + """ + Determines the config update due to a single statement in the Config class definition. + + Warns if a tracked config attribute is set to a value the plugin doesn't know how to interpret (e.g., an int) + """ + lhs = substmt.lvalues[0] + if not (isinstance(lhs, NameExpr) and lhs.name in self.tracked_config_fields): + return None + if lhs.name == 'extra': + if isinstance(substmt.rvalue, StrExpr): + forbid_extra = substmt.rvalue.value == 'forbid' + elif isinstance(substmt.rvalue, MemberExpr): + forbid_extra = substmt.rvalue.name == 'forbid' + else: + error_invalid_config_value(lhs.name, self._ctx.api, substmt) + return None + return ModelConfigData(forbid_extra=forbid_extra) + if lhs.name == 'alias_generator': + has_alias_generator = True + if isinstance(substmt.rvalue, NameExpr) and substmt.rvalue.fullname == 'builtins.None': + has_alias_generator = False + return ModelConfigData(has_alias_generator=has_alias_generator) + if isinstance(substmt.rvalue, NameExpr) and substmt.rvalue.fullname in ('builtins.True', 'builtins.False'): + return ModelConfigData(**{lhs.name: substmt.rvalue.fullname == 'builtins.True'}) + error_invalid_config_value(lhs.name, self._ctx.api, substmt) + return None + + @staticmethod + def get_is_required(cls: ClassDef, stmt: AssignmentStmt, lhs: NameExpr) -> bool: + """ + Returns a boolean indicating whether the field defined in `stmt` is a required field. + """ + expr = stmt.rvalue + if isinstance(expr, TempNode): + # TempNode means annotation-only, so only non-required if Optional + value_type = get_proper_type(cls.info[lhs.name].type) + if isinstance(value_type, UnionType) and any(isinstance(item, NoneType) for item in value_type.items): + # Annotated as Optional, or otherwise having NoneType in the union + return False + return True + if isinstance(expr, CallExpr) and isinstance(expr.callee, RefExpr) and expr.callee.fullname == FIELD_FULLNAME: + # The "default value" is a call to `Field`; at this point, the field is + # only required if default is Ellipsis (i.e., `field_name: Annotation = Field(...)`) or if default_factory + # is specified. + for arg, name in zip(expr.args, expr.arg_names): + # If name is None, then this arg is the default because it is the only positonal argument. + if name is None or name == 'default': + return arg.__class__ is EllipsisExpr + if name == 'default_factory': + return False + return True + # Only required if the "default value" is Ellipsis (i.e., `field_name: Annotation = ...`) + return isinstance(expr, EllipsisExpr) + + @staticmethod + def get_alias_info(stmt: AssignmentStmt) -> Tuple[Optional[str], bool]: + """ + Returns a pair (alias, has_dynamic_alias), extracted from the declaration of the field defined in `stmt`. + + `has_dynamic_alias` is True if and only if an alias is provided, but not as a string literal. + If `has_dynamic_alias` is True, `alias` will be None. + """ + expr = stmt.rvalue + if isinstance(expr, TempNode): + # TempNode means annotation-only + return None, False + + if not ( + isinstance(expr, CallExpr) and isinstance(expr.callee, RefExpr) and expr.callee.fullname == FIELD_FULLNAME + ): + # Assigned value is not a call to pydantic.fields.Field + return None, False + + for i, arg_name in enumerate(expr.arg_names): + if arg_name != 'alias': + continue + arg = expr.args[i] + if isinstance(arg, StrExpr): + return arg.value, False + else: + return None, True + return None, False + + def get_field_arguments( + self, fields: List['PydanticModelField'], typed: bool, force_all_optional: bool, use_alias: bool + ) -> List[Argument]: + """ + Helper function used during the construction of the `__init__` and `construct` method signatures. + + Returns a list of mypy Argument instances for use in the generated signatures. + """ + info = self._ctx.cls.info + arguments = [ + field.to_argument(info, typed=typed, force_optional=force_all_optional, use_alias=use_alias) + for field in fields + if not (use_alias and field.has_dynamic_alias) + ] + return arguments + + def should_init_forbid_extra(self, fields: List['PydanticModelField'], config: 'ModelConfigData') -> bool: + """ + Indicates whether the generated `__init__` should get a `**kwargs` at the end of its signature + + We disallow arbitrary kwargs if the extra config setting is "forbid", or if the plugin config says to, + *unless* a required dynamic alias is present (since then we can't determine a valid signature). + """ + if not config.allow_population_by_field_name: + if self.is_dynamic_alias_present(fields, bool(config.has_alias_generator)): + return False + if config.forbid_extra: + return True + return self.plugin_config.init_forbid_extra + + @staticmethod + def is_dynamic_alias_present(fields: List['PydanticModelField'], has_alias_generator: bool) -> bool: + """ + Returns whether any fields on the model have a "dynamic alias", i.e., an alias that cannot be + determined during static analysis. + """ + for field in fields: + if field.has_dynamic_alias: + return True + if has_alias_generator: + for field in fields: + if field.alias is None: + return True + return False + + +class PydanticModelField: + def __init__( + self, name: str, is_required: bool, alias: Optional[str], has_dynamic_alias: bool, line: int, column: int + ): + self.name = name + self.is_required = is_required + self.alias = alias + self.has_dynamic_alias = has_dynamic_alias + self.line = line + self.column = column + + def to_var(self, info: TypeInfo, use_alias: bool) -> Var: + name = self.name + if use_alias and self.alias is not None: + name = self.alias + return Var(name, info[self.name].type) + + def to_argument(self, info: TypeInfo, typed: bool, force_optional: bool, use_alias: bool) -> Argument: + if typed and info[self.name].type is not None: + type_annotation = info[self.name].type + else: + type_annotation = AnyType(TypeOfAny.explicit) + return Argument( + variable=self.to_var(info, use_alias), + type_annotation=type_annotation, + initializer=None, + kind=ARG_NAMED_OPT if force_optional or not self.is_required else ARG_NAMED, + ) + + def serialize(self) -> JsonDict: + return self.__dict__ + + @classmethod + def deserialize(cls, info: TypeInfo, data: JsonDict) -> 'PydanticModelField': + return cls(**data) + + +class ModelConfigData: + def __init__( + self, + forbid_extra: Optional[bool] = None, + allow_mutation: Optional[bool] = None, + frozen: Optional[bool] = None, + orm_mode: Optional[bool] = None, + allow_population_by_field_name: Optional[bool] = None, + has_alias_generator: Optional[bool] = None, + ): + self.forbid_extra = forbid_extra + self.allow_mutation = allow_mutation + self.frozen = frozen + self.orm_mode = orm_mode + self.allow_population_by_field_name = allow_population_by_field_name + self.has_alias_generator = has_alias_generator + + def set_values_dict(self) -> Dict[str, Any]: + return {k: v for k, v in self.__dict__.items() if v is not None} + + def update(self, config: Optional['ModelConfigData']) -> None: + if config is None: + return + for k, v in config.set_values_dict().items(): + setattr(self, k, v) + + def setdefault(self, key: str, value: Any) -> None: + if getattr(self, key) is None: + setattr(self, key, value) + + +ERROR_ORM = ErrorCode('pydantic-orm', 'Invalid from_orm call', 'Pydantic') +ERROR_CONFIG = ErrorCode('pydantic-config', 'Invalid config value', 'Pydantic') +ERROR_ALIAS = ErrorCode('pydantic-alias', 'Dynamic alias disallowed', 'Pydantic') +ERROR_UNEXPECTED = ErrorCode('pydantic-unexpected', 'Unexpected behavior', 'Pydantic') +ERROR_UNTYPED = ErrorCode('pydantic-field', 'Untyped field disallowed', 'Pydantic') +ERROR_FIELD_DEFAULTS = ErrorCode('pydantic-field', 'Invalid Field defaults', 'Pydantic') + + +def error_from_orm(model_name: str, api: CheckerPluginInterface, context: Context) -> None: + api.fail(f'"{model_name}" does not have orm_mode=True', context, code=ERROR_ORM) + + +def error_invalid_config_value(name: str, api: SemanticAnalyzerPluginInterface, context: Context) -> None: + api.fail(f'Invalid value for "Config.{name}"', context, code=ERROR_CONFIG) + + +def error_required_dynamic_aliases(api: SemanticAnalyzerPluginInterface, context: Context) -> None: + api.fail('Required dynamic aliases disallowed', context, code=ERROR_ALIAS) + + +def error_unexpected_behavior(detail: str, api: CheckerPluginInterface, context: Context) -> None: # pragma: no cover + # Can't think of a good way to test this, but I confirmed it renders as desired by adding to a non-error path + link = 'https://github.com/pydantic/pydantic/issues/new/choose' + full_message = f'The pydantic mypy plugin ran into unexpected behavior: {detail}\n' + full_message += f'Please consider reporting this bug at {link} so we can try to fix it!' + api.fail(full_message, context, code=ERROR_UNEXPECTED) + + +def error_untyped_fields(api: SemanticAnalyzerPluginInterface, context: Context) -> None: + api.fail('Untyped fields disallowed', context, code=ERROR_UNTYPED) + + +def error_default_and_default_factory_specified(api: CheckerPluginInterface, context: Context) -> None: + api.fail('Field default and default_factory cannot be specified together', context, code=ERROR_FIELD_DEFAULTS) + + +def add_method( + ctx: ClassDefContext, + name: str, + args: List[Argument], + return_type: Type, + self_type: Optional[Type] = None, + tvar_def: Optional[TypeVarDef] = None, + is_classmethod: bool = False, + is_new: bool = False, + # is_staticmethod: bool = False, +) -> None: + """ + Adds a new method to a class. + + This can be dropped if/when https://github.com/python/mypy/issues/7301 is merged + """ + info = ctx.cls.info + + # First remove any previously generated methods with the same name + # to avoid clashes and problems in the semantic analyzer. + if name in info.names: + sym = info.names[name] + if sym.plugin_generated and isinstance(sym.node, FuncDef): + ctx.cls.defs.body.remove(sym.node) # pragma: no cover + + self_type = self_type or fill_typevars(info) + if is_classmethod or is_new: + first = [Argument(Var('_cls'), TypeType.make_normalized(self_type), None, ARG_POS)] + # elif is_staticmethod: + # first = [] + else: + self_type = self_type or fill_typevars(info) + first = [Argument(Var('__pydantic_self__'), self_type, None, ARG_POS)] + args = first + args + arg_types, arg_names, arg_kinds = [], [], [] + for arg in args: + assert arg.type_annotation, 'All arguments must be fully typed.' + arg_types.append(arg.type_annotation) + arg_names.append(get_name(arg.variable)) + arg_kinds.append(arg.kind) + + function_type = ctx.api.named_type(f'{BUILTINS_NAME}.function') + signature = CallableType(arg_types, arg_kinds, arg_names, return_type, function_type) + if tvar_def: + signature.variables = [tvar_def] + + func = FuncDef(name, args, Block([PassStmt()])) + func.info = info + func.type = set_callable_name(signature, func) + func.is_class = is_classmethod + # func.is_static = is_staticmethod + func._fullname = get_fullname(info) + '.' + name + func.line = info.line + + # NOTE: we would like the plugin generated node to dominate, but we still + # need to keep any existing definitions so they get semantically analyzed. + if name in info.names: + # Get a nice unique name instead. + r_name = get_unique_redefinition_name(name, info.names) + info.names[r_name] = info.names[name] + + if is_classmethod: # or is_staticmethod: + func.is_decorated = True + v = Var(name, func.type) + v.info = info + v._fullname = func._fullname + # if is_classmethod: + v.is_classmethod = True + dec = Decorator(func, [NameExpr('classmethod')], v) + # else: + # v.is_staticmethod = True + # dec = Decorator(func, [NameExpr('staticmethod')], v) + + dec.line = info.line + sym = SymbolTableNode(MDEF, dec) + else: + sym = SymbolTableNode(MDEF, func) + sym.plugin_generated = True + + info.names[name] = sym + info.defn.defs.body.append(func) + + +def get_fullname(x: Union[FuncBase, SymbolNode]) -> str: + """ + Used for compatibility with mypy 0.740; can be dropped once support for 0.740 is dropped. + """ + fn = x.fullname + if callable(fn): # pragma: no cover + return fn() + return fn + + +def get_name(x: Union[FuncBase, SymbolNode]) -> str: + """ + Used for compatibility with mypy 0.740; can be dropped once support for 0.740 is dropped. + """ + fn = x.name + if callable(fn): # pragma: no cover + return fn() + return fn + + +def parse_toml(config_file: str) -> Optional[Dict[str, Any]]: + if not config_file.endswith('.toml'): + return None + + read_mode = 'rb' + if sys.version_info >= (3, 11): + import tomllib as toml_ + else: + try: + import tomli as toml_ + except ImportError: + # older versions of mypy have toml as a dependency, not tomli + read_mode = 'r' + try: + import toml as toml_ # type: ignore[no-redef] + except ImportError: # pragma: no cover + import warnings + + warnings.warn('No TOML parser installed, cannot read configuration from `pyproject.toml`.') + return None + + with open(config_file, read_mode) as rf: + return toml_.load(rf) # type: ignore[arg-type] diff --git a/libs/win/pydantic/networks.cp37-win_amd64.pyd b/libs/win/pydantic/networks.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..08ef06cd0a5ce069750ca42a345ae909725f5a56 GIT binary patch literal 248320 zcmd>nd3aOR)^}+MR3N0Fk*c5(s)Aar)+$)54YZIzg2*g00)l{wkSHjlZIyV8q8Ep& z2sq-vb+`@;Eo~VK6exlSSQYd-Bt{e`1_$!}erunTsln^L@B4h;AD_=7JvrHX?X}mu z)*j*>vLGcbB_*XX{tt&!QdZ(G|0|S#|NNiyMky&R&sp6v<(*TupS!Y=Yx}wVC)_g4 zHf8GV?_6S)byRl(F|UNvXZ&^fAVFhf~_yny0orHzkmY zSC}mS`xeg`@-$c8@ENa~$gAkz6dNc?qT;{Qlu>A^IvIZ&epYYhy3}F7b?;?!mL; zYki)ayFL%2mn|h_)Fo5Lj`oaBNogU}f&>v+(kAA=LWt2Ns#!|T9DFea?MC2lAN-B^ zuP`O0`jRQCq0A9;6*|4%pk3i5Q>RTGgT6u&BE}&rleHT+`F1oUjZ#3XlxFx_-Jo4p zy#4?BzhHAre_QlFhi_O`y2Cd)E5qUQWMvMr_qPwQ53~<*lzcnIp_%rKOiOX(ZgBXD zvPQWy^Cf%IQgRRFhI5Y;=YHYT?3s=(rXe4trFhRp+eUS0TUPC9;RvTVH1m%;(o#a> z@vycA57#@ib}RAV)V4UZ-7c+LX4pFS$J7)6-TwjlX`2O{&(s{?96s|q=mB*#OAn`}SQf5#lyqw3ZRybL z>ES*(7-$OGmepHI$F)oW9)i4kw~l<)&RFELt@s!k4dg%GhKD{tem5RskzfA<5Yhse z_ZfnMBNJGk*hS>C_X;Hrd73!F#VMfDYI|(8T`5S*my0Axo)M-W8`iwCxVf zde7Q45M}NHu*nT#n(X17p(dFB_vipFbaY|NvTCo@rRAkq(^C9{J@%>!2z&4jf+@K* zrIELpLlbD2^(xw_u=RZQj&`g$jUB!Asv36eC*zy?f)wS{T8DEKc$_y$$C65#xt<_bsd^%=H}?;)IM};-NE6-V1z?E1|UC^G6d{1&qE7` zub`QL4SV`H!c84ok90@AX(XC^@08C+9VM5_Oz?$PhnZ--ZMk846@Au`wS|_lcQC59 zHmmJ5jV)z=$8$NpP`HGxZ6H`6lBaQQIF#Ykb_A}RsqiQZdlv%Lno}`VFWTFyYDs~7 zGiPlLe8*OGj{J4r^zfte@qGw#ZC%CJG4ITH=Z7MMt=~(B!x+j^<_d?y06iI?g|yoV z`12MiDRVz-TOJN)q|7~@ZnqR2aA@73YF-ecD9Z-I)W5G2ri*z21W71A5Rc#^c*a;A@r+l0$JY^xUo4zH48ZpqfPLnxD51W*eInyWJl!1OCP0G} zKZF^0Z;{U@93__s#qouOH_g3IwYZ2c#BD?~n` zi2VNDBp;}8#QQ9;yQy`A$a_eO4`F#gxspR{wIi0GByxYgP9SnepdGe8ARUegk#AH) zZVJ#sS|IQB;RYVqWiaNbsaY6@4oYbVj$hb z?jJcl)K+?kxErEStftY?4sv$LHI0ZgqhyM7dRPAwC9Q z!+>DTl~s5q*+7pA@r+j?*oFwVX6tj)Odrr>DE;sOF!bYdGOaA^aYpsyIyCp*eiHrY z4*dYP?5l`>JkJIhJUc;wja7_xGsq1PH|%{HIKG|{;n@L_wmtp^4SXGFxBdpr3Pf0U%G64I` zBLEnRb-RE)LRJ}ywGhq8DttbvVkKi$M7{b^G-B0j>Rn`ls25q4W{I#WNQ&Ntzz3|# z`i89ltQsNb>ihz`` z>Nk=W^Vhx3xAT&p6cZxM!tyApdCd>0?W z))Q2NSfy&`ArC~U7SaASk8tV_60|)sC)&TS*s6h2E#>P3PI*q#NHH<;O%w%2Qt(k|TN{`+ zl~hNxix~MMd1u7PU$06UBip`U2kM8+^0QMo%RB8=r*W2jkqai7r746?PXB;(q&4-9 zE~(xer*>;5#`Ij^)QS;2Zf6Y7pqs%rBVZ;Kub)v=tpI0W%L;2vDU zNduEs4e-uAlo%f8h8ezD%9;ZuiS4uAew!M=3uurIQ__48v^O-P-9Fq^T^s%x3&)1nkT(DcZ)r|JCufh)I=<0 z*F)6pRXHU0C3y7rN)20I`C9GZh%IK=#NnHenR`fEUz}U*)II>I zoW7YGGIPUDpJxN2(7?DTxy}T6nh?rJkC4n>)s3L00+h4l;;csA=1!MT*4mmUz zxJH&C$B;Y_>YM}dacdhPwj&^fVe7tsrKXfs&*%cc|7eN?cT4UOdzAw~{Wp5tl)ems zEvXf`4fFuIIQI~e;NY*Iq*J9`(eIFKrUA5`WM&{U^7euj?4@!*d#;pB%DNdJgFf`f zz*k`4@;mWtuWHTdRN_&D!CtkR2E#0THG5Y=&u)O8O~ylPI(h}>;LvtrkOwwKRP70l z=d+HIVRw0&JHn|BZC&sHV27b&xl3Sm9NSA;Si2cQW{sF0= z1n4!A@9pMr2$uz!Od zA%cD0QhW@Jf*P$T*Rg*c53$%UK1i`*Hu|$v2gCuq#gNUHcas1+!U|6l)<|xGp%Cm3 zBWXrl6qq+zbuK$%Dg9X9NoEQK9`t5%`~N9AFs;@NYa7VO$7yLPRiz>|<BC*x_rJCSdDXCP{N>-RNpMqdChY_#ASS zTqH?5zR+r!w7YG&^)Y3V_kgKUCV3jqRY(p~f=lsF*m{`U0mhAU>s1DCnWXS2tCup# z($okAwvqxV!UXHuPuQw9Hu7Nx|0rK4L_;@2AHvqn(t%~GNSUNK3VItszleWOD5;7T zO2VK<6$-d6Z5%T2+hC=nDm9F<$g0%yapcZkNOHf7X@RyG5Rc$OJcEmk@r+kqK#Gt% zT^P-t@S66k8@?HOfC=PVjXh zvPRwtkq;>%zj_PF$FRn`1PJCgiV*n&QsQaYHc)fe$85DdmY^hZHeV+Yxe-tfTgOO; zeM02HD&#zv5&_NPORx~2BSGh%7fROV?~N2n=CDx0%v)p!5$ds2;gen{Ip#_m0}hR_ zfu1kD10u5eYg)u7U-yo9JT7s+aBl~^mT>Pel!8eWU0LqKMr{RxW(rjk=68yBEQ<;6kl!75r9rba(-0B-+Yl-Vi%vD{**|HfBP_~(o=G=F z8vJ--Ii8=wGvrspGhUqrC=nJd)2E`D{*d%s%>L@tXz0rxDqs(JTrmnZ9__t%{5u6p zD3`>mSr(-tR?WKIO!|wO{T*n2@JED8Ka-SKpd<)=`eh$mHBhrne4W6hr{HwM*59Rr zQnS8F&1OVFA0g=de=Q6D%UptXX{L9?8;t0zb7>DmUleI3xfkJ5yIb+m$h|Ln1J8Qy zeIA~{rP}}{!lg$0Id^)UK?JV6&P?i*uibe9ww}4Sp-Ag6bLQTErbv<8o6gSPPtUzq z;6vDYFNGpjkDeW?#)lp;_rCo12!~FPjE}0^yWd{6YT#|M_&R|@$AEO$Iz&1sJ<@aU zy}w03(}xAG0_cb#{I}WnUOoF(>ZE7ix;`=c7KNfdA;T)t>YOFjt>Lf=-Dw;29DGOM zJ(((T@-npOL3~tbkwJWxNd_Jt1A|-D$W!zL+(g3(2VnYuS_CSp05WeQK8A*)?G^vT zg9`!VMR;&%dh~d<(1P)oM_`E}u0n{3`0D|I6pg<=r)1Mb-^ffE@mHfUq&#aQmeOK* zXT)FQUric+E&YHUs2eiN(Z6Dr^TB(2RXffSir*mg0%jBU=n41{#HC2UFLi3jNstzt zk98NPJ^};@(j*qktq%@k+LmuRUyxgm zZyToJma^9(Nb9NiAOmTn;**(*5Bm>OaWCie*|GRJbrI2*n!;b76BiSW*b?)35UBdE zM_T{EF7R5dM;Dy+eSP5mcxH4o z;ONY75!h@1OP=4`67&0GuNe9L?DuF9j_sEGz6dngew5iE$|po!&kJqfRI0z^UFy0h^)RLtKI<$QHk#@m1njW2DO8M1LJ(aWxNxNE zZlwBa&;*ou`$(#!`bb)HtE(QsOQDgyY8-G3rHQU25u1~x`t{7}<5QF5wE|V4!Ak$R z!p5`oGEJy;RS9sgSG@+30KLnG;-F74w%j(Oj{ z$@yxgudW3Zna-DH&BYt=_8P>os7d*Trsvi>eUmbrzG)C;w{Og06o1^lNdc5c+`efC z-M)MF6~ll*u25!>qUpKdg$w%I(S>@NO|18wx>V@t|9E_q^#95i@xb&y8xOGw^zip3 zgMaUBGTPW8u~`hbxsw2krvK+sE@;3@Bm%7q6b_fpGgN0u|0m!pN&j2aB~SldXw3A# zo2*fo+%IEb2K3q8_=LFrS^VLo_)lki1>VfZJAKYyB9d^Sa+t$^3T4h)p&ir&HRpEa z_$Wn#dtcM%JOdB0bG~IK1(b0~mH0A|?*|#8_}a}9VD&5-q_Jp_O*6zfe=>gP4Z5x7ec-EOOraS(DsNUXoG1k$4-r^N5Ol0<$h64(jh^RR{<`x>V5Py+#PyO zWzWA!&o9_>v7%r%_)7aK77P$40G4D&m*Azt*DaGFFEaKcYYV+Lm8E;r5$2+CCGqWzG;~fR(7_vl zY(^4*M?ePHnpIpI*WT~2vp9b(1D#!-CPjYd^w60lzcz{>V=nnMRUspoqzNWDcC9-{ zb%vWX9CT;N=S>v^V^Bbd4BBBWN5e`y%8iOR7!N6?F?lm`%;`q%xOEzjK86fq3vhD}$$k7=PCIiyR{sh*+u1=JSfN1C-$d}0Ieak_{sEpo)j}ldV z3Za*%YL7_29#w7D8Lyen7FZ&n%_*zCcGn1`sDM5QJp*J*S$hT(h^k(@F)E-f<((m* zt)NCpcK-CNrGOp;5HDxhJUYw9s7M9dN$i+lX*JVn+w`caUPV5!tB1&!E%>P%p6DSL?0ApzB3wM?J~RKv3R$btqI30%IhS)&5|pm;8>c~*Pd+AB{7 zYAy|CPjm@r_s4FL;2oSVaA@Efu=J8plgm9K&fZdXI-Rm!&<{4DYs@$8-GNjj`HF_1 zIz^$Xhf%|_CU7xh3h|u&msd166H8fdqjuN|) z(I6Cokvp`Qp-&COyac6_u=S6v68d0?E_)aEet?jj)xw2X>D(6lE2PuM0ktq%HhrV+`-ojQaNp1S*!YA0SJxUeD4Wfw-mn z_?c#`;32#Ub|iDP>HtS9B~3t2DA*zaWRl)uZfHp|~dS=IP^k{AYa#IC{RSxeaz#sN~>QEIJy zP;1>B?u&{E2>oEzTz-$GhS6_;!1FdRlo$#7WFGwtj7M*WmNys=;^01X$*#Eh6d>6Z z_bFVT9>CR0!K|Q^W&{f*>Dc8H%!SB>txgyKs?}*&f(}d`p!$MMWvAg=5bQX%;c}6N zdomG%R6Pa+?3FIij$zyJqzZSEDJM&IxERyAVdO1>a_5O~*olpLma@rwiU><^I6eZk z5kRf#VZrBJn&e)1{paf~@$uNeJWwMp9$OC2`CrCkue{FK1ffeb9($c-k%-+lFTqEN z$9BLJOFXtwLK|#Z)lL6)E+=W`^Xb1M@mL=K#&XPP0TzwN9wD1)M2vXs&3@83hklWI!Yy8;uPeI_nOS0Vj#aK6(ixQyEhjj}nh9rgTO0vfab@DDhbDC3s+! zs~8UvrR=OTUNb!;utY%L=A*A&e}NPg(BGkFqLfBFc2=LLfX2sT^Ppi#;<43hDWC@d zMB=e~zK+cDOV08n@mT4)|7kq-05Ja#;<5Emyl6aj6sW0qjJgE9+JLP&|7-DB51{sc zGahS%MeJxi=Bx$>6XLNizl?C@6gK|r@z`%MbOW6h8G!V7>@-6A>+x9G(?&e@)ANkS zZiVn*s|n+=u7G^9cuX0*GceZwRy^jx@X>gz_wtx{%!infDiITp-HBI5JoeNV5mNq( z0gdNRgn|N;NW^Q zomK_4i^RbdOs0R0kH=Plhtz(F$3E_*`o_d#w_qDaY&^!b5PM}dnEC%a9@~LE7FArh zvsW%AFaLc!_HWJyy?YVJ6SMyXp@XWHqO4nt98THwC3r1%z55FyYR2}LtMF0ct?rNF zf%UHfJjB+5hF40+^d9|lG~NO@#9PN9(g>m=M}*F$9bmk5hg4or|LQ57XQ<8+ZwM3pl<+PAi{O*yp{0hgiW{vc?dsU&LRDW4asQ zuo1ajun!aarmSR*p%4=Lvst!4q<^n7B3Y%)lj@i7%^gAWQPpVJ=BBf?&I43I+u3d>;s_jOG4wNr15+t>S61Xt0;FW z4nm_Fqm7WsY{t|S`ExU8u$WNYMs4tJ;Ms_1VB;(GXR|0H$wXV~l;xJ3vwdC%B5K_sQxt z@yD~URa5q#wnY~w&KBX+mD;nIZ|Vf3ymK7dfDEl??Do^iz|jR9WzmZ`y0}wzSQZw& zu>X_@4t8lnqWe!VNA5p$YP(m|#2jmBq!1oIJ1Hm%@mTOiRQE=Ch{SZSSI`Fh%0v=nb(GBoPwp$*u zls!khSe#4BTQ`dUWF}z>Be{>3Ht`~ggJk>X@`-2mq%;(4O{OPcfh;)%voY2M7QwWP zf>|Sy8gD`G!cmgR(~D^YZx~d`7czXy(?op*ochTU4ZN zvTJ(+eeR80uDa|Qn2CS4HMOwcK>I)(#_i*VLD7B;TXV6G_!^xljSH0H1eG4K*`-wc9!t6yN$Bt zaA>n(y=P_>hA?CNff|RcDerQ~fK!vs>FnmYFyw^U+;ktQy~Cw-#a7j~-a|70DHKDF zcycX}aD;iNwF%f0Y3I}1IcQn24QM+S1}zWSfQHL&x)@H3Edi&a%kRo6bZP6QUgPjv zQ@W(31bV??AcAgIc{NV^25EZ*(cnROGQUIMev_NEml_oC02N@(dHk$knzo3cwO+0_ zvB4Yz#wlUzf_ET*R|0IPuM_(^ETvpP;dxB}_<1t`XyyR`4=nE^2!P80R^RX&zp0*o zI08U%WC0ttUPG8Y028v=XFr-GEJ(O;tj=$~7VzvVS7JEr!$7CG6q8VA%Q;0dyiG9$ z+~N5S`~!!zH;_x*01U+D8htw63E+^Zz74{o2kcYh05${pZ z$RE#z7N`)e4`x^ogq<3eH6i1<^)BsKuy3yzsL!}Gn2OU7FbgWt2A>MMYb&U=i>2A^flG?n7Vf%Q+SWtqgDIp25ib<}1DUu0{X|G=Pz z(H|J^gDqtmkkdBO4Hp{t=x(?(ktrlH5V<%v-2EhOSkOJ>6?C5@y7zJBCr8&5kM0q) z_PepSWcr&C4yW5ImH<+yfM9fw>KT@&b2KhnMW!%}IP}J&)*M39dQrHJ~2a;W6E!*yCU?>?>Ch6YYb*^)p4Y zI~Z~{2#xEgwEE)LKz!aIN{q?55Ex-qq4^U)yJW*CIj}Hn^nQJ4OS>fDlPk&(zF!%3#}`5SRKCEGN*V2RNdwC*0_A* z>hS+w{C@!df9>+!`aS+0#s3I=#x=$N7Kg8RnHv#G=`YkcSaHk%4yCPfD5xx9=pi-$ zhc6jkh1M%Vt>u%Ze`<`-wu*DLzVN!@wN|{0fLaQmi^avbLsOy6x$`gs!^QNbWB?qR zT1sbgoNyi5EQ2wLw7F2V0eI@YrL<|JS)0U=0n9SEjX5w~x@U8*U{nczVZ(k*fC@~rE5EjSNCq_LbRg~0KzR+^(7Z5aq?c*n zKbTpVui|j|`#jhz(<|MXzs1wqjXb!JsTW3ZW0cTvSN>toSx&8Y^m{NwzQ2s$7r62R zo>6jQDSxeJ5c+%1f%X5Akp0${>+y#!F%JX6?+2eHb+kf)|MhKtXYQq1{*Jn)TXTZZ z5>=y1Prb`+(xuqKT|3$Uh!>(1+#&)}H08r!Jjh}qoKEpkzH#6I;x<{WEOy4H1ALu> zhrN7&VH}%f3-knB6gG`*QtKf=z$yz^fimv7;FsTeKClw}*DOy>S$#bzDq+25UPyWK zo3dHMiHQ%a{48VmP5Z^nTU+Z*qVd5L0&@ZwQcrA9@brW`V{EXmnxmP!C`_JWcfs3l z-NA4CILDwvkB<#(gg1ro;7QEClDB@-P;|#cO6SN#h7$=g;^)`Ub|l*3yL4;{LeOAG zOZ&=l2x{QST`ID4x1q_{_b59plHdmgu*0-I#&M?+!{f}yHrkI&o(5MGe4(%go z)!$(w+}d#oJn8rsEC3)kgJFAk7w;r_^Hns3e<-BkhqGWn=e3k?MYGDqKsA^pnY?K} zaA#&qp9vr7uzc>FF(HPxCQyH%jn9S0-=$Sx3lwBc77wi^AvO*e^1iROO4Ju*m*ZQ^Ax4N z;ge`1jI^$sowV~9qjMcQf6UGjohT3J(n_=D;tTXYQzE?v)9zsO-^u=8vi~pAL7#SM z7Rwmue-o^Bl9~Staw;=_pZ&jMf1dG_lg`nM?G#r{XpKZMyv1}BTr z**i1o;5Qqcce8U!D|F6}>AX~R?vtG1omA&e@QwC4*d)#eJ|03BI-r+QPpzKUrp*>Y+!L)2m&+7i8}Q_8QIR;sf~qd;A}kymK)$K~EiRDnNjF!mvFuk>>%Sny_^VV8dO9 z9C#D9KB7M9eX#2S>EXtInHZvec4xdjgmq zH+E5xLDf?bmEaaZT@k~fnToK;0he$d2h2alh+q&r{`)E-urcTY^y>gUbd@82v!_3E zI43-QFM9klVDEooPrtP-@@{c7-2jlKRq^%R1ugSP)g}XN;(h%HHpa34;-*NrT$=j; zJbeva0`{ychb}I@5G};T)2V;2oFja_!{^HCD7(lII|OdR#JH}S5DPoC4M8RfKy@Dk z1G6cEJHeD6y;D47K2vde$XzdBZR25*NEHRluc+n&Rr6fP4CdLwX#PB#Yt-Dkk?c3} z^n^sxnKx$zNHb4XozI}_(w%uDe&aXQu28Q!8qOTZp=j5S@cuz~bmrNr`$zDQKy}4k zGWG%i4OA~++a+j=gWUNnL+EoxjtB+dU1hZ}1h1g8edS(2N4kI76xsrprnHaVom$ES zznY?{DbN4u0{}K}1C^e~n~^QVd;4wM9NGq#&tY@;`d~AuBc0d1p}GW{V(xoC&w78s z4Qs{Pw+`O~6nui%xqlD|g2Oj`pUXF8XR-FP%Qt;914-Qcb_}7pZ2pr)gUeAQpvA~fY;~<_ z)k$pqMrpM%uGLYt%9K{iv*rRi+5qeX1OzT^W7zscTGq}p2em&>rIzNn!e;^ z)4+4FB*63L?uE%WK122~9)I7#sb?h|`y)31tNlGy@YXa~ZObRP{s%AxmALU!I5+%KP4CYYuVHPeHoGY$jTO?FWCDq?r5hqR0d& zde5wb=*c_|6QmQ=PZT}OYZ+&)&kL4b&8yp=&C8{kUKNFqxjk{YF}K6svt#ClqLH;k zn$-oST_Nm*twB`jJ!efA_yED*ksu3#a2S?S2k;BtNk)l&M3<=SEAb85?~w>|Mf@aJ z8Zg$Ro{Ijx&_7WIKw*eMpyj=(DcU}$1pS<{J7I?6zK ztVbwz?gjZk%isurr_EE^x(OMwGMqf?wkDTd51~a;1z(i4R3Gr@TwPmvz)S zF(5mwiZUGU#F8$hLPIU3O8}LMWGUlr?U;?z_i?xcFiF_$*4*i?eDftBnCB{2es;m% z@qi@B{0^z?H$Apg57qtFNAV~D@>^(Ao`Sir@dN8nrV|SrZtY7K(#cVwOUuO{e~w58 zlX?&Y`$<%{KDBD?(k# zM24V5iG#mf*Tf$&10A1K99NxV*EPSpB_?^?54sTurb3r&DP2PzN#XgsDKYIxUo{w_ zV61Dh^lN#Dm!^Xu7sC%?(CE6Rlz(y77&%GisaV&Xc9G~%v(@`4boX&6jrltmTBh?|uuyq3AeFb<(ZDv-mrFk4W!^UE+fr(?JYGJ$CqSi0L z0gc257i9eswkB}CKD|*C5x8=k&Y{>$hd5wCJ0c8N=tz)@t0Wz%MezmP($kT=3Vf7wWH$~Wg@B4ZlgoB6#3-|GcRxW4I=lDgl+%bZ=3G8ofKulbUQlc z)`zX*Bc0l?6Ar7_fD?>zW?c{&afH1x6W?N|Y$kK|gcO=~bf|FH@^ z9{X3qo-{1`x_om+(fi;TI&{}y+Wf|HZH({s30&JvlhuSehwrW_=r=uV^-_X$&c$qz z2z6b36D7}rvP3G%k*kML(!w|{Wqxf1dicfO+E+FOB?5mR(GUh*7tM1FH(|d98wJ^@ zLlb`THhr5zyCKt|?bm#qEfxO|6-l>boQ}X!k7Wv0`=zV+A_q;GGLNy?stiK(`TaUF2Wz2{q-rf`60gSW|8yA(7Q{7gLC&1Motl zFfL1| zL;nOsc;!-Y65HeA2JXqQA#TV)G91W<^MRdjw)z*aId~26AO-Z59P%+{U

9H&ei#H-J&L08EPkcE18PzX7nX9s;m00W8$pS#qMW2RneJ zc-xyTHS-(bJSOH~ci_ccT1EWEZ^|>E8xajB8@4`9culN8Kr_GkHd~s{LTCF*UZ)y( za)?AUU1j~BA}7)&QDsyR4bc?Dz5H(~=7@c;)~puNygzm_u3OGFoCt>nv+4O6&^ zBh^}*e;mNIo4HuKnJdgR-S9iw%G!;?8OH6T4y{b`AlylTg<7ZYo&c_+IOx_s!*vw< z+}dVbN3m0GrMPD^HhbuoQaDgNMl9XO?Vrv~3cLmfNC|bE8VoB$!Qtyq-Lk#~yP{VH zSfNL(yoC}6%NzYUigzCbPQG`trVEM^!(^1Vzz2K9Wguhlr8YEIln*IiARg)F=ZuX_ z(FH~SL^7f}mLT34sCZC}$45!ni&gNJDy@22jw z*QI*u#qHPeQKHGbae8t4Vmx4~>W591$y|>in*2jzAK7%;8n95@o+gl@#qCL$AFV^# z1Y(GU^?@@;D3BCsqF}9=dXUnk!XsjhT67ro&FG0WK7eCWSAhEA0~ z5}xf2SUPa%!;uZdN4y#3yp6_QF@`k!9txMpBLx@>ZYOAeJ9?WynoySF_9e>Fm!pK1 z$?9`cxmKYBBBPvvuf1XlN123w7z#dz6%VPkke${y!A{j^DjSsvDv9j0lzt@=hkBrY z4wS>%eHe#_7B(o<{p{oDy5RDDUwg$Y0zO2*_}v>Kr&GMxp!hX^Msbnz9f55z#BLK4 zZ$d=t0uLvluNqt9*bgJ6YCvBlpPPlcasWL-Ve?YNTe_hB15zb|IuoH-jG*3%k8*Uw zGe#HGNqC3|>Ivb2d5{2tyvosy(UeeM!Q}!edURtQg^+^!PofDy{p@s-(0r!enezIC zd?kxRwWzDe4Rt-KPEZ{SR1DE!K0XG|0Kw6932@OD_uBm}7O$Iu7Yi+#sbVtG6$P3B zh%R5=uTUw(3aWsEKoE^C05hH3n29@gNvIqaSaFZooe~sa^ZF59d(jOa%JZu z97E@J=!{ua3jl#`uXvs?ZfBt;-?SY-)CFSL>Xo70kfE(JuJ^W-Ei@+K@(;igUh(0` zB=CXPlw$_6+0z@q49NcUBkOqC_ZD9E-8=KhIv%$0V7KKK9EV8_gAnu?dVvnu%~>8Z zwF;uOF9T?S+{nV>l~dW2oFLCM_MW;!)q>Ah*k3| zu`M0B19ZJp+k>Bna{62wQOs(bMWf?z`^Ijx>2I;Pyd!X7JYT$LV6;uI#UQ?u1D%6` z8eFK6SZZ`Y9)UIu1DJ;67~BNx((cM+?21jmNNcn@5y@lRtPxYkuLS=g$JkVqZ(0j! z_09mSDfbgrf7CuOttmzR?y21NRHq9TeeMLN57PrjMbpH0o@%f70{Ftei%0~AVtXq` zZ*XD*2+}rN%6KA2H$=vXoF|CEENm5s-wo`Y2&C%C7yp3y5Rv&hN=i(yIdm?zb1q2O z4BX?Sn}Lb1rEDYw*))5u?nd~S<6HW_}$&^e^MKg5; zV&wV`;X0;d%E23_uV{NFFN7Gj9g>O6kD=C8Z9rJVwNUl!6*$F!OX&f%0h1Fgt_yo6 zQCi)N1u<0d^7B3~!2=dE%r^>UOjkqYWEX_rdKFcek@7&9NWtx|Ncuz^3ssI#{XED%x9RkIzZ^cgPnNTeN*8Uwmlct=NX?sNhr}i>#w*xvi zV_nJNM}YzcrKd}qCI-ds(okU0YGF{E8n(hB(MAm<)~a9+B#Ap1yrijuDtX&P_y30w zbJPaT0weJSbO=Rw-pg6A<)sJ?y@*2=anNfd#C|~dj!x`geObWaCxp*9 znJ6|-)-Drmo^di!jNUeo-a8#&dkqJ<{R5Ude8o$7=#K{#BQ_8Aq@kO=641 z%dl4r2bw~);AGy8EpdAS!Y~2c<0}}SztN0?{^gI!`)1h4-?1Y??A^@~j8|iSiaLDw>>P4J%}JMmTS@;X zxvK?pf{(*pQPsN0nA!s=*gO0X7Pq>}?IISua{DIlpml-a+mQ*%1$xGiN(VcgVC?|g zz=0)XSi0?jd9^l&_UR^RR1#~nVKx~e@p3!JP}vJ|l7Lo@`;hDv_jAZ_x=8brnCO3M zm*Ds$S$Xg@^i6J;KICjCD_2OD0K0UmKKf%Aorcj(1d`8@W_L;d$Q(N-nd8A(kvZZ= zMhc#N9(uw^)n4(O4xhh;MR_4H^z7h2HN3B#deRA^0$vx;5Cn?kb9QRRMY`_JbvT`rBF^p4;0tgq z^eiRwkPdMtAO;5moKtfnCOsbZlCw2vqc_;44|xUJ;CJgNxk}2}Zb`J=ZoOR#v@LcrJVOguyq!bAFGG*dT$ zB_47LU?K531zj1FwHJpZCxanle;XL*{I284`NFVuA-RKLCA*;)3;Z)(%pV|l*J5_v zu&i9p*wkL}FMW2^D8}Lb?z`i7a8|V4mwLM=(Jqk+Ve6UkeE8Rr2>gKFFCYCNL9H-= zNYH%rKxuFuoiF1K2fhGiub?L-NFnzvItLqZL}(E;O|$NF$4%KdyZG!3b`N0I;%0A( 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 z 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

T9pXhf2+slU_Czv5AtAht*n+^q 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 F{{(?:\d{1,3}\.){3}\d{1,3})(?=$|[/:#?])|' # ipv4 + r'(?P\[[A-F0-9]*:[A-F0-9:]+\])(?=$|[/:#?])|' # ipv6 + r'(?P[^\s/:?#]+)' # domain, validation occurs later + r')?' + r'(?::(?P\d+))?' # port +) +_scheme_regex = r'(?:(?P[a-z][a-z0-9+\-.]+)://)?' # scheme https://tools.ietf.org/html/rfc3986#appendix-A +_user_info_regex = r'(?:(?P[^\s:/]*)(?::(?P[^\s/]*))?@)?' +_path_regex = r'(?P/[^\s?#]*)?' +_query_regex = r'(?:\?(?P[^\s#]*))?' +_fragment_regex = r'(?:#(?P[^\s#]*))?' + + +def url_regex() -> Pattern[str]: + global _url_regex_cache + if _url_regex_cache is None: + _url_regex_cache = re.compile( + rf'{_scheme_regex}{_user_info_regex}{_host_regex}{_path_regex}{_query_regex}{_fragment_regex}', + re.IGNORECASE, + ) + return _url_regex_cache + + +def multi_host_url_regex() -> Pattern[str]: + """ + Compiled multi host url regex. + + Additionally to `url_regex` it allows to match multiple hosts. + E.g. host1.db.net,host2.db.net + """ + global _multi_host_url_regex_cache + if _multi_host_url_regex_cache is None: + _multi_host_url_regex_cache = re.compile( + rf'{_scheme_regex}{_user_info_regex}' + r'(?P([^/]*))' # validation occurs later + rf'{_path_regex}{_query_regex}{_fragment_regex}', + re.IGNORECASE, + ) + return _multi_host_url_regex_cache + + +def ascii_domain_regex() -> Pattern[str]: + global _ascii_domain_regex_cache + if _ascii_domain_regex_cache is None: + ascii_chunk = r'[_0-9a-z](?:[-_0-9a-z]{0,61}[_0-9a-z])?' + ascii_domain_ending = r'(?P\.[a-z]{2,63})?\.?' + _ascii_domain_regex_cache = re.compile( + fr'(?:{ascii_chunk}\.)*?{ascii_chunk}{ascii_domain_ending}', re.IGNORECASE + ) + return _ascii_domain_regex_cache + + +def int_domain_regex() -> Pattern[str]: + global _int_domain_regex_cache + if _int_domain_regex_cache is None: + int_chunk = r'[_0-9a-\U00040000](?:[-_0-9a-\U00040000]{0,61}[_0-9a-\U00040000])?' + int_domain_ending = r'(?P(\.[^\W\d_]{2,63})|(\.(?:xn--)[_0-9a-z-]{2,63}))?\.?' + _int_domain_regex_cache = re.compile(fr'(?:{int_chunk}\.)*?{int_chunk}{int_domain_ending}', re.IGNORECASE) + return _int_domain_regex_cache + + +def host_regex() -> Pattern[str]: + global _host_regex_cache + if _host_regex_cache is None: + _host_regex_cache = re.compile( + _host_regex, + re.IGNORECASE, + ) + return _host_regex_cache + + +class AnyUrl(str): + strip_whitespace = True + min_length = 1 + max_length = 2**16 + allowed_schemes: Optional[Collection[str]] = None + tld_required: bool = False + user_required: bool = False + host_required: bool = True + hidden_parts: Set[str] = set() + + __slots__ = ('scheme', 'user', 'password', 'host', 'tld', 'host_type', 'port', 'path', 'query', 'fragment') + + @no_type_check + def __new__(cls, url: Optional[str], **kwargs) -> object: + return str.__new__(cls, cls.build(**kwargs) if url is None else url) + + def __init__( + self, + url: str, + *, + scheme: str, + user: Optional[str] = None, + password: Optional[str] = None, + host: Optional[str] = None, + tld: Optional[str] = None, + host_type: str = 'domain', + port: Optional[str] = None, + path: Optional[str] = None, + query: Optional[str] = None, + fragment: Optional[str] = None, + ) -> None: + str.__init__(url) + self.scheme = scheme + self.user = user + self.password = password + self.host = host + self.tld = tld + self.host_type = host_type + self.port = port + self.path = path + self.query = query + self.fragment = fragment + + @classmethod + def build( + cls, + *, + scheme: str, + user: Optional[str] = None, + password: Optional[str] = None, + host: str, + port: Optional[str] = None, + path: Optional[str] = None, + query: Optional[str] = None, + fragment: Optional[str] = None, + **_kwargs: str, + ) -> str: + parts = Parts( + scheme=scheme, + user=user, + password=password, + host=host, + port=port, + path=path, + query=query, + fragment=fragment, + **_kwargs, # type: ignore[misc] + ) + + url = scheme + '://' + if user: + url += user + if password: + url += ':' + password + if user or password: + url += '@' + url += host + if port and ('port' not in cls.hidden_parts or cls.get_default_parts(parts).get('port') != port): + url += ':' + port + if path: + url += path + if query: + url += '?' + query + if fragment: + url += '#' + fragment + return url + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + update_not_none(field_schema, minLength=cls.min_length, maxLength=cls.max_length, format='uri') + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls.validate + + @classmethod + def validate(cls, value: Any, field: 'ModelField', config: 'BaseConfig') -> 'AnyUrl': + if value.__class__ == cls: + return value + value = str_validator(value) + if cls.strip_whitespace: + value = value.strip() + url: str = cast(str, constr_length_validator(value, field, config)) + + m = cls._match_url(url) + # the regex should always match, if it doesn't please report with details of the URL tried + assert m, 'URL regex failed unexpectedly' + + original_parts = cast('Parts', m.groupdict()) + parts = cls.apply_default_parts(original_parts) + parts = cls.validate_parts(parts) + + if m.end() != len(url): + raise errors.UrlExtraError(extra=url[m.end() :]) + + return cls._build_url(m, url, parts) + + @classmethod + def _build_url(cls, m: Match[str], url: str, parts: 'Parts') -> 'AnyUrl': + """ + Validate hosts and build the AnyUrl object. Split from `validate` so this method + can be altered in `MultiHostDsn`. + """ + host, tld, host_type, rebuild = cls.validate_host(parts) + + return cls( + None if rebuild else url, + scheme=parts['scheme'], + user=parts['user'], + password=parts['password'], + host=host, + tld=tld, + host_type=host_type, + port=parts['port'], + path=parts['path'], + query=parts['query'], + fragment=parts['fragment'], + ) + + @staticmethod + def _match_url(url: str) -> Optional[Match[str]]: + return url_regex().match(url) + + @staticmethod + def _validate_port(port: Optional[str]) -> None: + if port is not None and int(port) > 65_535: + raise errors.UrlPortError() + + @classmethod + def validate_parts(cls, parts: 'Parts', validate_port: bool = True) -> 'Parts': + """ + A method used to validate parts of a URL. + Could be overridden to set default values for parts if missing + """ + scheme = parts['scheme'] + if scheme is None: + raise errors.UrlSchemeError() + + if cls.allowed_schemes and scheme.lower() not in cls.allowed_schemes: + raise errors.UrlSchemePermittedError(set(cls.allowed_schemes)) + + if validate_port: + cls._validate_port(parts['port']) + + user = parts['user'] + if cls.user_required and user is None: + raise errors.UrlUserInfoError() + + return parts + + @classmethod + def validate_host(cls, parts: 'Parts') -> Tuple[str, Optional[str], str, bool]: + tld, host_type, rebuild = None, None, False + for f in ('domain', 'ipv4', 'ipv6'): + host = parts[f] # type: ignore[literal-required] + if host: + host_type = f + break + + if host is None: + if cls.host_required: + raise errors.UrlHostError() + elif host_type == 'domain': + is_international = False + d = ascii_domain_regex().fullmatch(host) + if d is None: + d = int_domain_regex().fullmatch(host) + if d is None: + raise errors.UrlHostError() + is_international = True + + tld = d.group('tld') + if tld is None and not is_international: + d = int_domain_regex().fullmatch(host) + assert d is not None + tld = d.group('tld') + is_international = True + + if tld is not None: + tld = tld[1:] + elif cls.tld_required: + raise errors.UrlHostTldError() + + if is_international: + host_type = 'int_domain' + rebuild = True + host = host.encode('idna').decode('ascii') + if tld is not None: + tld = tld.encode('idna').decode('ascii') + + return host, tld, host_type, rebuild # type: ignore + + @staticmethod + def get_default_parts(parts: 'Parts') -> 'Parts': + return {} + + @classmethod + def apply_default_parts(cls, parts: 'Parts') -> 'Parts': + for key, value in cls.get_default_parts(parts).items(): + if not parts[key]: # type: ignore[literal-required] + parts[key] = value # type: ignore[literal-required] + return parts + + def __repr__(self) -> str: + extra = ', '.join(f'{n}={getattr(self, n)!r}' for n in self.__slots__ if getattr(self, n) is not None) + return f'{self.__class__.__name__}({super().__repr__()}, {extra})' + + +class AnyHttpUrl(AnyUrl): + allowed_schemes = {'http', 'https'} + + __slots__ = () + + +class HttpUrl(AnyHttpUrl): + tld_required = True + # https://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers + max_length = 2083 + hidden_parts = {'port'} + + @staticmethod + def get_default_parts(parts: 'Parts') -> 'Parts': + return {'port': '80' if parts['scheme'] == 'http' else '443'} + + +class FileUrl(AnyUrl): + allowed_schemes = {'file'} + host_required = False + + __slots__ = () + + +class MultiHostDsn(AnyUrl): + __slots__ = AnyUrl.__slots__ + ('hosts',) + + def __init__(self, *args: Any, hosts: Optional[List['HostParts']] = None, **kwargs: Any): + super().__init__(*args, **kwargs) + self.hosts = hosts + + @staticmethod + def _match_url(url: str) -> Optional[Match[str]]: + return multi_host_url_regex().match(url) + + @classmethod + def validate_parts(cls, parts: 'Parts', validate_port: bool = True) -> 'Parts': + return super().validate_parts(parts, validate_port=False) + + @classmethod + def _build_url(cls, m: Match[str], url: str, parts: 'Parts') -> 'MultiHostDsn': + hosts_parts: List['HostParts'] = [] + host_re = host_regex() + for host in m.groupdict()['hosts'].split(','): + d: Parts = host_re.match(host).groupdict() # type: ignore + host, tld, host_type, rebuild = cls.validate_host(d) + port = d.get('port') + cls._validate_port(port) + hosts_parts.append( + { + 'host': host, + 'host_type': host_type, + 'tld': tld, + 'rebuild': rebuild, + 'port': port, + } + ) + + if len(hosts_parts) > 1: + return cls( + None if any([hp['rebuild'] for hp in hosts_parts]) else url, + scheme=parts['scheme'], + user=parts['user'], + password=parts['password'], + path=parts['path'], + query=parts['query'], + fragment=parts['fragment'], + host_type=None, + hosts=hosts_parts, + ) + else: + # backwards compatibility with single host + host_part = hosts_parts[0] + return cls( + None if host_part['rebuild'] else url, + scheme=parts['scheme'], + user=parts['user'], + password=parts['password'], + host=host_part['host'], + tld=host_part['tld'], + host_type=host_part['host_type'], + port=host_part.get('port'), + path=parts['path'], + query=parts['query'], + fragment=parts['fragment'], + ) + + +class PostgresDsn(MultiHostDsn): + allowed_schemes = { + 'postgres', + 'postgresql', + 'postgresql+asyncpg', + 'postgresql+pg8000', + 'postgresql+psycopg2', + 'postgresql+psycopg2cffi', + 'postgresql+py-postgresql', + 'postgresql+pygresql', + } + user_required = True + + __slots__ = () + + +class CockroachDsn(AnyUrl): + allowed_schemes = { + 'cockroachdb', + 'cockroachdb+psycopg2', + 'cockroachdb+asyncpg', + } + user_required = True + + +class AmqpDsn(AnyUrl): + allowed_schemes = {'amqp', 'amqps'} + host_required = False + + +class RedisDsn(AnyUrl): + __slots__ = () + allowed_schemes = {'redis', 'rediss'} + host_required = False + + @staticmethod + def get_default_parts(parts: 'Parts') -> 'Parts': + return { + 'domain': 'localhost' if not (parts['ipv4'] or parts['ipv6']) else '', + 'port': '6379', + 'path': '/0', + } + + +class MongoDsn(AnyUrl): + allowed_schemes = {'mongodb'} + + # TODO: Needed to generic "Parts" for "Replica Set", "Sharded Cluster", and other mongodb deployment modes + @staticmethod + def get_default_parts(parts: 'Parts') -> 'Parts': + return { + 'port': '27017', + } + + +class KafkaDsn(AnyUrl): + allowed_schemes = {'kafka'} + + @staticmethod + def get_default_parts(parts: 'Parts') -> 'Parts': + return { + 'domain': 'localhost', + 'port': '9092', + } + + +def stricturl( + *, + strip_whitespace: bool = True, + min_length: int = 1, + max_length: int = 2**16, + tld_required: bool = True, + host_required: bool = True, + allowed_schemes: Optional[Collection[str]] = None, +) -> Type[AnyUrl]: + # use kwargs then define conf in a dict to aid with IDE type hinting + namespace = dict( + strip_whitespace=strip_whitespace, + min_length=min_length, + max_length=max_length, + tld_required=tld_required, + host_required=host_required, + allowed_schemes=allowed_schemes, + ) + return type('UrlValue', (AnyUrl,), namespace) + + +def import_email_validator() -> None: + global email_validator + try: + import email_validator + except ImportError as e: + raise ImportError('email-validator is not installed, run `pip install pydantic[email]`') from e + + +class EmailStr(str): + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + field_schema.update(type='string', format='email') + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + # included here and below so the error happens straight away + import_email_validator() + + yield str_validator + yield cls.validate + + @classmethod + def validate(cls, value: Union[str]) -> str: + return validate_email(value)[1] + + +class NameEmail(Representation): + __slots__ = 'name', 'email' + + def __init__(self, name: str, email: str): + self.name = name + self.email = email + + def __eq__(self, other: Any) -> bool: + return isinstance(other, NameEmail) and (self.name, self.email) == (other.name, other.email) + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + field_schema.update(type='string', format='name-email') + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + import_email_validator() + + yield cls.validate + + @classmethod + def validate(cls, value: Any) -> 'NameEmail': + if value.__class__ == cls: + return value + value = str_validator(value) + return cls(*validate_email(value)) + + def __str__(self) -> str: + return f'{self.name} <{self.email}>' + + +class IPvAnyAddress(_BaseAddress): + __slots__ = () + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + field_schema.update(type='string', format='ipvanyaddress') + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls.validate + + @classmethod + def validate(cls, value: Union[str, bytes, int]) -> Union[IPv4Address, IPv6Address]: + try: + return IPv4Address(value) + except ValueError: + pass + + try: + return IPv6Address(value) + except ValueError: + raise errors.IPvAnyAddressError() + + +class IPvAnyInterface(_BaseAddress): + __slots__ = () + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + field_schema.update(type='string', format='ipvanyinterface') + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls.validate + + @classmethod + def validate(cls, value: NetworkType) -> Union[IPv4Interface, IPv6Interface]: + try: + return IPv4Interface(value) + except ValueError: + pass + + try: + return IPv6Interface(value) + except ValueError: + raise errors.IPvAnyInterfaceError() + + +class IPvAnyNetwork(_BaseNetwork): # type: ignore + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + field_schema.update(type='string', format='ipvanynetwork') + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls.validate + + @classmethod + def validate(cls, value: NetworkType) -> Union[IPv4Network, IPv6Network]: + # Assume IP Network is defined with a default value for ``strict`` argument. + # Define your own class if you want to specify network address check strictness. + try: + return IPv4Network(value) + except ValueError: + pass + + try: + return IPv6Network(value) + except ValueError: + raise errors.IPvAnyNetworkError() + + +pretty_email_regex = re.compile(r'([\w ]*?) *<(.*)> *') + + +def validate_email(value: Union[str]) -> Tuple[str, str]: + """ + Brutally simple email address validation. Note unlike most email address validation + * raw ip address (literal) domain parts are not allowed. + * "John Doe " style "pretty" email addresses are processed + * the local part check is extremely basic. This raises the possibility of unicode spoofing, but no better + solution is really possible. + * spaces are striped from the beginning and end of addresses but no error is raised + + See RFC 5322 but treat it with suspicion, there seems to exist no universally acknowledged test for a valid email! + """ + if email_validator is None: + import_email_validator() + + m = pretty_email_regex.fullmatch(value) + name: Optional[str] = None + if m: + name, value = m.groups() + + email = value.strip() + + try: + email_validator.validate_email(email, check_deliverability=False) + except email_validator.EmailNotValidError as e: + raise errors.EmailError() from e + + at_index = email.index('@') + local_part = email[:at_index] # RFC 5321, local part must be case-sensitive. + global_part = email[at_index:].lower() + + return name or local_part, local_part + global_part diff --git a/libs/win/pydantic/parse.cp37-win_amd64.pyd b/libs/win/pydantic/parse.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..80090237115f684a7bc6254f1c3f59a4afe693c5 GIT binary patch literal 50176 zcmeFa3wTw<)i=I#IU!sQCmh!8G{l7!?yA|Z*%IS>>P zOkz21PfJ^^_Gae((eE7H#7TO0#x7c`@i4w zJlbJoUX3bh_)~s2xX7;A|+6`KYrfI48wJc5Bij+V3;_rX{lb)n$1J8bDp!Q_n z{Uf&~`Sy=2t*&WuH#F8SZLC=CuB@o5s}Hyr``wMfI(JQ-yKvSV_wxEG{{*MAUzS3h z*08d4+Mr>5?B5wRcl61}^UfPG)0pvZkepqFAbBpq4_#PqJ2y2ieF@PJEUnhaSJKMX>A>=`nBg0=%*6s2~iY=6gy#b3OAs^Nn>MaK0F(WBsE@a-K6n zty$|u$@n$TQNSfAH;VMM#`5#qZmYc0|o%V*YRHT%q}ENDk< zR<#d9SI)5k0%svWd}e7@e%H4Ei-H^!K*}g85#`;D6j7j>GW3O=S#1JpDu*NN7)V6| z3E4(iAIzGt<8w|1l4zKHjoqLQqJ_#mc?-exoSyE@>kJGmZrd9;6MepjX5BePURR*hFpEUp4AcdOf%t!;6-e1F zCTw3zzZlQmC1~_>G(!FD@%8zc#ikdEDkKQtK_IdFTq9JPmF+Y4`$Dzk;niaE1z)Ht z%k4E^j9ei^blfm^8|Ix-M{{0^Y^x&fpJYW?yY4wEv!~3n$aB5ty0S&r@1oYnehd@( zZKTif%!PSbU|7js^RUl+Buh+zP&LSDh~ykILd{3LRuP2dc#wh!l>_L{zEHyuF!r^vcru(o*gsT=Z)xd$C={!G(K05hP)9+DGyiS z2&0{ZzG_%05ZxRwW9ffUqJoy`K6COs*!^(xS)LsiviYXIWFc`?LdzS4P+yO{JdNnY zvJAe_Xd)ZU6ODTDO}XwYI1$^9vjnl1u;G(v=xU>Dgg!=eFcC_y7=#KXSjV!M5;Wqm z`&z*E1wgkKN}wSVRf2u1_&_CiSriK;7|LvD{3QaDtpsOS`gs%sWDq2w4__)|x`KaI-t-h-XJBxtW!Y^4`O5m}y2Rjj-n$FsoeKO0v68S3@|P z?H)xtS{|?YPoXS-Pf!+cn~dGIo)A2OhnL;wJ3CWDuPr$Y#0SAz1dG@3NS|-Lp2#6Z?DORa)^EsX!OUdnYV(6t|o~_9m@xCFHeE|G^rDSaWl->LW zHXkXPPY_eg7AHn9=U8O!BFvHFFl21BmW|e+&ssKm6DF;9pKusj?}FxevCgL#hXYyZ zpRL^lD)5u;YW+PDL(Y4z`4U)t^BELC-l@_6tQP_mEMg*Ld3M~!e%@n0rsL)nNW$~d zjojp*VVH|DDc&m#b4>;v5KhI<46BbAWtjbBC`2)rw^u3bpLx(0;(^B#9IhlyjTz`Q z-=xzq>k4*p94<=mbntmEmfam$Al9>E11b2IgUu7g0|tENUuAb*GY!}btY{m_p@se( zF9ngyot_@N3M7J7E8sEAx(t#Ct?Z4h7^^8s*&q2dpM6~jQV-LKy%NfOP$2&&seO&q z-hVkjgz5-e^S2g^%FUxZJDw!1S1VdwZSOHBXGhoTBJXtljzvP}Cqc`E&Y!`un9dKt zqtN*;F*ZWyKj9$RI=`K437y{s1WM;4gb0mznI&;LKa46zo$n`lKNz|9Vm6UFe=L=G z;iE$l-rjanonOf@mqvm5r;*d<^E^BDlhfJ6@E>(P6B}O9pESyyaPma+Lu@`?G*28< zsq+;J<8=N`Hd=!|UtyznQ%>wN=LogF3zLoOeij;Ix(p28JleD4k8G2Lj)HLU^kI-s z5w{)Ak07u}zq}}Q(DpH&9T7qwV-GN%f0%k=Pdmm4o&11s2LLB#S!{v@26(O1tYY)i zE|?>Gft3^O{ihR`+OxzkVr}lA4>Q)YBL!xu>n72+V^9;i4$l=ct;jHM5!!p1VFoeN z_EUk)zf;G#_^O#EboW3c{W8)_-R%jU9@E|K{#5KdF~=~ukD<#o=yDLdY~nK2+r0bC zV-V6}>I62haQ219K8|Ohv427)rm>S>!K2XFAA(70?1&A>MAxtWJk_s;-a79LK@cc8}oQ_O!az<8jCNsP^nQ zhfK`HvzM!Ro?{aT5B8O->>s=HIFI4EW4ST%b_Ua}@2y9x?vW_|EsEpIoG3ejL9+Be zvPRl6OqmPdf3c5`NsZ||{3MfCE&W@K%m}Ft2I-vufu+J`SH$@n*!i5qJv)~Y?`4*DTp;8( zm*i&dI8Qw6!z}LZzvCS7;Ku{VIvZpaV>Jsq!_cEbbGOHQGcs`w>o5;;jueBA46j&; z#CB5nJw9_aH+l?XAO{5sWR)1$iLC|Z;lY?&_)Zp2+C#;a(q%lU;uge{S~z}hp=)f!HjBY!Jn7;m zIM~(o!Z!A64-@F85~vbYm}&r8Cx8khP@nd1Q(BBC)kM)86c8hAhb@3$Hos-9t?wTNV z?wL<8qW^_>(x*bMaq*;gQScw)Nv{bL<@~S~goGV4sj@1bw39Vq$HSZ~C&rVimLZ;$ zj4c~tMedsj=^Tm1Qnex%&*~jdn#2xH8c(_j1AnS`(xYgF;KE8lB!Ua?qgN46noG4b zofpT~_l_rZ-T>hLg?LiUY~udr@g!f!a5JWah$>=A24YG+^P#M@m|~!?^f4r%1&BaY zN9g7tzI4~yqDOcgm%>YImsT^&k&){eCn3p>bkHTlT{bDM~v{Kh|WCl8!F=o(V1=~6X`PMdfE+Q?<*O6yE?`oTt>+t zT*gx~sJMImq8N9*T*iHo^vQxXo3A9n7kXxBq-)qo_{urL6OVFV-sH)G+P}NnzN6d~ z$=i7+=glRc?Tu%ir@f9nj2GJ$o$}ze>wHinw!#@Z;JIs__67poOz(aaR$&hD$&mw0p&)OoW>|2Z|`%T+we-WhZ|h_=U?t68&4TPkvW8uXdyk{N64|7yLc}a$RkY3OP9LBkiE9^=>{hMmgC;QP;b8 z+yPe?Qg3BX-xIqZ1kHuUmYkf(Tp<$S{DH`+p7x)z>3p%t(eFeXvR;~_MitsO{%7$2 zcVOd%Zhl7CXRxX3J$E>2ms%E17MvZA5QpGmJF;Tb-Xq@VsEv3XkKNY*_7P^_oK1aD zbgV*1bxVkWh9)3ziBY?e+0cj|2~5h+Ah!16Qh_oBxLkpqli!!I1hrAj;?yuYXY z4bqUt7L1_ajKR{UgEODx3`6Ykv>zeNU(p!4dq2oSV8x37ivD4ha04=Scmz9tBv^+8 z`_U$Xy&%9|NCbPEU_S(y5599VAb|A0U4h5@pyo4T~A^ltaA7< z*NDN{Pp79`>}B4FESb*g+N^S}R@i==u!9o&5$*^Nz%fpe?qCIXcdVL#@&duPkvl7cx<^oR5%kLnj#jU@|)0diWMwSWN+x22y2XgS)h);-jC za}UnZE07VMfCvrFPiJTl%+k?#Pypc=td&4C=AX;p}<8xvjbH# zMHNnl|H%%4yAYupgdJ_%MVOH5xkh!L1)jDFs=&-8K*SD4pvKZy5p7sM&+evz&q7u0 zZY*IN(9O61LpO(@N1~gn?QRa0%We>AK{tbCH*X4D;N}a|s&2+hZZ_N9j6P*I&C9#t zL^=O1NCYR#MHhkjI6ox1uzr_~{>L%&OA+gM4=n;iWk2P1KRZxZ2u?Xe5~OCWDn98H z@}=!70M5(>_+EXvBp_l zI|vZ^N!C{43q6w6fz;Cf3X(kAu#jpz81I7=d!GAhiR-WtzEd3Rdcs#HTY4KX7v=0V zLchzR9^-T_+$zs~$Kk%kz9masXSbp`(7Cpxru)MBlb~TcAhp(xK=G8MAdZ$ht(}J1 zX`n&N@zm7_YdJ0{XII!Qv~*!-=)CtKVBTx#Q&=2w+>b}x!U(~+|m7c^*w*SBV2ZbJg{(HM7l$p+HNI$uiXG}o3PDQmx&5bRfk z+v90lR>`Fs4D>4zM4?kgreWYrS8yo2>U$&OE)U8 z(lGPW3v)MO3Dj2ig~rf-=^la+`3*pg+yZytLX@r-mcaQZG(>Rb4p#9*d)0Nwj2#z$ zHwO;;*b5WRIYJ{Ie-L1ZRxXef-8X{GotKd*VtE!=K+5x$oU zuA2qupEEI1nCZo1DXTyi;towOP@`$LXLktfCP?4zxMkmh|!{3 z#~)c5miEE|a8LrjA!sD5nCr%R zHzyrO_BdU7k-_Nxm~oc=w}q(Ek%E|RL|n1`v|hCIJkn02w@39Vx}9olVVu< zXi5~TUEng@+Zp4_tvnvQqcC^Wrj4K?2c*CGGq%+;@eI=M2YXSvhqV8iboZPAP5K3M z?;{7l>so?Rc_6Fbvitzb!Tw87br=9kH$f(=M*;sVA#HuLT~`KLg-jk}%e&apbY4p! zbLts_mN(&lgY^@3t5XG+qTg|7vx1$3^;?11$5TP*QTH_{3XS;Seh|Ec=qF3`U!nl$ z@4Qb`?-x&}>g7$MmE5tH4B5-DxL(?1FaO?X_i}K!P=Z^4UR+{>I6bnf-vh?dU!%Z6 zj=$gmQgOBZ2=IV;>ZeSw>OCpz_uKV1iF(J+QNK+XV$+!md=TbN(L`S;uop5q?D(t7 zLtz}>SNSo>uT*)rrI$+l9}>TLNRV*4=)!piifGDBM&NW7Bj=UKQ|GZj&6j;t%lia~{s({vi{`uv zjV=95U=mYfKY`8}f@X=P6=>IkR*7~|46QR**Q<(xt`2`-E#a)2oL9j&VPcP$evN` znZ9aJH2*7`&p%mTx*sihyc$ekB&GdtY~m6<>YgYgqXi?M&r^(0wc0-*wg5kda~lhlG^?io8K@L z9Q5u>|0CcThWKfMC{o)kHt~^KQ{M&{apLEk1r9BJq|H|<`AQl9$a4VM8+oES2ye~O ze=|3pG)MaYw$1}-;NmUxBhIJeM(lagN6s9(n2V0&Q=;61^~13sJ5>1aQl9X1UDu0;C4=QU``G5&6X_#ExLHrF*yCyn}Kz({2+fXuO913#DsuI&!W z;!HvgJt^{3g?v&kLOUPD0_D0@&^c_uTEh6o?&J1KlFwFwJuny|F;)otRc2_~O<})(~tMp6)n9fT? zTNP6q4gxp`ro(Nc3^}(GFf`&(CUI9(R$vflh}%Ykf5z4RDN@*9?5R&fUR^YQ8#rSE z=+{1-Z2e{++c+MW4er7#GR5R@+=VA2lm>%>o7;PcO+r2VYJ!FJ?bq-LZqZBVZF@h^**=p{ zPjWJuju%R(;Jmw8iuf>A-!KwyZc%!0fX}=Nfw&?Fh<7-PfliD*?3dPlEm1s<98k1G zQG6^>yx0pxvO>{Mq8P9pjkWel{KeI6Q(yK2>e+s%nlfd-0;OvIf1WT~hlKdLSv>Ya zLe7H zaVL@iCs@FQ!Yb_M3@)E3iXIb)ZH~f`yn@ViNor za*CS-ui{Zmf>*we3@5=}WWdQp(N;|Y9Sq4yaE6UC(?-EN8iX7m3~lBWLON&r)NIDy{unB%k}6UVKAIrhqWCfV?k84(I;~4MS{L z3LJnO7=>IdATLjVyn~SE0}>MQk$4`+SD#0S(1^b>i8B+kC{0S}J7UToj2sZeND196%Jdu%ZcFG^;1;t0 zU|Rd#B!4aD)QJ*WQ*28pRq#DMq2bTiaH2r(D7A^qb#6me@VyCb;`sg{9tGc-%uq92 z1TdYMqOIclOLQsuPO?#koJ*JujhHVG#x!F-hC%RcI@#!8u{Zij#q^U_@=16TZGti}j61&vc1EMNLiFAdaG`~kkX&FR4moQ8=nGBlhZ2Uq&-Ge;lsR`n%s%rdSPNcB ziXS7zZ>Lj7t58Lm4#MPa|1HWr;rgLnJ5eY2ce3GeT9YSPAt1UQLM_gsGcoyb2>3m(;XlfXc0zOwM(v4=P9;-e@g5D#%hGS- ziTlmS-8e>32SyOOtNm4?IEcB4(~!s*RI1@{wZG1qr#Nd7_Yk}bu?4`W5L*t*qGB7x zU||<#5oMH(?z+}Wv1PGq(|NbRpw4QWuObmgfq0FLIOIG7h!KkW!*?jQ_X1hGxGRT52x8O3}L_7*}I1-|xIUJEG$D*%jtH$C3gPrsMyQDV{w)M62-^y$n|5k~kdn0151~xiz0(1w z>>fruyFCf!tm}Pjk3sm6E0J)2=Xe=8FJ?=o7pGKiZjE8YPPAt91*A1YF7lI1VnL4# z^z|j)i_mW`=Lbg-C+HS*oA1$yrSqV$W*+p<)sqT)VY`#Krjf=(vxsSZ_zvnGBh_yp zXX)v(A@%F^Qs~!((9L!i+n)_u(BPNR2D-@xZ%&UY)JFGYui;U!{~%Bb_J4#7*nd#8RqWr6o+SHsiekb3FlIv| zzQ-hv{XbJwoMk%@-yr)HVl1RG|5}v6>3FX&s>=P^vq|$Xv7vFC#;)jb__FA7r1DX? z9E0tibDg`94Q8R1dc(1lYv1JEcs|BH`t4IK+HE&b~!8 z7>vYu7+284$hY)45IKo}PxfJZ6)47FU)=Q*G1>6`0jNhmKo@+96#}A*7Y{6b8)#5V z0@%H{eF@pEL{)Fa!V&}b;zQ|PeE(&-7q@SOz7~htHzDzweY~MQlv>>08_JjjzGdX; z5)32!bxTk4*a}&HVS7FM`v(yuhF#$=D>Wj@cJ5=krU-uYv!W>9gETCCOTNH|b5;WV zQsQ#8ts@gy7r6wMWOp@+##1Y1VxCsi_O(x7DR!1Doy^inEFH$u zTbZ*4pe$R~>!_zP&+Nu6%Bg(_&6@Uq0j9fj`%vaLF+X(s5az$ne824(%(o$rMz0iu z$X@RXB;NVAgBEnt@mc{dF~ou!bV4tXuMUi|{ZQT)%9PQeLU!nA-`ZdFwFG?`EmOY@ zp=p6a_*W5%&b#%{+Pw!=>lK``+$Z}&Nt z{`-6ab?{9h=i65xAJ%`#Da|O=d3-h=(iR^!i^>kR5M8qHl2yPpBEd-L|XTIGcFWEi=g zjNoXm`Ld;d3>w76SeK=bq9kZ^&jSw8J9KL$j(^Z0z662$6I;A_#{ySv;48c)K6(I@ zVp^FADDNZ6!*l{I{gulV%2z?UM0q5zf}u}f3O)_B7=!8Dz03fw)yB9NjLzdJ-q3*E z-DmS6S~V=cG46oT`8f(x;VbqB5w6yixM9I>PoR3gFN`k^7-3w_u=M?TLY{5garIHY z(NT`k%cipM8wluZp|EPsR8VN&_Y*4lW3&`^W;o=DjZEhomw|_{J|Arp8ZAL10WVv| z_k_;ZDtNyvp_V>euDfq>|XxB;M0oAedjY%eze?v~C5W zav~BD*C+t4)qM$8;#6F{FI1Za+5+&zK%ivD?S*D@Wr9M#W$AwaEjV@+(`JtdEcDBmVP(bu=3r7yp&|(BPlR=dFgoXH|$*I;X<-JmwFZ8ovV)^y_Q>t zXu<1RZgm#~=fU?4o^4cKnPKF;5FCovzkGDCa29Yd@-(!ti4?D0or|i{Cu5@U^L`fG=}YPJ8edW0o&4zqlr$hi5pq?FbWO__|}Yp z!IWR4IVg_i3-OTcnLat`|y3hB3tTm4CH3z!WIzLYipXs&q z4XCmVckTlBE&VM0HaxwMpM_?-ePK)quelIozif=xY{K^&-W5|SW)yqN8;TD}(lnt{ zs)}K5f*L>)9|rqdy5mx;nv7E6ejIzvcT34T@BqQ<5d0@FMV9_47GwxMHK(JyRwxcc_CsPt z!qQ|4Nu8ivy_W#RZ|wU_uz%(k$MQ44bwfJnJ<^>D?ZVN@rKH5>ZxkND-?`v#u;6cq zWpw<5*{U0J~HUU1S#&Jr30DY&ja9O3es*Xef_$x^3Yt%skeaEbyb9 z>@ARiIbj`&YoG8SuAS3VW#fL3VD311hc}O+oFj5Mw`sJ}gbjQXZz5%quuK01!cKBM zmu;0NpqkQ5o-qEO!e)0o#yb+cuSn2^wfuNurf&lJq@J@LN92&wSGkjtJi-fpW z9GL0j%5A>t`Am>SRIavVSPP(3$!r$Z--WHSot}H((RMA8)$dLg)dPenhq5&BSz271 z&e-gi^1xD2OQpe;SbOF3q~q1)JjcJ$7Zwelumr&o)GN1GvBgV&h2iPRkr`jWRz3*| z0e(6d-2?UmeT1HLFU20HQf%U>75SF_ zy5NFZ5h%d^9#X`v9K(M|ypsS|BUJ6iscU5Xm$ov9`_xxLh~hI2z3$divGNVR&3zr# z9xS*eoKN|EH1VkpjW~dB z5U0UMMxOphbdIm+bUVc4g%tL{f6Rc{N)5EadjW0VsUR_2;wrN?8oOeM}Xf zhGL&NC&QOFKf~2FU7+VR$yu4W=FFG5aiOsv?&w;swy~%*XJDD`EHr1iJ!Yq;Gm?z| zJuOH3;Qzurc&-k>Jj2aacp40dJK#LlnQy-6D%@kF?4wPdVR%F_{^lF5!b3*Nn=GDh zc<_C(VBbR5mcFhn$=yTnn9Rqg`?{V^?sgQKea+;;ygjbAhk)DL@J%GJ`OIlzw#n%y?)+Bl&y%u z>QQGj9vKbQx=a8;5#}J z9nbuek2bXki|s$mFS+YDjpk@%l-R&k;tNC0SaYMsRlw4%>z9>5hb>|Cmgz2h8=-4n{SJBA|kSAXm z2@a(^Tx~LRA!O3^6Cf6g1y)~7x;qJcl2wj@h6`hh2i_OP{X>Bm0_X!4AppE(QH-3W zf5#Tokw5|LPEV5x zwcRNseN_hEN%*0Wv(p&26DB6<)^Rkpx>=No`S;lo+8e`Fbhv8+z|GwWW!<;J>ZSrB zedQ!5!__~rEVK2FC;jL$Wv6x2y#7pJF*@Hp%jkc&drrb5Fn7bxK>+-SP@BVe6 z3h%k06nlttkU5R(z3H5Ro{G(U*jEhfFD?)}Gpu4$#M;gon9q49Hd2dr`OFpRcpLW~ zU_orB?Fa{OUpLN!XJ){f8hJA_TrD(*_^JjFUWVRx<8|onN6}^(P$Nb!+w5YS>1YGj zaC$~l0PE%pXdr;s6`L!n87o`l&0UiTUfPbV^5964jOEgmIfPuZZloN>1AQ559-1ES znlAm6JoF=YS&R&t;2QiUQS>UnZP?)g7V0^bdLayK;B2n?+)lqtaM)8IjeoZRq%@}0(*s<62p!q9U zsqZ zw6EUK1}3K@365(P8U#RpoF=6Pw?j+vz&ZGPNw^S@#J(}{lCY=4OSb&iiH_uyyUsAz zZ4~`>1iaix?!idV=D<3JS_B~3^|`dIKG?b5X6Gw-)^>1p%r59|cQONnp-ob3Oirmb(ZNS1I{u=C zJ5O}>pSzjqBRyrcjNKw_H`yQZXf%>ugyJJrNC)pkvFuNu>yphJw% zuSGtwrD-cL>qWj-y**N_7x~2cn;YoQU%}u(w)xN8WzB2chUp?TiOYip|9*FRUQ_ex zqYzkwrB`NQ1mU*8(_7X+CuR!WNxpFoZH%4T*yE3obzi8I(Q@+`Ezno^rnv$G&X>hv zzfa6s1jL7=Os1M@aLO_EWz@P@m9OyLt81lH{pUGk|-f_k2Ww97+M2sYX{OD_R zlw+l3D7D8nR_YZ4C7f$~E=G*q`8mgOo0`|0YsdG+;Kf=vV_?*4}vUh%n{lkq!ETgN? zEXiP~*3Q)?xg^H z2Obu@cF^a%4*lSZXJU~*?q;9eR~3VA`EtP<-BXDU@p$y!1yC+v=ZL0Z-79Ey4v)jI zMPf*|n+vC(!iSef&p$S0dhK6@{LFP!9H@O3wgHIge|}kN@K$^{9&{df2Fi_{VKHft z{&gPhG~DY4&?kj*Vef4pxLY$4b@)!Y;P*aH^c+O4bqhmPi zKmhiV=G8dJ0ptsjzGD6!=e9z|DNn*ybV5h%!M1ckcr6JJ6+n|af&*+5@Jo_{qZY`k zpka4GGkG+2x2#3NRszgk-(er{F1xL7oEhr847>dKOE{h%gWm5MJcw|#Xs71`sP{9}@v=COOpq$1rMSN+>hrmeaX1F8;uy}C7@g>htQ$DhI zKeM13Mi6dW5d^-M@JU8!2HdiJp@L@kFl$LOc~s7g@@hgY8%2d!`fy%*Hc5iuMNB#> zL(EmN#ZWUee-1w!KL%!yTXE;lx%q_#_cgJZer^oDK1c%rve1e_q!OQ5SZ2Mka>Goca_VxK9cq z*(3i2gFl?bhvRrj^LvEnDYdve6TnmVLZJB)az~@D7Be~N<$%su*Rz4w(%k~*)R8Es zhhH@Ho)Ks)u4Z6Y3+3P~5{}SVBX8=>sKa4L-qcUfihCafUEV<%7#W@OA-_`E7ZnH! z&PE}92>nJuigU40hzs1Li-Xow4$BIeL0p)dklD@U^1~`2ND?1_EIDy;)yh=!hPwtAasiF!>`FK3@=D3%KQE5*W)VJ zBqM|^kR*2h5|1z4g}lYeS9#NEe@aMGHNNUX&GO)%D}Y{2F+Z{N1wx=l!F(pqnD#`< zaFk>AK;r3zW{2mq!`&%`P-sj}=pw#4Lp>ZLbg&389!$_R90FXanvD09#Axh~d~zDY$9y}3BOalqBP0QJ+r|QzAq4YI_&(`7-RJY3 zL^Js@55a#Gng}ovAu<^0K{$!pcqCZ0uR8xG1}y6dycu-1u602Th*)yOK)|_XU zFB+YHN;Ogr+TTxcWq5kLj{U@T`N z#?FEbU26p4Z?RXF$jWGEsv7lUKW)%HC8?snXW2P#*D_qy@P zn^}>Aeev`KG&3?1MR0Cjq)LRH&mxHo9KeMjI5u*<1b3red?6z2G+7_%Po!r8DNKu& zKhe5lUxXhn&u_JYS41-5bkJF7nW8a>wkN`C@#qu|&3BTVgq7H__t{mxP77g%n+P(d{UG*>_AgKTqmB~e2gfHD_36t z8gAv4oWG-s@H7ii{FOxrLal|S(SY{DWv6Vx{18h|L7{n=7kznRKwlqHGv9>BA{)6} zM62$JuW~~9WL1lm6ucNnC!!foN)JRnhRCtvLaQP#2-nlmM|K<-Xv5&V1@i!t$pZD76g2wb& zxazoe!}Fz&F-d}s$d4fe99MDA00oIE0lodM?|^i)kNU$r+56>bR5XOke}D|`iHOHN z&-6{zIIr9bF`MsV8CPZu%am=WLuQt~9%V3m@-4mnW1;j*=0Fb~MkTNEO@R?C#*i7f zuZI8!?k|QMe*^&7znH}#$1i6~$b95~jhfw#btqxCyB#+p$Fbb)Xj8eZm=2n;tb?=b z7Pj1-n#5TUD>t3nr=dLLOLg0YSSXzv?LsuX4x~pc4qwZ2Qy|FvIpQERA3l$z-#Qqr z%_oinDL=o}!7B^pVpFr6HQ+VZXsODY0t&=cMAZ5aM1)xIiS8Fz2w&TmHHLeL>v%o! zax}Acw^+%mALHPaEfV2DQ90KzKY%RVkVZP`dv@Xj?~MN;L&N*7(yPDQ1aZf>@`{Lj!Bn z4^RQ!3_Hi;x$EDss(1nIBII!sQ>DNc`74iSTGF#3@5@Xw`a*=CeMNqYMiBH!zhS11 z%I1ihMtZly$lDVblGD*+xE^yJhmi~ZeWJAao0Gaf<9uM-CfT-6WDD$3_pr!9Ji~0> zC5uxhc69fNgz>OBNp#3IF#c1aW-$JDOMEu2TLIVF5oDvmkw*E@CsKn<_Xlz9BlA%b znTsy`h?*xJB8+IocI@2}Tfee`w2>Nx?zFbQmT=-McM)<`D8*nzaC)R*9Oq z(H)tXzB|!Y@cJ!*1nz&>d7QI}>)v*hMP8KH9g(L5Cq`t({tprkeRya48}o zD{qMW1%rT*90S)h3slY~VjXS4I;p;v&kpe%m;fo~EOFI4UWZ9BTJ~7~aNX({2>|Hg z`AGQ46puMbUU2*i)*?wr91-_zK!P}sa{2F!2FteghXGlV>&Xn3`o`^aJ$>~Mqh)8Nk@B+ZX%Eh22dwpl2fS#6hGcp3 zUdCqQssX;d&c=Q?lt}6H<#jZ|815X?{SE>jSfHpWLt1Xi(r#g{AM`Q}X|hn$%w1AO zcf1uj2+`)e0=e{W<%b`>rJqleC`4(?@obc6cf1uyZG9y;AaV>1u%3Q|#AcW}hWRuf z^QvXkSVCjBgPqx2Bm78KKCd#Z`+yFL`IfTOZ#%_Mq?-Hoj}@O|h&+dx2fD+>J)W(H zxO$84?BWsMeFLyz{xkx#M)>Z-sKnX;YlwIkYd|{Q1CUlQd{op5pqM4ZWDiGJL0iZ! zm~nHV;VTt}*|vw3u$Co8sEyr_5K-vadM|qwYen07WFs9IAiD(?^KvZlB|6j>X(@Hq z(kB8ZJOQpUzz46*2p9FZ?t(;cQCZGgoXDE zC^P)Sc|w+A*5XTUe3{p?`aF^iLJCbfFsU{fu4mru+tjb9e<#|mK$G2$OprnB zg(0Votm~P-4so@7R~Bd}covpb3yt{vQc-tC(<(rm+0+E|Nr$ina~u5+$=ii+INay# zx^!1?zUkNp=$1X{yB*IUgL$Kc99xm|9NXm%OljHU-tD*_j~HxJ{0zCRfI3uo?%_iG zD}$MIUEEnmFFP7^wm8?KHa|3C1riSO82ZJGWVbw*QMOAgf$$-6I&vMgfWQ($*G&9i z|I?4s{+;;y3-Px{{M{-3J}3UZApY(Ve_s@TUlV`dz~7f%+MKitxaGQ7YwcL&kp-iUPchcckavH%3W8P zL$Jv!$iTA7>!`;HlTuuP{;n-ZTaNblQug?A(9Pb3UDtd98!;+H5cDB@dz-bmG`63! zj>Z*7vvKvK8bNnHgNSb2=DDLdpEmFMuJ>?p5g+%B7P}*_pk#xn+!d>kz&W@+Da){} zK^QX0#8iQe;q_8q*tzFp?CZ^<26HZAGR5VQz;THw8*>_6h!#0}*G<8|ci;k}*@<$< z^8bpT%x5JTgP)PbYH| zkNi&7+^3!&P|r5}`>Om?m8PkBw@Rm}^!KWMk$PUCQX5a&Q!+PPrIS=TO{KF{TCUP& zmENw>AEr>S(FN~=}ctkUnP^dXhDtMq_M|E$t4 zRGR*@?B^_%PEe_#(s?SqL8Z+q{q#xM?q2o$E0w;W(!(m{zYxZs<0{R74dYLiN~fsQ zr_ySbu2$){Rr-)hpH%4!Dm|>yh)Taw>40srAGb;;sdTzZuT^QCN^eu?y(-mZkV7;#;+~Tu<$^<97Lcv{!1w|5TOR&;PsWhJ&)d>_alO@nI=R_-R;GRZ$nH zsl2YCqOr+8q0)xyRo<{lRoLYdBz##}m48V^ur|TXdw*SJeN|1}Qs(*Nud8ZWSre$1PntG*W__K%6u_h1^^0%t zR|eeG6;1BCdUr)2&{(rL81TDCkD8E^-85RZ5FIY5sTIgkbTWGEYQd7-kxIQFud$)g zkH7B9>WaFhes>ifDg*v1_jq@px~9p!yuK<}>vvaH)Vb^HYFD`z``zpn05x@idX)K@ ziDGF0riRA)N`F%m4vOn4mJ8C#%0!z+ic#hy0cB;RP71fav1Vyaon78gQMs&QDXTy? zL>Ma%RI9;2QB!cSq_3>WU(r}ujczI{0yXt@7#sc+OX5ch-bV{zR@657E2_wczs_B= zyrI4k%uaC6_K&Zrs|nOp)Ydc!3~umVS08XU1sfC$@GTD3)COv7?3z}&Do|ZtSJoJW zl9AK0G8;nDm^dDq#xC5w3xSt%!pP1YZTAYjgYR8M9{4k=Y0OynQc$xT%2?BY@mNt& z8}v81m((}9m-$z%tZ%GxS2QjSE{CWDBGqof#O!RgRWKONU{io&2qlIdDlx_IW0Zq+ z{^ka$0;k06Z?32e)UMJ-+4ut$%RtSj2~+UrrYd(seG_C^Usq8ZrE1iKi<;bHSh=)j zg}-jBAh5WmsR?AbIX{%fOTyJ(PmCqelN`bt%%a9d&JNLTOq5UsZ-R8)oR9UvfZN~L2;tV$0d|&{i)969ovBOEo` z-GoN9RZy`Neqag&8!>!th!ffpsHm$1drREYDw_O7&6WNJ%H{&0UZZ9cV`D{4lmAk; z->!34)>bsd2CD*ExL6kT#v8+TiI-hAF}EydqBf@*Mxx4H zAV*bbh3wg$PZfzOc4~OqTXMIuu^x)TUN3M58dqURE9;jx)KGmO*RnFoxU4KTo%~Qn zm}xbyY{e=oyD?Z%`^{iEl1qYhmDG*VP3|fPoihl1FRxf7bOqD4%3lln9JLEg{s7F; zQuoQ*34%C;#6|R=JGP*mNP8ei%OV#Z0S@?OEB{jqB93oRRwfitn&6X(r&j~gT~<{e zU6(;$eI-n%D5uyY8BuwwM?A;m%Ca)p|Jo(7bwT2_xfXomp;!IV+WN&6wL(|R%G84b z5$!8$>zjg&YW-3V3H9|=G5WBst96X@$o`e@An1!pk@bmk<#U4E@T`_K>2}~5>K&|% z_HbF{Dt18yagUk{@4!8(;d0=WN)LN4?J*q(WkC~dZ!b7y&c$MGH#osolkRC1FcO^U zOKK~YHqkhim6fb&E-P3yU6CV<;ew6K-fq@DJzKp?6>rJ|kckF9u(*KmM|s zy0SoHMWuf+d?b_uCjD;d2bYz>nWMu5J@wSBI>G;hUR9vA(5j~3k|j0Gf=uXF@A;Id ze?50e{B%#*f-9kIyZKyJCYK&!p3tx?x=Pyf`G$%W71H7pn()#l$|p@LX{-;_SJsPm zh%GL+%gf5(X2;E2bX&i&tf8iInOrw!OUJ8-OEue2o=lZUHM)AXug-FNJm8^<{x}xF zz>+Df;}6@#`}Y_VfzWo@)ILJ&7ciD$F(`_ocTS*jn%o&ke2}-j0t=y+V*I1T0;HiL zP+eQISfgH0(@Psy(VW9@OAQguh+Fb2^YIdxIvwUqjE5}|>3AqUl;baW1@02`C8+|> zbu~f(*+0u{{^Y*LhC(Ebo4o&qpY)EzeVg5dq4aElO6~G!`rkxP6o2o`Lno)RMA28S z(rT49sI*z7MEBBVL&f^Wfa-!|%>9S(yP~LM!j8@m7N`JBg~lO)L{|9VpAk-Jl7LbW_!0`j#EPQ2aFp zDzm&E(a)ZQvTH>@hvLghCEVeJG6{DSWjzk`(=6#Z^a%8j^!VlTnBTxQ@L9@yBC=XD z%BU-s-|PVC<>Y+QeB*rXBKu%yA- z;GT@50}l=8=-1GeKp6Vbj^LCrrn3%=L9~?6x3_{XTwmh^{O9sZXaz>QnuEwC;e#Jq12A#aw!*n z8Exc@G;Ky8SIa1!qNPu|L_3O+nSqhW*hKze1LB^Oa5bwRWZrLLT0_#%bZsd9`G}#j zg~S`2awN(1F6;3xId8jxR!-*Uo}_fOL_=W_!z2js!>HTbP%9cg>d zDW12XY^}o2`uOLBHX7D$)Z6&QIF$C~IFyeZl%@@OFJ0>w=mWig&S4cQ!0%CkHw}6L z-9VjoLLJ694mJsAwP_QRvy)PjwA5*sFPvkgkmn@KGt4nTcU79U0lw&G@Zbu6CFK(T zoRoq7L01OGA!Fizqa&#=q>JsAYuZMv5Y2YGxMv~HX(=VioSUKzbR6Tmu~E}H@w=IA zPEXTL$J`qDUVqJj15cLk!|(4DzQkvab>D>cNtF8}oIVdp)`om9L-I4p2`3429lvM( z8hy+dpv^!Z(=mTNucc|1ffwgK16wVFPr?UY|JV z=pn4DpiH|LYiggHwe}w!OarJ!uGOoVwaLlbqE^T<@(4#{dPAex~(tFX(nsz$;gY$uhsi0wYa!C@t z$I^E(p3_sc^v2YNlyc~ZGgWg=f@~(HmGq^)oTF(ro>}WO?JfM40}s=rXB!99P8Xy_|;IJ z0eg4`QhMCtAfO@VlJP6C6RKEVb@8MLaDTOuRbB*V%S64l{!zlppVVi7YlB?>?6T%( zkwaNV9NZq1twmXWT-n;+K}S(`s-OQkkCl@7pYvELhyOW`m2&u>^H^mu9+&CYoyQJ= z`QqV%I;dcnL0g*~J-C?T4|s5Zh&3XmWEJ8{B3LQT{_3VT)-OlYLPRpI0G5JiAWtCC z3W#M+SyNpDU;;}t3(uw1jH}EER0RBGSNa3mFC7R1mK9X{E0@joR|ZAc%vZC#CZN3x zjEHxXfdEMwb{^=1vC^6Tl|{=N0;{wq6wH-87K)yZ6f>-bn8?Z)7sZTyRBCT3`1uu$ z0N1poNhPu9qab=7OBxxVM<=+>ShC88*khTeX%6H0WdX$0QbBPcL&BiU8}KhLo547p zQPEVbg#hmr=YnN2k%x#r{|bMtVnVBllcT3eNfZ~nB)79FAp`_$@x?H^Zy{#8_mOB_ z$^hOp1n|lXKV!_3D8qQc&aDIgmCO89l<>L01JRTv#=Aa5X|afi3P!bcFH_dID3L_YwT#Ser{@q^KF44F0`RLBvPT6vt3hCJAZI2KnywezF6 zLBJfGcR{kRs8NAP6!Ldjf&C%qu8(o8#Ih)^q|xu!9#v91VR~z2F-T};p}!U}vZ&oE zsKu%Ne18SZ$`Zs5nqxIH>p{yB&}~~Y%)-*?Q#9>?xH3*Udz>DiY-$iorb*C(G5$PN zRgxb~%e5son>PeBtvc2pc%`n{+WCm$M-Zs3jO(+|Pvfd-^8sPoIZeACPw`rg9lBj2 z=-CyAK@6UDebhp!F^RKKXMwJn!R3qnjb+|C9FA(*CYw9ac#EQLW__`Ld3_@|x!3MZ zA+!0oA%R0N^jc4JgbV#k&;iW2RvrgeP$sQM4seQKcUf!=@zhn#;e5R@jvspxj0axo z9!ZpXw<8X!w4$a~9HnS)vwv7*41%!tfmq+(rqafsU&~aOX2QfvOcwx?v?(RxOk@LR zl&uTQGGYH^;ag&MvST$lwXq6n&Z;I%772A*j7qhnV0Xna zR7*0HTa5HyI5xKJ5hjgm*e~NG5tF8-&5U6c#^_S=$vG{?dDBT-*<+AQy6xWOR4t(o z&>#-Ub1s=sMeFv@)Y*aBf{F%QSn$K=%=Q&vw*hB_8-sjLg&1c-NrwC5b9 z{>J4sb?`0hB5hNOw@E$JH%|9gkk%61*5I|EhSaNr{>D`$uxGT$xM)#;lR|c$b0T(c zm3B#7sa$SRsP#($C2}}RarWnF0t0^Lv`I;YxDbSE3KG~?v$zpQ@*IpN?T!@A4qh3$ z$v=n2#em(=HiFth|Ki|MoOaq&&M2Bav&fe-QOZ0W=U)Y7O}J!Jv!tf7ObQRu8in$v zK$W;HhC{w3^*F6>3N+TQD#N8D%)-lYpJRCw+yQM~!R)y+OTEQK7fs5RI4{=Fq9y>w zmur{A@@0PQ3Jr(j)x2nh$}$dmChkw*I!Mh@$Pou|I6PZfh67Z@>vLpF$&y{=uUk=r z+Yr231V1GK0?T?cHqGiD$2nS=zZni7+`@#4q3DlrnpV+JGk$p!ci!VG8w2Cjsp|9bZ;OJ1`q`z=5_cEWfG<4^MBL1e@u z%j17G{ZyWZA$ll&+$v2~>3=n`@gruvHb#SpEsN*g__nJ4vzJPEyM1rCQ$26^iEMWi z+atEkUn0}q@EgA&+$IILR^jP51-`A{5N?lxv-!(ceD z;I#Zii-I!(F<)_}kYE?aoIr^z=;)Ae`6|^q6Wc|b^`bjFTJe7-Q~iddYtQR4ouZyM zsdTGK5%fsl+osN~%KxkF^VNN!@<9@Bij7dEhgALMb5CAxgP%&D?0P%>O5wAg?R1ag zZ-YHfcEu^u48`vUKa+GNY6%)8Ns2NRoUu{D_3e#M!A((crT0rX$0^`8sqx8I_R0+W zaYz+?_o{w>r{H?e2brI~xXV1qT1$U}(TdVqAui$VRoA{&X8)M5)@r#q& z#2*EBT;Y52Yw+22W}|{TmA>4o`h7_C+gtB#elr!^0tJWL28ln4KDUBvJ_Ve72N?H7 z6x>e~eZA+otuLDuzem4@zMijvv->raK4&Za>#fgrzqUQzpy)dlzY*1M-NDr}i2zYRhIi~0#-d6G8=eP3$Y3s5F z5d;^$e7<@6%bS@uZ^P#0`*tI0T(+7A6*Vpi)!(D{95-kvsJe){j;&sYhN^D7&Har{ zu6LVpPO9s8NcFeX{m7`gj;h;go~Bh@b(`@ksk%ekoL^5}Z%B>v-ScWP55lUyS=HaY z^I$R)?!E#4(Z^vjhmY|7y2hF=JUq*5t#~-ewh133w=q`_7{#aX!u{wdJ`MdRf`0fN zQ8S+k`kBtDNv7@RU98$uFZ>1RcwvY<#u|P)t0tMXH8N!b+J!%%F@8E{Ci$}mULw2d z27DTy!pGrPD1+CbWXO)=r?X^|F?;c4{@4ud!grC5FTuU9kkh~?VLhX1eS8Og^D4*3 z>+r+Zg6o~mj!A}W32BXhSMjrW9XjO1WSpn-VUinbqXlY&H&Gg2dY!CKHmEPa_mJep zgcp$H!-Ut6-9$^AU=EhPO9;K8?4JG_N9+u?z?RXeJGTN+%liZo`HY!si`~&Iu*N~j&4S4Y5 zz^C94o#NbtGoJ+Q!g=MB@QaI@_BAzEU?0iPh;Zgo;6rfjQ^tTA$qYY_tbDt8`>TpkUq zh1}E5AI;NJd{6S(U*7qo%|{FSiuqHMO;C%`-Miw^xyhdQ#VDW9&L^U5k>t~&CANbt zFGk;AUWxA8yYqnsw!1Fp-(Y_^9h_cSjIw`r&k6~M{L;#N{^YTY2TekHqW_w129wm0msQ*o+}?zm3J={f^v-5EL~XY6b^p<1{WtHo=@TBTO4^=kdv zs5Y*J>ydh*o~&o*W8dBbK`E>&A3IkH()p=P)lZzh_VX0};smYZ&~(;PI{n;T8doAY8`%1e6%ujo}h z-RpUMZ{&@=upjXge$vnSIlt^z{EpxC*ZrZdwL+~}E8a@CGOc2()Y4mStKS;5#;uK3 lq&?S8wo~m~yU?z*tL<*P*B-V Any: + if proto is None and content_type: + if content_type.endswith(('json', 'javascript')): + pass + elif allow_pickle and content_type.endswith('pickle'): + proto = Protocol.pickle + else: + raise TypeError(f'Unknown content-type: {content_type}') + + proto = proto or Protocol.json + + if proto == Protocol.json: + if isinstance(b, bytes): + b = b.decode(encoding) + return json_loads(b) + elif proto == Protocol.pickle: + if not allow_pickle: + raise RuntimeError('Trying to decode with pickle with allow_pickle=False') + bb = b if isinstance(b, bytes) else b.encode() + return pickle.loads(bb) + else: + raise TypeError(f'Unknown protocol: {proto}') + + +def load_file( + path: Union[str, Path], + *, + content_type: str = None, + encoding: str = 'utf8', + proto: Protocol = None, + allow_pickle: bool = False, + json_loads: Callable[[str], Any] = json.loads, +) -> Any: + path = Path(path) + b = path.read_bytes() + if content_type is None: + if path.suffix in ('.js', '.json'): + proto = Protocol.json + elif path.suffix == '.pkl': + proto = Protocol.pickle + + return load_str_bytes( + b, proto=proto, content_type=content_type, encoding=encoding, allow_pickle=allow_pickle, json_loads=json_loads + ) diff --git a/libs/win/pydantic/py.typed b/libs/win/pydantic/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/libs/win/pydantic/schema.cp37-win_amd64.pyd b/libs/win/pydantic/schema.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..c142e02d1964eee8d59b0a4ea5f81a2bb489ea64 GIT binary patch literal 346624 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 (&@ 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�(#pA8iuro>JAl<6CQVW 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

  • *K&< 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 literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/schema.py b/libs/win/pydantic/schema.py new file mode 100644 index 00000000..e7af56f1 --- /dev/null +++ b/libs/win/pydantic/schema.py @@ -0,0 +1,1153 @@ +import re +import warnings +from collections import defaultdict +from datetime import date, datetime, time, timedelta +from decimal import Decimal +from enum import Enum +from ipaddress import IPv4Address, IPv4Interface, IPv4Network, IPv6Address, IPv6Interface, IPv6Network +from pathlib import Path +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + ForwardRef, + FrozenSet, + Generic, + Iterable, + List, + Optional, + Pattern, + Sequence, + Set, + Tuple, + Type, + TypeVar, + Union, + cast, +) +from uuid import UUID + +from typing_extensions import Annotated, Literal + +from .fields import ( + MAPPING_LIKE_SHAPES, + SHAPE_DEQUE, + SHAPE_FROZENSET, + SHAPE_GENERIC, + SHAPE_ITERABLE, + SHAPE_LIST, + SHAPE_SEQUENCE, + SHAPE_SET, + SHAPE_SINGLETON, + SHAPE_TUPLE, + SHAPE_TUPLE_ELLIPSIS, + FieldInfo, + ModelField, +) +from .json import pydantic_encoder +from .networks import AnyUrl, EmailStr +from .types import ( + ConstrainedDecimal, + ConstrainedFloat, + ConstrainedFrozenSet, + ConstrainedInt, + ConstrainedList, + ConstrainedSet, + SecretBytes, + SecretStr, + StrictBytes, + StrictStr, + conbytes, + condecimal, + confloat, + confrozenset, + conint, + conlist, + conset, + constr, +) +from .typing import ( + all_literal_values, + get_args, + get_origin, + get_sub_types, + is_callable_type, + is_literal_type, + is_namedtuple, + is_none_type, + is_union, +) +from .utils import ROOT_KEY, get_model, lenient_issubclass + +if TYPE_CHECKING: + from .dataclasses import Dataclass + from .main import BaseModel + +default_prefix = '#/definitions/' +default_ref_template = '#/definitions/{model}' + +TypeModelOrEnum = Union[Type['BaseModel'], Type[Enum]] +TypeModelSet = Set[TypeModelOrEnum] + + +def _apply_modify_schema( + modify_schema: Callable[..., None], field: Optional[ModelField], field_schema: Dict[str, Any] +) -> None: + from inspect import signature + + sig = signature(modify_schema) + args = set(sig.parameters.keys()) + if 'field' in args or 'kwargs' in args: + modify_schema(field_schema, field=field) + else: + modify_schema(field_schema) + + +def schema( + models: Sequence[Union[Type['BaseModel'], Type['Dataclass']]], + *, + by_alias: bool = True, + title: Optional[str] = None, + description: Optional[str] = None, + ref_prefix: Optional[str] = None, + ref_template: str = default_ref_template, +) -> Dict[str, Any]: + """ + Process a list of models and generate a single JSON Schema with all of them defined in the ``definitions`` + top-level JSON key, including their sub-models. + + :param models: a list of models to include in the generated JSON Schema + :param by_alias: generate the schemas using the aliases defined, if any + :param title: title for the generated schema that includes the definitions + :param description: description for the generated schema + :param ref_prefix: the JSON Pointer prefix for schema references with ``$ref``, if None, will be set to the + default of ``#/definitions/``. Update it if you want the schemas to reference the definitions somewhere + else, e.g. for OpenAPI use ``#/components/schemas/``. The resulting generated schemas will still be at the + top-level key ``definitions``, so you can extract them from there. But all the references will have the set + prefix. + :param ref_template: Use a ``string.format()`` template for ``$ref`` instead of a prefix. This can be useful + for references that cannot be represented by ``ref_prefix`` such as a definition stored in another file. For + a sibling json file in a ``/schemas`` directory use ``"/schemas/${model}.json#"``. + :return: dict with the JSON Schema with a ``definitions`` top-level key including the schema definitions for + the models and sub-models passed in ``models``. + """ + clean_models = [get_model(model) for model in models] + flat_models = get_flat_models_from_models(clean_models) + model_name_map = get_model_name_map(flat_models) + definitions = {} + output_schema: Dict[str, Any] = {} + if title: + output_schema['title'] = title + if description: + output_schema['description'] = description + for model in clean_models: + m_schema, m_definitions, m_nested_models = model_process_schema( + model, + by_alias=by_alias, + model_name_map=model_name_map, + ref_prefix=ref_prefix, + ref_template=ref_template, + ) + definitions.update(m_definitions) + model_name = model_name_map[model] + definitions[model_name] = m_schema + if definitions: + output_schema['definitions'] = definitions + return output_schema + + +def model_schema( + model: Union[Type['BaseModel'], Type['Dataclass']], + by_alias: bool = True, + ref_prefix: Optional[str] = None, + ref_template: str = default_ref_template, +) -> Dict[str, Any]: + """ + Generate a JSON Schema for one model. With all the sub-models defined in the ``definitions`` top-level + JSON key. + + :param model: a Pydantic model (a class that inherits from BaseModel) + :param by_alias: generate the schemas using the aliases defined, if any + :param ref_prefix: the JSON Pointer prefix for schema references with ``$ref``, if None, will be set to the + default of ``#/definitions/``. Update it if you want the schemas to reference the definitions somewhere + else, e.g. for OpenAPI use ``#/components/schemas/``. The resulting generated schemas will still be at the + top-level key ``definitions``, so you can extract them from there. But all the references will have the set + prefix. + :param ref_template: Use a ``string.format()`` template for ``$ref`` instead of a prefix. This can be useful for + references that cannot be represented by ``ref_prefix`` such as a definition stored in another file. For a + sibling json file in a ``/schemas`` directory use ``"/schemas/${model}.json#"``. + :return: dict with the JSON Schema for the passed ``model`` + """ + model = get_model(model) + flat_models = get_flat_models_from_model(model) + model_name_map = get_model_name_map(flat_models) + model_name = model_name_map[model] + m_schema, m_definitions, nested_models = model_process_schema( + model, by_alias=by_alias, model_name_map=model_name_map, ref_prefix=ref_prefix, ref_template=ref_template + ) + if model_name in nested_models: + # model_name is in Nested models, it has circular references + m_definitions[model_name] = m_schema + m_schema = get_schema_ref(model_name, ref_prefix, ref_template, False) + if m_definitions: + m_schema.update({'definitions': m_definitions}) + return m_schema + + +def get_field_info_schema(field: ModelField, schema_overrides: bool = False) -> Tuple[Dict[str, Any], bool]: + + # If no title is explicitly set, we don't set title in the schema for enums. + # The behaviour is the same as `BaseModel` reference, where the default title + # is in the definitions part of the schema. + schema_: Dict[str, Any] = {} + if field.field_info.title or not lenient_issubclass(field.type_, Enum): + schema_['title'] = field.field_info.title or field.alias.title().replace('_', ' ') + + if field.field_info.title: + schema_overrides = True + + if field.field_info.description: + schema_['description'] = field.field_info.description + schema_overrides = True + + if not field.required and field.default is not None and not is_callable_type(field.outer_type_): + schema_['default'] = encode_default(field.default) + schema_overrides = True + + return schema_, schema_overrides + + +def field_schema( + field: ModelField, + *, + by_alias: bool = True, + model_name_map: Dict[TypeModelOrEnum, str], + ref_prefix: Optional[str] = None, + ref_template: str = default_ref_template, + known_models: TypeModelSet = None, +) -> Tuple[Dict[str, Any], Dict[str, Any], Set[str]]: + """ + Process a Pydantic field and return a tuple with a JSON Schema for it as the first item. + Also return a dictionary of definitions with models as keys and their schemas as values. If the passed field + is a model and has sub-models, and those sub-models don't have overrides (as ``title``, ``default``, etc), they + will be included in the definitions and referenced in the schema instead of included recursively. + + :param field: a Pydantic ``ModelField`` + :param by_alias: use the defined alias (if any) in the returned schema + :param model_name_map: used to generate the JSON Schema references to other models included in the definitions + :param ref_prefix: the JSON Pointer prefix to use for references to other schemas, if None, the default of + #/definitions/ will be used + :param ref_template: Use a ``string.format()`` template for ``$ref`` instead of a prefix. This can be useful for + references that cannot be represented by ``ref_prefix`` such as a definition stored in another file. For a + sibling json file in a ``/schemas`` directory use ``"/schemas/${model}.json#"``. + :param known_models: used to solve circular references + :return: tuple of the schema for this field and additional definitions + """ + s, schema_overrides = get_field_info_schema(field) + + validation_schema = get_field_schema_validations(field) + if validation_schema: + s.update(validation_schema) + schema_overrides = True + + f_schema, f_definitions, f_nested_models = field_type_schema( + field, + by_alias=by_alias, + model_name_map=model_name_map, + schema_overrides=schema_overrides, + ref_prefix=ref_prefix, + ref_template=ref_template, + known_models=known_models or set(), + ) + + # $ref will only be returned when there are no schema_overrides + if '$ref' in f_schema: + return f_schema, f_definitions, f_nested_models + else: + s.update(f_schema) + return s, f_definitions, f_nested_models + + +numeric_types = (int, float, Decimal) +_str_types_attrs: Tuple[Tuple[str, Union[type, Tuple[type, ...]], str], ...] = ( + ('max_length', numeric_types, 'maxLength'), + ('min_length', numeric_types, 'minLength'), + ('regex', str, 'pattern'), +) + +_numeric_types_attrs: Tuple[Tuple[str, Union[type, Tuple[type, ...]], str], ...] = ( + ('gt', numeric_types, 'exclusiveMinimum'), + ('lt', numeric_types, 'exclusiveMaximum'), + ('ge', numeric_types, 'minimum'), + ('le', numeric_types, 'maximum'), + ('multiple_of', numeric_types, 'multipleOf'), +) + + +def get_field_schema_validations(field: ModelField) -> Dict[str, Any]: + """ + Get the JSON Schema validation keywords for a ``field`` with an annotation of + a Pydantic ``FieldInfo`` with validation arguments. + """ + f_schema: Dict[str, Any] = {} + + if lenient_issubclass(field.type_, Enum): + # schema is already updated by `enum_process_schema`; just update with field extra + if field.field_info.extra: + f_schema.update(field.field_info.extra) + return f_schema + + if lenient_issubclass(field.type_, (str, bytes)): + for attr_name, t, keyword in _str_types_attrs: + attr = getattr(field.field_info, attr_name, None) + if isinstance(attr, t): + f_schema[keyword] = attr + if lenient_issubclass(field.type_, numeric_types) and not issubclass(field.type_, bool): + for attr_name, t, keyword in _numeric_types_attrs: + attr = getattr(field.field_info, attr_name, None) + if isinstance(attr, t): + f_schema[keyword] = attr + if field.field_info is not None and field.field_info.const: + f_schema['const'] = field.default + if field.field_info.extra: + f_schema.update(field.field_info.extra) + modify_schema = getattr(field.outer_type_, '__modify_schema__', None) + if modify_schema: + _apply_modify_schema(modify_schema, field, f_schema) + return f_schema + + +def get_model_name_map(unique_models: TypeModelSet) -> Dict[TypeModelOrEnum, str]: + """ + Process a set of models and generate unique names for them to be used as keys in the JSON Schema + definitions. By default the names are the same as the class name. But if two models in different Python + modules have the same name (e.g. "users.Model" and "items.Model"), the generated names will be + based on the Python module path for those conflicting models to prevent name collisions. + + :param unique_models: a Python set of models + :return: dict mapping models to names + """ + name_model_map = {} + conflicting_names: Set[str] = set() + for model in unique_models: + model_name = normalize_name(model.__name__) + if model_name in conflicting_names: + model_name = get_long_model_name(model) + name_model_map[model_name] = model + elif model_name in name_model_map: + conflicting_names.add(model_name) + conflicting_model = name_model_map.pop(model_name) + name_model_map[get_long_model_name(conflicting_model)] = conflicting_model + name_model_map[get_long_model_name(model)] = model + else: + name_model_map[model_name] = model + return {v: k for k, v in name_model_map.items()} + + +def get_flat_models_from_model(model: Type['BaseModel'], known_models: TypeModelSet = None) -> TypeModelSet: + """ + Take a single ``model`` and generate a set with itself and all the sub-models in the tree. I.e. if you pass + model ``Foo`` (subclass of Pydantic ``BaseModel``) as ``model``, and it has a field of type ``Bar`` (also + subclass of ``BaseModel``) and that model ``Bar`` has a field of type ``Baz`` (also subclass of ``BaseModel``), + the return value will be ``set([Foo, Bar, Baz])``. + + :param model: a Pydantic ``BaseModel`` subclass + :param known_models: used to solve circular references + :return: a set with the initial model and all its sub-models + """ + known_models = known_models or set() + flat_models: TypeModelSet = set() + flat_models.add(model) + known_models |= flat_models + fields = cast(Sequence[ModelField], model.__fields__.values()) + flat_models |= get_flat_models_from_fields(fields, known_models=known_models) + return flat_models + + +def get_flat_models_from_field(field: ModelField, known_models: TypeModelSet) -> TypeModelSet: + """ + Take a single Pydantic ``ModelField`` (from a model) that could have been declared as a sublcass of BaseModel + (so, it could be a submodel), and generate a set with its model and all the sub-models in the tree. + I.e. if you pass a field that was declared to be of type ``Foo`` (subclass of BaseModel) as ``field``, and that + model ``Foo`` has a field of type ``Bar`` (also subclass of ``BaseModel``) and that model ``Bar`` has a field of + type ``Baz`` (also subclass of ``BaseModel``), the return value will be ``set([Foo, Bar, Baz])``. + + :param field: a Pydantic ``ModelField`` + :param known_models: used to solve circular references + :return: a set with the model used in the declaration for this field, if any, and all its sub-models + """ + from .main import BaseModel + + flat_models: TypeModelSet = set() + + field_type = field.type_ + if lenient_issubclass(getattr(field_type, '__pydantic_model__', None), BaseModel): + field_type = field_type.__pydantic_model__ + + if field.sub_fields and not lenient_issubclass(field_type, BaseModel): + flat_models |= get_flat_models_from_fields(field.sub_fields, known_models=known_models) + elif lenient_issubclass(field_type, BaseModel) and field_type not in known_models: + flat_models |= get_flat_models_from_model(field_type, known_models=known_models) + elif lenient_issubclass(field_type, Enum): + flat_models.add(field_type) + return flat_models + + +def get_flat_models_from_fields(fields: Sequence[ModelField], known_models: TypeModelSet) -> TypeModelSet: + """ + Take a list of Pydantic ``ModelField``s (from a model) that could have been declared as subclasses of ``BaseModel`` + (so, any of them could be a submodel), and generate a set with their models and all the sub-models in the tree. + I.e. if you pass a the fields of a model ``Foo`` (subclass of ``BaseModel``) as ``fields``, and on of them has a + field of type ``Bar`` (also subclass of ``BaseModel``) and that model ``Bar`` has a field of type ``Baz`` (also + subclass of ``BaseModel``), the return value will be ``set([Foo, Bar, Baz])``. + + :param fields: a list of Pydantic ``ModelField``s + :param known_models: used to solve circular references + :return: a set with any model declared in the fields, and all their sub-models + """ + flat_models: TypeModelSet = set() + for field in fields: + flat_models |= get_flat_models_from_field(field, known_models=known_models) + return flat_models + + +def get_flat_models_from_models(models: Sequence[Type['BaseModel']]) -> TypeModelSet: + """ + Take a list of ``models`` and generate a set with them and all their sub-models in their trees. I.e. if you pass + a list of two models, ``Foo`` and ``Bar``, both subclasses of Pydantic ``BaseModel`` as models, and ``Bar`` has + a field of type ``Baz`` (also subclass of ``BaseModel``), the return value will be ``set([Foo, Bar, Baz])``. + """ + flat_models: TypeModelSet = set() + for model in models: + flat_models |= get_flat_models_from_model(model) + return flat_models + + +def get_long_model_name(model: TypeModelOrEnum) -> str: + return f'{model.__module__}__{model.__qualname__}'.replace('.', '__') + + +def field_type_schema( + field: ModelField, + *, + by_alias: bool, + model_name_map: Dict[TypeModelOrEnum, str], + ref_template: str, + schema_overrides: bool = False, + ref_prefix: Optional[str] = None, + known_models: TypeModelSet, +) -> Tuple[Dict[str, Any], Dict[str, Any], Set[str]]: + """ + Used by ``field_schema()``, you probably should be using that function. + + Take a single ``field`` and generate the schema for its type only, not including additional + information as title, etc. Also return additional schema definitions, from sub-models. + """ + from .main import BaseModel # noqa: F811 + + definitions = {} + nested_models: Set[str] = set() + f_schema: Dict[str, Any] + if field.shape in { + SHAPE_LIST, + SHAPE_TUPLE_ELLIPSIS, + SHAPE_SEQUENCE, + SHAPE_SET, + SHAPE_FROZENSET, + SHAPE_ITERABLE, + SHAPE_DEQUE, + }: + items_schema, f_definitions, f_nested_models = field_singleton_schema( + field, + by_alias=by_alias, + model_name_map=model_name_map, + ref_prefix=ref_prefix, + ref_template=ref_template, + known_models=known_models, + ) + definitions.update(f_definitions) + nested_models.update(f_nested_models) + f_schema = {'type': 'array', 'items': items_schema} + if field.shape in {SHAPE_SET, SHAPE_FROZENSET}: + f_schema['uniqueItems'] = True + + elif field.shape in MAPPING_LIKE_SHAPES: + f_schema = {'type': 'object'} + key_field = cast(ModelField, field.key_field) + regex = getattr(key_field.type_, 'regex', None) + items_schema, f_definitions, f_nested_models = field_singleton_schema( + field, + by_alias=by_alias, + model_name_map=model_name_map, + ref_prefix=ref_prefix, + ref_template=ref_template, + known_models=known_models, + ) + definitions.update(f_definitions) + nested_models.update(f_nested_models) + if regex: + # Dict keys have a regex pattern + # items_schema might be a schema or empty dict, add it either way + f_schema['patternProperties'] = {regex.pattern: items_schema} + elif items_schema: + # The dict values are not simply Any, so they need a schema + f_schema['additionalProperties'] = items_schema + elif field.shape == SHAPE_TUPLE or (field.shape == SHAPE_GENERIC and not issubclass(field.type_, BaseModel)): + sub_schema = [] + sub_fields = cast(List[ModelField], field.sub_fields) + for sf in sub_fields: + sf_schema, sf_definitions, sf_nested_models = field_type_schema( + sf, + by_alias=by_alias, + model_name_map=model_name_map, + ref_prefix=ref_prefix, + ref_template=ref_template, + known_models=known_models, + ) + definitions.update(sf_definitions) + nested_models.update(sf_nested_models) + sub_schema.append(sf_schema) + + sub_fields_len = len(sub_fields) + if field.shape == SHAPE_GENERIC: + all_of_schemas = sub_schema[0] if sub_fields_len == 1 else {'type': 'array', 'items': sub_schema} + f_schema = {'allOf': [all_of_schemas]} + else: + f_schema = { + 'type': 'array', + 'minItems': sub_fields_len, + 'maxItems': sub_fields_len, + } + if sub_fields_len >= 1: + f_schema['items'] = sub_schema + else: + assert field.shape in {SHAPE_SINGLETON, SHAPE_GENERIC}, field.shape + f_schema, f_definitions, f_nested_models = field_singleton_schema( + field, + by_alias=by_alias, + model_name_map=model_name_map, + schema_overrides=schema_overrides, + ref_prefix=ref_prefix, + ref_template=ref_template, + known_models=known_models, + ) + definitions.update(f_definitions) + nested_models.update(f_nested_models) + + # check field type to avoid repeated calls to the same __modify_schema__ method + if field.type_ != field.outer_type_: + if field.shape == SHAPE_GENERIC: + field_type = field.type_ + else: + field_type = field.outer_type_ + modify_schema = getattr(field_type, '__modify_schema__', None) + if modify_schema: + _apply_modify_schema(modify_schema, field, f_schema) + return f_schema, definitions, nested_models + + +def model_process_schema( + model: TypeModelOrEnum, + *, + by_alias: bool = True, + model_name_map: Dict[TypeModelOrEnum, str], + ref_prefix: Optional[str] = None, + ref_template: str = default_ref_template, + known_models: TypeModelSet = None, + field: Optional[ModelField] = None, +) -> Tuple[Dict[str, Any], Dict[str, Any], Set[str]]: + """ + Used by ``model_schema()``, you probably should be using that function. + + Take a single ``model`` and generate its schema. Also return additional schema definitions, from sub-models. The + sub-models of the returned schema will be referenced, but their definitions will not be included in the schema. All + the definitions are returned as the second value. + """ + from inspect import getdoc, signature + + known_models = known_models or set() + if lenient_issubclass(model, Enum): + model = cast(Type[Enum], model) + s = enum_process_schema(model, field=field) + return s, {}, set() + model = cast(Type['BaseModel'], model) + s = {'title': model.__config__.title or model.__name__} + doc = getdoc(model) + if doc: + s['description'] = doc + known_models.add(model) + m_schema, m_definitions, nested_models = model_type_schema( + model, + by_alias=by_alias, + model_name_map=model_name_map, + ref_prefix=ref_prefix, + ref_template=ref_template, + known_models=known_models, + ) + s.update(m_schema) + schema_extra = model.__config__.schema_extra + if callable(schema_extra): + if len(signature(schema_extra).parameters) == 1: + schema_extra(s) + else: + schema_extra(s, model) + else: + s.update(schema_extra) + return s, m_definitions, nested_models + + +def model_type_schema( + model: Type['BaseModel'], + *, + by_alias: bool, + model_name_map: Dict[TypeModelOrEnum, str], + ref_template: str, + ref_prefix: Optional[str] = None, + known_models: TypeModelSet, +) -> Tuple[Dict[str, Any], Dict[str, Any], Set[str]]: + """ + You probably should be using ``model_schema()``, this function is indirectly used by that function. + + Take a single ``model`` and generate the schema for its type only, not including additional + information as title, etc. Also return additional schema definitions, from sub-models. + """ + properties = {} + required = [] + definitions: Dict[str, Any] = {} + nested_models: Set[str] = set() + for k, f in model.__fields__.items(): + try: + f_schema, f_definitions, f_nested_models = field_schema( + f, + by_alias=by_alias, + model_name_map=model_name_map, + ref_prefix=ref_prefix, + ref_template=ref_template, + known_models=known_models, + ) + except SkipField as skip: + warnings.warn(skip.message, UserWarning) + continue + definitions.update(f_definitions) + nested_models.update(f_nested_models) + if by_alias: + properties[f.alias] = f_schema + if f.required: + required.append(f.alias) + else: + properties[k] = f_schema + if f.required: + required.append(k) + if ROOT_KEY in properties: + out_schema = properties[ROOT_KEY] + out_schema['title'] = model.__config__.title or model.__name__ + else: + out_schema = {'type': 'object', 'properties': properties} + if required: + out_schema['required'] = required + if model.__config__.extra == 'forbid': + out_schema['additionalProperties'] = False + return out_schema, definitions, nested_models + + +def enum_process_schema(enum: Type[Enum], *, field: Optional[ModelField] = None) -> Dict[str, Any]: + """ + Take a single `enum` and generate its schema. + + This is similar to the `model_process_schema` function, but applies to ``Enum`` objects. + """ + schema_: Dict[str, Any] = { + 'title': enum.__name__, + # Python assigns all enums a default docstring value of 'An enumeration', so + # all enums will have a description field even if not explicitly provided. + 'description': enum.__doc__ or 'An enumeration.', + # Add enum values and the enum field type to the schema. + 'enum': [item.value for item in cast(Iterable[Enum], enum)], + } + + add_field_type_to_schema(enum, schema_) + + modify_schema = getattr(enum, '__modify_schema__', None) + if modify_schema: + _apply_modify_schema(modify_schema, field, schema_) + + return schema_ + + +def field_singleton_sub_fields_schema( + field: ModelField, + *, + by_alias: bool, + model_name_map: Dict[TypeModelOrEnum, str], + ref_template: str, + schema_overrides: bool = False, + ref_prefix: Optional[str] = None, + known_models: TypeModelSet, +) -> Tuple[Dict[str, Any], Dict[str, Any], Set[str]]: + """ + This function is indirectly used by ``field_schema()``, you probably should be using that function. + + Take a list of Pydantic ``ModelField`` from the declaration of a type with parameters, and generate their + schema. I.e., fields used as "type parameters", like ``str`` and ``int`` in ``Tuple[str, int]``. + """ + sub_fields = cast(List[ModelField], field.sub_fields) + definitions = {} + nested_models: Set[str] = set() + if len(sub_fields) == 1: + return field_type_schema( + sub_fields[0], + by_alias=by_alias, + model_name_map=model_name_map, + schema_overrides=schema_overrides, + ref_prefix=ref_prefix, + ref_template=ref_template, + known_models=known_models, + ) + else: + s: Dict[str, Any] = {} + # https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#discriminator-object + field_has_discriminator: bool = field.discriminator_key is not None + if field_has_discriminator: + assert field.sub_fields_mapping is not None + + discriminator_models_refs: Dict[str, Union[str, Dict[str, Any]]] = {} + + for discriminator_value, sub_field in field.sub_fields_mapping.items(): + # sub_field is either a `BaseModel` or directly an `Annotated` `Union` of many + if is_union(get_origin(sub_field.type_)): + sub_models = get_sub_types(sub_field.type_) + discriminator_models_refs[discriminator_value] = { + model_name_map[sub_model]: get_schema_ref( + model_name_map[sub_model], ref_prefix, ref_template, False + ) + for sub_model in sub_models + } + else: + sub_field_type = sub_field.type_ + if hasattr(sub_field_type, '__pydantic_model__'): + sub_field_type = sub_field_type.__pydantic_model__ + + discriminator_model_name = model_name_map[sub_field_type] + discriminator_model_ref = get_schema_ref(discriminator_model_name, ref_prefix, ref_template, False) + discriminator_models_refs[discriminator_value] = discriminator_model_ref['$ref'] + + s['discriminator'] = { + 'propertyName': field.discriminator_alias, + 'mapping': discriminator_models_refs, + } + + sub_field_schemas = [] + for sf in sub_fields: + sub_schema, sub_definitions, sub_nested_models = field_type_schema( + sf, + by_alias=by_alias, + model_name_map=model_name_map, + schema_overrides=schema_overrides, + ref_prefix=ref_prefix, + ref_template=ref_template, + known_models=known_models, + ) + definitions.update(sub_definitions) + if schema_overrides and 'allOf' in sub_schema: + # if the sub_field is a referenced schema we only need the referenced + # object. Otherwise we will end up with several allOf inside anyOf/oneOf. + # See https://github.com/pydantic/pydantic/issues/1209 + sub_schema = sub_schema['allOf'][0] + + if sub_schema.keys() == {'discriminator', 'oneOf'}: + # we don't want discriminator information inside oneOf choices, this is dealt with elsewhere + sub_schema.pop('discriminator') + sub_field_schemas.append(sub_schema) + nested_models.update(sub_nested_models) + s['oneOf' if field_has_discriminator else 'anyOf'] = sub_field_schemas + return s, definitions, nested_models + + +# Order is important, e.g. subclasses of str must go before str +# this is used only for standard library types, custom types should use __modify_schema__ instead +field_class_to_schema: Tuple[Tuple[Any, Dict[str, Any]], ...] = ( + (Path, {'type': 'string', 'format': 'path'}), + (datetime, {'type': 'string', 'format': 'date-time'}), + (date, {'type': 'string', 'format': 'date'}), + (time, {'type': 'string', 'format': 'time'}), + (timedelta, {'type': 'number', 'format': 'time-delta'}), + (IPv4Network, {'type': 'string', 'format': 'ipv4network'}), + (IPv6Network, {'type': 'string', 'format': 'ipv6network'}), + (IPv4Interface, {'type': 'string', 'format': 'ipv4interface'}), + (IPv6Interface, {'type': 'string', 'format': 'ipv6interface'}), + (IPv4Address, {'type': 'string', 'format': 'ipv4'}), + (IPv6Address, {'type': 'string', 'format': 'ipv6'}), + (Pattern, {'type': 'string', 'format': 'regex'}), + (str, {'type': 'string'}), + (bytes, {'type': 'string', 'format': 'binary'}), + (bool, {'type': 'boolean'}), + (int, {'type': 'integer'}), + (float, {'type': 'number'}), + (Decimal, {'type': 'number'}), + (UUID, {'type': 'string', 'format': 'uuid'}), + (dict, {'type': 'object'}), + (list, {'type': 'array', 'items': {}}), + (tuple, {'type': 'array', 'items': {}}), + (set, {'type': 'array', 'items': {}, 'uniqueItems': True}), + (frozenset, {'type': 'array', 'items': {}, 'uniqueItems': True}), +) + +json_scheme = {'type': 'string', 'format': 'json-string'} + + +def add_field_type_to_schema(field_type: Any, schema_: Dict[str, Any]) -> None: + """ + Update the given `schema` with the type-specific metadata for the given `field_type`. + + This function looks through `field_class_to_schema` for a class that matches the given `field_type`, + and then modifies the given `schema` with the information from that type. + """ + for type_, t_schema in field_class_to_schema: + # Fallback for `typing.Pattern` and `re.Pattern` as they are not a valid class + if lenient_issubclass(field_type, type_) or field_type is type_ is Pattern: + schema_.update(t_schema) + break + + +def get_schema_ref(name: str, ref_prefix: Optional[str], ref_template: str, schema_overrides: bool) -> Dict[str, Any]: + if ref_prefix: + schema_ref = {'$ref': ref_prefix + name} + else: + schema_ref = {'$ref': ref_template.format(model=name)} + return {'allOf': [schema_ref]} if schema_overrides else schema_ref + + +def field_singleton_schema( # noqa: C901 (ignore complexity) + field: ModelField, + *, + by_alias: bool, + model_name_map: Dict[TypeModelOrEnum, str], + ref_template: str, + schema_overrides: bool = False, + ref_prefix: Optional[str] = None, + known_models: TypeModelSet, +) -> Tuple[Dict[str, Any], Dict[str, Any], Set[str]]: + """ + This function is indirectly used by ``field_schema()``, you should probably be using that function. + + Take a single Pydantic ``ModelField``, and return its schema and any additional definitions from sub-models. + """ + from .main import BaseModel + + definitions: Dict[str, Any] = {} + nested_models: Set[str] = set() + field_type = field.type_ + + # Recurse into this field if it contains sub_fields and is NOT a + # BaseModel OR that BaseModel is a const + if field.sub_fields and ( + (field.field_info and field.field_info.const) or not lenient_issubclass(field_type, BaseModel) + ): + return field_singleton_sub_fields_schema( + field, + by_alias=by_alias, + model_name_map=model_name_map, + schema_overrides=schema_overrides, + ref_prefix=ref_prefix, + ref_template=ref_template, + known_models=known_models, + ) + if field_type is Any or field_type is object or field_type.__class__ == TypeVar or get_origin(field_type) is type: + return {}, definitions, nested_models # no restrictions + if is_none_type(field_type): + return {'type': 'null'}, definitions, nested_models + if is_callable_type(field_type): + raise SkipField(f'Callable {field.name} was excluded from schema since JSON schema has no equivalent type.') + f_schema: Dict[str, Any] = {} + if field.field_info is not None and field.field_info.const: + f_schema['const'] = field.default + + if is_literal_type(field_type): + values = all_literal_values(field_type) + + if len({v.__class__ for v in values}) > 1: + return field_schema( + multitypes_literal_field_for_schema(values, field), + by_alias=by_alias, + model_name_map=model_name_map, + ref_prefix=ref_prefix, + ref_template=ref_template, + known_models=known_models, + ) + + # All values have the same type + field_type = values[0].__class__ + f_schema['enum'] = list(values) + add_field_type_to_schema(field_type, f_schema) + elif lenient_issubclass(field_type, Enum): + enum_name = model_name_map[field_type] + f_schema, schema_overrides = get_field_info_schema(field, schema_overrides) + f_schema.update(get_schema_ref(enum_name, ref_prefix, ref_template, schema_overrides)) + definitions[enum_name] = enum_process_schema(field_type, field=field) + elif is_namedtuple(field_type): + sub_schema, *_ = model_process_schema( + field_type.__pydantic_model__, + by_alias=by_alias, + model_name_map=model_name_map, + ref_prefix=ref_prefix, + ref_template=ref_template, + known_models=known_models, + field=field, + ) + items_schemas = list(sub_schema['properties'].values()) + f_schema.update( + { + 'type': 'array', + 'items': items_schemas, + 'minItems': len(items_schemas), + 'maxItems': len(items_schemas), + } + ) + elif not hasattr(field_type, '__pydantic_model__'): + add_field_type_to_schema(field_type, f_schema) + + modify_schema = getattr(field_type, '__modify_schema__', None) + if modify_schema: + _apply_modify_schema(modify_schema, field, f_schema) + + if f_schema: + return f_schema, definitions, nested_models + + # Handle dataclass-based models + if lenient_issubclass(getattr(field_type, '__pydantic_model__', None), BaseModel): + field_type = field_type.__pydantic_model__ + + if issubclass(field_type, BaseModel): + model_name = model_name_map[field_type] + if field_type not in known_models: + sub_schema, sub_definitions, sub_nested_models = model_process_schema( + field_type, + by_alias=by_alias, + model_name_map=model_name_map, + ref_prefix=ref_prefix, + ref_template=ref_template, + known_models=known_models, + field=field, + ) + definitions.update(sub_definitions) + definitions[model_name] = sub_schema + nested_models.update(sub_nested_models) + else: + nested_models.add(model_name) + schema_ref = get_schema_ref(model_name, ref_prefix, ref_template, schema_overrides) + return schema_ref, definitions, nested_models + + # For generics with no args + args = get_args(field_type) + if args is not None and not args and Generic in field_type.__bases__: + return f_schema, definitions, nested_models + + raise ValueError(f'Value not declarable with JSON Schema, field: {field}') + + +def multitypes_literal_field_for_schema(values: Tuple[Any, ...], field: ModelField) -> ModelField: + """ + To support `Literal` with values of different types, we split it into multiple `Literal` with same type + e.g. `Literal['qwe', 'asd', 1, 2]` becomes `Union[Literal['qwe', 'asd'], Literal[1, 2]]` + """ + literal_distinct_types = defaultdict(list) + for v in values: + literal_distinct_types[v.__class__].append(v) + distinct_literals = (Literal[tuple(same_type_values)] for same_type_values in literal_distinct_types.values()) + + return ModelField( + name=field.name, + type_=Union[tuple(distinct_literals)], # type: ignore + class_validators=field.class_validators, + model_config=field.model_config, + default=field.default, + required=field.required, + alias=field.alias, + field_info=field.field_info, + ) + + +def encode_default(dft: Any) -> Any: + if isinstance(dft, Enum): + return dft.value + elif isinstance(dft, (int, float, str)): + return dft + elif isinstance(dft, (list, tuple)): + t = dft.__class__ + seq_args = (encode_default(v) for v in dft) + return t(*seq_args) if is_namedtuple(t) else t(seq_args) + elif isinstance(dft, dict): + return {encode_default(k): encode_default(v) for k, v in dft.items()} + elif dft is None: + return None + else: + return pydantic_encoder(dft) + + +_map_types_constraint: Dict[Any, Callable[..., type]] = {int: conint, float: confloat, Decimal: condecimal} + + +def get_annotation_from_field_info( + annotation: Any, field_info: FieldInfo, field_name: str, validate_assignment: bool = False +) -> Type[Any]: + """ + Get an annotation with validation implemented for numbers and strings based on the field_info. + :param annotation: an annotation from a field specification, as ``str``, ``ConstrainedStr`` + :param field_info: an instance of FieldInfo, possibly with declarations for validations and JSON Schema + :param field_name: name of the field for use in error messages + :param validate_assignment: default False, flag for BaseModel Config value of validate_assignment + :return: the same ``annotation`` if unmodified or a new annotation with validation in place + """ + constraints = field_info.get_constraints() + used_constraints: Set[str] = set() + if constraints: + annotation, used_constraints = get_annotation_with_constraints(annotation, field_info) + if validate_assignment: + used_constraints.add('allow_mutation') + + unused_constraints = constraints - used_constraints + if unused_constraints: + raise ValueError( + f'On field "{field_name}" the following field constraints are set but not enforced: ' + f'{", ".join(unused_constraints)}. ' + f'\nFor more details see https://pydantic-docs.helpmanual.io/usage/schema/#unenforced-field-constraints' + ) + + return annotation + + +def get_annotation_with_constraints(annotation: Any, field_info: FieldInfo) -> Tuple[Type[Any], Set[str]]: # noqa: C901 + """ + Get an annotation with used constraints implemented for numbers and strings based on the field_info. + + :param annotation: an annotation from a field specification, as ``str``, ``ConstrainedStr`` + :param field_info: an instance of FieldInfo, possibly with declarations for validations and JSON Schema + :return: the same ``annotation`` if unmodified or a new annotation along with the used constraints. + """ + used_constraints: Set[str] = set() + + def go(type_: Any) -> Type[Any]: + if ( + is_literal_type(type_) + or isinstance(type_, ForwardRef) + or lenient_issubclass(type_, (ConstrainedList, ConstrainedSet, ConstrainedFrozenSet)) + ): + return type_ + origin = get_origin(type_) + if origin is not None: + args: Tuple[Any, ...] = get_args(type_) + if any(isinstance(a, ForwardRef) for a in args): + # forward refs cause infinite recursion below + return type_ + + if origin is Annotated: + return go(args[0]) + if is_union(origin): + return Union[tuple(go(a) for a in args)] # type: ignore + + if issubclass(origin, List) and ( + field_info.min_items is not None + or field_info.max_items is not None + or field_info.unique_items is not None + ): + used_constraints.update({'min_items', 'max_items', 'unique_items'}) + return conlist( + go(args[0]), + min_items=field_info.min_items, + max_items=field_info.max_items, + unique_items=field_info.unique_items, + ) + + if issubclass(origin, Set) and (field_info.min_items is not None or field_info.max_items is not None): + used_constraints.update({'min_items', 'max_items'}) + return conset(go(args[0]), min_items=field_info.min_items, max_items=field_info.max_items) + + if issubclass(origin, FrozenSet) and (field_info.min_items is not None or field_info.max_items is not None): + used_constraints.update({'min_items', 'max_items'}) + return confrozenset(go(args[0]), min_items=field_info.min_items, max_items=field_info.max_items) + + for t in (Tuple, List, Set, FrozenSet, Sequence): + if issubclass(origin, t): # type: ignore + return t[tuple(go(a) for a in args)] # type: ignore + + if issubclass(origin, Dict): + return Dict[args[0], go(args[1])] # type: ignore + + attrs: Optional[Tuple[str, ...]] = None + constraint_func: Optional[Callable[..., type]] = None + if isinstance(type_, type): + if issubclass(type_, (SecretStr, SecretBytes)): + attrs = ('max_length', 'min_length') + + def constraint_func(**kw: Any) -> Type[Any]: + return type(type_.__name__, (type_,), kw) + + elif issubclass(type_, str) and not issubclass(type_, (EmailStr, AnyUrl)): + attrs = ('max_length', 'min_length', 'regex') + if issubclass(type_, StrictStr): + + def constraint_func(**kw: Any) -> Type[Any]: + return type(type_.__name__, (type_,), kw) + + else: + constraint_func = constr + elif issubclass(type_, bytes): + attrs = ('max_length', 'min_length', 'regex') + if issubclass(type_, StrictBytes): + + def constraint_func(**kw: Any) -> Type[Any]: + return type(type_.__name__, (type_,), kw) + + else: + constraint_func = conbytes + elif issubclass(type_, numeric_types) and not issubclass( + type_, + ( + ConstrainedInt, + ConstrainedFloat, + ConstrainedDecimal, + ConstrainedList, + ConstrainedSet, + ConstrainedFrozenSet, + bool, + ), + ): + # Is numeric type + attrs = ('gt', 'lt', 'ge', 'le', 'multiple_of') + if issubclass(type_, float): + attrs += ('allow_inf_nan',) + if issubclass(type_, Decimal): + attrs += ('max_digits', 'decimal_places') + numeric_type = next(t for t in numeric_types if issubclass(type_, t)) # pragma: no branch + constraint_func = _map_types_constraint[numeric_type] + + if attrs: + used_constraints.update(set(attrs)) + kwargs = { + attr_name: attr + for attr_name, attr in ((attr_name, getattr(field_info, attr_name)) for attr_name in attrs) + if attr is not None + } + if kwargs: + constraint_func = cast(Callable[..., type], constraint_func) + return constraint_func(**kwargs) + return type_ + + return go(annotation), used_constraints + + +def normalize_name(name: str) -> str: + """ + Normalizes the given name. This can be applied to either a model *or* enum. + """ + return re.sub(r'[^a-zA-Z0-9.\-_]', '_', name) + + +class SkipField(Exception): + """ + Utility exception used to exclude fields from schema. + """ + + def __init__(self, message: str) -> None: + self.message = message diff --git a/libs/win/pydantic/tools.cp37-win_amd64.pyd b/libs/win/pydantic/tools.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..cd8cf09e5108c40583a2460d563cef654901575d GIT binary patch literal 64000 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 I-vAB#4>oV5EdT%j literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/tools.py b/libs/win/pydantic/tools.py new file mode 100644 index 00000000..9cdb4538 --- /dev/null +++ b/libs/win/pydantic/tools.py @@ -0,0 +1,92 @@ +import json +from functools import lru_cache +from pathlib import Path +from typing import TYPE_CHECKING, Any, Callable, Optional, Type, TypeVar, Union + +from .parse import Protocol, load_file, load_str_bytes +from .types import StrBytes +from .typing import display_as_type + +__all__ = ('parse_file_as', 'parse_obj_as', 'parse_raw_as', 'schema_of', 'schema_json_of') + +NameFactory = Union[str, Callable[[Type[Any]], str]] + +if TYPE_CHECKING: + from .typing import DictStrAny + + +def _generate_parsing_type_name(type_: Any) -> str: + return f'ParsingModel[{display_as_type(type_)}]' + + +@lru_cache(maxsize=2048) +def _get_parsing_type(type_: Any, *, type_name: Optional[NameFactory] = None) -> Any: + from pydantic.main import create_model + + if type_name is None: + type_name = _generate_parsing_type_name + if not isinstance(type_name, str): + type_name = type_name(type_) + return create_model(type_name, __root__=(type_, ...)) + + +T = TypeVar('T') + + +def parse_obj_as(type_: Type[T], obj: Any, *, type_name: Optional[NameFactory] = None) -> T: + model_type = _get_parsing_type(type_, type_name=type_name) # type: ignore[arg-type] + return model_type(__root__=obj).__root__ + + +def parse_file_as( + type_: Type[T], + path: Union[str, Path], + *, + content_type: str = None, + encoding: str = 'utf8', + proto: Protocol = None, + allow_pickle: bool = False, + json_loads: Callable[[str], Any] = json.loads, + type_name: Optional[NameFactory] = None, +) -> T: + obj = load_file( + path, + proto=proto, + content_type=content_type, + encoding=encoding, + allow_pickle=allow_pickle, + json_loads=json_loads, + ) + return parse_obj_as(type_, obj, type_name=type_name) + + +def parse_raw_as( + type_: Type[T], + b: StrBytes, + *, + content_type: str = None, + encoding: str = 'utf8', + proto: Protocol = None, + allow_pickle: bool = False, + json_loads: Callable[[str], Any] = json.loads, + type_name: Optional[NameFactory] = None, +) -> T: + obj = load_str_bytes( + b, + proto=proto, + content_type=content_type, + encoding=encoding, + allow_pickle=allow_pickle, + json_loads=json_loads, + ) + return parse_obj_as(type_, obj, type_name=type_name) + + +def schema_of(type_: Any, *, title: Optional[NameFactory] = None, **schema_kwargs: Any) -> 'DictStrAny': + """Generate a JSON schema (as dict) for the passed model or dynamically generated one""" + return _get_parsing_type(type_, type_name=title).schema(**schema_kwargs) + + +def schema_json_of(type_: Any, *, title: Optional[NameFactory] = None, **schema_json_kwargs: Any) -> str: + """Generate a JSON schema (as JSON) for the passed model or dynamically generated one""" + return _get_parsing_type(type_, type_name=title).schema_json(**schema_json_kwargs) diff --git a/libs/win/pydantic/types.cp37-win_amd64.pyd b/libs/win/pydantic/types.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..da1767b205c2f1ff505717bd1794c0190f8cfa3c GIT binary patch literal 354816 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

    I%*h4zcfJD38^fy1!%j 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 L`1-&9Xdd{#_$=9^ literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/validators.py b/libs/win/pydantic/validators.py new file mode 100644 index 00000000..fb6d0418 --- /dev/null +++ b/libs/win/pydantic/validators.py @@ -0,0 +1,765 @@ +import math +import re +from collections import OrderedDict, deque +from collections.abc import Hashable as CollectionsHashable +from datetime import date, datetime, time, timedelta +from decimal import Decimal, DecimalException +from enum import Enum, IntEnum +from ipaddress import IPv4Address, IPv4Interface, IPv4Network, IPv6Address, IPv6Interface, IPv6Network +from pathlib import Path +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Deque, + Dict, + ForwardRef, + FrozenSet, + Generator, + Hashable, + List, + NamedTuple, + Pattern, + Set, + Tuple, + Type, + TypeVar, + Union, +) +from uuid import UUID + +from . import errors +from .datetime_parse import parse_date, parse_datetime, parse_duration, parse_time +from .typing import ( + AnyCallable, + all_literal_values, + display_as_type, + get_class, + is_callable_type, + is_literal_type, + is_namedtuple, + is_none_type, + is_typeddict, +) +from .utils import almost_equal_floats, lenient_issubclass, sequence_like + +if TYPE_CHECKING: + from typing_extensions import Literal, TypedDict + + from .config import BaseConfig + from .fields import ModelField + from .types import ConstrainedDecimal, ConstrainedFloat, ConstrainedInt + + ConstrainedNumber = Union[ConstrainedDecimal, ConstrainedFloat, ConstrainedInt] + AnyOrderedDict = OrderedDict[Any, Any] + Number = Union[int, float, Decimal] + StrBytes = Union[str, bytes] + + +def str_validator(v: Any) -> Union[str]: + if isinstance(v, str): + if isinstance(v, Enum): + return v.value + else: + return v + elif isinstance(v, (float, int, Decimal)): + # is there anything else we want to add here? If you think so, create an issue. + return str(v) + elif isinstance(v, (bytes, bytearray)): + return v.decode() + else: + raise errors.StrError() + + +def strict_str_validator(v: Any) -> Union[str]: + if isinstance(v, str) and not isinstance(v, Enum): + return v + raise errors.StrError() + + +def bytes_validator(v: Any) -> Union[bytes]: + if isinstance(v, bytes): + return v + elif isinstance(v, bytearray): + return bytes(v) + elif isinstance(v, str): + return v.encode() + elif isinstance(v, (float, int, Decimal)): + return str(v).encode() + else: + raise errors.BytesError() + + +def strict_bytes_validator(v: Any) -> Union[bytes]: + if isinstance(v, bytes): + return v + elif isinstance(v, bytearray): + return bytes(v) + else: + raise errors.BytesError() + + +BOOL_FALSE = {0, '0', 'off', 'f', 'false', 'n', 'no'} +BOOL_TRUE = {1, '1', 'on', 't', 'true', 'y', 'yes'} + + +def bool_validator(v: Any) -> bool: + if v is True or v is False: + return v + if isinstance(v, bytes): + v = v.decode() + if isinstance(v, str): + v = v.lower() + try: + if v in BOOL_TRUE: + return True + if v in BOOL_FALSE: + return False + except TypeError: + raise errors.BoolError() + raise errors.BoolError() + + +# matches the default limit cpython, see https://github.com/python/cpython/pull/96500 +max_str_int = 4_300 + + +def int_validator(v: Any) -> int: + if isinstance(v, int) and not (v is True or v is False): + return v + + # see https://github.com/pydantic/pydantic/issues/1477 and in turn, https://github.com/python/cpython/issues/95778 + # this check should be unnecessary once patch releases are out for 3.7, 3.8, 3.9 and 3.10 + # but better to check here until then. + # NOTICE: this does not fully protect user from the DOS risk since the standard library JSON implementation + # (and other std lib modules like xml) use `int()` and are likely called before this, the best workaround is to + # 1. update to the latest patch release of python once released, 2. use a different JSON library like ujson + if isinstance(v, (str, bytes, bytearray)) and len(v) > max_str_int: + raise errors.IntegerError() + + try: + return int(v) + except (TypeError, ValueError, OverflowError): + raise errors.IntegerError() + + +def strict_int_validator(v: Any) -> int: + if isinstance(v, int) and not (v is True or v is False): + return v + raise errors.IntegerError() + + +def float_validator(v: Any) -> float: + if isinstance(v, float): + return v + + try: + return float(v) + except (TypeError, ValueError): + raise errors.FloatError() + + +def strict_float_validator(v: Any) -> float: + if isinstance(v, float): + return v + raise errors.FloatError() + + +def float_finite_validator(v: 'Number', field: 'ModelField', config: 'BaseConfig') -> 'Number': + allow_inf_nan = getattr(field.type_, 'allow_inf_nan', None) + if allow_inf_nan is None: + allow_inf_nan = config.allow_inf_nan + + if allow_inf_nan is False and (math.isnan(v) or math.isinf(v)): + raise errors.NumberNotFiniteError() + return v + + +def number_multiple_validator(v: 'Number', field: 'ModelField') -> 'Number': + field_type: ConstrainedNumber = field.type_ + if field_type.multiple_of is not None: + mod = float(v) / float(field_type.multiple_of) % 1 + if not almost_equal_floats(mod, 0.0) and not almost_equal_floats(mod, 1.0): + raise errors.NumberNotMultipleError(multiple_of=field_type.multiple_of) + return v + + +def number_size_validator(v: 'Number', field: 'ModelField') -> 'Number': + field_type: ConstrainedNumber = field.type_ + if field_type.gt is not None and not v > field_type.gt: + raise errors.NumberNotGtError(limit_value=field_type.gt) + elif field_type.ge is not None and not v >= field_type.ge: + raise errors.NumberNotGeError(limit_value=field_type.ge) + + if field_type.lt is not None and not v < field_type.lt: + raise errors.NumberNotLtError(limit_value=field_type.lt) + if field_type.le is not None and not v <= field_type.le: + raise errors.NumberNotLeError(limit_value=field_type.le) + + return v + + +def constant_validator(v: 'Any', field: 'ModelField') -> 'Any': + """Validate ``const`` fields. + + The value provided for a ``const`` field must be equal to the default value + of the field. This is to support the keyword of the same name in JSON + Schema. + """ + if v != field.default: + raise errors.WrongConstantError(given=v, permitted=[field.default]) + + return v + + +def anystr_length_validator(v: 'StrBytes', config: 'BaseConfig') -> 'StrBytes': + v_len = len(v) + + min_length = config.min_anystr_length + if v_len < min_length: + raise errors.AnyStrMinLengthError(limit_value=min_length) + + max_length = config.max_anystr_length + if max_length is not None and v_len > max_length: + raise errors.AnyStrMaxLengthError(limit_value=max_length) + + return v + + +def anystr_strip_whitespace(v: 'StrBytes') -> 'StrBytes': + return v.strip() + + +def anystr_upper(v: 'StrBytes') -> 'StrBytes': + return v.upper() + + +def anystr_lower(v: 'StrBytes') -> 'StrBytes': + return v.lower() + + +def ordered_dict_validator(v: Any) -> 'AnyOrderedDict': + if isinstance(v, OrderedDict): + return v + + try: + return OrderedDict(v) + except (TypeError, ValueError): + raise errors.DictError() + + +def dict_validator(v: Any) -> Dict[Any, Any]: + if isinstance(v, dict): + return v + + try: + return dict(v) + except (TypeError, ValueError): + raise errors.DictError() + + +def list_validator(v: Any) -> List[Any]: + if isinstance(v, list): + return v + elif sequence_like(v): + return list(v) + else: + raise errors.ListError() + + +def tuple_validator(v: Any) -> Tuple[Any, ...]: + if isinstance(v, tuple): + return v + elif sequence_like(v): + return tuple(v) + else: + raise errors.TupleError() + + +def set_validator(v: Any) -> Set[Any]: + if isinstance(v, set): + return v + elif sequence_like(v): + return set(v) + else: + raise errors.SetError() + + +def frozenset_validator(v: Any) -> FrozenSet[Any]: + if isinstance(v, frozenset): + return v + elif sequence_like(v): + return frozenset(v) + else: + raise errors.FrozenSetError() + + +def deque_validator(v: Any) -> Deque[Any]: + if isinstance(v, deque): + return v + elif sequence_like(v): + return deque(v) + else: + raise errors.DequeError() + + +def enum_member_validator(v: Any, field: 'ModelField', config: 'BaseConfig') -> Enum: + try: + enum_v = field.type_(v) + except ValueError: + # field.type_ should be an enum, so will be iterable + raise errors.EnumMemberError(enum_values=list(field.type_)) + return enum_v.value if config.use_enum_values else enum_v + + +def uuid_validator(v: Any, field: 'ModelField') -> UUID: + try: + if isinstance(v, str): + v = UUID(v) + elif isinstance(v, (bytes, bytearray)): + try: + v = UUID(v.decode()) + except ValueError: + # 16 bytes in big-endian order as the bytes argument fail + # the above check + v = UUID(bytes=v) + except ValueError: + raise errors.UUIDError() + + if not isinstance(v, UUID): + raise errors.UUIDError() + + required_version = getattr(field.type_, '_required_version', None) + if required_version and v.version != required_version: + raise errors.UUIDVersionError(required_version=required_version) + + return v + + +def decimal_validator(v: Any) -> Decimal: + if isinstance(v, Decimal): + return v + elif isinstance(v, (bytes, bytearray)): + v = v.decode() + + v = str(v).strip() + + try: + v = Decimal(v) + except DecimalException: + raise errors.DecimalError() + + if not v.is_finite(): + raise errors.DecimalIsNotFiniteError() + + return v + + +def hashable_validator(v: Any) -> Hashable: + if isinstance(v, Hashable): + return v + + raise errors.HashableError() + + +def ip_v4_address_validator(v: Any) -> IPv4Address: + if isinstance(v, IPv4Address): + return v + + try: + return IPv4Address(v) + except ValueError: + raise errors.IPv4AddressError() + + +def ip_v6_address_validator(v: Any) -> IPv6Address: + if isinstance(v, IPv6Address): + return v + + try: + return IPv6Address(v) + except ValueError: + raise errors.IPv6AddressError() + + +def ip_v4_network_validator(v: Any) -> IPv4Network: + """ + Assume IPv4Network initialised with a default ``strict`` argument + + See more: + https://docs.python.org/library/ipaddress.html#ipaddress.IPv4Network + """ + if isinstance(v, IPv4Network): + return v + + try: + return IPv4Network(v) + except ValueError: + raise errors.IPv4NetworkError() + + +def ip_v6_network_validator(v: Any) -> IPv6Network: + """ + Assume IPv6Network initialised with a default ``strict`` argument + + See more: + https://docs.python.org/library/ipaddress.html#ipaddress.IPv6Network + """ + if isinstance(v, IPv6Network): + return v + + try: + return IPv6Network(v) + except ValueError: + raise errors.IPv6NetworkError() + + +def ip_v4_interface_validator(v: Any) -> IPv4Interface: + if isinstance(v, IPv4Interface): + return v + + try: + return IPv4Interface(v) + except ValueError: + raise errors.IPv4InterfaceError() + + +def ip_v6_interface_validator(v: Any) -> IPv6Interface: + if isinstance(v, IPv6Interface): + return v + + try: + return IPv6Interface(v) + except ValueError: + raise errors.IPv6InterfaceError() + + +def path_validator(v: Any) -> Path: + if isinstance(v, Path): + return v + + try: + return Path(v) + except TypeError: + raise errors.PathError() + + +def path_exists_validator(v: Any) -> Path: + if not v.exists(): + raise errors.PathNotExistsError(path=v) + + return v + + +def callable_validator(v: Any) -> AnyCallable: + """ + Perform a simple check if the value is callable. + + Note: complete matching of argument type hints and return types is not performed + """ + if callable(v): + return v + + raise errors.CallableError(value=v) + + +def enum_validator(v: Any) -> Enum: + if isinstance(v, Enum): + return v + + raise errors.EnumError(value=v) + + +def int_enum_validator(v: Any) -> IntEnum: + if isinstance(v, IntEnum): + return v + + raise errors.IntEnumError(value=v) + + +def make_literal_validator(type_: Any) -> Callable[[Any], Any]: + permitted_choices = all_literal_values(type_) + + # To have a O(1) complexity and still return one of the values set inside the `Literal`, + # we create a dict with the set values (a set causes some problems with the way intersection works). + # In some cases the set value and checked value can indeed be different (see `test_literal_validator_str_enum`) + allowed_choices = {v: v for v in permitted_choices} + + def literal_validator(v: Any) -> Any: + try: + return allowed_choices[v] + except KeyError: + raise errors.WrongConstantError(given=v, permitted=permitted_choices) + + return literal_validator + + +def constr_length_validator(v: 'StrBytes', field: 'ModelField', config: 'BaseConfig') -> 'StrBytes': + v_len = len(v) + + min_length = field.type_.min_length if field.type_.min_length is not None else config.min_anystr_length + if v_len < min_length: + raise errors.AnyStrMinLengthError(limit_value=min_length) + + max_length = field.type_.max_length if field.type_.max_length is not None else config.max_anystr_length + if max_length is not None and v_len > max_length: + raise errors.AnyStrMaxLengthError(limit_value=max_length) + + return v + + +def constr_strip_whitespace(v: 'StrBytes', field: 'ModelField', config: 'BaseConfig') -> 'StrBytes': + strip_whitespace = field.type_.strip_whitespace or config.anystr_strip_whitespace + if strip_whitespace: + v = v.strip() + + return v + + +def constr_upper(v: 'StrBytes', field: 'ModelField', config: 'BaseConfig') -> 'StrBytes': + upper = field.type_.to_upper or config.anystr_upper + if upper: + v = v.upper() + + return v + + +def constr_lower(v: 'StrBytes', field: 'ModelField', config: 'BaseConfig') -> 'StrBytes': + lower = field.type_.to_lower or config.anystr_lower + if lower: + v = v.lower() + return v + + +def validate_json(v: Any, config: 'BaseConfig') -> Any: + if v is None: + # pass None through to other validators + return v + try: + return config.json_loads(v) # type: ignore + except ValueError: + raise errors.JsonError() + except TypeError: + raise errors.JsonTypeError() + + +T = TypeVar('T') + + +def make_arbitrary_type_validator(type_: Type[T]) -> Callable[[T], T]: + def arbitrary_type_validator(v: Any) -> T: + if isinstance(v, type_): + return v + raise errors.ArbitraryTypeError(expected_arbitrary_type=type_) + + return arbitrary_type_validator + + +def make_class_validator(type_: Type[T]) -> Callable[[Any], Type[T]]: + def class_validator(v: Any) -> Type[T]: + if lenient_issubclass(v, type_): + return v + raise errors.SubclassError(expected_class=type_) + + return class_validator + + +def any_class_validator(v: Any) -> Type[T]: + if isinstance(v, type): + return v + raise errors.ClassError() + + +def none_validator(v: Any) -> 'Literal[None]': + if v is None: + return v + raise errors.NotNoneError() + + +def pattern_validator(v: Any) -> Pattern[str]: + if isinstance(v, Pattern): + return v + + str_value = str_validator(v) + + try: + return re.compile(str_value) + except re.error: + raise errors.PatternError() + + +NamedTupleT = TypeVar('NamedTupleT', bound=NamedTuple) + + +def make_namedtuple_validator( + namedtuple_cls: Type[NamedTupleT], config: Type['BaseConfig'] +) -> Callable[[Tuple[Any, ...]], NamedTupleT]: + from .annotated_types import create_model_from_namedtuple + + NamedTupleModel = create_model_from_namedtuple( + namedtuple_cls, + __config__=config, + __module__=namedtuple_cls.__module__, + ) + namedtuple_cls.__pydantic_model__ = NamedTupleModel # type: ignore[attr-defined] + + def namedtuple_validator(values: Tuple[Any, ...]) -> NamedTupleT: + annotations = NamedTupleModel.__annotations__ + + if len(values) > len(annotations): + raise errors.ListMaxLengthError(limit_value=len(annotations)) + + dict_values: Dict[str, Any] = dict(zip(annotations, values)) + validated_dict_values: Dict[str, Any] = dict(NamedTupleModel(**dict_values)) + return namedtuple_cls(**validated_dict_values) + + return namedtuple_validator + + +def make_typeddict_validator( + typeddict_cls: Type['TypedDict'], config: Type['BaseConfig'] # type: ignore[valid-type] +) -> Callable[[Any], Dict[str, Any]]: + from .annotated_types import create_model_from_typeddict + + TypedDictModel = create_model_from_typeddict( + typeddict_cls, + __config__=config, + __module__=typeddict_cls.__module__, + ) + typeddict_cls.__pydantic_model__ = TypedDictModel # type: ignore[attr-defined] + + def typeddict_validator(values: 'TypedDict') -> Dict[str, Any]: # type: ignore[valid-type] + return TypedDictModel.parse_obj(values).dict(exclude_unset=True) + + return typeddict_validator + + +class IfConfig: + def __init__(self, validator: AnyCallable, *config_attr_names: str, ignored_value: Any = False) -> None: + self.validator = validator + self.config_attr_names = config_attr_names + self.ignored_value = ignored_value + + def check(self, config: Type['BaseConfig']) -> bool: + return any(getattr(config, name) not in {None, self.ignored_value} for name in self.config_attr_names) + + +# order is important here, for example: bool is a subclass of int so has to come first, datetime before date same, +# IPv4Interface before IPv4Address, etc +_VALIDATORS: List[Tuple[Type[Any], List[Any]]] = [ + (IntEnum, [int_validator, enum_member_validator]), + (Enum, [enum_member_validator]), + ( + str, + [ + str_validator, + IfConfig(anystr_strip_whitespace, 'anystr_strip_whitespace'), + IfConfig(anystr_upper, 'anystr_upper'), + IfConfig(anystr_lower, 'anystr_lower'), + IfConfig(anystr_length_validator, 'min_anystr_length', 'max_anystr_length'), + ], + ), + ( + bytes, + [ + bytes_validator, + IfConfig(anystr_strip_whitespace, 'anystr_strip_whitespace'), + IfConfig(anystr_upper, 'anystr_upper'), + IfConfig(anystr_lower, 'anystr_lower'), + IfConfig(anystr_length_validator, 'min_anystr_length', 'max_anystr_length'), + ], + ), + (bool, [bool_validator]), + (int, [int_validator]), + (float, [float_validator, IfConfig(float_finite_validator, 'allow_inf_nan', ignored_value=True)]), + (Path, [path_validator]), + (datetime, [parse_datetime]), + (date, [parse_date]), + (time, [parse_time]), + (timedelta, [parse_duration]), + (OrderedDict, [ordered_dict_validator]), + (dict, [dict_validator]), + (list, [list_validator]), + (tuple, [tuple_validator]), + (set, [set_validator]), + (frozenset, [frozenset_validator]), + (deque, [deque_validator]), + (UUID, [uuid_validator]), + (Decimal, [decimal_validator]), + (IPv4Interface, [ip_v4_interface_validator]), + (IPv6Interface, [ip_v6_interface_validator]), + (IPv4Address, [ip_v4_address_validator]), + (IPv6Address, [ip_v6_address_validator]), + (IPv4Network, [ip_v4_network_validator]), + (IPv6Network, [ip_v6_network_validator]), +] + + +def find_validators( # noqa: C901 (ignore complexity) + type_: Type[Any], config: Type['BaseConfig'] +) -> Generator[AnyCallable, None, None]: + from .dataclasses import is_builtin_dataclass, make_dataclass_validator + + if type_ is Any or type_ is object: + return + type_type = type_.__class__ + if type_type == ForwardRef or type_type == TypeVar: + return + + if is_none_type(type_): + yield none_validator + return + if type_ is Pattern or type_ is re.Pattern: + yield pattern_validator + return + if type_ is Hashable or type_ is CollectionsHashable: + yield hashable_validator + return + if is_callable_type(type_): + yield callable_validator + return + if is_literal_type(type_): + yield make_literal_validator(type_) + return + if is_builtin_dataclass(type_): + yield from make_dataclass_validator(type_, config) + return + if type_ is Enum: + yield enum_validator + return + if type_ is IntEnum: + yield int_enum_validator + return + if is_namedtuple(type_): + yield tuple_validator + yield make_namedtuple_validator(type_, config) + return + if is_typeddict(type_): + yield make_typeddict_validator(type_, config) + return + + class_ = get_class(type_) + if class_ is not None: + if class_ is not Any and isinstance(class_, type): + yield make_class_validator(class_) + else: + yield any_class_validator + return + + for val_type, validators in _VALIDATORS: + try: + if issubclass(type_, val_type): + for v in validators: + if isinstance(v, IfConfig): + if v.check(config): + yield v.validator + else: + yield v + return + except TypeError: + raise RuntimeError(f'error checking inheritance of {type_!r} (type: {display_as_type(type_)})') + + if config.arbitrary_types_allowed: + yield make_arbitrary_type_validator(type_) + else: + raise RuntimeError(f'no validator found for {type_}, see `arbitrary_types_allowed` in Config') diff --git a/libs/win/pydantic/version.cp37-win_amd64.pyd b/libs/win/pydantic/version.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..91395862481d52ead2a96f67b13fa8024e220052 GIT binary patch literal 53760 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 literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/version.py b/libs/win/pydantic/version.py new file mode 100644 index 00000000..32c61633 --- /dev/null +++ b/libs/win/pydantic/version.py @@ -0,0 +1,38 @@ +__all__ = 'compiled', 'VERSION', 'version_info' + +VERSION = '1.10.2' + +try: + import cython # type: ignore +except ImportError: + compiled: bool = False +else: # pragma: no cover + try: + compiled = cython.compiled + except AttributeError: + compiled = False + + +def version_info() -> str: + import platform + import sys + from importlib import import_module + from pathlib import Path + + optional_deps = [] + for p in ('devtools', 'dotenv', 'email-validator', 'typing-extensions'): + try: + import_module(p.replace('-', '_')) + except ImportError: + continue + optional_deps.append(p) + + info = { + 'pydantic version': VERSION, + 'pydantic compiled': compiled, + 'install path': Path(__file__).resolve().parent, + 'python version': sys.version, + 'platform': platform.platform(), + 'optional deps. installed': optional_deps, + } + return '\n'.join('{:>30} {}'.format(k + ':', str(v).replace('\n', ' ')) for k, v in info.items()) diff --git a/libs/win/scripts/watch-changes.py b/libs/win/scripts/watch-changes.py new file mode 100644 index 00000000..72b48686 --- /dev/null +++ b/libs/win/scripts/watch-changes.py @@ -0,0 +1,35 @@ +import traceback +import sys +import logging + +from jaraco.windows.filesystem import change + +logging.basicConfig(level=logging.INFO) + + +def long_handler(file): + try: + with open(file, 'rb') as f: + data = f.read() + print("read", len(data), "bytes from", file) + except Exception: + traceback.print_exc() + + +def main(): + try: + watch() + except KeyboardInterrupt: + pass + + +def watch(): + notifier = change.BlockingNotifier(sys.argv[1]) + notifier.watch_subtree = True + + for ch in notifier.get_changed_files(): + long_handler(ch) + + +if __name__ == '__main__': + main() diff --git a/libs/win/six.py b/libs/win/six.py deleted file mode 100644 index 89b2188f..00000000 --- a/libs/win/six.py +++ /dev/null @@ -1,952 +0,0 @@ -# Copyright (c) 2010-2018 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -"""Utilities for writing code that runs on Python 2 and 3""" - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson " -__version__ = "1.12.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("getoutput", "commands", "subprocess"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("splitvalue", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), - MovedAttribute("parse_http_list", "urllib2", "urllib.request"), - MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - try: - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - finally: - value = None - tb = None - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - try: - raise tp, value, tb - finally: - tb = None -""") - - -if sys.version_info[:2] == (3, 2): - exec_("""def raise_from(value, from_value): - try: - if from_value is None: - raise value - raise value from from_value - finally: - value = None -""") -elif sys.version_info[:2] > (3, 2): - exec_("""def raise_from(value, from_value): - try: - raise value from from_value - finally: - value = None -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - return wrapper -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(type): - - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - - @classmethod - def __prepare__(cls, name, this_bases): - return meta.__prepare__(name, bases) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - if hasattr(cls, '__qualname__'): - orig_vars['__qualname__'] = cls.__qualname__ - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def ensure_binary(s, encoding='utf-8', errors='strict'): - """Coerce **s** to six.binary_type. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> encoded to `bytes` - - `bytes` -> `bytes` - """ - if isinstance(s, text_type): - return s.encode(encoding, errors) - elif isinstance(s, binary_type): - return s - else: - raise TypeError("not expecting type '%s'" % type(s)) - - -def ensure_str(s, encoding='utf-8', errors='strict'): - """Coerce *s* to `str`. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - if not isinstance(s, (text_type, binary_type)): - raise TypeError("not expecting type '%s'" % type(s)) - if PY2 and isinstance(s, text_type): - s = s.encode(encoding, errors) - elif PY3 and isinstance(s, binary_type): - s = s.decode(encoding, errors) - return s - - -def ensure_text(s, encoding='utf-8', errors='strict'): - """Coerce *s* to six.text_type. - - For Python 2: - - `unicode` -> `unicode` - - `str` -> `unicode` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - if isinstance(s, binary_type): - return s.decode(encoding, errors) - elif isinstance(s, text_type): - return s - else: - raise TypeError("not expecting type '%s'" % type(s)) - - - -def python_2_unicode_compatible(klass): - """ - A decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/libs/win/test_path.py b/libs/win/test_path.py deleted file mode 100644 index 2a7ddb8f..00000000 --- a/libs/win/test_path.py +++ /dev/null @@ -1,1258 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -Tests for the path module. - -This suite runs on Linux, OS X, and Windows right now. To extend the -platform support, just add appropriate pathnames for your -platform (os.name) in each place where the p() function is called. -Then report the result. If you can't get the test to run at all on -your platform, there's probably a bug in path.py -- please report the issue -in the issue tracker at https://github.com/jaraco/path.py. - -TestScratchDir.test_touch() takes a while to run. It sleeps a few -seconds to allow some time to pass between calls to check the modify -time on files. -""" - -from __future__ import unicode_literals, absolute_import, print_function - -import codecs -import os -import sys -import shutil -import time -import types -import ntpath -import posixpath -import textwrap -import platform -import importlib -import operator -import datetime -import subprocess -import re - -import pytest -import packaging.version - -import path -from path import TempDir -from path import matchers -from path import SpecialResolver -from path import Multi - -Path = None - - -def p(**choices): - """ Choose a value from several possible values, based on os.name """ - return choices[os.name] - - -@pytest.fixture(autouse=True, params=[path.Path]) -def path_class(request, monkeypatch): - """ - Invoke tests on any number of Path classes. - """ - monkeypatch.setitem(globals(), 'Path', request.param) - - -def mac_version(target, comparator=operator.ge): - """ - Return True if on a Mac whose version passes the comparator. - """ - current_ver = packaging.version.parse(platform.mac_ver()[0]) - target_ver = packaging.version.parse(target) - return ( - platform.system() == 'Darwin' - and comparator(current_ver, target_ver) - ) - - -class TestBasics: - def test_relpath(self): - root = Path(p(nt='C:\\', posix='/')) - foo = root / 'foo' - quux = foo / 'quux' - bar = foo / 'bar' - boz = bar / 'Baz' / 'Boz' - up = Path(os.pardir) - - # basics - assert root.relpathto(boz) == Path('foo') / 'bar' / 'Baz' / 'Boz' - assert bar.relpathto(boz) == Path('Baz') / 'Boz' - assert quux.relpathto(boz) == up / 'bar' / 'Baz' / 'Boz' - assert boz.relpathto(quux) == up / up / up / 'quux' - assert boz.relpathto(bar) == up / up - - # Path is not the first element in concatenation - assert root.relpathto(boz) == 'foo' / Path('bar') / 'Baz' / 'Boz' - - # x.relpathto(x) == curdir - assert root.relpathto(root) == os.curdir - assert boz.relpathto(boz) == os.curdir - # Make sure case is properly noted (or ignored) - assert boz.relpathto(boz.normcase()) == os.curdir - - # relpath() - cwd = Path(os.getcwd()) - assert boz.relpath() == cwd.relpathto(boz) - - if os.name == 'nt': - # Check relpath across drives. - d = Path('D:\\') - assert d.relpathto(boz) == boz - - def test_construction_from_none(self): - """ - - """ - try: - Path(None) - except TypeError: - pass - else: - raise Exception("DID NOT RAISE") - - def test_construction_from_int(self): - """ - Path class will construct a path as a string of the number - """ - assert Path(1) == '1' - - def test_string_compatibility(self): - """ Test compatibility with ordinary strings. """ - x = Path('xyzzy') - assert x == 'xyzzy' - assert x == str('xyzzy') - - # sorting - items = [Path('fhj'), - Path('fgh'), - 'E', - Path('d'), - 'A', - Path('B'), - 'c'] - items.sort() - assert items == ['A', 'B', 'E', 'c', 'd', 'fgh', 'fhj'] - - # Test p1/p1. - p1 = Path("foo") - p2 = Path("bar") - assert p1 / p2 == p(nt='foo\\bar', posix='foo/bar') - - def test_properties(self): - # Create sample path object. - f = p(nt='C:\\Program Files\\Python\\Lib\\xyzzy.py', - posix='/usr/local/python/lib/xyzzy.py') - f = Path(f) - - # .parent - nt_lib = 'C:\\Program Files\\Python\\Lib' - posix_lib = '/usr/local/python/lib' - expected = p(nt=nt_lib, posix=posix_lib) - assert f.parent == expected - - # .name - assert f.name == 'xyzzy.py' - assert f.parent.name == p(nt='Lib', posix='lib') - - # .ext - assert f.ext == '.py' - assert f.parent.ext == '' - - # .drive - assert f.drive == p(nt='C:', posix='') - - def test_methods(self): - # .abspath() - assert Path(os.curdir).abspath() == os.getcwd() - - # .getcwd() - cwd = Path.getcwd() - assert isinstance(cwd, Path) - assert cwd == os.getcwd() - - def test_UNC(self): - if hasattr(os.path, 'splitunc'): - p = Path(r'\\python1\share1\dir1\file1.txt') - assert p.uncshare == r'\\python1\share1' - assert p.splitunc() == os.path.splitunc(str(p)) - - def test_explicit_module(self): - """ - The user may specify an explicit path module to use. - """ - nt_ok = Path.using_module(ntpath)(r'foo\bar\baz') - posix_ok = Path.using_module(posixpath)(r'foo/bar/baz') - posix_wrong = Path.using_module(posixpath)(r'foo\bar\baz') - - assert nt_ok.dirname() == r'foo\bar' - assert posix_ok.dirname() == r'foo/bar' - assert posix_wrong.dirname() == '' - - assert nt_ok / 'quux' == r'foo\bar\baz\quux' - assert posix_ok / 'quux' == r'foo/bar/baz/quux' - - def test_explicit_module_classes(self): - """ - Multiple calls to path.using_module should produce the same class. - """ - nt_path = Path.using_module(ntpath) - assert nt_path is Path.using_module(ntpath) - assert nt_path.__name__ == 'Path_ntpath' - - def test_joinpath_on_instance(self): - res = Path('foo') - foo_bar = res.joinpath('bar') - assert foo_bar == p(nt='foo\\bar', posix='foo/bar') - - def test_joinpath_to_nothing(self): - res = Path('foo') - assert res.joinpath() == res - - def test_joinpath_on_class(self): - "Construct a path from a series of strings" - foo_bar = Path.joinpath('foo', 'bar') - assert foo_bar == p(nt='foo\\bar', posix='foo/bar') - - def test_joinpath_fails_on_empty(self): - "It doesn't make sense to join nothing at all" - try: - Path.joinpath() - except TypeError: - pass - else: - raise Exception("did not raise") - - def test_joinpath_returns_same_type(self): - path_posix = Path.using_module(posixpath) - res = path_posix.joinpath('foo') - assert isinstance(res, path_posix) - res2 = res.joinpath('bar') - assert isinstance(res2, path_posix) - assert res2 == 'foo/bar' - - -class TestPerformance: - @pytest.mark.skipif( - path.PY2, - reason="Tests fail frequently on Python 2; see #153") - def test_import_time(self, monkeypatch): - """ - Import of path.py should take less than 100ms. - - Run tests in a subprocess to isolate from test suite overhead. - """ - cmd = [ - sys.executable, - '-m', 'timeit', - '-n', '1', - '-r', '1', - 'import path', - ] - res = subprocess.check_output(cmd, universal_newlines=True) - dur = re.search(r'(\d+) msec per loop', res).group(1) - limit = datetime.timedelta(milliseconds=100) - duration = datetime.timedelta(milliseconds=int(dur)) - assert duration < limit - - -class TestSelfReturn: - """ - Some methods don't necessarily return any value (e.g. makedirs, - makedirs_p, rename, mkdir, touch, chroot). These methods should return - self anyhow to allow methods to be chained. - """ - def test_makedirs_p(self, tmpdir): - """ - Path('foo').makedirs_p() == Path('foo') - """ - p = Path(tmpdir) / "newpath" - ret = p.makedirs_p() - assert p == ret - - def test_makedirs_p_extant(self, tmpdir): - p = Path(tmpdir) - ret = p.makedirs_p() - assert p == ret - - def test_rename(self, tmpdir): - p = Path(tmpdir) / "somefile" - p.touch() - target = Path(tmpdir) / "otherfile" - ret = p.rename(target) - assert target == ret - - def test_mkdir(self, tmpdir): - p = Path(tmpdir) / "newdir" - ret = p.mkdir() - assert p == ret - - def test_touch(self, tmpdir): - p = Path(tmpdir) / "empty file" - ret = p.touch() - assert p == ret - - -class TestScratchDir: - """ - Tests that run in a temporary directory (does not test TempDir class) - """ - def test_context_manager(self, tmpdir): - """Can be used as context manager for chdir.""" - d = Path(tmpdir) - subdir = d / 'subdir' - subdir.makedirs() - old_dir = os.getcwd() - with subdir: - assert os.getcwd() == os.path.realpath(subdir) - assert os.getcwd() == old_dir - - def test_touch(self, tmpdir): - # NOTE: This test takes a long time to run (~10 seconds). - # It sleeps several seconds because on Windows, the resolution - # of a file's mtime and ctime is about 2 seconds. - # - # atime isn't tested because on Windows the resolution of atime - # is something like 24 hours. - - threshold = 1 - - d = Path(tmpdir) - f = d / 'test.txt' - t0 = time.time() - threshold - f.touch() - t1 = time.time() + threshold - - assert f.exists() - assert f.isfile() - assert f.size == 0 - assert t0 <= f.mtime <= t1 - if hasattr(os.path, 'getctime'): - ct = f.ctime - assert t0 <= ct <= t1 - - time.sleep(threshold * 2) - fobj = open(f, 'ab') - fobj.write('some bytes'.encode('utf-8')) - fobj.close() - - time.sleep(threshold * 2) - t2 = time.time() - threshold - f.touch() - t3 = time.time() + threshold - - assert t0 <= t1 < t2 <= t3 # sanity check - - assert f.exists() - assert f.isfile() - assert f.size == 10 - assert t2 <= f.mtime <= t3 - if hasattr(os.path, 'getctime'): - ct2 = f.ctime - if os.name == 'nt': - # On Windows, "ctime" is CREATION time - assert ct == ct2 - assert ct2 < t2 - else: - assert ( - # ctime is unchanged - ct == ct2 or - # ctime is approximately the mtime - ct2 == pytest.approx(f.mtime, 0.001) - ) - - def test_listing(self, tmpdir): - d = Path(tmpdir) - assert d.listdir() == [] - - f = 'testfile.txt' - af = d / f - assert af == os.path.join(d, f) - af.touch() - try: - assert af.exists() - - assert d.listdir() == [af] - - # .glob() - assert d.glob('testfile.txt') == [af] - assert d.glob('test*.txt') == [af] - assert d.glob('*.txt') == [af] - assert d.glob('*txt') == [af] - assert d.glob('*') == [af] - assert d.glob('*.html') == [] - assert d.glob('testfile') == [] - - # .iglob matches .glob but as an iterator. - assert list(d.iglob('*')) == d.glob('*') - assert isinstance(d.iglob('*'), types.GeneratorType) - - finally: - af.remove() - - # Try a test with 20 files - files = [d / ('%d.txt' % i) for i in range(20)] - for f in files: - fobj = open(f, 'w') - fobj.write('some text\n') - fobj.close() - try: - files2 = d.listdir() - files.sort() - files2.sort() - assert files == files2 - finally: - for f in files: - try: - f.remove() - except Exception: - pass - - @pytest.mark.xfail( - mac_version('10.13'), - reason="macOS disallows invalid encodings", - ) - @pytest.mark.xfail( - platform.system() == 'Windows' and path.PY3, - reason="Can't write latin characters. See #133", - ) - def test_listdir_other_encoding(self, tmpdir): - """ - Some filesystems allow non-character sequences in path names. - ``.listdir`` should still function in this case. - See issue #61 for details. - """ - assert Path(tmpdir).listdir() == [] - tmpdir_bytes = str(tmpdir).encode('ascii') - - filename = 'r\xe9\xf1emi'.encode('latin-1') - pathname = os.path.join(tmpdir_bytes, filename) - with open(pathname, 'wb'): - pass - # first demonstrate that os.listdir works - assert os.listdir(tmpdir_bytes) - - # now try with path.py - results = Path(tmpdir).listdir() - assert len(results) == 1 - res, = results - assert isinstance(res, Path) - # OS X seems to encode the bytes in the filename as %XX characters. - if platform.system() == 'Darwin': - assert res.basename() == 'r%E9%F1emi' - return - assert len(res.basename()) == len(filename) - - def test_makedirs(self, tmpdir): - d = Path(tmpdir) - - # Placeholder file so that when removedirs() is called, - # it doesn't remove the temporary directory itself. - tempf = d / 'temp.txt' - tempf.touch() - try: - foo = d / 'foo' - boz = foo / 'bar' / 'baz' / 'boz' - boz.makedirs() - try: - assert boz.isdir() - finally: - boz.removedirs() - assert not foo.exists() - assert d.exists() - - foo.mkdir(0o750) - boz.makedirs(0o700) - try: - assert boz.isdir() - finally: - boz.removedirs() - assert not foo.exists() - assert d.exists() - finally: - os.remove(tempf) - - def assertSetsEqual(self, a, b): - ad = {} - - for i in a: - ad[i] = None - - bd = {} - - for i in b: - bd[i] = None - - assert ad == bd - - def test_shutil(self, tmpdir): - # Note: This only tests the methods exist and do roughly what - # they should, neglecting the details as they are shutil's - # responsibility. - - d = Path(tmpdir) - testDir = d / 'testdir' - testFile = testDir / 'testfile.txt' - testA = testDir / 'A' - testCopy = testA / 'testcopy.txt' - testLink = testA / 'testlink.txt' - testB = testDir / 'B' - testC = testB / 'C' - testCopyOfLink = testC / testA.relpathto(testLink) - - # Create test dirs and a file - testDir.mkdir() - testA.mkdir() - testB.mkdir() - - f = open(testFile, 'w') - f.write('x' * 10000) - f.close() - - # Test simple file copying. - testFile.copyfile(testCopy) - assert testCopy.isfile() - assert testFile.bytes() == testCopy.bytes() - - # Test copying into a directory. - testCopy2 = testA / testFile.name - testFile.copy(testA) - assert testCopy2.isfile() - assert testFile.bytes() == testCopy2.bytes() - - # Make a link for the next test to use. - if hasattr(os, 'symlink'): - testFile.symlink(testLink) - else: - testFile.copy(testLink) # fallback - - # Test copying directory tree. - testA.copytree(testC) - assert testC.isdir() - self.assertSetsEqual( - testC.listdir(), - [testC / testCopy.name, - testC / testFile.name, - testCopyOfLink]) - assert not testCopyOfLink.islink() - - # Clean up for another try. - testC.rmtree() - assert not testC.exists() - - # Copy again, preserving symlinks. - testA.copytree(testC, True) - assert testC.isdir() - self.assertSetsEqual( - testC.listdir(), - [testC / testCopy.name, - testC / testFile.name, - testCopyOfLink]) - if hasattr(os, 'symlink'): - assert testCopyOfLink.islink() - assert testCopyOfLink.readlink() == testFile - - # Clean up. - testDir.rmtree() - assert not testDir.exists() - self.assertList(d.listdir(), []) - - def assertList(self, listing, expected): - assert sorted(listing) == sorted(expected) - - def test_patterns(self, tmpdir): - d = Path(tmpdir) - names = ['x.tmp', 'x.xtmp', 'x2g', 'x22', 'x.txt'] - dirs = [d, d / 'xdir', d / 'xdir.tmp', d / 'xdir.tmp' / 'xsubdir'] - - for e in dirs: - if not e.isdir(): - e.makedirs() - - for name in names: - (e / name).touch() - self.assertList(d.listdir('*.tmp'), [d / 'x.tmp', d / 'xdir.tmp']) - self.assertList(d.files('*.tmp'), [d / 'x.tmp']) - self.assertList(d.dirs('*.tmp'), [d / 'xdir.tmp']) - self.assertList(d.walk(), [e for e in dirs - if e != d] + [e / n for e in dirs - for n in names]) - self.assertList(d.walk('*.tmp'), - [e / 'x.tmp' for e in dirs] + [d / 'xdir.tmp']) - self.assertList(d.walkfiles('*.tmp'), [e / 'x.tmp' for e in dirs]) - self.assertList(d.walkdirs('*.tmp'), [d / 'xdir.tmp']) - - def test_unicode(self, tmpdir): - d = Path(tmpdir) - p = d / 'unicode.txt' - - def test(enc): - """ Test that path works with the specified encoding, - which must be capable of representing the entire range of - Unicode codepoints. - """ - - given = ( - 'Hello world\n' - '\u0d0a\u0a0d\u0d15\u0a15\r\n' - '\u0d0a\u0a0d\u0d15\u0a15\x85' - '\u0d0a\u0a0d\u0d15\u0a15\u2028' - '\r' - 'hanging' - ) - clean = ( - 'Hello world\n' - '\u0d0a\u0a0d\u0d15\u0a15\n' - '\u0d0a\u0a0d\u0d15\u0a15\n' - '\u0d0a\u0a0d\u0d15\u0a15\n' - '\n' - 'hanging' - ) - givenLines = [ - ('Hello world\n'), - ('\u0d0a\u0a0d\u0d15\u0a15\r\n'), - ('\u0d0a\u0a0d\u0d15\u0a15\x85'), - ('\u0d0a\u0a0d\u0d15\u0a15\u2028'), - ('\r'), - ('hanging')] - expectedLines = [ - ('Hello world\n'), - ('\u0d0a\u0a0d\u0d15\u0a15\n'), - ('\u0d0a\u0a0d\u0d15\u0a15\n'), - ('\u0d0a\u0a0d\u0d15\u0a15\n'), - ('\n'), - ('hanging')] - expectedLines2 = [ - ('Hello world'), - ('\u0d0a\u0a0d\u0d15\u0a15'), - ('\u0d0a\u0a0d\u0d15\u0a15'), - ('\u0d0a\u0a0d\u0d15\u0a15'), - (''), - ('hanging')] - - # write bytes manually to file - f = codecs.open(p, 'w', enc) - f.write(given) - f.close() - - # test all 3 path read-fully functions, including - # path.lines() in unicode mode. - assert p.bytes() == given.encode(enc) - assert p.text(enc) == clean - assert p.lines(enc) == expectedLines - assert p.lines(enc, retain=False) == expectedLines2 - - # If this is UTF-16, that's enough. - # The rest of these will unfortunately fail because append=True - # mode causes an extra BOM to be written in the middle of the file. - # UTF-16 is the only encoding that has this problem. - if enc == 'UTF-16': - return - - # Write Unicode to file using path.write_text(). - # This test doesn't work with a hanging line. - cleanNoHanging = clean + '\n' - - p.write_text(cleanNoHanging, enc) - p.write_text(cleanNoHanging, enc, append=True) - # Check the result. - expectedBytes = 2 * cleanNoHanging.replace('\n', - os.linesep).encode(enc) - expectedLinesNoHanging = expectedLines[:] - expectedLinesNoHanging[-1] += '\n' - assert p.bytes() == expectedBytes - assert p.text(enc) == 2 * cleanNoHanging - assert p.lines(enc) == 2 * expectedLinesNoHanging - assert p.lines(enc, retain=False) == 2 * expectedLines2 - - # Write Unicode to file using path.write_lines(). - # The output in the file should be exactly the same as last time. - p.write_lines(expectedLines, enc) - p.write_lines(expectedLines2, enc, append=True) - # Check the result. - assert p.bytes() == expectedBytes - - # Now: same test, but using various newline sequences. - # If linesep is being properly applied, these will be converted - # to the platform standard newline sequence. - p.write_lines(givenLines, enc) - p.write_lines(givenLines, enc, append=True) - # Check the result. - assert p.bytes() == expectedBytes - - # Same test, using newline sequences that are different - # from the platform default. - def testLinesep(eol): - p.write_lines(givenLines, enc, linesep=eol) - p.write_lines(givenLines, enc, linesep=eol, append=True) - expected = 2 * cleanNoHanging.replace('\n', eol).encode(enc) - assert p.bytes() == expected - - testLinesep('\n') - testLinesep('\r') - testLinesep('\r\n') - testLinesep('\x0d\x85') - - # Again, but with linesep=None. - p.write_lines(givenLines, enc, linesep=None) - p.write_lines(givenLines, enc, linesep=None, append=True) - # Check the result. - expectedBytes = 2 * given.encode(enc) - assert p.bytes() == expectedBytes - assert p.text(enc) == 2 * clean - expectedResultLines = expectedLines[:] - expectedResultLines[-1] += expectedLines[0] - expectedResultLines += expectedLines[1:] - assert p.lines(enc) == expectedResultLines - - test('UTF-8') - test('UTF-16BE') - test('UTF-16LE') - test('UTF-16') - - def test_chunks(self, tmpdir): - p = (TempDir() / 'test.txt').touch() - txt = "0123456789" - size = 5 - p.write_text(txt) - for i, chunk in enumerate(p.chunks(size)): - assert chunk == txt[i * size:i * size + size] - - assert i == len(txt) / size - 1 - - @pytest.mark.skipif( - not hasattr(os.path, 'samefile'), - reason="samefile not present", - ) - def test_samefile(self, tmpdir): - f1 = (TempDir() / '1.txt').touch() - f1.write_text('foo') - f2 = (TempDir() / '2.txt').touch() - f1.write_text('foo') - f3 = (TempDir() / '3.txt').touch() - f1.write_text('bar') - f4 = (TempDir() / '4.txt') - f1.copyfile(f4) - - assert os.path.samefile(f1, f2) == f1.samefile(f2) - assert os.path.samefile(f1, f3) == f1.samefile(f3) - assert os.path.samefile(f1, f4) == f1.samefile(f4) - assert os.path.samefile(f1, f1) == f1.samefile(f1) - - def test_rmtree_p(self, tmpdir): - d = Path(tmpdir) - sub = d / 'subfolder' - sub.mkdir() - (sub / 'afile').write_text('something') - sub.rmtree_p() - assert not sub.exists() - try: - sub.rmtree_p() - except OSError: - self.fail("Calling `rmtree_p` on non-existent directory " - "should not raise an exception.") - - def test_rmdir_p_exists(self, tmpdir): - """ - Invocation of rmdir_p on an existant directory should - remove the directory. - """ - d = Path(tmpdir) - sub = d / 'subfolder' - sub.mkdir() - sub.rmdir_p() - assert not sub.exists() - - def test_rmdir_p_nonexistent(self, tmpdir): - """ - A non-existent file should not raise an exception. - """ - d = Path(tmpdir) - sub = d / 'subfolder' - assert not sub.exists() - sub.rmdir_p() - - -class TestMergeTree: - @pytest.fixture(autouse=True) - def testing_structure(self, tmpdir): - self.test_dir = Path(tmpdir) - self.subdir_a = self.test_dir / 'A' - self.test_file = self.subdir_a / 'testfile.txt' - self.test_link = self.subdir_a / 'testlink.txt' - self.subdir_b = self.test_dir / 'B' - - self.subdir_a.mkdir() - self.subdir_b.mkdir() - - with open(self.test_file, 'w') as f: - f.write('x' * 10000) - - if hasattr(os, 'symlink'): - self.test_file.symlink(self.test_link) - else: - self.test_file.copy(self.test_link) - - def check_link(self): - target = Path(self.subdir_b / self.test_link.name) - check = target.islink if hasattr(os, 'symlink') else target.isfile - assert check() - - def test_with_nonexisting_dst_kwargs(self): - self.subdir_a.merge_tree(self.subdir_b, symlinks=True) - assert self.subdir_b.isdir() - expected = set(( - self.subdir_b / self.test_file.name, - self.subdir_b / self.test_link.name, - )) - assert set(self.subdir_b.listdir()) == expected - self.check_link() - - def test_with_nonexisting_dst_args(self): - self.subdir_a.merge_tree(self.subdir_b, True) - assert self.subdir_b.isdir() - expected = set(( - self.subdir_b / self.test_file.name, - self.subdir_b / self.test_link.name, - )) - assert set(self.subdir_b.listdir()) == expected - self.check_link() - - def test_with_existing_dst(self): - self.subdir_b.rmtree() - self.subdir_a.copytree(self.subdir_b, True) - - self.test_link.remove() - test_new = self.subdir_a / 'newfile.txt' - test_new.touch() - with open(self.test_file, 'w') as f: - f.write('x' * 5000) - - self.subdir_a.merge_tree(self.subdir_b, True) - - assert self.subdir_b.isdir() - expected = set(( - self.subdir_b / self.test_file.name, - self.subdir_b / self.test_link.name, - self.subdir_b / test_new.name, - )) - assert set(self.subdir_b.listdir()) == expected - self.check_link() - assert len(Path(self.subdir_b / self.test_file.name).bytes()) == 5000 - - def test_copytree_parameters(self): - """ - merge_tree should accept parameters to copytree, such as 'ignore' - """ - ignore = shutil.ignore_patterns('testlink*') - self.subdir_a.merge_tree(self.subdir_b, ignore=ignore) - - assert self.subdir_b.isdir() - assert self.subdir_b.listdir() == [self.subdir_b / self.test_file.name] - - def test_only_newer(self): - """ - merge_tree should accept a copy_function in which only - newer files are copied and older files do not overwrite - newer copies in the dest. - """ - target = self.subdir_b / 'testfile.txt' - target.write_text('this is newer') - self.subdir_a.merge_tree( - self.subdir_b, - copy_function=path.only_newer(shutil.copy2), - ) - assert target.text() == 'this is newer' - - -class TestChdir: - def test_chdir_or_cd(self, tmpdir): - """ tests the chdir or cd method """ - d = Path(str(tmpdir)) - cwd = d.getcwd() - - # ensure the cwd isn't our tempdir - assert str(d) != str(cwd) - # now, we're going to chdir to tempdir - d.chdir() - - # we now ensure that our cwd is the tempdir - assert str(d.getcwd()) == str(tmpdir) - # we're resetting our path - d = Path(cwd) - - # we ensure that our cwd is still set to tempdir - assert str(d.getcwd()) == str(tmpdir) - - # we're calling the alias cd method - d.cd() - # now, we ensure cwd isn'r tempdir - assert str(d.getcwd()) == str(cwd) - assert str(d.getcwd()) != str(tmpdir) - - -class TestSubclass: - - def test_subclass_produces_same_class(self): - """ - When operations are invoked on a subclass, they should produce another - instance of that subclass. - """ - class PathSubclass(Path): - pass - p = PathSubclass('/foo') - subdir = p / 'bar' - assert isinstance(subdir, PathSubclass) - - -class TestTempDir: - - def test_constructor(self): - """ - One should be able to readily construct a temporary directory - """ - d = TempDir() - assert isinstance(d, path.Path) - assert d.exists() - assert d.isdir() - d.rmdir() - assert not d.exists() - - def test_next_class(self): - """ - It should be possible to invoke operations on a TempDir and get - Path classes. - """ - d = TempDir() - sub = d / 'subdir' - assert isinstance(sub, path.Path) - d.rmdir() - - def test_context_manager(self): - """ - One should be able to use a TempDir object as a context, which will - clean up the contents after. - """ - d = TempDir() - res = d.__enter__() - assert res == path.Path(d) - (d / 'somefile.txt').touch() - assert not isinstance(d / 'somefile.txt', TempDir) - d.__exit__(None, None, None) - assert not d.exists() - - def test_context_manager_exception(self): - """ - The context manager will not clean up if an exception occurs. - """ - d = TempDir() - d.__enter__() - (d / 'somefile.txt').touch() - assert not isinstance(d / 'somefile.txt', TempDir) - d.__exit__(TypeError, TypeError('foo'), None) - assert d.exists() - - def test_context_manager_using_with(self): - """ - The context manager will allow using the with keyword and - provide a temporry directory that will be deleted after that. - """ - - with TempDir() as d: - assert d.isdir() - assert not d.isdir() - - -class TestUnicode: - @pytest.fixture(autouse=True) - def unicode_name_in_tmpdir(self, tmpdir): - # build a snowman (dir) in the temporary directory - Path(tmpdir).joinpath('☃').mkdir() - - def test_walkdirs_with_unicode_name(self, tmpdir): - for res in Path(tmpdir).walkdirs(): - pass - - -class TestPatternMatching: - def test_fnmatch_simple(self): - p = Path('FooBar') - assert p.fnmatch('Foo*') - assert p.fnmatch('Foo[ABC]ar') - - def test_fnmatch_custom_mod(self): - p = Path('FooBar') - p.module = ntpath - assert p.fnmatch('foobar') - assert p.fnmatch('FOO[ABC]AR') - - def test_fnmatch_custom_normcase(self): - def normcase(path): - return path.upper() - p = Path('FooBar') - assert p.fnmatch('foobar', normcase=normcase) - assert p.fnmatch('FOO[ABC]AR', normcase=normcase) - - def test_listdir_simple(self): - p = Path('.') - assert len(p.listdir()) == len(os.listdir('.')) - - def test_listdir_empty_pattern(self): - p = Path('.') - assert p.listdir('') == [] - - def test_listdir_patterns(self, tmpdir): - p = Path(tmpdir) - (p / 'sub').mkdir() - (p / 'File').touch() - assert p.listdir('s*') == [p / 'sub'] - assert len(p.listdir('*')) == 2 - - def test_listdir_custom_module(self, tmpdir): - """ - Listdir patterns should honor the case sensitivity of the path module - used by that Path class. - """ - always_unix = Path.using_module(posixpath) - p = always_unix(tmpdir) - (p / 'sub').mkdir() - (p / 'File').touch() - assert p.listdir('S*') == [] - - always_win = Path.using_module(ntpath) - p = always_win(tmpdir) - assert p.listdir('S*') == [p / 'sub'] - assert p.listdir('f*') == [p / 'File'] - - def test_listdir_case_insensitive(self, tmpdir): - """ - Listdir patterns should honor the case sensitivity of the path module - used by that Path class. - """ - p = Path(tmpdir) - (p / 'sub').mkdir() - (p / 'File').touch() - assert p.listdir(matchers.CaseInsensitive('S*')) == [p / 'sub'] - assert p.listdir(matchers.CaseInsensitive('f*')) == [p / 'File'] - assert p.files(matchers.CaseInsensitive('S*')) == [] - assert p.dirs(matchers.CaseInsensitive('f*')) == [] - - def test_walk_case_insensitive(self, tmpdir): - p = Path(tmpdir) - (p / 'sub1' / 'foo').makedirs_p() - (p / 'sub2' / 'foo').makedirs_p() - (p / 'sub1' / 'foo' / 'bar.Txt').touch() - (p / 'sub2' / 'foo' / 'bar.TXT').touch() - (p / 'sub2' / 'foo' / 'bar.txt.bz2').touch() - files = list(p.walkfiles(matchers.CaseInsensitive('*.txt'))) - assert len(files) == 2 - assert p / 'sub2' / 'foo' / 'bar.TXT' in files - assert p / 'sub1' / 'foo' / 'bar.Txt' in files - - -@pytest.mark.skipif( - sys.version_info < (2, 6), - reason="in_place requires io module in Python 2.6", -) -class TestInPlace: - reference_content = textwrap.dedent(""" - The quick brown fox jumped over the lazy dog. - """.lstrip()) - reversed_content = textwrap.dedent(""" - .god yzal eht revo depmuj xof nworb kciuq ehT - """.lstrip()) - alternate_content = textwrap.dedent(""" - Lorem ipsum dolor sit amet, consectetur adipisicing elit, - sed do eiusmod tempor incididunt ut labore et dolore magna - aliqua. Ut enim ad minim veniam, quis nostrud exercitation - ullamco laboris nisi ut aliquip ex ea commodo consequat. - Duis aute irure dolor in reprehenderit in voluptate velit - esse cillum dolore eu fugiat nulla pariatur. Excepteur - sint occaecat cupidatat non proident, sunt in culpa qui - officia deserunt mollit anim id est laborum. - """.lstrip()) - - @classmethod - def create_reference(cls, tmpdir): - p = Path(tmpdir) / 'document' - with p.open('w') as stream: - stream.write(cls.reference_content) - return p - - def test_line_by_line_rewrite(self, tmpdir): - doc = self.create_reference(tmpdir) - # reverse all the text in the document, line by line - with doc.in_place() as (reader, writer): - for line in reader: - r_line = ''.join(reversed(line.strip())) + '\n' - writer.write(r_line) - with doc.open() as stream: - data = stream.read() - assert data == self.reversed_content - - def test_exception_in_context(self, tmpdir): - doc = self.create_reference(tmpdir) - with pytest.raises(RuntimeError) as exc: - with doc.in_place() as (reader, writer): - writer.write(self.alternate_content) - raise RuntimeError("some error") - assert "some error" in str(exc) - with doc.open() as stream: - data = stream.read() - assert 'Lorem' not in data - assert 'lazy dog' in data - - -class TestSpecialPaths: - @pytest.fixture(autouse=True, scope='class') - def appdirs_installed(cls): - pytest.importorskip('appdirs') - - @pytest.fixture - def feign_linux(self, monkeypatch): - monkeypatch.setattr("platform.system", lambda: "Linux") - monkeypatch.setattr("sys.platform", "linux") - monkeypatch.setattr("os.pathsep", ":") - # remove any existing import of appdirs, as it sets up some - # state during import. - sys.modules.pop('appdirs') - - def test_basic_paths(self): - appdirs = importlib.import_module('appdirs') - - expected = appdirs.user_config_dir() - assert SpecialResolver(Path).user.config == expected - - expected = appdirs.site_config_dir() - assert SpecialResolver(Path).site.config == expected - - expected = appdirs.user_config_dir('My App', 'Me') - assert SpecialResolver(Path, 'My App', 'Me').user.config == expected - - def test_unix_paths(self, tmpdir, monkeypatch, feign_linux): - fake_config = tmpdir / '_config' - monkeypatch.setitem(os.environ, 'XDG_CONFIG_HOME', str(fake_config)) - expected = str(tmpdir / '_config') - assert SpecialResolver(Path).user.config == expected - - def test_unix_paths_fallback(self, tmpdir, monkeypatch, feign_linux): - "Without XDG_CONFIG_HOME set, ~/.config should be used." - fake_home = tmpdir / '_home' - monkeypatch.delitem(os.environ, 'XDG_CONFIG_HOME', raising=False) - monkeypatch.setitem(os.environ, 'HOME', str(fake_home)) - expected = Path('~/.config').expanduser() - assert SpecialResolver(Path).user.config == expected - - def test_property(self): - assert isinstance(Path.special().user.config, Path) - assert isinstance(Path.special().user.data, Path) - assert isinstance(Path.special().user.cache, Path) - - def test_other_parameters(self): - """ - Other parameters should be passed through to appdirs function. - """ - res = Path.special(version="1.0", multipath=True).site.config - assert isinstance(res, Path) - - def test_multipath(self, feign_linux, monkeypatch, tmpdir): - """ - If multipath is provided, on Linux return the XDG_CONFIG_DIRS - """ - fake_config_1 = str(tmpdir / '_config1') - fake_config_2 = str(tmpdir / '_config2') - config_dirs = os.pathsep.join([fake_config_1, fake_config_2]) - monkeypatch.setitem(os.environ, 'XDG_CONFIG_DIRS', config_dirs) - res = Path.special(multipath=True).site.config - assert isinstance(res, Multi) - assert fake_config_1 in res - assert fake_config_2 in res - assert '_config1' in str(res) - - def test_reused_SpecialResolver(self): - """ - Passing additional args and kwargs to SpecialResolver should be - passed through to each invocation of the function in appdirs. - """ - appdirs = importlib.import_module('appdirs') - - adp = SpecialResolver(Path, version="1.0") - res = adp.user.config - - expected = appdirs.user_config_dir(version="1.0") - assert res == expected - - -class TestMultiPath: - def test_for_class(self): - """ - Multi.for_class should return a subclass of the Path class provided. - """ - cls = Multi.for_class(Path) - assert issubclass(cls, Path) - assert issubclass(cls, Multi) - expected_name = 'Multi' + Path.__name__ - assert cls.__name__ == expected_name - - def test_detect_no_pathsep(self): - """ - If no pathsep is provided, multipath detect should return an instance - of the parent class with no Multi mix-in. - """ - path = Multi.for_class(Path).detect('/foo/bar') - assert isinstance(path, Path) - assert not isinstance(path, Multi) - - def test_detect_with_pathsep(self): - """ - If a pathsep appears in the input, detect should return an instance - of a Path with the Multi mix-in. - """ - inputs = '/foo/bar', '/baz/bing' - input = os.pathsep.join(inputs) - path = Multi.for_class(Path).detect(input) - - assert isinstance(path, Multi) - - def test_iteration(self): - """ - Iterating over a MultiPath should yield instances of the - parent class. - """ - inputs = '/foo/bar', '/baz/bing' - input = os.pathsep.join(inputs) - path = Multi.for_class(Path).detect(input) - - items = iter(path) - first = next(items) - assert first == '/foo/bar' - assert isinstance(first, Path) - assert not isinstance(first, Multi) - assert next(items) == '/baz/bing' - assert path == input - - -@pytest.mark.xfail('path.PY2', reason="Python 2 has no __future__") -def test_no_dependencies(): - """ - Path.py guarantees that the path module can be - transplanted into an environment without any dependencies. - """ - cmd = [ - sys.executable, - '-S', - '-c', 'import path', - ] - subprocess.check_call(cmd) - - -def test_version(): - """ - Under normal circumstances, path should present a - __version__. - """ - assert re.match(r'\d+\.\d+.*', path.__version__) diff --git a/libs/win/typing_extensions.py b/libs/win/typing_extensions.py new file mode 100644 index 00000000..ef42417c --- /dev/null +++ b/libs/win/typing_extensions.py @@ -0,0 +1,2209 @@ +import abc +import collections +import collections.abc +import functools +import operator +import sys +import types as _types +import typing + + +__all__ = [ + # Super-special typing primitives. + 'Any', + 'ClassVar', + 'Concatenate', + 'Final', + 'LiteralString', + 'ParamSpec', + 'ParamSpecArgs', + 'ParamSpecKwargs', + 'Self', + 'Type', + 'TypeVar', + 'TypeVarTuple', + 'Unpack', + + # ABCs (from collections.abc). + 'Awaitable', + 'AsyncIterator', + 'AsyncIterable', + 'Coroutine', + 'AsyncGenerator', + 'AsyncContextManager', + 'ChainMap', + + # Concrete collection types. + 'ContextManager', + 'Counter', + 'Deque', + 'DefaultDict', + 'NamedTuple', + 'OrderedDict', + 'TypedDict', + + # Structural checks, a.k.a. protocols. + 'SupportsIndex', + + # One-off things. + 'Annotated', + 'assert_never', + 'assert_type', + 'clear_overloads', + 'dataclass_transform', + 'get_overloads', + 'final', + 'get_args', + 'get_origin', + 'get_type_hints', + 'IntVar', + 'is_typeddict', + 'Literal', + 'NewType', + 'overload', + 'override', + 'Protocol', + 'reveal_type', + 'runtime', + 'runtime_checkable', + 'Text', + 'TypeAlias', + 'TypeGuard', + 'TYPE_CHECKING', + 'Never', + 'NoReturn', + 'Required', + 'NotRequired', +] + +# for backward compatibility +PEP_560 = True +GenericMeta = type + +# The functions below are modified copies of typing internal helpers. +# They are needed by _ProtocolMeta and they provide support for PEP 646. + +_marker = object() + + +def _check_generic(cls, parameters, elen=_marker): + """Check correct count for parameters of a generic cls (internal helper). + This gives a nice error message in case of count mismatch. + """ + if not elen: + raise TypeError(f"{cls} is not a generic class") + if elen is _marker: + if not hasattr(cls, "__parameters__") or not cls.__parameters__: + raise TypeError(f"{cls} is not a generic class") + elen = len(cls.__parameters__) + alen = len(parameters) + if alen != elen: + if hasattr(cls, "__parameters__"): + parameters = [p for p in cls.__parameters__ if not _is_unpack(p)] + num_tv_tuples = sum(isinstance(p, TypeVarTuple) for p in parameters) + if (num_tv_tuples > 0) and (alen >= elen - num_tv_tuples): + return + raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};" + f" actual {alen}, expected {elen}") + + +if sys.version_info >= (3, 10): + def _should_collect_from_parameters(t): + return isinstance( + t, (typing._GenericAlias, _types.GenericAlias, _types.UnionType) + ) +elif sys.version_info >= (3, 9): + def _should_collect_from_parameters(t): + return isinstance(t, (typing._GenericAlias, _types.GenericAlias)) +else: + def _should_collect_from_parameters(t): + return isinstance(t, typing._GenericAlias) and not t._special + + +def _collect_type_vars(types, typevar_types=None): + """Collect all type variable contained in types in order of + first appearance (lexicographic order). For example:: + + _collect_type_vars((T, List[S, T])) == (T, S) + """ + if typevar_types is None: + typevar_types = typing.TypeVar + tvars = [] + for t in types: + if ( + isinstance(t, typevar_types) and + t not in tvars and + not _is_unpack(t) + ): + tvars.append(t) + if _should_collect_from_parameters(t): + tvars.extend([t for t in t.__parameters__ if t not in tvars]) + return tuple(tvars) + + +NoReturn = typing.NoReturn + +# Some unconstrained type variables. These are used by the container types. +# (These are not for export.) +T = typing.TypeVar('T') # Any type. +KT = typing.TypeVar('KT') # Key type. +VT = typing.TypeVar('VT') # Value type. +T_co = typing.TypeVar('T_co', covariant=True) # Any type covariant containers. +T_contra = typing.TypeVar('T_contra', contravariant=True) # Ditto contravariant. + + +if sys.version_info >= (3, 11): + from typing import Any +else: + + class _AnyMeta(type): + def __instancecheck__(self, obj): + if self is Any: + raise TypeError("typing_extensions.Any cannot be used with isinstance()") + return super().__instancecheck__(obj) + + def __repr__(self): + if self is Any: + return "typing_extensions.Any" + return super().__repr__() + + class Any(metaclass=_AnyMeta): + """Special type indicating an unconstrained type. + - Any is compatible with every type. + - Any assumed to have all methods. + - All values assumed to be instances of Any. + Note that all the above statements are true from the point of view of + static type checkers. At runtime, Any should not be used with instance + checks. + """ + def __new__(cls, *args, **kwargs): + if cls is Any: + raise TypeError("Any cannot be instantiated") + return super().__new__(cls, *args, **kwargs) + + +ClassVar = typing.ClassVar + +# On older versions of typing there is an internal class named "Final". +# 3.8+ +if hasattr(typing, 'Final') and sys.version_info[:2] >= (3, 7): + Final = typing.Final +# 3.7 +else: + class _FinalForm(typing._SpecialForm, _root=True): + + def __repr__(self): + return 'typing_extensions.' + self._name + + def __getitem__(self, parameters): + item = typing._type_check(parameters, + f'{self._name} accepts only a single type.') + return typing._GenericAlias(self, (item,)) + + Final = _FinalForm('Final', + doc="""A special typing construct to indicate that a name + cannot be re-assigned or overridden in a subclass. + For example: + + MAX_SIZE: Final = 9000 + MAX_SIZE += 1 # Error reported by type checker + + class Connection: + TIMEOUT: Final[int] = 10 + class FastConnector(Connection): + TIMEOUT = 1 # Error reported by type checker + + There is no runtime checking of these properties.""") + +if sys.version_info >= (3, 11): + final = typing.final +else: + # @final exists in 3.8+, but we backport it for all versions + # before 3.11 to keep support for the __final__ attribute. + # See https://bugs.python.org/issue46342 + def final(f): + """This decorator can be used to indicate to type checkers that + the decorated method cannot be overridden, and decorated class + cannot be subclassed. For example: + + class Base: + @final + def done(self) -> None: + ... + class Sub(Base): + def done(self) -> None: # Error reported by type checker + ... + @final + class Leaf: + ... + class Other(Leaf): # Error reported by type checker + ... + + There is no runtime checking of these properties. The decorator + sets the ``__final__`` attribute to ``True`` on the decorated object + to allow runtime introspection. + """ + try: + f.__final__ = True + except (AttributeError, TypeError): + # Skip the attribute silently if it is not writable. + # AttributeError happens if the object has __slots__ or a + # read-only property, TypeError if it's a builtin class. + pass + return f + + +def IntVar(name): + return typing.TypeVar(name) + + +# 3.8+: +if hasattr(typing, 'Literal'): + Literal = typing.Literal +# 3.7: +else: + class _LiteralForm(typing._SpecialForm, _root=True): + + def __repr__(self): + return 'typing_extensions.' + self._name + + def __getitem__(self, parameters): + return typing._GenericAlias(self, parameters) + + Literal = _LiteralForm('Literal', + doc="""A type that can be used to indicate to type checkers + that the corresponding value has a value literally equivalent + to the provided parameter. For example: + + var: Literal[4] = 4 + + The type checker understands that 'var' is literally equal to + the value 4 and no other value. + + Literal[...] cannot be subclassed. There is no runtime + checking verifying that the parameter is actually a value + instead of a type.""") + + +_overload_dummy = typing._overload_dummy # noqa + + +if hasattr(typing, "get_overloads"): # 3.11+ + overload = typing.overload + get_overloads = typing.get_overloads + clear_overloads = typing.clear_overloads +else: + # {module: {qualname: {firstlineno: func}}} + _overload_registry = collections.defaultdict( + functools.partial(collections.defaultdict, dict) + ) + + def overload(func): + """Decorator for overloaded functions/methods. + + In a stub file, place two or more stub definitions for the same + function in a row, each decorated with @overload. For example: + + @overload + def utf8(value: None) -> None: ... + @overload + def utf8(value: bytes) -> bytes: ... + @overload + def utf8(value: str) -> bytes: ... + + In a non-stub file (i.e. a regular .py file), do the same but + follow it with an implementation. The implementation should *not* + be decorated with @overload. For example: + + @overload + def utf8(value: None) -> None: ... + @overload + def utf8(value: bytes) -> bytes: ... + @overload + def utf8(value: str) -> bytes: ... + def utf8(value): + # implementation goes here + + The overloads for a function can be retrieved at runtime using the + get_overloads() function. + """ + # classmethod and staticmethod + f = getattr(func, "__func__", func) + try: + _overload_registry[f.__module__][f.__qualname__][ + f.__code__.co_firstlineno + ] = func + except AttributeError: + # Not a normal function; ignore. + pass + return _overload_dummy + + def get_overloads(func): + """Return all defined overloads for *func* as a sequence.""" + # classmethod and staticmethod + f = getattr(func, "__func__", func) + if f.__module__ not in _overload_registry: + return [] + mod_dict = _overload_registry[f.__module__] + if f.__qualname__ not in mod_dict: + return [] + return list(mod_dict[f.__qualname__].values()) + + def clear_overloads(): + """Clear all overloads in the registry.""" + _overload_registry.clear() + + +# This is not a real generic class. Don't use outside annotations. +Type = typing.Type + +# Various ABCs mimicking those in collections.abc. +# A few are simply re-exported for completeness. + + +Awaitable = typing.Awaitable +Coroutine = typing.Coroutine +AsyncIterable = typing.AsyncIterable +AsyncIterator = typing.AsyncIterator +Deque = typing.Deque +ContextManager = typing.ContextManager +AsyncContextManager = typing.AsyncContextManager +DefaultDict = typing.DefaultDict + +# 3.7.2+ +if hasattr(typing, 'OrderedDict'): + OrderedDict = typing.OrderedDict +# 3.7.0-3.7.2 +else: + OrderedDict = typing._alias(collections.OrderedDict, (KT, VT)) + +Counter = typing.Counter +ChainMap = typing.ChainMap +AsyncGenerator = typing.AsyncGenerator +NewType = typing.NewType +Text = typing.Text +TYPE_CHECKING = typing.TYPE_CHECKING + + +_PROTO_WHITELIST = ['Callable', 'Awaitable', + 'Iterable', 'Iterator', 'AsyncIterable', 'AsyncIterator', + 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible', + 'ContextManager', 'AsyncContextManager'] + + +def _get_protocol_attrs(cls): + attrs = set() + for base in cls.__mro__[:-1]: # without object + if base.__name__ in ('Protocol', 'Generic'): + continue + annotations = getattr(base, '__annotations__', {}) + for attr in list(base.__dict__.keys()) + list(annotations.keys()): + if (not attr.startswith('_abc_') and attr not in ( + '__abstractmethods__', '__annotations__', '__weakref__', + '_is_protocol', '_is_runtime_protocol', '__dict__', + '__args__', '__slots__', + '__next_in_mro__', '__parameters__', '__origin__', + '__orig_bases__', '__extra__', '__tree_hash__', + '__doc__', '__subclasshook__', '__init__', '__new__', + '__module__', '_MutableMapping__marker', '_gorg')): + attrs.add(attr) + return attrs + + +def _is_callable_members_only(cls): + return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls)) + + +def _maybe_adjust_parameters(cls): + """Helper function used in Protocol.__init_subclass__ and _TypedDictMeta.__new__. + + The contents of this function are very similar + to logic found in typing.Generic.__init_subclass__ + on the CPython main branch. + """ + tvars = [] + if '__orig_bases__' in cls.__dict__: + tvars = typing._collect_type_vars(cls.__orig_bases__) + # Look for Generic[T1, ..., Tn] or Protocol[T1, ..., Tn]. + # If found, tvars must be a subset of it. + # If not found, tvars is it. + # Also check for and reject plain Generic, + # and reject multiple Generic[...] and/or Protocol[...]. + gvars = None + for base in cls.__orig_bases__: + if (isinstance(base, typing._GenericAlias) and + base.__origin__ in (typing.Generic, Protocol)): + # for error messages + the_base = base.__origin__.__name__ + if gvars is not None: + raise TypeError( + "Cannot inherit from Generic[...]" + " and/or Protocol[...] multiple types.") + gvars = base.__parameters__ + if gvars is None: + gvars = tvars + else: + tvarset = set(tvars) + gvarset = set(gvars) + if not tvarset <= gvarset: + s_vars = ', '.join(str(t) for t in tvars if t not in gvarset) + s_args = ', '.join(str(g) for g in gvars) + raise TypeError(f"Some type variables ({s_vars}) are" + f" not listed in {the_base}[{s_args}]") + tvars = gvars + cls.__parameters__ = tuple(tvars) + + +# 3.8+ +if hasattr(typing, 'Protocol'): + Protocol = typing.Protocol +# 3.7 +else: + + def _no_init(self, *args, **kwargs): + if type(self)._is_protocol: + raise TypeError('Protocols cannot be instantiated') + + class _ProtocolMeta(abc.ABCMeta): # noqa: B024 + # This metaclass is a bit unfortunate and exists only because of the lack + # of __instancehook__. + def __instancecheck__(cls, instance): + # We need this method for situations where attributes are + # assigned in __init__. + if ((not getattr(cls, '_is_protocol', False) or + _is_callable_members_only(cls)) and + issubclass(instance.__class__, cls)): + return True + if cls._is_protocol: + if all(hasattr(instance, attr) and + (not callable(getattr(cls, attr, None)) or + getattr(instance, attr) is not None) + for attr in _get_protocol_attrs(cls)): + return True + return super().__instancecheck__(instance) + + class Protocol(metaclass=_ProtocolMeta): + # There is quite a lot of overlapping code with typing.Generic. + # Unfortunately it is hard to avoid this while these live in two different + # modules. The duplicated code will be removed when Protocol is moved to typing. + """Base class for protocol classes. Protocol classes are defined as:: + + class Proto(Protocol): + def meth(self) -> int: + ... + + Such classes are primarily used with static type checkers that recognize + structural subtyping (static duck-typing), for example:: + + class C: + def meth(self) -> int: + return 0 + + def func(x: Proto) -> int: + return x.meth() + + func(C()) # Passes static type check + + See PEP 544 for details. Protocol classes decorated with + @typing_extensions.runtime act as simple-minded runtime protocol that checks + only the presence of given attributes, ignoring their type signatures. + + Protocol classes can be generic, they are defined as:: + + class GenProto(Protocol[T]): + def meth(self) -> T: + ... + """ + __slots__ = () + _is_protocol = True + + def __new__(cls, *args, **kwds): + if cls is Protocol: + raise TypeError("Type Protocol cannot be instantiated; " + "it can only be used as a base class") + return super().__new__(cls) + + @typing._tp_cache + def __class_getitem__(cls, params): + if not isinstance(params, tuple): + params = (params,) + if not params and cls is not typing.Tuple: + raise TypeError( + f"Parameter list to {cls.__qualname__}[...] cannot be empty") + msg = "Parameters to generic types must be types." + params = tuple(typing._type_check(p, msg) for p in params) # noqa + if cls is Protocol: + # Generic can only be subscripted with unique type variables. + if not all(isinstance(p, typing.TypeVar) for p in params): + i = 0 + while isinstance(params[i], typing.TypeVar): + i += 1 + raise TypeError( + "Parameters to Protocol[...] must all be type variables." + f" Parameter {i + 1} is {params[i]}") + if len(set(params)) != len(params): + raise TypeError( + "Parameters to Protocol[...] must all be unique") + else: + # Subscripting a regular Generic subclass. + _check_generic(cls, params, len(cls.__parameters__)) + return typing._GenericAlias(cls, params) + + def __init_subclass__(cls, *args, **kwargs): + if '__orig_bases__' in cls.__dict__: + error = typing.Generic in cls.__orig_bases__ + else: + error = typing.Generic in cls.__bases__ + if error: + raise TypeError("Cannot inherit from plain Generic") + _maybe_adjust_parameters(cls) + + # Determine if this is a protocol or a concrete subclass. + if not cls.__dict__.get('_is_protocol', None): + cls._is_protocol = any(b is Protocol for b in cls.__bases__) + + # Set (or override) the protocol subclass hook. + def _proto_hook(other): + if not cls.__dict__.get('_is_protocol', None): + return NotImplemented + if not getattr(cls, '_is_runtime_protocol', False): + if sys._getframe(2).f_globals['__name__'] in ['abc', 'functools']: + return NotImplemented + raise TypeError("Instance and class checks can only be used with" + " @runtime protocols") + if not _is_callable_members_only(cls): + if sys._getframe(2).f_globals['__name__'] in ['abc', 'functools']: + return NotImplemented + raise TypeError("Protocols with non-method members" + " don't support issubclass()") + if not isinstance(other, type): + # Same error as for issubclass(1, int) + raise TypeError('issubclass() arg 1 must be a class') + for attr in _get_protocol_attrs(cls): + for base in other.__mro__: + if attr in base.__dict__: + if base.__dict__[attr] is None: + return NotImplemented + break + annotations = getattr(base, '__annotations__', {}) + if (isinstance(annotations, typing.Mapping) and + attr in annotations and + isinstance(other, _ProtocolMeta) and + other._is_protocol): + break + else: + return NotImplemented + return True + if '__subclasshook__' not in cls.__dict__: + cls.__subclasshook__ = _proto_hook + + # We have nothing more to do for non-protocols. + if not cls._is_protocol: + return + + # Check consistency of bases. + for base in cls.__bases__: + if not (base in (object, typing.Generic) or + base.__module__ == 'collections.abc' and + base.__name__ in _PROTO_WHITELIST or + isinstance(base, _ProtocolMeta) and base._is_protocol): + raise TypeError('Protocols can only inherit from other' + f' protocols, got {repr(base)}') + cls.__init__ = _no_init + + +# 3.8+ +if hasattr(typing, 'runtime_checkable'): + runtime_checkable = typing.runtime_checkable +# 3.7 +else: + def runtime_checkable(cls): + """Mark a protocol class as a runtime protocol, so that it + can be used with isinstance() and issubclass(). Raise TypeError + if applied to a non-protocol class. + + This allows a simple-minded structural check very similar to the + one-offs in collections.abc such as Hashable. + """ + if not isinstance(cls, _ProtocolMeta) or not cls._is_protocol: + raise TypeError('@runtime_checkable can be only applied to protocol classes,' + f' got {cls!r}') + cls._is_runtime_protocol = True + return cls + + +# Exists for backwards compatibility. +runtime = runtime_checkable + + +# 3.8+ +if hasattr(typing, 'SupportsIndex'): + SupportsIndex = typing.SupportsIndex +# 3.7 +else: + @runtime_checkable + class SupportsIndex(Protocol): + __slots__ = () + + @abc.abstractmethod + def __index__(self) -> int: + pass + + +if hasattr(typing, "Required"): + # The standard library TypedDict in Python 3.8 does not store runtime information + # about which (if any) keys are optional. See https://bugs.python.org/issue38834 + # The standard library TypedDict in Python 3.9.0/1 does not honour the "total" + # keyword with old-style TypedDict(). See https://bugs.python.org/issue42059 + # The standard library TypedDict below Python 3.11 does not store runtime + # information about optional and required keys when using Required or NotRequired. + # Generic TypedDicts are also impossible using typing.TypedDict on Python <3.11. + TypedDict = typing.TypedDict + _TypedDictMeta = typing._TypedDictMeta + is_typeddict = typing.is_typeddict +else: + def _check_fails(cls, other): + try: + if sys._getframe(1).f_globals['__name__'] not in ['abc', + 'functools', + 'typing']: + # Typed dicts are only for static structural subtyping. + raise TypeError('TypedDict does not support instance and class checks') + except (AttributeError, ValueError): + pass + return False + + def _dict_new(*args, **kwargs): + if not args: + raise TypeError('TypedDict.__new__(): not enough arguments') + _, args = args[0], args[1:] # allow the "cls" keyword be passed + return dict(*args, **kwargs) + + _dict_new.__text_signature__ = '($cls, _typename, _fields=None, /, **kwargs)' + + def _typeddict_new(*args, total=True, **kwargs): + if not args: + raise TypeError('TypedDict.__new__(): not enough arguments') + _, args = args[0], args[1:] # allow the "cls" keyword be passed + if args: + typename, args = args[0], args[1:] # allow the "_typename" keyword be passed + elif '_typename' in kwargs: + typename = kwargs.pop('_typename') + import warnings + warnings.warn("Passing '_typename' as keyword argument is deprecated", + DeprecationWarning, stacklevel=2) + else: + raise TypeError("TypedDict.__new__() missing 1 required positional " + "argument: '_typename'") + if args: + try: + fields, = args # allow the "_fields" keyword be passed + except ValueError: + raise TypeError('TypedDict.__new__() takes from 2 to 3 ' + f'positional arguments but {len(args) + 2} ' + 'were given') + elif '_fields' in kwargs and len(kwargs) == 1: + fields = kwargs.pop('_fields') + import warnings + warnings.warn("Passing '_fields' as keyword argument is deprecated", + DeprecationWarning, stacklevel=2) + else: + fields = None + + if fields is None: + fields = kwargs + elif kwargs: + raise TypeError("TypedDict takes either a dict or keyword arguments," + " but not both") + + ns = {'__annotations__': dict(fields)} + try: + # Setting correct module is necessary to make typed dict classes pickleable. + ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + pass + + return _TypedDictMeta(typename, (), ns, total=total) + + _typeddict_new.__text_signature__ = ('($cls, _typename, _fields=None,' + ' /, *, total=True, **kwargs)') + + class _TypedDictMeta(type): + def __init__(cls, name, bases, ns, total=True): + super().__init__(name, bases, ns) + + def __new__(cls, name, bases, ns, total=True): + # Create new typed dict class object. + # This method is called directly when TypedDict is subclassed, + # or via _typeddict_new when TypedDict is instantiated. This way + # TypedDict supports all three syntaxes described in its docstring. + # Subclasses and instances of TypedDict return actual dictionaries + # via _dict_new. + ns['__new__'] = _typeddict_new if name == 'TypedDict' else _dict_new + # Don't insert typing.Generic into __bases__ here, + # or Generic.__init_subclass__ will raise TypeError + # in the super().__new__() call. + # Instead, monkey-patch __bases__ onto the class after it's been created. + tp_dict = super().__new__(cls, name, (dict,), ns) + + if any(issubclass(base, typing.Generic) for base in bases): + tp_dict.__bases__ = (typing.Generic, dict) + _maybe_adjust_parameters(tp_dict) + + annotations = {} + own_annotations = ns.get('__annotations__', {}) + msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" + own_annotations = { + n: typing._type_check(tp, msg) for n, tp in own_annotations.items() + } + required_keys = set() + optional_keys = set() + + for base in bases: + annotations.update(base.__dict__.get('__annotations__', {})) + required_keys.update(base.__dict__.get('__required_keys__', ())) + optional_keys.update(base.__dict__.get('__optional_keys__', ())) + + annotations.update(own_annotations) + for annotation_key, annotation_type in own_annotations.items(): + annotation_origin = get_origin(annotation_type) + if annotation_origin is Annotated: + annotation_args = get_args(annotation_type) + if annotation_args: + annotation_type = annotation_args[0] + annotation_origin = get_origin(annotation_type) + + if annotation_origin is Required: + required_keys.add(annotation_key) + elif annotation_origin is NotRequired: + optional_keys.add(annotation_key) + elif total: + required_keys.add(annotation_key) + else: + optional_keys.add(annotation_key) + + tp_dict.__annotations__ = annotations + tp_dict.__required_keys__ = frozenset(required_keys) + tp_dict.__optional_keys__ = frozenset(optional_keys) + if not hasattr(tp_dict, '__total__'): + tp_dict.__total__ = total + return tp_dict + + __instancecheck__ = __subclasscheck__ = _check_fails + + TypedDict = _TypedDictMeta('TypedDict', (dict,), {}) + TypedDict.__module__ = __name__ + TypedDict.__doc__ = \ + """A simple typed name space. At runtime it is equivalent to a plain dict. + + TypedDict creates a dictionary type that expects all of its + instances to have a certain set of keys, with each key + associated with a value of a consistent type. This expectation + is not checked at runtime but is only enforced by type checkers. + Usage:: + + class Point2D(TypedDict): + x: int + y: int + label: str + + a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK + b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check + + assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') + + The type info can be accessed via the Point2D.__annotations__ dict, and + the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets. + TypedDict supports two additional equivalent forms:: + + Point2D = TypedDict('Point2D', x=int, y=int, label=str) + Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) + + The class syntax is only supported in Python 3.6+, while two other + syntax forms work for Python 2.7 and 3.2+ + """ + + if hasattr(typing, "_TypedDictMeta"): + _TYPEDDICT_TYPES = (typing._TypedDictMeta, _TypedDictMeta) + else: + _TYPEDDICT_TYPES = (_TypedDictMeta,) + + def is_typeddict(tp): + """Check if an annotation is a TypedDict class + + For example:: + class Film(TypedDict): + title: str + year: int + + is_typeddict(Film) # => True + is_typeddict(Union[list, str]) # => False + """ + return isinstance(tp, tuple(_TYPEDDICT_TYPES)) + + +if hasattr(typing, "assert_type"): + assert_type = typing.assert_type + +else: + def assert_type(__val, __typ): + """Assert (to the type checker) that the value is of the given type. + + When the type checker encounters a call to assert_type(), it + emits an error if the value is not of the specified type:: + + def greet(name: str) -> None: + assert_type(name, str) # ok + assert_type(name, int) # type checker error + + At runtime this returns the first argument unchanged and otherwise + does nothing. + """ + return __val + + +if hasattr(typing, "Required"): + get_type_hints = typing.get_type_hints +else: + import functools + import types + + # replaces _strip_annotations() + def _strip_extras(t): + """Strips Annotated, Required and NotRequired from a given type.""" + if isinstance(t, _AnnotatedAlias): + return _strip_extras(t.__origin__) + if hasattr(t, "__origin__") and t.__origin__ in (Required, NotRequired): + return _strip_extras(t.__args__[0]) + if isinstance(t, typing._GenericAlias): + stripped_args = tuple(_strip_extras(a) for a in t.__args__) + if stripped_args == t.__args__: + return t + return t.copy_with(stripped_args) + if hasattr(types, "GenericAlias") and isinstance(t, types.GenericAlias): + stripped_args = tuple(_strip_extras(a) for a in t.__args__) + if stripped_args == t.__args__: + return t + return types.GenericAlias(t.__origin__, stripped_args) + if hasattr(types, "UnionType") and isinstance(t, types.UnionType): + stripped_args = tuple(_strip_extras(a) for a in t.__args__) + if stripped_args == t.__args__: + return t + return functools.reduce(operator.or_, stripped_args) + + return t + + def get_type_hints(obj, globalns=None, localns=None, include_extras=False): + """Return type hints for an object. + + This is often the same as obj.__annotations__, but it handles + forward references encoded as string literals, adds Optional[t] if a + default value equal to None is set and recursively replaces all + 'Annotated[T, ...]', 'Required[T]' or 'NotRequired[T]' with 'T' + (unless 'include_extras=True'). + + The argument may be a module, class, method, or function. The annotations + are returned as a dictionary. For classes, annotations include also + inherited members. + + TypeError is raised if the argument is not of a type that can contain + annotations, and an empty dictionary is returned if no annotations are + present. + + BEWARE -- the behavior of globalns and localns is counterintuitive + (unless you are familiar with how eval() and exec() work). The + search order is locals first, then globals. + + - If no dict arguments are passed, an attempt is made to use the + globals from obj (or the respective module's globals for classes), + and these are also used as the locals. If the object does not appear + to have globals, an empty dictionary is used. + + - If one dict argument is passed, it is used for both globals and + locals. + + - If two dict arguments are passed, they specify globals and + locals, respectively. + """ + if hasattr(typing, "Annotated"): + hint = typing.get_type_hints( + obj, globalns=globalns, localns=localns, include_extras=True + ) + else: + hint = typing.get_type_hints(obj, globalns=globalns, localns=localns) + if include_extras: + return hint + return {k: _strip_extras(t) for k, t in hint.items()} + + +# Python 3.9+ has PEP 593 (Annotated) +if hasattr(typing, 'Annotated'): + Annotated = typing.Annotated + # Not exported and not a public API, but needed for get_origin() and get_args() + # to work. + _AnnotatedAlias = typing._AnnotatedAlias +# 3.7-3.8 +else: + class _AnnotatedAlias(typing._GenericAlias, _root=True): + """Runtime representation of an annotated type. + + At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't' + with extra annotations. The alias behaves like a normal typing alias, + instantiating is the same as instantiating the underlying type, binding + it to types is also the same. + """ + def __init__(self, origin, metadata): + if isinstance(origin, _AnnotatedAlias): + metadata = origin.__metadata__ + metadata + origin = origin.__origin__ + super().__init__(origin, origin) + self.__metadata__ = metadata + + def copy_with(self, params): + assert len(params) == 1 + new_type = params[0] + return _AnnotatedAlias(new_type, self.__metadata__) + + def __repr__(self): + return (f"typing_extensions.Annotated[{typing._type_repr(self.__origin__)}, " + f"{', '.join(repr(a) for a in self.__metadata__)}]") + + def __reduce__(self): + return operator.getitem, ( + Annotated, (self.__origin__,) + self.__metadata__ + ) + + def __eq__(self, other): + if not isinstance(other, _AnnotatedAlias): + return NotImplemented + if self.__origin__ != other.__origin__: + return False + return self.__metadata__ == other.__metadata__ + + def __hash__(self): + return hash((self.__origin__, self.__metadata__)) + + class Annotated: + """Add context specific metadata to a type. + + Example: Annotated[int, runtime_check.Unsigned] indicates to the + hypothetical runtime_check module that this type is an unsigned int. + Every other consumer of this type can ignore this metadata and treat + this type as int. + + The first argument to Annotated must be a valid type (and will be in + the __origin__ field), the remaining arguments are kept as a tuple in + the __extra__ field. + + Details: + + - It's an error to call `Annotated` with less than two arguments. + - Nested Annotated are flattened:: + + Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3] + + - Instantiating an annotated type is equivalent to instantiating the + underlying type:: + + Annotated[C, Ann1](5) == C(5) + + - Annotated can be used as a generic type alias:: + + Optimized = Annotated[T, runtime.Optimize()] + Optimized[int] == Annotated[int, runtime.Optimize()] + + OptimizedList = Annotated[List[T], runtime.Optimize()] + OptimizedList[int] == Annotated[List[int], runtime.Optimize()] + """ + + __slots__ = () + + def __new__(cls, *args, **kwargs): + raise TypeError("Type Annotated cannot be instantiated.") + + @typing._tp_cache + def __class_getitem__(cls, params): + if not isinstance(params, tuple) or len(params) < 2: + raise TypeError("Annotated[...] should be used " + "with at least two arguments (a type and an " + "annotation).") + allowed_special_forms = (ClassVar, Final) + if get_origin(params[0]) in allowed_special_forms: + origin = params[0] + else: + msg = "Annotated[t, ...]: t must be a type." + origin = typing._type_check(params[0], msg) + metadata = tuple(params[1:]) + return _AnnotatedAlias(origin, metadata) + + def __init_subclass__(cls, *args, **kwargs): + raise TypeError( + f"Cannot subclass {cls.__module__}.Annotated" + ) + +# Python 3.8 has get_origin() and get_args() but those implementations aren't +# Annotated-aware, so we can't use those. Python 3.9's versions don't support +# ParamSpecArgs and ParamSpecKwargs, so only Python 3.10's versions will do. +if sys.version_info[:2] >= (3, 10): + get_origin = typing.get_origin + get_args = typing.get_args +# 3.7-3.9 +else: + try: + # 3.9+ + from typing import _BaseGenericAlias + except ImportError: + _BaseGenericAlias = typing._GenericAlias + try: + # 3.9+ + from typing import GenericAlias as _typing_GenericAlias + except ImportError: + _typing_GenericAlias = typing._GenericAlias + + def get_origin(tp): + """Get the unsubscripted version of a type. + + This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar + and Annotated. Return None for unsupported types. Examples:: + + get_origin(Literal[42]) is Literal + get_origin(int) is None + get_origin(ClassVar[int]) is ClassVar + get_origin(Generic) is Generic + get_origin(Generic[T]) is Generic + get_origin(Union[T, int]) is Union + get_origin(List[Tuple[T, T]][int]) == list + get_origin(P.args) is P + """ + if isinstance(tp, _AnnotatedAlias): + return Annotated + if isinstance(tp, (typing._GenericAlias, _typing_GenericAlias, _BaseGenericAlias, + ParamSpecArgs, ParamSpecKwargs)): + return tp.__origin__ + if tp is typing.Generic: + return typing.Generic + return None + + def get_args(tp): + """Get type arguments with all substitutions performed. + + For unions, basic simplifications used by Union constructor are performed. + Examples:: + get_args(Dict[str, int]) == (str, int) + get_args(int) == () + get_args(Union[int, Union[T, int], str][int]) == (int, str) + get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int]) + get_args(Callable[[], T][int]) == ([], int) + """ + if isinstance(tp, _AnnotatedAlias): + return (tp.__origin__,) + tp.__metadata__ + if isinstance(tp, (typing._GenericAlias, _typing_GenericAlias)): + if getattr(tp, "_special", False): + return () + res = tp.__args__ + if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis: + res = (list(res[:-1]), res[-1]) + return res + return () + + +# 3.10+ +if hasattr(typing, 'TypeAlias'): + TypeAlias = typing.TypeAlias +# 3.9 +elif sys.version_info[:2] >= (3, 9): + class _TypeAliasForm(typing._SpecialForm, _root=True): + def __repr__(self): + return 'typing_extensions.' + self._name + + @_TypeAliasForm + def TypeAlias(self, parameters): + """Special marker indicating that an assignment should + be recognized as a proper type alias definition by type + checkers. + + For example:: + + Predicate: TypeAlias = Callable[..., bool] + + It's invalid when used anywhere except as in the example above. + """ + raise TypeError(f"{self} is not subscriptable") +# 3.7-3.8 +else: + class _TypeAliasForm(typing._SpecialForm, _root=True): + def __repr__(self): + return 'typing_extensions.' + self._name + + TypeAlias = _TypeAliasForm('TypeAlias', + doc="""Special marker indicating that an assignment should + be recognized as a proper type alias definition by type + checkers. + + For example:: + + Predicate: TypeAlias = Callable[..., bool] + + It's invalid when used anywhere except as in the example + above.""") + + +class _DefaultMixin: + """Mixin for TypeVarLike defaults.""" + + __slots__ = () + + def __init__(self, default): + if isinstance(default, (tuple, list)): + self.__default__ = tuple((typing._type_check(d, "Default must be a type") + for d in default)) + elif default: + self.__default__ = typing._type_check(default, "Default must be a type") + else: + self.__default__ = None + + +# Add default and infer_variance parameters from PEP 696 and 695 +class TypeVar(typing.TypeVar, _DefaultMixin, _root=True): + """Type variable.""" + + __module__ = 'typing' + + def __init__(self, name, *constraints, bound=None, + covariant=False, contravariant=False, + default=None, infer_variance=False): + super().__init__(name, *constraints, bound=bound, covariant=covariant, + contravariant=contravariant) + _DefaultMixin.__init__(self, default) + self.__infer_variance__ = infer_variance + + # for pickling: + try: + def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + def_mod = None + if def_mod != 'typing_extensions': + self.__module__ = def_mod + + +# Python 3.10+ has PEP 612 +if hasattr(typing, 'ParamSpecArgs'): + ParamSpecArgs = typing.ParamSpecArgs + ParamSpecKwargs = typing.ParamSpecKwargs +# 3.7-3.9 +else: + class _Immutable: + """Mixin to indicate that object should not be copied.""" + __slots__ = () + + def __copy__(self): + return self + + def __deepcopy__(self, memo): + return self + + class ParamSpecArgs(_Immutable): + """The args for a ParamSpec object. + + Given a ParamSpec object P, P.args is an instance of ParamSpecArgs. + + ParamSpecArgs objects have a reference back to their ParamSpec: + + P.args.__origin__ is P + + This type is meant for runtime introspection and has no special meaning to + static type checkers. + """ + def __init__(self, origin): + self.__origin__ = origin + + def __repr__(self): + return f"{self.__origin__.__name__}.args" + + def __eq__(self, other): + if not isinstance(other, ParamSpecArgs): + return NotImplemented + return self.__origin__ == other.__origin__ + + class ParamSpecKwargs(_Immutable): + """The kwargs for a ParamSpec object. + + Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs. + + ParamSpecKwargs objects have a reference back to their ParamSpec: + + P.kwargs.__origin__ is P + + This type is meant for runtime introspection and has no special meaning to + static type checkers. + """ + def __init__(self, origin): + self.__origin__ = origin + + def __repr__(self): + return f"{self.__origin__.__name__}.kwargs" + + def __eq__(self, other): + if not isinstance(other, ParamSpecKwargs): + return NotImplemented + return self.__origin__ == other.__origin__ + +# 3.10+ +if hasattr(typing, 'ParamSpec'): + + # Add default Parameter - PEP 696 + class ParamSpec(typing.ParamSpec, _DefaultMixin, _root=True): + """Parameter specification variable.""" + + __module__ = 'typing' + + def __init__(self, name, *, bound=None, covariant=False, contravariant=False, + default=None): + super().__init__(name, bound=bound, covariant=covariant, + contravariant=contravariant) + _DefaultMixin.__init__(self, default) + + # for pickling: + try: + def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + def_mod = None + if def_mod != 'typing_extensions': + self.__module__ = def_mod + +# 3.7-3.9 +else: + + # Inherits from list as a workaround for Callable checks in Python < 3.9.2. + class ParamSpec(list, _DefaultMixin): + """Parameter specification variable. + + Usage:: + + P = ParamSpec('P') + + Parameter specification variables exist primarily for the benefit of static + type checkers. They are used to forward the parameter types of one + callable to another callable, a pattern commonly found in higher order + functions and decorators. They are only valid when used in ``Concatenate``, + or s the first argument to ``Callable``. In Python 3.10 and higher, + they are also supported in user-defined Generics at runtime. + See class Generic for more information on generic types. An + example for annotating a decorator:: + + T = TypeVar('T') + P = ParamSpec('P') + + def add_logging(f: Callable[P, T]) -> Callable[P, T]: + '''A type-safe decorator to add logging to a function.''' + def inner(*args: P.args, **kwargs: P.kwargs) -> T: + logging.info(f'{f.__name__} was called') + return f(*args, **kwargs) + return inner + + @add_logging + def add_two(x: float, y: float) -> float: + '''Add two numbers together.''' + return x + y + + Parameter specification variables defined with covariant=True or + contravariant=True can be used to declare covariant or contravariant + generic types. These keyword arguments are valid, but their actual semantics + are yet to be decided. See PEP 612 for details. + + Parameter specification variables can be introspected. e.g.: + + P.__name__ == 'T' + P.__bound__ == None + P.__covariant__ == False + P.__contravariant__ == False + + Note that only parameter specification variables defined in global scope can + be pickled. + """ + + # Trick Generic __parameters__. + __class__ = typing.TypeVar + + @property + def args(self): + return ParamSpecArgs(self) + + @property + def kwargs(self): + return ParamSpecKwargs(self) + + def __init__(self, name, *, bound=None, covariant=False, contravariant=False, + default=None): + super().__init__([self]) + self.__name__ = name + self.__covariant__ = bool(covariant) + self.__contravariant__ = bool(contravariant) + if bound: + self.__bound__ = typing._type_check(bound, 'Bound must be a type.') + else: + self.__bound__ = None + _DefaultMixin.__init__(self, default) + + # for pickling: + try: + def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + def_mod = None + if def_mod != 'typing_extensions': + self.__module__ = def_mod + + def __repr__(self): + if self.__covariant__: + prefix = '+' + elif self.__contravariant__: + prefix = '-' + else: + prefix = '~' + return prefix + self.__name__ + + def __hash__(self): + return object.__hash__(self) + + def __eq__(self, other): + return self is other + + def __reduce__(self): + return self.__name__ + + # Hack to get typing._type_check to pass. + def __call__(self, *args, **kwargs): + pass + + +# 3.7-3.9 +if not hasattr(typing, 'Concatenate'): + # Inherits from list as a workaround for Callable checks in Python < 3.9.2. + class _ConcatenateGenericAlias(list): + + # Trick Generic into looking into this for __parameters__. + __class__ = typing._GenericAlias + + # Flag in 3.8. + _special = False + + def __init__(self, origin, args): + super().__init__(args) + self.__origin__ = origin + self.__args__ = args + + def __repr__(self): + _type_repr = typing._type_repr + return (f'{_type_repr(self.__origin__)}' + f'[{", ".join(_type_repr(arg) for arg in self.__args__)}]') + + def __hash__(self): + return hash((self.__origin__, self.__args__)) + + # Hack to get typing._type_check to pass in Generic. + def __call__(self, *args, **kwargs): + pass + + @property + def __parameters__(self): + return tuple( + tp for tp in self.__args__ if isinstance(tp, (typing.TypeVar, ParamSpec)) + ) + + +# 3.7-3.9 +@typing._tp_cache +def _concatenate_getitem(self, parameters): + if parameters == (): + raise TypeError("Cannot take a Concatenate of no types.") + if not isinstance(parameters, tuple): + parameters = (parameters,) + if not isinstance(parameters[-1], ParamSpec): + raise TypeError("The last parameter to Concatenate should be a " + "ParamSpec variable.") + msg = "Concatenate[arg, ...]: each arg must be a type." + parameters = tuple(typing._type_check(p, msg) for p in parameters) + return _ConcatenateGenericAlias(self, parameters) + + +# 3.10+ +if hasattr(typing, 'Concatenate'): + Concatenate = typing.Concatenate + _ConcatenateGenericAlias = typing._ConcatenateGenericAlias # noqa +# 3.9 +elif sys.version_info[:2] >= (3, 9): + @_TypeAliasForm + def Concatenate(self, parameters): + """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a + higher order function which adds, removes or transforms parameters of a + callable. + + For example:: + + Callable[Concatenate[int, P], int] + + See PEP 612 for detailed information. + """ + return _concatenate_getitem(self, parameters) +# 3.7-8 +else: + class _ConcatenateForm(typing._SpecialForm, _root=True): + def __repr__(self): + return 'typing_extensions.' + self._name + + def __getitem__(self, parameters): + return _concatenate_getitem(self, parameters) + + Concatenate = _ConcatenateForm( + 'Concatenate', + doc="""Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a + higher order function which adds, removes or transforms parameters of a + callable. + + For example:: + + Callable[Concatenate[int, P], int] + + See PEP 612 for detailed information. + """) + +# 3.10+ +if hasattr(typing, 'TypeGuard'): + TypeGuard = typing.TypeGuard +# 3.9 +elif sys.version_info[:2] >= (3, 9): + class _TypeGuardForm(typing._SpecialForm, _root=True): + def __repr__(self): + return 'typing_extensions.' + self._name + + @_TypeGuardForm + def TypeGuard(self, parameters): + """Special typing form used to annotate the return type of a user-defined + type guard function. ``TypeGuard`` only accepts a single type argument. + At runtime, functions marked this way should return a boolean. + + ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static + type checkers to determine a more precise type of an expression within a + program's code flow. Usually type narrowing is done by analyzing + conditional code flow and applying the narrowing to a block of code. The + conditional expression here is sometimes referred to as a "type guard". + + Sometimes it would be convenient to use a user-defined boolean function + as a type guard. Such a function should use ``TypeGuard[...]`` as its + return type to alert static type checkers to this intention. + + Using ``-> TypeGuard`` tells the static type checker that for a given + function: + + 1. The return value is a boolean. + 2. If the return value is ``True``, the type of its argument + is the type inside ``TypeGuard``. + + For example:: + + def is_str(val: Union[str, float]): + # "isinstance" type guard + if isinstance(val, str): + # Type of ``val`` is narrowed to ``str`` + ... + else: + # Else, type of ``val`` is narrowed to ``float``. + ... + + Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower + form of ``TypeA`` (it can even be a wider form) and this may lead to + type-unsafe results. The main reason is to allow for things like + narrowing ``List[object]`` to ``List[str]`` even though the latter is not + a subtype of the former, since ``List`` is invariant. The responsibility of + writing type-safe type guards is left to the user. + + ``TypeGuard`` also works with type variables. For more information, see + PEP 647 (User-Defined Type Guards). + """ + item = typing._type_check(parameters, f'{self} accepts only a single type.') + return typing._GenericAlias(self, (item,)) +# 3.7-3.8 +else: + class _TypeGuardForm(typing._SpecialForm, _root=True): + + def __repr__(self): + return 'typing_extensions.' + self._name + + def __getitem__(self, parameters): + item = typing._type_check(parameters, + f'{self._name} accepts only a single type') + return typing._GenericAlias(self, (item,)) + + TypeGuard = _TypeGuardForm( + 'TypeGuard', + doc="""Special typing form used to annotate the return type of a user-defined + type guard function. ``TypeGuard`` only accepts a single type argument. + At runtime, functions marked this way should return a boolean. + + ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static + type checkers to determine a more precise type of an expression within a + program's code flow. Usually type narrowing is done by analyzing + conditional code flow and applying the narrowing to a block of code. The + conditional expression here is sometimes referred to as a "type guard". + + Sometimes it would be convenient to use a user-defined boolean function + as a type guard. Such a function should use ``TypeGuard[...]`` as its + return type to alert static type checkers to this intention. + + Using ``-> TypeGuard`` tells the static type checker that for a given + function: + + 1. The return value is a boolean. + 2. If the return value is ``True``, the type of its argument + is the type inside ``TypeGuard``. + + For example:: + + def is_str(val: Union[str, float]): + # "isinstance" type guard + if isinstance(val, str): + # Type of ``val`` is narrowed to ``str`` + ... + else: + # Else, type of ``val`` is narrowed to ``float``. + ... + + Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower + form of ``TypeA`` (it can even be a wider form) and this may lead to + type-unsafe results. The main reason is to allow for things like + narrowing ``List[object]`` to ``List[str]`` even though the latter is not + a subtype of the former, since ``List`` is invariant. The responsibility of + writing type-safe type guards is left to the user. + + ``TypeGuard`` also works with type variables. For more information, see + PEP 647 (User-Defined Type Guards). + """) + + +# Vendored from cpython typing._SpecialFrom +class _SpecialForm(typing._Final, _root=True): + __slots__ = ('_name', '__doc__', '_getitem') + + def __init__(self, getitem): + self._getitem = getitem + self._name = getitem.__name__ + self.__doc__ = getitem.__doc__ + + def __getattr__(self, item): + if item in {'__name__', '__qualname__'}: + return self._name + + raise AttributeError(item) + + def __mro_entries__(self, bases): + raise TypeError(f"Cannot subclass {self!r}") + + def __repr__(self): + return f'typing_extensions.{self._name}' + + def __reduce__(self): + return self._name + + def __call__(self, *args, **kwds): + raise TypeError(f"Cannot instantiate {self!r}") + + def __or__(self, other): + return typing.Union[self, other] + + def __ror__(self, other): + return typing.Union[other, self] + + def __instancecheck__(self, obj): + raise TypeError(f"{self} cannot be used with isinstance()") + + def __subclasscheck__(self, cls): + raise TypeError(f"{self} cannot be used with issubclass()") + + @typing._tp_cache + def __getitem__(self, parameters): + return self._getitem(self, parameters) + + +if hasattr(typing, "LiteralString"): + LiteralString = typing.LiteralString +else: + @_SpecialForm + def LiteralString(self, params): + """Represents an arbitrary literal string. + + Example:: + + from typing_extensions import LiteralString + + def query(sql: LiteralString) -> ...: + ... + + query("SELECT * FROM table") # ok + query(f"SELECT * FROM {input()}") # not ok + + See PEP 675 for details. + + """ + raise TypeError(f"{self} is not subscriptable") + + +if hasattr(typing, "Self"): + Self = typing.Self +else: + @_SpecialForm + def Self(self, params): + """Used to spell the type of "self" in classes. + + Example:: + + from typing import Self + + class ReturnsSelf: + def parse(self, data: bytes) -> Self: + ... + return self + + """ + + raise TypeError(f"{self} is not subscriptable") + + +if hasattr(typing, "Never"): + Never = typing.Never +else: + @_SpecialForm + def Never(self, params): + """The bottom type, a type that has no members. + + This can be used to define a function that should never be + called, or a function that never returns:: + + from typing_extensions import Never + + def never_call_me(arg: Never) -> None: + pass + + def int_or_str(arg: int | str) -> None: + never_call_me(arg) # type checker error + match arg: + case int(): + print("It's an int") + case str(): + print("It's a str") + case _: + never_call_me(arg) # ok, arg is of type Never + + """ + + raise TypeError(f"{self} is not subscriptable") + + +if hasattr(typing, 'Required'): + Required = typing.Required + NotRequired = typing.NotRequired +elif sys.version_info[:2] >= (3, 9): + class _ExtensionsSpecialForm(typing._SpecialForm, _root=True): + def __repr__(self): + return 'typing_extensions.' + self._name + + @_ExtensionsSpecialForm + def Required(self, parameters): + """A special typing construct to mark a key of a total=False TypedDict + as required. For example: + + class Movie(TypedDict, total=False): + title: Required[str] + year: int + + m = Movie( + title='The Matrix', # typechecker error if key is omitted + year=1999, + ) + + There is no runtime checking that a required key is actually provided + when instantiating a related TypedDict. + """ + item = typing._type_check(parameters, f'{self._name} accepts only a single type.') + return typing._GenericAlias(self, (item,)) + + @_ExtensionsSpecialForm + def NotRequired(self, parameters): + """A special typing construct to mark a key of a TypedDict as + potentially missing. For example: + + class Movie(TypedDict): + title: str + year: NotRequired[int] + + m = Movie( + title='The Matrix', # typechecker error if key is omitted + year=1999, + ) + """ + item = typing._type_check(parameters, f'{self._name} accepts only a single type.') + return typing._GenericAlias(self, (item,)) + +else: + class _RequiredForm(typing._SpecialForm, _root=True): + def __repr__(self): + return 'typing_extensions.' + self._name + + def __getitem__(self, parameters): + item = typing._type_check(parameters, + f'{self._name} accepts only a single type.') + return typing._GenericAlias(self, (item,)) + + Required = _RequiredForm( + 'Required', + doc="""A special typing construct to mark a key of a total=False TypedDict + as required. For example: + + class Movie(TypedDict, total=False): + title: Required[str] + year: int + + m = Movie( + title='The Matrix', # typechecker error if key is omitted + year=1999, + ) + + There is no runtime checking that a required key is actually provided + when instantiating a related TypedDict. + """) + NotRequired = _RequiredForm( + 'NotRequired', + doc="""A special typing construct to mark a key of a TypedDict as + potentially missing. For example: + + class Movie(TypedDict): + title: str + year: NotRequired[int] + + m = Movie( + title='The Matrix', # typechecker error if key is omitted + year=1999, + ) + """) + + +if hasattr(typing, "Unpack"): # 3.11+ + Unpack = typing.Unpack +elif sys.version_info[:2] >= (3, 9): + class _UnpackSpecialForm(typing._SpecialForm, _root=True): + def __repr__(self): + return 'typing_extensions.' + self._name + + class _UnpackAlias(typing._GenericAlias, _root=True): + __class__ = typing.TypeVar + + @_UnpackSpecialForm + def Unpack(self, parameters): + """A special typing construct to unpack a variadic type. For example: + + Shape = TypeVarTuple('Shape') + Batch = NewType('Batch', int) + + def add_batch_axis( + x: Array[Unpack[Shape]] + ) -> Array[Batch, Unpack[Shape]]: ... + + """ + item = typing._type_check(parameters, f'{self._name} accepts only a single type.') + return _UnpackAlias(self, (item,)) + + def _is_unpack(obj): + return isinstance(obj, _UnpackAlias) + +else: + class _UnpackAlias(typing._GenericAlias, _root=True): + __class__ = typing.TypeVar + + class _UnpackForm(typing._SpecialForm, _root=True): + def __repr__(self): + return 'typing_extensions.' + self._name + + def __getitem__(self, parameters): + item = typing._type_check(parameters, + f'{self._name} accepts only a single type.') + return _UnpackAlias(self, (item,)) + + Unpack = _UnpackForm( + 'Unpack', + doc="""A special typing construct to unpack a variadic type. For example: + + Shape = TypeVarTuple('Shape') + Batch = NewType('Batch', int) + + def add_batch_axis( + x: Array[Unpack[Shape]] + ) -> Array[Batch, Unpack[Shape]]: ... + + """) + + def _is_unpack(obj): + return isinstance(obj, _UnpackAlias) + + +if hasattr(typing, "TypeVarTuple"): # 3.11+ + + # Add default Parameter - PEP 696 + class TypeVarTuple(typing.TypeVarTuple, _DefaultMixin, _root=True): + """Type variable tuple.""" + + def __init__(self, name, *, default=None): + super().__init__(name) + _DefaultMixin.__init__(self, default) + + # for pickling: + try: + def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + def_mod = None + if def_mod != 'typing_extensions': + self.__module__ = def_mod + +else: + class TypeVarTuple(_DefaultMixin): + """Type variable tuple. + + Usage:: + + Ts = TypeVarTuple('Ts') + + In the same way that a normal type variable is a stand-in for a single + type such as ``int``, a type variable *tuple* is a stand-in for a *tuple* + type such as ``Tuple[int, str]``. + + Type variable tuples can be used in ``Generic`` declarations. + Consider the following example:: + + class Array(Generic[*Ts]): ... + + The ``Ts`` type variable tuple here behaves like ``tuple[T1, T2]``, + where ``T1`` and ``T2`` are type variables. To use these type variables + as type parameters of ``Array``, we must *unpack* the type variable tuple using + the star operator: ``*Ts``. The signature of ``Array`` then behaves + as if we had simply written ``class Array(Generic[T1, T2]): ...``. + In contrast to ``Generic[T1, T2]``, however, ``Generic[*Shape]`` allows + us to parameterise the class with an *arbitrary* number of type parameters. + + Type variable tuples can be used anywhere a normal ``TypeVar`` can. + This includes class definitions, as shown above, as well as function + signatures and variable annotations:: + + class Array(Generic[*Ts]): + + def __init__(self, shape: Tuple[*Ts]): + self._shape: Tuple[*Ts] = shape + + def get_shape(self) -> Tuple[*Ts]: + return self._shape + + shape = (Height(480), Width(640)) + x: Array[Height, Width] = Array(shape) + y = abs(x) # Inferred type is Array[Height, Width] + z = x + x # ... is Array[Height, Width] + x.get_shape() # ... is tuple[Height, Width] + + """ + + # Trick Generic __parameters__. + __class__ = typing.TypeVar + + def __iter__(self): + yield self.__unpacked__ + + def __init__(self, name, *, default=None): + self.__name__ = name + _DefaultMixin.__init__(self, default) + + # for pickling: + try: + def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + def_mod = None + if def_mod != 'typing_extensions': + self.__module__ = def_mod + + self.__unpacked__ = Unpack[self] + + def __repr__(self): + return self.__name__ + + def __hash__(self): + return object.__hash__(self) + + def __eq__(self, other): + return self is other + + def __reduce__(self): + return self.__name__ + + def __init_subclass__(self, *args, **kwds): + if '_root' not in kwds: + raise TypeError("Cannot subclass special typing classes") + + +if hasattr(typing, "reveal_type"): + reveal_type = typing.reveal_type +else: + def reveal_type(__obj: T) -> T: + """Reveal the inferred type of a variable. + + When a static type checker encounters a call to ``reveal_type()``, + it will emit the inferred type of the argument:: + + x: int = 1 + reveal_type(x) + + Running a static type checker (e.g., ``mypy``) on this example + will produce output similar to 'Revealed type is "builtins.int"'. + + At runtime, the function prints the runtime type of the + argument and returns it unchanged. + + """ + print(f"Runtime type is {type(__obj).__name__!r}", file=sys.stderr) + return __obj + + +if hasattr(typing, "assert_never"): + assert_never = typing.assert_never +else: + def assert_never(__arg: Never) -> Never: + """Assert to the type checker that a line of code is unreachable. + + Example:: + + def int_or_str(arg: int | str) -> None: + match arg: + case int(): + print("It's an int") + case str(): + print("It's a str") + case _: + assert_never(arg) + + If a type checker finds that a call to assert_never() is + reachable, it will emit an error. + + At runtime, this throws an exception when called. + + """ + raise AssertionError("Expected code to be unreachable") + + +if hasattr(typing, 'dataclass_transform'): + dataclass_transform = typing.dataclass_transform +else: + def dataclass_transform( + *, + eq_default: bool = True, + order_default: bool = False, + kw_only_default: bool = False, + field_specifiers: typing.Tuple[ + typing.Union[typing.Type[typing.Any], typing.Callable[..., typing.Any]], + ... + ] = (), + **kwargs: typing.Any, + ) -> typing.Callable[[T], T]: + """Decorator that marks a function, class, or metaclass as providing + dataclass-like behavior. + + Example: + + from typing_extensions import dataclass_transform + + _T = TypeVar("_T") + + # Used on a decorator function + @dataclass_transform() + def create_model(cls: type[_T]) -> type[_T]: + ... + return cls + + @create_model + class CustomerModel: + id: int + name: str + + # Used on a base class + @dataclass_transform() + class ModelBase: ... + + class CustomerModel(ModelBase): + id: int + name: str + + # Used on a metaclass + @dataclass_transform() + class ModelMeta(type): ... + + class ModelBase(metaclass=ModelMeta): ... + + class CustomerModel(ModelBase): + id: int + name: str + + Each of the ``CustomerModel`` classes defined in this example will now + behave similarly to a dataclass created with the ``@dataclasses.dataclass`` + decorator. For example, the type checker will synthesize an ``__init__`` + method. + + The arguments to this decorator can be used to customize this behavior: + - ``eq_default`` indicates whether the ``eq`` parameter is assumed to be + True or False if it is omitted by the caller. + - ``order_default`` indicates whether the ``order`` parameter is + assumed to be True or False if it is omitted by the caller. + - ``kw_only_default`` indicates whether the ``kw_only`` parameter is + assumed to be True or False if it is omitted by the caller. + - ``field_specifiers`` specifies a static list of supported classes + or functions that describe fields, similar to ``dataclasses.field()``. + + At runtime, this decorator records its arguments in the + ``__dataclass_transform__`` attribute on the decorated object. + + See PEP 681 for details. + + """ + def decorator(cls_or_fn): + cls_or_fn.__dataclass_transform__ = { + "eq_default": eq_default, + "order_default": order_default, + "kw_only_default": kw_only_default, + "field_specifiers": field_specifiers, + "kwargs": kwargs, + } + return cls_or_fn + return decorator + + +if hasattr(typing, "override"): + override = typing.override +else: + _F = typing.TypeVar("_F", bound=typing.Callable[..., typing.Any]) + + def override(__arg: _F) -> _F: + """Indicate that a method is intended to override a method in a base class. + + Usage: + + class Base: + def method(self) -> None: ... + pass + + class Child(Base): + @override + def method(self) -> None: + super().method() + + When this decorator is applied to a method, the type checker will + validate that it overrides a method with the same name on a base class. + This helps prevent bugs that may occur when a base class is changed + without an equivalent change to a child class. + + See PEP 698 for details. + + """ + return __arg + + +# We have to do some monkey patching to deal with the dual nature of +# Unpack/TypeVarTuple: +# - We want Unpack to be a kind of TypeVar so it gets accepted in +# Generic[Unpack[Ts]] +# - We want it to *not* be treated as a TypeVar for the purposes of +# counting generic parameters, so that when we subscript a generic, +# the runtime doesn't try to substitute the Unpack with the subscripted type. +if not hasattr(typing, "TypeVarTuple"): + typing._collect_type_vars = _collect_type_vars + typing._check_generic = _check_generic + + +# Backport typing.NamedTuple as it exists in Python 3.11. +# In 3.11, the ability to define generic `NamedTuple`s was supported. +# This was explicitly disallowed in 3.9-3.10, and only half-worked in <=3.8. +if sys.version_info >= (3, 11): + NamedTuple = typing.NamedTuple +else: + def _caller(): + try: + return sys._getframe(2).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): # For platforms without _getframe() + return None + + def _make_nmtuple(name, types, module, defaults=()): + fields = [n for n, t in types] + annotations = {n: typing._type_check(t, f"field {n} annotation must be a type") + for n, t in types} + nm_tpl = collections.namedtuple(name, fields, + defaults=defaults, module=module) + nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = annotations + # The `_field_types` attribute was removed in 3.9; + # in earlier versions, it is the same as the `__annotations__` attribute + if sys.version_info < (3, 9): + nm_tpl._field_types = annotations + return nm_tpl + + _prohibited_namedtuple_fields = typing._prohibited + _special_namedtuple_fields = frozenset({'__module__', '__name__', '__annotations__'}) + + class _NamedTupleMeta(type): + def __new__(cls, typename, bases, ns): + assert _NamedTuple in bases + for base in bases: + if base is not _NamedTuple and base is not typing.Generic: + raise TypeError( + 'can only inherit from a NamedTuple type and Generic') + bases = tuple(tuple if base is _NamedTuple else base for base in bases) + types = ns.get('__annotations__', {}) + default_names = [] + for field_name in types: + if field_name in ns: + default_names.append(field_name) + elif default_names: + raise TypeError(f"Non-default namedtuple field {field_name} " + f"cannot follow default field" + f"{'s' if len(default_names) > 1 else ''} " + f"{', '.join(default_names)}") + nm_tpl = _make_nmtuple( + typename, types.items(), + defaults=[ns[n] for n in default_names], + module=ns['__module__'] + ) + nm_tpl.__bases__ = bases + if typing.Generic in bases: + class_getitem = typing.Generic.__class_getitem__.__func__ + nm_tpl.__class_getitem__ = classmethod(class_getitem) + # update from user namespace without overriding special namedtuple attributes + for key in ns: + if key in _prohibited_namedtuple_fields: + raise AttributeError("Cannot overwrite NamedTuple attribute " + key) + elif key not in _special_namedtuple_fields and key not in nm_tpl._fields: + setattr(nm_tpl, key, ns[key]) + if typing.Generic in bases: + nm_tpl.__init_subclass__() + return nm_tpl + + def NamedTuple(__typename, __fields=None, **kwargs): + if __fields is None: + __fields = kwargs.items() + elif kwargs: + raise TypeError("Either list of fields or keywords" + " can be provided to NamedTuple, not both") + return _make_nmtuple(__typename, __fields, module=_caller()) + + NamedTuple.__doc__ = typing.NamedTuple.__doc__ + _NamedTuple = type.__new__(_NamedTupleMeta, 'NamedTuple', (), {}) + + # On 3.8+, alter the signature so that it matches typing.NamedTuple. + # The signature of typing.NamedTuple on >=3.8 is invalid syntax in Python 3.7, + # so just leave the signature as it is on 3.7. + if sys.version_info >= (3, 8): + NamedTuple.__text_signature__ = '(typename, fields=None, /, **kwargs)' + + def _namedtuple_mro_entries(bases): + assert NamedTuple in bases + return (_NamedTuple,) + + NamedTuple.__mro_entries__ = _namedtuple_mro_entries diff --git a/libs/win/zipp/__init__.py b/libs/win/zipp/__init__.py new file mode 100644 index 00000000..ad01e27e --- /dev/null +++ b/libs/win/zipp/__init__.py @@ -0,0 +1,381 @@ +import io +import posixpath +import zipfile +import itertools +import contextlib +import pathlib +import re +import fnmatch + +from .py310compat import text_encoding + + +__all__ = ['Path'] + + +def _parents(path): + """ + Given a path with elements separated by + posixpath.sep, generate all parents of that path. + + >>> list(_parents('b/d')) + ['b'] + >>> list(_parents('/b/d/')) + ['/b'] + >>> list(_parents('b/d/f/')) + ['b/d', 'b'] + >>> list(_parents('b')) + [] + >>> list(_parents('')) + [] + """ + return itertools.islice(_ancestry(path), 1, None) + + +def _ancestry(path): + """ + Given a path with elements separated by + posixpath.sep, generate all elements of that path + + >>> list(_ancestry('b/d')) + ['b/d', 'b'] + >>> list(_ancestry('/b/d/')) + ['/b/d', '/b'] + >>> list(_ancestry('b/d/f/')) + ['b/d/f', 'b/d', 'b'] + >>> list(_ancestry('b')) + ['b'] + >>> list(_ancestry('')) + [] + """ + path = path.rstrip(posixpath.sep) + while path and path != posixpath.sep: + yield path + path, tail = posixpath.split(path) + + +_dedupe = dict.fromkeys +"""Deduplicate an iterable in original order""" + + +def _difference(minuend, subtrahend): + """ + Return items in minuend not in subtrahend, retaining order + with O(1) lookup. + """ + return itertools.filterfalse(set(subtrahend).__contains__, minuend) + + +class InitializedState: + """ + Mix-in to save the initialization state for pickling. + """ + + def __init__(self, *args, **kwargs): + self.__args = args + self.__kwargs = kwargs + super().__init__(*args, **kwargs) + + def __getstate__(self): + return self.__args, self.__kwargs + + def __setstate__(self, state): + args, kwargs = state + super().__init__(*args, **kwargs) + + +class CompleteDirs(InitializedState, zipfile.ZipFile): + """ + A ZipFile subclass that ensures that implied directories + are always included in the namelist. + """ + + @staticmethod + def _implied_dirs(names): + parents = itertools.chain.from_iterable(map(_parents, names)) + as_dirs = (p + posixpath.sep for p in parents) + return _dedupe(_difference(as_dirs, names)) + + def namelist(self): + names = super(CompleteDirs, self).namelist() + return names + list(self._implied_dirs(names)) + + def _name_set(self): + return set(self.namelist()) + + def resolve_dir(self, name): + """ + If the name represents a directory, return that name + as a directory (with the trailing slash). + """ + names = self._name_set() + dirname = name + '/' + dir_match = name not in names and dirname in names + return dirname if dir_match else name + + @classmethod + def make(cls, source): + """ + Given a source (filename or zipfile), return an + appropriate CompleteDirs subclass. + """ + if isinstance(source, CompleteDirs): + return source + + if not isinstance(source, zipfile.ZipFile): + return cls(source) + + # Only allow for FastLookup when supplied zipfile is read-only + if 'r' not in source.mode: + cls = CompleteDirs + + source.__class__ = cls + return source + + +class FastLookup(CompleteDirs): + """ + ZipFile subclass to ensure implicit + dirs exist and are resolved rapidly. + """ + + def namelist(self): + with contextlib.suppress(AttributeError): + return self.__names + self.__names = super(FastLookup, self).namelist() + return self.__names + + def _name_set(self): + with contextlib.suppress(AttributeError): + return self.__lookup + self.__lookup = super(FastLookup, self)._name_set() + return self.__lookup + + +class Path: + """ + A pathlib-compatible interface for zip files. + + Consider a zip file with this structure:: + + . + ├── a.txt + └── b + ├── c.txt + └── d + └── e.txt + + >>> data = io.BytesIO() + >>> zf = zipfile.ZipFile(data, 'w') + >>> zf.writestr('a.txt', 'content of a') + >>> zf.writestr('b/c.txt', 'content of c') + >>> zf.writestr('b/d/e.txt', 'content of e') + >>> zf.filename = 'mem/abcde.zip' + + Path accepts the zipfile object itself or a filename + + >>> root = Path(zf) + + From there, several path operations are available. + + Directory iteration (including the zip file itself): + + >>> a, b = root.iterdir() + >>> a + Path('mem/abcde.zip', 'a.txt') + >>> b + Path('mem/abcde.zip', 'b/') + + name property: + + >>> b.name + 'b' + + join with divide operator: + + >>> c = b / 'c.txt' + >>> c + Path('mem/abcde.zip', 'b/c.txt') + >>> c.name + 'c.txt' + + Read text: + + >>> c.read_text() + 'content of c' + + existence: + + >>> c.exists() + True + >>> (b / 'missing.txt').exists() + False + + Coercion to string: + + >>> import os + >>> str(c).replace(os.sep, posixpath.sep) + 'mem/abcde.zip/b/c.txt' + + At the root, ``name``, ``filename``, and ``parent`` + resolve to the zipfile. Note these attributes are not + valid and will raise a ``ValueError`` if the zipfile + has no filename. + + >>> root.name + 'abcde.zip' + >>> str(root.filename).replace(os.sep, posixpath.sep) + 'mem/abcde.zip' + >>> str(root.parent) + 'mem' + """ + + __repr = "{self.__class__.__name__}({self.root.filename!r}, {self.at!r})" + + def __init__(self, root, at=""): + """ + Construct a Path from a ZipFile or filename. + + Note: When the source is an existing ZipFile object, + its type (__class__) will be mutated to a + specialized type. If the caller wishes to retain the + original type, the caller should either create a + separate ZipFile object or pass a filename. + """ + self.root = FastLookup.make(root) + self.at = at + + def __eq__(self, other): + """ + >>> Path(zipfile.ZipFile(io.BytesIO(), 'w')) == 'foo' + False + """ + if self.__class__ is not other.__class__: + return NotImplemented + return (self.root, self.at) == (other.root, other.at) + + def __hash__(self): + return hash((self.root, self.at)) + + def open(self, mode='r', *args, pwd=None, **kwargs): + """ + Open this entry as text or binary following the semantics + of ``pathlib.Path.open()`` by passing arguments through + to io.TextIOWrapper(). + """ + if self.is_dir(): + raise IsADirectoryError(self) + zip_mode = mode[0] + if not self.exists() and zip_mode == 'r': + raise FileNotFoundError(self) + stream = self.root.open(self.at, zip_mode, pwd=pwd) + if 'b' in mode: + if args or kwargs: + raise ValueError("encoding args invalid for binary operation") + return stream + else: + kwargs["encoding"] = text_encoding(kwargs.get("encoding")) + return io.TextIOWrapper(stream, *args, **kwargs) + + @property + def name(self): + return pathlib.Path(self.at).name or self.filename.name + + @property + def suffix(self): + return pathlib.Path(self.at).suffix or self.filename.suffix + + @property + def suffixes(self): + return pathlib.Path(self.at).suffixes or self.filename.suffixes + + @property + def stem(self): + return pathlib.Path(self.at).stem or self.filename.stem + + @property + def filename(self): + return pathlib.Path(self.root.filename).joinpath(self.at) + + def read_text(self, *args, **kwargs): + kwargs["encoding"] = text_encoding(kwargs.get("encoding")) + with self.open('r', *args, **kwargs) as strm: + return strm.read() + + def read_bytes(self): + with self.open('rb') as strm: + return strm.read() + + def _is_child(self, path): + return posixpath.dirname(path.at.rstrip("/")) == self.at.rstrip("/") + + def _next(self, at): + return self.__class__(self.root, at) + + def is_dir(self): + return not self.at or self.at.endswith("/") + + def is_file(self): + return self.exists() and not self.is_dir() + + def exists(self): + return self.at in self.root._name_set() + + def iterdir(self): + if not self.is_dir(): + raise ValueError("Can't listdir a file") + subs = map(self._next, self.root.namelist()) + return filter(self._is_child, subs) + + def match(self, path_pattern): + return pathlib.Path(self.at).match(path_pattern) + + def is_symlink(self): + """ + Return whether this path is a symlink. Always false (python/cpython#82102). + """ + return False + + def _descendants(self): + for child in self.iterdir(): + yield child + if child.is_dir(): + yield from child._descendants() + + def glob(self, pattern): + if not pattern: + raise ValueError("Unacceptable pattern: {!r}".format(pattern)) + + matches = re.compile(fnmatch.translate(pattern)).fullmatch + return ( + child + for child in self._descendants() + if matches(str(child.relative_to(self))) + ) + + def rglob(self, pattern): + return self.glob(f'**/{pattern}') + + def relative_to(self, other, *extra): + return posixpath.relpath(str(self), str(other.joinpath(*extra))) + + def __str__(self): + return posixpath.join(self.root.filename, self.at) + + def __repr__(self): + return self.__repr.format(self=self) + + def joinpath(self, *other): + next = posixpath.join(self.at, *other) + return self._next(self.root.resolve_dir(next)) + + __truediv__ = joinpath + + @property + def parent(self): + if not self.at: + return self.filename.parent + parent_at = posixpath.dirname(self.at.rstrip('/')) + if parent_at: + parent_at += '/' + return self._next(parent_at) diff --git a/libs/win/zipp/py310compat.py b/libs/win/zipp/py310compat.py new file mode 100644 index 00000000..8244124c --- /dev/null +++ b/libs/win/zipp/py310compat.py @@ -0,0 +1,12 @@ +import sys +import io + + +te_impl = 'lambda encoding, stacklevel=2, /: encoding' +te_impl_37 = te_impl.replace(', /', '') +_text_encoding = eval(te_impl) if sys.version_info > (3, 8) else eval(te_impl_37) + + +text_encoding = ( + io.text_encoding if sys.version_info > (3, 10) else _text_encoding # type: ignore +)

    +WdEKc7pJA5c?-2Fn62X`RyGH?pc)`iqA- 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 literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/types.py b/libs/win/pydantic/types.py new file mode 100644 index 00000000..f98dba3d --- /dev/null +++ b/libs/win/pydantic/types.py @@ -0,0 +1,1187 @@ +import abc +import math +import re +import warnings +from datetime import date +from decimal import Decimal +from enum import Enum +from pathlib import Path +from types import new_class +from typing import ( + TYPE_CHECKING, + Any, + Callable, + ClassVar, + Dict, + FrozenSet, + List, + Optional, + Pattern, + Set, + Tuple, + Type, + TypeVar, + Union, + cast, + overload, +) +from uuid import UUID +from weakref import WeakSet + +from . import errors +from .datetime_parse import parse_date +from .utils import import_string, update_not_none +from .validators import ( + bytes_validator, + constr_length_validator, + constr_lower, + constr_strip_whitespace, + constr_upper, + decimal_validator, + float_finite_validator, + float_validator, + frozenset_validator, + int_validator, + list_validator, + number_multiple_validator, + number_size_validator, + path_exists_validator, + path_validator, + set_validator, + str_validator, + strict_bytes_validator, + strict_float_validator, + strict_int_validator, + strict_str_validator, +) + +__all__ = [ + 'NoneStr', + 'NoneBytes', + 'StrBytes', + 'NoneStrBytes', + 'StrictStr', + 'ConstrainedBytes', + 'conbytes', + 'ConstrainedList', + 'conlist', + 'ConstrainedSet', + 'conset', + 'ConstrainedFrozenSet', + 'confrozenset', + 'ConstrainedStr', + 'constr', + 'PyObject', + 'ConstrainedInt', + 'conint', + 'PositiveInt', + 'NegativeInt', + 'NonNegativeInt', + 'NonPositiveInt', + 'ConstrainedFloat', + 'confloat', + 'PositiveFloat', + 'NegativeFloat', + 'NonNegativeFloat', + 'NonPositiveFloat', + 'FiniteFloat', + 'ConstrainedDecimal', + 'condecimal', + 'UUID1', + 'UUID3', + 'UUID4', + 'UUID5', + 'FilePath', + 'DirectoryPath', + 'Json', + 'JsonWrapper', + 'SecretField', + 'SecretStr', + 'SecretBytes', + 'StrictBool', + 'StrictBytes', + 'StrictInt', + 'StrictFloat', + 'PaymentCardNumber', + 'ByteSize', + 'PastDate', + 'FutureDate', + 'ConstrainedDate', + 'condate', +] + +NoneStr = Optional[str] +NoneBytes = Optional[bytes] +StrBytes = Union[str, bytes] +NoneStrBytes = Optional[StrBytes] +OptionalInt = Optional[int] +OptionalIntFloat = Union[OptionalInt, float] +OptionalIntFloatDecimal = Union[OptionalIntFloat, Decimal] +OptionalDate = Optional[date] +StrIntFloat = Union[str, int, float] + +if TYPE_CHECKING: + from typing_extensions import Annotated + + from .dataclasses import Dataclass + from .main import BaseModel + from .typing import CallableGenerator + + ModelOrDc = Type[Union[BaseModel, Dataclass]] + +T = TypeVar('T') +_DEFINED_TYPES: 'WeakSet[type]' = WeakSet() + + +@overload +def _registered(typ: Type[T]) -> Type[T]: + pass + + +@overload +def _registered(typ: 'ConstrainedNumberMeta') -> 'ConstrainedNumberMeta': + pass + + +def _registered(typ: Union[Type[T], 'ConstrainedNumberMeta']) -> Union[Type[T], 'ConstrainedNumberMeta']: + # In order to generate valid examples of constrained types, Hypothesis needs + # to inspect the type object - so we keep a weakref to each contype object + # until it can be registered. When (or if) our Hypothesis plugin is loaded, + # it monkeypatches this function. + # If Hypothesis is never used, the total effect is to keep a weak reference + # which has minimal memory usage and doesn't even affect garbage collection. + _DEFINED_TYPES.add(typ) + return typ + + +class ConstrainedNumberMeta(type): + def __new__(cls, name: str, bases: Any, dct: Dict[str, Any]) -> 'ConstrainedInt': # type: ignore + new_cls = cast('ConstrainedInt', type.__new__(cls, name, bases, dct)) + + if new_cls.gt is not None and new_cls.ge is not None: + raise errors.ConfigError('bounds gt and ge cannot be specified at the same time') + if new_cls.lt is not None and new_cls.le is not None: + raise errors.ConfigError('bounds lt and le cannot be specified at the same time') + + return _registered(new_cls) # type: ignore + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BOOLEAN TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +if TYPE_CHECKING: + StrictBool = bool +else: + + class StrictBool(int): + """ + StrictBool to allow for bools which are not type-coerced. + """ + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + field_schema.update(type='boolean') + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls.validate + + @classmethod + def validate(cls, value: Any) -> bool: + """ + Ensure that we only allow bools. + """ + if isinstance(value, bool): + return value + + raise errors.StrictBoolError() + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTEGER TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +class ConstrainedInt(int, metaclass=ConstrainedNumberMeta): + strict: bool = False + gt: OptionalInt = None + ge: OptionalInt = None + lt: OptionalInt = None + le: OptionalInt = None + multiple_of: OptionalInt = None + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + update_not_none( + field_schema, + exclusiveMinimum=cls.gt, + exclusiveMaximum=cls.lt, + minimum=cls.ge, + maximum=cls.le, + multipleOf=cls.multiple_of, + ) + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield strict_int_validator if cls.strict else int_validator + yield number_size_validator + yield number_multiple_validator + + +def conint( + *, strict: bool = False, gt: int = None, ge: int = None, lt: int = None, le: int = None, multiple_of: int = None +) -> Type[int]: + # use kwargs then define conf in a dict to aid with IDE type hinting + namespace = dict(strict=strict, gt=gt, ge=ge, lt=lt, le=le, multiple_of=multiple_of) + return type('ConstrainedIntValue', (ConstrainedInt,), namespace) + + +if TYPE_CHECKING: + PositiveInt = int + NegativeInt = int + NonPositiveInt = int + NonNegativeInt = int + StrictInt = int +else: + + class PositiveInt(ConstrainedInt): + gt = 0 + + class NegativeInt(ConstrainedInt): + lt = 0 + + class NonPositiveInt(ConstrainedInt): + le = 0 + + class NonNegativeInt(ConstrainedInt): + ge = 0 + + class StrictInt(ConstrainedInt): + strict = True + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FLOAT TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +class ConstrainedFloat(float, metaclass=ConstrainedNumberMeta): + strict: bool = False + gt: OptionalIntFloat = None + ge: OptionalIntFloat = None + lt: OptionalIntFloat = None + le: OptionalIntFloat = None + multiple_of: OptionalIntFloat = None + allow_inf_nan: Optional[bool] = None + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + update_not_none( + field_schema, + exclusiveMinimum=cls.gt, + exclusiveMaximum=cls.lt, + minimum=cls.ge, + maximum=cls.le, + multipleOf=cls.multiple_of, + ) + # Modify constraints to account for differences between IEEE floats and JSON + if field_schema.get('exclusiveMinimum') == -math.inf: + del field_schema['exclusiveMinimum'] + if field_schema.get('minimum') == -math.inf: + del field_schema['minimum'] + if field_schema.get('exclusiveMaximum') == math.inf: + del field_schema['exclusiveMaximum'] + if field_schema.get('maximum') == math.inf: + del field_schema['maximum'] + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield strict_float_validator if cls.strict else float_validator + yield number_size_validator + yield number_multiple_validator + yield float_finite_validator + + +def confloat( + *, + strict: bool = False, + gt: float = None, + ge: float = None, + lt: float = None, + le: float = None, + multiple_of: float = None, + allow_inf_nan: Optional[bool] = None, +) -> Type[float]: + # use kwargs then define conf in a dict to aid with IDE type hinting + namespace = dict(strict=strict, gt=gt, ge=ge, lt=lt, le=le, multiple_of=multiple_of, allow_inf_nan=allow_inf_nan) + return type('ConstrainedFloatValue', (ConstrainedFloat,), namespace) + + +if TYPE_CHECKING: + PositiveFloat = float + NegativeFloat = float + NonPositiveFloat = float + NonNegativeFloat = float + StrictFloat = float + FiniteFloat = float +else: + + class PositiveFloat(ConstrainedFloat): + gt = 0 + + class NegativeFloat(ConstrainedFloat): + lt = 0 + + class NonPositiveFloat(ConstrainedFloat): + le = 0 + + class NonNegativeFloat(ConstrainedFloat): + ge = 0 + + class StrictFloat(ConstrainedFloat): + strict = True + + class FiniteFloat(ConstrainedFloat): + allow_inf_nan = False + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BYTES TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +class ConstrainedBytes(bytes): + strip_whitespace = False + to_upper = False + to_lower = False + min_length: OptionalInt = None + max_length: OptionalInt = None + strict: bool = False + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + update_not_none(field_schema, minLength=cls.min_length, maxLength=cls.max_length) + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield strict_bytes_validator if cls.strict else bytes_validator + yield constr_strip_whitespace + yield constr_upper + yield constr_lower + yield constr_length_validator + + +def conbytes( + *, + strip_whitespace: bool = False, + to_upper: bool = False, + to_lower: bool = False, + min_length: int = None, + max_length: int = None, + strict: bool = False, +) -> Type[bytes]: + # use kwargs then define conf in a dict to aid with IDE type hinting + namespace = dict( + strip_whitespace=strip_whitespace, + to_upper=to_upper, + to_lower=to_lower, + min_length=min_length, + max_length=max_length, + strict=strict, + ) + return _registered(type('ConstrainedBytesValue', (ConstrainedBytes,), namespace)) + + +if TYPE_CHECKING: + StrictBytes = bytes +else: + + class StrictBytes(ConstrainedBytes): + strict = True + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STRING TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +class ConstrainedStr(str): + strip_whitespace = False + to_upper = False + to_lower = False + min_length: OptionalInt = None + max_length: OptionalInt = None + curtail_length: OptionalInt = None + regex: Optional[Pattern[str]] = None + strict = False + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + update_not_none( + field_schema, + minLength=cls.min_length, + maxLength=cls.max_length, + pattern=cls.regex and cls.regex.pattern, + ) + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield strict_str_validator if cls.strict else str_validator + yield constr_strip_whitespace + yield constr_upper + yield constr_lower + yield constr_length_validator + yield cls.validate + + @classmethod + def validate(cls, value: Union[str]) -> Union[str]: + if cls.curtail_length and len(value) > cls.curtail_length: + value = value[: cls.curtail_length] + + if cls.regex: + if not cls.regex.match(value): + raise errors.StrRegexError(pattern=cls.regex.pattern) + + return value + + +def constr( + *, + strip_whitespace: bool = False, + to_upper: bool = False, + to_lower: bool = False, + strict: bool = False, + min_length: int = None, + max_length: int = None, + curtail_length: int = None, + regex: str = None, +) -> Type[str]: + # use kwargs then define conf in a dict to aid with IDE type hinting + namespace = dict( + strip_whitespace=strip_whitespace, + to_upper=to_upper, + to_lower=to_lower, + strict=strict, + min_length=min_length, + max_length=max_length, + curtail_length=curtail_length, + regex=regex and re.compile(regex), + ) + return _registered(type('ConstrainedStrValue', (ConstrainedStr,), namespace)) + + +if TYPE_CHECKING: + StrictStr = str +else: + + class StrictStr(ConstrainedStr): + strict = True + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SET TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# This types superclass should be Set[T], but cython chokes on that... +class ConstrainedSet(set): # type: ignore + # Needed for pydantic to detect that this is a set + __origin__ = set + __args__: Set[Type[T]] # type: ignore + + min_items: Optional[int] = None + max_items: Optional[int] = None + item_type: Type[T] # type: ignore + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls.set_length_validator + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + update_not_none(field_schema, minItems=cls.min_items, maxItems=cls.max_items) + + @classmethod + def set_length_validator(cls, v: 'Optional[Set[T]]') -> 'Optional[Set[T]]': + if v is None: + return None + + v = set_validator(v) + v_len = len(v) + + if cls.min_items is not None and v_len < cls.min_items: + raise errors.SetMinLengthError(limit_value=cls.min_items) + + if cls.max_items is not None and v_len > cls.max_items: + raise errors.SetMaxLengthError(limit_value=cls.max_items) + + return v + + +def conset(item_type: Type[T], *, min_items: int = None, max_items: int = None) -> Type[Set[T]]: + # __args__ is needed to conform to typing generics api + namespace = {'min_items': min_items, 'max_items': max_items, 'item_type': item_type, '__args__': [item_type]} + # We use new_class to be able to deal with Generic types + return new_class('ConstrainedSetValue', (ConstrainedSet,), {}, lambda ns: ns.update(namespace)) + + +# This types superclass should be FrozenSet[T], but cython chokes on that... +class ConstrainedFrozenSet(frozenset): # type: ignore + # Needed for pydantic to detect that this is a set + __origin__ = frozenset + __args__: FrozenSet[Type[T]] # type: ignore + + min_items: Optional[int] = None + max_items: Optional[int] = None + item_type: Type[T] # type: ignore + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls.frozenset_length_validator + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + update_not_none(field_schema, minItems=cls.min_items, maxItems=cls.max_items) + + @classmethod + def frozenset_length_validator(cls, v: 'Optional[FrozenSet[T]]') -> 'Optional[FrozenSet[T]]': + if v is None: + return None + + v = frozenset_validator(v) + v_len = len(v) + + if cls.min_items is not None and v_len < cls.min_items: + raise errors.FrozenSetMinLengthError(limit_value=cls.min_items) + + if cls.max_items is not None and v_len > cls.max_items: + raise errors.FrozenSetMaxLengthError(limit_value=cls.max_items) + + return v + + +def confrozenset(item_type: Type[T], *, min_items: int = None, max_items: int = None) -> Type[FrozenSet[T]]: + # __args__ is needed to conform to typing generics api + namespace = {'min_items': min_items, 'max_items': max_items, 'item_type': item_type, '__args__': [item_type]} + # We use new_class to be able to deal with Generic types + return new_class('ConstrainedFrozenSetValue', (ConstrainedFrozenSet,), {}, lambda ns: ns.update(namespace)) + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LIST TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# This types superclass should be List[T], but cython chokes on that... +class ConstrainedList(list): # type: ignore + # Needed for pydantic to detect that this is a list + __origin__ = list + __args__: Tuple[Type[T], ...] # type: ignore + + min_items: Optional[int] = None + max_items: Optional[int] = None + unique_items: Optional[bool] = None + item_type: Type[T] # type: ignore + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls.list_length_validator + if cls.unique_items: + yield cls.unique_items_validator + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + update_not_none(field_schema, minItems=cls.min_items, maxItems=cls.max_items, uniqueItems=cls.unique_items) + + @classmethod + def list_length_validator(cls, v: 'Optional[List[T]]') -> 'Optional[List[T]]': + if v is None: + return None + + v = list_validator(v) + v_len = len(v) + + if cls.min_items is not None and v_len < cls.min_items: + raise errors.ListMinLengthError(limit_value=cls.min_items) + + if cls.max_items is not None and v_len > cls.max_items: + raise errors.ListMaxLengthError(limit_value=cls.max_items) + + return v + + @classmethod + def unique_items_validator(cls, v: 'List[T]') -> 'List[T]': + for i, value in enumerate(v, start=1): + if value in v[i:]: + raise errors.ListUniqueItemsError() + + return v + + +def conlist( + item_type: Type[T], *, min_items: int = None, max_items: int = None, unique_items: bool = None +) -> Type[List[T]]: + # __args__ is needed to conform to typing generics api + namespace = dict( + min_items=min_items, max_items=max_items, unique_items=unique_items, item_type=item_type, __args__=(item_type,) + ) + # We use new_class to be able to deal with Generic types + return new_class('ConstrainedListValue', (ConstrainedList,), {}, lambda ns: ns.update(namespace)) + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PYOBJECT TYPE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +if TYPE_CHECKING: + PyObject = Callable[..., Any] +else: + + class PyObject: + validate_always = True + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls.validate + + @classmethod + def validate(cls, value: Any) -> Any: + if isinstance(value, Callable): + return value + + try: + value = str_validator(value) + except errors.StrError: + raise errors.PyObjectError(error_message='value is neither a valid import path not a valid callable') + + try: + return import_string(value) + except ImportError as e: + raise errors.PyObjectError(error_message=str(e)) + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DECIMAL TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +class ConstrainedDecimal(Decimal, metaclass=ConstrainedNumberMeta): + gt: OptionalIntFloatDecimal = None + ge: OptionalIntFloatDecimal = None + lt: OptionalIntFloatDecimal = None + le: OptionalIntFloatDecimal = None + max_digits: OptionalInt = None + decimal_places: OptionalInt = None + multiple_of: OptionalIntFloatDecimal = None + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + update_not_none( + field_schema, + exclusiveMinimum=cls.gt, + exclusiveMaximum=cls.lt, + minimum=cls.ge, + maximum=cls.le, + multipleOf=cls.multiple_of, + ) + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield decimal_validator + yield number_size_validator + yield number_multiple_validator + yield cls.validate + + @classmethod + def validate(cls, value: Decimal) -> Decimal: + digit_tuple, exponent = value.as_tuple()[1:] + if exponent in {'F', 'n', 'N'}: + raise errors.DecimalIsNotFiniteError() + + if exponent >= 0: + # A positive exponent adds that many trailing zeros. + digits = len(digit_tuple) + exponent + decimals = 0 + else: + # If the absolute value of the negative exponent is larger than the + # number of digits, then it's the same as the number of digits, + # because it'll consume all of the digits in digit_tuple and then + # add abs(exponent) - len(digit_tuple) leading zeros after the + # decimal point. + if abs(exponent) > len(digit_tuple): + digits = decimals = abs(exponent) + else: + digits = len(digit_tuple) + decimals = abs(exponent) + whole_digits = digits - decimals + + if cls.max_digits is not None and digits > cls.max_digits: + raise errors.DecimalMaxDigitsError(max_digits=cls.max_digits) + + if cls.decimal_places is not None and decimals > cls.decimal_places: + raise errors.DecimalMaxPlacesError(decimal_places=cls.decimal_places) + + if cls.max_digits is not None and cls.decimal_places is not None: + expected = cls.max_digits - cls.decimal_places + if whole_digits > expected: + raise errors.DecimalWholeDigitsError(whole_digits=expected) + + return value + + +def condecimal( + *, + gt: Decimal = None, + ge: Decimal = None, + lt: Decimal = None, + le: Decimal = None, + max_digits: int = None, + decimal_places: int = None, + multiple_of: Decimal = None, +) -> Type[Decimal]: + # use kwargs then define conf in a dict to aid with IDE type hinting + namespace = dict( + gt=gt, ge=ge, lt=lt, le=le, max_digits=max_digits, decimal_places=decimal_places, multiple_of=multiple_of + ) + return type('ConstrainedDecimalValue', (ConstrainedDecimal,), namespace) + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UUID TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +if TYPE_CHECKING: + UUID1 = UUID + UUID3 = UUID + UUID4 = UUID + UUID5 = UUID +else: + + class UUID1(UUID): + _required_version = 1 + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + field_schema.update(type='string', format=f'uuid{cls._required_version}') + + class UUID3(UUID1): + _required_version = 3 + + class UUID4(UUID1): + _required_version = 4 + + class UUID5(UUID1): + _required_version = 5 + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PATH TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +if TYPE_CHECKING: + FilePath = Path + DirectoryPath = Path +else: + + class FilePath(Path): + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + field_schema.update(format='file-path') + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield path_validator + yield path_exists_validator + yield cls.validate + + @classmethod + def validate(cls, value: Path) -> Path: + if not value.is_file(): + raise errors.PathNotAFileError(path=value) + + return value + + class DirectoryPath(Path): + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + field_schema.update(format='directory-path') + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield path_validator + yield path_exists_validator + yield cls.validate + + @classmethod + def validate(cls, value: Path) -> Path: + if not value.is_dir(): + raise errors.PathNotADirectoryError(path=value) + + return value + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON TYPE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +class JsonWrapper: + pass + + +class JsonMeta(type): + def __getitem__(self, t: Type[Any]) -> Type[JsonWrapper]: + if t is Any: + return Json # allow Json[Any] to replecate plain Json + return _registered(type('JsonWrapperValue', (JsonWrapper,), {'inner_type': t})) + + +if TYPE_CHECKING: + Json = Annotated[T, ...] # Json[list[str]] will be recognized by type checkers as list[str] + +else: + + class Json(metaclass=JsonMeta): + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + field_schema.update(type='string', format='json-string') + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SECRET TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +class SecretField(abc.ABC): + """ + Note: this should be implemented as a generic like `SecretField(ABC, Generic[T])`, + the `__init__()` should be part of the abstract class and the + `get_secret_value()` method should use the generic `T` type. + + However Cython doesn't support very well generics at the moment and + the generated code fails to be imported (see + https://github.com/cython/cython/issues/2753). + """ + + def __eq__(self, other: Any) -> bool: + return isinstance(other, self.__class__) and self.get_secret_value() == other.get_secret_value() + + def __str__(self) -> str: + return '**********' if self.get_secret_value() else '' + + def __hash__(self) -> int: + return hash(self.get_secret_value()) + + @abc.abstractmethod + def get_secret_value(self) -> Any: # pragma: no cover + ... + + +class SecretStr(SecretField): + min_length: OptionalInt = None + max_length: OptionalInt = None + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + update_not_none( + field_schema, + type='string', + writeOnly=True, + format='password', + minLength=cls.min_length, + maxLength=cls.max_length, + ) + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls.validate + yield constr_length_validator + + @classmethod + def validate(cls, value: Any) -> 'SecretStr': + if isinstance(value, cls): + return value + value = str_validator(value) + return cls(value) + + def __init__(self, value: str): + self._secret_value = value + + def __repr__(self) -> str: + return f"SecretStr('{self}')" + + def __len__(self) -> int: + return len(self._secret_value) + + def display(self) -> str: + warnings.warn('`secret_str.display()` is deprecated, use `str(secret_str)` instead', DeprecationWarning) + return str(self) + + def get_secret_value(self) -> str: + return self._secret_value + + +class SecretBytes(SecretField): + min_length: OptionalInt = None + max_length: OptionalInt = None + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + update_not_none( + field_schema, + type='string', + writeOnly=True, + format='password', + minLength=cls.min_length, + maxLength=cls.max_length, + ) + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls.validate + yield constr_length_validator + + @classmethod + def validate(cls, value: Any) -> 'SecretBytes': + if isinstance(value, cls): + return value + value = bytes_validator(value) + return cls(value) + + def __init__(self, value: bytes): + self._secret_value = value + + def __repr__(self) -> str: + return f"SecretBytes(b'{self}')" + + def __len__(self) -> int: + return len(self._secret_value) + + def display(self) -> str: + warnings.warn('`secret_bytes.display()` is deprecated, use `str(secret_bytes)` instead', DeprecationWarning) + return str(self) + + def get_secret_value(self) -> bytes: + return self._secret_value + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PAYMENT CARD TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +class PaymentCardBrand(str, Enum): + # If you add another card type, please also add it to the + # Hypothesis strategy in `pydantic._hypothesis_plugin`. + amex = 'American Express' + mastercard = 'Mastercard' + visa = 'Visa' + other = 'other' + + def __str__(self) -> str: + return self.value + + +class PaymentCardNumber(str): + """ + Based on: https://en.wikipedia.org/wiki/Payment_card_number + """ + + strip_whitespace: ClassVar[bool] = True + min_length: ClassVar[int] = 12 + max_length: ClassVar[int] = 19 + bin: str + last4: str + brand: PaymentCardBrand + + def __init__(self, card_number: str): + self.bin = card_number[:6] + self.last4 = card_number[-4:] + self.brand = self._get_brand(card_number) + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield str_validator + yield constr_strip_whitespace + yield constr_length_validator + yield cls.validate_digits + yield cls.validate_luhn_check_digit + yield cls + yield cls.validate_length_for_brand + + @property + def masked(self) -> str: + num_masked = len(self) - 10 # len(bin) + len(last4) == 10 + return f'{self.bin}{"*" * num_masked}{self.last4}' + + @classmethod + def validate_digits(cls, card_number: str) -> str: + if not card_number.isdigit(): + raise errors.NotDigitError + return card_number + + @classmethod + def validate_luhn_check_digit(cls, card_number: str) -> str: + """ + Based on: https://en.wikipedia.org/wiki/Luhn_algorithm + """ + sum_ = int(card_number[-1]) + length = len(card_number) + parity = length % 2 + for i in range(length - 1): + digit = int(card_number[i]) + if i % 2 == parity: + digit *= 2 + if digit > 9: + digit -= 9 + sum_ += digit + valid = sum_ % 10 == 0 + if not valid: + raise errors.LuhnValidationError + return card_number + + @classmethod + def validate_length_for_brand(cls, card_number: 'PaymentCardNumber') -> 'PaymentCardNumber': + """ + Validate length based on BIN for major brands: + https://en.wikipedia.org/wiki/Payment_card_number#Issuer_identification_number_(IIN) + """ + required_length: Union[None, int, str] = None + if card_number.brand in PaymentCardBrand.mastercard: + required_length = 16 + valid = len(card_number) == required_length + elif card_number.brand == PaymentCardBrand.visa: + required_length = '13, 16 or 19' + valid = len(card_number) in {13, 16, 19} + elif card_number.brand == PaymentCardBrand.amex: + required_length = 15 + valid = len(card_number) == required_length + else: + valid = True + if not valid: + raise errors.InvalidLengthForBrand(brand=card_number.brand, required_length=required_length) + return card_number + + @staticmethod + def _get_brand(card_number: str) -> PaymentCardBrand: + if card_number[0] == '4': + brand = PaymentCardBrand.visa + elif 51 <= int(card_number[:2]) <= 55: + brand = PaymentCardBrand.mastercard + elif card_number[:2] in {'34', '37'}: + brand = PaymentCardBrand.amex + else: + brand = PaymentCardBrand.other + return brand + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BYTE SIZE TYPE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +BYTE_SIZES = { + 'b': 1, + 'kb': 10**3, + 'mb': 10**6, + 'gb': 10**9, + 'tb': 10**12, + 'pb': 10**15, + 'eb': 10**18, + 'kib': 2**10, + 'mib': 2**20, + 'gib': 2**30, + 'tib': 2**40, + 'pib': 2**50, + 'eib': 2**60, +} +BYTE_SIZES.update({k.lower()[0]: v for k, v in BYTE_SIZES.items() if 'i' not in k}) +byte_string_re = re.compile(r'^\s*(\d*\.?\d+)\s*(\w+)?', re.IGNORECASE) + + +class ByteSize(int): + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield cls.validate + + @classmethod + def validate(cls, v: StrIntFloat) -> 'ByteSize': + + try: + return cls(int(v)) + except ValueError: + pass + + str_match = byte_string_re.match(str(v)) + if str_match is None: + raise errors.InvalidByteSize() + + scalar, unit = str_match.groups() + if unit is None: + unit = 'b' + + try: + unit_mult = BYTE_SIZES[unit.lower()] + except KeyError: + raise errors.InvalidByteSizeUnit(unit=unit) + + return cls(int(float(scalar) * unit_mult)) + + def human_readable(self, decimal: bool = False) -> str: + + if decimal: + divisor = 1000 + units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'] + final_unit = 'EB' + else: + divisor = 1024 + units = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'] + final_unit = 'EiB' + + num = float(self) + for unit in units: + if abs(num) < divisor: + return f'{num:0.1f}{unit}' + num /= divisor + + return f'{num:0.1f}{final_unit}' + + def to(self, unit: str) -> float: + + try: + unit_div = BYTE_SIZES[unit.lower()] + except KeyError: + raise errors.InvalidByteSizeUnit(unit=unit) + + return self / unit_div + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DATE TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +if TYPE_CHECKING: + PastDate = date + FutureDate = date +else: + + class PastDate(date): + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield parse_date + yield cls.validate + + @classmethod + def validate(cls, value: date) -> date: + if value >= date.today(): + raise errors.DateNotInThePastError() + + return value + + class FutureDate(date): + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield parse_date + yield cls.validate + + @classmethod + def validate(cls, value: date) -> date: + if value <= date.today(): + raise errors.DateNotInTheFutureError() + + return value + + +class ConstrainedDate(date, metaclass=ConstrainedNumberMeta): + gt: OptionalDate = None + ge: OptionalDate = None + lt: OptionalDate = None + le: OptionalDate = None + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + update_not_none(field_schema, exclusiveMinimum=cls.gt, exclusiveMaximum=cls.lt, minimum=cls.ge, maximum=cls.le) + + @classmethod + def __get_validators__(cls) -> 'CallableGenerator': + yield parse_date + yield number_size_validator + + +def condate( + *, + gt: date = None, + ge: date = None, + lt: date = None, + le: date = None, +) -> Type[date]: + # use kwargs then define conf in a dict to aid with IDE type hinting + namespace = dict(gt=gt, ge=ge, lt=lt, le=le) + return type('ConstrainedDateValue', (ConstrainedDate,), namespace) diff --git a/libs/win/pydantic/typing.cp37-win_amd64.pyd b/libs/win/pydantic/typing.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..d825e1a5baaf29b9d2ab0f24b4369435832d8f2e GIT binary patch literal 200704 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 Any: + return type_._evaluate(globalns, localns) + +else: + + def evaluate_forwardref(type_: ForwardRef, globalns: Any, localns: Any) -> Any: + # Even though it is the right signature for python 3.9, mypy complains with + # `error: Too many arguments for "_evaluate" of "ForwardRef"` hence the cast... + return cast(Any, type_)._evaluate(globalns, localns, set()) + + +if sys.version_info < (3, 9): + # Ensure we always get all the whole `Annotated` hint, not just the annotated type. + # For 3.7 to 3.8, `get_type_hints` doesn't recognize `typing_extensions.Annotated`, + # so it already returns the full annotation + get_all_type_hints = get_type_hints + +else: + + def get_all_type_hints(obj: Any, globalns: Any = None, localns: Any = None) -> Any: + return get_type_hints(obj, globalns, localns, include_extras=True) + + +_T = TypeVar('_T') + +AnyCallable = TypingCallable[..., Any] +NoArgAnyCallable = TypingCallable[[], Any] + +# workaround for https://github.com/python/mypy/issues/9496 +AnyArgTCallable = TypingCallable[..., _T] + + +# Annotated[...] is implemented by returning an instance of one of these classes, depending on +# python/typing_extensions version. +AnnotatedTypeNames = {'AnnotatedMeta', '_AnnotatedAlias'} + + +if sys.version_info < (3, 8): + + def get_origin(t: Type[Any]) -> Optional[Type[Any]]: + if type(t).__name__ in AnnotatedTypeNames: + # weirdly this is a runtime requirement, as well as for mypy + return cast(Type[Any], Annotated) + return getattr(t, '__origin__', None) + +else: + from typing import get_origin as _typing_get_origin + + def get_origin(tp: Type[Any]) -> Optional[Type[Any]]: + """ + We can't directly use `typing.get_origin` since we need a fallback to support + custom generic classes like `ConstrainedList` + It should be useless once https://github.com/cython/cython/issues/3537 is + solved and https://github.com/pydantic/pydantic/pull/1753 is merged. + """ + if type(tp).__name__ in AnnotatedTypeNames: + return cast(Type[Any], Annotated) # mypy complains about _SpecialForm + return _typing_get_origin(tp) or getattr(tp, '__origin__', None) + + +if sys.version_info < (3, 8): + from typing import _GenericAlias + + def get_args(t: Type[Any]) -> Tuple[Any, ...]: + """Compatibility version of get_args for python 3.7. + + Mostly compatible with the python 3.8 `typing` module version + and able to handle almost all use cases. + """ + if type(t).__name__ in AnnotatedTypeNames: + return t.__args__ + t.__metadata__ + if isinstance(t, _GenericAlias): + res = t.__args__ + if t.__origin__ is Callable and res and res[0] is not Ellipsis: + res = (list(res[:-1]), res[-1]) + return res + return getattr(t, '__args__', ()) + +else: + from typing import get_args as _typing_get_args + + def _generic_get_args(tp: Type[Any]) -> Tuple[Any, ...]: + """ + In python 3.9, `typing.Dict`, `typing.List`, ... + do have an empty `__args__` by default (instead of the generic ~T for example). + In order to still support `Dict` for example and consider it as `Dict[Any, Any]`, + we retrieve the `_nparams` value that tells us how many parameters it needs. + """ + if hasattr(tp, '_nparams'): + return (Any,) * tp._nparams + # Special case for `tuple[()]`, which used to return ((),) with `typing.Tuple` + # in python 3.10- but now returns () for `tuple` and `Tuple`. + # This will probably be clarified in pydantic v2 + try: + if tp == Tuple[()] or sys.version_info >= (3, 9) and tp == tuple[()]: # type: ignore[misc] + return ((),) + # there is a TypeError when compiled with cython + except TypeError: # pragma: no cover + pass + return () + + def get_args(tp: Type[Any]) -> Tuple[Any, ...]: + """Get type arguments with all substitutions performed. + + For unions, basic simplifications used by Union constructor are performed. + Examples:: + get_args(Dict[str, int]) == (str, int) + get_args(int) == () + get_args(Union[int, Union[T, int], str][int]) == (int, str) + get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int]) + get_args(Callable[[], T][int]) == ([], int) + """ + if type(tp).__name__ in AnnotatedTypeNames: + return tp.__args__ + tp.__metadata__ + # the fallback is needed for the same reasons as `get_origin` (see above) + return _typing_get_args(tp) or getattr(tp, '__args__', ()) or _generic_get_args(tp) + + +if sys.version_info < (3, 9): + + def convert_generics(tp: Type[Any]) -> Type[Any]: + """Python 3.9 and older only supports generics from `typing` module. + They convert strings to ForwardRef automatically. + + Examples:: + typing.List['Hero'] == typing.List[ForwardRef('Hero')] + """ + return tp + +else: + from typing import _UnionGenericAlias # type: ignore + + from typing_extensions import _AnnotatedAlias + + def convert_generics(tp: Type[Any]) -> Type[Any]: + """ + Recursively searches for `str` type hints and replaces them with ForwardRef. + + Examples:: + convert_generics(list['Hero']) == list[ForwardRef('Hero')] + convert_generics(dict['Hero', 'Team']) == dict[ForwardRef('Hero'), ForwardRef('Team')] + convert_generics(typing.Dict['Hero', 'Team']) == typing.Dict[ForwardRef('Hero'), ForwardRef('Team')] + convert_generics(list[str | 'Hero'] | int) == list[str | ForwardRef('Hero')] | int + """ + origin = get_origin(tp) + if not origin or not hasattr(tp, '__args__'): + return tp + + args = get_args(tp) + + # typing.Annotated needs special treatment + if origin is Annotated: + return _AnnotatedAlias(convert_generics(args[0]), args[1:]) + + # recursively replace `str` instances inside of `GenericAlias` with `ForwardRef(arg)` + converted = tuple( + ForwardRef(arg) if isinstance(arg, str) and isinstance(tp, TypingGenericAlias) else convert_generics(arg) + for arg in args + ) + + if converted == args: + return tp + elif isinstance(tp, TypingGenericAlias): + return TypingGenericAlias(origin, converted) + elif isinstance(tp, TypesUnionType): + # recreate types.UnionType (PEP604, Python >= 3.10) + return _UnionGenericAlias(origin, converted) + else: + try: + setattr(tp, '__args__', converted) + except AttributeError: + pass + return tp + + +if sys.version_info < (3, 10): + + def is_union(tp: Optional[Type[Any]]) -> bool: + return tp is Union + + WithArgsTypes = (TypingGenericAlias,) + +else: + import types + import typing + + def is_union(tp: Optional[Type[Any]]) -> bool: + return tp is Union or tp is types.UnionType # noqa: E721 + + WithArgsTypes = (typing._GenericAlias, types.GenericAlias, types.UnionType) + + +if sys.version_info < (3, 9): + StrPath = Union[str, PathLike] +else: + StrPath = Union[str, PathLike] + # TODO: Once we switch to Cython 3 to handle generics properly + # (https://github.com/cython/cython/issues/2753), use following lines instead + # of the one above + # # os.PathLike only becomes subscriptable from Python 3.9 onwards + # StrPath = Union[str, PathLike[str]] + + +if TYPE_CHECKING: + from .fields import ModelField + + TupleGenerator = Generator[Tuple[str, Any], None, None] + DictStrAny = Dict[str, Any] + DictAny = Dict[Any, Any] + SetStr = Set[str] + ListStr = List[str] + IntStr = Union[int, str] + AbstractSetIntStr = AbstractSet[IntStr] + DictIntStrAny = Dict[IntStr, Any] + MappingIntStrAny = Mapping[IntStr, Any] + CallableGenerator = Generator[AnyCallable, None, None] + ReprArgs = Sequence[Tuple[Optional[str], Any]] + AnyClassMethod = classmethod[Any] + +__all__ = ( + 'AnyCallable', + 'NoArgAnyCallable', + 'NoneType', + 'is_none_type', + 'display_as_type', + 'resolve_annotations', + 'is_callable_type', + 'is_literal_type', + 'all_literal_values', + 'is_namedtuple', + 'is_typeddict', + 'is_typeddict_special', + 'is_new_type', + 'new_type_supertype', + 'is_classvar', + 'is_finalvar', + 'update_field_forward_refs', + 'update_model_forward_refs', + 'TupleGenerator', + 'DictStrAny', + 'DictAny', + 'SetStr', + 'ListStr', + 'IntStr', + 'AbstractSetIntStr', + 'DictIntStrAny', + 'CallableGenerator', + 'ReprArgs', + 'AnyClassMethod', + 'CallableGenerator', + 'WithArgsTypes', + 'get_args', + 'get_origin', + 'get_sub_types', + 'typing_base', + 'get_all_type_hints', + 'is_union', + 'StrPath', + 'MappingIntStrAny', +) + + +NoneType = None.__class__ + + +NONE_TYPES: Tuple[Any, Any, Any] = (None, NoneType, Literal[None]) + + +if sys.version_info < (3, 8): + # Even though this implementation is slower, we need it for python 3.7: + # In python 3.7 "Literal" is not a builtin type and uses a different + # mechanism. + # for this reason `Literal[None] is Literal[None]` evaluates to `False`, + # breaking the faster implementation used for the other python versions. + + def is_none_type(type_: Any) -> bool: + return type_ in NONE_TYPES + +elif sys.version_info[:2] == (3, 8): + + def is_none_type(type_: Any) -> bool: + for none_type in NONE_TYPES: + if type_ is none_type: + return True + # With python 3.8, specifically 3.8.10, Literal "is" check sare very flakey + # can change on very subtle changes like use of types in other modules, + # hopefully this check avoids that issue. + if is_literal_type(type_): # pragma: no cover + return all_literal_values(type_) == (None,) + return False + +else: + + def is_none_type(type_: Any) -> bool: + for none_type in NONE_TYPES: + if type_ is none_type: + return True + return False + + +def display_as_type(v: Type[Any]) -> str: + if not isinstance(v, typing_base) and not isinstance(v, WithArgsTypes) and not isinstance(v, type): + v = v.__class__ + + if is_union(get_origin(v)): + return f'Union[{", ".join(map(display_as_type, get_args(v)))}]' + + if isinstance(v, WithArgsTypes): + # Generic alias are constructs like `list[int]` + return str(v).replace('typing.', '') + + try: + return v.__name__ + except AttributeError: + # happens with typing objects + return str(v).replace('typing.', '') + + +def resolve_annotations(raw_annotations: Dict[str, Type[Any]], module_name: Optional[str]) -> Dict[str, Type[Any]]: + """ + Partially taken from typing.get_type_hints. + + Resolve string or ForwardRef annotations into type objects if possible. + """ + base_globals: Optional[Dict[str, Any]] = None + if module_name: + try: + module = sys.modules[module_name] + except KeyError: + # happens occasionally, see https://github.com/pydantic/pydantic/issues/2363 + pass + else: + base_globals = module.__dict__ + + annotations = {} + for name, value in raw_annotations.items(): + if isinstance(value, str): + if (3, 10) > sys.version_info >= (3, 9, 8) or sys.version_info >= (3, 10, 1): + value = ForwardRef(value, is_argument=False, is_class=True) + else: + value = ForwardRef(value, is_argument=False) + try: + value = _eval_type(value, base_globals, None) + except NameError: + # this is ok, it can be fixed with update_forward_refs + pass + annotations[name] = value + return annotations + + +def is_callable_type(type_: Type[Any]) -> bool: + return type_ is Callable or get_origin(type_) is Callable + + +def is_literal_type(type_: Type[Any]) -> bool: + return Literal is not None and get_origin(type_) is Literal + + +def literal_values(type_: Type[Any]) -> Tuple[Any, ...]: + return get_args(type_) + + +def all_literal_values(type_: Type[Any]) -> Tuple[Any, ...]: + """ + This method is used to retrieve all Literal values as + Literal can be used recursively (see https://www.python.org/dev/peps/pep-0586) + e.g. `Literal[Literal[Literal[1, 2, 3], "foo"], 5, None]` + """ + if not is_literal_type(type_): + return (type_,) + + values = literal_values(type_) + return tuple(x for value in values for x in all_literal_values(value)) + + +def is_namedtuple(type_: Type[Any]) -> bool: + """ + Check if a given class is a named tuple. + It can be either a `typing.NamedTuple` or `collections.namedtuple` + """ + from .utils import lenient_issubclass + + return lenient_issubclass(type_, tuple) and hasattr(type_, '_fields') + + +def is_typeddict(type_: Type[Any]) -> bool: + """ + Check if a given class is a typed dict (from `typing` or `typing_extensions`) + In 3.10, there will be a public method (https://docs.python.org/3.10/library/typing.html#typing.is_typeddict) + """ + from .utils import lenient_issubclass + + return lenient_issubclass(type_, dict) and hasattr(type_, '__total__') + + +def _check_typeddict_special(type_: Any) -> bool: + return type_ is TypedDictRequired or type_ is TypedDictNotRequired + + +def is_typeddict_special(type_: Any) -> bool: + """ + Check if type is a TypedDict special form (Required or NotRequired). + """ + return _check_typeddict_special(type_) or _check_typeddict_special(get_origin(type_)) + + +test_type = NewType('test_type', str) + + +def is_new_type(type_: Type[Any]) -> bool: + """ + Check whether type_ was created using typing.NewType + """ + return isinstance(type_, test_type.__class__) and hasattr(type_, '__supertype__') # type: ignore + + +def new_type_supertype(type_: Type[Any]) -> Type[Any]: + while hasattr(type_, '__supertype__'): + type_ = type_.__supertype__ + return type_ + + +def _check_classvar(v: Optional[Type[Any]]) -> bool: + if v is None: + return False + + return v.__class__ == ClassVar.__class__ and getattr(v, '_name', None) == 'ClassVar' + + +def _check_finalvar(v: Optional[Type[Any]]) -> bool: + """ + Check if a given type is a `typing.Final` type. + """ + if v is None: + return False + + return v.__class__ == Final.__class__ and (sys.version_info < (3, 8) or getattr(v, '_name', None) == 'Final') + + +def is_classvar(ann_type: Type[Any]) -> bool: + if _check_classvar(ann_type) or _check_classvar(get_origin(ann_type)): + return True + + # this is an ugly workaround for class vars that contain forward references and are therefore themselves + # forward references, see #3679 + if ann_type.__class__ == ForwardRef and ann_type.__forward_arg__.startswith('ClassVar['): + return True + + return False + + +def is_finalvar(ann_type: Type[Any]) -> bool: + return _check_finalvar(ann_type) or _check_finalvar(get_origin(ann_type)) + + +def update_field_forward_refs(field: 'ModelField', globalns: Any, localns: Any) -> None: + """ + Try to update ForwardRefs on fields based on this ModelField, globalns and localns. + """ + prepare = False + if field.type_.__class__ == ForwardRef: + prepare = True + field.type_ = evaluate_forwardref(field.type_, globalns, localns or None) + if field.outer_type_.__class__ == ForwardRef: + prepare = True + field.outer_type_ = evaluate_forwardref(field.outer_type_, globalns, localns or None) + if prepare: + field.prepare() + + if field.sub_fields: + for sub_f in field.sub_fields: + update_field_forward_refs(sub_f, globalns=globalns, localns=localns) + + if field.discriminator_key is not None: + field.prepare_discriminated_union_sub_fields() + + +def update_model_forward_refs( + model: Type[Any], + fields: Iterable['ModelField'], + json_encoders: Dict[Union[Type[Any], str, ForwardRef], AnyCallable], + localns: 'DictStrAny', + exc_to_suppress: Tuple[Type[BaseException], ...] = (), +) -> None: + """ + Try to update model fields ForwardRefs based on model and localns. + """ + if model.__module__ in sys.modules: + globalns = sys.modules[model.__module__].__dict__.copy() + else: + globalns = {} + + globalns.setdefault(model.__name__, model) + + for f in fields: + try: + update_field_forward_refs(f, globalns=globalns, localns=localns) + except exc_to_suppress: + pass + + for key in set(json_encoders.keys()): + if isinstance(key, str): + fr: ForwardRef = ForwardRef(key) + elif isinstance(key, ForwardRef): + fr = key + else: + continue + + try: + new_key = evaluate_forwardref(fr, globalns, localns or None) + except exc_to_suppress: # pragma: no cover + continue + + json_encoders[new_key] = json_encoders.pop(key) + + +def get_class(type_: Type[Any]) -> Union[None, bool, Type[Any]]: + """ + Tries to get the class of a Type[T] annotation. Returns True if Type is used + without brackets. Otherwise returns None. + """ + if type_ is type: + return True + + if get_origin(type_) is None: + return None + + args = get_args(type_) + if not args or not isinstance(args[0], type): + return True + else: + return args[0] + + +def get_sub_types(tp: Any) -> List[Any]: + """ + Return all the types that are allowed by type `tp` + `tp` can be a `Union` of allowed types or an `Annotated` type + """ + origin = get_origin(tp) + if origin is Annotated: + return get_sub_types(get_args(tp)[0]) + elif is_union(origin): + return [x for t in get_args(tp) for x in get_sub_types(t)] + else: + return [tp] diff --git a/libs/win/pydantic/utils.cp37-win_amd64.pyd b/libs/win/pydantic/utils.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..e3bfb22c8255f3ce13b40b9f2af04f491065a80b GIT binary patch literal 305152 zcmeGFdwf*Y)yI#Az(~A|6Vaoof<}!R6cj}i8mSpf^o-6ZUQntcC@NS{Q4&D~M3Yp; z<0!TEsoINLeX6atwXJ=O2q93EC~^^RSiGRMI&r*EF9=?k@B6dPnPeszp3Cp``hEZU z@_L0im%Z0sd+oK?ZLhsg;@kx#eM?G8`tg^|mXx&etADlj|Nrn`pOTVY_glDY$rC%S z+P}3=eAWJEO}%VJ<@9T=nsUvBS5!{E@X9N%YN)*ElFDluudKZ6%F4Ra&aAxRs*5i< zJRIJsDgeFb^d;dlc6;%H+~0YZjk#bf_v?PNcA|d2cbWgY?nf_AoM_KqnRu@KuA6u| zzgtdQYrkjgw)TRXxPSXcuTMPFeqRiJ55K^_f64C8xNP!NwUz7H*!q%^i+{XBNoe$* zlXK5Dl^jsHbLp=8ms}5J&Z3k2tDMVqxn0h)C%P^zDcQjub^n%>hkRn%>q!*#E9HKA z-}_I7ZSGq#o;vgSy;v|e^()z;-?jZp9vPsE+`mxCaXWMUR^O6=xkp8Q+u!J0QtPAc zzg^I`WNZ%EBIOTnxMWrX&!=7&^izEoQ{?@tEGe0E_%#<_*l;2IF^3nxESbx%Xp{G^ zme+^-#Y#&4%8POU-OBH`y~?#8KHV>9eWb4?drN zCDX2=pwXy=vDk%jzwA|R3{U^Re^9_}`e>wEw4j1oBNiyDQC;Q{CGQNotcy#-tIOnANhCQ{*L1DROquG>uqfX1wWu*!i!b7 z$-1gatC8xik>1gorS1#-bG_wma%{Pqbj!w_>87SW;NJ962L*<2aFf&1ZgSQ}@0)mX z()xIE>e_g6dPnM%KJnzN_B!u#H#y-o{@&(q4S)UlyD{tRakH@4Zy0m;AAB zNp$f%07e)616Jtt_|Nr1tM2SqQcoAWSKTc4r&jRnDW18>KJ@4V7%RPQSGv^=X`ehu zZwpdXkeUwf)3}rComl32tFvQ=xt=ovC^2t!dPbxGkvIO(jmW#IUTTPxxyeR)QRYHv z;M4|iV!(C1&l`7&0UBt4&N@lxOar&x$WOBVPp&tA0sV@5gX767vWb?D8$$7#4;y!N zy=Vp9ZwR?wN9LWlcO64|VR<|`XGuJH$qJS07t7X{BwDf!ePh}FiI(^DpkGzo3++X} z-Bh@CAV1!?tJ0sAcadP{=%SJ^Xy3)W6P_RiE<5~3KMa= zxyD^lKZPs*jetg)EBrSqOaDi@P1VK^V?nVadj|XvzCmcDoaVb3|5o|~VVFU4cp6=F zm=GERh;(STz9lW~*MX!xJ6vF!jxcH&YA`_DyJSV&o3jLtf#>I}(MawVYr3MuO4ZYW zRg}`OmiMfxF&+?W8dBA#ap#y)9C7$Xk=1w6EA@3smdem-0Qa&;(5n zgryjb9bGRmCB23@5?wSLDrAn2d8d}UO?8Jnb z6-wW30CoicbN#yCQ*LpSNZhiy0bo7mW^%%lFb>@jfqHNv{TC%fJlE*%!V>h!r_znC z_YK(3q|pYXV_xU!1{2YF^|zWavGH!r^9@5O1y9;M8B_MvyhlKYfBhQzr%$8vnNZqI zhz617Ur{FEtzpJJi+GH-3iYV>a=O~3-vExM5>Lic^)ubnxGCuw1N3mtOt?gX?Y7^k zv(2ip=p3<;s|K_EpMrQLS?7uyRNBNKJawrGTntY!z$g5qUrDs>MoMXloAe7E!812` zVg-s|h$=?voT^)Slr8m6uH3w|w(($ZY1P2v`ZbnC+prN!GJDQ@XCRl^@{)O5%c4tU zIMzq%zKVNe%Igsf$+IhCP3;HJ+Q)bGD_JO%kdJ;_8+bxn)#)+2cL|poI`s4-bZF6a zU}}_xSNMH6>-GvvpwDP5YbkR)!r=?FH<|Wwkr(Vp=I;&t> zwc)jx%uXd9W?*k*U}w4>Iw0|t>$&>-LU$jpGwu zG0o8LFAVy?#F&BWNrbO=%QDlYUeshpdM2* zo}AM^>s&os!|Yr$OGNL|i;?~2QJEK`5SB|cvqNsp*S*!_g{a5NP>%@LPZ!;|SVsgWlirdcyGx}%GB z-xc~b0!i|LQA9o@Kn{Kk6ypIZ@Dr0*p~L2P%ZJ3g66{VSTa$GgxURe5s$Hv9Ty652b$FZnsaHY zvCK5vi-zfh9#{#}BYQj(rj7Rr)2sBxTkE#06Q(1C>4Wso8&g^5bu3MnMw{NLZ3xwS z&t~@XI-1_;-?X(4BC^#)WEfq>B_a~ZxZ+B;uq_ZQ_U)fwXX@6XFQ7w4F zXg_)oLXv40ZPa46pk=r$maE2XY(baK)RmW5Ds#*+(cyc!0aLO4B zp!8XL7!USexE?Ogoa=his$ADQzp6HKRg4xJEO6=&az~4rcBDx0B&4usT3<^)WPbI@Yp>nkKc3!8S9W4hwGeC5Td(XJu zOLzq7O2hs9st~r*} z@;+j`W??YOrw$*BTUbAQbN%r5++@8wd~-b6I5y#J;inbBOp717qe6d4;X5WT=`iB{ z?H-5=#Um!!2K|=XPE8(wEkpBUu6MoBPjLZH$GwvnswZq1*E259|4ffvkP1%(q?;Tx z)qrhiILOWRmF4c+Kn(VMa|+zmdbz77W}WdGNg5w8e8ZAEX*9Yd5<%3jCQu=_=7-x# z`K76E+?EZEf6g!RC`Gc)`m3n#8{6f<+uZ~pB>+847O=SbS6x1DTh<4SN0h6%hiaZ_ zH4FWh;hWv2!!YX_C&{ckq0IGG;+$Y$`mh|v$oqTi8M3BQWaU}b&;xROO_^n zYP~x|O>8Pt?>e&188d{v_`Rz@wF<1U0?t0a#vU-o6|*OufNi_F>O(tJg?~fgXe$;D zZ}A0JW}Qbxlw>_~*xc`2+e1{kL7?eOen;p)4@;g7;~df7^v}=kTTjp7hdNu zPHPkiXxR{H{tuPv(MuSjwpknu&5k$dren*O_^6E$YIQ=b2fc!z6V*q}E8yx}5N6C3 z(n*`ThSrByFL+-N2=0wXXe7-K&&EcbSk`zf27ZN%;lpFz1?AX{Or@Ug5OWc%()WKi^Y z6@3*W3rl)!*4b;iM%$^N03AXC1QECW@h{>fxB}PVPBf-*PB!Mb5t|il z+d+CtQ8(A?FEh?_X3s4;crBN!<&I$RaIt5DSq5h@^iz--o>hpZ@kk;vHb}_+9|nWe zBRXLt^a$1o__t?vO|K%(q)QF$9=&B#eLItm8Rw!}TTW%}M3>x3!*OrKz zOS~*d-1JAh-lQ`N+F?f4*`srP|P$*yW3xlJz#?DtPmv!ou5x)gnOqnh!;qo=6$OQz4>vCeGK+;6_YUKi@KO@;al^*BzYdaxA; zPRGnLTl*@5ZsZ9ExP`ziGoz>SVXR`_7jZ9>W5@nx+PsnQ5@l$BC&4Vz{1u&x*9^V& zQr&!Lv$P zQ>gXc+7Z9sd19<`h#TIP5 zFAGEd;|N5p!nBAH!E0JR%PjN>(eo!>V2+g**Z9||wPOF${&$n-SK$*+tE#|ymy=Zq z8n+PajeB3qHpei3;EsMJjRZzQl}(HzLVOqBDBq3S%*7O+g;>oX#71AmMVCc>fDLxI zMuB5l%fL#8#sLe9{MDNUX#*j+Y~ReGS?7KATRP@Gc(YF6d2@KydE0-3SBc-XChL4kB}!sFy=M1s z+kI{1XU}GKY=aCXnNlPZN+s^mdcL{abN0c+yVKcg)oqIrP2(!F8;^$5rvGTLu4wL* zC3k8vg2kX8`~;qx!kudoAZT6>%34p#?6Tw%J@*FfO_?~lDiyw)Nf&LsUnF=feZvuQ zCFQ!JOs7?ig%vBK6DM9^tGlf4!f(W4ritkqI4cRToT@0#++Iqmp{uJ<7>{pXPz z@xBw1Kqt~~I9u}mXtycdr(s{;y+7L6;@nEtyB=t26_B+VbRzeLh25h`3?tqdNoQX~ zr->l=5V6p=^l3O$OzaG}Mn(dQe~JK15N-SjfG-H2p_gt}Yn`PHdF4g~<><4-Tf^xp zgU4`t2=ow0KVz^3w9x-=F#rF#o#g-bGyi|5g>Pt%Kde@|5bkWZ+wfR5k_t5{zKv%; zOq@VSAgL7*A8=@>m@4JW)gw9om}~%&{Y!rruGjdU8f)5C+Ax(NRXicCl3w`B$tE{H z(VPX8;tAi^n^dU3S`&1@bb-t|FI)(`PT-LrP=1F>hM%Kyv{eDo^tD691f9wS@yCJj zsTs6!Qs0t>iBk7e`W%FmRB)P-3ibhocR_(>AH1F)VSE5B5R(|qt8;wp7MMh_jDnw0 zsxYIV#xK5W+#?5pY4bvQe&)gh$QIbk^+tT0 zVnS(Dqf7SMjRD@O)eBqRpSMv&g21yh2M?m`((ba~Q&|?{V7XEk+fT*f-gmJS2@1*E zs^+UIYY>EADs$@_0QtUFTM{*M%Ok0cIQ<~k25}m}V{bQkm(@Di8~BY}xa^9|Ag;Ft z*Sl$@9D_?d9BF3c0Z*v({Hp0%kH}YXrwUlD()7qS=NBf2NqviCr>W>>Lv+U{`Di0$KvUL&oLoG z>79pZ;zXKP^M=F?>Jqf|<`TfYlJO*%o4j&r0p_+yy&aWb#5+|gM9h0b+Wcx4aXTGG zJ_K@l-+8ONXKEvNt>D4?bSiS!Qm($8psV(sJ9b{vxHA;VI)8x^Fzd3B`2!Vv2+Sia ze_oz3jIiUOE=%yUTrW4CXH`{pj*x-wy}3kPjxMPa8{9zcV72Bx8u4j}S^s-0a=MC) zR|8(iy;hRxmFQDi)r~%_)mUHBAHfSZc|rwN(^&$+x^8?LkGj@%E4$WppRz@Za;@t= z6|C#BZm}}%oq^y!vyxWUSxvRqp{wKx)qwr(eAqrxH}uQPu}Qsp)FEaN#Bl)eWmgcf|CPn@5=Yo}CDE6=Pim$2M3-+5!d^mRq&i%j%M*BqF zr?}5Lt2HMe!9euQhc@UPt~VgP7vhzt7iOJHc-T7*GxXZ?s0ZES-t4MjG7?6{(Z#iK z?_z1?*=S|&msRsY$fM2eF7dbzTi#^ zGh&C|s0kt3*oyF&lZ?-t&bZpLs!!T(5}&=0$ZS*elGj~u$fccrteA{ zE+=*KVYL-nIn9rR=i9IiL1&^HPV3*$mtp#6uy+hRNt?stnyhQm~jw*CoR z(?2@M^myf^k^Sn_i7}Nv@fn3Uf{&qiDSdFzy-6||r}|IB2T4LjT1>$b-RArL2w@?D>xH{>t$gOCuS^$CmEFvkg(L0=k{wD_LIlHm~Ec=%! z>?a=$M)gISZ!_}tNIqJZG5xu++GNQze^QP^kwsh8lJ`pb@dHIK40KzuB5oZ|)m4pj zQ)g8TOMmgP*fWycYM?`5q3jDAQC`Bv7$rdcFO=d^+AL;$1Yy^^Nxjk%tv8*&sf=g^ zh88Z>tny+SyI2mFa^8F&MWG^~$VVwkr0vL};x2UDi^Jrp@QH}mI?pG+cbDOxzV`sL zZNKn4{?Xa$cpQprNQb_u+rosfI3(-&q_)SCTM8&a_y5xhSM`Y3|7Ls zNc(>Qcp^l!)YW`W>sqxyuA({aSKl=?wFqb-1})uo&Cg!`-T$BDb?aH8eKC2x=S6w) z`W}r5bH28>yuR|vymD6u<%-JdixG<3lh+krBd>qDIgr=M^#)1mO4jqU&fnA*FZ^F;=x3vFcLPbC z^KZ!Cf-^(0nyuTD*9yrX{PFZv($C)7p5%^}jk;S>Y0mkq;t_{}GLquqKyK~4J4C-U zkmW~?gH$%l58=vW`6uA%KYCABvN{N2Eyr&P0PG?FICY`rT_qRls^#NI%dfhNg(yZ6 z&59ctg+)rbh$k1Bv>`C4?jX{N3OeL0%jpPyhc!P_8N?#1{Ogco zVB1_n8DyJDpj7xSbP`!4(N=s68^|U3IDG?FkU~JhW9X(pAyO#aOfS> zmc)OhJWWwHAjDzxuyd`MVBu=HA%1Kz%z{eeA<*ZGD|iN>g9ZP8ace0^*ds4ue05s1 z-W%}@*S6lOU|ze?d_A>aZPa56<~@A_m&rj78N3Y*XQH^}T4@OhON0DTDtVh2DIkX z0#1kpn!ihrj#p3q&n8OV`e?3gNs9koj|S?rNW31a_snr;`5kktV?FeC}5X=d=-qOs!m^X}6EnSm}#HePh*b^f6QH7A7 zeZ=bg0&K)IqNB{okj=8$Rg)xV$FoYAb$)cJxM-6kU~`(5#RajZPy0mXD-0OfubKZ9 z!X>TTTYa*3+!h#;yq&nDP~%vC36rJG@b9nhS5g>9io#L7;z%>7=qvPwE8<=|z+|^L zw}C}V`>d1I@^yEL$f81TZ*_CSIaz0lp_~Tg#u>EiUJppZYL8RnsaG{MTe#{uHG9G8 zk-)*CQkDd~=#rO#5Klf~;Oda)_XCWHBc5B%UuMEnC;)`Xi>LU?PO4)iPr#%N09}}@ z2M$=>&#S!ZJ(tYtNY_)5xaYU1DNB60_=Lb&VBD&=V-rhWifUTEcfPq=^7MR(c5^8r z&1-oDXGEHhKzb+^+BI7JBF&0MrDwifTGIKSD&~dyo*QI0g_9Oof7$pb^wAHoyx=%8 z{DdV2Ky|wP9}3Oba14ctPt6h)|M}ljv2zbChxOXZQY3RVbhT!NG4T|xI)4iG=~erf z_cPT`OIX7cineNSv@rMQJ;h-@0|iQOrIa8B)>&Zt*+$<3>IWPmpgRlO#bLH9N(WZT z8A6Uiw_wb)aF8L3_pxAM3gF=e7nE z6_;{@0&)2WN+{vI5XD7IIpz%g!5{0lW1^T8iII7&ZvSUxHLOROCf^y#>62MVCkfsH zeNu!H1zum5!;&AC>XyFGDlj%)V>AgrW~%SSTrlChzrTP)9jX0~Zr{B9k0<*}72W$E znXy>eTZmxUQpHS4v*y(l?0=*<_V_}U^O38z|B-@)s}-s48a?(u7F!>a|5O?GoYUT- zove~6K1;N$i!?s~*}YJVr%hY>HI@%whldi)u0t$#zQe20^Z2i^Li-w1&Iwb^)d^lN z)9ah{dLLqyysqLk1-k*<&&#GQeH)S1PXC@So9tzu#sR$i(2tGzfHTujr+2@JKlJ%0 zW)Wr1LyC+V^eY}Umh*15-mQ2|Q)gEFQ%oHM;Mx;KDb4$aq2xqaYV35{U5g~VSmhsn z6~90yBir5i>i5x?zbCSB*bn6YfdsTp)DTo<`(8NI3*bS039%R_*gL1RwR zwIcJ+2a)*-N_uNs*0Ig5tywT003X-uE7BegI7JWLWM8$|ouLx`5uxqCdi{z^TZBGU z&p_W_86SN-x3&m<>Dm6u_@D_~SYE{m*sWy@zP|{)ufa0A^-*0WNB1*G-HXsKXbwp; zG#G9x(;HqAUAMsPk!Ect?@ms75s_L%QJ!3{)})s;Ttg=l!;7}vq3%8h^?S#XLQxGz ziogP?NiIt%*b3Q(<5^dcrE954pUbG$#O_KP$4?`CLotLi>I==>;%o#mZ8UTlHPXB%gqm(8T8jH3)KshSiN2Q)>xnTNtOR~)k zrx@7!?oGLwQ9bJpe-3}_uBGYwh^zZHMdJz4wugk&4$-!h-{_$<8Yhh`72d@3kG8%D z^`h)!y0zS_MF&n1jbWBvR ze8OKTU&in^DGKC?Q1 z0t_lgQnC>hjE2aMYUzUphY^^*gX>t$a+>)SvX#I_KLvCniRV-REgL>Y*rl9XC}%C1 zR31!s+DaTj9CXEW3iQar^OG0O17fsQ=^Tt@+pad2Lq(Uk$JPw;F;=Br!)kp2hjl3! zEjQgv_xg=8r`Y#UmPk(C zh*cj?*3XZ6Z^UznrmSr_dymu7+P8`1wqw7j?bsuuv7OkUJixeJK1dlDb1fJ84wGi;4yNKEnj7emZ5XgGsEuVRp}Vf1U3T3 z=##(M@1P}Db|Z1TkWe~#5tA-4pQX8&_m!Lw0 zgp0H4#k#>Pp*dD)LXiQ6>n@0M?OfJ6>{wRIN7njmgmZIo)pT-w`a^KDkUoSt>2@m>HA4~gtNmL*kxH~Gi@<%GLCKVoofKV|A#r6F8IjYdMg@v7;u znp0Wx|EizRjiS2hc;wZsrvCtO^H$IsuSe_4mL0EVkxd=xe|D-jvvmW{NaL&p!OR?5 zm<<(TFvt8z4Ug?p6&D z`Ei8EUGH?nzcU^4&P|2}2MFzI?6Sq*o0}P&bzI2{aYP@DJ6imlmB#sTk2R;S%o6#) z`bn4yDyHwo^vgv87W)MF7-Y3A%R@sTjZkPp5(XU^8+BS)V_m|#szOm<(l&S|r}fB~ zcO%CO5QIPu>!G+rt~T2-ySx`~#X?_QuBh|gwS1bI(7T!sXW3+|ON}Y@nEGqnr5pPy zrQAJiExURjkF)WJbo}=8sTiWU!EVFiEAA~Lh&z?5&Q$mq;E|SxY?w|eXK!}XJE@zt z&f`APqMcMhvuDsOwSs2VW`{N1xHjssWopj)7?Yrm>Tz#;S#!#lZ)SBHp4m>eXVR5ZWG=Lf0|~Um2eb1IsXno zbpC<@>_soL*bGyY{pkMjD~b8?tY`VKYS0e1Wwt8yJ^#oCQtY)Ol57FVzgo#TP;WpL zFOXcou-=0Wpbcer?K3&VNH!YWuFp(5q z=IkAs@+oI5bKE9)b`*MY@ib}3b0`&E@&;{27eA&4r{_KRn;z8WJ$OM6bc#u?$_hQ$ zKkvaJJy6rR62H)cZv{VSHD2vyufEs)YDjeP#o(e`*YLd{f@OJ?FFzafBQ!ERjxN54Qqd*<0FUAA>^Nf{ zVIx&uDj8cpKW5sBsZ0`FhuIHt44_`xN3#M;O#gA^>IzPislnA)UBTx1FMq`~XCf8E zVsc(+QJxduPA$^9vUPgSSfV$W*ptu%^-4m2CH+iabsNUl-V3pQ_jFLCFZ*pa+xap7 zy-+(&n>-bez{E)th#*Th>+EYIBvT02x@ozqy`d9f*_<=dK-wZI90zA^xtsi@Zz1Dz zH9rnzgYCK`>u9^KWGj2jkVI&Gza)83#|XVm+Op3kj&}b})*?$s&cEZ*WNcnh!tP@X zn_}N)gPR&}7?;b%T>)rDdMUz3<)Jytu71`X#=a1&gjs%HLpts=>jO9Cggs%C^ArXY z#Li}6r~SCs2m5h%fwf?wzxhmbsX*IUrkt|z>BuNOAVZp{Y%X`sTOr|&dCeu8eXb0dP2TufnNgIWz9`D5uZ0MdH#rH z(XgK2C;wvt<9~?BmyrkSIq%nN6IVT(0JSn?88i8g#HU9y5o9A{he&%@Ypt?UTrhxX zvh^a(pzG;l=Vj=fth0qa`*wl7f8E~C(feI_ui%0_)U2}+uq-LC0DS2J^Ly8*otll2 zmb)OHLa|eMEc11e%vWk0Gs42S*Jv_L66a)TNWnesr^c`weRIF(Sv@O7onmvQX3)_z z*>E$;D<%&H!+ki&%O<>>cyn~|ox=J+u<1FowzE*1ABN1$Vr;-y)zcJX=7(BlR!CtG zYMEFrEh@#NEZuyE%0He(p_bBDuwBr^8hAo2Ih#m3z@)>|%hsB0lUuGhn{l<|J_0ZM zGdkxHle9hA^yV?~p#lR-VW!TT0*(?pb%~)~*^8k8!!=5|T=nqhnv^N$2`x}ceop3f zbn$#3)7U4IH1ga2FU09FABu`R#ko21iXFc@CqNZnAc`3FgXG0%QH{3kb%j_iAO*}tBY7q$7d#s~~+bAIYK8e7}GaJidT?%JRnddWBQ<^|=Nw)ux0Tyl(+?mFzC zUKRY1?XI0NhhW^u?Y1K;6D$tV zGXkM~jtYC>5}*U&9a9-nz$vF*Z&INFYA|1DBcBjpuMGpFBb?WAAMx`UwarB17uw2O zchpH`jr~81l+P^J5lrmm*>D6NL-nRhBZrT0Z|GZc{a%eu*4eCn;rs2haA!fgS=9DI ztp?zPvc|H{>LTT*lxJ{tNFcul2z8O_j!Wwzhll$K#vY9W$SV(E^k29OFfvh1F2Vqz zYYa-gkH#EB1D$!6p|J%tMlWTV^ZH{OM{u4^0OHVvy8?o|8|AyXsqhDE$c?tjwo558%)BS%qPv4&8HE6b31fp+~z z%XEcmU;>8Uvh3CHjkL3HI88@ewSO;tJdI`g5=x3`eLPNd0yFsJ3XRe)EkT8YC~BjT z>KU6N)w8Rn*GH;PS(`hHB1l84HC>iFF=P^`9Q6mb$Nw;7ZhSX*_sM_ zkyc_xMs6PuQ26~wB(+-hCs1yB`o>RUJEvPRkWO;Lvj@Wv0|;dZd|2Bmjz_8Ws#?*l!Z-yX{eUrVs3wIbbv)V2|ek zo9zSp&tAYz5U?8nrj1S6zDk<0Wab$v>4gUZnm&(Kb@0+0zff;dp~KahP|X=;!Y}K5 zJ_LAo0S`7k_FR<=S5i6J`Z2H5zuIEc0l#5PrN6UD%m5EqDsvpm!{2*!kaaBJ;Q0<< znwC%U&rB)QHx>_$r5+uRSwTejZli8!?(eB#5#dRS1`prNIXG$8`&wb)I`4hOe(StX z6#Gq`+BcEBp`*^*7EiJ_Hd&8-&8aHM#`XMd%L6n!TUBwEL3XYfFKRZY5%@v%X8_Cv{u-` zH&k;jHA(qVkjTwDiB+>&G2-*3O`UI}V2%~`%U&?v5sdG5!B}4mhVwUOzp78@RsDTc z|7K7Qg^fk3V~fQJw_u*-Oi81Xbj3l3!8oFuh=Z_=JpH8x?h66^tpN?)iUzKeUHhU9 z5U298Ka^)SaN!}f48sRc<`KpKY!!e@0AMtX4gQ{DO*;ARIira)!t8_9=@ci!6lwok zRX^C;$6-jMV=xKW<-yQUahp5cmNdqV^bzOM4r>ejVKDvD85gH=v;|i3hK72bVvBLC z{aHN%HU7HI3+au|$wC&fd`8hyZH{8r59RK?mcHkiZeH@a=qu4|uL^L!W}y5%9h6$0 zcTlQN1i%0ALM^;dWa0J2Lo|Oj`omx#_ZGGRrxfif}UCgc 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 literal 0 HcmV?d00001 diff --git a/libs/win/pydantic/utils.py b/libs/win/pydantic/utils.py new file mode 100644 index 00000000..1d016c0e --- /dev/null +++ b/libs/win/pydantic/utils.py @@ -0,0 +1,841 @@ +import keyword +import warnings +import weakref +from collections import OrderedDict, defaultdict, deque +from copy import deepcopy +from itertools import islice, zip_longest +from types import BuiltinFunctionType, CodeType, FunctionType, GeneratorType, LambdaType, ModuleType +from typing import ( + TYPE_CHECKING, + AbstractSet, + Any, + Callable, + Collection, + Dict, + Generator, + Iterable, + Iterator, + List, + Mapping, + MutableMapping, + NoReturn, + Optional, + Set, + Tuple, + Type, + TypeVar, + Union, +) + +from typing_extensions import Annotated + +from .errors import ConfigError +from .typing import ( + NoneType, + WithArgsTypes, + all_literal_values, + display_as_type, + get_args, + get_origin, + is_literal_type, + is_union, +) +from .version import version_info + +if TYPE_CHECKING: + from inspect import Signature + from pathlib import Path + + from .config import BaseConfig + from .dataclasses import Dataclass + from .fields import ModelField + from .main import BaseModel + from .typing import AbstractSetIntStr, DictIntStrAny, IntStr, MappingIntStrAny, ReprArgs + + RichReprResult = Iterable[Union[Any, Tuple[Any], Tuple[str, Any], Tuple[str, Any, Any]]] + +__all__ = ( + 'import_string', + 'sequence_like', + 'validate_field_name', + 'lenient_isinstance', + 'lenient_issubclass', + 'in_ipython', + 'is_valid_identifier', + 'deep_update', + 'update_not_none', + 'almost_equal_floats', + 'get_model', + 'to_camel', + 'is_valid_field', + 'smart_deepcopy', + 'PyObjectStr', + 'Representation', + 'GetterDict', + 'ValueItems', + 'version_info', # required here to match behaviour in v1.3 + 'ClassAttribute', + 'path_type', + 'ROOT_KEY', + 'get_unique_discriminator_alias', + 'get_discriminator_alias_and_values', + 'DUNDER_ATTRIBUTES', + 'LimitedDict', +) + +ROOT_KEY = '__root__' +# these are types that are returned unchanged by deepcopy +IMMUTABLE_NON_COLLECTIONS_TYPES: Set[Type[Any]] = { + int, + float, + complex, + str, + bool, + bytes, + type, + NoneType, + FunctionType, + BuiltinFunctionType, + LambdaType, + weakref.ref, + CodeType, + # note: including ModuleType will differ from behaviour of deepcopy by not producing error. + # It might be not a good idea in general, but considering that this function used only internally + # against default values of fields, this will allow to actually have a field with module as default value + ModuleType, + NotImplemented.__class__, + Ellipsis.__class__, +} + +# these are types that if empty, might be copied with simple copy() instead of deepcopy() +BUILTIN_COLLECTIONS: Set[Type[Any]] = { + list, + set, + tuple, + frozenset, + dict, + OrderedDict, + defaultdict, + deque, +} + + +def import_string(dotted_path: str) -> Any: + """ + Stolen approximately from django. Import a dotted module path and return the attribute/class designated by the + last name in the path. Raise ImportError if the import fails. + """ + from importlib import import_module + + try: + module_path, class_name = dotted_path.strip(' ').rsplit('.', 1) + except ValueError as e: + raise ImportError(f'"{dotted_path}" doesn\'t look like a module path') from e + + module = import_module(module_path) + try: + return getattr(module, class_name) + except AttributeError as e: + raise ImportError(f'Module "{module_path}" does not define a "{class_name}" attribute') from e + + +def truncate(v: Union[str], *, max_len: int = 80) -> str: + """ + Truncate a value and add a unicode ellipsis (three dots) to the end if it was too long + """ + warnings.warn('`truncate` is no-longer used by pydantic and is deprecated', DeprecationWarning) + if isinstance(v, str) and len(v) > (max_len - 2): + # -3 so quote + string + … + quote has correct length + return (v[: (max_len - 3)] + '…').__repr__() + try: + v = v.__repr__() + except TypeError: + v = v.__class__.__repr__(v) # in case v is a type + if len(v) > max_len: + v = v[: max_len - 1] + '…' + return v + + +def sequence_like(v: Any) -> bool: + return isinstance(v, (list, tuple, set, frozenset, GeneratorType, deque)) + + +def validate_field_name(bases: List[Type['BaseModel']], field_name: str) -> None: + """ + Ensure that the field's name does not shadow an existing attribute of the model. + """ + for base in bases: + if getattr(base, field_name, None): + raise NameError( + f'Field name "{field_name}" shadows a BaseModel attribute; ' + f'use a different field name with "alias=\'{field_name}\'".' + ) + + +def lenient_isinstance(o: Any, class_or_tuple: Union[Type[Any], Tuple[Type[Any], ...], None]) -> bool: + try: + return isinstance(o, class_or_tuple) # type: ignore[arg-type] + except TypeError: + return False + + +def lenient_issubclass(cls: Any, class_or_tuple: Union[Type[Any], Tuple[Type[Any], ...], None]) -> bool: + try: + return isinstance(cls, type) and issubclass(cls, class_or_tuple) # type: ignore[arg-type] + except TypeError: + if isinstance(cls, WithArgsTypes): + return False + raise # pragma: no cover + + +def in_ipython() -> bool: + """ + Check whether we're in an ipython environment, including jupyter notebooks. + """ + try: + eval('__IPYTHON__') + except NameError: + return False + else: # pragma: no cover + return True + + +def is_valid_identifier(identifier: str) -> bool: + """ + Checks that a string is a valid identifier and not a Python keyword. + :param identifier: The identifier to test. + :return: True if the identifier is valid. + """ + return identifier.isidentifier() and not keyword.iskeyword(identifier) + + +KeyType = TypeVar('KeyType') + + +def deep_update(mapping: Dict[KeyType, Any], *updating_mappings: Dict[KeyType, Any]) -> Dict[KeyType, Any]: + updated_mapping = mapping.copy() + for updating_mapping in updating_mappings: + for k, v in updating_mapping.items(): + if k in updated_mapping and isinstance(updated_mapping[k], dict) and isinstance(v, dict): + updated_mapping[k] = deep_update(updated_mapping[k], v) + else: + updated_mapping[k] = v + return updated_mapping + + +def update_not_none(mapping: Dict[Any, Any], **update: Any) -> None: + mapping.update({k: v for k, v in update.items() if v is not None}) + + +def almost_equal_floats(value_1: float, value_2: float, *, delta: float = 1e-8) -> bool: + """ + Return True if two floats are almost equal + """ + return abs(value_1 - value_2) <= delta + + +def generate_model_signature( + init: Callable[..., None], fields: Dict[str, 'ModelField'], config: Type['BaseConfig'] +) -> 'Signature': + """ + Generate signature for model based on its fields + """ + from inspect import Parameter, Signature, signature + + from .config import Extra + + present_params = signature(init).parameters.values() + merged_params: Dict[str, Parameter] = {} + var_kw = None + use_var_kw = False + + for param in islice(present_params, 1, None): # skip self arg + if param.kind is param.VAR_KEYWORD: + var_kw = param + continue + merged_params[param.name] = param + + if var_kw: # if custom init has no var_kw, fields which are not declared in it cannot be passed through + allow_names = config.allow_population_by_field_name + for field_name, field in fields.items(): + param_name = field.alias + if field_name in merged_params or param_name in merged_params: + continue + elif not is_valid_identifier(param_name): + if allow_names and is_valid_identifier(field_name): + param_name = field_name + else: + use_var_kw = True + continue + + # TODO: replace annotation with actual expected types once #1055 solved + kwargs = {'default': field.default} if not field.required else {} + merged_params[param_name] = Parameter( + param_name, Parameter.KEYWORD_ONLY, annotation=field.annotation, **kwargs + ) + + if config.extra is Extra.allow: + use_var_kw = True + + if var_kw and use_var_kw: + # Make sure the parameter for extra kwargs + # does not have the same name as a field + default_model_signature = [ + ('__pydantic_self__', Parameter.POSITIONAL_OR_KEYWORD), + ('data', Parameter.VAR_KEYWORD), + ] + if [(p.name, p.kind) for p in present_params] == default_model_signature: + # if this is the standard model signature, use extra_data as the extra args name + var_kw_name = 'extra_data' + else: + # else start from var_kw + var_kw_name = var_kw.name + + # generate a name that's definitely unique + while var_kw_name in fields: + var_kw_name += '_' + merged_params[var_kw_name] = var_kw.replace(name=var_kw_name) + + return Signature(parameters=list(merged_params.values()), return_annotation=None) + + +def get_model(obj: Union[Type['BaseModel'], Type['Dataclass']]) -> Type['BaseModel']: + from .main import BaseModel + + try: + model_cls = obj.__pydantic_model__ # type: ignore + except AttributeError: + model_cls = obj + + if not issubclass(model_cls, BaseModel): + raise TypeError('Unsupported type, must be either BaseModel or dataclass') + return model_cls + + +def to_camel(string: str) -> str: + return ''.join(word.capitalize() for word in string.split('_')) + + +def to_lower_camel(string: str) -> str: + if len(string) >= 1: + pascal_string = to_camel(string) + return pascal_string[0].lower() + pascal_string[1:] + return string.lower() + + +T = TypeVar('T') + + +def unique_list( + input_list: Union[List[T], Tuple[T, ...]], + *, + name_factory: Callable[[T], str] = str, +) -> List[T]: + """ + Make a list unique while maintaining order. + We update the list if another one with the same name is set + (e.g. root validator overridden in subclass) + """ + result: List[T] = [] + result_names: List[str] = [] + for v in input_list: + v_name = name_factory(v) + if v_name not in result_names: + result_names.append(v_name) + result.append(v) + else: + result[result_names.index(v_name)] = v + + return result + + +class PyObjectStr(str): + """ + String class where repr doesn't include quotes. Useful with Representation when you want to return a string + representation of something that valid (or pseudo-valid) python. + """ + + def __repr__(self) -> str: + return str(self) + + +class Representation: + """ + Mixin to provide __str__, __repr__, and __pretty__ methods. See #884 for more details. + + __pretty__ is used by [devtools](https://python-devtools.helpmanual.io/) to provide human readable representations + of objects. + """ + + __slots__: Tuple[str, ...] = tuple() + + def __repr_args__(self) -> 'ReprArgs': + """ + Returns the attributes to show in __str__, __repr__, and __pretty__ this is generally overridden. + + Can either return: + * name - value pairs, e.g.: `[('foo_name', 'foo'), ('bar_name', ['b', 'a', 'r'])]` + * or, just values, e.g.: `[(None, 'foo'), (None, ['b', 'a', 'r'])]` + """ + attrs = ((s, getattr(self, s)) for s in self.__slots__) + return [(a, v) for a, v in attrs if v is not None] + + def __repr_name__(self) -> str: + """ + Name of the instance's class, used in __repr__. + """ + return self.__class__.__name__ + + def __repr_str__(self, join_str: str) -> str: + return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__()) + + def __pretty__(self, fmt: Callable[[Any], Any], **kwargs: Any) -> Generator[Any, None, None]: + """ + Used by devtools (https://python-devtools.helpmanual.io/) to provide a human readable representations of objects + """ + yield self.__repr_name__() + '(' + yield 1 + for name, value in self.__repr_args__(): + if name is not None: + yield name + '=' + yield fmt(value) + yield ',' + yield 0 + yield -1 + yield ')' + + def __str__(self) -> str: + return self.__repr_str__(' ') + + def __repr__(self) -> str: + return f'{self.__repr_name__()}({self.__repr_str__(", ")})' + + def __rich_repr__(self) -> 'RichReprResult': + """Get fields for Rich library""" + for name, field_repr in self.__repr_args__(): + if name is None: + yield field_repr + else: + yield name, field_repr + + +class GetterDict(Representation): + """ + Hack to make object's smell just enough like dicts for validate_model. + + We can't inherit from Mapping[str, Any] because it upsets cython so we have to implement all methods ourselves. + """ + + __slots__ = ('_obj',) + + def __init__(self, obj: Any): + self._obj = obj + + def __getitem__(self, key: str) -> Any: + try: + return getattr(self._obj, key) + except AttributeError as e: + raise KeyError(key) from e + + def get(self, key: Any, default: Any = None) -> Any: + return getattr(self._obj, key, default) + + def extra_keys(self) -> Set[Any]: + """ + We don't want to get any other attributes of obj if the model didn't explicitly ask for them + """ + return set() + + def keys(self) -> List[Any]: + """ + Keys of the pseudo dictionary, uses a list not set so order information can be maintained like python + dictionaries. + """ + return list(self) + + def values(self) -> List[Any]: + return [self[k] for k in self] + + def items(self) -> Iterator[Tuple[str, Any]]: + for k in self: + yield k, self.get(k) + + def __iter__(self) -> Iterator[str]: + for name in dir(self._obj): + if not name.startswith('_'): + yield name + + def __len__(self) -> int: + return sum(1 for _ in self) + + def __contains__(self, item: Any) -> bool: + return item in self.keys() + + def __eq__(self, other: Any) -> bool: + return dict(self) == dict(other.items()) + + def __repr_args__(self) -> 'ReprArgs': + return [(None, dict(self))] + + def __repr_name__(self) -> str: + return f'GetterDict[{display_as_type(self._obj)}]' + + +class ValueItems(Representation): + """ + Class for more convenient calculation of excluded or included fields on values. + """ + + __slots__ = ('_items', '_type') + + def __init__(self, value: Any, items: Union['AbstractSetIntStr', 'MappingIntStrAny']) -> None: + items = self._coerce_items(items) + + if isinstance(value, (list, tuple)): + items = self._normalize_indexes(items, len(value)) + + self._items: 'MappingIntStrAny' = items + + def is_excluded(self, item: Any) -> bool: + """ + Check if item is fully excluded. + + :param item: key or index of a value + """ + return self.is_true(self._items.get(item)) + + def is_included(self, item: Any) -> bool: + """ + Check if value is contained in self._items + + :param item: key or index of value + """ + return item in self._items + + def for_element(self, e: 'IntStr') -> Optional[Union['AbstractSetIntStr', 'MappingIntStrAny']]: + """ + :param e: key or index of element on value + :return: raw values for element if self._items is dict and contain needed element + """ + + item = self._items.get(e) + return item if not self.is_true(item) else None + + def _normalize_indexes(self, items: 'MappingIntStrAny', v_length: int) -> 'DictIntStrAny': + """ + :param items: dict or set of indexes which will be normalized + :param v_length: length of sequence indexes of which will be + + >>> self._normalize_indexes({0: True, -2: True, -1: True}, 4) + {0: True, 2: True, 3: True} + >>> self._normalize_indexes({'__all__': True}, 4) + {0: True, 1: True, 2: True, 3: True} + """ + + normalized_items: 'DictIntStrAny' = {} + all_items = None + for i, v in items.items(): + if not (isinstance(v, Mapping) or isinstance(v, AbstractSet) or self.is_true(v)): + raise TypeError(f'Unexpected type of exclude value for index "{i}" {v.__class__}') + if i == '__all__': + all_items = self._coerce_value(v) + continue + if not isinstance(i, int): + raise TypeError( + 'Excluding fields from a sequence of sub-models or dicts must be performed index-wise: ' + 'expected integer keys or keyword "__all__"' + ) + normalized_i = v_length + i if i < 0 else i + normalized_items[normalized_i] = self.merge(v, normalized_items.get(normalized_i)) + + if not all_items: + return normalized_items + if self.is_true(all_items): + for i in range(v_length): + normalized_items.setdefault(i, ...) + return normalized_items + for i in range(v_length): + normalized_item = normalized_items.setdefault(i, {}) + if not self.is_true(normalized_item): + normalized_items[i] = self.merge(all_items, normalized_item) + return normalized_items + + @classmethod + def merge(cls, base: Any, override: Any, intersect: bool = False) -> Any: + """ + Merge a ``base`` item with an ``override`` item. + + Both ``base`` and ``override`` are converted to dictionaries if possible. + Sets are converted to dictionaries with the sets entries as keys and + Ellipsis as values. + + Each key-value pair existing in ``base`` is merged with ``override``, + while the rest of the key-value pairs are updated recursively with this function. + + Merging takes place based on the "union" of keys if ``intersect`` is + set to ``False`` (default) and on the intersection of keys if + ``intersect`` is set to ``True``. + """ + override = cls._coerce_value(override) + base = cls._coerce_value(base) + if override is None: + return base + if cls.is_true(base) or base is None: + return override + if cls.is_true(override): + return base if intersect else override + + # intersection or union of keys while preserving ordering: + if intersect: + merge_keys = [k for k in base if k in override] + [k for k in override if k in base] + else: + merge_keys = list(base) + [k for k in override if k not in base] + + merged: 'DictIntStrAny' = {} + for k in merge_keys: + merged_item = cls.merge(base.get(k), override.get(k), intersect=intersect) + if merged_item is not None: + merged[k] = merged_item + + return merged + + @staticmethod + def _coerce_items(items: Union['AbstractSetIntStr', 'MappingIntStrAny']) -> 'MappingIntStrAny': + if isinstance(items, Mapping): + pass + elif isinstance(items, AbstractSet): + items = dict.fromkeys(items, ...) + else: + class_name = getattr(items, '__class__', '???') + assert_never( + items, + f'Unexpected type of exclude value {class_name}', + ) + return items + + @classmethod + def _coerce_value(cls, value: Any) -> Any: + if value is None or cls.is_true(value): + return value + return cls._coerce_items(value) + + @staticmethod + def is_true(v: Any) -> bool: + return v is True or v is ... + + def __repr_args__(self) -> 'ReprArgs': + return [(None, self._items)] + + +class ClassAttribute: + """ + Hide class attribute from its instances + """ + + __slots__ = ( + 'name', + 'value', + ) + + def __init__(self, name: str, value: Any) -> None: + self.name = name + self.value = value + + def __get__(self, instance: Any, owner: Type[Any]) -> None: + if instance is None: + return self.value + raise AttributeError(f'{self.name!r} attribute of {owner.__name__!r} is class-only') + + +path_types = { + 'is_dir': 'directory', + 'is_file': 'file', + 'is_mount': 'mount point', + 'is_symlink': 'symlink', + 'is_block_device': 'block device', + 'is_char_device': 'char device', + 'is_fifo': 'FIFO', + 'is_socket': 'socket', +} + + +def path_type(p: 'Path') -> str: + """ + Find out what sort of thing a path is. + """ + assert p.exists(), 'path does not exist' + for method, name in path_types.items(): + if getattr(p, method)(): + return name + + return 'unknown' + + +Obj = TypeVar('Obj') + + +def smart_deepcopy(obj: Obj) -> Obj: + """ + Return type as is for immutable built-in types + Use obj.copy() for built-in empty collections + Use copy.deepcopy() for non-empty collections and unknown objects + """ + + obj_type = obj.__class__ + if obj_type in IMMUTABLE_NON_COLLECTIONS_TYPES: + return obj # fastest case: obj is immutable and not collection therefore will not be copied anyway + try: + if not obj and obj_type in BUILTIN_COLLECTIONS: + # faster way for empty collections, no need to copy its members + return obj if obj_type is tuple else obj.copy() # type: ignore # tuple doesn't have copy method + except (TypeError, ValueError, RuntimeError): + # do we really dare to catch ALL errors? Seems a bit risky + pass + + return deepcopy(obj) # slowest way when we actually might need a deepcopy + + +def is_valid_field(name: str) -> bool: + if not name.startswith('_'): + return True + return ROOT_KEY == name + + +DUNDER_ATTRIBUTES = { + '__annotations__', + '__classcell__', + '__doc__', + '__module__', + '__orig_bases__', + '__orig_class__', + '__qualname__', +} + + +def is_valid_private_name(name: str) -> bool: + return not is_valid_field(name) and name not in DUNDER_ATTRIBUTES + + +_EMPTY = object() + + +def all_identical(left: Iterable[Any], right: Iterable[Any]) -> bool: + """ + Check that the items of `left` are the same objects as those in `right`. + + >>> a, b = object(), object() + >>> all_identical([a, b, a], [a, b, a]) + True + >>> all_identical([a, b, [a]], [a, b, [a]]) # new list object, while "equal" is not "identical" + False + """ + for left_item, right_item in zip_longest(left, right, fillvalue=_EMPTY): + if left_item is not right_item: + return False + return True + + +def assert_never(obj: NoReturn, msg: str) -> NoReturn: + """ + Helper to make sure that we have covered all possible types. + + This is mostly useful for ``mypy``, docs: + https://mypy.readthedocs.io/en/latest/literal_types.html#exhaustive-checks + """ + raise TypeError(msg) + + +def get_unique_discriminator_alias(all_aliases: Collection[str], discriminator_key: str) -> str: + """Validate that all aliases are the same and if that's the case return the alias""" + unique_aliases = set(all_aliases) + if len(unique_aliases) > 1: + raise ConfigError( + f'Aliases for discriminator {discriminator_key!r} must be the same (got {", ".join(sorted(all_aliases))})' + ) + return unique_aliases.pop() + + +def get_discriminator_alias_and_values(tp: Any, discriminator_key: str) -> Tuple[str, Tuple[str, ...]]: + """ + Get alias and all valid values in the `Literal` type of the discriminator field + `tp` can be a `BaseModel` class or directly an `Annotated` `Union` of many. + """ + is_root_model = getattr(tp, '__custom_root_type__', False) + + if get_origin(tp) is Annotated: + tp = get_args(tp)[0] + + if hasattr(tp, '__pydantic_model__'): + tp = tp.__pydantic_model__ + + if is_union(get_origin(tp)): + alias, all_values = _get_union_alias_and_all_values(tp, discriminator_key) + return alias, tuple(v for values in all_values for v in values) + elif is_root_model: + union_type = tp.__fields__[ROOT_KEY].type_ + alias, all_values = _get_union_alias_and_all_values(union_type, discriminator_key) + + if len(set(all_values)) > 1: + raise ConfigError( + f'Field {discriminator_key!r} is not the same for all submodels of {display_as_type(tp)!r}' + ) + + return alias, all_values[0] + + else: + try: + t_discriminator_type = tp.__fields__[discriminator_key].type_ + except AttributeError as e: + raise TypeError(f'Type {tp.__name__!r} is not a valid `BaseModel` or `dataclass`') from e + except KeyError as e: + raise ConfigError(f'Model {tp.__name__!r} needs a discriminator field for key {discriminator_key!r}') from e + + if not is_literal_type(t_discriminator_type): + raise ConfigError(f'Field {discriminator_key!r} of model {tp.__name__!r} needs to be a `Literal`') + + return tp.__fields__[discriminator_key].alias, all_literal_values(t_discriminator_type) + + +def _get_union_alias_and_all_values( + union_type: Type[Any], discriminator_key: str +) -> Tuple[str, Tuple[Tuple[str, ...], ...]]: + zipped_aliases_values = [get_discriminator_alias_and_values(t, discriminator_key) for t in get_args(union_type)] + # unzip: [('alias_a',('v1', 'v2)), ('alias_b', ('v3',))] => [('alias_a', 'alias_b'), (('v1', 'v2'), ('v3',))] + all_aliases, all_values = zip(*zipped_aliases_values) + return get_unique_discriminator_alias(all_aliases, discriminator_key), all_values + + +KT = TypeVar('KT') +VT = TypeVar('VT') +if TYPE_CHECKING: + # Annoying inheriting from `MutableMapping` and `dict` breaks cython, hence this work around + class LimitedDict(dict, MutableMapping[KT, VT]): # type: ignore[type-arg] + def __init__(self, size_limit: int = 1000): + ... + +else: + + class LimitedDict(dict): + """ + Limit the size/length of a dict used for caching to avoid unlimited increase in memory usage. + + Since the dict is ordered, and we always remove elements from the beginning, this is effectively a FIFO cache. + + Annoying inheriting from `MutableMapping` breaks cython. + """ + + def __init__(self, size_limit: int = 1000): + self.size_limit = size_limit + super().__init__() + + def __setitem__(self, __key: Any, __value: Any) -> None: + super().__setitem__(__key, __value) + if len(self) > self.size_limit: + excess = len(self) - self.size_limit + self.size_limit // 10 + to_remove = list(self.keys())[:excess] + for key in to_remove: + del self[key] + + def __class_getitem__(cls, *args: Any) -> Any: + # to avoid errors with 3.7 + pass diff --git a/libs/win/pydantic/validators.cp37-win_amd64.pyd b/libs/win/pydantic/validators.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..a59f4be20c23c717773bbbbcd88e2767bae364a4 GIT binary patch literal 265216 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�ZYECdx%(_dMu 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

  • |CFeUIX!B)wG_i0C%7qw{s}HnBCdJof+EFkQ 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 Callable[[AnyCallable], 'AnyClassMethod']: + """ + Decorate methods on the class indicating that they should be used to validate fields + :param fields: which field(s) the method should be called on + :param pre: whether or not this validator should be called before the standard validators (else after) + :param each_item: for complex objects (sets, lists etc.) whether to validate individual elements rather than the + whole object + :param always: whether this method and other validators should be called even if the value is missing + :param check_fields: whether to check that the fields actually exist on the model + :param allow_reuse: whether to track and raise an error if another validator refers to the decorated function + """ + if not fields: + raise ConfigError('validator with no fields specified') + elif isinstance(fields[0], FunctionType): + raise ConfigError( + "validators should be used with fields and keyword arguments, not bare. " # noqa: Q000 + "E.g. usage should be `@validator('', ...)`" + ) + elif not all(isinstance(field, str) for field in fields): + raise ConfigError( + "validator fields should be passed as separate string args. " # noqa: Q000 + "E.g. usage should be `@validator('', '', ...)`" + ) + + if whole is not None: + warnings.warn( + 'The "whole" keyword argument is deprecated, use "each_item" (inverse meaning, default False) instead', + DeprecationWarning, + ) + assert each_item is False, '"each_item" and "whole" conflict, remove "whole"' + each_item = not whole + + def dec(f: AnyCallable) -> 'AnyClassMethod': + f_cls = _prepare_validator(f, allow_reuse) + setattr( + f_cls, + VALIDATOR_CONFIG_KEY, + ( + fields, + Validator(func=f_cls.__func__, pre=pre, each_item=each_item, always=always, check_fields=check_fields), + ), + ) + return f_cls + + return dec + + +@overload +def root_validator(_func: AnyCallable) -> 'AnyClassMethod': + ... + + +@overload +def root_validator( + *, pre: bool = False, allow_reuse: bool = False, skip_on_failure: bool = False +) -> Callable[[AnyCallable], 'AnyClassMethod']: + ... + + +def root_validator( + _func: Optional[AnyCallable] = None, *, pre: bool = False, allow_reuse: bool = False, skip_on_failure: bool = False +) -> Union['AnyClassMethod', Callable[[AnyCallable], 'AnyClassMethod']]: + """ + Decorate methods on a model indicating that they should be used to validate (and perhaps modify) data either + before or after standard model parsing/validation is performed. + """ + if _func: + f_cls = _prepare_validator(_func, allow_reuse) + setattr( + f_cls, ROOT_VALIDATOR_CONFIG_KEY, Validator(func=f_cls.__func__, pre=pre, skip_on_failure=skip_on_failure) + ) + return f_cls + + def dec(f: AnyCallable) -> 'AnyClassMethod': + f_cls = _prepare_validator(f, allow_reuse) + setattr( + f_cls, ROOT_VALIDATOR_CONFIG_KEY, Validator(func=f_cls.__func__, pre=pre, skip_on_failure=skip_on_failure) + ) + return f_cls + + return dec + + +def _prepare_validator(function: AnyCallable, allow_reuse: bool) -> 'AnyClassMethod': + """ + Avoid validators with duplicated names since without this, validators can be overwritten silently + which generally isn't the intended behaviour, don't run in ipython (see #312) or if allow_reuse is False. + """ + f_cls = function if isinstance(function, classmethod) else classmethod(function) + if not in_ipython() and not allow_reuse: + ref = f_cls.__func__.__module__ + '.' + f_cls.__func__.__qualname__ + if ref in _FUNCS: + raise ConfigError(f'duplicate validator function "{ref}"; if this is intended, set `allow_reuse=True`') + _FUNCS.add(ref) + return f_cls + + +class ValidatorGroup: + def __init__(self, validators: 'ValidatorListDict') -> None: + self.validators = validators + self.used_validators = {'*'} + + def get_validators(self, name: str) -> Optional[Dict[str, Validator]]: + self.used_validators.add(name) + validators = self.validators.get(name, []) + if name != ROOT_KEY: + validators += self.validators.get('*', []) + if validators: + return {v.func.__name__: v for v in validators} + else: + return None + + def check_for_unused(self) -> None: + unused_validators = set( + chain.from_iterable( + (v.func.__name__ for v in self.validators[f] if v.check_fields) + for f in (self.validators.keys() - self.used_validators) + ) + ) + if unused_validators: + fn = ', '.join(unused_validators) + raise ConfigError( + f"Validators defined with incorrect fields: {fn} " # noqa: Q000 + f"(use check_fields=False if you're inheriting from the model and intended this)" + ) + + +def extract_validators(namespace: Dict[str, Any]) -> Dict[str, List[Validator]]: + validators: Dict[str, List[Validator]] = {} + for var_name, value in namespace.items(): + validator_config = getattr(value, VALIDATOR_CONFIG_KEY, None) + if validator_config: + fields, v = validator_config + for field in fields: + if field in validators: + validators[field].append(v) + else: + validators[field] = [v] + return validators + + +def extract_root_validators(namespace: Dict[str, Any]) -> Tuple[List[AnyCallable], List[Tuple[bool, AnyCallable]]]: + from inspect import signature + + pre_validators: List[AnyCallable] = [] + post_validators: List[Tuple[bool, AnyCallable]] = [] + for name, value in namespace.items(): + validator_config: Optional[Validator] = getattr(value, ROOT_VALIDATOR_CONFIG_KEY, None) + if validator_config: + sig = signature(validator_config.func) + args = list(sig.parameters.keys()) + if args[0] == 'self': + raise ConfigError( + f'Invalid signature for root validator {name}: {sig}, "self" not permitted as first argument, ' + f'should be: (cls, values).' + ) + if len(args) != 2: + raise ConfigError(f'Invalid signature for root validator {name}: {sig}, should be: (cls, values).') + # check function signature + if validator_config.pre: + pre_validators.append(validator_config.func) + else: + post_validators.append((validator_config.skip_on_failure, validator_config.func)) + return pre_validators, post_validators + + +def inherit_validators(base_validators: 'ValidatorListDict', validators: 'ValidatorListDict') -> 'ValidatorListDict': + for field, field_validators in base_validators.items(): + if field not in validators: + validators[field] = [] + validators[field] += field_validators + return validators + + +def make_generic_validator(validator: AnyCallable) -> 'ValidatorCallable': + """ + Make a generic function which calls a validator with the right arguments. + + Unfortunately other approaches (eg. return a partial of a function that builds the arguments) is slow, + hence this laborious way of doing things. + + It's done like this so validators don't all need **kwargs in their signature, eg. any combination of + the arguments "values", "fields" and/or "config" are permitted. + """ + from inspect import signature + + sig = signature(validator) + args = list(sig.parameters.keys()) + first_arg = args.pop(0) + if first_arg == 'self': + raise ConfigError( + f'Invalid signature for validator {validator}: {sig}, "self" not permitted as first argument, ' + f'should be: (cls, value, values, config, field), "values", "config" and "field" are all optional.' + ) + elif first_arg == 'cls': + # assume the second argument is value + return wraps(validator)(_generic_validator_cls(validator, sig, set(args[1:]))) + else: + # assume the first argument was value which has already been removed + return wraps(validator)(_generic_validator_basic(validator, sig, set(args))) + + +def prep_validators(v_funcs: Iterable[AnyCallable]) -> 'ValidatorsList': + return [make_generic_validator(f) for f in v_funcs if f] + + +all_kwargs = {'values', 'field', 'config'} + + +def _generic_validator_cls(validator: AnyCallable, sig: 'Signature', args: Set[str]) -> 'ValidatorCallable': + # assume the first argument is value + has_kwargs = False + if 'kwargs' in args: + has_kwargs = True + args -= {'kwargs'} + + if not args.issubset(all_kwargs): + raise ConfigError( + f'Invalid signature for validator {validator}: {sig}, should be: ' + f'(cls, value, values, config, field), "values", "config" and "field" are all optional.' + ) + + if has_kwargs: + return lambda cls, v, values, field, config: validator(cls, v, values=values, field=field, config=config) + elif args == set(): + return lambda cls, v, values, field, config: validator(cls, v) + elif args == {'values'}: + return lambda cls, v, values, field, config: validator(cls, v, values=values) + elif args == {'field'}: + return lambda cls, v, values, field, config: validator(cls, v, field=field) + elif args == {'config'}: + return lambda cls, v, values, field, config: validator(cls, v, config=config) + elif args == {'values', 'field'}: + return lambda cls, v, values, field, config: validator(cls, v, values=values, field=field) + elif args == {'values', 'config'}: + return lambda cls, v, values, field, config: validator(cls, v, values=values, config=config) + elif args == {'field', 'config'}: + return lambda cls, v, values, field, config: validator(cls, v, field=field, config=config) + else: + # args == {'values', 'field', 'config'} + return lambda cls, v, values, field, config: validator(cls, v, values=values, field=field, config=config) + + +def _generic_validator_basic(validator: AnyCallable, sig: 'Signature', args: Set[str]) -> 'ValidatorCallable': + has_kwargs = False + if 'kwargs' in args: + has_kwargs = True + args -= {'kwargs'} + + if not args.issubset(all_kwargs): + raise ConfigError( + f'Invalid signature for validator {validator}: {sig}, should be: ' + f'(value, values, config, field), "values", "config" and "field" are all optional.' + ) + + if has_kwargs: + return lambda cls, v, values, field, config: validator(v, values=values, field=field, config=config) + elif args == set(): + return lambda cls, v, values, field, config: validator(v) + elif args == {'values'}: + return lambda cls, v, values, field, config: validator(v, values=values) + elif args == {'field'}: + return lambda cls, v, values, field, config: validator(v, field=field) + elif args == {'config'}: + return lambda cls, v, values, field, config: validator(v, config=config) + elif args == {'values', 'field'}: + return lambda cls, v, values, field, config: validator(v, values=values, field=field) + elif args == {'values', 'config'}: + return lambda cls, v, values, field, config: validator(v, values=values, config=config) + elif args == {'field', 'config'}: + return lambda cls, v, values, field, config: validator(v, field=field, config=config) + else: + # args == {'values', 'field', 'config'} + return lambda cls, v, values, field, config: validator(v, values=values, field=field, config=config) + + +def gather_all_validators(type_: 'ModelOrDc') -> Dict[str, 'AnyClassMethod']: + all_attributes = ChainMap(*[cls.__dict__ for cls in type_.__mro__]) # type: ignore[arg-type,var-annotated] + return { + k: v + for k, v in all_attributes.items() + if hasattr(v, VALIDATOR_CONFIG_KEY) or hasattr(v, ROOT_VALIDATOR_CONFIG_KEY) + } diff --git a/libs/win/pydantic/color.cp37-win_amd64.pyd b/libs/win/pydantic/color.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..eaea390c89d1594b20a378f01a1b80700f24b214 GIT binary patch literal 224256 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