From 2182faf8b76b6301dc4d88a2c3a90a0d51f586f7 Mon Sep 17 00:00:00 2001 From: KristofersSolo Date: Wed, 29 Sep 2021 21:34:07 +0300 Subject: [PATCH] pip upgrade --- .venv/bin/pip | 2 +- .venv/bin/pip3 | 2 +- .venv/bin/pip3.9 | 2 +- .venv/bin/yapf | 8 + .venv/bin/yapf-diff | 8 + .../site-packages/pip-21.2.3.dist-info/RECORD | 795 ----- .../INSTALLER | 0 .../LICENSE.txt | 0 .../METADATA | 2 +- .../site-packages/pip-21.2.4.dist-info/RECORD | 795 +++++ .../REQUESTED | 0 .../WHEEL | 0 .../entry_points.txt | 2 +- .../top_level.txt | 0 .../python3.9/site-packages/pip/__init__.py | 2 +- .../pip/__pycache__/__init__.cpython-39.pyc | Bin 637 -> 637 bytes .../pip/__pycache__/__main__.cpython-39.pyc | Bin 593 -> 593 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 758 -> 758 bytes .../__pycache__/build_env.cpython-39.pyc | Bin 9097 -> 9097 bytes .../__pycache__/cache.cpython-39.pyc | Bin 7848 -> 7848 bytes .../__pycache__/configuration.cpython-39.pyc | Bin 10700 -> 10700 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 15649 -> 15649 bytes .../_internal/__pycache__/main.cpython-39.pyc | Bin 582 -> 582 bytes .../__pycache__/pyproject.cpython-39.pyc | Bin 3461 -> 3461 bytes .../self_outdated_check.cpython-39.pyc | Bin 4345 -> 4345 bytes .../__pycache__/wheel_builder.cpython-39.pyc | Bin 8283 -> 8283 bytes .../cli/__pycache__/__init__.cpython-39.pyc | Bin 278 -> 278 bytes .../__pycache__/autocompletion.cpython-39.pyc | Bin 5135 -> 5135 bytes .../__pycache__/base_command.cpython-39.pyc | Bin 6039 -> 6039 bytes .../cli/__pycache__/cmdoptions.cpython-39.pyc | Bin 22495 -> 22495 bytes .../command_context.cpython-39.pyc | Bin 1293 -> 1293 bytes .../cli/__pycache__/main.cpython-39.pyc | Bin 1368 -> 1368 bytes .../__pycache__/main_parser.cpython-39.pyc | Bin 2165 -> 2165 bytes .../cli/__pycache__/parser.cpython-39.pyc | Bin 9949 -> 9949 bytes .../__pycache__/progress_bars.cpython-39.pyc | Bin 7625 -> 7625 bytes .../__pycache__/req_command.cpython-39.pyc | Bin 12060 -> 12060 bytes .../cli/__pycache__/spinners.cpython-39.pyc | Bin 4948 -> 4948 bytes .../__pycache__/status_codes.cpython-39.pyc | Bin 357 -> 357 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 3111 -> 3111 bytes .../commands/__pycache__/cache.cpython-39.pyc | Bin 6044 -> 6044 bytes .../commands/__pycache__/check.cpython-39.pyc | Bin 1573 -> 1573 bytes .../__pycache__/completion.cpython-39.pyc | Bin 3142 -> 3142 bytes .../__pycache__/configuration.cpython-39.pyc | Bin 8349 -> 8349 bytes .../commands/__pycache__/debug.cpython-39.pyc | Bin 6670 -> 6670 bytes .../__pycache__/download.cpython-39.pyc | Bin 3993 -> 3993 bytes .../__pycache__/freeze.cpython-39.pyc | Bin 2637 -> 2637 bytes .../commands/__pycache__/hash.cpython-39.pyc | Bin 2135 -> 2135 bytes .../commands/__pycache__/help.cpython-39.pyc | Bin 1309 -> 1309 bytes .../commands/__pycache__/index.cpython-39.pyc | Bin 4528 -> 4528 bytes .../__pycache__/install.cpython-39.pyc | Bin 17662 -> 17662 bytes .../commands/__pycache__/list.cpython-39.pyc | Bin 9964 -> 9964 bytes .../__pycache__/search.cpython-39.pyc | Bin 5321 -> 5321 bytes .../commands/__pycache__/show.cpython-39.pyc | Bin 8384 -> 8384 bytes .../__pycache__/uninstall.cpython-39.pyc | Bin 3103 -> 3103 bytes .../commands/__pycache__/wheel.cpython-39.pyc | Bin 4866 -> 4866 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 801 -> 801 bytes .../__pycache__/base.cpython-39.pyc | Bin 1928 -> 1928 bytes .../__pycache__/installed.cpython-39.pyc | Bin 1247 -> 1247 bytes .../__pycache__/sdist.cpython-39.pyc | Bin 3581 -> 3581 bytes .../__pycache__/wheel.cpython-39.pyc | Bin 1582 -> 1582 bytes .../index/__pycache__/__init__.cpython-39.pyc | Bin 232 -> 232 bytes .../__pycache__/collector.cpython-39.pyc | Bin 15956 -> 15956 bytes .../__pycache__/package_finder.cpython-39.pyc | Bin 28110 -> 28110 bytes .../index/__pycache__/sources.cpython-39.pyc | Bin 7197 -> 7197 bytes .../pip/_internal/locations/__init__.py | 57 + .../__pycache__/__init__.cpython-39.pyc | Bin 8461 -> 10058 bytes .../__pycache__/_distutils.cpython-39.pyc | Bin 4671 -> 4671 bytes .../__pycache__/_sysconfig.cpython-39.pyc | Bin 6262 -> 6262 bytes .../locations/__pycache__/base.cpython-39.pyc | Bin 1540 -> 1540 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 1853 -> 1853 bytes .../metadata/__pycache__/base.cpython-39.pyc | Bin 9466 -> 9466 bytes .../__pycache__/pkg_resources.cpython-39.pyc | Bin 6167 -> 6167 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 266 -> 266 bytes .../__pycache__/candidate.cpython-39.pyc | Bin 1446 -> 1446 bytes .../__pycache__/direct_url.cpython-39.pyc | Bin 7061 -> 7061 bytes .../__pycache__/format_control.cpython-39.pyc | Bin 2733 -> 2733 bytes .../models/__pycache__/index.cpython-39.pyc | Bin 1245 -> 1245 bytes .../models/__pycache__/link.cpython-39.pyc | Bin 10326 -> 10265 bytes .../models/__pycache__/scheme.cpython-39.pyc | Bin 1012 -> 1012 bytes .../__pycache__/search_scope.cpython-39.pyc | Bin 3485 -> 3485 bytes .../selection_prefs.cpython-39.pyc | Bin 1668 -> 1668 bytes .../__pycache__/target_python.cpython-39.pyc | Bin 3418 -> 3418 bytes .../models/__pycache__/wheel.cpython-39.pyc | Bin 4346 -> 4346 bytes .../pip/_internal/models/link.py | 52 +- .../__pycache__/__init__.cpython-39.pyc | Bin 254 -> 254 bytes .../network/__pycache__/auth.cpython-39.pyc | Bin 7451 -> 7451 bytes .../network/__pycache__/cache.cpython-39.pyc | Bin 2896 -> 2896 bytes .../__pycache__/download.cpython-39.pyc | Bin 5485 -> 5485 bytes .../__pycache__/lazy_wheel.cpython-39.pyc | Bin 8351 -> 8351 bytes .../__pycache__/session.cpython-39.pyc | Bin 10550 -> 10550 bytes .../network/__pycache__/utils.cpython-39.pyc | Bin 1432 -> 1432 bytes .../network/__pycache__/xmlrpc.cpython-39.pyc | Bin 2053 -> 2053 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 202 -> 202 bytes .../__pycache__/check.cpython-39.pyc | Bin 3947 -> 3947 bytes .../__pycache__/freeze.cpython-39.pyc | Bin 6288 -> 6288 bytes .../__pycache__/prepare.cpython-39.pyc | Bin 14228 -> 14228 bytes .../build/__pycache__/__init__.cpython-39.pyc | Bin 208 -> 208 bytes .../build/__pycache__/metadata.cpython-39.pyc | Bin 1154 -> 1154 bytes .../metadata_legacy.cpython-39.pyc | Bin 1928 -> 1928 bytes .../build/__pycache__/wheel.cpython-39.pyc | Bin 1133 -> 1133 bytes .../__pycache__/wheel_legacy.cpython-39.pyc | Bin 2527 -> 2527 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 266 -> 266 bytes .../editable_legacy.cpython-39.pyc | Bin 1309 -> 1309 bytes .../install/__pycache__/legacy.cpython-39.pyc | Bin 3470 -> 3470 bytes .../install/__pycache__/wheel.cpython-39.pyc | Bin 20309 -> 20309 bytes .../req/__pycache__/__init__.cpython-39.pyc | Bin 2565 -> 2565 bytes .../__pycache__/constructors.cpython-39.pyc | Bin 11681 -> 11681 bytes .../req/__pycache__/req_file.cpython-39.pyc | Bin 13375 -> 13375 bytes .../__pycache__/req_install.cpython-39.pyc | Bin 21376 -> 21376 bytes .../req/__pycache__/req_set.cpython-39.pyc | Bin 5902 -> 5902 bytes .../__pycache__/req_tracker.cpython-39.pyc | Bin 4285 -> 4285 bytes .../__pycache__/req_uninstall.cpython-39.pyc | Bin 18768 -> 18768 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 202 -> 202 bytes .../__pycache__/base.cpython-39.pyc | Bin 1032 -> 1032 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 209 -> 209 bytes .../__pycache__/resolver.cpython-39.pyc | Bin 12000 -> 12000 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 213 -> 213 bytes .../__pycache__/base.cpython-39.pyc | Bin 6749 -> 6749 bytes .../__pycache__/candidates.cpython-39.pyc | Bin 19040 -> 19040 bytes .../__pycache__/factory.cpython-39.pyc | Bin 18457 -> 18457 bytes .../found_candidates.cpython-39.pyc | Bin 4802 -> 4802 bytes .../__pycache__/provider.cpython-39.pyc | Bin 6759 -> 6759 bytes .../__pycache__/reporter.cpython-39.pyc | Bin 3332 -> 3332 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 7583 -> 7583 bytes .../__pycache__/resolver.cpython-39.pyc | Bin 7778 -> 7778 bytes .../utils/__pycache__/__init__.cpython-39.pyc | Bin 197 -> 197 bytes .../utils/__pycache__/_log.cpython-39.pyc | Bin 1522 -> 1522 bytes .../utils/__pycache__/appdirs.cpython-39.pyc | Bin 1335 -> 1335 bytes .../utils/__pycache__/compat.cpython-39.pyc | Bin 1516 -> 1516 bytes .../compatibility_tags.cpython-39.pyc | Bin 4115 -> 4115 bytes .../utils/__pycache__/datetime.cpython-39.pyc | Bin 516 -> 516 bytes .../__pycache__/deprecation.cpython-39.pyc | Bin 2979 -> 2979 bytes .../direct_url_helpers.cpython-39.pyc | Bin 1826 -> 1826 bytes .../__pycache__/distutils_args.cpython-39.pyc | Bin 1102 -> 1102 bytes .../utils/__pycache__/encoding.cpython-39.pyc | Bin 1306 -> 1306 bytes .../__pycache__/entrypoints.cpython-39.pyc | Bin 1307 -> 1307 bytes .../__pycache__/filesystem.cpython-39.pyc | Bin 5143 -> 5143 bytes .../__pycache__/filetypes.cpython-39.pyc | Bin 809 -> 809 bytes .../utils/__pycache__/glibc.cpython-39.pyc | Bin 1619 -> 1619 bytes .../utils/__pycache__/hashes.cpython-39.pyc | Bin 5001 -> 5001 bytes .../inject_securetransport.cpython-39.pyc | Bin 970 -> 970 bytes .../utils/__pycache__/logging.cpython-39.pyc | Bin 9050 -> 9050 bytes .../utils/__pycache__/misc.cpython-39.pyc | Bin 21670 -> 21670 bytes .../utils/__pycache__/models.cpython-39.pyc | Bin 1901 -> 1901 bytes .../__pycache__/packaging.cpython-39.pyc | Bin 2525 -> 2525 bytes .../utils/__pycache__/parallel.cpython-39.pyc | Bin 3042 -> 3042 bytes .../__pycache__/pkg_resources.cpython-39.pyc | Bin 1723 -> 1723 bytes .../setuptools_build.cpython-39.pyc | Bin 2967 -> 2967 bytes .../__pycache__/subprocess.cpython-39.pyc | Bin 5704 -> 5704 bytes .../utils/__pycache__/temp_dir.cpython-39.pyc | Bin 6841 -> 6841 bytes .../__pycache__/unpacking.cpython-39.pyc | Bin 6485 -> 6485 bytes .../utils/__pycache__/urls.cpython-39.pyc | Bin 1541 -> 1541 bytes .../__pycache__/virtualenv.cpython-39.pyc | Bin 3220 -> 3220 bytes .../utils/__pycache__/wheel.cpython-39.pyc | Bin 5971 -> 5971 bytes .../vcs/__pycache__/__init__.cpython-39.pyc | Bin 520 -> 520 bytes .../vcs/__pycache__/bazaar.cpython-39.pyc | Bin 3006 -> 3006 bytes .../vcs/__pycache__/git.cpython-39.pyc | Bin 11721 -> 11721 bytes .../vcs/__pycache__/mercurial.cpython-39.pyc | Bin 4653 -> 4653 bytes .../vcs/__pycache__/subversion.cpython-39.pyc | Bin 7967 -> 7967 bytes .../__pycache__/versioncontrol.cpython-39.pyc | Bin 19490 -> 19490 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 2905 -> 2905 bytes .../__pycache__/appdirs.cpython-39.pyc | Bin 21405 -> 21405 bytes .../_vendor/__pycache__/distro.cpython-39.pyc | Bin 36884 -> 36884 bytes .../__pycache__/pyparsing.cpython-39.pyc | Bin 240441 -> 240441 bytes .../_vendor/__pycache__/six.cpython-39.pyc | Bin 27514 -> 27514 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 555 -> 555 bytes .../__pycache__/_cmd.cpython-39.pyc | Bin 1576 -> 1576 bytes .../__pycache__/adapter.cpython-39.pyc | Bin 3081 -> 3081 bytes .../__pycache__/cache.cpython-39.pyc | Bin 1828 -> 1828 bytes .../__pycache__/compat.cpython-39.pyc | Bin 752 -> 752 bytes .../__pycache__/controller.cpython-39.pyc | Bin 7769 -> 7769 bytes .../__pycache__/filewrapper.cpython-39.pyc | Bin 2177 -> 2177 bytes .../__pycache__/heuristics.cpython-39.pyc | Bin 4709 -> 4709 bytes .../__pycache__/serialize.cpython-39.pyc | Bin 4228 -> 4228 bytes .../__pycache__/wrapper.cpython-39.pyc | Bin 679 -> 679 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 299 -> 299 bytes .../__pycache__/file_cache.cpython-39.pyc | Bin 3315 -> 3315 bytes .../__pycache__/redis_cache.cpython-39.pyc | Bin 1571 -> 1571 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 281 -> 281 bytes .../__pycache__/__main__.cpython-39.pyc | Bin 458 -> 458 bytes .../certifi/__pycache__/core.cpython-39.pyc | Bin 1549 -> 1549 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 1905 -> 1905 bytes .../__pycache__/big5freq.cpython-39.pyc | Bin 27184 -> 27184 bytes .../__pycache__/big5prober.cpython-39.pyc | Bin 1139 -> 1139 bytes .../chardistribution.cpython-39.pyc | Bin 6225 -> 6225 bytes .../charsetgroupprober.cpython-39.pyc | Bin 2266 -> 2266 bytes .../__pycache__/charsetprober.cpython-39.pyc | Bin 3488 -> 3488 bytes .../codingstatemachine.cpython-39.pyc | Bin 2915 -> 2915 bytes .../chardet/__pycache__/compat.cpython-39.pyc | Bin 404 -> 404 bytes .../__pycache__/cp949prober.cpython-39.pyc | Bin 1146 -> 1146 bytes .../chardet/__pycache__/enums.cpython-39.pyc | Bin 2653 -> 2653 bytes .../__pycache__/escprober.cpython-39.pyc | Bin 2638 -> 2638 bytes .../chardet/__pycache__/escsm.cpython-39.pyc | Bin 7087 -> 7087 bytes .../__pycache__/eucjpprober.cpython-39.pyc | Bin 2452 -> 2452 bytes .../__pycache__/euckrfreq.cpython-39.pyc | Bin 12068 -> 12068 bytes .../__pycache__/euckrprober.cpython-39.pyc | Bin 1147 -> 1147 bytes .../__pycache__/euctwfreq.cpython-39.pyc | Bin 27188 -> 27188 bytes .../__pycache__/euctwprober.cpython-39.pyc | Bin 1147 -> 1147 bytes .../__pycache__/gb2312freq.cpython-39.pyc | Bin 19112 -> 19112 bytes .../__pycache__/gb2312prober.cpython-39.pyc | Bin 1155 -> 1155 bytes .../__pycache__/hebrewprober.cpython-39.pyc | Bin 3024 -> 3024 bytes .../__pycache__/jisfreq.cpython-39.pyc | Bin 22140 -> 22140 bytes .../chardet/__pycache__/jpcntx.cpython-39.pyc | Bin 37613 -> 37613 bytes .../langbulgarianmodel.cpython-39.pyc | Bin 21815 -> 21815 bytes .../__pycache__/langgreekmodel.cpython-39.pyc | Bin 20491 -> 20491 bytes .../langhebrewmodel.cpython-39.pyc | Bin 20559 -> 20559 bytes .../langhungarianmodel.cpython-39.pyc | Bin 21760 -> 21760 bytes .../langrussianmodel.cpython-39.pyc | Bin 26363 -> 26363 bytes .../__pycache__/langthaimodel.cpython-39.pyc | Bin 20735 -> 20735 bytes .../langturkishmodel.cpython-39.pyc | Bin 20575 -> 20575 bytes .../__pycache__/latin1prober.cpython-39.pyc | Bin 2960 -> 2960 bytes .../mbcharsetprober.cpython-39.pyc | Bin 2267 -> 2267 bytes .../mbcsgroupprober.cpython-39.pyc | Bin 1136 -> 1136 bytes .../chardet/__pycache__/mbcssm.cpython-39.pyc | Bin 15723 -> 15723 bytes .../sbcharsetprober.cpython-39.pyc | Bin 3120 -> 3120 bytes .../sbcsgroupprober.cpython-39.pyc | Bin 1705 -> 1705 bytes .../__pycache__/sjisprober.cpython-39.pyc | Bin 2488 -> 2488 bytes .../universaldetector.cpython-39.pyc | Bin 5836 -> 5836 bytes .../__pycache__/utf8prober.cpython-39.pyc | Bin 1997 -> 1997 bytes .../__pycache__/version.cpython-39.pyc | Bin 444 -> 444 bytes .../cli/__pycache__/__init__.cpython-39.pyc | Bin 201 -> 201 bytes .../cli/__pycache__/chardetect.cpython-39.pyc | Bin 2695 -> 2695 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 206 -> 206 bytes .../__pycache__/languages.cpython-39.pyc | Bin 7937 -> 7937 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 449 -> 449 bytes .../colorama/__pycache__/ansi.cpython-39.pyc | Bin 3234 -> 3234 bytes .../__pycache__/ansitowin32.cpython-39.pyc | Bin 7700 -> 7700 bytes .../__pycache__/initialise.cpython-39.pyc | Bin 1716 -> 1716 bytes .../colorama/__pycache__/win32.cpython-39.pyc | Bin 3948 -> 3948 bytes .../__pycache__/winterm.cpython-39.pyc | Bin 4670 -> 4670 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 1062 -> 1062 bytes .../distlib/__pycache__/compat.cpython-39.pyc | Bin 32164 -> 32164 bytes .../__pycache__/database.cpython-39.pyc | Bin 42486 -> 42486 bytes .../distlib/__pycache__/index.cpython-39.pyc | Bin 17295 -> 17295 bytes .../__pycache__/locators.cpython-39.pyc | Bin 38259 -> 38259 bytes .../__pycache__/manifest.cpython-39.pyc | Bin 10198 -> 10198 bytes .../__pycache__/markers.cpython-39.pyc | Bin 4442 -> 4442 bytes .../__pycache__/metadata.cpython-39.pyc | Bin 26593 -> 26593 bytes .../__pycache__/resources.cpython-39.pyc | Bin 11016 -> 11016 bytes .../__pycache__/scripts.cpython-39.pyc | Bin 11099 -> 11099 bytes .../distlib/__pycache__/util.cpython-39.pyc | Bin 52601 -> 52601 bytes .../__pycache__/version.cpython-39.pyc | Bin 20353 -> 20353 bytes .../distlib/__pycache__/wheel.cpython-39.pyc | Bin 27226 -> 27226 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 489 -> 489 bytes .../_backport/__pycache__/misc.cpython-39.pyc | Bin 1109 -> 1109 bytes .../__pycache__/shutil.cpython-39.pyc | Bin 21683 -> 21683 bytes .../__pycache__/sysconfig.cpython-39.pyc | Bin 15973 -> 15973 bytes .../__pycache__/tarfile.cpython-39.pyc | Bin 62737 -> 62737 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 1308 -> 1308 bytes .../__pycache__/_ihatexml.cpython-39.pyc | Bin 13777 -> 13777 bytes .../__pycache__/_inputstream.cpython-39.pyc | Bin 21636 -> 21636 bytes .../__pycache__/_tokenizer.cpython-39.pyc | Bin 39731 -> 39731 bytes .../__pycache__/_utils.cpython-39.pyc | Bin 4808 -> 4808 bytes .../__pycache__/constants.cpython-39.pyc | Bin 66346 -> 66346 bytes .../__pycache__/html5parser.cpython-39.pyc | Bin 91017 -> 91017 bytes .../__pycache__/serializer.cpython-39.pyc | Bin 10819 -> 10819 bytes .../_trie/__pycache__/__init__.cpython-39.pyc | Bin 358 -> 358 bytes .../_trie/__pycache__/_base.cpython-39.pyc | Bin 1602 -> 1602 bytes .../_trie/__pycache__/py.cpython-39.pyc | Bin 2263 -> 2263 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 206 -> 206 bytes .../alphabeticalattributes.cpython-39.pyc | Bin 1328 -> 1328 bytes .../filters/__pycache__/base.cpython-39.pyc | Bin 876 -> 876 bytes .../inject_meta_charset.cpython-39.pyc | Bin 1882 -> 1882 bytes .../filters/__pycache__/lint.cpython-39.pyc | Bin 2624 -> 2624 bytes .../__pycache__/optionaltags.cpython-39.pyc | Bin 2769 -> 2769 bytes .../__pycache__/sanitizer.cpython-39.pyc | Bin 16892 -> 16892 bytes .../__pycache__/whitespace.cpython-39.pyc | Bin 1374 -> 1374 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 943 -> 943 bytes .../__pycache__/genshi.cpython-39.pyc | Bin 1551 -> 1551 bytes .../__pycache__/sax.cpython-39.pyc | Bin 1470 -> 1470 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 3338 -> 3338 bytes .../__pycache__/base.cpython-39.pyc | Bin 11322 -> 11322 bytes .../__pycache__/dom.cpython-39.pyc | Bin 9459 -> 9459 bytes .../__pycache__/etree.cpython-39.pyc | Bin 11827 -> 11827 bytes .../__pycache__/etree_lxml.cpython-39.pyc | Bin 13010 -> 13010 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 4004 -> 4004 bytes .../__pycache__/base.cpython-39.pyc | Bin 7003 -> 7003 bytes .../__pycache__/dom.cpython-39.pyc | Bin 1738 -> 1738 bytes .../__pycache__/etree.cpython-39.pyc | Bin 3500 -> 3500 bytes .../__pycache__/etree_lxml.cpython-39.pyc | Bin 6637 -> 6637 bytes .../__pycache__/genshi.cpython-39.pyc | Bin 1894 -> 1894 bytes .../idna/__pycache__/__init__.cpython-39.pyc | Bin 853 -> 853 bytes .../idna/__pycache__/codec.cpython-39.pyc | Bin 2884 -> 2884 bytes .../idna/__pycache__/compat.cpython-39.pyc | Bin 690 -> 690 bytes .../idna/__pycache__/core.cpython-39.pyc | Bin 9158 -> 9158 bytes .../idna/__pycache__/idnadata.cpython-39.pyc | Bin 22144 -> 22144 bytes .../idna/__pycache__/intranges.cpython-39.pyc | Bin 1866 -> 1866 bytes .../__pycache__/package_data.cpython-39.pyc | Bin 217 -> 217 bytes .../idna/__pycache__/uts46data.cpython-39.pyc | Bin 146177 -> 146177 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 1420 -> 1420 bytes .../__pycache__/_version.cpython-39.pyc | Bin 224 -> 224 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 1858 -> 1858 bytes .../msgpack/__pycache__/ext.cpython-39.pyc | Bin 6286 -> 6286 bytes .../__pycache__/fallback.cpython-39.pyc | Bin 26732 -> 26732 bytes .../__pycache__/__about__.cpython-39.pyc | Bin 596 -> 596 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 452 -> 452 bytes .../__pycache__/_manylinux.cpython-39.pyc | Bin 7300 -> 7300 bytes .../__pycache__/_musllinux.cpython-39.pyc | Bin 4615 -> 4615 bytes .../__pycache__/_structures.cpython-39.pyc | Bin 3088 -> 3088 bytes .../__pycache__/markers.cpython-39.pyc | Bin 9459 -> 9459 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 3980 -> 3980 bytes .../__pycache__/specifiers.cpython-39.pyc | Bin 22216 -> 22216 bytes .../packaging/__pycache__/tags.cpython-39.pyc | Bin 12295 -> 12295 bytes .../__pycache__/utils.cpython-39.pyc | Bin 3617 -> 3617 bytes .../__pycache__/version.cpython-39.pyc | Bin 13158 -> 13158 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 319 -> 319 bytes .../pep517/__pycache__/build.cpython-39.pyc | Bin 3584 -> 3584 bytes .../pep517/__pycache__/check.cpython-39.pyc | Bin 5131 -> 5131 bytes .../__pycache__/colorlog.cpython-39.pyc | Bin 2944 -> 2944 bytes .../pep517/__pycache__/compat.cpython-39.pyc | Bin 1299 -> 1299 bytes .../__pycache__/dirtools.cpython-39.pyc | Bin 1353 -> 1353 bytes .../__pycache__/envbuild.cpython-39.pyc | Bin 4530 -> 4530 bytes .../pep517/__pycache__/meta.cpython-39.pyc | Bin 2926 -> 2926 bytes .../__pycache__/wrappers.cpython-39.pyc | Bin 12276 -> 12276 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 921 -> 921 bytes .../__pycache__/_in_process.cpython-39.pyc | Bin 9937 -> 9937 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 100337 -> 100337 bytes .../__pycache__/py31compat.cpython-39.pyc | Bin 656 -> 656 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 5663 -> 5663 bytes .../progress/__pycache__/bar.cpython-39.pyc | Bin 2645 -> 2645 bytes .../__pycache__/counter.cpython-39.pyc | Bin 1479 -> 1479 bytes .../__pycache__/spinner.cpython-39.pyc | Bin 1396 -> 1396 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 4008 -> 4008 bytes .../__pycache__/__version__.cpython-39.pyc | Bin 561 -> 561 bytes .../_internal_utils.cpython-39.pyc | Bin 1308 -> 1308 bytes .../__pycache__/adapters.cpython-39.pyc | Bin 16979 -> 16979 bytes .../requests/__pycache__/api.cpython-39.pyc | Bin 6725 -> 6725 bytes .../requests/__pycache__/auth.cpython-39.pyc | Bin 8337 -> 8337 bytes .../requests/__pycache__/certs.cpython-39.pyc | Bin 639 -> 639 bytes .../__pycache__/compat.cpython-39.pyc | Bin 1618 -> 1618 bytes .../__pycache__/cookies.cpython-39.pyc | Bin 18828 -> 18828 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 5411 -> 5411 bytes .../requests/__pycache__/help.cpython-39.pyc | Bin 2899 -> 2899 bytes .../requests/__pycache__/hooks.cpython-39.pyc | Bin 996 -> 996 bytes .../__pycache__/models.cpython-39.pyc | Bin 24476 -> 24476 bytes .../__pycache__/packages.cpython-39.pyc | Bin 508 -> 508 bytes .../__pycache__/sessions.cpython-39.pyc | Bin 19863 -> 19863 bytes .../__pycache__/status_codes.cpython-39.pyc | Bin 4245 -> 4245 bytes .../__pycache__/structures.cpython-39.pyc | Bin 4466 -> 4466 bytes .../requests/__pycache__/utils.cpython-39.pyc | Bin 23330 -> 23330 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 612 -> 612 bytes .../__pycache__/providers.cpython-39.pyc | Bin 6532 -> 6532 bytes .../__pycache__/reporters.cpython-39.pyc | Bin 2308 -> 2308 bytes .../__pycache__/resolvers.cpython-39.pyc | Bin 15159 -> 15159 bytes .../__pycache__/structs.cpython-39.pyc | Bin 7285 -> 7285 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 207 -> 207 bytes .../collections_abc.cpython-39.pyc | Bin 381 -> 381 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 16285 -> 16285 bytes .../__pycache__/_asyncio.cpython-39.pyc | Bin 2600 -> 2600 bytes .../__pycache__/_utils.cpython-39.pyc | Bin 1237 -> 1237 bytes .../tenacity/__pycache__/after.cpython-39.pyc | Bin 1216 -> 1216 bytes .../__pycache__/before.cpython-39.pyc | Bin 1104 -> 1104 bytes .../__pycache__/before_sleep.cpython-39.pyc | Bin 1396 -> 1396 bytes .../tenacity/__pycache__/nap.cpython-39.pyc | Bin 1198 -> 1198 bytes .../tenacity/__pycache__/retry.cpython-39.pyc | Bin 8786 -> 8786 bytes .../tenacity/__pycache__/stop.cpython-39.pyc | Bin 4250 -> 4250 bytes .../__pycache__/tornadoweb.cpython-39.pyc | Bin 1750 -> 1750 bytes .../tenacity/__pycache__/wait.cpython-39.pyc | Bin 7962 -> 7962 bytes .../tomli/__pycache__/__init__.cpython-39.pyc | Bin 385 -> 385 bytes .../tomli/__pycache__/_parser.cpython-39.pyc | Bin 16360 -> 16360 bytes .../tomli/__pycache__/_re.cpython-39.pyc | Bin 2435 -> 2435 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 2195 -> 2195 bytes .../__pycache__/_collections.cpython-39.pyc | Bin 10790 -> 10790 bytes .../__pycache__/_version.cpython-39.pyc | Bin 219 -> 219 bytes .../__pycache__/connection.cpython-39.pyc | Bin 13376 -> 13376 bytes .../__pycache__/connectionpool.cpython-39.pyc | Bin 24472 -> 24472 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 11652 -> 11652 bytes .../urllib3/__pycache__/fields.cpython-39.pyc | Bin 8167 -> 8167 bytes .../__pycache__/filepost.cpython-39.pyc | Bin 2768 -> 2768 bytes .../__pycache__/poolmanager.cpython-39.pyc | Bin 15170 -> 15170 bytes .../__pycache__/request.cpython-39.pyc | Bin 5631 -> 5631 bytes .../__pycache__/response.cpython-39.pyc | Bin 20842 -> 20842 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 205 -> 205 bytes .../_appengine_environ.cpython-39.pyc | Bin 1425 -> 1425 bytes .../__pycache__/appengine.cpython-39.pyc | Bin 8278 -> 8278 bytes .../__pycache__/ntlmpool.cpython-39.pyc | Bin 3632 -> 3632 bytes .../__pycache__/pyopenssl.cpython-39.pyc | Bin 15600 -> 15600 bytes .../securetransport.cpython-39.pyc | Bin 21916 -> 21916 bytes .../contrib/__pycache__/socks.cpython-39.pyc | Bin 5641 -> 5641 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 222 -> 222 bytes .../__pycache__/bindings.cpython-39.pyc | Bin 10729 -> 10729 bytes .../__pycache__/low_level.cpython-39.pyc | Bin 9178 -> 9178 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 319 -> 319 bytes .../packages/__pycache__/six.cpython-39.pyc | Bin 27589 -> 27589 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 216 -> 216 bytes .../__pycache__/makefile.cpython-39.pyc | Bin 1314 -> 1314 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 578 -> 578 bytes .../_implementation.cpython-39.pyc | Bin 3309 -> 3309 bytes .../util/__pycache__/__init__.cpython-39.pyc | Bin 1115 -> 1115 bytes .../__pycache__/connection.cpython-39.pyc | Bin 3467 -> 3467 bytes .../util/__pycache__/proxy.cpython-39.pyc | Bin 1351 -> 1351 bytes .../util/__pycache__/queue.cpython-39.pyc | Bin 1070 -> 1070 bytes .../util/__pycache__/request.cpython-39.pyc | Bin 3458 -> 3458 bytes .../util/__pycache__/response.cpython-39.pyc | Bin 2355 -> 2355 bytes .../util/__pycache__/retry.cpython-39.pyc | Bin 15842 -> 15842 bytes .../util/__pycache__/ssl_.cpython-39.pyc | Bin 11339 -> 11339 bytes .../__pycache__/ssltransport.cpython-39.pyc | Bin 7520 -> 7520 bytes .../util/__pycache__/timeout.cpython-39.pyc | Bin 8953 -> 8953 bytes .../util/__pycache__/url.cpython-39.pyc | Bin 10678 -> 10678 bytes .../util/__pycache__/wait.cpython-39.pyc | Bin 3138 -> 3138 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 9729 -> 9729 bytes .../__pycache__/labels.cpython-39.pyc | Bin 3843 -> 3843 bytes .../__pycache__/mklabels.cpython-39.pyc | Bin 1913 -> 1913 bytes .../__pycache__/tests.cpython-39.pyc | Bin 5077 -> 5077 bytes .../__pycache__/x_user_defined.cpython-39.pyc | Bin 2673 -> 2673 bytes .../tk-0.1.0.dist-info/INSTALLER | 1 + .../site-packages/tk-0.1.0.dist-info/LICENSE | 21 + .../site-packages/tk-0.1.0.dist-info/METADATA | 21 + .../site-packages/tk-0.1.0.dist-info/RECORD | 15 + .../tk-0.1.0.dist-info/REQUESTED | 0 .../site-packages/tk-0.1.0.dist-info/WHEEL | 5 + .../tk-0.1.0.dist-info/top_level.txt | 1 + .../python3.9/site-packages/tk/__init__.py | 0 .../tk/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 180 bytes .../site-packages/tk/structure/Tensor.py | 98 + .../site-packages/tk/structure/TensorMap.py | 76 + .../site-packages/tk/structure/__init__.py | 0 .../__pycache__/Tensor.cpython-39.pyc | Bin 0 -> 3546 bytes .../__pycache__/TensorMap.cpython-39.pyc | Bin 0 -> 2773 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 190 bytes .../yapf-0.31.0.dist-info/AUTHORS | 9 + .../yapf-0.31.0.dist-info/INSTALLER | 1 + .../yapf-0.31.0.dist-info/LICENSE | 202 ++ .../yapf-0.31.0.dist-info/METADATA | 1026 ++++++ .../yapf-0.31.0.dist-info/RECORD | 109 + .../yapf-0.31.0.dist-info/REQUESTED | 0 .../site-packages/yapf-0.31.0.dist-info/WHEEL | 6 + .../yapf-0.31.0.dist-info/entry_points.txt | 4 + .../yapf-0.31.0.dist-info/top_level.txt | 2 + .../python3.9/site-packages/yapf/__init__.py | 369 ++ .../python3.9/site-packages/yapf/__main__.py | 18 + .../yapf/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 9680 bytes .../yapf/__pycache__/__main__.cpython-39.pyc | Bin 0 -> 252 bytes .../site-packages/yapf/yapflib/__init__.py | 13 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 190 bytes .../blank_line_calculator.cpython-39.pyc | Bin 0 -> 5529 bytes .../comment_splicer.cpython-39.pyc | Bin 0 -> 6861 bytes .../continuation_splicer.cpython-39.pyc | Bin 0 -> 1424 bytes .../yapflib/__pycache__/errors.cpython-39.pyc | Bin 0 -> 576 bytes .../__pycache__/file_resources.cpython-39.pyc | Bin 0 -> 7302 bytes .../format_decision_state.cpython-39.pyc | Bin 0 -> 26596 bytes .../__pycache__/format_token.cpython-39.pyc | Bin 0 -> 12880 bytes .../identify_container.cpython-39.pyc | Bin 0 -> 1827 bytes .../__pycache__/line_joiner.cpython-39.pyc | Bin 0 -> 2701 bytes .../__pycache__/object_state.cpython-39.pyc | Bin 0 -> 9330 bytes .../__pycache__/py3compat.cpython-39.pyc | Bin 0 -> 3054 bytes .../pytree_unwrapper.cpython-39.pyc | Bin 0 -> 12902 bytes .../__pycache__/pytree_utils.cpython-39.pyc | Bin 0 -> 9348 bytes .../__pycache__/pytree_visitor.cpython-39.pyc | Bin 0 -> 4749 bytes .../__pycache__/reformatter.cpython-39.pyc | Bin 0 -> 18388 bytes .../__pycache__/split_penalty.cpython-39.pyc | Bin 0 -> 16477 bytes .../yapflib/__pycache__/style.cpython-39.pyc | Bin 0 -> 23350 bytes .../subtype_assigner.cpython-39.pyc | Bin 0 -> 14166 bytes .../__pycache__/unwrapped_line.cpython-39.pyc | Bin 0 -> 13922 bytes .../__pycache__/verifier.cpython-39.pyc | Bin 0 -> 2395 bytes .../__pycache__/yapf_api.cpython-39.pyc | Bin 0 -> 9332 bytes .../yapf/yapflib/blank_line_calculator.py | 177 + .../yapf/yapflib/comment_splicer.py | 365 ++ .../yapf/yapflib/continuation_splicer.py | 52 + .../site-packages/yapf/yapflib/errors.py | 23 + .../yapf/yapflib/file_resources.py | 265 ++ .../yapf/yapflib/format_decision_state.py | 1254 +++++++ .../yapf/yapflib/format_token.py | 385 ++ .../yapf/yapflib/identify_container.py | 67 + .../site-packages/yapf/yapflib/line_joiner.py | 109 + .../yapf/yapflib/object_state.py | 235 ++ .../site-packages/yapf/yapflib/py3compat.py | 131 + .../yapf/yapflib/pytree_unwrapper.py | 424 +++ .../yapf/yapflib/pytree_utils.py | 346 ++ .../yapf/yapflib/pytree_visitor.py | 135 + .../site-packages/yapf/yapflib/reformatter.py | 800 +++++ .../yapf/yapflib/split_penalty.py | 629 ++++ .../site-packages/yapf/yapflib/style.py | 849 +++++ .../yapf/yapflib/subtype_assigner.py | 509 +++ .../yapf/yapflib/unwrapped_line.py | 673 ++++ .../site-packages/yapf/yapflib/verifier.py | 93 + .../site-packages/yapf/yapflib/yapf_api.py | 319 ++ .../site-packages/yapftests/__init__.py | 13 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 187 bytes .../blank_line_calculator_test.cpython-39.pyc | Bin 0 -> 8658 bytes .../comment_splicer_test.cpython-39.pyc | Bin 0 -> 8787 bytes .../file_resources_test.cpython-39.pyc | Bin 0 -> 16551 bytes .../format_decision_state_test.cpython-39.pyc | Bin 0 -> 3113 bytes .../format_token_test.cpython-39.pyc | Bin 0 -> 2502 bytes .../line_joiner_test.cpython-39.pyc | Bin 0 -> 2999 bytes .../__pycache__/main_test.cpython-39.pyc | Bin 0 -> 5535 bytes .../pytree_unwrapper_test.cpython-39.pyc | Bin 0 -> 9291 bytes .../pytree_utils_test.cpython-39.pyc | Bin 0 -> 7300 bytes .../pytree_visitor_test.cpython-39.pyc | Bin 0 -> 3644 bytes .../reformatter_basic_test.cpython-39.pyc | Bin 0 -> 93792 bytes .../reformatter_buganizer_test.cpython-39.pyc | Bin 0 -> 80278 bytes .../reformatter_facebook_test.cpython-39.pyc | Bin 0 -> 14220 bytes .../reformatter_pep8_test.cpython-39.pyc | Bin 0 -> 29256 bytes .../reformatter_python3_test.cpython-39.pyc | Bin 0 -> 12996 bytes ...formatter_style_config_test.cpython-39.pyc | Bin 0 -> 6107 bytes .../reformatter_verify_test.cpython-39.pyc | Bin 0 -> 3195 bytes .../split_penalty_test.cpython-39.pyc | Bin 0 -> 4796 bytes .../__pycache__/style_test.cpython-39.pyc | Bin 0 -> 12784 bytes .../subtype_assigner_test.cpython-39.pyc | Bin 0 -> 6356 bytes .../unwrapped_line_test.cpython-39.pyc | Bin 0 -> 3943 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 1432 bytes .../__pycache__/yapf_test.cpython-39.pyc | Bin 0 -> 56072 bytes .../yapf_test_helper.cpython-39.pyc | Bin 0 -> 2390 bytes .../yapftests/blank_line_calculator_test.py | 422 +++ .../yapftests/comment_splicer_test.py | 334 ++ .../yapftests/file_resources_test.py | 493 +++ .../yapftests/format_decision_state_test.py | 145 + .../yapftests/format_token_test.py | 88 + .../yapftests/line_joiner_test.py | 82 + .../site-packages/yapftests/main_test.py | 144 + .../yapftests/pytree_unwrapper_test.py | 356 ++ .../yapftests/pytree_utils_test.py | 205 ++ .../yapftests/pytree_visitor_test.py | 120 + .../yapftests/reformatter_basic_test.py | 3140 +++++++++++++++++ .../yapftests/reformatter_buganizer_test.py | 2350 ++++++++++++ .../yapftests/reformatter_facebook_test.py | 432 +++ .../yapftests/reformatter_pep8_test.py | 919 +++++ .../yapftests/reformatter_python3_test.py | 471 +++ .../reformatter_style_config_test.py | 198 ++ .../yapftests/reformatter_verify_test.py | 108 + .../yapftests/split_penalty_test.py | 266 ++ .../site-packages/yapftests/style_test.py | 336 ++ .../yapftests/subtype_assigner_test.py | 304 ++ .../yapftests/unwrapped_line_test.py | 96 + .../site-packages/yapftests/utils.py | 89 + .../site-packages/yapftests/yapf_test.py | 2038 +++++++++++ .../yapftests/yapf_test_helper.py | 89 + 527 files changed, 23975 insertions(+), 827 deletions(-) create mode 100644 .venv/bin/yapf create mode 100644 .venv/bin/yapf-diff delete mode 100644 .venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/RECORD rename .venv/lib/python3.9/site-packages/{pip-21.2.3.dist-info => pip-21.2.4.dist-info}/INSTALLER (100%) rename .venv/lib/python3.9/site-packages/{pip-21.2.3.dist-info => pip-21.2.4.dist-info}/LICENSE.txt (100%) rename .venv/lib/python3.9/site-packages/{pip-21.2.3.dist-info => pip-21.2.4.dist-info}/METADATA (99%) create mode 100644 .venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/RECORD rename .venv/lib/python3.9/site-packages/{pip-21.2.3.dist-info => pip-21.2.4.dist-info}/REQUESTED (100%) rename .venv/lib/python3.9/site-packages/{pip-21.2.3.dist-info => pip-21.2.4.dist-info}/WHEEL (100%) rename .venv/lib/python3.9/site-packages/{pip-21.2.3.dist-info => pip-21.2.4.dist-info}/entry_points.txt (70%) rename .venv/lib/python3.9/site-packages/{pip-21.2.3.dist-info => pip-21.2.4.dist-info}/top_level.txt (100%) create mode 100644 .venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/LICENSE create mode 100644 .venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/METADATA create mode 100644 .venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/RECORD create mode 100644 .venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/REQUESTED create mode 100644 .venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/top_level.txt create mode 100644 .venv/lib/python3.9/site-packages/tk/__init__.py create mode 100644 .venv/lib/python3.9/site-packages/tk/__pycache__/__init__.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/tk/structure/Tensor.py create mode 100644 .venv/lib/python3.9/site-packages/tk/structure/TensorMap.py create mode 100644 .venv/lib/python3.9/site-packages/tk/structure/__init__.py create mode 100644 .venv/lib/python3.9/site-packages/tk/structure/__pycache__/Tensor.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/tk/structure/__pycache__/TensorMap.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/tk/structure/__pycache__/__init__.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/AUTHORS create mode 100644 .venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/LICENSE create mode 100644 .venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/METADATA create mode 100644 .venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/RECORD create mode 100644 .venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/REQUESTED create mode 100644 .venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/top_level.txt create mode 100644 .venv/lib/python3.9/site-packages/yapf/__init__.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/__main__.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/__pycache__/__init__.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/__pycache__/__main__.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__init__.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/__init__.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/blank_line_calculator.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/comment_splicer.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/continuation_splicer.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/errors.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/file_resources.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/format_decision_state.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/format_token.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/identify_container.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/line_joiner.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/object_state.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/py3compat.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/pytree_unwrapper.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/pytree_utils.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/pytree_visitor.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/reformatter.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/split_penalty.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/style.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/subtype_assigner.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/unwrapped_line.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/verifier.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/yapf_api.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/blank_line_calculator.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/comment_splicer.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/continuation_splicer.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/errors.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/file_resources.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/format_decision_state.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/format_token.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/identify_container.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/line_joiner.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/object_state.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/py3compat.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/pytree_unwrapper.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/pytree_utils.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/pytree_visitor.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/reformatter.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/split_penalty.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/style.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/subtype_assigner.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/unwrapped_line.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/verifier.py create mode 100644 .venv/lib/python3.9/site-packages/yapf/yapflib/yapf_api.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__init__.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/__init__.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/blank_line_calculator_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/comment_splicer_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/file_resources_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/format_decision_state_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/format_token_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/line_joiner_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/main_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/pytree_unwrapper_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/pytree_utils_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/pytree_visitor_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_basic_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_buganizer_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_facebook_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_pep8_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_python3_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_style_config_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_verify_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/split_penalty_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/style_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/subtype_assigner_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/unwrapped_line_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/utils.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/yapf_test.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/__pycache__/yapf_test_helper.cpython-39.pyc create mode 100644 .venv/lib/python3.9/site-packages/yapftests/blank_line_calculator_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/comment_splicer_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/file_resources_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/format_decision_state_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/format_token_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/line_joiner_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/main_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/pytree_unwrapper_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/pytree_utils_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/pytree_visitor_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/reformatter_basic_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/reformatter_buganizer_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/reformatter_facebook_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/reformatter_pep8_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/reformatter_python3_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/reformatter_style_config_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/reformatter_verify_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/split_penalty_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/style_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/subtype_assigner_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/unwrapped_line_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/utils.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/yapf_test.py create mode 100644 .venv/lib/python3.9/site-packages/yapftests/yapf_test_helper.py diff --git a/.venv/bin/pip b/.venv/bin/pip index eaeaf9c9..f4c567f3 100644 --- a/.venv/bin/pip +++ b/.venv/bin/pip @@ -1,4 +1,4 @@ -#!/run/media/kristofers/Disk/Pyhton/School/.venv/bin/python3 +#!/run/media/kristofers/Disk/Pyhton/School/.venv/bin/python # -*- coding: utf-8 -*- import re import sys diff --git a/.venv/bin/pip3 b/.venv/bin/pip3 index eaeaf9c9..f4c567f3 100644 --- a/.venv/bin/pip3 +++ b/.venv/bin/pip3 @@ -1,4 +1,4 @@ -#!/run/media/kristofers/Disk/Pyhton/School/.venv/bin/python3 +#!/run/media/kristofers/Disk/Pyhton/School/.venv/bin/python # -*- coding: utf-8 -*- import re import sys diff --git a/.venv/bin/pip3.9 b/.venv/bin/pip3.9 index eaeaf9c9..f4c567f3 100644 --- a/.venv/bin/pip3.9 +++ b/.venv/bin/pip3.9 @@ -1,4 +1,4 @@ -#!/run/media/kristofers/Disk/Pyhton/School/.venv/bin/python3 +#!/run/media/kristofers/Disk/Pyhton/School/.venv/bin/python # -*- coding: utf-8 -*- import re import sys diff --git a/.venv/bin/yapf b/.venv/bin/yapf new file mode 100644 index 00000000..e07c6de1 --- /dev/null +++ b/.venv/bin/yapf @@ -0,0 +1,8 @@ +#!/run/media/kristofers/Disk/Pyhton/School/.venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from yapf import run_main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(run_main()) diff --git a/.venv/bin/yapf-diff b/.venv/bin/yapf-diff new file mode 100644 index 00000000..db9b071e --- /dev/null +++ b/.venv/bin/yapf-diff @@ -0,0 +1,8 @@ +#!/run/media/kristofers/Disk/Pyhton/School/.venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from yapf.third_party.yapf_diff.yapf_diff import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/RECORD b/.venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/RECORD deleted file mode 100644 index 2b3b9a14..00000000 --- a/.venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/RECORD +++ /dev/null @@ -1,795 +0,0 @@ -../../../bin/pip,sha256=y_LiDjdh7P04irliSOvGNInZFHu9gdSi3jL1ZJLPwxM,263 -../../../bin/pip3,sha256=y_LiDjdh7P04irliSOvGNInZFHu9gdSi3jL1ZJLPwxM,263 -../../../bin/pip3.9,sha256=y_LiDjdh7P04irliSOvGNInZFHu9gdSi3jL1ZJLPwxM,263 -pip-21.2.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip-21.2.3.dist-info/LICENSE.txt,sha256=gJDJthjxG8mDPXZg96yUjnIt4bce2hULfec5mrfNnmI,1110 -pip-21.2.3.dist-info/METADATA,sha256=BA4M-MqDkwwNoSPm1cVEoleu3sEr_iN4HbpM3cjr6rI,4165 -pip-21.2.3.dist-info/RECORD,, -pip-21.2.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip-21.2.3.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 -pip-21.2.3.dist-info/entry_points.txt,sha256=HtfDOwpUlr9s73jqLQ6wF9V0_0qvUXJwCBz7Vwx0Ue0,125 -pip-21.2.3.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip/__init__.py,sha256=qXU49Q5cd1uydhWo2AnReaOxEtM0o8t5EP9EvhtRCN8,370 -pip/__main__.py,sha256=8mTMucDffyV05KR_fXWM2p1JQEnHPu1-CWjbthYHYis,1229 -pip/__pycache__/__init__.cpython-39.pyc,, -pip/__pycache__/__main__.cpython-39.pyc,, -pip/_internal/__init__.py,sha256=OLxitHt9NAlSaObDjAlRSYUkAftIjV9sUpv1yIZDO4E,592 -pip/_internal/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/__pycache__/build_env.cpython-39.pyc,, -pip/_internal/__pycache__/cache.cpython-39.pyc,, -pip/_internal/__pycache__/configuration.cpython-39.pyc,, -pip/_internal/__pycache__/exceptions.cpython-39.pyc,, -pip/_internal/__pycache__/main.cpython-39.pyc,, -pip/_internal/__pycache__/pyproject.cpython-39.pyc,, -pip/_internal/__pycache__/self_outdated_check.cpython-39.pyc,, -pip/_internal/__pycache__/wheel_builder.cpython-39.pyc,, -pip/_internal/build_env.py,sha256=YMIinJTDdKm_x5JC8IjJZp-_Zw42kBm6fkiWprBi-Hk,10415 -pip/_internal/cache.py,sha256=bjyh33eOAq6kX1kPk84Oxb_JXazpP6izVZipJLq0eJI,10245 -pip/_internal/cli/__init__.py,sha256=9gMw_A_StJXzDh2Rhxil6bd8tFP-ZR719Q1pINHAw5I,136 -pip/_internal/cli/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/cli/__pycache__/autocompletion.cpython-39.pyc,, -pip/_internal/cli/__pycache__/base_command.cpython-39.pyc,, -pip/_internal/cli/__pycache__/cmdoptions.cpython-39.pyc,, -pip/_internal/cli/__pycache__/command_context.cpython-39.pyc,, -pip/_internal/cli/__pycache__/main.cpython-39.pyc,, -pip/_internal/cli/__pycache__/main_parser.cpython-39.pyc,, -pip/_internal/cli/__pycache__/parser.cpython-39.pyc,, -pip/_internal/cli/__pycache__/progress_bars.cpython-39.pyc,, -pip/_internal/cli/__pycache__/req_command.cpython-39.pyc,, -pip/_internal/cli/__pycache__/spinners.cpython-39.pyc,, -pip/_internal/cli/__pycache__/status_codes.cpython-39.pyc,, -pip/_internal/cli/autocompletion.py,sha256=_d6Ugrj-KQOCoDgDscSr_238-RcwedXzpLmW8F_L_uc,6562 -pip/_internal/cli/base_command.py,sha256=mZH7AMA9tBoiYEysFx9l3Pe_h23mnNZy8K8M_ZhsRSs,7810 -pip/_internal/cli/cmdoptions.py,sha256=Kalu7Z2ZAvySgOOIo4e_Ah3Vv8HDmGhLQlkDysI-ihw,29292 -pip/_internal/cli/command_context.py,sha256=ocjEqsuP6pFF98N_ljRyLToYLm5fBgMaZicVjMy_f0Y,787 -pip/_internal/cli/main.py,sha256=D6DAuHgfr4na5SuEbtLyx1FlZhcGHIB9BltXsjrrKsA,2542 -pip/_internal/cli/main_parser.py,sha256=rusU-JYOLpcJ8cFXWiPvuDoNpTptRlndY3WyBh2UXq4,2701 -pip/_internal/cli/parser.py,sha256=0eTD4_7ucvjv_VnZajerOhzHUAIOju5KDlQM0rv5VP4,11080 -pip/_internal/cli/progress_bars.py,sha256=-bhkKHcjsZ0tWdf-DH9eGHsJuGedVPih8E0vV2_rJXg,8550 -pip/_internal/cli/req_command.py,sha256=_9w-fMnI0j8bey7mryr-iLxjCoUT_jIU3lkNp2PQJVU,17001 -pip/_internal/cli/spinners.py,sha256=rQJtl8c9JiMpOCsOk-YRFYtWdhiFoFectJuryMM-jn4,5233 -pip/_internal/cli/status_codes.py,sha256=1xaB32lG8Nf1nMl_6e0yy5z2Iyvv81OTUpuHwXgGsfU,122 -pip/_internal/commands/__init__.py,sha256=LoscneenHTO4OCqGIah4KtHyPNURU6F7bUeGRjbcr_k,3888 -pip/_internal/commands/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/commands/__pycache__/cache.cpython-39.pyc,, -pip/_internal/commands/__pycache__/check.cpython-39.pyc,, -pip/_internal/commands/__pycache__/completion.cpython-39.pyc,, -pip/_internal/commands/__pycache__/configuration.cpython-39.pyc,, -pip/_internal/commands/__pycache__/debug.cpython-39.pyc,, -pip/_internal/commands/__pycache__/download.cpython-39.pyc,, -pip/_internal/commands/__pycache__/freeze.cpython-39.pyc,, -pip/_internal/commands/__pycache__/hash.cpython-39.pyc,, -pip/_internal/commands/__pycache__/help.cpython-39.pyc,, -pip/_internal/commands/__pycache__/index.cpython-39.pyc,, -pip/_internal/commands/__pycache__/install.cpython-39.pyc,, -pip/_internal/commands/__pycache__/list.cpython-39.pyc,, -pip/_internal/commands/__pycache__/search.cpython-39.pyc,, -pip/_internal/commands/__pycache__/show.cpython-39.pyc,, -pip/_internal/commands/__pycache__/uninstall.cpython-39.pyc,, -pip/_internal/commands/__pycache__/wheel.cpython-39.pyc,, -pip/_internal/commands/cache.py,sha256=XqHqGkiyZ6A0Vf0oIGJhWiNY4k9JIC0nlNmooiaCtuo,7453 -pip/_internal/commands/check.py,sha256=FZ7IHeRkwnWkwgdaMI1AjFPcI4xrPK4_4jODp8aDyiA,1617 -pip/_internal/commands/completion.py,sha256=RXEru4uYaBfUUtZJ2bLE7s6FJUe9t1BAVSUQ8wPzW0o,3005 -pip/_internal/commands/configuration.py,sha256=1Fr4QLwdu1OcBL_FZQh6uY3i7i38qI70OJGG-JhoUuI,9228 -pip/_internal/commands/debug.py,sha256=Bb2Lxzn7XEQRYgBYOZbuK3EYeLphKHo8Gubg_EZ6JnU,6851 -pip/_internal/commands/download.py,sha256=sT3gInhPvMyhuZ-rVBf1OlpLzh52J0hStM57_CPdvCA,5088 -pip/_internal/commands/freeze.py,sha256=xzVjiTJT5DBJceJPNnAYyCF4oGITyuSpfsfkSKR70Fg,2869 -pip/_internal/commands/hash.py,sha256=XoLZ3Hx_b72asRLGOe1WXSvJ6ClwSFhn-aFPgbcB9Zk,1719 -pip/_internal/commands/help.py,sha256=zV8LmdIbJOnVOIZTz1TwlNWQZQLEWZnJGwXSSh9SSEw,1173 -pip/_internal/commands/index.py,sha256=qTchSIS-zCEiJCrZ9X-o5_93kMYCSVZDRTmeY_fhOOE,4920 -pip/_internal/commands/install.py,sha256=oj_4a73RMGXgmFQV1jUZEZTnvnZw5kkT6pA3naYj3PA,28243 -pip/_internal/commands/list.py,sha256=1K-dhUMEs8akjPE16n5Eq9GsalONKkS7bvWwSCNzQe8,12090 -pip/_internal/commands/search.py,sha256=Dtebo30wNJJ0Blr5MkmiET1wIuNioxzoH8vR82ma7Tc,5707 -pip/_internal/commands/show.py,sha256=G-ak6SZS-H2MJqQI89D2x4TLd8l9amVYhtaa5dhCFeE,8208 -pip/_internal/commands/uninstall.py,sha256=sTUTiJSTp0NKeFHUBJHD3f-fSVPGFjBY6go_DhpvC0Q,3580 -pip/_internal/commands/wheel.py,sha256=dIRE7v6g9HTpTw0nsOG2HHoG0uvwrWV5-xyp0kuJdhU,6365 -pip/_internal/configuration.py,sha256=g_C1ByxxCGrYfY26B-X8v-3mbUwzlXdj9EKwDs-0kH0,14128 -pip/_internal/distributions/__init__.py,sha256=99Rzk077wS5wGire_mchcAjtJG9vbwTLPXZKLWrh_D4,879 -pip/_internal/distributions/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/distributions/__pycache__/base.cpython-39.pyc,, -pip/_internal/distributions/__pycache__/installed.cpython-39.pyc,, -pip/_internal/distributions/__pycache__/sdist.cpython-39.pyc,, -pip/_internal/distributions/__pycache__/wheel.cpython-39.pyc,, -pip/_internal/distributions/base.py,sha256=VCEqCFm36o5SSpu3esHmM055Wv5TOxGFLXtxpY8m-L8,1244 -pip/_internal/distributions/installed.py,sha256=UZU2Q4-jcAaPexNZzqk5YXhols1jTjyh4xAA0ZQ_A8g,667 -pip/_internal/distributions/sdist.py,sha256=5OpYaS51ll8tqsZC-h86ij62RQkid3YZEOqUXCRq8TA,3957 -pip/_internal/distributions/wheel.py,sha256=8lzZqqpA5oUUHANOZlf0qcKLIunsJ3K821VP29hLYdg,1217 -pip/_internal/exceptions.py,sha256=yiMEmKFvLIPNGaLCQxxtnacfNhUisQayQ4XiqPuRLZU,13567 -pip/_internal/index/__init__.py,sha256=x0ifDyFChwwQC4V_eHBFF1fvzLwbXRYG3nq15-Axy24,32 -pip/_internal/index/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/index/__pycache__/collector.cpython-39.pyc,, -pip/_internal/index/__pycache__/package_finder.cpython-39.pyc,, -pip/_internal/index/__pycache__/sources.cpython-39.pyc,, -pip/_internal/index/collector.py,sha256=pB-NFZkI-KjQnhTBo7JzArphtu6OVJ52WVQlFQrSbFU,18179 -pip/_internal/index/package_finder.py,sha256=k7qar-7Lw778ODq0iB-ETXjof-MUhRh4YHXsVNjl6eo,37120 -pip/_internal/index/sources.py,sha256=SW2LlD5eAF2Rj74TbpEUNjADU9UH-K76oqgJFNtDlWc,6781 -pip/_internal/locations/__init__.py,sha256=bReITFXFSX786ngLRJhXhsb1npYOw8YbpOuOngrQUik,11584 -pip/_internal/locations/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/locations/__pycache__/_distutils.cpython-39.pyc,, -pip/_internal/locations/__pycache__/_sysconfig.cpython-39.pyc,, -pip/_internal/locations/__pycache__/base.cpython-39.pyc,, -pip/_internal/locations/_distutils.py,sha256=OUPuNiGJP2vmiYgwdAR-ZQryj_2yANs9DebSm4afDZU,6040 -pip/_internal/locations/_sysconfig.py,sha256=sJJD4PQujUcLAaKiOeXYsILmQb0-hjznP79PzKPiA4Q,8137 -pip/_internal/locations/base.py,sha256=KMpxtATY6iOshQ3AimpymGTy81zK-pM1CWPemJQ0mj4,1631 -pip/_internal/main.py,sha256=yXF5_lVS3QQTxrbbvNk31juR2E1_16H1iu-xuXAod9o,364 -pip/_internal/metadata/__init__.py,sha256=p3NvOGG_3quhV9bOlDPvWSAEByPsdn63cO4FrsFubM0,1624 -pip/_internal/metadata/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/metadata/__pycache__/base.cpython-39.pyc,, -pip/_internal/metadata/__pycache__/pkg_resources.cpython-39.pyc,, -pip/_internal/metadata/base.py,sha256=dCfs9XIcicyYSoFtVtzq6rFvduUYNdV6U_EDDlG4yJ0,8170 -pip/_internal/metadata/pkg_resources.py,sha256=azUoAkvyF-h80pORd0czY4-fWUIRe_z3i2qNHuKiSjE,5353 -pip/_internal/models/__init__.py,sha256=j2kiRfNTH6h5JVP5yO_N2Yn0DqiNzJUtaPjHe2xMcgg,65 -pip/_internal/models/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/models/__pycache__/candidate.cpython-39.pyc,, -pip/_internal/models/__pycache__/direct_url.cpython-39.pyc,, -pip/_internal/models/__pycache__/format_control.cpython-39.pyc,, -pip/_internal/models/__pycache__/index.cpython-39.pyc,, -pip/_internal/models/__pycache__/link.cpython-39.pyc,, -pip/_internal/models/__pycache__/scheme.cpython-39.pyc,, -pip/_internal/models/__pycache__/search_scope.cpython-39.pyc,, -pip/_internal/models/__pycache__/selection_prefs.cpython-39.pyc,, -pip/_internal/models/__pycache__/target_python.cpython-39.pyc,, -pip/_internal/models/__pycache__/wheel.cpython-39.pyc,, -pip/_internal/models/candidate.py,sha256=L4nKS2HIgdOfbylU-2MIO2APVWEWueJpHu_gcwO0iH4,977 -pip/_internal/models/direct_url.py,sha256=36n2ed5kddmPLhNLh4b1GzGr36dUdSgl23Xrbcxd_ck,6482 -pip/_internal/models/format_control.py,sha256=PZ5PExPrxArZWzzPFATSj6W07UqvxjtrMBgFNAUxae4,2641 -pip/_internal/models/index.py,sha256=vqgOrXoZqQW4AA928wBmEGjKbxjeb-_NALLGZH0kMXY,1090 -pip/_internal/models/link.py,sha256=SrRPbWmpzWh1LfQd-eurbYAuMvOvpD5fzMvNDlRFpQ8,10227 -pip/_internal/models/scheme.py,sha256=moDcYk85amZUkf6Je5TDvXh4xMHxsSgf8rkD1ykpQhU,769 -pip/_internal/models/search_scope.py,sha256=D_Q6xSo1dTjSRljshHz_xVe4vXXivl2H7_rtj0dSHpU,4600 -pip/_internal/models/selection_prefs.py,sha256=0DZIWNPT8q2EiuqZCAQxczCoVnbs9_C4zugNfhNnvaw,1923 -pip/_internal/models/target_python.py,sha256=NUm2Ua7qbJHFK0UzKAlfHixudx4-FgmAFKPKf3B2RyU,3981 -pip/_internal/models/wheel.py,sha256=NLmn_y8dVc5vfTcAYw3EfS692hAF9MPPMDr5wTBu_4E,3633 -pip/_internal/network/__init__.py,sha256=IEtuAPVGqBTS0C7M0KJ95xqGcA76coOc2AsDcgIBP-8,52 -pip/_internal/network/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/network/__pycache__/auth.cpython-39.pyc,, -pip/_internal/network/__pycache__/cache.cpython-39.pyc,, -pip/_internal/network/__pycache__/download.cpython-39.pyc,, -pip/_internal/network/__pycache__/lazy_wheel.cpython-39.pyc,, -pip/_internal/network/__pycache__/session.cpython-39.pyc,, -pip/_internal/network/__pycache__/utils.cpython-39.pyc,, -pip/_internal/network/__pycache__/xmlrpc.cpython-39.pyc,, -pip/_internal/network/auth.py,sha256=820jI8SAsVfNnfoOfxfH7HaGVFtYX_M8vsHEtiHCS14,11961 -pip/_internal/network/cache.py,sha256=KfaWDbALIGsUnP4qi1MfvKSpCJ0vlC5lviELSTNKLtQ,2169 -pip/_internal/network/download.py,sha256=-EnS83XhpNVRsfB107nYU-OPZsHd29QQdG6lNokemAk,6200 -pip/_internal/network/lazy_wheel.py,sha256=LFVwrv2nHpwr0pl17i-3sbEAedJjraaLdRTFRfS23vo,7825 -pip/_internal/network/session.py,sha256=9KBZpMGrtEmek4iPgpZiLEBgyxQ6bPH3yUUxNbEEQ54,17036 -pip/_internal/network/utils.py,sha256=K4d2srYGzR_tz5vVBbKFC7rBWA-G_DqqX9io2flIrI0,4155 -pip/_internal/network/xmlrpc.py,sha256=oFCngChTOtIVcc55ExwdX1HJcPvL-6PKMNl5ok6nMQk,1851 -pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/operations/__pycache__/check.cpython-39.pyc,, -pip/_internal/operations/__pycache__/freeze.cpython-39.pyc,, -pip/_internal/operations/__pycache__/prepare.cpython-39.pyc,, -pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/build/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/operations/build/__pycache__/metadata.cpython-39.pyc,, -pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-39.pyc,, -pip/_internal/operations/build/__pycache__/wheel.cpython-39.pyc,, -pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-39.pyc,, -pip/_internal/operations/build/metadata.py,sha256=-06VLFRgwxsIuqHL_56NxXdn7TQuZHeaL4RYXDnjB18,1200 -pip/_internal/operations/build/metadata_legacy.py,sha256=1V8i8VVGUF7GauyS_KPEhcl7dIwrocD6lyT5kWvXkBA,1991 -pip/_internal/operations/build/wheel.py,sha256=r2IKZgek1REUjP4xA0RLEG5O1-HsPZtzfy7q7W3_nhQ,1144 -pip/_internal/operations/build/wheel_legacy.py,sha256=4ddx179dnTTHJertW50M6869gchuyrNEdYcyWe4w5Yg,3337 -pip/_internal/operations/check.py,sha256=eCLrRScb_ZJDxTK9rMjU5kbLuu1xRngdoLxATNPuPQE,5448 -pip/_internal/operations/freeze.py,sha256=WEglEwdf9rD9M6jGzMyRVhiN-WF8p-hhiHGnwsWlDDc,10833 -pip/_internal/operations/install/__init__.py,sha256=Zug2xxRJjeI2LdVd45iwmeavUBYXA4ltbhFFwc4BEOg,53 -pip/_internal/operations/install/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/operations/install/__pycache__/editable_legacy.cpython-39.pyc,, -pip/_internal/operations/install/__pycache__/legacy.cpython-39.pyc,, -pip/_internal/operations/install/__pycache__/wheel.cpython-39.pyc,, -pip/_internal/operations/install/editable_legacy.py,sha256=FhvBds_MF_Flabnylh6EVwCD3mFDxa-RmdKq3jl5JGM,1443 -pip/_internal/operations/install/legacy.py,sha256=xyGakzR-Xnfa9H37-OzT6cKH-AQMsctBkFxfUr3jlvw,4537 -pip/_internal/operations/install/wheel.py,sha256=oV6IB77355YCaI_ta4mqWXyHlkQF8OqBRZAdq8jpQYs,30269 -pip/_internal/operations/prepare.py,sha256=QB3-cmVD1agyO6_B9oiRs9HCQyyDMHF9pLTboLtufxo,25503 -pip/_internal/pyproject.py,sha256=DQoqc7F3HyFBO7fG82HOPsdP-GfEzfuqTUGOG0v2E1c,7246 -pip/_internal/req/__init__.py,sha256=5eiQnk8IiwtrWHU4r1ttcLy545MCrUdg5eRRq7_ZNz0,2925 -pip/_internal/req/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/req/__pycache__/constructors.cpython-39.pyc,, -pip/_internal/req/__pycache__/req_file.cpython-39.pyc,, -pip/_internal/req/__pycache__/req_install.cpython-39.pyc,, -pip/_internal/req/__pycache__/req_set.cpython-39.pyc,, -pip/_internal/req/__pycache__/req_tracker.cpython-39.pyc,, -pip/_internal/req/__pycache__/req_uninstall.cpython-39.pyc,, -pip/_internal/req/constructors.py,sha256=Izde_5pbxkMzDWN-khLufzKKpC0uaGNTPRO9ShWrud8,16300 -pip/_internal/req/req_file.py,sha256=RN04-oHRNn5xECciUcs0Gh3LxA1RdlVw1X6wbVs0r7k,17936 -pip/_internal/req/req_install.py,sha256=gIGZ3t9QzqCBoeL04my4DIuqM86j0i5nId6iwZIGYzQ,32517 -pip/_internal/req/req_set.py,sha256=yeKmy9-oH5tW2Oe7SHobrp9btcDBZ3DxdFJ3HqAKQ44,7762 -pip/_internal/req/req_tracker.py,sha256=tFN50kuTTWwpY0WJkPK6QCPUZePmUhaBbuKVSgkWl1A,4312 -pip/_internal/req/req_uninstall.py,sha256=T6n_Pgpljq30LLQ81Qs4kpPoxSuJUkUvbvG9b697rGs,24450 -pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/resolution/__pycache__/base.cpython-39.pyc,, -pip/_internal/resolution/base.py,sha256=qMuP4GV1NJU-81E3gUKzczQxzS-f_SWF0Dk59YVrH9A,575 -pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/legacy/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/resolution/legacy/__pycache__/resolver.cpython-39.pyc,, -pip/_internal/resolution/legacy/resolver.py,sha256=6nUm1wcBGRT58gUOu0-B0TE354XrCx_dexslaFtlDis,18005 -pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/base.cpython-39.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-39.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-39.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-39.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-39.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-39.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-39.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-39.pyc,, -pip/_internal/resolution/resolvelib/base.py,sha256=IWvd3KNMJtIqDLcqeUuGV4MbimM83JOofBKwggVYxzI,5434 -pip/_internal/resolution/resolvelib/candidates.py,sha256=a8-csKtuj_Bz8UeYgk2cz8mP1EOObTyXsZrCO8wq2Tc,19397 -pip/_internal/resolution/resolvelib/factory.py,sha256=clwGzM3_u3SReBwOOG9sAvcdd2pNqk03T5qrCyryeB4,27559 -pip/_internal/resolution/resolvelib/found_candidates.py,sha256=9kFfU_ZFugtCMaCIez6UYrG4hyfqwDaQYxP9db9XQvE,5427 -pip/_internal/resolution/resolvelib/provider.py,sha256=qXB9l3kjEca0orqTS2e6TGaWHJIn537kEqJYClBIShQ,8617 -pip/_internal/resolution/resolvelib/reporter.py,sha256=AwjzTX3LytVk9wuVS1LdJAk1V2kPhEdn1dE7MfrPwLM,2669 -pip/_internal/resolution/resolvelib/requirements.py,sha256=FKE-HcZmsljRrcLpr545XprOOqDd09149GjjF8AfTiw,5621 -pip/_internal/resolution/resolvelib/resolver.py,sha256=Bmwfy5pO8cLzI-13YMgWEAWwFlpjLKdKeCBHMrdWyWM,10795 -pip/_internal/self_outdated_check.py,sha256=cNOjZkFVtwJmftBZt34cH2j9SJ5Gd4vSbJY8FBYM6tg,6671 -pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/utils/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/utils/__pycache__/_log.cpython-39.pyc,, -pip/_internal/utils/__pycache__/appdirs.cpython-39.pyc,, -pip/_internal/utils/__pycache__/compat.cpython-39.pyc,, -pip/_internal/utils/__pycache__/compatibility_tags.cpython-39.pyc,, -pip/_internal/utils/__pycache__/datetime.cpython-39.pyc,, -pip/_internal/utils/__pycache__/deprecation.cpython-39.pyc,, -pip/_internal/utils/__pycache__/direct_url_helpers.cpython-39.pyc,, -pip/_internal/utils/__pycache__/distutils_args.cpython-39.pyc,, -pip/_internal/utils/__pycache__/encoding.cpython-39.pyc,, -pip/_internal/utils/__pycache__/entrypoints.cpython-39.pyc,, -pip/_internal/utils/__pycache__/filesystem.cpython-39.pyc,, -pip/_internal/utils/__pycache__/filetypes.cpython-39.pyc,, -pip/_internal/utils/__pycache__/glibc.cpython-39.pyc,, -pip/_internal/utils/__pycache__/hashes.cpython-39.pyc,, -pip/_internal/utils/__pycache__/inject_securetransport.cpython-39.pyc,, -pip/_internal/utils/__pycache__/logging.cpython-39.pyc,, -pip/_internal/utils/__pycache__/misc.cpython-39.pyc,, -pip/_internal/utils/__pycache__/models.cpython-39.pyc,, -pip/_internal/utils/__pycache__/packaging.cpython-39.pyc,, -pip/_internal/utils/__pycache__/parallel.cpython-39.pyc,, -pip/_internal/utils/__pycache__/pkg_resources.cpython-39.pyc,, -pip/_internal/utils/__pycache__/setuptools_build.cpython-39.pyc,, -pip/_internal/utils/__pycache__/subprocess.cpython-39.pyc,, -pip/_internal/utils/__pycache__/temp_dir.cpython-39.pyc,, -pip/_internal/utils/__pycache__/unpacking.cpython-39.pyc,, -pip/_internal/utils/__pycache__/urls.cpython-39.pyc,, -pip/_internal/utils/__pycache__/virtualenv.cpython-39.pyc,, -pip/_internal/utils/__pycache__/wheel.cpython-39.pyc,, -pip/_internal/utils/_log.py,sha256=t0zjUNjMLPYna4ZbL0MJB8wrxGdFvC8JsPs7f3UUdz0,1053 -pip/_internal/utils/appdirs.py,sha256=JKsp6Dlfk0BjBfni2Geq_uzpSycc8pV0Ap5A5qAwhag,1220 -pip/_internal/utils/compat.py,sha256=U1ofuQpRkcmWNtCsZccTK_24YsauhWl0KPDMnC69adM,1947 -pip/_internal/utils/compatibility_tags.py,sha256=f0RJ5Wb3Jj2T5z57i0RPLyoWNtqYvymealy3aUucrVU,5622 -pip/_internal/utils/datetime.py,sha256=NhzGBwpDdc5W1hX7-ynGHSFH5T8srUUPpFw6zOORiMM,253 -pip/_internal/utils/deprecation.py,sha256=onEDau8zZyztsQf5HjhHTckTChbXIIdOWRh_Ugz1PSQ,3304 -pip/_internal/utils/direct_url_helpers.py,sha256=7xVyieLJtD1SmB1xsNhIPsYBGIDK7AZGQUtfZyRi0tQ,3073 -pip/_internal/utils/distutils_args.py,sha256=fw5ZrUBHRy2IWgLciAKUl7RA4Ryu6jWL-M9LNv90V2k,1291 -pip/_internal/utils/encoding.py,sha256=3Hr_T_shHHq5EJmQg7sUCeNY37pvmxEmQay6aPsK_4o,1205 -pip/_internal/utils/entrypoints.py,sha256=Iq8laJFPEcErDlGcPIshG_-VrUmfwLB3_nLWlT1EIKI,1082 -pip/_internal/utils/filesystem.py,sha256=8UhURyTKl2R1l9TAnYXuULsGNNMkH9IBPHAoRy4QEaU,6075 -pip/_internal/utils/filetypes.py,sha256=0VA-FQmevfgw7_9OAe7YXjxB3DcYUxpUypVKERWlU_I,789 -pip/_internal/utils/glibc.py,sha256=6i1vPIDuLfV3vKQeFe2oUa9QjSHGVlOkvysujEldOEE,3262 -pip/_internal/utils/hashes.py,sha256=dV10-3U4kcopR-XrArkX6vFSiLS9uNOhPbrv8olu8Qw,5332 -pip/_internal/utils/inject_securetransport.py,sha256=Wa89Vhq5SdlBGreg8wdE40iDJGTouYEyFuugMrOVUI0,846 -pip/_internal/utils/logging.py,sha256=cRHg2gUYXEUknl_WzZ2Zdxxah485Gr69wl8TpymaAHc,12735 -pip/_internal/utils/misc.py,sha256=Zt509grPCYtfQEI16CHULTX9nW8eRXbBucPQQasuOYk,24472 -pip/_internal/utils/models.py,sha256=89bZ42cL0YJUmV9GCaFLfs4ZiG_cDW1udAHc6UTCI2c,1376 -pip/_internal/utils/packaging.py,sha256=xTyBldqCDRn0_v9CQizadbHd3ZUTgjXeElTxrJW_JKo,2989 -pip/_internal/utils/parallel.py,sha256=7IFve8sBfphARNXprnhhuSyzlxfdDWaMP3LTFwCUL9c,3325 -pip/_internal/utils/pkg_resources.py,sha256=bkYDe05U5fph4t8TO-q06fpHQwuzookJqP0MokucHWg,1146 -pip/_internal/utils/setuptools_build.py,sha256=tO48Mgcb28GJf3zmkQlzBvsRR-2hdrpm1dipXFBkyaE,5220 -pip/_internal/utils/subprocess.py,sha256=0GB0g9r2muHAnljX2s_sX-x805eWWoDtdN_9JcCwKu8,10324 -pip/_internal/utils/temp_dir.py,sha256=gFwfsfEtM-y5Lb9ZqpbP1wy_K3o-vUPsMouAFQCy7mg,8210 -pip/_internal/utils/unpacking.py,sha256=klIaodkk3_rIg-VjN2s-PQFPfGXaVhOWpOwd46T7bHo,9317 -pip/_internal/utils/urls.py,sha256=pJQSXBv1vKtBFr9KPbSMYA5lY7-G9rjLHq0A8plI7yo,1863 -pip/_internal/utils/virtualenv.py,sha256=3JeTdc_O-2uZbfn7EmQKLyXurWKD3nKSEi856ZZWSC4,3675 -pip/_internal/utils/wheel.py,sha256=xeIImmT3FJfVBPv3J4jxsHJy2wLinnJXAsZOcrrMSAM,6479 -pip/_internal/vcs/__init__.py,sha256=6ZAbu6NoqDWJjYPWCtn8PaZjulAEgs-R0Xngq2Z174Q,611 -pip/_internal/vcs/__pycache__/__init__.cpython-39.pyc,, -pip/_internal/vcs/__pycache__/bazaar.cpython-39.pyc,, -pip/_internal/vcs/__pycache__/git.cpython-39.pyc,, -pip/_internal/vcs/__pycache__/mercurial.cpython-39.pyc,, -pip/_internal/vcs/__pycache__/subversion.cpython-39.pyc,, -pip/_internal/vcs/__pycache__/versioncontrol.cpython-39.pyc,, -pip/_internal/vcs/bazaar.py,sha256=6_3dygJ3x0TrnlsMx2-sokvNKpk-6EfH2zsMgAmLj4o,3058 -pip/_internal/vcs/git.py,sha256=vYxXxg4M6YIUxNQCswMJJ2ZiBkb4capqTziRrATcp0E,17853 -pip/_internal/vcs/mercurial.py,sha256=jrfkmZF7SLOwxrJroz-NjvTTMCvaWl8BnZATPdu1CsE,5234 -pip/_internal/vcs/subversion.py,sha256=Oy4kcrNGmimnatKWHGKtED-0Da6bjfuc2DtsnitUam0,12195 -pip/_internal/vcs/versioncontrol.py,sha256=7w9WNAlFXQj5pRlWA-3jA8XUwn1VSxbNfmWvI-aY2p0,23998 -pip/_internal/wheel_builder.py,sha256=3bibo47mjXw7rRChRqudDQObp5JynLQ5uZ8x81PtBq8,12100 -pip/_vendor/__init__.py,sha256=3sjRJDFysoLez0JAFlt8jJA0FUzWVPkt9AlJlcuNsC0,4814 -pip/_vendor/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/__pycache__/appdirs.cpython-39.pyc,, -pip/_vendor/__pycache__/distro.cpython-39.pyc,, -pip/_vendor/__pycache__/pyparsing.cpython-39.pyc,, -pip/_vendor/__pycache__/six.cpython-39.pyc,, -pip/_vendor/appdirs.py,sha256=Od1rs7d0yMmHLUc0FQn2DleIUbC--EEmM-UtXvFqAjM,26540 -pip/_vendor/cachecontrol/__init__.py,sha256=SR74BEsga7Z2I6-CH8doh2Oq_vH0GG7RCwjJg7TntdI,313 -pip/_vendor/cachecontrol/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-39.pyc,, -pip/_vendor/cachecontrol/__pycache__/adapter.cpython-39.pyc,, -pip/_vendor/cachecontrol/__pycache__/cache.cpython-39.pyc,, -pip/_vendor/cachecontrol/__pycache__/compat.cpython-39.pyc,, -pip/_vendor/cachecontrol/__pycache__/controller.cpython-39.pyc,, -pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-39.pyc,, -pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-39.pyc,, -pip/_vendor/cachecontrol/__pycache__/serialize.cpython-39.pyc,, -pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-39.pyc,, -pip/_vendor/cachecontrol/_cmd.py,sha256=KIO6PIJoXmNr5RGS2pZjDum1-40oR4fw5kE0LguxrY4,1352 -pip/_vendor/cachecontrol/adapter.py,sha256=FBRrYfpkXaH8hKogEgw6wYCScnL2SJFDZlHBNF0EvLE,5015 -pip/_vendor/cachecontrol/cache.py,sha256=gCo5R0D__iptJ49dUfxwWfu2Lc2OjpDs-MERy2hTpK8,844 -pip/_vendor/cachecontrol/caches/__init__.py,sha256=rN8Ox5dd2ucPtgkybgz77XfTTUL4HFTO2-n2ACK2q3E,88 -pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-39.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-39.pyc,, -pip/_vendor/cachecontrol/caches/file_cache.py,sha256=tw35e4ZnOsxqrlZ2fQ2VYz2FlUlCbFMerNu2tPwtRHY,4299 -pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=hFJ_J9MCUTjblJCBT_cV_glP--2toqHDCKLRGUIHSOQ,889 -pip/_vendor/cachecontrol/compat.py,sha256=3BisP29GBHAo0QxUrbpBsMeXSp8YzKQcGHwEW7VYU2U,724 -pip/_vendor/cachecontrol/controller.py,sha256=fTDK1V7NjpnU1hwfMboX4Vyh73-uWgL6QkghtvvyTrY,14525 -pip/_vendor/cachecontrol/filewrapper.py,sha256=YsK9ISeZg26n-rS0z7MdEcMTyQ9gW_fLb6zIRJvE2rg,2613 -pip/_vendor/cachecontrol/heuristics.py,sha256=yndlfXHJZ5u_TC1ECrV4fVl68OuWiXnDS0HPyscK1MM,4205 -pip/_vendor/cachecontrol/serialize.py,sha256=7Jq5PcVBH6RVI-qkKkQsV5yAiZCFQa7yFhvITw_DYsc,7279 -pip/_vendor/cachecontrol/wrapper.py,sha256=tKJnzRvbl7uJRxOChwlNLdJf9NR0QlnknQxgNzQW2kM,719 -pip/_vendor/certifi/__init__.py,sha256=mRf2Fl2WmJxc7O-Zob068lpqa3nlsU4215CXzbkoBBU,65 -pip/_vendor/certifi/__main__.py,sha256=4JJNpOgznsXzgISGReUBrJGB6Q4zJOlIV99WFE185fM,267 -pip/_vendor/certifi/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/certifi/__pycache__/__main__.cpython-39.pyc,, -pip/_vendor/certifi/__pycache__/core.cpython-39.pyc,, -pip/_vendor/certifi/cacert.pem,sha256=3i-hfE2K5o3CBKG2tYt6ehJWk2fP64o6Th83fHPoPp4,259465 -pip/_vendor/certifi/core.py,sha256=u1ccq2BcSYX_ZtX61r6UFpwbKCKxNavjrzse_QVQ_PI,2916 -pip/_vendor/chardet/__init__.py,sha256=yxky3TQpsr5YTFEf5XYv0O4wq2e1WSilELYZ9e2AEes,3354 -pip/_vendor/chardet/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/big5freq.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/big5prober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/chardistribution.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/charsetprober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/compat.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/cp949prober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/enums.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/escprober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/escsm.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/eucjpprober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/euckrfreq.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/euckrprober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/euctwfreq.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/euctwprober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/gb2312freq.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/gb2312prober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/hebrewprober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/jisfreq.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/jpcntx.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/langthaimodel.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/latin1prober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/mbcssm.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/sjisprober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/universaldetector.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/utf8prober.cpython-39.pyc,, -pip/_vendor/chardet/__pycache__/version.cpython-39.pyc,, -pip/_vendor/chardet/big5freq.py,sha256=dwRzRlsGp3Zgr1JQSSSwnxvyaZ7_q-5kuPfCVMuy4to,31640 -pip/_vendor/chardet/big5prober.py,sha256=TpmdoNfRtnQ7x9Q_p-a1CHaG-ok2mbisN5e9UHAtOiY,1804 -pip/_vendor/chardet/chardistribution.py,sha256=NzboAhfS6GODy_Tp6BkmUOL4NuxwTVfdVFcKA9bdUAo,9644 -pip/_vendor/chardet/charsetgroupprober.py,sha256=NPYh0Agp8UnrfqIls_qdbwszQ1mv9imGawGUCErFT6M,3946 -pip/_vendor/chardet/charsetprober.py,sha256=kk5-m0VdjqzbEhPRkBZ386R3fBQo3DxsBrdL-WFyk1o,5255 -pip/_vendor/chardet/cli/__init__.py,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2 -pip/_vendor/chardet/cli/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-39.pyc,, -pip/_vendor/chardet/cli/chardetect.py,sha256=535zsG4tA_x-_xPtEeDvn46QLib2nvF-5NT_nJdGgVs,2831 -pip/_vendor/chardet/codingstatemachine.py,sha256=qz9ZwK1q4mZ4s4zDRbyXu5KaGunYbk7g1Z7fqfb4mA4,3678 -pip/_vendor/chardet/compat.py,sha256=3j2eGvEAakISaIanHZ4wZutzfttNdRSdlo6RSjpyxsM,1236 -pip/_vendor/chardet/cp949prober.py,sha256=5NnMVUcel3jDY3w8ljD0cXyj2lcrvdagxOVE1jxl7xc,1904 -pip/_vendor/chardet/enums.py,sha256=3H_EIVP-VUYOdKqe2xmYdyooEDSLqS8sACMbn_3oejU,1737 -pip/_vendor/chardet/escprober.py,sha256=5MrTnVtZGEt3ssnY-lOXmOo3JY-CIqz9ruG3KjDpkbY,4051 -pip/_vendor/chardet/escsm.py,sha256=xQbwmM3Ieuskg-Aohyc6-bSfg3vsY0tx2TEKLDoVZGg,10756 -pip/_vendor/chardet/eucjpprober.py,sha256=PHumemJS19xMhDR4xPrsvxMfyBfsb297kVWmYz6zgy8,3841 -pip/_vendor/chardet/euckrfreq.py,sha256=MrLrIWMtlaDI0LYt-MM3MougBbLtSWHs6kvZx0VasIM,13741 -pip/_vendor/chardet/euckrprober.py,sha256=VbiOn7_id7mL9Q5GdeV0Ze3w5fG0nRCpUkEzeR-bnnY,1795 -pip/_vendor/chardet/euctwfreq.py,sha256=ZPBIHZDwNknGf7m6r4xGH8bX0W38qBpnTwVVv1QHw_M,32008 -pip/_vendor/chardet/euctwprober.py,sha256=hlUyGKUxzOPfBxCcyUcvRZSxgkLuvRoDU9wejp6YMiM,1793 -pip/_vendor/chardet/gb2312freq.py,sha256=aLHs-2GS8vmSM2ljyoWWgeVq_xRRcS_gN7ykpIiV43A,20998 -pip/_vendor/chardet/gb2312prober.py,sha256=msVbrDFcrJRE_XvsyETiqbTGfvdFhVIEZ2zBd-OENaE,1800 -pip/_vendor/chardet/hebrewprober.py,sha256=r81LqgKb24ZbvOmfi95MzItUxx7bkrjJR1ppkj5rvZw,14130 -pip/_vendor/chardet/jisfreq.py,sha256=vrqCR4CmwownBVXJ3Hh_gsfiDnIHOELbcNmTyC6Jx3w,26102 -pip/_vendor/chardet/jpcntx.py,sha256=Cn4cypo2y8CpqCan-zsdfYdEgXkRCnsqQoYaCu6FRjI,19876 -pip/_vendor/chardet/langbulgarianmodel.py,sha256=IuDOQ4uAe5spaYXt1F-2_496DFYd3J5lyLKKbVg-Nkw,110347 -pip/_vendor/chardet/langgreekmodel.py,sha256=cZRowhYjEUNYCevhuD5ZMHMiOIf3Pk1IpRixjTpRPB0,103969 -pip/_vendor/chardet/langhebrewmodel.py,sha256=p-xw_b2XvGVSIQFgQL91cVpS7u3vPpGJZ0udYxD07Do,103159 -pip/_vendor/chardet/langhungarianmodel.py,sha256=EKIZs5Z8Y-l6ORDcBzE9htOMMnAnr2j6Wb1PFRBMVxM,107148 -pip/_vendor/chardet/langrussianmodel.py,sha256=TFH-3rTFzbCBF15oasmoqf92FKBnwWY_HaN2ptl5WVo,136898 -pip/_vendor/chardet/langthaimodel.py,sha256=rTzLQ2x_RjQEzZfIksCR--SCFQyuP5eCtQpqxyl5-x8,107695 -pip/_vendor/chardet/langturkishmodel.py,sha256=fWI_tafe_UQ24gdOGqOWy1tnEY2jxKHoi4ueoT3rrrc,100329 -pip/_vendor/chardet/latin1prober.py,sha256=s1SFkEFY2NGe2_9bgX2MhOmyM_U_qSd_jVSdkdSgZxs,5515 -pip/_vendor/chardet/mbcharsetprober.py,sha256=hzFVD-brxTAVLnTAkDqa1ztd6RwGGwb5oAdvhj1-lE8,3504 -pip/_vendor/chardet/mbcsgroupprober.py,sha256=DlT-X7KRUl5y3SWJNqF1NXqvkjVc47jPKjJ2j4KVs3A,2066 -pip/_vendor/chardet/mbcssm.py,sha256=LGUDh1VB61rWsZB4QlJBzaCjI2PUEUgbBc91gPlX4DQ,26053 -pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/chardet/metadata/__pycache__/languages.cpython-39.pyc,, -pip/_vendor/chardet/metadata/languages.py,sha256=pGf_EnapgynSUCViRjUcwEi7AWw_bYPJFHCqerAFSbQ,19784 -pip/_vendor/chardet/sbcharsetprober.py,sha256=VPAZ5z-o8ixIIfEGTScLVXeQxkd3Zqi1eceerr0rb78,6281 -pip/_vendor/chardet/sbcsgroupprober.py,sha256=p8XICsXYXOF78Anypfvdne8K_0p8qFC-SUF5nwD1fo4,4392 -pip/_vendor/chardet/sjisprober.py,sha256=1WGev_SSHpa7AVXmM0DIONl1OvyKc8mdydUNaKtGGNI,3866 -pip/_vendor/chardet/universaldetector.py,sha256=C3ryFrDZ9JuroNMdYwgDa2_zAYJlWuPHyHLX5WtCY-g,12789 -pip/_vendor/chardet/utf8prober.py,sha256=rGwn69WfIvmibp0sWvYuH_TPoXs7zzwKHTX79Ojbr9o,2848 -pip/_vendor/chardet/version.py,sha256=LCY3oiBIflXJGeBYm7ly2aw6P9n272rhp3t7qz3oOHo,251 -pip/_vendor/colorama/__init__.py,sha256=besK61Glmusp-wZ1wjjSlsPKEY_6zndaeulh1FkVStw,245 -pip/_vendor/colorama/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/colorama/__pycache__/ansi.cpython-39.pyc,, -pip/_vendor/colorama/__pycache__/ansitowin32.cpython-39.pyc,, -pip/_vendor/colorama/__pycache__/initialise.cpython-39.pyc,, -pip/_vendor/colorama/__pycache__/win32.cpython-39.pyc,, -pip/_vendor/colorama/__pycache__/winterm.cpython-39.pyc,, -pip/_vendor/colorama/ansi.py,sha256=121ZIWJSdXR76TcqKXusVZQRgyb0AIlRnf5EW6oSGlQ,2624 -pip/_vendor/colorama/ansitowin32.py,sha256=bZByVMjpiUp-LSAK21KNvCh63UN9CPkXdHFPUsq20kA,10775 -pip/_vendor/colorama/initialise.py,sha256=J92wwYPAAEgdlAyw-ady4JJxl1j9UmXPodi0HicWDwg,1995 -pip/_vendor/colorama/win32.py,sha256=fI0Ani_DO_cYDAbHz_a0BsMbDKHCA1-P3PGcj0eDCmA,5556 -pip/_vendor/colorama/winterm.py,sha256=Zurpa5AEwarU62JTuERX53gGelEWH5SBUiAXN4CxMtA,6607 -pip/_vendor/distlib/__init__.py,sha256=iP0jP2IxDeV5bLyzuna9JsdxOw2AO-VqAMXslthb-oQ,604 -pip/_vendor/distlib/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/distlib/__pycache__/compat.cpython-39.pyc,, -pip/_vendor/distlib/__pycache__/database.cpython-39.pyc,, -pip/_vendor/distlib/__pycache__/index.cpython-39.pyc,, -pip/_vendor/distlib/__pycache__/locators.cpython-39.pyc,, -pip/_vendor/distlib/__pycache__/manifest.cpython-39.pyc,, -pip/_vendor/distlib/__pycache__/markers.cpython-39.pyc,, -pip/_vendor/distlib/__pycache__/metadata.cpython-39.pyc,, -pip/_vendor/distlib/__pycache__/resources.cpython-39.pyc,, -pip/_vendor/distlib/__pycache__/scripts.cpython-39.pyc,, -pip/_vendor/distlib/__pycache__/util.cpython-39.pyc,, -pip/_vendor/distlib/__pycache__/version.cpython-39.pyc,, -pip/_vendor/distlib/__pycache__/wheel.cpython-39.pyc,, -pip/_vendor/distlib/_backport/__init__.py,sha256=XkACqtjaFfFn1QQBFDNxSqhMva0LqXeeh6H3fVwwLQ4,280 -pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/distlib/_backport/__pycache__/misc.cpython-39.pyc,, -pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-39.pyc,, -pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-39.pyc,, -pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-39.pyc,, -pip/_vendor/distlib/_backport/misc.py,sha256=focjmI7975W3LgEtiNC99lvxohfZdsNSLTakOcPNShs,1012 -pip/_vendor/distlib/_backport/shutil.py,sha256=h-yIttFtLq-_LKn5lLn4beHXzRwcmo2wEg4UKU7hX6E,26471 -pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=LoipPkR2PfCKC7JUQBGxp6OFVlWIiWBXT-rNuzv8acU,2701 -pip/_vendor/distlib/_backport/sysconfig.py,sha256=qV5ZK6YVkHS-gUFacIT2TpFBw7bZJFH3DYa8PbT6O54,27640 -pip/_vendor/distlib/_backport/tarfile.py,sha256=fzwGLsCdTmO8uzoHjyjSgu4-srrDQEAcw4jNKUfvQH0,95235 -pip/_vendor/distlib/compat.py,sha256=Z8PBQ-ZPCJuRvzs5rtHuzceFOB8iYV8HHjAGrW3SQ8s,42528 -pip/_vendor/distlib/database.py,sha256=m_LtL3siDUdcSvftoTnXcjhUJA-WZhDwTvHO7rg72SA,52398 -pip/_vendor/distlib/index.py,sha256=LMZK2uX_oH2SNgPQ_lnnoJFFx6X5ByY-LBP8qgUTuC0,21248 -pip/_vendor/distlib/locators.py,sha256=mefGpRbPPG1Bl-UhNUquwBQR50J8uL0x2CSG-c5mbJs,53265 -pip/_vendor/distlib/manifest.py,sha256=0TlGw5ZyFp8wxr_GJz7tAAXGYwUJvceMIOsh9ydAXpM,15204 -pip/_vendor/distlib/markers.py,sha256=lTFISO7AcGHoYk2AQx_VFrjDltOFAg5YnPTvBGnOZtE,4474 -pip/_vendor/distlib/metadata.py,sha256=tCLNLfWfC-lQacX4bY-mBTKPgJZTiowKnLX2HWUcQeE,40167 -pip/_vendor/distlib/resources.py,sha256=DMriFf8j-5IXduPHW0YPnx50jQIbaOlvTQkPcdN5r88,11178 -pip/_vendor/distlib/scripts.py,sha256=-jtzATPNKOj8VpnxJUh1aXdUUkNpXiop-bOwsojbwWA,17671 -pip/_vendor/distlib/t32.exe,sha256=NS3xBCVAld35JVFNmb-1QRyVtThukMrwZVeXn4LhaEQ,96768 -pip/_vendor/distlib/t64.exe,sha256=oAqHes78rUWVM0OtVqIhUvequl_PKhAhXYQWnUf7zR0,105984 -pip/_vendor/distlib/util.py,sha256=w5nS2W71eWhilj69cZbERp6NR5rV1p_yIUbkwpvtqu4,69523 -pip/_vendor/distlib/version.py,sha256=cI1oZGIqY11EQn5P-jI_OqQml7jIxLFS52syBFIpXNU,24247 -pip/_vendor/distlib/w32.exe,sha256=lJtnZdeUxTZWya_EW5DZos_K5rswRECGspIl8ZJCIXs,90112 -pip/_vendor/distlib/w64.exe,sha256=0aRzoN2BO9NWW4ENy4_4vHkHR4qZTFZNVSAJJYlODTI,99840 -pip/_vendor/distlib/wheel.py,sha256=NNoICc3pe4uSF-gHpmqgGwQs3Q-0dnn5418JHS1ZI6c,44118 -pip/_vendor/distro.py,sha256=ni3ahks9qSr3P1FMur9zTPEF_xcAdaHW8iWZWqwB5mU,44858 -pip/_vendor/html5lib/__init__.py,sha256=Bmlpvs5dN2GoaWRAvN2UZ1yF_p7xb2zROelA0QxBKis,1195 -pip/_vendor/html5lib/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-39.pyc,, -pip/_vendor/html5lib/__pycache__/_inputstream.cpython-39.pyc,, -pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-39.pyc,, -pip/_vendor/html5lib/__pycache__/_utils.cpython-39.pyc,, -pip/_vendor/html5lib/__pycache__/constants.cpython-39.pyc,, -pip/_vendor/html5lib/__pycache__/html5parser.cpython-39.pyc,, -pip/_vendor/html5lib/__pycache__/serializer.cpython-39.pyc,, -pip/_vendor/html5lib/_ihatexml.py,sha256=IyMKE35pNPCYYGs290_oSUhWXF1BQZsbVcXBzGuFvl4,17017 -pip/_vendor/html5lib/_inputstream.py,sha256=EA6Wj46jxuK6544Vnk9YOjIpFwGbfJW0Ar2cMH1H0VU,33271 -pip/_vendor/html5lib/_tokenizer.py,sha256=BUDNWZENVB0oFBiKR49sZsqQU4rzLLa13-byISlYRfA,78775 -pip/_vendor/html5lib/_trie/__init__.py,sha256=kfSo27BaU64El8U7bg4ugLmI3Ksywu54xE6BlhVgggA,114 -pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-39.pyc,, -pip/_vendor/html5lib/_trie/__pycache__/py.cpython-39.pyc,, -pip/_vendor/html5lib/_trie/_base.py,sha256=LTpLNz1pn7LAcfn2TFvRp4moVPbFTkkbhzjPKUrvGes,1053 -pip/_vendor/html5lib/_trie/py.py,sha256=LmuYcbypKw-aMLcT0-IY6WewATGzg1QRkmyd8hTBQeY,1842 -pip/_vendor/html5lib/_utils.py,sha256=dLFxoZDTv5r38HOIHy45uxWwUY7VhLgbEFWNQw6Wppo,5090 -pip/_vendor/html5lib/constants.py,sha256=P9n6_ScDgAFkst0YfKaB-yaAlxVtUS9uMn5Lh8ywbQo,86410 -pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-39.pyc,, -pip/_vendor/html5lib/filters/__pycache__/base.cpython-39.pyc,, -pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-39.pyc,, -pip/_vendor/html5lib/filters/__pycache__/lint.cpython-39.pyc,, -pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-39.pyc,, -pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-39.pyc,, -pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-39.pyc,, -pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=0TV6VWJzhNkcLFiR7BNZUJsTJgAEEyZ02in6-PuL2gU,948 -pip/_vendor/html5lib/filters/base.py,sha256=6D2t423hbOLtjnvAAOrs1mWX1vsabMLBrWQF67ITPho,298 -pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=J-W5X3LyosH1sUipiHU1x-2ocd7g9JSudpIek_QlCUU,3018 -pip/_vendor/html5lib/filters/lint.py,sha256=O6sK29HXXW02Nv-EIEOfGvdQMuXxWvBePu2sQ2ecbJc,3736 -pip/_vendor/html5lib/filters/optionaltags.py,sha256=IVHcJ35kr6_MYBqahFMIK-Gel-ALLUk6Wk9X-or_yXk,10795 -pip/_vendor/html5lib/filters/sanitizer.py,sha256=uwT0HNJHjnw3Omf2LpmvfoVdIgAWb9_3VrMcWD1es_M,27813 -pip/_vendor/html5lib/filters/whitespace.py,sha256=bCC0mMQZicbq8HCg67pip_oScN5Fz_KkkvldfE137Kw,1252 -pip/_vendor/html5lib/html5parser.py,sha256=2xGZMaUvdkuuswAmpkazK1CXHT_y3-XTy4lS71PYUuU,119981 -pip/_vendor/html5lib/serializer.py,sha256=vMivcnRcQxjCSTrbMFdevLMhJ2HbF0cfv_CkroTODZM,16168 -pip/_vendor/html5lib/treeadapters/__init__.py,sha256=76InX2oJAx-C4rGAJziZsoE_CHI8_3thl6TeMgP-ypk,709 -pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-39.pyc,, -pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-39.pyc,, -pip/_vendor/html5lib/treeadapters/genshi.py,sha256=nQHNa4Hu0IMpu4bqHbJJS3_Cd1pKXgDO1pgMZ6gADDg,1769 -pip/_vendor/html5lib/treeadapters/sax.py,sha256=PAmV6NG9BSpfMHUY72bDbXwAe6Q2tPn1BC2yAD-K1G0,1826 -pip/_vendor/html5lib/treebuilders/__init__.py,sha256=zfrXDjeqDo2M7cJFax6hRJs70Az4pfHFiZbuLOZ9YE4,3680 -pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-39.pyc,, -pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-39.pyc,, -pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-39.pyc,, -pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-39.pyc,, -pip/_vendor/html5lib/treebuilders/base.py,sha256=Yao9LOJd-4KaLEx-3ysqRkAkhv1YaDqhTksvX6nuQyY,14982 -pip/_vendor/html5lib/treebuilders/dom.py,sha256=QWkBtUprtDosTiTFlIY6QpgKwk2-pD0AV84qVTNgiLo,9164 -pip/_vendor/html5lib/treebuilders/etree.py,sha256=k-LHrme562Hd5GmIi87r1_vfF25MtURGPurT3mAp8sY,13179 -pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=CviyyGjvv2TwN-m47DC8DFWdx0Gt-atRw9jMTv4v8-Q,15158 -pip/_vendor/html5lib/treewalkers/__init__.py,sha256=buyxCJb9LFfJ_1ZIMdc-Do1zV93Uw-7L942o2H-Swy0,5873 -pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-39.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-39.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-39.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-39.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-39.pyc,, -pip/_vendor/html5lib/treewalkers/base.py,sha256=g-cLq7VStBtpZZZ1v_Tbwp3GhJjQ2oG5njgeHVhAaXE,7728 -pip/_vendor/html5lib/treewalkers/dom.py,sha256=fBJht3gn5a6y1WN2KE9gsUru158yTQ0KikT3vOM7Xc4,1456 -pip/_vendor/html5lib/treewalkers/etree.py,sha256=VtcKOS13qy9nv2PAaYoB1j9V1Z8n9o0AEA9KoGAgYOg,4682 -pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=u9X06RqSrHanDb0qGI-v8I99-PqzOzmnpZOspHHz_Io,6572 -pip/_vendor/html5lib/treewalkers/genshi.py,sha256=P_2Tnc2GkbWJfuodXN9oYIg6kN9E26aWXXe9iL0_eX4,2378 -pip/_vendor/idna/__init__.py,sha256=aHTBHXXun6n0ecdus8ToBvhs-4Ziin24HuNbJ9ZXE3o,893 -pip/_vendor/idna/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/idna/__pycache__/codec.cpython-39.pyc,, -pip/_vendor/idna/__pycache__/compat.cpython-39.pyc,, -pip/_vendor/idna/__pycache__/core.cpython-39.pyc,, -pip/_vendor/idna/__pycache__/idnadata.cpython-39.pyc,, -pip/_vendor/idna/__pycache__/intranges.cpython-39.pyc,, -pip/_vendor/idna/__pycache__/package_data.cpython-39.pyc,, -pip/_vendor/idna/__pycache__/uts46data.cpython-39.pyc,, -pip/_vendor/idna/codec.py,sha256=LtpT6KflQ-NkZZXgLc0_ADLiShhKuC__nz_JmYyLnXs,3570 -pip/_vendor/idna/compat.py,sha256=Y-t409G3-dxunv_cSx0zrDjJkOKtC60ALLuqSknryXc,376 -pip/_vendor/idna/core.py,sha256=PWa20xVmQMBN8zgaBNXGNKCbQHOdnqKEpdcWCxXTidw,13235 -pip/_vendor/idna/idnadata.py,sha256=z3JZKnxitScqic6U-cO3rM_SmC2P0-UjUHEDnGv1xsQ,44400 -pip/_vendor/idna/intranges.py,sha256=Ipf6IPZDhD56FppDz_tjl_1YWzzh_viPiEBBp_nSQ8k,1991 -pip/_vendor/idna/package_data.py,sha256=MMuW8HkL_d3g6tkyzl7kIEN-fg9uyv6YDmk_v_jjL3U,23 -pip/_vendor/idna/uts46data.py,sha256=l_0BwSDthDPKq_AX35avb7jnXUgPEKgjf816traOf8s,210287 -pip/_vendor/msgpack/__init__.py,sha256=OhoFouHD7wOYMP2PN-Hlyk9RAZw39V-iPTDRsmkoIns,1172 -pip/_vendor/msgpack/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/msgpack/__pycache__/_version.cpython-39.pyc,, -pip/_vendor/msgpack/__pycache__/exceptions.cpython-39.pyc,, -pip/_vendor/msgpack/__pycache__/ext.cpython-39.pyc,, -pip/_vendor/msgpack/__pycache__/fallback.cpython-39.pyc,, -pip/_vendor/msgpack/_version.py,sha256=qcv5IclQy1PSvtCYDvZyjaUSFWdHPIRzdGjv3YwkKCs,21 -pip/_vendor/msgpack/exceptions.py,sha256=2fCtczricqQgdT3NtW6cTqmZn3WA7GQtmlPuT-NhLyM,1129 -pip/_vendor/msgpack/ext.py,sha256=3Xznjz11nxxfQJe50uLzKDznWOvxOBxWSZ833DL_DDs,6281 -pip/_vendor/msgpack/fallback.py,sha256=ZaNwBMO2hh9WrqHnYqdHJaCv8zzPMnva9YhD5yInTpM,39113 -pip/_vendor/packaging/__about__.py,sha256=eoW72tGZd0YfLOf_tDScx_kjG1SFtdXMg79yNoJrxg4,687 -pip/_vendor/packaging/__init__.py,sha256=Rtl7XZgdQyDFurOf4u9TWH8UM8-Y6pNC9mfN1QP5NZY,522 -pip/_vendor/packaging/__pycache__/__about__.cpython-39.pyc,, -pip/_vendor/packaging/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/packaging/__pycache__/_manylinux.cpython-39.pyc,, -pip/_vendor/packaging/__pycache__/_musllinux.cpython-39.pyc,, -pip/_vendor/packaging/__pycache__/_structures.cpython-39.pyc,, -pip/_vendor/packaging/__pycache__/markers.cpython-39.pyc,, -pip/_vendor/packaging/__pycache__/requirements.cpython-39.pyc,, -pip/_vendor/packaging/__pycache__/specifiers.cpython-39.pyc,, -pip/_vendor/packaging/__pycache__/tags.cpython-39.pyc,, -pip/_vendor/packaging/__pycache__/utils.cpython-39.pyc,, -pip/_vendor/packaging/__pycache__/version.cpython-39.pyc,, -pip/_vendor/packaging/_manylinux.py,sha256=qLGjZQVH7CwWE2jjOIyE2f4hektTsbtFc7UxfRCQzMI,11789 -pip/_vendor/packaging/_musllinux.py,sha256=Eq-8bd_ZnxcxPEZ-N4TTl7_HATTosVSmxMhZidXvg5g,4514 -pip/_vendor/packaging/_structures.py,sha256=9-rULC3_oZTgVRl9Furm3bFZe7xVsZeGiway_piR3c0,1696 -pip/_vendor/packaging/markers.py,sha256=nTk-tDQYPWjSMZSUIwGVaIvY3NbYmtQQLSXvAgBBxL8,8791 -pip/_vendor/packaging/requirements.py,sha256=PKbV9AWRNnqd0jGBMi83GPyS3hAUmx8IMxjQSJEBXsY,4822 -pip/_vendor/packaging/specifiers.py,sha256=HeDND7swHCqUzD9mKLuvXwBp8Rl-sBdWoA9okxul8cA,31792 -pip/_vendor/packaging/tags.py,sha256=aUZfcmH14rf5DAwYCHHjx5Z9zWnPAYqm9QKJf0yEkRk,16198 -pip/_vendor/packaging/utils.py,sha256=wl4SX90PE-_rF8s24QsN30N9afxY8BX42yKBmwI3wtU,4336 -pip/_vendor/packaging/version.py,sha256=CfhEcnRcBUAgA2viaZV9i5f84V0goapf5vSGgg3Yxl0,15169 -pip/_vendor/pep517/__init__.py,sha256=_xFPzQ0RNMbFs0cvD091C2aMOneiq-cTNfGj9uSTc3k,136 -pip/_vendor/pep517/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/pep517/__pycache__/build.cpython-39.pyc,, -pip/_vendor/pep517/__pycache__/check.cpython-39.pyc,, -pip/_vendor/pep517/__pycache__/colorlog.cpython-39.pyc,, -pip/_vendor/pep517/__pycache__/compat.cpython-39.pyc,, -pip/_vendor/pep517/__pycache__/dirtools.cpython-39.pyc,, -pip/_vendor/pep517/__pycache__/envbuild.cpython-39.pyc,, -pip/_vendor/pep517/__pycache__/meta.cpython-39.pyc,, -pip/_vendor/pep517/__pycache__/wrappers.cpython-39.pyc,, -pip/_vendor/pep517/build.py,sha256=MDBFdwDA7ygdOFkHRZDA2vmbLuM5vIg3PYnHAszhMz8,3596 -pip/_vendor/pep517/check.py,sha256=FwTS6MXy67e7MCC3QPsN4g7sou0Pg1FkXxMBLimFJQ4,6303 -pip/_vendor/pep517/colorlog.py,sha256=uOdcoDYZ0ocKGRPPs5JgvpLYVDIfoEVvoMpc43ICQFU,4213 -pip/_vendor/pep517/compat.py,sha256=BmdEmQQW3XQqBjgDov0EWT-q1V-ECANNzDp692gUTdg,1113 -pip/_vendor/pep517/dirtools.py,sha256=hrSzAJOGDo3tXdtCbgJ6LqoLhPVJn6JGmekz1ofLi6o,1173 -pip/_vendor/pep517/envbuild.py,sha256=D8XnGq1CZKAuIAMZQxpJQrvDwkjKRzKotHAOpr_AF1M,6283 -pip/_vendor/pep517/in_process/__init__.py,sha256=IZ3Qr3CBsGM77dePRWUxnF9FADyAi0imlDLX5MWGPz8,580 -pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-39.pyc,, -pip/_vendor/pep517/in_process/_in_process.py,sha256=MW1-Z-5WuMGVy0cdY3-kgSr2rEO7bIYDlhgMuMHciEw,11182 -pip/_vendor/pep517/meta.py,sha256=ZkHYB0YHt4FDuSE5NdFuVsat3xfZ6LgW6VS6d4D6vIQ,2555 -pip/_vendor/pep517/wrappers.py,sha256=mgBTFXDKJtKluWpQ7VMZda49ZUzFGSNu5d_PYJLoor0,13629 -pip/_vendor/pkg_resources/__init__.py,sha256=zeMvnKzGEcWISjTwy6YtFKWamTFJdwBwYjBAFUoyf7A,111573 -pip/_vendor/pkg_resources/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-39.pyc,, -pip/_vendor/pkg_resources/py31compat.py,sha256=tzQGe-w8g7GEXb6Ozw2-v8ZHaIygADmw0LAgriYzPAc,585 -pip/_vendor/progress/__init__.py,sha256=YTntFxK5CZDfVAa1b77EbNkWljGqvyM72YKRTHaHap8,5034 -pip/_vendor/progress/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/progress/__pycache__/bar.cpython-39.pyc,, -pip/_vendor/progress/__pycache__/counter.cpython-39.pyc,, -pip/_vendor/progress/__pycache__/spinner.cpython-39.pyc,, -pip/_vendor/progress/bar.py,sha256=evFQod41y2bMU60teK16uV-A5F4yVUehab8dtCiXj1E,2945 -pip/_vendor/progress/counter.py,sha256=c8AdstUGrFQvIQbvtHjjXxZx6LCflrY-a7DVM6IYTBs,1413 -pip/_vendor/progress/spinner.py,sha256=zLcx2RFinPfM6UwveJJrcJ8YABE3aLCAKqQFVD3pHow,1423 -pip/_vendor/pyparsing.py,sha256=lD3A8iEK1JYvnNDP00Cgve4vZjwEFonCvrpo7mEl3Q8,280501 -pip/_vendor/requests/__init__.py,sha256=IPdrlLH8zOpx45fFKwMSH9HT_d9wfwdjjoka0HEY9ps,5267 -pip/_vendor/requests/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/__version__.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/_internal_utils.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/adapters.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/api.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/auth.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/certs.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/compat.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/cookies.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/exceptions.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/help.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/hooks.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/models.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/packages.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/sessions.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/status_codes.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/structures.cpython-39.pyc,, -pip/_vendor/requests/__pycache__/utils.cpython-39.pyc,, -pip/_vendor/requests/__version__.py,sha256=SKjnGRNIWoxDQR1pAkRW3fen6mAXw7MruEBPlqvEjuE,455 -pip/_vendor/requests/_internal_utils.py,sha256=zDALdxFfs4pAp4CME_TTw2rGyYR2EGBpSehYHgfn8o0,1138 -pip/_vendor/requests/adapters.py,sha256=v-nXh1zlxNzGQWQicaDrnsMmus75p2c99GPOtPl-6uw,22081 -pip/_vendor/requests/api.py,sha256=IPHU2zrGr6hURdheImh9lqurXPhQlv4PFOkjik6dmSQ,6561 -pip/_vendor/requests/auth.py,sha256=xe7s91xl3ENjQgRlZP3-2KsACnXYHAiLOuHLDw6nyyQ,10512 -pip/_vendor/requests/certs.py,sha256=fFBPJjnP90gWELetFYPbzrsfZgSZopej7XhlkrnVVec,483 -pip/_vendor/requests/compat.py,sha256=xfkhI1O0M1RPT9n92GEeoalPuBOYMsdApi7TONmwWD8,2121 -pip/_vendor/requests/cookies.py,sha256=PIxSKntoUn6l2irwR-CBMgm0scK8s-6yUZzwoCVIAdo,18979 -pip/_vendor/requests/exceptions.py,sha256=-_Uvqm89mT79nPWoxlf_NF7JawnsfHcJdAeIipOiAQg,3377 -pip/_vendor/requests/help.py,sha256=HQ9KRPaFWwmEYS46TnLTyaGYXGNv-G3RQyO9yUfa7Gg,4104 -pip/_vendor/requests/hooks.py,sha256=LAWGUHI8SB52PkhFYbwyPcT6mWsjuVJeeZpM0RUTADc,791 -pip/_vendor/requests/models.py,sha256=eBTofFVVYXXqpuqkMrPzRNYKJfuICHhw5bPn6bi-lEI,35890 -pip/_vendor/requests/packages.py,sha256=ry2VlKGoCDdr8ZJyNCXxDcAF1HfENfmoylCK-_VzXh0,711 -pip/_vendor/requests/sessions.py,sha256=xn0NHgjfsCdvZoi11vUDP8zS0LPM0sVuZP_6qYNC7kw,30949 -pip/_vendor/requests/status_codes.py,sha256=ef_TQlJHa44J6_nrl_hTw6h7I-oZS8qg2MHCu9YyzYY,4311 -pip/_vendor/requests/structures.py,sha256=ssrNLrH8XELX89hk4yRQYEVeHnbopq1HAJBfgu38bi8,3110 -pip/_vendor/requests/utils.py,sha256=dZh-kGRO-A8sLHdHp_hcS_5u4syIDRRE2T-un0s4HwM,32407 -pip/_vendor/resolvelib/__init__.py,sha256=g_NlynQjt3xlCb_JRtRIrV6Y-zBYSkQMxH4NtoC4Axc,563 -pip/_vendor/resolvelib/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/resolvelib/__pycache__/providers.cpython-39.pyc,, -pip/_vendor/resolvelib/__pycache__/reporters.cpython-39.pyc,, -pip/_vendor/resolvelib/__pycache__/resolvers.cpython-39.pyc,, -pip/_vendor/resolvelib/__pycache__/structs.cpython-39.pyc,, -pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-39.pyc,, -pip/_vendor/resolvelib/compat/collections_abc.py,sha256=RCp_gXYFZUg2DF2iUPTTD-XSpBTia4xEuJhjbXNzQyM,162 -pip/_vendor/resolvelib/providers.py,sha256=4rEMGvu_xM5qx42oiIeMwgfwsrd1vCUZusmbfvMknWg,5762 -pip/_vendor/resolvelib/reporters.py,sha256=Yi7l5VMEKyhL20KIEglPukQHWJHkweV4e4amcJs-4yk,1401 -pip/_vendor/resolvelib/resolvers.py,sha256=nlrz0Zql6opJgYgnBoFg3FwG_Z9lGp8rAi7hooQ33E8,17698 -pip/_vendor/resolvelib/structs.py,sha256=8HTLTjfJCdDs2FBt3EqaNiFbn0oelLG9OQK9htCvBpE,4959 -pip/_vendor/six.py,sha256=MB08ff_RApHF8XMk2vSx581-xTyX6sf_pQOtz6j1BZU,35547 -pip/_vendor/tenacity/__init__.py,sha256=YfrArVagvtYH5gcjBOlOQ2u6dx2C2N4X1x0DOUBXv5Y,18774 -pip/_vendor/tenacity/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/tenacity/__pycache__/_asyncio.cpython-39.pyc,, -pip/_vendor/tenacity/__pycache__/_utils.cpython-39.pyc,, -pip/_vendor/tenacity/__pycache__/after.cpython-39.pyc,, -pip/_vendor/tenacity/__pycache__/before.cpython-39.pyc,, -pip/_vendor/tenacity/__pycache__/before_sleep.cpython-39.pyc,, -pip/_vendor/tenacity/__pycache__/nap.cpython-39.pyc,, -pip/_vendor/tenacity/__pycache__/retry.cpython-39.pyc,, -pip/_vendor/tenacity/__pycache__/stop.cpython-39.pyc,, -pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-39.pyc,, -pip/_vendor/tenacity/__pycache__/wait.cpython-39.pyc,, -pip/_vendor/tenacity/_asyncio.py,sha256=jZcrONVfckAiLERCKTxI9DJ_Aeq4fquZj9G7Vr1_I7s,3406 -pip/_vendor/tenacity/_utils.py,sha256=J2-zhV7bDTTuye-U8jtimO7lN1x70_a23qAdKniuzSE,2012 -pip/_vendor/tenacity/after.py,sha256=mJq5ygM_NzL69Bx63RbI24IU5KgGHqmwl3AbQXiTCTc,1542 -pip/_vendor/tenacity/before.py,sha256=RmWTv09-aU_3kFVRJw6PX3dp74ZZqnRD1UZUoCWw5XY,1417 -pip/_vendor/tenacity/before_sleep.py,sha256=gSQPoPHevxpluUv0ASzd2Z4AOfq8Q8Y7XOns32cL4n8,1966 -pip/_vendor/tenacity/nap.py,sha256=5DH1ui6-d3X4ZsQCRKJhY5jaQ0NdYZ2AEqt7Svt5VFM,1426 -pip/_vendor/tenacity/retry.py,sha256=VsJQ9DcYTMr0ZeV43yhQfBDDJD1y5av52TJ0OSwvqLw,6858 -pip/_vendor/tenacity/stop.py,sha256=lVnfBu2fzvqVtsL-HH8o1m_HborN7zLnlXBWa2UzM-A,2886 -pip/_vendor/tenacity/tornadoweb.py,sha256=2wGpfDdTztK9Sk74ARv8prohTReTQzst9a1m1qo5bBs,2204 -pip/_vendor/tenacity/wait.py,sha256=t16nLHioncGDdKA6ETwTNzABC-RrZiR-7HS1pXikVsg,6882 -pip/_vendor/tomli/__init__.py,sha256=fUFJngh-LwLWqbgw4Vc7wvxnfTdrIK8Nc7wvydyxOjw,236 -pip/_vendor/tomli/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/tomli/__pycache__/_parser.cpython-39.pyc,, -pip/_vendor/tomli/__pycache__/_re.cpython-39.pyc,, -pip/_vendor/tomli/_parser.py,sha256=946C00VAWqHjKSueGK44YSAU_Ufwg4LQmvd8yqta2dg,23118 -pip/_vendor/tomli/_re.py,sha256=tGGogP0HJnQDBSITAPldXRB5TLQeaC069FBzxVOOy5k,2764 -pip/_vendor/urllib3/__init__.py,sha256=FzLqycdKhCzSxjYOPTX50D3qf0lTCe6UgfZdwT-Li7o,2848 -pip/_vendor/urllib3/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/urllib3/__pycache__/_collections.cpython-39.pyc,, -pip/_vendor/urllib3/__pycache__/_version.cpython-39.pyc,, -pip/_vendor/urllib3/__pycache__/connection.cpython-39.pyc,, -pip/_vendor/urllib3/__pycache__/connectionpool.cpython-39.pyc,, -pip/_vendor/urllib3/__pycache__/exceptions.cpython-39.pyc,, -pip/_vendor/urllib3/__pycache__/fields.cpython-39.pyc,, -pip/_vendor/urllib3/__pycache__/filepost.cpython-39.pyc,, -pip/_vendor/urllib3/__pycache__/poolmanager.cpython-39.pyc,, -pip/_vendor/urllib3/__pycache__/request.cpython-39.pyc,, -pip/_vendor/urllib3/__pycache__/response.cpython-39.pyc,, -pip/_vendor/urllib3/_collections.py,sha256=RQtWWhudTDETvb2BCVqih1QTpXS2Q5HSf77UJY5ditA,11148 -pip/_vendor/urllib3/_version.py,sha256=Cs83ZyfrMWqd18tvuyiZ-SW91-r7-fsCZ-S3EnE-7Vk,65 -pip/_vendor/urllib3/connection.py,sha256=ml6ucQ9HfP5eR3t_x7Qpgkke62PF92i-b_XYrIUdZeI,19293 -pip/_vendor/urllib3/connectionpool.py,sha256=itteZaSObupTC6p-6YYcI3KTQdLwgQxlS01w_hOoQqA,38198 -pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-39.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-39.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-39.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-39.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-39.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-39.pyc,, -pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=POYJSeNWacJYwXQdv0If3v56lcoiHuL6MQE8pwG1Yoc,993 -pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-39.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-39.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=jreOmmwBW-Cio0m7I_OjmP028nqgrGuo_oB2f7Gir3s,18168 -pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=0KKeznz3h0z-SBDbCtGorDfgCgiZ30VQOqkX5ZgaPBY,14304 -pip/_vendor/urllib3/contrib/appengine.py,sha256=nlIR6iWZ0A1cV9X4dYwdx7H1F1tqGE7ai9QCfJ7ntFo,11348 -pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=JCCrvNQpXdL3eb_D4AoviNnl71nYhSX2r-hG9N-dPf4,4668 -pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=093d4DdfHcz0h8KcEg-D9fQEUtXaVLENmOkzOqNQ5eU,17402 -pip/_vendor/urllib3/contrib/securetransport.py,sha256=ozB5tLGYiVgN2NLx9vvzVxjdtY9nNj9mBxGsCYTwEGI,35356 -pip/_vendor/urllib3/contrib/socks.py,sha256=RqYih4HGeICnKzmYnG3MMo2xMlCdwb1bAdEuo6zCA_Y,7313 -pip/_vendor/urllib3/exceptions.py,sha256=QDT9xy1fNxui5aS7dMabeb1gokQOQ-zOT7XiDp-O5Qo,8540 -pip/_vendor/urllib3/fields.py,sha256=0KSfpuXxzXUMLkI2npM9siWOqCJO1H4wCiJN6neVmlA,8853 -pip/_vendor/urllib3/filepost.py,sha256=BVkEES0YAO9tFwXGBj1mD9yO92pRwk4pX5Q6cO5IRb8,2538 -pip/_vendor/urllib3/packages/__init__.py,sha256=FsOIVHqBFBlT3XxZnaD5y2yq0mvtVwmY4kut3GEfcBI,113 -pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/urllib3/packages/__pycache__/six.cpython-39.pyc,, -pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-39.pyc,, -pip/_vendor/urllib3/packages/backports/makefile.py,sha256=DREmQjGcs2LoVH_Q3hrggClhTNdcI5Y3GJglsuihjAM,1468 -pip/_vendor/urllib3/packages/six.py,sha256=dUImuFN7dZON9oeQQqHjXdwH3n2Oxr9148Ns4K4Y2xg,35743 -pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=d-Tyw37qbvVdcjcVF4WLYiM7AXaOpIg386C2P2uB5Ks,951 -pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-39.pyc,, -pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=WXs1yNtk9PsYVmeTJQAcqeAm81zbzeabEWWf-xRJSAo,5839 -pip/_vendor/urllib3/poolmanager.py,sha256=blNTYqVqFg9zUGncVtyXk1HQsTxKO1Cy9hfGVLAGvhM,20299 -pip/_vendor/urllib3/request.py,sha256=Fe4bQCUhum8qh3t1dihpSsQwdyfd5nB44cNX8566DmM,6155 -pip/_vendor/urllib3/response.py,sha256=LjfUJBUhwPrJTrGgNI3WoySUizNEPd1Xiv71YxE2J7Y,29024 -pip/_vendor/urllib3/util/__init__.py,sha256=UV_J7p9b29cJXXQ6wTvBZppJDLUeKQ6mcv0v1ptl13c,1204 -pip/_vendor/urllib3/util/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/urllib3/util/__pycache__/connection.cpython-39.pyc,, -pip/_vendor/urllib3/util/__pycache__/proxy.cpython-39.pyc,, -pip/_vendor/urllib3/util/__pycache__/queue.cpython-39.pyc,, -pip/_vendor/urllib3/util/__pycache__/request.cpython-39.pyc,, -pip/_vendor/urllib3/util/__pycache__/response.cpython-39.pyc,, -pip/_vendor/urllib3/util/__pycache__/retry.cpython-39.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-39.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-39.pyc,, -pip/_vendor/urllib3/util/__pycache__/timeout.cpython-39.pyc,, -pip/_vendor/urllib3/util/__pycache__/url.cpython-39.pyc,, -pip/_vendor/urllib3/util/__pycache__/wait.cpython-39.pyc,, -pip/_vendor/urllib3/util/connection.py,sha256=hoiT3Z-vROOSOB-4JrFyRKzF67xYt-ZTFMTiYj1yd6Q,5070 -pip/_vendor/urllib3/util/proxy.py,sha256=xMGYpCWlY1Obf1nod_fhOG3rk3NTUM2q_BJmj6B_NmU,1660 -pip/_vendor/urllib3/util/queue.py,sha256=mY2d0cfoJG51UEKZwk_sJMwYraofNfQWq7Larj9xh_o,520 -pip/_vendor/urllib3/util/request.py,sha256=O-NJTFysuN_wgY33pne8xA1P35qv3R7uh67ER9zwqYM,4266 -pip/_vendor/urllib3/util/response.py,sha256=685vBStgxTo8u3KoOilR6Kuh7IGPZr7TmzrP9awEtqU,3617 -pip/_vendor/urllib3/util/retry.py,sha256=6xS4OYGWN2gz8kX34RH6ly7Uc6YcfCb2Z3V0QMdHpys,21993 -pip/_vendor/urllib3/util/ssl_.py,sha256=WILvlnNl3FxrO1-AuSJzGBuFTLCNIfkzRbhNvIuxseU,17672 -pip/_vendor/urllib3/util/ssltransport.py,sha256=r8zXGD19jRdpYPlAt9wR-mBg9aVRIB3UkV1GiT5uENQ,7152 -pip/_vendor/urllib3/util/timeout.py,sha256=Ym2WjTspeYp4fzcCYGTQ5aSU1neVSMHXBAgDp1rcETw,10271 -pip/_vendor/urllib3/util/url.py,sha256=3MdcqSYaGz4A2FIwYwe4KclwnrTn6ZdEG1-sUoCniUo,14479 -pip/_vendor/urllib3/util/wait.py,sha256=qk2qJQNb3FjhOm9lKJtpByhnsLWRVapWdhW_NLr7Eog,5557 -pip/_vendor/vendor.txt,sha256=gryMWlplkGEQkjoFzG1xYAfARSAghGWVWX-fGObCxOw,386 -pip/_vendor/webencodings/__init__.py,sha256=kG5cBDbIrAtrrdU-h1iSPVYq10ayTFldU1CTRcb1ym4,10921 -pip/_vendor/webencodings/__pycache__/__init__.cpython-39.pyc,, -pip/_vendor/webencodings/__pycache__/labels.cpython-39.pyc,, -pip/_vendor/webencodings/__pycache__/mklabels.cpython-39.pyc,, -pip/_vendor/webencodings/__pycache__/tests.cpython-39.pyc,, -pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-39.pyc,, -pip/_vendor/webencodings/labels.py,sha256=e9gPVTA1XNYalJMVVX7lXvb52Kurc4UdnXFJDPcBXFE,9210 -pip/_vendor/webencodings/mklabels.py,sha256=tyhoDDc-TC6kjJY25Qn5TlsyMs2_IyPf_rfh4L6nSrg,1364 -pip/_vendor/webencodings/tests.py,sha256=7J6TdufKEml8sQSWcYEsl-e73QXtPmsIHF6pPT0sq08,6716 -pip/_vendor/webencodings/x_user_defined.py,sha256=CMn5bx2ccJ4y3Bsqf3xC24bYO4ONC3ZY_lv5vrqhKAY,4632 -pip/py.typed,sha256=9_aEgAx4lyfhJKT_8nv7mk-FpX3Mdtn8cV5Fw11xicg,290 diff --git a/.venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/INSTALLER b/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/INSTALLER similarity index 100% rename from .venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/INSTALLER rename to .venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/INSTALLER diff --git a/.venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/LICENSE.txt b/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/LICENSE.txt similarity index 100% rename from .venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/LICENSE.txt rename to .venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/LICENSE.txt diff --git a/.venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/METADATA b/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/METADATA similarity index 99% rename from .venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/METADATA rename to .venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/METADATA index 58e30d9c..fa1b07f9 100644 --- a/.venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/METADATA +++ b/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pip -Version: 21.2.3 +Version: 21.2.4 Summary: The PyPA recommended tool for installing Python packages. Home-page: https://pip.pypa.io/ Author: The pip developers diff --git a/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/RECORD b/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/RECORD new file mode 100644 index 00000000..d20dfef5 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/RECORD @@ -0,0 +1,795 @@ +../../../bin/pip,sha256=WA6EDFarxsG50gHWZf1o3pii4sLE6_zliisL1ehtOa4,262 +../../../bin/pip3,sha256=WA6EDFarxsG50gHWZf1o3pii4sLE6_zliisL1ehtOa4,262 +../../../bin/pip3.9,sha256=WA6EDFarxsG50gHWZf1o3pii4sLE6_zliisL1ehtOa4,262 +pip-21.2.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-21.2.4.dist-info/LICENSE.txt,sha256=I6c2HCsVgQKLxiO52ivSSZeryqR4Gs5q1ESjeUT42uE,1090 +pip-21.2.4.dist-info/METADATA,sha256=PGCimuD-VsKv664Ne_9navMt6I9Ym_rm5p_u6Ykgfd4,4165 +pip-21.2.4.dist-info/RECORD,, +pip-21.2.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip-21.2.4.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 +pip-21.2.4.dist-info/entry_points.txt,sha256=5ExSa1s54zSPNA_1epJn5SX06786S8k5YHwskMvVYzw,125 +pip-21.2.4.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=EkjFYKiNdO5r1TZT1K-GxPs3Bl2IdRXw75e7IVsKrmc,357 +pip/__main__.py,sha256=mXwWDftNLMKfwVqKFWGE_uuBZvGSIiUELhLkeysIuZc,1198 +pip/__pycache__/__init__.cpython-39.pyc,, +pip/__pycache__/__main__.cpython-39.pyc,, +pip/_internal/__init__.py,sha256=nnFCuxrPMgALrIDxSoy-H6Zj4W4UY60D-uL1aJyq0pc,573 +pip/_internal/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/__pycache__/build_env.cpython-39.pyc,, +pip/_internal/__pycache__/cache.cpython-39.pyc,, +pip/_internal/__pycache__/configuration.cpython-39.pyc,, +pip/_internal/__pycache__/exceptions.cpython-39.pyc,, +pip/_internal/__pycache__/main.cpython-39.pyc,, +pip/_internal/__pycache__/pyproject.cpython-39.pyc,, +pip/_internal/__pycache__/self_outdated_check.cpython-39.pyc,, +pip/_internal/__pycache__/wheel_builder.cpython-39.pyc,, +pip/_internal/build_env.py,sha256=uqtt1F0185ctzme5UX43I6bFHVeORY7q-dyhpkk5NDE,10121 +pip/_internal/cache.py,sha256=6VONtoReGZbBd7sqY1n6hwkdWC4iz3tmXwXwZjpjZKw,9958 +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/cli/__pycache__/autocompletion.cpython-39.pyc,, +pip/_internal/cli/__pycache__/base_command.cpython-39.pyc,, +pip/_internal/cli/__pycache__/cmdoptions.cpython-39.pyc,, +pip/_internal/cli/__pycache__/command_context.cpython-39.pyc,, +pip/_internal/cli/__pycache__/main.cpython-39.pyc,, +pip/_internal/cli/__pycache__/main_parser.cpython-39.pyc,, +pip/_internal/cli/__pycache__/parser.cpython-39.pyc,, +pip/_internal/cli/__pycache__/progress_bars.cpython-39.pyc,, +pip/_internal/cli/__pycache__/req_command.cpython-39.pyc,, +pip/_internal/cli/__pycache__/spinners.cpython-39.pyc,, +pip/_internal/cli/__pycache__/status_codes.cpython-39.pyc,, +pip/_internal/cli/autocompletion.py,sha256=NK5yqe49SgExZOCFVEUT5Bf0QV2CuITGK27WSo2MWg8,6399 +pip/_internal/cli/base_command.py,sha256=Dq5oXBXYd24GaHs1vPt6CfYgCl22V_4tLEJqfQyBrdE,7596 +pip/_internal/cli/cmdoptions.py,sha256=xOqvgDNfpkMXVjy0mH3hI0HyczVD6wMuP8K44qsvbew,28283 +pip/_internal/cli/command_context.py,sha256=a1pBBvvGLDiZ1Kw64_4tT6HmRTwYDoYy8JFgG5Czn7s,760 +pip/_internal/cli/main.py,sha256=ioJ8IVlb2K1qLOxR-tXkee9lURhYV89CDM71MKag7YY,2472 +pip/_internal/cli/main_parser.py,sha256=Q9TnytfuC5Z2JSjBFWVGtEdYLFy7rukNIb04movHdAo,2614 +pip/_internal/cli/parser.py,sha256=CDXTuFr2UD8ozOlZYf1KDziQdo9-X_IaYOiUcyJQwrA,10788 +pip/_internal/cli/progress_bars.py,sha256=ha8wowclY8_PaoM0cz4G6qK37zjnzuxQ-ydOtzx4EMI,8300 +pip/_internal/cli/req_command.py,sha256=ZlxKFS9LtEbE1IRB6JyeUeYMe7lvKxVIzpdvag-BHok,16548 +pip/_internal/cli/spinners.py,sha256=TFhjxtOnLeNJ5YmRvQm4eKPgPbJNkZiqO8jOXuxRaYU,5076 +pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116 +pip/_internal/commands/__init__.py,sha256=3f1ZVidEDfgmzAH7aypZLKOZUvUy7qxv4X1CiIZEN30,3776 +pip/_internal/commands/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/commands/__pycache__/cache.cpython-39.pyc,, +pip/_internal/commands/__pycache__/check.cpython-39.pyc,, +pip/_internal/commands/__pycache__/completion.cpython-39.pyc,, +pip/_internal/commands/__pycache__/configuration.cpython-39.pyc,, +pip/_internal/commands/__pycache__/debug.cpython-39.pyc,, +pip/_internal/commands/__pycache__/download.cpython-39.pyc,, +pip/_internal/commands/__pycache__/freeze.cpython-39.pyc,, +pip/_internal/commands/__pycache__/hash.cpython-39.pyc,, +pip/_internal/commands/__pycache__/help.cpython-39.pyc,, +pip/_internal/commands/__pycache__/index.cpython-39.pyc,, +pip/_internal/commands/__pycache__/install.cpython-39.pyc,, +pip/_internal/commands/__pycache__/list.cpython-39.pyc,, +pip/_internal/commands/__pycache__/search.cpython-39.pyc,, +pip/_internal/commands/__pycache__/show.cpython-39.pyc,, +pip/_internal/commands/__pycache__/uninstall.cpython-39.pyc,, +pip/_internal/commands/__pycache__/wheel.cpython-39.pyc,, +pip/_internal/commands/cache.py,sha256=O1grQjTg6IRFs_8DxMH00583tmCR0ujqTMv_gZ0h0uU,7237 +pip/_internal/commands/check.py,sha256=gPC6GTp7S9aK73IeZAW7Z6yxlMnWdMyDTq9er9nXpIY,1570 +pip/_internal/commands/completion.py,sha256=4Uh_cg04qDmtmgLji-J4VJKZ8BaIBZy2_uTWLi8tiVk,2914 +pip/_internal/commands/configuration.py,sha256=TK9VTXNJ5haVH0Dc_ylhqo6A9Q_GcNoNsAOMJff4MYY,8962 +pip/_internal/commands/debug.py,sha256=f943fbrAUufQ7flAR2zHfI0oi_uqhJEEW7Fj_EiwB1Y,6647 +pip/_internal/commands/download.py,sha256=VGyQ6TDLiqJqJXfJwr_D6ZuHnYfhmzZPQk1mRSQp3tQ,4949 +pip/_internal/commands/freeze.py,sha256=x0-ia-MFrVvfYqe5p6yAWqzaK5AIi3SqqcXBJNvxXkg,2785 +pip/_internal/commands/hash.py,sha256=Y5FQ_WgbuEFnJxyLZdNYP928BGWNyNm9ljIUr90R6tI,1664 +pip/_internal/commands/help.py,sha256=F_IJkERv9gGfGC6YpBNYm_qs8xmBphUCfOuguNRSqLs,1132 +pip/_internal/commands/index.py,sha256=xA5LSVy1kv-IAvsjIX6Wnk5ZHA0Y_m6AP9T5ZoUGs9o,4781 +pip/_internal/commands/install.py,sha256=FV-qBbQ56TUEmLDtuWTMeNpD4aQtOpjBEi7ePqlEtSM,27493 +pip/_internal/commands/list.py,sha256=fpG6_KYqtAEBV8uSlt_lfF7o1GTuS4UdobsZjVqZspQ,11753 +pip/_internal/commands/search.py,sha256=P8GY077JmUwy7FiOgYJ1CPDsBPgmo7it-b14luquJN4,5543 +pip/_internal/commands/show.py,sha256=2TxWaJ2saCDSVUVBoRYueijLiueid2DNOhZuM-jhGf0,7974 +pip/_internal/commands/uninstall.py,sha256=0VQQMfPBTGSlWJn1RRgvYtJhSj7tQFYc3H1kOjrstRE,3480 +pip/_internal/commands/wheel.py,sha256=UiH15NXfrJ9piFNg3oHm4n2Jyk9Ojv5q0MvrWbHB3Ac,6189 +pip/_internal/configuration.py,sha256=QBLfhv-sbP-oR08NFxSYnv_mLB-SgtNOsWXAF9tDEcM,13725 +pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 +pip/_internal/distributions/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/distributions/__pycache__/base.cpython-39.pyc,, +pip/_internal/distributions/__pycache__/installed.cpython-39.pyc,, +pip/_internal/distributions/__pycache__/sdist.cpython-39.pyc,, +pip/_internal/distributions/__pycache__/wheel.cpython-39.pyc,, +pip/_internal/distributions/base.py,sha256=GynlnVE3QLvNu4JvnxPO6D8IQSs_GAlFUabA6U-G-eU,1206 +pip/_internal/distributions/installed.py,sha256=gT20WSniecOvKGMA-nCyq-4DcJlrIjv8jT-JEWyEOnA,645 +pip/_internal/distributions/sdist.py,sha256=VBme1UNlCuH_wIoUHTZq9ngo2NpFWQXmJqnwUb3ZpTk,3862 +pip/_internal/distributions/wheel.py,sha256=J7DNQvKS50pXfwXtetKZtLNgYzkEc8SAbaKQ5v6JHtA,1183 +pip/_internal/exceptions.py,sha256=2JQJSS68oggR_ZIOA-h1U2DRADURbkQn9Nf4EZWZ834,13170 +pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 +pip/_internal/index/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/index/__pycache__/collector.cpython-39.pyc,, +pip/_internal/index/__pycache__/package_finder.cpython-39.pyc,, +pip/_internal/index/__pycache__/sources.cpython-39.pyc,, +pip/_internal/index/collector.py,sha256=oH4XlYHvGMXePbjNhKZPpLI-NLBTXxpHRRZgQ85meNk,17645 +pip/_internal/index/package_finder.py,sha256=Zzto_P1YPeTlBjJTlPgU8wjocQDJnLYZxUSR8JxVf1E,36138 +pip/_internal/index/sources.py,sha256=SVyPitv08-Qalh2_Bk5diAJ9GAA_d-a93koouQodAG0,6557 +pip/_internal/locations/__init__.py,sha256=8HvAnPCRi2Ln5yimpHRq8NVtsImh1KEvqsPhi4H56y0,13292 +pip/_internal/locations/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/locations/__pycache__/_distutils.cpython-39.pyc,, +pip/_internal/locations/__pycache__/_sysconfig.cpython-39.pyc,, +pip/_internal/locations/__pycache__/base.cpython-39.pyc,, +pip/_internal/locations/_distutils.py,sha256=Sk7tw8ZP1DWMYJ8MibABsa8IME2Ejv1PKeGlYQCBTZc,5871 +pip/_internal/locations/_sysconfig.py,sha256=LQNKTJKyjVqxXaPntlBwdUqTG1xwYf6GVCKMbyRJx5M,7918 +pip/_internal/locations/base.py,sha256=x5D1ONktmPJd8nnUTh-ELsAJ7fiXA-k-0a_vhfi2_Us,1579 +pip/_internal/main.py,sha256=BZ0vkdqgpoteTo1A1Q8ovFe8EzgKFJWOUjPmIUQfGCY,351 +pip/_internal/metadata/__init__.py,sha256=0XQDTWweYOV7kcMuzwoiCggu3wJearBNcK8JV9LXA6Y,1576 +pip/_internal/metadata/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/metadata/__pycache__/base.cpython-39.pyc,, +pip/_internal/metadata/__pycache__/pkg_resources.cpython-39.pyc,, +pip/_internal/metadata/base.py,sha256=oRj58fKGutZKZCslfQlKfrzuXI_0M4w1xVOluT3-6TQ,7928 +pip/_internal/metadata/pkg_resources.py,sha256=xOYt6IluIDvVMgYX-QoZA3SFbToJlZDOVPRHVPJ2Uk4,5200 +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/models/__pycache__/candidate.cpython-39.pyc,, +pip/_internal/models/__pycache__/direct_url.cpython-39.pyc,, +pip/_internal/models/__pycache__/format_control.cpython-39.pyc,, +pip/_internal/models/__pycache__/index.cpython-39.pyc,, +pip/_internal/models/__pycache__/link.cpython-39.pyc,, +pip/_internal/models/__pycache__/scheme.cpython-39.pyc,, +pip/_internal/models/__pycache__/search_scope.cpython-39.pyc,, +pip/_internal/models/__pycache__/selection_prefs.cpython-39.pyc,, +pip/_internal/models/__pycache__/target_python.cpython-39.pyc,, +pip/_internal/models/__pycache__/wheel.cpython-39.pyc,, +pip/_internal/models/candidate.py,sha256=b2aiufhD5jZEI0zhEaMn_o1VRldVE2J-MPsqPpcY2Ds,946 +pip/_internal/models/direct_url.py,sha256=x2-kAnrP18XAdOftYBStDNt3Zfd8sipef5h0h_efGvY,6262 +pip/_internal/models/format_control.py,sha256=t5nmFD43huIFj0VchV6FuvlaRHfaMTotbBOTOPBsKeY,2557 +pip/_internal/models/index.py,sha256=_U2imEWggevvcI7rhQCFZK0djsE-It13BJmvW9Ejmig,1058 +pip/_internal/models/link.py,sha256=chRRuGqeE5w1XqidCrw6j-j8O-eeCmw-HUdYCR18HmQ,9809 +pip/_internal/models/scheme.py,sha256=i2QGt5J96gMKC_Wm7xO587kibhhChUQoULhAFgPRxkE,738 +pip/_internal/models/search_scope.py,sha256=mykEee0wDNCx9xZmQBtkgVaDiQVcDNqbjAZGqI1nm78,4474 +pip/_internal/models/selection_prefs.py,sha256=OEoiP83Wpm7cUwjH7fnbRo7TzHl5D4y23W0JnZLXk_4,1877 +pip/_internal/models/target_python.py,sha256=7iT4lbRtoNRkwsmLndysJ4Ic7Iwp_YyIII3doXeLD8c,3870 +pip/_internal/models/wheel.py,sha256=Ec8fvPoSYeBX9cvBvffLM7gNRx23CrVud1dN3zJmBjc,3541 +pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 +pip/_internal/network/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/network/__pycache__/auth.cpython-39.pyc,, +pip/_internal/network/__pycache__/cache.cpython-39.pyc,, +pip/_internal/network/__pycache__/download.cpython-39.pyc,, +pip/_internal/network/__pycache__/lazy_wheel.cpython-39.pyc,, +pip/_internal/network/__pycache__/session.cpython-39.pyc,, +pip/_internal/network/__pycache__/utils.cpython-39.pyc,, +pip/_internal/network/__pycache__/xmlrpc.cpython-39.pyc,, +pip/_internal/network/auth.py,sha256=zq-fu-eK_EwiqjT0SVmMxuzyvhBlCdBGJi_fnOmcar8,11645 +pip/_internal/network/cache.py,sha256=HoprMCecwd4IS2wDZowc9B_OpaBlFjJYJl4xOxvtuwU,2100 +pip/_internal/network/download.py,sha256=VmiR-KKIBugShZS4JlD7N8mq3hErx-0fK-D8aTYU3Og,6016 +pip/_internal/network/lazy_wheel.py,sha256=4szChUW2I9quggvjEoIhALezmiVVteescGh6TDUslaQ,7615 +pip/_internal/network/session.py,sha256=3tJHNQCooM7bjLK1WP-q6tiJ84jtqkyrIdrYY84WR1A,16582 +pip/_internal/network/utils.py,sha256=igLlTu_-q0LmL8FdJKq-Uj7AT_owrQ-T9FfyarkhK5U,4059 +pip/_internal/network/xmlrpc.py,sha256=AzQgG4GgS152_cqmGr_Oz2MIXsCal-xfsis7fA7nmU0,1791 +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/operations/__pycache__/check.cpython-39.pyc,, +pip/_internal/operations/__pycache__/freeze.cpython-39.pyc,, +pip/_internal/operations/__pycache__/prepare.cpython-39.pyc,, +pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/build/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/operations/build/__pycache__/metadata.cpython-39.pyc,, +pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-39.pyc,, +pip/_internal/operations/build/__pycache__/wheel.cpython-39.pyc,, +pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-39.pyc,, +pip/_internal/operations/build/metadata.py,sha256=jJp05Rrp0AMsQb7izDXbNGC1LtPNwOhHQj7cRM5324c,1165 +pip/_internal/operations/build/metadata_legacy.py,sha256=ECMBhLEPEQv6PUUCpPCXW-wN9QRXdY45PNXJv7BZKTU,1917 +pip/_internal/operations/build/wheel.py,sha256=WYLMxuxqN3ahJTQk2MI9hdmZKBpFyxHeNpUdO0PybxU,1106 +pip/_internal/operations/build/wheel_legacy.py,sha256=NOJhTYMYljdbizFo_WjkaKGWG1SEZ6aByrBdCrrsZB8,3227 +pip/_internal/operations/check.py,sha256=zEIdxyRL3vc7CQ1p8qkLFG-mjs-LjnaJDxOr1WI5Yp0,5295 +pip/_internal/operations/freeze.py,sha256=TyLvXT4ZqpIi8x8X_TTsgBJ76IG54CidJlxGIHBbmBM,10556 +pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 +pip/_internal/operations/install/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/operations/install/__pycache__/editable_legacy.cpython-39.pyc,, +pip/_internal/operations/install/__pycache__/legacy.cpython-39.pyc,, +pip/_internal/operations/install/__pycache__/wheel.cpython-39.pyc,, +pip/_internal/operations/install/editable_legacy.py,sha256=bjBObfE6sz3UmGI7y4-GCgKa2WmTgnWlFFU7b-i0sQs,1396 +pip/_internal/operations/install/legacy.py,sha256=Wk_46sR7zDsh7vp4j63Hka4NTevQ617WdqJKt8_TuUQ,4405 +pip/_internal/operations/install/wheel.py,sha256=4Y6rtOpPnjlvGkzYXP8HXzqJu1KHEuA6ExgHBdZnD6s,29466 +pip/_internal/operations/prepare.py,sha256=jgnH7CIdoAhwnYOSpkESvhrJ1yr5TL2ZY5ojjSzRMZo,24848 +pip/_internal/pyproject.py,sha256=Sl1dOQYazG9AsrE0TXWK2zVcDR_FROshCTwjKBRQsPE,7063 +pip/_internal/req/__init__.py,sha256=lz4GFfzm5gsm0e8H98Wi6IPI14R2JdDMBc61-4F-0CY,2831 +pip/_internal/req/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/req/__pycache__/constructors.cpython-39.pyc,, +pip/_internal/req/__pycache__/req_file.cpython-39.pyc,, +pip/_internal/req/__pycache__/req_install.cpython-39.pyc,, +pip/_internal/req/__pycache__/req_set.cpython-39.pyc,, +pip/_internal/req/__pycache__/req_tracker.cpython-39.pyc,, +pip/_internal/req/__pycache__/req_uninstall.cpython-39.pyc,, +pip/_internal/req/constructors.py,sha256=35LRb-iaL01AlKBOO_2vrbKil6KI5Tl450NJwUvUnhk,15826 +pip/_internal/req/req_file.py,sha256=TsBSr0LMVIYF7AqkwslyJxHPLstN0SMqKeVxciI2In4,17408 +pip/_internal/req/req_install.py,sha256=jPfSPt-s3RoRCj6tYqvvHaxxIW1yr8KbiPRGbAyF3pU,31671 +pip/_internal/req/req_set.py,sha256=NoPQztL1Z5HZEB3n2Wtst6KV51hMDAPe9AfdAUWmJLs,7572 +pip/_internal/req/req_tracker.py,sha256=dJ3ql2C3VyaKUQN9kwbFvOPMxAvbTdblB0hKQ2f6Lns,4182 +pip/_internal/req/req_uninstall.py,sha256=wBcGKaweIyi5RGPPpBqrrn62t8uP3frZmrUJ-qDeO0Y,23821 +pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/resolution/__pycache__/base.cpython-39.pyc,, +pip/_internal/resolution/base.py,sha256=yATwIW1VbJkwkFJIgG3JQafndFDSZ50smc-Ao9-SoxI,557 +pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/legacy/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/resolution/legacy/__pycache__/resolver.cpython-39.pyc,, +pip/_internal/resolution/legacy/resolver.py,sha256=TZnGUay9WM2Uk0W3D48OA70U9cLYYGHxles1h9ELqSg,17552 +pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/base.cpython-39.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-39.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-39.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-39.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-39.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-39.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-39.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-39.pyc,, +pip/_internal/resolution/resolvelib/base.py,sha256=Yvgb2jf0l6S4C2rXAbjbpURYF6yjUgCdwDSrnpiZA8U,5290 +pip/_internal/resolution/resolvelib/candidates.py,sha256=RgCvLf1meDecmw9lfhG_AU5tN9ufaC0EDrcVOR2hgiA,18842 +pip/_internal/resolution/resolvelib/factory.py,sha256=N9telNB1arFV-4TqdGdh9KML8zfAWdMbqUSNip6HeEc,26859 +pip/_internal/resolution/resolvelib/found_candidates.py,sha256=ES3PNACh3ONwGAghPip2Vbgyy_e4baKmeEEHVQiq47g,5285 +pip/_internal/resolution/resolvelib/provider.py,sha256=fy139RDxPrsPmNLn6YrrjqhBOmeLY0aHEEdzZqS35aU,8420 +pip/_internal/resolution/resolvelib/reporter.py,sha256=Z06Xa4d9dTWbHNvXIBtBxDn4DHeQmlyW9MJAojkC_iU,2600 +pip/_internal/resolution/resolvelib/requirements.py,sha256=pcsnwz7txyDNZUEOWJOZEfivy3COWHPf_DIU7fwZ-Kk,5455 +pip/_internal/resolution/resolvelib/resolver.py,sha256=Rry36d0uCKobfBnSPYMw8WStyNYtjAEFz3j6ZtBsbGQ,10523 +pip/_internal/self_outdated_check.py,sha256=ivoUYaGuq-Ra_DvlZvPtHhgbY97NKHYuPGzrgN2G1A8,6484 +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/utils/__pycache__/_log.cpython-39.pyc,, +pip/_internal/utils/__pycache__/appdirs.cpython-39.pyc,, +pip/_internal/utils/__pycache__/compat.cpython-39.pyc,, +pip/_internal/utils/__pycache__/compatibility_tags.cpython-39.pyc,, +pip/_internal/utils/__pycache__/datetime.cpython-39.pyc,, +pip/_internal/utils/__pycache__/deprecation.cpython-39.pyc,, +pip/_internal/utils/__pycache__/direct_url_helpers.cpython-39.pyc,, +pip/_internal/utils/__pycache__/distutils_args.cpython-39.pyc,, +pip/_internal/utils/__pycache__/encoding.cpython-39.pyc,, +pip/_internal/utils/__pycache__/entrypoints.cpython-39.pyc,, +pip/_internal/utils/__pycache__/filesystem.cpython-39.pyc,, +pip/_internal/utils/__pycache__/filetypes.cpython-39.pyc,, +pip/_internal/utils/__pycache__/glibc.cpython-39.pyc,, +pip/_internal/utils/__pycache__/hashes.cpython-39.pyc,, +pip/_internal/utils/__pycache__/inject_securetransport.cpython-39.pyc,, +pip/_internal/utils/__pycache__/logging.cpython-39.pyc,, +pip/_internal/utils/__pycache__/misc.cpython-39.pyc,, +pip/_internal/utils/__pycache__/models.cpython-39.pyc,, +pip/_internal/utils/__pycache__/packaging.cpython-39.pyc,, +pip/_internal/utils/__pycache__/parallel.cpython-39.pyc,, +pip/_internal/utils/__pycache__/pkg_resources.cpython-39.pyc,, +pip/_internal/utils/__pycache__/setuptools_build.cpython-39.pyc,, +pip/_internal/utils/__pycache__/subprocess.cpython-39.pyc,, +pip/_internal/utils/__pycache__/temp_dir.cpython-39.pyc,, +pip/_internal/utils/__pycache__/unpacking.cpython-39.pyc,, +pip/_internal/utils/__pycache__/urls.cpython-39.pyc,, +pip/_internal/utils/__pycache__/virtualenv.cpython-39.pyc,, +pip/_internal/utils/__pycache__/wheel.cpython-39.pyc,, +pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015 +pip/_internal/utils/appdirs.py,sha256=CyH0arjhfR4kaeybXs5B1hxe66KeeCfssJhiRFxpFJk,1185 +pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884 +pip/_internal/utils/compatibility_tags.py,sha256=h2P4U0ZCkWHwPYveBzFZA79it6agElRhm6yci7S8MCo,5454 +pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242 +pip/_internal/utils/deprecation.py,sha256=0bdiuvnAcAZMp1dDrwxK7uDgmJQDHVfb1790_ypO9U4,3200 +pip/_internal/utils/direct_url_helpers.py,sha256=5ffB9GHoqalUvSU6C53lEFdUgYcWAbXJGfyCwGyIlrY,2994 +pip/_internal/utils/distutils_args.py,sha256=mcAscyp80vTt3xAGTipnpgc83V-_wCvydNELVXLq7JI,1249 +pip/_internal/utils/encoding.py,sha256=bdZ3YgUpaOEBI5MP4-DEXiQarCW3V0rxw1kRz-TaU1Q,1169 +pip/_internal/utils/entrypoints.py,sha256=aPvCnQVi9Hdk35Kloww_D5ibjUpqxgqcJP8O9VuMZek,1055 +pip/_internal/utils/filesystem.py,sha256=rrl-rY1w8TYyKYndUyZlE9ffkQyA4-jI9x_59zXkn5s,5893 +pip/_internal/utils/filetypes.py,sha256=weviVbapHWVQ_8-K-PTQ_TnYL66kZi4SrVBTmRYZXLc,761 +pip/_internal/utils/glibc.py,sha256=GM1Y2hWkOf_tumySGFg-iNbc7oilBQQrjczb_705CF8,3170 +pip/_internal/utils/hashes.py,sha256=o1qQEkqe2AqsRm_JhLoM4hkxmVtewH0ZZpQ6EBObHuU,5167 +pip/_internal/utils/inject_securetransport.py,sha256=tGl9Bgyt2IHKtB3b0B-6r3W2yYF3Og-PBe0647S3lZs,810 +pip/_internal/utils/logging.py,sha256=E5VE1n-pqgdd5DajPQPKpmu7VpJVd7dAhhdjPZNsYjE,12344 +pip/_internal/utils/misc.py,sha256=WhWMKbtoBWvGrqVMaPekKML-orsLnD2e0N83arjpYQw,23644 +pip/_internal/utils/models.py,sha256=qCgYyUw2mIH1pombsJ3YQsMtONZgyJ4BGwO5MJnSC4c,1329 +pip/_internal/utils/packaging.py,sha256=I1938AB7FprcVJJd6C0vSiMuCVajmrxZF55vX5j0bMo,2900 +pip/_internal/utils/parallel.py,sha256=RZF4JddPEWVbkkPCknfvpqaLfm3Pmqd_ABoCHmV4lXs,3224 +pip/_internal/utils/pkg_resources.py,sha256=jwH5JViPe-JlXLvLC0-ASfTTCRYvm0u9CwQGcWjxStI,1106 +pip/_internal/utils/setuptools_build.py,sha256=xk9sRBjUyNTHs_TvEWebVWs1GfLPN208MzpSXr9Ok_A,5047 +pip/_internal/utils/subprocess.py,sha256=7QOQPJj6ezIVsypJJrcyyq4-mJM9qUsOdOLq0_wUiAA,10043 +pip/_internal/utils/temp_dir.py,sha256=9gs3N9GQeVXRVWjJIalSpH1uj8yQXPTzarb5n1_HMVo,7950 +pip/_internal/utils/unpacking.py,sha256=_qYZgmq8b0rRAN2swXsf9VfPogrjShlsTvhRI2heBYI,9050 +pip/_internal/utils/urls.py,sha256=O5f4VeKJ9cWt_CKqqKmiDTW48uOzo0UNb1QWPQ0n2TI,1798 +pip/_internal/utils/virtualenv.py,sha256=iRTK-sD6bWpHqXcZ0ECfdpFLWatMOHFUVCIRa0L6Gu0,3564 +pip/_internal/utils/wheel.py,sha256=DOIVZaXN7bMOAeMEqzIOZHGl4OFO-KGrEqBUB848DPo,6290 +pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596 +pip/_internal/vcs/__pycache__/__init__.cpython-39.pyc,, +pip/_internal/vcs/__pycache__/bazaar.cpython-39.pyc,, +pip/_internal/vcs/__pycache__/git.cpython-39.pyc,, +pip/_internal/vcs/__pycache__/mercurial.cpython-39.pyc,, +pip/_internal/vcs/__pycache__/subversion.cpython-39.pyc,, +pip/_internal/vcs/__pycache__/versioncontrol.cpython-39.pyc,, +pip/_internal/vcs/bazaar.py,sha256=Ay_vN-87vYSEzBqXT3RVwl40vlk56j3jy_AfQbMj4uo,2962 +pip/_internal/vcs/git.py,sha256=VDSzQlkh1390xw6PMh6fneJAZyc1s9qHZgum3wO3DOU,17347 +pip/_internal/vcs/mercurial.py,sha256=WwoTWZQdQN9FcUTINvIeb0Vt46UJ_lLdf2BAdea9Tic,5076 +pip/_internal/vcs/subversion.py,sha256=FRMYx7q-b6skWuv6IU7tJyC8Jm8PPblMnH7WN_ucXWU,11866 +pip/_internal/vcs/versioncontrol.py,sha256=jMKitwE4bQ45jOKKomBxgBypm2TcuDGWWdTUmPa-MUQ,23276 +pip/_internal/wheel_builder.py,sha256=hW63ZmABr65rOiSRBHXu1jBUdEZw5LZiw0LaQBbz0lI,11740 +pip/_vendor/__init__.py,sha256=eE_yoHELq6Kw--WqhAEcKkvHLKbmTR1-JX_Th1wcNZc,4703 +pip/_vendor/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/__pycache__/appdirs.cpython-39.pyc,, +pip/_vendor/__pycache__/distro.cpython-39.pyc,, +pip/_vendor/__pycache__/pyparsing.cpython-39.pyc,, +pip/_vendor/__pycache__/six.cpython-39.pyc,, +pip/_vendor/appdirs.py,sha256=M6IYRJtdZgmSPCXCSMBRB0VT3P8MdFbWCDbSLrB2Ebg,25907 +pip/_vendor/cachecontrol/__init__.py,sha256=pJtAaUxOsMPnytI1A3juAJkXYDr8krdSnsg4Yg3OBEg,302 +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-39.pyc,, +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-39.pyc,, +pip/_vendor/cachecontrol/__pycache__/cache.cpython-39.pyc,, +pip/_vendor/cachecontrol/__pycache__/compat.cpython-39.pyc,, +pip/_vendor/cachecontrol/__pycache__/controller.cpython-39.pyc,, +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-39.pyc,, +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-39.pyc,, +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-39.pyc,, +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-39.pyc,, +pip/_vendor/cachecontrol/_cmd.py,sha256=URGE0KrA87QekCG3SGPatlSPT571dZTDjNa-ZXX3pDc,1295 +pip/_vendor/cachecontrol/adapter.py,sha256=sSwaSYd93IIfCFU4tOMgSo6b2LCt_gBSaQUj8ktJFOA,4882 +pip/_vendor/cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805 +pip/_vendor/cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86 +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-39.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-39.pyc,, +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=nYVKsJtXh6gJXvdn1iWyrhxvkwpQrK-eKoMRzuiwkKk,4153 +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=HxelMpNCo-dYr2fiJDwM3hhhRmxUYtB5tXm1GpAAT4Y,856 +pip/_vendor/cachecontrol/compat.py,sha256=kHNvMRdt6s_Xwqq_9qJmr9ou3wYMOMUMxPPcwNxT8Mc,695 +pip/_vendor/cachecontrol/controller.py,sha256=CWEX3pedIM9s60suf4zZPtm_JvVgnvogMGK_OiBG5F8,14149 +pip/_vendor/cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533 +pip/_vendor/cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070 +pip/_vendor/cachecontrol/serialize.py,sha256=vIa4jvq4x_KSOLdEIedoknX2aXYHQujLDFV4-F21Dno,7091 +pip/_vendor/cachecontrol/wrapper.py,sha256=5LX0uJwkNQUtYSEw3aGmGu9WY8wGipd81mJ8lG0d0M4,690 +pip/_vendor/certifi/__init__.py,sha256=-b78tXibbl0qtgCzv9tc9v6ozwcNX915lT9Tf4a9lds,62 +pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 +pip/_vendor/certifi/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/certifi/__pycache__/__main__.cpython-39.pyc,, +pip/_vendor/certifi/__pycache__/core.cpython-39.pyc,, +pip/_vendor/certifi/cacert.pem,sha256=3i-hfE2K5o3CBKG2tYt6ehJWk2fP64o6Th83fHPoPp4,259465 +pip/_vendor/certifi/core.py,sha256=gOFd0zHYlx4krrLEn982esOtmz3djiG0BFSDhgjlvcI,2840 +pip/_vendor/chardet/__init__.py,sha256=mWZaWmvZkhwfBEAT9O1Y6nRTfKzhT7FHhQTTAujbqUA,3271 +pip/_vendor/chardet/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/big5freq.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/big5prober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/chardistribution.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/charsetprober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/compat.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/cp949prober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/enums.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/escprober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/escsm.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/eucjpprober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/euckrfreq.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/euckrprober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/euctwfreq.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/euctwprober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/gb2312freq.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/gb2312prober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/hebrewprober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/jisfreq.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/jpcntx.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/langthaimodel.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/latin1prober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/mbcssm.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/sjisprober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/universaldetector.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/utf8prober.cpython-39.pyc,, +pip/_vendor/chardet/__pycache__/version.cpython-39.pyc,, +pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +pip/_vendor/chardet/charsetgroupprober.py,sha256=GZLReHP6FRRn43hvSOoGCxYamErKzyp6RgOQxVeC3kg,3839 +pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +pip/_vendor/chardet/cli/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-39.pyc,, +pip/_vendor/chardet/cli/chardetect.py,sha256=XK5zqjUG2a4-y6eLHZ8ThYcp6WWUrdlmELxNypcc2SE,2747 +pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +pip/_vendor/chardet/compat.py,sha256=40zr6wICZwknxyuLGGcIOPyve8DTebBCbbvttvnmp5Q,1200 +pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +pip/_vendor/chardet/langbulgarianmodel.py,sha256=rk9CJpuxO0bObboJcv6gNgWuosYZmd8qEEds5y7DS_Y,105697 +pip/_vendor/chardet/langgreekmodel.py,sha256=S-uNQ1ihC75yhBvSux24gLFZv3QyctMwC6OxLJdX-bw,99571 +pip/_vendor/chardet/langhebrewmodel.py,sha256=DzPP6TPGG_-PV7tqspu_d8duueqm7uN-5eQ0aHUw1Gg,98776 +pip/_vendor/chardet/langhungarianmodel.py,sha256=RtJH7DZdsmaHqyK46Kkmnk5wQHiJwJPPJSqqIlpeZRc,102498 +pip/_vendor/chardet/langrussianmodel.py,sha256=THqJOhSxiTQcHboDNSc5yofc2koXXQFHFyjtyuntUfM,131180 +pip/_vendor/chardet/langthaimodel.py,sha256=R1wXHnUMtejpw0JnH_JO8XdYasME6wjVqp1zP7TKLgg,103312 +pip/_vendor/chardet/langturkishmodel.py,sha256=rfwanTptTwSycE4-P-QasPmzd-XVYgevytzjlEzBBu8,95946 +pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/chardet/metadata/__pycache__/languages.cpython-39.pyc,, +pip/_vendor/chardet/metadata/languages.py,sha256=41tLq3eLSrBEbEVVQpVGFq9K7o1ln9b1HpY1l0hCUQo,19474 +pip/_vendor/chardet/sbcharsetprober.py,sha256=nmyMyuxzG87DN6K3Rk2MUzJLMLR69MrWpdnHzOwVUwQ,6136 +pip/_vendor/chardet/sbcsgroupprober.py,sha256=hqefQuXmiFyDBArOjujH6hd6WFXlOD1kWCsxDhjx5Vc,4309 +pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +pip/_vendor/chardet/universaldetector.py,sha256=DpZTXCX0nUHXxkQ9sr4GZxGB_hveZ6hWt3uM94cgWKs,12503 +pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +pip/_vendor/chardet/version.py,sha256=A4CILFAd8MRVG1HoXPp45iK9RLlWyV73a1EtwE8Tvn8,242 +pip/_vendor/colorama/__init__.py,sha256=pCdErryzLSzDW5P-rRPBlPLqbBtIRNJB6cMgoeJns5k,239 +pip/_vendor/colorama/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/colorama/__pycache__/ansi.cpython-39.pyc,, +pip/_vendor/colorama/__pycache__/ansitowin32.cpython-39.pyc,, +pip/_vendor/colorama/__pycache__/initialise.cpython-39.pyc,, +pip/_vendor/colorama/__pycache__/win32.cpython-39.pyc,, +pip/_vendor/colorama/__pycache__/winterm.cpython-39.pyc,, +pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 +pip/_vendor/colorama/ansitowin32.py,sha256=yV7CEmCb19MjnJKODZEEvMH_fnbJhwnpzo4sxZuGXmA,10517 +pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 +pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 +pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 +pip/_vendor/distlib/__init__.py,sha256=bHNWOvZsLE4ES9S4FEA8CyP-rDYzatVgp9GHbpTnb2I,581 +pip/_vendor/distlib/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/distlib/__pycache__/compat.cpython-39.pyc,, +pip/_vendor/distlib/__pycache__/database.cpython-39.pyc,, +pip/_vendor/distlib/__pycache__/index.cpython-39.pyc,, +pip/_vendor/distlib/__pycache__/locators.cpython-39.pyc,, +pip/_vendor/distlib/__pycache__/manifest.cpython-39.pyc,, +pip/_vendor/distlib/__pycache__/markers.cpython-39.pyc,, +pip/_vendor/distlib/__pycache__/metadata.cpython-39.pyc,, +pip/_vendor/distlib/__pycache__/resources.cpython-39.pyc,, +pip/_vendor/distlib/__pycache__/scripts.cpython-39.pyc,, +pip/_vendor/distlib/__pycache__/util.cpython-39.pyc,, +pip/_vendor/distlib/__pycache__/version.cpython-39.pyc,, +pip/_vendor/distlib/__pycache__/wheel.cpython-39.pyc,, +pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 +pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/distlib/_backport/__pycache__/misc.cpython-39.pyc,, +pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-39.pyc,, +pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-39.pyc,, +pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-39.pyc,, +pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 +pip/_vendor/distlib/_backport/shutil.py,sha256=IX_G2NPqwecJibkIDje04bqu0xpHkfSQ2GaGdEVqM5Y,25707 +pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617 +pip/_vendor/distlib/_backport/sysconfig.py,sha256=BQHFlb6pubCl_dvT1NjtzIthylofjKisox239stDg0U,26854 +pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 +pip/_vendor/distlib/compat.py,sha256=ADA56xiAxar3mU6qemlBhNbsrFPosXRhO44RzsbJPqk,41408 +pip/_vendor/distlib/database.py,sha256=Kl0YvPQKc4OcpVi7k5cFziydM1xOK8iqdxLGXgbZHV4,51059 +pip/_vendor/distlib/index.py,sha256=UfcimNW19AB7IKWam4VaJbXuCBvArKfSxhV16EwavzE,20739 +pip/_vendor/distlib/locators.py,sha256=AKlB3oZvfOTg4E0CtfwOzujFL19X5V4XUA4eHdKOu44,51965 +pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 +pip/_vendor/distlib/markers.py,sha256=OunMSH1SIbvLLt4z2VEERCll4WNlz2tDrg1mSXCNUj4,4344 +pip/_vendor/distlib/metadata.py,sha256=vatoxFdmBr6ie-sTVXVNPOPG3uwMDWJTnEECnm7xDCw,39109 +pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820 +pip/_vendor/distlib/scripts.py,sha256=YD5_kioPD-qybYwQ4Gxyu-FR4ffxczy2gdBuU4II9qA,17248 +pip/_vendor/distlib/t32.exe,sha256=NS3xBCVAld35JVFNmb-1QRyVtThukMrwZVeXn4LhaEQ,96768 +pip/_vendor/distlib/t64.exe,sha256=oAqHes78rUWVM0OtVqIhUvequl_PKhAhXYQWnUf7zR0,105984 +pip/_vendor/distlib/util.py,sha256=eIKKJ5Mp4unHMOVzixRIRxGq4ty5-h_PoFmZ_lpvkkM,67558 +pip/_vendor/distlib/version.py,sha256=_geOv-cHoV-G8dQzKI8g6z8F0XeFeUqdJ_1G1K6iyrQ,23508 +pip/_vendor/distlib/w32.exe,sha256=lJtnZdeUxTZWya_EW5DZos_K5rswRECGspIl8ZJCIXs,90112 +pip/_vendor/distlib/w64.exe,sha256=0aRzoN2BO9NWW4ENy4_4vHkHR4qZTFZNVSAJJYlODTI,99840 +pip/_vendor/distlib/wheel.py,sha256=W6aQQo2Si0CzWiCaqlS-Nu8CoHnDbmcGMqRxCHJmg_Q,43062 +pip/_vendor/distro.py,sha256=xxMIh2a3KmippeWEHzynTdHT3_jZM0o-pos0dAWJROM,43628 +pip/_vendor/html5lib/__init__.py,sha256=BYzcKCqeEii52xDrqBFruhnmtmkiuHXFyFh-cglQ8mk,1160 +pip/_vendor/html5lib/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-39.pyc,, +pip/_vendor/html5lib/__pycache__/_inputstream.cpython-39.pyc,, +pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-39.pyc,, +pip/_vendor/html5lib/__pycache__/_utils.cpython-39.pyc,, +pip/_vendor/html5lib/__pycache__/constants.cpython-39.pyc,, +pip/_vendor/html5lib/__pycache__/html5parser.cpython-39.pyc,, +pip/_vendor/html5lib/__pycache__/serializer.cpython-39.pyc,, +pip/_vendor/html5lib/_ihatexml.py,sha256=ifOwF7pXqmyThIXc3boWc96s4MDezqRrRVp7FwDYUFs,16728 +pip/_vendor/html5lib/_inputstream.py,sha256=jErNASMlkgs7MpOM9Ve_VdLDJyFFweAjLuhVutZz33U,32353 +pip/_vendor/html5lib/_tokenizer.py,sha256=04mgA2sNTniutl2fxFv-ei5bns4iRaPxVXXHh_HrV_4,77040 +pip/_vendor/html5lib/_trie/__init__.py,sha256=nqfgO910329BEVJ5T4psVwQtjd2iJyEXQ2-X8c1YxwU,109 +pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-39.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/py.cpython-39.pyc,, +pip/_vendor/html5lib/_trie/_base.py,sha256=CaybYyMro8uERQYjby2tTeSUatnWDfWroUN9N7ety5w,1013 +pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 +pip/_vendor/html5lib/_utils.py,sha256=Dx9AKntksRjFT1veBj7I362pf5OgIaT0zglwq43RnfU,4931 +pip/_vendor/html5lib/constants.py,sha256=Ll-yzLU_jcjyAI_h57zkqZ7aQWE5t5xA4y_jQgoUUhw,83464 +pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-39.pyc,, +pip/_vendor/html5lib/filters/__pycache__/base.cpython-39.pyc,, +pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-39.pyc,, +pip/_vendor/html5lib/filters/__pycache__/lint.cpython-39.pyc,, +pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-39.pyc,, +pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-39.pyc,, +pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-39.pyc,, +pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919 +pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 +pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945 +pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643 +pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588 +pip/_vendor/html5lib/filters/sanitizer.py,sha256=m6oGmkBhkGAnn2nV6D4hE78SCZ6WEnK9rKdZB3uXBIc,26897 +pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214 +pip/_vendor/html5lib/html5parser.py,sha256=anr-aXre_ImfrkQ35c_rftKXxC80vJCREKe06Tq15HA,117186 +pip/_vendor/html5lib/serializer.py,sha256=_PpvcZF07cwE7xr9uKkZqh5f4UEaI8ltCU2xPJzaTpk,15759 +pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679 +pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-39.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-39.pyc,, +pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715 +pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776 +pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592 +pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-39.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-39.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-39.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-39.pyc,, +pip/_vendor/html5lib/treebuilders/base.py,sha256=z-o51vt9r_l2IDG5IioTOKGzZne4Fy3_Fc-7ztrOh4I,14565 +pip/_vendor/html5lib/treebuilders/dom.py,sha256=22whb0C71zXIsai5mamg6qzBEiigcBIvaDy4Asw3at0,8925 +pip/_vendor/html5lib/treebuilders/etree.py,sha256=w5ZFpKk6bAxnrwD2_BrF5EVC7vzz0L3LMi9Sxrbc_8w,12836 +pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9gqDjs-IxsPhBYa5cpvv2FZ1KZlG83Giusy2lFmvIkE,14766 +pip/_vendor/html5lib/treewalkers/__init__.py,sha256=OBPtc1TU5mGyy18QDMxKEyYEz0wxFUUNj5v0-XgmYhY,5719 +pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-39.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-39.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-39.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-39.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-39.pyc,, +pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476 +pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 +pip/_vendor/html5lib/treewalkers/etree.py,sha256=xo1L5m9VtkfpFJK0pFmkLVajhqYYVisVZn3k9kYpPkI,4551 +pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=_b0LAVWLcVu9WaU_-w3D8f0IRSpCbjf667V-3NRdhTw,6357 +pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 +pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 +pip/_vendor/idna/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/idna/__pycache__/codec.cpython-39.pyc,, +pip/_vendor/idna/__pycache__/compat.cpython-39.pyc,, +pip/_vendor/idna/__pycache__/core.cpython-39.pyc,, +pip/_vendor/idna/__pycache__/idnadata.cpython-39.pyc,, +pip/_vendor/idna/__pycache__/intranges.cpython-39.pyc,, +pip/_vendor/idna/__pycache__/package_data.cpython-39.pyc,, +pip/_vendor/idna/__pycache__/uts46data.cpython-39.pyc,, +pip/_vendor/idna/codec.py,sha256=QsPFD3Je8gN17rfs14e7zTGRWlnL7bNf2ZqcHTRVYHs,3453 +pip/_vendor/idna/compat.py,sha256=5A9xR04puRHCsyjBNewZlVSiarth7K1bZqyEOeob1fA,360 +pip/_vendor/idna/core.py,sha256=icq2P13S6JMjoXgKhhd6ihhby7QsnZlNfniH6fLyf6U,12826 +pip/_vendor/idna/idnadata.py,sha256=cl4x9RLdw1ZMtEEbvKwAsX-Id3AdIjO5U3HaoKM6VGs,42350 +pip/_vendor/idna/intranges.py,sha256=EqgXwyATAn-CTACInqH9tYsYAitGB2VcQ50RZt_Cpjs,1933 +pip/_vendor/idna/package_data.py,sha256=_028B4fvadRIaXMwMYjhuQPP3AxTIt1IRE7X6RDR4Mk,21 +pip/_vendor/idna/uts46data.py,sha256=DGzwDQv8JijY17I_7ondo3stjFjNnjvVAbA-z0k1XOE,201849 +pip/_vendor/msgpack/__init__.py,sha256=2gJwcsTIaAtCM0GMi2rU-_Y6kILeeQuqRkrQ22jSANc,1118 +pip/_vendor/msgpack/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/msgpack/__pycache__/_version.cpython-39.pyc,, +pip/_vendor/msgpack/__pycache__/exceptions.cpython-39.pyc,, +pip/_vendor/msgpack/__pycache__/ext.cpython-39.pyc,, +pip/_vendor/msgpack/__pycache__/fallback.cpython-39.pyc,, +pip/_vendor/msgpack/_version.py,sha256=dFR03oACnj4lsKd1RnwD7BPMiVI_FMygdOL1TOBEw_U,20 +pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 +pip/_vendor/msgpack/ext.py,sha256=4l356Y4sVEcvCla2dh_cL57vh4GMhZfa3kuWHFHYz6A,6088 +pip/_vendor/msgpack/fallback.py,sha256=Rpv1Ldey8f8ueRnQznD4ARKBn9dxM2PywVNkXI8IEeE,38026 +pip/_vendor/packaging/__about__.py,sha256=p_OQloqH2saadcbUQmWEsWK857dI6_ff5E3aSiCqGFA,661 +pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497 +pip/_vendor/packaging/__pycache__/__about__.cpython-39.pyc,, +pip/_vendor/packaging/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/packaging/__pycache__/_manylinux.cpython-39.pyc,, +pip/_vendor/packaging/__pycache__/_musllinux.cpython-39.pyc,, +pip/_vendor/packaging/__pycache__/_structures.cpython-39.pyc,, +pip/_vendor/packaging/__pycache__/markers.cpython-39.pyc,, +pip/_vendor/packaging/__pycache__/requirements.cpython-39.pyc,, +pip/_vendor/packaging/__pycache__/specifiers.cpython-39.pyc,, +pip/_vendor/packaging/__pycache__/tags.cpython-39.pyc,, +pip/_vendor/packaging/__pycache__/utils.cpython-39.pyc,, +pip/_vendor/packaging/__pycache__/version.cpython-39.pyc,, +pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488 +pip/_vendor/packaging/_musllinux.py,sha256=z5yeG1ygOPx4uUyLdqj-p8Dk5UBb5H_b0NIjW9yo8oA,4378 +pip/_vendor/packaging/_structures.py,sha256=TMiAgFbdUOPmIfDIfiHc3KFhSJ8kMjof2QS5I-2NyQ8,1629 +pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487 +pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676 +pip/_vendor/packaging/specifiers.py,sha256=MZ-fYcNL3u7pNrt-6g2EQO7AbRXkjc-SPEYwXMQbLmc,30964 +pip/_vendor/packaging/tags.py,sha256=akIerYw8W0sz4OW9HHozgawWnbt2GGOPm3sviW0jowY,15714 +pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200 +pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665 +pip/_vendor/pep517/__init__.py,sha256=qDgVbDWpBYpTvtxA2tilifXlxwzOzRqIodLZdbyahyQ,130 +pip/_vendor/pep517/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/pep517/__pycache__/build.cpython-39.pyc,, +pip/_vendor/pep517/__pycache__/check.cpython-39.pyc,, +pip/_vendor/pep517/__pycache__/colorlog.cpython-39.pyc,, +pip/_vendor/pep517/__pycache__/compat.cpython-39.pyc,, +pip/_vendor/pep517/__pycache__/dirtools.cpython-39.pyc,, +pip/_vendor/pep517/__pycache__/envbuild.cpython-39.pyc,, +pip/_vendor/pep517/__pycache__/meta.cpython-39.pyc,, +pip/_vendor/pep517/__pycache__/wrappers.cpython-39.pyc,, +pip/_vendor/pep517/build.py,sha256=MqN_W6o5a9oauTC0u6W5cILGFjf9x2BV9BdMLeY60hc,3469 +pip/_vendor/pep517/check.py,sha256=AYG2yvpzmtsL810c75Z5-nhaXa7SxgK8APyw-_x53Ok,6096 +pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098 +pip/_vendor/pep517/compat.py,sha256=fw2Py6lqLwJLfp6MKmXvt1m4sbbgoU1D-_gcScvz8OU,1071 +pip/_vendor/pep517/dirtools.py,sha256=2mkAkAL0mRz_elYFjRKuekTJVipH1zTn4tbf1EDev84,1129 +pip/_vendor/pep517/envbuild.py,sha256=LcST0MASmcQNLOFqDPxDoS1kjkglx8F6eEhoBJ-DWkg,6112 +pip/_vendor/pep517/in_process/__init__.py,sha256=MyWoAi8JHdcBv7yXuWpUSVADbx6LSB9rZh7kTIgdA8Y,563 +pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-39.pyc,, +pip/_vendor/pep517/in_process/_in_process.py,sha256=YJJf-qaL7BBVdgCHuMhTpx-LtwG1EIGVfly4rtusdiI,10833 +pip/_vendor/pep517/meta.py,sha256=8mnM5lDnT4zXQpBTliJbRGfesH7iioHwozbDxALPS9Y,2463 +pip/_vendor/pep517/wrappers.py,sha256=qCWfEUnbE5387PyQl7cT8xv4dDca4uNgro_0bnAO4Rk,13258 +pip/_vendor/pkg_resources/__init__.py,sha256=XpGBfvS9fafA6bm5rx7vnxdxs7yqyoc_NnpzKApkJ64,108277 +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-39.pyc,, +pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 +pip/_vendor/progress/__init__.py,sha256=fcbQQXo5np2CoQyhSH5XprkicwLZNLePR3uIahznSO0,4857 +pip/_vendor/progress/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/progress/__pycache__/bar.cpython-39.pyc,, +pip/_vendor/progress/__pycache__/counter.cpython-39.pyc,, +pip/_vendor/progress/__pycache__/spinner.cpython-39.pyc,, +pip/_vendor/progress/bar.py,sha256=QuDuVNcmXgpxtNtxO0Fq72xKigxABaVmxYGBw4J3Z_E,2854 +pip/_vendor/progress/counter.py,sha256=MznyBrvPWrOlGe4MZAlGUb9q3aODe6_aNYeAE_VNoYA,1372 +pip/_vendor/progress/spinner.py,sha256=k8JbDW94T0-WXuXfxZIFhdoNPYp3jfnpXqBnfRv5fGs,1380 +pip/_vendor/pyparsing.py,sha256=J1b4z3S_KwyJW7hKGnoN-hXW9pgMIzIP6QThyY5yJq4,273394 +pip/_vendor/requests/__init__.py,sha256=g4Bh1QYh6JKjMS4YLobx0uOLq-41sINaXjvbhX2VI8g,5113 +pip/_vendor/requests/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/__version__.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/_internal_utils.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/adapters.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/api.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/auth.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/certs.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/compat.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/cookies.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/exceptions.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/help.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/hooks.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/models.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/packages.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/sessions.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/status_codes.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/structures.cpython-39.pyc,, +pip/_vendor/requests/__pycache__/utils.cpython-39.pyc,, +pip/_vendor/requests/__version__.py,sha256=PZEyPTSIN_jRIAIB51wV7pw81m3qAw0InSR7OrKZUnE,441 +pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 +pip/_vendor/requests/adapters.py,sha256=e-bmKEApNVqFdylxuMJJfiaHdlmS_zhWhIMEzlHvGuc,21548 +pip/_vendor/requests/api.py,sha256=hjuoP79IAEmX6Dysrw8t032cLfwLHxbI_wM4gC5G9t0,6402 +pip/_vendor/requests/auth.py,sha256=OMoJIVKyRLy9THr91y8rxysZuclwPB-K1Xg1zBomUhQ,10207 +pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465 +pip/_vendor/requests/compat.py,sha256=LQWuCR4qXk6w7-qQopXyz0WNHUdAD40k0mKnaAEf1-g,2045 +pip/_vendor/requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430 +pip/_vendor/requests/exceptions.py,sha256=dwIi512RCDqXJ2T81nLC88mqPNhUFnOI_CgKKDXhTO8,3250 +pip/_vendor/requests/help.py,sha256=dyhe3lcmHXnFCzDiZVjcGmVvvO_jtsfAm-AC542ndw8,3972 +pip/_vendor/requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757 +pip/_vendor/requests/models.py,sha256=9_LS_t1t6HbbaWFE3ZkxGmmHN2V8BgxziiOU84rrQ50,34924 +pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 +pip/_vendor/requests/sessions.py,sha256=57O4ud9yRL6eLYh-dtFbqC1kO4d_EwZcCgYXEkujlfs,30168 +pip/_vendor/requests/status_codes.py,sha256=gT79Pbs_cQjBgp-fvrUgg1dn2DQO32bDj4TInjnMPSc,4188 +pip/_vendor/requests/structures.py,sha256=msAtr9mq1JxHd-JRyiILfdFlpbJwvvFuP3rfUQT_QxE,3005 +pip/_vendor/requests/utils.py,sha256=U_-i6WxLw-67KEij43xHbcvL0DdeQ5Jbd4hfifWJzQY,31394 +pip/_vendor/resolvelib/__init__.py,sha256=uoW0dgWCDwApX59mRffoPISkZGGk_UZ1It_PY4o_PaE,537 +pip/_vendor/resolvelib/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/resolvelib/__pycache__/providers.cpython-39.pyc,, +pip/_vendor/resolvelib/__pycache__/reporters.cpython-39.pyc,, +pip/_vendor/resolvelib/__pycache__/resolvers.cpython-39.pyc,, +pip/_vendor/resolvelib/__pycache__/structs.cpython-39.pyc,, +pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-39.pyc,, +pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156 +pip/_vendor/resolvelib/providers.py,sha256=bfzFDZd7UqkkAS7lUM_HeYbA-HzjKfDlle_pn_79vio,5638 +pip/_vendor/resolvelib/reporters.py,sha256=hQvvXuuEBOyEWO8KDfLsWKVjX55UFMAUwO0YZMNpzAw,1364 +pip/_vendor/resolvelib/resolvers.py,sha256=wT83PHiBWRCklL-nLJ1-8sk2B3yBI06Rse1H11crOsI,17225 +pip/_vendor/resolvelib/structs.py,sha256=IVIYof6sA_N4ZEiE1C1UhzTX495brCNnyCdgq6CYq28,4794 +pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549 +pip/_vendor/tenacity/__init__.py,sha256=GLLsTFD4Bd5VDgTR6mU_FxyOsrxc48qONorVaRebeD4,18257 +pip/_vendor/tenacity/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/tenacity/__pycache__/_asyncio.cpython-39.pyc,, +pip/_vendor/tenacity/__pycache__/_utils.cpython-39.pyc,, +pip/_vendor/tenacity/__pycache__/after.cpython-39.pyc,, +pip/_vendor/tenacity/__pycache__/before.cpython-39.pyc,, +pip/_vendor/tenacity/__pycache__/before_sleep.cpython-39.pyc,, +pip/_vendor/tenacity/__pycache__/nap.cpython-39.pyc,, +pip/_vendor/tenacity/__pycache__/retry.cpython-39.pyc,, +pip/_vendor/tenacity/__pycache__/stop.cpython-39.pyc,, +pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-39.pyc,, +pip/_vendor/tenacity/__pycache__/wait.cpython-39.pyc,, +pip/_vendor/tenacity/_asyncio.py,sha256=HEb0BVJEeBJE9P-m9XBxh1KcaF96BwoeqkJCL5sbVcQ,3314 +pip/_vendor/tenacity/_utils.py,sha256=-y68scDcyoqvTJuJJ0GTfjdSCljEYlbCYvgk7nM4NdM,1944 +pip/_vendor/tenacity/after.py,sha256=dlmyxxFy2uqpLXDr838DiEd7jgv2AGthsWHGYcGYsaI,1496 +pip/_vendor/tenacity/before.py,sha256=7XtvRmO0dRWUp8SVn24OvIiGFj8-4OP5muQRUiWgLh0,1376 +pip/_vendor/tenacity/before_sleep.py,sha256=ThyDvqKU5yle_IvYQz_b6Tp6UjUS0PhVp6zgqYl9U6Y,1908 +pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383 +pip/_vendor/tenacity/retry.py,sha256=62R71W59bQjuNyFKsDM7hE2aEkEPtwNBRA0tnsEvgSk,6645 +pip/_vendor/tenacity/stop.py,sha256=sKHmHaoSaW6sKu3dTxUVKr1-stVkY7lw4Y9yjZU30zQ,2790 +pip/_vendor/tenacity/tornadoweb.py,sha256=E8lWO2nwe6dJgoB-N2HhQprYLDLB_UdSgFnv-EN6wKE,2145 +pip/_vendor/tenacity/wait.py,sha256=e_Saa6I2tsNLpCL1t9897wN2fGb0XQMQlE4bU2t9V2w,6691 +pip/_vendor/tomli/__init__.py,sha256=z1Elt0nLAqU5Y0DOn9p__8QnLWavlEOpRyQikdYgKro,230 +pip/_vendor/tomli/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/tomli/__pycache__/_parser.cpython-39.pyc,, +pip/_vendor/tomli/__pycache__/_re.cpython-39.pyc,, +pip/_vendor/tomli/_parser.py,sha256=50BD4o9YbzFAGAYyZLqZC8F81DQ7iWWyJnrHNwBKa6A,22415 +pip/_vendor/tomli/_re.py,sha256=5GPfgXKteg7wRFCF-DzlkAPI2ilHbkMK2-JC49F-AJQ,2681 +pip/_vendor/urllib3/__init__.py,sha256=j3yzHIbmW7CS-IKQJ9-PPQf_YKO8EOAey_rMW0UR7us,2763 +pip/_vendor/urllib3/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/urllib3/__pycache__/_collections.cpython-39.pyc,, +pip/_vendor/urllib3/__pycache__/_version.cpython-39.pyc,, +pip/_vendor/urllib3/__pycache__/connection.cpython-39.pyc,, +pip/_vendor/urllib3/__pycache__/connectionpool.cpython-39.pyc,, +pip/_vendor/urllib3/__pycache__/exceptions.cpython-39.pyc,, +pip/_vendor/urllib3/__pycache__/fields.cpython-39.pyc,, +pip/_vendor/urllib3/__pycache__/filepost.cpython-39.pyc,, +pip/_vendor/urllib3/__pycache__/poolmanager.cpython-39.pyc,, +pip/_vendor/urllib3/__pycache__/request.cpython-39.pyc,, +pip/_vendor/urllib3/__pycache__/response.cpython-39.pyc,, +pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811 +pip/_vendor/urllib3/_version.py,sha256=6fJAIPnJkT0m9wzVjHrFcq5wYt65dStDpaRcjj5ugoo,63 +pip/_vendor/urllib3/connection.py,sha256=kAlubwsW33FUSUroPSVHMF_Zzv-uzX_BwUFMXX9Pt8c,18754 +pip/_vendor/urllib3/connectionpool.py,sha256=jXNmm4y3LJWYgteNeGcYJx8-0k7bzKRU__AVTXzaIak,37131 +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-39.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-39.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-39.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-39.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-39.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-39.pyc,, +pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957 +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-39.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-39.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=eRy1Mj-wpg7sR6-OSvnSV4jUbjMT464dLN_CWxbIRVw,17649 +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=lgIdsSycqfB0Xm5BiJzXGeIKT7ybCQMFPJAgkcwPa1s,13908 +pip/_vendor/urllib3/contrib/appengine.py,sha256=lfzpHFmJiO82shClLEm3QB62SYgHWnjpZOH_2JhU5Tc,11034 +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=ej9gGvfAb2Gt00lafFp45SIoRz-QwrQ4WChm6gQmAlM,4538 +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=lYIxGFWTosqbfLnkZXOBg7igY71iRvM3NUOaD0stUQ8,16891 +pip/_vendor/urllib3/contrib/securetransport.py,sha256=TN5q9dKZ0Sd5_vW9baRzEAEItdJ-4VlHWmAUrlcJNfo,34434 +pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097 +pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217 +pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579 +pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440 +pip/_vendor/urllib3/packages/__init__.py,sha256=h4BLhD4tLaBx1adaDtKXfupsgqY0wWLXb_f1_yVlV6A,108 +pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/urllib3/packages/__pycache__/six.cpython-39.pyc,, +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-39.pyc,, +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417 +pip/_vendor/urllib3/packages/six.py,sha256=1LVW7ljqRirFlfExjwl-v1B7vSAUNTmzGMs-qays2zg,34666 +pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=ZVMwCkHx-py8ERsxxM3Il-MiREZktV-8iLBmCfRRHI4,927 +pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-39.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=6dZ-q074g7XhsJ27MFCgkct8iVNZB3sMZvKhf-KUVy0,5679 +pip/_vendor/urllib3/poolmanager.py,sha256=whzlX6UTEgODMOCy0ZDMUONRBCz5wyIM8Z9opXAY-Lk,19763 +pip/_vendor/urllib3/request.py,sha256=ZFSIqX0C6WizixecChZ3_okyu7BEv0lZu1VT0s6h4SM,5985 +pip/_vendor/urllib3/response.py,sha256=hGhGBh7TkEkh_IQg5C1W_xuPNrgIKv5BUXPyE-q0LuE,28203 +pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155 +pip/_vendor/urllib3/util/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/urllib3/util/__pycache__/connection.cpython-39.pyc,, +pip/_vendor/urllib3/util/__pycache__/proxy.cpython-39.pyc,, +pip/_vendor/urllib3/util/__pycache__/queue.cpython-39.pyc,, +pip/_vendor/urllib3/util/__pycache__/request.cpython-39.pyc,, +pip/_vendor/urllib3/util/__pycache__/response.cpython-39.pyc,, +pip/_vendor/urllib3/util/__pycache__/retry.cpython-39.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-39.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-39.pyc,, +pip/_vendor/urllib3/util/__pycache__/timeout.cpython-39.pyc,, +pip/_vendor/urllib3/util/__pycache__/url.cpython-39.pyc,, +pip/_vendor/urllib3/util/__pycache__/wait.cpython-39.pyc,, +pip/_vendor/urllib3/util/connection.py,sha256=KykjNIXzUZEzeKEOpl5xvKs6IsESXP9o9eTrjE0W_Ys,4920 +pip/_vendor/urllib3/util/proxy.py,sha256=FGipAEnvZteyldXNjce4DEB7YzwU-a5lep8y5S0qHQg,1604 +pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498 +pip/_vendor/urllib3/util/request.py,sha256=NnzaEKQ1Pauw5MFMV6HmgEMHITf0Aua9fQuzi2uZzGc,4123 +pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510 +pip/_vendor/urllib3/util/retry.py,sha256=tOWfZpLsuc7Vbk5nWpMwkHdMoXCp90IAvH4xtjSDRqQ,21391 +pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177 +pip/_vendor/urllib3/util/ssltransport.py,sha256=F_UncOXGcc-MgeWFTA1H4QCt_RRNQXRbF6onje3SyHY,6931 +pip/_vendor/urllib3/util/timeout.py,sha256=QSbBUNOB9yh6AnDn61SrLQ0hg5oz0I9-uXEG91AJuIg,10003 +pip/_vendor/urllib3/util/url.py,sha256=QVEzcbHipbXyCWwH6R4K4TR-N8T4LM55WEMwNUTBmLE,14047 +pip/_vendor/urllib3/util/wait.py,sha256=3MUKRSAUJDB2tgco7qRUskW0zXGAWYvRRE4Q1_6xlLs,5404 +pip/_vendor/vendor.txt,sha256=GuFhR0DHZazrSYZyoY7j3X3T_mGJh-ky2opcZ-A7ezo,364 +pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 +pip/_vendor/webencodings/__pycache__/__init__.cpython-39.pyc,, +pip/_vendor/webencodings/__pycache__/labels.cpython-39.pyc,, +pip/_vendor/webencodings/__pycache__/mklabels.cpython-39.pyc,, +pip/_vendor/webencodings/__pycache__/tests.cpython-39.pyc,, +pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-39.pyc,, +pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 +pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 +pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 +pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 +pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286 diff --git a/.venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/REQUESTED b/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/REQUESTED similarity index 100% rename from .venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/REQUESTED rename to .venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/REQUESTED diff --git a/.venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/WHEEL b/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/WHEEL similarity index 100% rename from .venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/WHEEL rename to .venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/WHEEL diff --git a/.venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/entry_points.txt b/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/entry_points.txt similarity index 70% rename from .venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/entry_points.txt rename to .venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/entry_points.txt index d48bd8a8..9609f72c 100644 --- a/.venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/entry_points.txt +++ b/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/entry_points.txt @@ -1,5 +1,5 @@ [console_scripts] pip = pip._internal.cli.main:main pip3 = pip._internal.cli.main:main -pip3.8 = pip._internal.cli.main:main +pip3.9 = pip._internal.cli.main:main diff --git a/.venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/top_level.txt b/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/top_level.txt similarity index 100% rename from .venv/lib/python3.9/site-packages/pip-21.2.3.dist-info/top_level.txt rename to .venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/top_level.txt diff --git a/.venv/lib/python3.9/site-packages/pip/__init__.py b/.venv/lib/python3.9/site-packages/pip/__init__.py index 3d8dd5c7..d6b05fef 100644 --- a/.venv/lib/python3.9/site-packages/pip/__init__.py +++ b/.venv/lib/python3.9/site-packages/pip/__init__.py @@ -1,6 +1,6 @@ from typing import List, Optional -__version__ = "21.2.3" +__version__ = "21.2.4" def main(args: Optional[List[str]] = None) -> int: diff --git a/.venv/lib/python3.9/site-packages/pip/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/__pycache__/__init__.cpython-39.pyc index 5f2ce7e2970abe35411b78ea73bceb291ac854ac..97012c177a2a6bc51060c258596d826f31f910d7 100644 GIT binary patch delta 27 hcmey%@|T4-k(ZZ?0SNZ24@pd&$Xm>4va#_GBLHv12#){& delta 27 hcmey%@|T4-k(ZZ?0SGjzLK2H6@)k21Z*2U-2mobw2hsol diff --git a/.venv/lib/python3.9/site-packages/pip/__pycache__/__main__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/__pycache__/__main__.cpython-39.pyc index 69ddf0814fa699d488e5c0827eda9de08e262748..81dd19c47c04766ca524496c9a9d1c361cef2d8d 100644 GIT binary patch delta 22 ccmcb}a*>5Mk(ZZ?0SNZ24@q3Nk=KO@07Lr*4*&oF delta 22 ccmcb}a*>5Mk(ZZ?0SGjzLK4qzJ06n?|WdHyG diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/__pycache__/__init__.cpython-39.pyc index 8492ad41655a0d2f1b47630713fc437269bb5b48..962ef4bea5e064bce55844cf1484abe19529754d 100644 GIT binary patch delta 22 ccmeyy`i+%0k(ZZ?0SNZ24@tD$$orBB07*&)j{pDw delta 22 ccmeyy`i+%0k(ZZ?0SGjzLJ|Wu^1fsO07A_L*#H0l diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/__pycache__/build_env.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/__pycache__/build_env.cpython-39.pyc index a7371222d1b08db7cd13b33b653f7f65be43a171..7bb69c39e13381dedced0006edc296e0520c11be 100644 GIT binary patch delta 23 dcmeBl?{w!&Td?uJLk(ZZ?0SNZ24@sPBx{+_6CID9S2WkKS delta 23 dcmX>Td?uJLk(ZZ?0SGjzLJ|$kH}dV%1OQCS1~vcy diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/__pycache__/exceptions.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/__pycache__/exceptions.cpython-39.pyc index abe8f361116f7ca848092696545bb900426bf91f..c052c2773cd71eb816b3f0171cb65e33ab1fadf5 100644 GIT binary patch delta 23 dcmZ2jwXljWk(ZZ?0SNZ24@oRC-pD6x3jkB72A%)_ delta 23 dcmZ2jwXljWk(ZZ?0SGjzLK6R*Y~&NR1prT024esK diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/__pycache__/main.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/__pycache__/main.cpython-39.pyc index 44be44fec4bfd2eddeef58ed53b3987c4d6593c2..f6a0459b4683ccf254b8d8613f05d8859f2f04a3 100644 GIT binary patch delta 22 ccmX@ca*TyHk(ZZ?0SNZ24@r#Q$ZN?206>fdp8x;= delta 22 ccmX@ca*TyHk(ZZ?0SGjzLK1T}@>((h06Fml;{X5v diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/__pycache__/pyproject.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/__pycache__/pyproject.cpython-39.pyc index 7bfb7a0de3e72b9bf1807c8f29129310b02121ea..1fd2de922232448f8561927eb87f7ceabe846f77 100644 GIT binary patch delta 23 dcmZpbZk6Us+{pJ@002~b2M+)M delta 23 dcmeyV_*0QDk(ZZ?0SGjzLK69wTjk(ZZ?0SNZ24@qp<$jiwH064S-F8}}l delta 22 ccmbQnG>wTjk(ZZ?0SGjzLJ~VR@^Uf)05R+YY5)KL diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-39.pyc index 575823dc9aa7edb511b9539bd29ad6b9ef1a874e..d4205076238a978a15f39ebfb44430b96f646006 100644 GIT binary patch delta 23 dcmeCz=-1#&Y~*7U0RTmo1`PlJ delta 23 ccmeCz=-1#&b8*t0$)u{v)f-^FkMZp;Xx delta 25 fcmcb=p7H*AM!rN|UM>b8(5MPY%qiN)cQG6QX5k0U diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-39.pyc index eefcd795a6bb9a7bac3337c238e1db6b15960f5e..912693e989bb31e1e8a4ac0c16c6e566652407a6 100644 GIT binary patch delta 23 dcmeC>>gD1~5ZRGpU0suj#2A%)_ delta 23 ccmeC>>gD1~NXssI20 diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-39.pyc index 0bdbe9fd0d230517e793a0ae3a98c5231497ee29..adf371a8920c8bcfbf0ff2e35a9a31dc63ef3148 100644 GIT binary patch delta 22 ccmew=@Kt~}k(ZZ?0SNZ24@orJ$eY0d07Lk(ZZ?0SNZ24@o@0w~^t# delta 23 dcmZ23v0Q>Lk(ZZ?0SGjzLJ|%5H}XmH0026Y1dIRx diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/cache.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/cache.cpython-39.pyc index 17d2dc5cc9a47b47f362d470efc45a0f0553cfc3..9acae36ec11e353518e14bc57ccf0e423b42fb86 100644 GIT binary patch delta 23 dcmbQEKS!T0k(ZZ?0SNZ24@q>D*~r%?4gf{X1`hxL delta 23 dcmbQEKS!T0k(ZZ?0SGjzLK0n+a diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/completion.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/completion.cpython-39.pyc index 7becf000db26671dcf912d72d976445c121aff94..2d262b3343c502603de44e7af4264db230ec8e0c 100644 GIT binary patch delta 22 ccmX>maZG|Yk(ZZ?0SNZ24@peg$ZN?107JzE)Bpeg delta 22 ccmX>maZG|Yk(ZZ?0SGjzLK63G5dZ)H delta 22 bcmeA(=`-O=ra#n;dk(ZZ?0SNZ24@rE;wULjVQ7DQlC9}AsC^Mra#n;dk(ZZ?0SGjzLK026H}bJF3f*EZ$SjEBO35rPDauSLElEwDC@8tvfsvOJ E07#q-w*UYD diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/hash.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/hash.cpython-39.pyc index 7de923aa5b576410d21bfa79c7e915c4259bd953..a5c4074a81299d7c185199da7fe5acacc282d358 100644 GIT binary patch delta 22 ccmcaEa9w~mk(ZZ?0SNZ24@qp;$m_)c07e4_5dZ)H delta 22 ccmcaEa9w~mk(ZZ?0SGjzLK3%c diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/index.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/index.cpython-39.pyc index 5f0b207d8711215ad0133abc74393a10f35d51d2..ebf96c0bc75a1c8fed566ff46d991d1f0285c87c 100644 GIT binary patch delta 23 dcmdm>yg`{Sk(ZZ?0SNZ24@q1rw2^O-AOK0F28#dy delta 23 dcmdm>yg`{Sk(ZZ?0SGjzLJ}>6H}WkK1OPur1x^3} diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/install.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/install.cpython-39.pyc index 330d0620bd78cc7979d507aa3c76d30b28d80d04..18a8fb7b81fe19b270ba75da3d4f025415d95d95 100644 GIT binary patch delta 25 fcmey@$@s66kuQ;#mx}=i_N)&{OwHcN_rV1KZD$CF delta 25 fcmey@$@s66kuQ;#mx}=iG^#=pgY!1>eQ*H)Wn~Ai diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/list.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/list.cpython-39.pyc index 57d89007d57f63a9e083188358537051c2e1df8d..242ddcd4115c9a70a9cbc1c44ddb2e60b7d27ab0 100644 GIT binary patch delta 23 dcmaFk`^J|qk(ZZ?0SNZ24@rEfyOHmn8US5Y2mb&7 delta 23 dcmaFk`^J|qk(ZZ?0SGjzLK3a?H}c(60{~H=28jRw diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/search.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/search.cpython-39.pyc index 702d2b855f387d506698203794b575701a8d51ec..6f5e4e6818ce40264caaa4881521e55fdeafbcd1 100644 GIT binary patch delta 23 dcmX@9c~X-vk(ZZ?0SNZ24@q1ux{+_U2mntF2I2q! delta 23 dcmX@9c~X-vk(ZZ?0SGjzLK3~jHuCKj0RTls1-<|P diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/show.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/show.cpython-39.pyc index 2efc9ed488c7d67477530a071be21e501e05004f..8156aa817f629d6c39d4903c39266db838ecea9d 100644 GIT binary patch delta 23 dcmX@$c)*b_k(ZZ?0SNZ24@p#$-^jN~0RT>y28;jz delta 23 dcmX@$c)*b_k(ZZ?0SGjzLJ|cOHu7y!002gF1+D-9 diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-39.pyc index a3be680bb08ccecc17f59f21bd27fc622e559833..0ef7d39c939fad822b0957da13603c7e7ee8fb24 100644 GIT binary patch delta 22 ccmbO)F<*i=k(ZZ?0SNZ24@sP{kynTZ06rfDl>h($ delta 22 ccmbO)F<*i=k(ZZ?0SGjzLK6RM delta 22 ccmZotYf|G)g@`^A605kOjd;kCd diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/distributions/__pycache__/base.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/distributions/__pycache__/base.cpython-39.pyc index 13571bb31e8c69ae16080c3cc61a1e83de00035f..10b78ca53a4507e7cc8abf9056b07b3ca14d4d13 100644 GIT binary patch delta 22 ccmeC+@8IW6Px# diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-39.pyc index 6567c0a2c242ac86efabbb8f61c310abf121955d..aa17299fe5c2e848ca5a7e20cc63a17746f30879 100644 GIT binary patch delta 22 ccmew>{a2bdk(ZZ?0SNZ24@nf;$oqj808KUqv;Y7A delta 22 ccmew>{a2bdk(ZZ?0SGjzLJ~_i@_yh207x|kN&o-= diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-39.pyc index 786390fb3e4cc2eb1d1b8ef598c75228289bfbb7..061cce8f8449e1aea5ae3b57af0e830b45c75242 100644 GIT binary patch delta 22 ccmZ3-vyO*1k(ZZ?0SNZ24@sQAkynuo06y>qs{jB1 delta 22 ccmZ3-vyO*1k(ZZ?0SGjzLJ|*db delta 23 dcmcaobESqak(ZZ?0SGjzLK2zXH}bjJ0RU4>1{eSU diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-39.pyc index c9caf98f8fbcf4f25eca29d0705c7618ccca9a5e..269ed96367804f5c19d3e461a68932f075379403 100644 GIT binary patch delta 25 fcmX?ioAKOjM!rN|UM>b8*t0$)QLA?&-+^2JauNuu delta 25 fcmX?ioAKOjM!rN|UM>b8(5MPYWSF>-??5g9X@v*8 diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/index/__pycache__/sources.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/index/__pycache__/sources.cpython-39.pyc index 7da03a501b2af1490bf18a55baf966cf0501f29a..7bcc66766d0e22a682b566fa0f96360b3f0d08dd 100644 GIT binary patch delta 23 dcmbPhG1r1Gk(ZZ?0SNZ24@sOWxsi`w1^`HV1^xg4 delta 23 dcmbPhG1r1Gk(ZZ?0SGjzLK17GHuCYy002N61r`7R diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/locations/__init__.py b/.venv/lib/python3.9/site-packages/pip/_internal/locations/__init__.py index 0d49cf23..2c2fd860 100644 --- a/.venv/lib/python3.9/site-packages/pip/_internal/locations/__init__.py +++ b/.venv/lib/python3.9/site-packages/pip/_internal/locations/__init__.py @@ -43,6 +43,22 @@ if os.environ.get("_PIP_LOCATIONS_NO_WARN_ON_MISMATCH"): else: _MISMATCH_LEVEL = logging.WARNING +_PLATLIBDIR: str = getattr(sys, "platlibdir", "lib") + + +def _looks_like_bpo_44860() -> bool: + """The resolution to bpo-44860 will change this incorrect platlib. + + See . + """ + from distutils.command.install import INSTALL_SCHEMES # type: ignore + + try: + unix_user_platlib = INSTALL_SCHEMES["unix_user"]["platlib"] + except KeyError: + return False + return unix_user_platlib == "$usersite" + def _looks_like_red_hat_patched_platlib_purelib(scheme: Dict[str, str]) -> bool: platlib = scheme["platlib"] @@ -95,6 +111,24 @@ def _looks_like_red_hat_scheme() -> bool: ) +@functools.lru_cache(maxsize=None) +def _looks_like_msys2_mingw_scheme() -> bool: + """MSYS2 patches distutils and sysconfig to use a UNIX-like scheme. + + However, MSYS2 incorrectly patches sysconfig ``nt`` scheme. The fix is + likely going to be included in their 3.10 release, so we ignore the warning. + See msys2/MINGW-packages#9319. + + MSYS2 MINGW's patch uses lowercase ``"lib"`` instead of the usual uppercase, + and is missing the final ``"site-packages"``. + """ + paths = sysconfig.get_paths("nt", expand=False) + return all( + "Lib" not in p and "lib" in p and not p.endswith("site-packages") + for p in (paths[key] for key in ("platlib", "purelib")) + ) + + def _fix_abiflags(parts: Tuple[str]) -> Iterator[str]: ldversion = sysconfig.get_config_var("LDVERSION") abiflags: str = getattr(sys, "abiflags", None) @@ -214,6 +248,21 @@ def get_scheme( if k == "platlib" and _looks_like_red_hat_lib(): continue + # On Python 3.9+, sysconfig's posix_user scheme sets platlib against + # sys.platlibdir, but distutils's unix_user incorrectly coninutes + # using the same $usersite for both platlib and purelib. This creates a + # mismatch when sys.platlibdir is not "lib". + skip_bpo_44860 = ( + user + and k == "platlib" + and not WINDOWS + and sys.version_info >= (3, 9) + and _PLATLIBDIR != "lib" + and _looks_like_bpo_44860() + ) + if skip_bpo_44860: + continue + # Both Debian and Red Hat patch Python to place the system site under # /usr/local instead of /usr. Debian also places lib in dist-packages # instead of site-packages, but the /usr/local check should cover it. @@ -239,6 +288,14 @@ def get_scheme( if skip_sysconfig_abiflag_bug: continue + # MSYS2 MINGW's sysconfig patch does not include the "site-packages" + # part of the path. This is incorrect and will be fixed in MSYS. + skip_msys2_mingw_bug = ( + WINDOWS and k in ("platlib", "purelib") and _looks_like_msys2_mingw_scheme() + ) + if skip_msys2_mingw_bug: + continue + warning_contexts.append((old_v, new_v, f"scheme.{k}")) if not warning_contexts: diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-39.pyc index d9a76057875f2f7446e5f1bcfaf10d0db439baf4..adcd1489f0e6ad57400056a88ca7a1bfe042500a 100644 GIT binary patch delta 4504 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 QsMHeEVrslTRuilF50`E=TmS$7 delta 2836 zcmb7GPjDMo8Q-_N(ynCv^M6UUfSQp?h>G<_6Y5yT|4SFSvv6?r-PPQva*)Ig8HRgTjWu>Z$)SI8Pr* zEYCj+dHkw&eEcNvT#%Oi{c1d+K_(>6EiZ2qhK&-%^TAVV$JYj{@GohmuCTG6IcmhF1Q zYL$(nfPyO_FF>dp;crC-yI%yhs{=^km>g5&f3eeiH&P*E{GX9r7QGi5+B|5v!B0hV z$psWvQCNw|Z07N;Xj~2pnX|ke>mjrJerzFo7M08b1WKt!+uRu8e~b-}F9OF+07#J- ziOEr-%UP0s$}R#0auBK)ndd@;ewF&5BZ#=0ZppFB)+%>8v&{=|CeTfrx_2yZEl{ea zZK&)LQX^IRw#i(}vDw#fucDrI<4BAb%GO4qxMG#7#Z`9&NNyK^M4}|7bOEZ04%kE3 zt3Wl>Kyj)xP;B!~psbslGPo7$`qRy;z+|r>;AMh{<+=^C&|p=_vFW=iwK(LhuS(W8~%OQ51U+P{kP~ml`kn8YkDD2CY+O_hJy8B+|)J4oU^3 zlpn1mw+YqORdEJ(R0DqW5MN&h9qyZWnsxv`wyp^I&TXLAsn@kFZN>fgL&EIaGhS1x zbkjJBIPZHs!uZcXLPglq(V%cqp@k zm!&;af^YAxLL^k;YgeRO*=1!bvK8G*dIMi5j)sMv3;g@p>2s%%6+;l^{4%aCBFq2;vHfXMu>{U(%CN5)xwhBAN-oo{v#(EYnF(`r*_P=F6YY>+m+OTVKGHo?PQ^* z5rhGN_uz3q;V%tRIo!uT9h~HU8~o8X@JfcpaD=ixgd_qsKC=-V1Z=rSa@+h6Av%Z? z3ik2e4lPcj-w=191dRroTVhrnX7GW?fm}bF$nmSW3>kV{&MnLR7%a#SHhi1F2><;H zMsFSx(Rvw1!|*D^*CD&l6M4$Ndt@q%mBViE50CVoxsS{Las&3gLuzrG1(@c4&-e3q z{=L`mWz0lK^j1jHND#OAzqF#*JZQ~@_eWyyNI-7z&qvZ{kYMa<&pgw9$lVQOh(Q-- z^ZfkiOwU31L_$&W6@G8@+}K{`%le0)4LL&_>mqhxAG=UR>wD8OtY?v>qj? X1Uwo%-CQ1@izf7hn(9n+Bs%^B8V!Z diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/metadata/__pycache__/base.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/metadata/__pycache__/base.cpython-39.pyc index 143afa4ea3cd5b1bc8e188e58bbc20ea7ee8048d..b0585a2e7846de6c4a303b78cb3c4ad624d9e518 100644 GIT binary patch delta 23 dcmez6`OA|pk(ZZ?0SNZ24@vwXw~_CS3IJa|2p<3d delta 23 dcmez6`OA|pk(ZZ?0SGjzLK0ueZ{&NU0svP^2T1?` diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-39.pyc index b29a7c58b3235e5a9a673f096ae7ba8c3da93c3e..75465aa9aaf4c5ef804a07783a1c71091112638f 100644 GIT binary patch delta 22 ccmbPkFx`MRk(ZZ?0SNZ24@nHz$jc=G06!xIaR2}S delta 22 ccmbPkFx`MRk(ZZ?0SGjzLK0tYz>% diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/__init__.cpython-39.pyc index fb9a339fab8ebf076856cbb6ad98e428b3d40b0c..21cb54ffbff6562c0e7b394649d1086f900eec4e 100644 GIT binary patch delta 21 bcmeBT>SE$eSE$en+a diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-39.pyc index 1568b00311a63fb1c7094ab48e110f418bf45fe6..ece480c2fdcec5ae470d366dc082651dc40eaec0 100644 GIT binary patch delta 23 dcmbPgKGmErk(ZZ?0SNZ24@oSO*vQu|4FE>*20H)% delta 23 dcmbPgKGmErk(ZZ?0SGjzLK1@{H}bVh0{}jG1y29~ diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/format_control.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/format_control.cpython-39.pyc index a45139418acb9262c5b38048065d28160c777323..3cdcd4f313e2fcd578352ad7a6f75fbb750c2efa 100644 GIT binary patch delta 23 dcmZ20x>l4gk(ZZ?0SNZ24@vyXxsh)^7XV0m2BrW2 delta 23 dcmZ20x>l4gk(ZZ?0SGjzLJ|YHHuBBq0suVI1u_5t diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/index.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/index.cpython-39.pyc index c1e2664f613544799424f839e76e87145af8445a..aa17d457438f1246d19e68a003499fba4865b6eb 100644 GIT binary patch delta 22 ccmcc1d6$znk(ZZ?0SNZ24@p$o$a{eW07V%FGXMYp delta 22 ccmcc1d6$znk(ZZ?0SGjzLK2-e@?Ky806yIXiU0rr diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/link.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/link.cpython-39.pyc index 9e66bfb50747f23cbe0e794ff00c81822906f394..0bb382c1c28967996ca15a7090021213b23b7c9c 100644 GIT binary patch delta 612 zcmX|;&ubGw6vyA2olQ2IU#mtiHEKwcn2iwv3Z4W71zV+5Di#BhhRhaCLXgQ?Y28>M z5vveN91w&al0QHcauvP$7kCKx2YB@AMc-8PJ?8UfzRbKCzVmJM-D;u{kJ~`;>BF7I z?cz9*VKE$6zF)|Biz0ErL{d0IUdwyXDhL!uM(E`zi{j{kA&!aEkPonSR^S@A$7dBh zbrP4=a%L$cLZpOe?=xRbW5tcC`-Pk8OX2jczRO0Qj$sNdl-sm)*_?MCcH1&bizX8O zg-MeL4TDDSBO!nm^fAB|P8hw0O_?y#&}XC=g14D02dq~XW}o@IWlln*ho|@oL}(AT zK;H6qtw}_L1DG;|9cK@Ol?D-^7REYs7dZH~AKhfzTL?OZ-8b$*msQ~_o&lodh!PCcTM?>irmq-tnpN%rBTs%p>dutkN#~~*Di80u$Lzl zP-P1_Cim6P!bSBw6>%LBee!UCL>yq7t%1BmqKk507beG4lkE0xTwvtZ*Nf9#6o delta 621 zcmZWl&ubGw6rMM;`L$`bu`FuZC^o+~8>)B^1b-Z)7mFgLEeJUnmdqC2Y*U$CD~TIC z)I&X_P{$sG9Bg#`eJ)O$&3{L6e&&6+vw>F(<{)=u$TtlxmRgPyTi8X`CFoR=+2s|>N5%pk1 z@d-4hoE6A`A;Y-Vp`sD7purOZ7HVE%ltexi!+SK}BRfPq4%4FyPel+@ApQIv;pqao z$}=dTJtf_Fjf8rb-K4!8AS$>%(B!auX)zHIl*&bn>lnG=xx5iWq(upNQvN>IXf6A$ z(_M3eSAKY7Q*3X^QRM;5%3qb{#w6Vm?n~ckyW%1K#7<6F+Ydy9z33~rui%XWPr;Ic zT?N+>CK)ByQfp#>%cvknsQgeZE%Yz`XFHvHVjD6nJu)ZRw(kVNmK#3b=Hjwa+?QWV zi>86C4q9ObOh`kXQV>1)rF!eGh8N42fr${35kw@0X@wX%be)LXcwtk~!y@)id#U=5 ovRJ#BJXDM|UaPGD?ilIU3Z~9Id2E?*C{L^!)a7rh&hF^&54pONO8@`> diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/scheme.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/scheme.cpython-39.pyc index 1f8925a4312a6d113b8194228f0d9f63fe1b946d..174c2b866833330f19b64cfcb2080da3c54388d0 100644 GIT binary patch delta 23 dcmeyu{)L?{k(ZZ?0SNZ24@rE)w2|)_GXPR02Q~lz delta 23 dcmeyu{)L?{k(ZZ?0SGjzLJ}F7H}XAW1^`7r1&sgz diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-39.pyc index c355ffe71e55d54e4c71a4f6e0c79ae5c2b020db..3d3cf503429f95d5c3c60a9f9947dfebb56d7719 100644 GIT binary patch delta 22 ccmbO$Jy)7Hk(ZZ?0SNZ24@s=r$UA`-06wY(_y7O^ delta 22 ccmbO$Jy)7Hk(ZZ?0SGjzLK1&$ "_CleanResult": - parsed = link._parsed_url - netloc = parsed.netloc.rsplit("@", 1)[-1] - # According to RFC 8089, an empty host in file: means localhost. - if parsed.scheme == "file" and not netloc: - netloc = "localhost" - fragment = urllib.parse.parse_qs(parsed.fragment) - if "egg" in fragment: - logger.debug("Ignoring egg= fragment in %s", link) - try: - # If there are multiple subdirectory values, use the first one. - # This matches the behavior of Link.subdirectory_fragment. - subdirectory = fragment["subdirectory"][0] - except (IndexError, KeyError): - subdirectory = "" - # If there are multiple hash values under the same algorithm, use the - # first one. This matches the behavior of Link.hash_value. - hashes = {k: fragment[k][0] for k in _SUPPORTED_HASHES if k in fragment} - return cls( - parsed=parsed._replace(netloc=netloc, query="", fragment=""), - query=urllib.parse.parse_qs(parsed.query), - subdirectory=subdirectory, - hashes=hashes, - ) + +def _clean_link(link: Link) -> _CleanResult: + parsed = link._parsed_url + netloc = parsed.netloc.rsplit("@", 1)[-1] + # According to RFC 8089, an empty host in file: means localhost. + if parsed.scheme == "file" and not netloc: + netloc = "localhost" + fragment = urllib.parse.parse_qs(parsed.fragment) + if "egg" in fragment: + logger.debug("Ignoring egg= fragment in %s", link) + try: + # If there are multiple subdirectory values, use the first one. + # This matches the behavior of Link.subdirectory_fragment. + subdirectory = fragment["subdirectory"][0] + except (IndexError, KeyError): + subdirectory = "" + # If there are multiple hash values under the same algorithm, use the + # first one. This matches the behavior of Link.hash_value. + hashes = {k: fragment[k][0] for k in _SUPPORTED_HASHES if k in fragment} + return _CleanResult( + parsed=parsed._replace(netloc=netloc, query="", fragment=""), + query=urllib.parse.parse_qs(parsed.query), + subdirectory=subdirectory, + hashes=hashes, + ) @functools.lru_cache(maxsize=None) def links_equivalent(link1: Link, link2: Link) -> bool: - return _CleanResult.from_link(link1) == _CleanResult.from_link(link2) + return _clean_link(link1) == _clean_link(link2) diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/network/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/network/__pycache__/__init__.cpython-39.pyc index 2a954dd18be8fa410fc55a8c61bc83cb4c55b7c9..29ba1e7723abdf8f64c05c3a65136e3f907d0b02 100644 GIT binary patch delta 21 bcmeyz_>Yk{k(ZZ?0SNZ24@oqd$omlhLf-~* delta 21 bcmeyz_>Yk{k(ZZ?0SGjzLK00T@_qyWJk$lN diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/network/__pycache__/auth.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/network/__pycache__/auth.cpython-39.pyc index 7ac6bdf4707e6b25830222c88dd42720a14a7da2..0cabf3aafad9b75020cd90a6ba45ddfe0a12ec65 100644 GIT binary patch delta 23 dcmbPjHQS0Wk(ZZ?0SNZ24@s=m-N?r)3jjzM1@Qm? delta 23 dcmbPjHQS0Wk(ZZ?0SGjzLK1iCZRF#X1pq^;U~7k(ZZ?0SNZ24@qng-^dp)3IJ2k2CM)8 delta 23 dcmaE>^;U~7k(ZZ?0SGjzLJ}<`HuA-b0su;Y1)Kl? diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-39.pyc index b7fdc2b71cec8d53333420fc11c4037072a83871..76ab461ebe8017fe38e01651033ccc9dc1f59fd5 100644 GIT binary patch delta 23 dcmbR5INy;kk(ZZ?0SNZ24@ulFyOD3A0su@k2EYIS delta 23 dcmbR5INy;kk(ZZ?0SGjzLJ}v+ZRDG%002XQ1;M1& delta 18 YcmX@bc#4rLk(ZZ?0SGjzCUPAB04GHRBLDyZ diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/operations/__pycache__/check.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/operations/__pycache__/check.cpython-39.pyc index 049c4ce20386bf863aa1c48d30da71c7c79d67a3..e3a6d9a244e8f70d8d38252183f90497950532fa 100644 GIT binary patch delta 23 dcmaDY_gaoGk(ZZ?0SNZ24@q1vvXL*A9{^H;2DAVG delta 23 dcmaDY_gaoGk(ZZ?0SGjzLJ~bhH}b{u0{}>O1%&_r diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-39.pyc index 5edde33bf2721ce3ba18076454e765c754ae5312..1919c361b3b35d72a3bb73fb1f4a83413f2d3fe9 100644 GIT binary patch delta 23 dcmbPWIKhxFk(ZZ?0SNZ24@tDq+{o7?0RTh=1@r&_ delta 23 dcmbPWIKhxFk(ZZ?0SGjzLJ|YDHu5z|002DW1wjA+ diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-39.pyc index 79017859a6ecb30caadd93ae374936e88c2b33b1..5ddb5ad9553d5714e335a4668ca490e577a70fad 100644 GIT binary patch delta 23 dcmbP|KP8_pk(ZZ?0SNZ24@neA+{o8v4ggOW2B!c3 delta 23 dcmbP|KP8_pk(ZZ?0SGjzLK5dEZ{%w;2LMXf25$fW diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-39.pyc index 49649ec89453ad78cfe3601da5fbb0cc90f136c3..16a57668af75cdb4db7ce1efa86dd84a967eb7b3 100644 GIT binary patch delta 18 Ycmcb>c!7~Ck(ZZ?0SNZ2pU8C#04vV~{r~^~ delta 18 Ycmcb>c!7~Ck(ZZ?0SGjzCUPAE04Ns(H2?qr diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-39.pyc index e3cf218c5010d3b4e155900a80ea76fc2d83bef1..cee60511b95473c714b90d229910f74dfec7e47f 100644 GIT binary patch delta 22 ccmZqTY~tiia70068}Wo&W#< delta 22 bcmeC+@8IW6SE$eSE$eIBjN diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-39.pyc index b0085655a71d266fd150481ae945df50cd293dee..204859acfe453aab880e6a8d36cfa71a95f047aa 100644 GIT binary patch delta 22 ccmbQsHJ6Jwk(ZZ?0SNZ24@oT9$Sc4K06N?SNB{r; delta 22 ccmbQsHJ6Jwk(ZZ?0SGjzLJ}8mb8*t0$)QL1<&pSwQ*X0Qi- delta 25 fcmcaQkMZg}M!rN|UM>b8(5MPYv@P4n=k5;xU+f0k diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/req/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/req/__pycache__/__init__.cpython-39.pyc index ab9cf04436dbacbb917138549d23308423d06dfd..42d541de3d8b8df5f9d4090cebffa4180a49e751 100644 GIT binary patch delta 22 ccmZn_X%*p3(k>)(k>)b8*t0$)kvDcDpOYs5V%-NW delta 25 fcmcaGiSfcDM!rN|UM>b8(5MPYY>MB==i~_hUH}H% diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-39.pyc index 6b432d257cec7b1797ad3fd1e1c751f827d4ba19..3f1e4a4cde099c3b07c76a262231a62c1a9ab555 100644 GIT binary patch delta 18 YcmX@bc#4rLk(ZZ?0SNZ2pU8Cp04n_i>;M1& delta 18 YcmX@bc#4rLk(ZZ?0SGjzCUPAB04GHRBLDyZ diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/resolution/__pycache__/base.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/resolution/__pycache__/base.cpython-39.pyc index e057f4324fde9b17d55d3486f6d310792b090518..b890e699bb998d5d79a9d27bf4a6f916e19ab32f 100644 GIT binary patch delta 22 ccmeC+=-}W@HH~;_u diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-39.pyc index ab02297466c2a0444a1d83acfa874151afe790e2..f9543245c0a99072ebb37b44fe7bb96f200f1f1e 100644 GIT binary patch delta 73 zcmaD5`yiGtk(ZZ?0SNZ24@sQhvXSo)_vGu`itM*oQxnrui#Gq@-oeIe4wQE*vH+4H aMP{4#3Kg(2nr+sT*v`RdzWJHLFJ1t03m1?8 delta 73 zcmaD5`yiGtk(ZZ?0SGjzLJ~vWHu4?fX1~RnnwXwiH2DIz;^rURJJ@(FfbwodWa@T|}k(ZZ?0SNZ24@q1lvXReU3IJ1v2D|_O delta 23 dcmca>a@T|}k(ZZ?0SGjzLK3Y+H}d&Q0RTxx1%vb8*t0$)ahB&sz926EX)*`g delta 25 fcmaDbh4H}@M!rN|UM>b8(5MPYJnFrXFUSi3Vwnd( diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-39.pyc index a08a791ecc012c004c4a82f5116d1e1f53e6ad4c..934d7c41f451900fcfe769c144e4fcb8134dc29c 100644 GIT binary patch delta 25 fcmbO^fpO*pM!rN|UM>b8*t0$)@pZ;VK5h>HU1kSu delta 25 fcmbO^fpO*pM!rN|UM>b8(5MPYT%Ns=kJ|$PR5%7> diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-39.pyc index c19216051dca48c63461973813ef057ac81084a2..9ab3e0bee98d825dd7cf1a754cc249a86a34e68f 100644 GIT binary patch delta 23 dcmX@4dPtQok(ZZ?0SNZ24@q1qvXO6#5CBaO2EYIS delta 23 dcmX@4dPtQok(ZZ?0SGjzLK2NdH}Y)}0sun91%?0s diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-39.pyc index a0385954aa361a30f9ec985c18332b406db6eab2..cdd4a1ecc16c0ab015c02761056dbc574777e518 100644 GIT binary patch delta 23 dcmaEE^4x?kk(ZZ?0SNZ24@rEYu#qoP3IJB>2Ot0d delta 23 dcmaEE^4x?kk(ZZ?0SGjzLK0UhZsd!U0su|u1|0wZ diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-39.pyc index c10c1702254c5a9e8f165ef4123143e5924206f2..f1c0808699664383c6d42dbe91cee83e311e787a 100644 GIT binary patch delta 22 ccmZpXYLVhiQx)k(ZZ?0SNZ24@vaj$U8|E07E+lBLDyZ delta 22 ccmbPlJ>Qx)k(ZZ?0SGjzLK44juTk(ZZ?0SNZ24@s2P+{nkqGFh5Mk^L5HYGQh7(PkSKH7Nk)5DM)8 delta 40 ucmaE4^T>uTk(ZZ?0SGjzLK3yLHuABtu-{@$O-xTMnk>SixY>q9O$q?ka0)H} diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-39.pyc index e38f4e6f18bd4f7c93041dbfe8ec4771b2dcc20e..abc4386a237b22b0c154e3139c5d87a3196d6cee 100644 GIT binary patch delta 18 YcmX@gc$ASVk(ZZ?0SNZ2pUAZv04h!d-2eap delta 18 YcmX@gc$ASVk(ZZ?0SGjzCUWft04A0M6aWAK diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/_log.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/_log.cpython-39.pyc index 0252aa53ac67528fd46d01f867214cae5666621b..be3f42d1d0acfb6ce4ba16f7a59590d9b6aab1e5 100644 GIT binary patch delta 23 dcmeyw{fV0|k(ZZ?0SNZ24@vyaypit-D*#gV2T%Y2 delta 23 dcmeyw{fV0|k(ZZ?0SGjzLK0 diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-39.pyc index dd032b8129f41c03efff67032154f99ffe79beee..b84e5edd790794f53fc05750be7d7ab55b26b0d4 100644 GIT binary patch delta 22 ccmbQNFj;{&k(ZZ?0SNZ24@vaf$jc@G06XCYI{*Lx delta 22 ccmbQNFj;{&k(ZZ?0SGjzLK44i)& diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-39.pyc index 94bcf11ab50df060e23b5acc1d1ffe4f47ea7597..c4937b6e5acd21acd2dcdb65acba31acf9991c1b 100644 GIT binary patch delta 22 ccmcc2bD4)Xk(ZZ?0SNZ24@peg$m_-i07M%F-2eap delta 22 ccmcc2bD4)Xk(ZZ?0SGjzLK63Fb8*t0$)F(zgs-;59dVZH~q delta 25 fcmZ3sl5yEeM!rN|UM>b8(5MPYoDsi~Z$=0JTaX7W diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/models.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/models.cpython-39.pyc index b09df2a94f2587cc6d62b2656d91eb21938e5a02..53667b93994afa85034b193aef2443e48d4bb96d 100644 GIT binary patch delta 22 ccmaFM_m+=0k(ZZ?0SNZ24@orK$eX|p07vfy{{R30 delta 22 ccmaFM_m+=0k(ZZ?0SGjzLJ|`;@+PnY073o*WdHyG diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-39.pyc index 293f5089a29e7ca661cf8ad3be37897c09b99822..99cda5f875a3cb37fc475aa3358bab93c3bbd6dc 100644 GIT binary patch delta 22 ccmcaBd{>w^k(ZZ?0SNZ24@nH!$a{ek07s|>egFUf delta 22 ccmcaBd{>w^k(ZZ?0SGjzLK4?*>|k(ZZ?0SNZ24@u;c-^jOG3IIyS20;J- delta 23 dcmdmKy3>>|k(ZZ?0SGjzLK1}(Hu9~O0suol1$_Vj diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-39.pyc index 643f1261d3eaef418ad44d0303f52d44462557b7..97f933131241a1752087921519623e7107b9e004 100644 GIT binary patch delta 23 dcmca=bk&G2k(ZZ?0SNZ24@rzt-pJ=J2>?(m23`OF delta 23 dcmca=bk&G2k(ZZ?0SGjzLK0I|HuAYk0su(P1)%@{ diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/urls.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/urls.cpython-39.pyc index 69faca41ebfab691e90bb2c8c1aec248b7e55ad6..95153b3b7d4444ad5fbf470a8df4c717f65cc496 100644 GIT binary patch delta 22 ccmZqWY31Qf23P<9 delta 23 dcmbOtIYp8$k(ZZ?0SGjzLK36-HuAOc0022p1pfd4 diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-39.pyc index 8bf6b580b23908f620394671bbee34a39e103856..bce0897f64a08d1cfffb6228bea1a5737a78f2f1 100644 GIT binary patch delta 23 dcmcbtcUg}wk(ZZ?0SNZ24@sOPv60VJ8~{*1273Si delta 23 dcmcbtcUg}wk(ZZ?0SGjzLK6KYH}biP0{}-21#kcW diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-39.pyc index ff37038ae1635ec1f5850b2d7afdbee5641654e0..f57c67b953e0f7ca527be621634e7189898214e2 100644 GIT binary patch delta 22 ccmeBR>0sea0sea(06#DW00000 diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/vcs/__pycache__/git.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/vcs/__pycache__/git.cpython-39.pyc index 2188f492f01a38a39674d06bed9641675cd32c58..594284b8f8f362787fe5185797c7154dcfd61333 100644 GIT binary patch delta 23 dcmX>ZeKMLak(ZZ?0SNZ24@o@iypeCWE&y2Q2dMx6 delta 23 dcmX>ZeKMLak(ZZ?0SGjzLK647Zsgmo3jk3m2HXGu diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-39.pyc index ed97e8ebc3a473d8cc5e3b68eb457ca7cf2b9724..7aa82d33eaee6a89044f3243aa86578da48d292c 100644 GIT binary patch delta 23 dcmZ3hvQ~vJk(ZZ?0SNZ24@tZtypc~{2mnbn1}y*p delta 23 dcmZ3hvQ~vJk(ZZ?0SGjzLK2HaHuA{}0RTTq1p@#8 diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-39.pyc index 33538ebef035aeea8629490baa838ade2dbae3bd..c173a5d5100a7cc9321927634cdad81b57aa2992 100644 GIT binary patch delta 23 dcmbPlH{Xsgk(ZZ?0SNZ24@r#D+sG#<4**E51?2z$ delta 23 dcmbPlH{Xsgk(ZZ?0SGjzLJ}A2Z{!n{2LM9D1!e#M diff --git a/.venv/lib/python3.9/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-39.pyc index cdba344fb1b5a8e1fba39f88a2ad84a0af6d05f1..de2655e2f906432c7b55f7b55f9d096374c1f956 100644 GIT binary patch delta 25 fcmZ29gK^OeM!rN|UM>b8*t0$)@lDi5J`o=PU`q#& delta 25 fcmZ29gK^OeM!rN|UM>b8(5MPY+!wo%Ps9fRSD^-* diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/__pycache__/__init__.cpython-39.pyc index 4bbad5e1b2e28c958195afe69ff38ea759429505..ea4fb7e8118f9c9335e4ec4994e38bf72e66d889 100644 GIT binary patch delta 22 ccmca9c2kTuk(ZZ?0SNZ24@r#Q$m_!m07j_>1poj5 delta 22 ccmca9c2kTuk(ZZ?0SGjzLK4qyb8*t0$)(KvM@Uw<$FUf~CK delta 25 fcmbQcoN?}QM!rN|UM>b8(5MPYT$8?$uRj<7S{w%{ diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/__pycache__/distro.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/__pycache__/distro.cpython-39.pyc index b5b70b579100a6978f043b4f5ae6a4397fe101cc..99d3411c05e02efa971fb8828f2ef2a84da026ad 100644 GIT binary patch delta 25 fcmbQTfN9DCCcZ>oUM>b8*t0$)F=y3AKDG$}UIYh= delta 25 fcmbQTfN9DCCcZ>oUM>b8(5MPYv|7KBk8J_~RZIqz diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-39.pyc index f03a243ab550edda04e107aaaf01ba7a1a5bf3dc..fb4f73cc639914b34b3302a337f0d94f64d6d0d0 100644 GIT binary patch delta 34 ocmdmajc?~QKE6a=UM>b8*t0$)@soBVUn?JDD<9KVK4$IJ0K>HkUjP6A delta 34 ocmdmajc?~QKE6a=UM>b8(5MPY-0I%Q*UHD(%Ez>ok6C*)0J8K6bpQYW diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/__pycache__/six.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/__pycache__/six.cpython-39.pyc index dc4266940f088a63fec2259f55091a303f7ca80f..ada25d3da68cf3bcc884de5bae0072f9e313b0e6 100644 GIT binary patch delta 25 fcmex$jq%qtM!rN|UM>b8*t0$)@oU>gzMO0TeL4we delta 25 fcmex$jq%qtM!rN|UM>b8(5MPYyxp~tFDDxSbqxrJ diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-39.pyc index 90aac30049fb3413529d84ff623c0d9cb79b2b5c..41b26864d5e169c7a293cf6d763d49d15939aee1 100644 GIT binary patch delta 22 ccmZ3@vYLfAk(ZZ?0SNZ24@uP9$ScPL06Oyp9RL6T delta 22 ccmZ3@vYLfAk(ZZ?0SGjzLJ}=E^2#v*05nbnUjP6A diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-39.pyc index 2f6aa08a0b051f49c3ee408342038576a75afede..520a23b9bcfdfe7558b97c5c133d6fd74ec38c16 100644 GIT binary patch delta 22 ccmZ3%vx0{=k(ZZ?0SNZ24@u<{9 delta 22 ccmZ3%vx0{=k(ZZ?0SGjzLJ~bT@=CJ-05w?zc>n+a diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-39.pyc index f704419952357caeb037a1baf14d690ca4e5defa..489ee8eeb0971b17f4da269c9903bc1436b49c45 100644 GIT binary patch delta 22 ccmeB_=#=11 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-39.pyc index d436378c710425123af82847ff0694a3b24527ad..3d7d8df1c2a375be60c138e8350ca84c365264d4 100644 GIT binary patch delta 23 dcmcaGQ{k(ZZ?0SNZ24@rE+zmYFo2mn)^2IBw# delta 23 dcmaE=@>GQ{k(ZZ?0SGjzLK1TYHu8lF0RTxS1)=}| diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-39.pyc index 55348bfb0231c589380d5541e92d556555cacfd9..ed57c8f2cea4fa412861779237ca2f458b20a35b 100644 GIT binary patch delta 23 dcmZosY*FM(kMjeKPS062jK1poj5 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-39.pyc index a3d6aa17c08af089c7a1fb1f109f1335c05e009d..918d83ffb8fc19d3a057932507966f34891fe32c 100644 GIT binary patch delta 22 ccmZ3^x}23ak(ZZ?0SNZ24@um#k#`mo06qT(7XSbN delta 22 ccmZ3^x}23ak(ZZ?0SGjzLK4q!-Gk(ZZ?0SNZ24@nH$$ScPP06S_0KmY&$ delta 22 ccmZ3@w3>-Gk(ZZ?0SGjzLJ}i3^2#v+05q5cc>n+a diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-39.pyc index 60e6e4be5f21a1b76a0e29f14ff78e148e39afa8..401ddf631c1367ffb493939f14936eb0d7925b8d 100644 GIT binary patch delta 22 ccmew?`B{=Tk(ZZ?0SNZ24@tD#$oq^30888kv;Y7A delta 22 ccmew?`B{=Tk(ZZ?0SGjzLK07J>E+=~>E+=~l0bM!rN|UM>b8*t0$)QLJhspHdb8X+H;< delta 25 fcmdmRg>l0bM!rN|UM>b8(5MPYoKd}zPbmukWUB{L diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-39.pyc index 21dce8018a2a668771ee69eb794b1cf3622b7599..727d7d44db8be72b8a59c048be59e6257d6ba887 100644 GIT binary patch delta 23 dcmey&@tK1!k(ZZ?0SNZ24@tbswvjKD1prYP2DJbH delta 23 dcmey&@tK1!k(ZZ?0SGjzLK1n{H}a*j002ai1snhX diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-39.pyc index c290af0bacac93f6909da55fd1d2d31e5a781e93..14985b2dd53bf71e8bda9f04c327b7cf20e35de4 100644 GIT binary patch delta 23 dcmca;aM6G-k(ZZ?0SNZ24@o?%vXReO0sv8(2DbnJ delta 23 dcmca;aM6G-k(ZZ?0SGjzLK4@gZsc>8002pF1=s)p diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-39.pyc index 5b2ce256b2e84c10544cfcad3f875c9a30a2e04f..976fd1a97a91f3b312a2bb9b9d662489ad9b3449 100644 GIT binary patch delta 23 dcmca5cuSBkk(ZZ?0SNZ24@vybw~_A*2LMnE2Pyyn delta 23 dcmca5cuSBkk(ZZ?0SGjzLK3t1H}aj~002bp1& delta 23 dcmZ1=y+E2Tk(ZZ?0SGjzLK53WHu6p41pqwq1zG?A diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-39.pyc index 731dc78815d44d3d112a0d0365f261bbadebd02b..27a4e1a51d497bb4ec51f5aac876516bad29591f 100644 GIT binary patch delta 22 ccmaDX_E?NJk(ZZ?0SNZ24@qR($Q#BD07j$*$^ZZW delta 22 ccmaDX_E?NJk(ZZ?0SGjzLK5RP@`iB(06~BSSpWb4 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-39.pyc index 5100a5754c15f5fd6c160d543390718081975228..c77a43f1c181e07de1285c04a53f96866fae0852 100644 GIT binary patch delta 22 ccmbQjJcXGzk(ZZ?0SNZ24@umxk++=@06Jg=*8l(j delta 22 ccmbQjJcXGzk(ZZ?0SGjzLK3fR(^b delta 22 ccmeyx@r#2uk(ZZ?0SGjzLJ|u$^5(Jt07I7rjQ{`u diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-39.pyc index b577b270a4863b9ddecd4a0cbc6b63ebd97a2739..6bb627a160a5ae9aa8f24b24ed24f9be86b2a939 100644 GIT binary patch delta 22 ccmcaBa#w^mk(ZZ?0SNZ24@s=u$Q!@~07sq%DgXcg delta 22 ccmcaBa#w^mk(ZZ?0SGjzLK07Ina!!Odk(ZZ?0SNZ24@u11$m_@j07Sn9?f?J) delta 22 ccmX>na!!Odk(ZZ?0SGjzLJ}`;lOjM!rN|UM>b8*t0$)v9)?5pIR0GY@!Gi delta 25 fcmdmTg>lOjM!rN|UM>b8(5MPYb8*t0$)@pZsPzFA%XVXz1e delta 25 fcmZ26m2t&XM!rN|UM>b8(5MPYWDDBJH_HnERJR6V diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-39.pyc index 6cbc9599bc446b361922adc85fa284e0ca69db52..b5e5f2d815ce5b4de7c652935f95f8d158aeb177 100644 GIT binary patch delta 23 dcmZqXZ06)k^t# delta 23 ccmZqXZ06)kb8*t0$)abwCxzPvC1bK?k} delta 25 fcmeyfhVjoDM!rN|UM>b8(5MPY{Fb_rFE0!LZQ%$T diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-39.pyc index 7ff9ba39c93b70e4e64d27164fe254639166eba3..41a085b5449a4dc7c81c61f931a1ca259ff41887 100644 GIT binary patch delta 25 fcmaF6loUM>b8*t0$)aktM#zWb8^aP$ci delta 25 fcmaF6loUM>b8(5MPYT;jWt@BSnJXvzpQ diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-39.pyc index 839708bd2742704432620f2eaeb541e056e6b1a1..90537b90d847fa458686a7c8ba5fb68f8f7330ad 100644 GIT binary patch delta 25 fcmdnKigEiYM!rN|UM>b8*t0$)@!_0}e43#EXp0Ck delta 25 fcmdnKigEiYM!rN|UM>b8(5MPYb8*t0$)@kZlDKF0t6YM%%_ delta 25 fcmX@VfbskSM!rN|UM>b8(5MPY{61+TpJM<3WC;hP diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-39.pyc index 6ed49b62ab3b2c45144804ae399a9641bdc73fff..7ed5771e1f0250cf51e79cd68b73c494aeff1e3a 100644 GIT binary patch delta 25 fcmZoz#n`ZlkuQ;#mx}=i_N)&{Oq#Hf?^6f>T+Ijp delta 25 fcmZoz#n`ZlkuQ;#mx}=iG^#=pdlqfv`xF8IR(=O` diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-39.pyc index 30c264dc248bf5f826463b6b1c0bc7ea938af82b..de3a062dfb75a011dd951684734b253432ef1f0a 100644 GIT binary patch delta 25 fcmex;mhtylM!rN|UM>b8*t0$)F^6Fz-`g|*cKry% delta 25 fcmex;mhtylM!rN|UM>b8(5MPYJS4V}?`;|Yamom1 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-39.pyc index d8e0af53716ef27d39694425e4d57738dab4ba63..5ad583dc5c5c4b640189cffdd8dee3340a1308a5 100644 GIT binary patch delta 25 fcmeyrkn#UQM!rN|UM>b8*t0$)al+({d>;bb8(5MPYT)$)^-^Ty|Z4d~6 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-39.pyc index b935d49fb6af9d64cb5c60fe129dd1bd5a5a0a2e..63be95f66d08fda9e16b248ec5cf7fc362506e23 100644 GIT binary patch delta 25 fcmcb=fbsqUM!rN|UM>b8*t0$)@l@GHzQ6zgZ6pX( delta 25 fcmcb=fbsqUM!rN|UM>b8(5MPYeA&K{FE9WAW{wBD diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-39.pyc index 1fef38c68b708a1fed185261e92ec55eaa9910e6..b227bcd1a67fb90883d243abda3812096f4d70b0 100644 GIT binary patch delta 23 dcmbOrK0%x>k(ZZ?0SNZ24@vwbvXQTe8vsMU23!CD delta 23 dcmbOrK0%x>k(ZZ?0SGjzLK3@0H}W-c0{}UN1tkCg diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-39.pyc index 1fbbd97e51aabfa624ae46c9c8eaf0fc2074d8c0..4a80c04b9b4207fa18933ca62846e6d9c42e799d 100644 GIT binary patch delta 22 ccmcaDcw3M+k(ZZ?0SNZ24@nH&$a{_h07nD{bN~PV delta 22 ccmcaDcw3M+k(ZZ?0SGjzLJ~J@X= diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-39.pyc index 1a20a557fe751a643d02f5055fa1f3408d55cd5d..22a4e26a4e2bae15e9195973c216899eaf5d83c4 100644 GIT binary patch delta 23 dcmdlXyhE5Tk(ZZ?0SNZ24@um|w~=oZCjdyl28aLv delta 23 dcmdlXyhE5Tk(ZZ?0SGjzLK3C;H}b9G1OPop1snhX diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-39.pyc index ad16d0366eacde940b5ee23efdf861d674a89fb3..20cd338fc7023b62a071491f2edfde33273550c2 100644 GIT binary patch delta 23 dcmX@3dq$Tpk(ZZ?0SNZ24@taku#s<{7ywb|2S5M- delta 23 dcmX@3dq$Tpk(ZZ?0SGjzLK43kZsgl11^`O@29^K- diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-39.pyc index 09cbde6afaca617453054cf24021ebaaef254518..36fffdd50382bc650d3a64a435359ef02144896f 100644 GIT binary patch delta 23 dcmX@hf0mywk(ZZ?0SNZ24@o@7wUKW>I{-{42FU;b delta 23 dcmX@hf0mywk(ZZ?0SGjzLJ}3YH}dUg2LM2G1ycY3 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-39.pyc index 2ff4f0c882cb7c27ac4d4cc19f6a3c54d6ff4c60..37ff396507d0a196de158f7064eb09fa74a0c7d4 100644 GIT binary patch delta 22 ccmdnPyoZ@Lk(ZZ?0SNZ24@vyAk#{{K078lekpKVy delta 22 ccmdnPyoZ@Lk(ZZ?0SGjzLK1&(od5s; delta 22 ccmX@ee2|$pk(ZZ?0SGjzLK44jPk(ZZ?0SNZ24@tbmxsh)Q4**7425bNT delta 23 dcmZ1^xk!>Pk(ZZ?0SGjzLJ}RgHu6p30RTH41quKF diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-39.pyc index d7d32960b38b1ec929923709e9a5a867b11b1870..05257ba776f0c15a755adc0e13144e30924afd3d 100644 GIT binary patch delta 23 dcmbPYGsT84k(ZZ?0SNZ24@nf&+{ni!2LME;1$6)b delta 23 dcmbPYGsT84k(ZZ?0SGjzLK4NbHuAB_0RTM{1g`)9 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-39.pyc index a99a282be4cfd07c79e70944db6afb632d296e34..1ad0d65220a681c279c617f356ecc47aae36e850 100644 GIT binary patch delta 22 ccmdnOyM>oGk(ZZ?0SNZ24@s=v$h({k06=U88vpoGk(ZZ?0SGjzLK07JEo4*&oF delta 22 ccmaDO_ePF4k(ZZ?0SGjzLK3%Zb8*t0$)@xa23eA8+HbD#+) delta 25 fcmZ4Tn{ml+M!rN|UM>b8(5MPYR9Lo=Z(1z?XjBKo diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-39.pyc index 503ffdb121ceb33345d398bf5b961a4ae6a797f4..5d9d687d4b0999d531d3f12a91e24eed90f37d3d 100644 GIT binary patch delta 25 fcmex%n(5nVCcZ>oUM>b8*t0$)vH18#z86aYdL;?K delta 25 fcmex%n(5nVCcZ>oUM>b8(5MPYTz6(8-;1RHbNdN5 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-39.pyc index 651f0aeec2460435e4bf17bb2b5e375ee7c5f6e7..6c1ab6c9aa98da0657aa4c944ebfa2f78c4d8243 100644 GIT binary patch delta 25 fcmeBgXY6lhoUM>b8*t0$)@$adPe5q3bb^r-- delta 25 fcmeyois|zzCcZ>oUM>b8(5MPY6uhvJFLf#aXz>Tb diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-39.pyc index 2b361aa03dd1521e13765193ccb89ab184299e19..86a9a2d29d0102fc74d95d33701a3c1edb530da1 100644 GIT binary patch delta 23 dcmccSf6bpSk(ZZ?0SNZ24@tajxsmULIsjRo2fzRT delta 23 dcmccSf6bpSk(ZZ?0SGjzLK0J~H}aiO2LMkw27&+p diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-39.pyc index 85fd2bc2a8d8bd0660af9488df8fceee4877e5ca..40afadcb2efcbf869a36b5affb9026dc349138b8 100644 GIT binary patch delta 23 dcmcbmbW4dZk(ZZ?0SNZ24@vwXu#wM45CBoX2G9Ti delta 23 dcmcbmbW4dZk(ZZ?0SGjzLK3S4H}d%i0su!V1&ROw diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-39.pyc index c1b10f46dbfb11a668f55e36688f42f24ca0174e..ccb243e80b9f2fc646059101a288c4b475ec7c52 100644 GIT binary patch delta 25 fcmaEOp7G&%M!rN|UM>b8*t0$)@#u_=e3#P!cWeo4 delta 25 fcmaEOp7G&%M!rN|UM>b8(5MPYd_HF*-{o`waHj~# diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-39.pyc index a9ad559fad29dc2ac7b2452f23dfbdb43009c2e6..7398f4ecd6c67708f371df164d6cedbdd5e371f4 100644 GIT binary patch delta 23 dcmeAO>j>jZj>jZx4FFgE2Jip? delta 23 dcmcZ|b~}tOk(ZZ?0SGjzLK4|sH}d&v0{~7<1<(Kh diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-39.pyc index fb32b245558e5592698284df55c3ab71675446e5..3a7374ae73ed7fe992d699d6eeac7673a14f64f6 100644 GIT binary patch delta 25 fcmex4i}~j)X1+vTUM>b8*t0$)@frI@zU;FAa9{|; delta 25 fcmex4i}~j)X1+vTUM>b8(5MPYoXo$GFZ(P2X7LBG diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-39.pyc index cfbf043a3c137c5701eab19528a19c3a888e7786..90ea16715083d1b1b7efc1595c57843ded3bf6f8 100644 GIT binary patch delta 25 fcmZpi&)7JhkuQ;#mx}=i_N)&{yb`^Uuh<^|TdfDC delta 25 fcmZpi&)7JhkuQ;#mx}=iG^#=px5sVdEA|HfQ)vdn diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-39.pyc index 6aecddf75d1819e2a4ff7189bfdb7ccf5000c601..367c49e3d970089de784bad4fe473735807c9986 100644 GIT binary patch delta 25 fcmcb0h4I!EM!rN|UM>b8*t0$)(QL&=KA$WAa_b8(5MPY3|q62&nF82Y#s-| diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-39.pyc index 3d76353759b1c79d645b356886b8fc8d084b2ec2..6b8b8e9bb81129fbe78582b1f5ccf4fb4b6b5f06 100644 GIT binary patch delta 22 ccmaFK{F0eBk(ZZ?0SNZ24@nf-$a{wo07d2oH~;_u delta 22 ccmaFK{F0eBk(ZZ?0SGjzLJ}o5^4?(t06!=NbpQYW diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-39.pyc index ed21e13333f80f45cafaf49017f6c5091485c7e2..8d64bc12f828bd31ea21223edc143ffe54f50549 100644 GIT binary patch delta 22 ccmcc0ag~ENk(ZZ?0SNZ24@o?|k=KI-07c#gLI3~& delta 22 ccmcc0ag~ENk(ZZ?0SGjzLK44h?y06)(Kq5uE@ diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-39.pyc index 727fa69749573b39be9e7449a47e42eeaf5b8df3..c7f33b963053d52005617463ac843fd64279c878 100644 GIT binary patch delta 25 fcmdnIl5z7&M!rN|UM>b8*t0$)F*{`=-_j5OWW5LV delta 25 fcmdnIl5z7&M!rN|UM>b8(5MPYOi$m)w=@I*T@ME< diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-39.pyc index 1446f77861302fb31e2324e5d244348a3c3d1a5f..66af09c82cf737c107e27cf1f7b8717999498d63 100644 GIT binary patch delta 23 dcmaD_^R$L9k(ZZ?0SNZ24@rEMv5_y_4gh2J2p9kW delta 23 dcmaD_^R$L9k(ZZ?0SGjzLK1&uZ{!QN0{~pi2V?*M diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-39.pyc index 49e6017b7ed3542098d3f222b23ec1b0fa1f7450..95b019c2a10cd009e21cd6f8f76f0fea7aeda1d2 100644 GIT binary patch delta 25 fcmbREih1HIX1+vTUM>b8*t0$)@k-`KKIX3gY%U0- delta 25 fcmbREih1HIX1+vTUM>b8(5MPYWG>mr$NUulU)l#1 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-39.pyc index a2102557e7d70fd8319976f0a7e05a04bf2400ec..4fe3e1eeeaf3ea52e9bfdcdfe80ae43c78bd2d76 100644 GIT binary patch delta 22 ccmbQkHHV8gk(ZZ?0SNZ24@vCU$ji?P06P=~SpWb4 delta 22 ccmbQkHHV8gk(ZZ?0SGjzLK0VRVfF_t2f;<#?h1y`FiRSk9&|aXoW$vjGHNk~3 zE=^8+dWr0&6j`1Hd*r-ZA&hW_Z_660U;w? z?FQL(j_!HUCReBs%mmjK%d4gne??j~9!IOc>xmb4O^eUz{kk*{@hu>7f@WA4-yi+B z^4IwDX>X=}TGb8}=B{NHz5I{W#{a8g$q(^YGhTLpY-G1o%jdZx5S}>diSa{@uCamiGVYIc271<+EGJC^a96lV4`AUElR$b>|{b7PTCtTV(Y*ra1VF@ zJOZ)+8Yc@V0egS|PHTFWH>CxcnToRo`EIKJ;3*DagR0IdIIb`q;d*yWh0><$%}Yh> z3@>EKEaq%WwOWOI+IDOwi(QzO;G_Z>J8SEe@_nK2Bqth&U~rcU9i=2n>;TVz4j>8) n__hPJLPPym? zFb~`WZUGDK@5DG`bFw$t-+}{PjVP`c^2~}SMMvgcFwQrg$QHtLT0gS3;IVsN<-_RJ3F+* z!bd0M`{6zf>a>6o)mxUG)k2kn%A-fKhA>vjqEr?%A=?+hUdH_+E)l8uV(* z_Nn;sRMY;wDv!VFKzZ5$&iq+RHcVLY0TodT9KwOoBO7bc<-3V?mX`+;R(cn)CEy;g z2CM^*024stv|4ClE}QA(pk4j`Zn qhy#6r!1Vz2z(nVy0ZCv4XaVrb(H4*eHWa*YF|)%>K`H56+4u{X4D;gv diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-39.pyc index 0ef884e2ceed97728a5e2cdad82186bd6f3bbc14..a3d9f3bcdf5e35ff38f46ce490db17eead11ef33 100644 GIT binary patch delta 25 fcmZo!$=I@zkuQ;#mx}=i_N)&{Osw0;R~7;QTm%Pr delta 25 fcmZo!$=I@zkuQ;#mx}=iG^#=pzc+5=D+>VtSMmo) diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-39.pyc index 51c52b5673af0a0d3545a523cf87698bf1c52bfb..2e89708afd29e7d521f99111b5b9398550683fb6 100644 GIT binary patch delta 25 fcmdnIjcM~XCcZ>oUM>b8*t0$)@q^ArKGoR(XnqJK delta 25 fcmdnIjcM~XCcZ>oUM>b8(5MPY+-|&)Pjxl`U#15t diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-39.pyc index 6d30787c6cd1e96f752aff854aae43e4726e33fa..885bf4807c4bf9cc5eff24793bd7769621a53efb 100644 GIT binary patch delta 22 ccmX@1dP0>qk(ZZ?0SNZ24@q?1$h%tz07j4oTL1t6 delta 22 ccmX@1dP0>qk(ZZ?0SGjzLJ}WsE`FarQ+{sy1` diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-39.pyc index a68187f4f3bbeb5d8f1ad38b8d2bddc4e034e4fa..501b7e4f171e50b4683fa722fec07797f5ae3d95 100644 GIT binary patch delta 28 icmeA?&f0mLl`oN(mx}=i_N)&{Jan>=Zz~^Tbus{eBMBM+ delta 28 icmeA?&f0mLl`oN(mx}=iG^#=p*IsGl+semSoeThVz6eJE diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-39.pyc index b4b076596713d525d2e94a2b00a35e544899525e..062b60facf59edbe84f0d985f66e1723f0a0d414 100644 GIT binary patch delta 23 dcmX>cayW!9k(ZZ?0SNZ24@vB|-NcayW!9k(ZZ?0SGjzLJ~FXH}aWk0RT!+1)cx^ diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-39.pyc index aeaef1cce6ee0421e1492cfc382c803889c13e47..2b1a8ad7f02692c270ef3068bc10851c13ec077a 100644 GIT binary patch delta 22 ccmaFH^o)r&k(ZZ?0SNZ24@u13$Q#KB07d}@2mk;8 delta 22 ccmaFH^o)r&k(ZZ?0SGjzLK2HM@gazKPPk(ZZ?0SNZ24@tD%$ZO0606|ygazKPPk(ZZ?0SGjzLK0_e(^b diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-39.pyc index a522cb791eb9315fd7fb73d0e6e1479f688a7d67..8fba0d99d58a0a36e496232283dd26bd10f9b138 100644 GIT binary patch delta 23 dcmca8dQp@wk(ZZ?0SNZ24@r#C+{kyB3jj;a29W>& delta 23 dcmca8dQp@wk(ZZ?0SGjzLK3yLHu4?j0sun?1(*N; diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-39.pyc index 0ce0870f246d8b4286230261079007028ab28213..ac0a7c444f5d34781c58514618023ea9e841ac39 100644 GIT binary patch delta 695 zcmZ9J&ubG=5XXIMveA?T6-28Bv09~KF|DL6%|_d3S~p@+)6~`?tV{aRF5UcaHU_L9 zLJ$$W%}LOUp2UNey^8n;s36|<>dk|CEYgGfO~gpv;lnWVo#Fdtwp(JmC8A~|65ipz zcW;X3UTZV@A|^a{GqxJ&|K(@tC-B3^kdpHP71LQK!6O6b_VtTSE>xC!#axwin41G% z#UVF){Hd~E@vEc)JAnWYe7Q9k=9o4tbUqn>ERy^-{_059FL}X6ZCzIBDr9Zs5as#K z$Zs*l_0cnN$mklh;kMRj+^tJ`4R;Iwy1K1%?#I!GN^}|xD#=Q%DQT9CgeEflEOEMT z20fPnoxdcGsh#n>m6+bsV`9azRH{|#mMv)kACm1<*{ZIXwoSJ%I1SuJKIqhK zt3el$xCD@oA(gUhB~SF4U*qS=dsul|hcpS~fjM9iSOV63coD-W*{0)^q-`6;lee~_otgN}-R&$j%#1-heSU{Ac z`x84XMb_k*C}iR)wEnJEZ>?Eeyo0^szpj33-uX27SP7m-gDQBv+2$fcdQ4*%=|$}H za2h?AfXnnXc3ka^r>)rR{s9vuCp*<)tU#Zq52@GCu}I&iLu{G$&J_E$#0`}0O1MhH z?izDhd+1E9fZp?mOK?nBGiC$67If=Xs+{y&08XcBrYK`z~8NJ fM?&LkQ2I*g!d!kaEy}0{uz>yvdKYy*CN<9=c+soN diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-39.pyc index 232b04073908519afcfa880092d207046101b706..204e017916e1f24ffde38965dfa1251054308778 100644 GIT binary patch delta 22 ccmcb|b&rcTk(ZZ?0SNZ24@um&kvEVP07rTTRR910 delta 22 ccmcb|b&rcTk(ZZ?0SGjzLK2^Bok(ZZ?0SNZ24@q3Uk#`X@06%#KDF6Tf delta 22 ccmZ3_zMh>ok(ZZ?0SGjzLK2T|F421F421XPD3XPD3+IynlHBG~WeT diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-39.pyc index 56d74c96fd763e352b4103cd0edd227b0d462a68..b43565d7449c274486e1dec9344f4888d919b56b 100644 GIT binary patch delta 23 dcmdlLu`7Zvk(ZZ?0SNZ24@rD#v5`+l2LM$}2MhoJ delta 23 dcmdlLu`7Zvk(ZZ?0SGjzLK54oHuCA{002vO1?B(% diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-39.pyc index 0cb599562c9a6676f28a458789b23754859250b9..36d1904df81573107fc09fb18ca05c04fe23f1ec 100644 GIT binary patch delta 23 dcmezD`Pq{%k(ZZ?0SNZ24@tbMw2|+r3IJVh2lD^` delta 23 dcmezD`Pq{%k(ZZ?0SGjzLK4p?Z{&Nb0svKL2O0nX diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-39.pyc index da087c330e985604356f01aa9331dd4a9dd33d8b..901dc045da1ee0c89b1094329e9d9c42d60ccf00 100644 GIT binary patch delta 2752 zcmZ`*O>9(E6!y*U>y(!MFti<}%nU69Go?-ag9d^)y^6g0kwct1j^C>ofx-9Z+Xl5s; z=yl@3OI7CbMN`<_XLD92<#meoJPbk8GRMuly`&6NmEXnrEPS>(Z7Z*3=F8)pSaIVe zj^h&?B4A8RnE8wobTx6`cdD#>`9j8A!rxdmvyYehmCwo*ZKsz0Ts~t?tALZL0L6Sq zy~3#qGkXA3uhQERzW=IjcPvRonB#>hb1@aMbJ>!)ud7G2ecPesuGoeEKHJDyVi%MM zk@9n$lrLl0hUkTdK8gYgDo0rk*_y9*a1H_Dxj0ceIqooykOpmlpi~yI84CBw4%YtK zvIok3f>cn2I2d+ZbduZ)<2HG;t|iXxQ;|0>95N`IC8r0cqw-GOo0sAcx&7Be+CZT6 z2~nWr?2ArkZG<5O;7r>fy#VM0ya?C=I1G3h&;>v-L?2*3;1J*_fcF!1BhPcbjfT*vEvqjABRRc;Az%m4Wvd zfUCu6pT%nqFaqEtj0GtsRV3vTwxX-F$fQCh{5CtK&LzxD20Q`Uh z^2bES-gXjIpjZ&LnMtkS(SbRc!PQ@gs)G6AxM7c;<*Thc`JxI;(9FzDJGU8quVmM{ zo=V zCav<}V@fuTft`t)fYRowNpx4?pAGMI<4VxCF@)7sd-B-=-Jso0;vDQ6?4CtJ@^w=Z zV@y8U__s4~nEW7CXyQ6OT+yz}-%=0iR>I~}dZsWs>5M=*la4l^_o-rfcG9v2=(p2+ z&3;b5qqWE*ZR;aE?v`I#M7S$&we?iGu84fxHq^$!KVmxod8Kq7P6C%ipqa%vK%E@h z6bpX{aaqQ9|qw{~q CvLxjI delta 2752 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 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-39.pyc index 6152df022e856713b7c21053920fb5d3ae3e70de..c8a740762fedb57f9510081a6bad8397d09eb824 100644 GIT binary patch delta 23 dcmca@cH4|Ek(ZZ?0SNZ24@oqU-N@%F4FFK+22KC~ delta 23 dcmca@cH4|Ek(ZZ?0SGjzLJ|$+HuCvO0{}@d1%dzo diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-39.pyc index 81e0d86a8b8a4a6f1355210492e03da11716bf7e..c4b753e4513aa79ba5c670309e0a07282c1cfdb3 100644 GIT binary patch delta 22 ccmX@bdy1Dgk(ZZ?0SNZ24@qp@$h(&f07Pa6X8-^I delta 22 ccmX@bdy1Dgk(ZZ?0SGjzLJ~J@v?DgNtf4-2UY{KH7Jjx5i4Gd8mrHly z(asHd(MG_^6wYpE4iA4ksi6unvB|2o2 zL;t09l>B|Ymlrgz=7}jK0WH;V>})LgxDY!s7Sc1cWi7dfW`zNW-Z)CCop(}Wiu=WY)vdRW(q4G zfP|PRkKr3kXKCvT=p2lIQ+zpd{`1fIGyP~kY7kuyOv#hHvB-Y-)uwAcy^WJWLt&;B^dj}|apN}u2IFjZFn_Qk-p27n>94w!ri2Mkmj zzLW)N=vT&hh0kreY(Yu_SDI~^3|}}^+DWP7)NBKsn}96xwHs@M$7PJYM$=|gE%JDDlG93XaCn1b8 W>J=4_idEr5vt diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-39.pyc index 1b22835e3e279f29404a03625c7e042da3975aac..71ded9116c4be8fae7e05dc030d27571aed12fb8 100644 GIT binary patch delta 185 zcmaEB{MMK+k(ZZ?0SNZ24@tZ#v5{}8AmgpgO9T%xG5SwV6Uk-u2Fl%c$QU@;OYDWBFHo|`4@Ag;2u2Vg4LLx8MX zoOy}4sl^3}$*Dztn|VZS85sj6dx^bJ^Z`m1`GN>J5Wxr{ sDoqxs97ur&h;RTAag!6o#3z?XgbKufxUnE29z-Ne_Fk(ZZ?0SNZ24@qR*$Q#KH07c&gz5oCK delta 22 ccmaFH_l%D>k(ZZ?0SGjzLK3|;@06i-OCIA2c diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-39.pyc index 1754cd3372d22a40f41e023c6a2880be06842788..72e1d91b774d8a0982fa4aa8573ac5056a23c72e 100644 GIT binary patch delta 22 ccmX>ic0`Ofk(ZZ?0SNZ24@s=u$ZO6G07Ih%ic0`Ofk(ZZ?0SGjzLJ~i1@(y`@(y`b8*t0$)v1`gkzPJnkcRvWx delta 25 fcmaEJf$_}+M!rN|UM>b8(5MPYJUL?{Ut9(NaVQ8& diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-39.pyc index b45ac1ccd03e6ef173149b8ccaf48d1280bf2eaa..6cfeea5bd1eca597924d98c15a382d9d0e9d7a4f 100644 GIT binary patch delta 22 ccmcb@a)pIAk(ZZ?0SNZ24@sQ5k=LCG07L=>{{R30 delta 22 ccmcb@a)pIAk(ZZ?0SGjzLK4?+;M1& delta 22 ccmZoyX;`Xs{jB1 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-39.pyc index bd42828dd4ccdbc50a8c27274e78decbb928713f..841dd20ce1b817bfd33bf66710bea4aea3bcccb0 100644 GIT binary patch delta 22 ccmbOrF+qYik(ZZ?0SNZ24@r#O$ji(F06Js^EdT%j delta 22 ccmbOrF+qYik(ZZ?0SGjzLJ}8jb8*t0$)@k_-b8(5MPYG^p9gw<`<)VCe@^ diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-39.pyc index 56a577f720825215be1c3d2eb999adf736cb77da..67db7df3999e77cd28ec8b29fccd49ceac2d8302 100644 GIT binary patch delta 70 zcmZoqXiwlvOV delta 22 bcmZn=ZxH8A_ypivjJ^*1R2rB>p delta 23 dcmewo|0SL;k(ZZ?0SGjzLK1CFH}XBx2LM(*2G;-p diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-39.pyc index 0b1ab791f608a4c57c36c100f539c5fc36758b3b..52bac22ded86b4fb5f52a18e077462531121f9b6 100644 GIT binary patch delta 22 ccmbQqK9ij{k(ZZ?0SNZ24@orM$lJpV06A?1a{vGU delta 22 ccmbQqK9ij{k(ZZ?0SGjzLK0mz^7b$T05awTy8r+H diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-39.pyc index c3329512f41a755b4f687699c628607a74abc4e8..e0b464cba3433bd2b1c83c310b0edf905624a005 100644 GIT binary patch delta 60 zcmccUd(oFKk(ZZ?0SNZ24@nHv+Q|1@Q9caFEvf+#F(9G>M1+Efa1ar@Swv|s3jo(Q B4psmF delta 60 zcmccUd(oFKk(ZZ?0SGjzLK4?$Z{&NfC|?8Q7KMU{a1c=eB4R;A42THZETXiR1pvbM B4eI~^ diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-39.pyc index 560fb454d7c3d2686d93ec1746893f6e035c5eae..22361f3f5baa4b4510fcc15025bc245b0d42f949 100644 GIT binary patch delta 28 icmey^&-SsOjW3axmx}=i_N)&{{JN}>Zz~_;<8}ayTM8He delta 28 icmey^&-SsOjW3axmx}=iG^#=puWoMS+seoIxE%n2qX|3! diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-39.pyc index 723c0d6d54afe17d01d16e5c7f1330efeeba4b20..4c231c484c3a692222d4a9b64caa5208f24e169f 100644 GIT binary patch delta 22 ccmbQhI)Rlpk(ZZ?0SNZ24@orI$lJ^W05^*TQUCw| delta 22 ccmbQhI)Rlpk(ZZ?0SGjzLJ~bU@-{O805Kv2pa1{> diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-39.pyc index 0943432d46a291e7df42ac94c912457d22cb7810..97ab7aa9b9f3bfe634d80fee98f6d1f2e1f23248 100644 GIT binary patch delta 23 dcmbQQGhc@ze1ibk(ZZ?0SNZ24@vwfypeAfKLANs2DShI delta 23 dcmZ1>ze1ibk(ZZ?0SGjzLJ}v7Y~-884*)+@1&9Cu diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-39.pyc index 319601ed22c1af2ddc1e8d2565a312986ed4338e..d548cc37b05951e0d92bedf76e54cf0068b9453a 100644 GIT binary patch delta 22 ccmdnUvXO;1k(ZZ?0SNZ24@um)kynKY06ww>x&QzG delta 22 ccmdnUvXO;1k(ZZ?0SGjzLK2T}b8*t0$)F{fiAUtc@`WcdgT delta 25 fcmbQUpK;E9M!rN|UM>b8(5MPYH0s&N*B1`}Tnq;d diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-39.pyc index f89c06c9f19e8ea5ad6464414bda64cd76d8af86..ff67eccb6fea30246106e639dd77f43cd7a0f33e 100644 GIT binary patch delta 22 ccmeyv{D+x0k(ZZ?0SNZ24@umC761SM delta 22 ccmeyv{D+x0k(ZZ?0SGjzLK2T}t<8 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-39.pyc index d947271db8d1ac4937a06cd15b04b4b701a90c7d..fc69f062a08ae899c35d3bdaaef59b53487d3d0b 100644 GIT binary patch delta 25 fcmbO}n{oPVM!rN|UM>b8*t0$)@kZ%JzD{2NU&jah delta 25 fcmbO}n{oPVM!rN|UM>b8(5MPYd|I)QuhSO*SbqmY diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-39.pyc index e3d5b8610700392766aa60ecefb003e221206ccd..e5236e45f6f87462894c56ff0d82f808cf9fde13 100644 GIT binary patch delta 22 ccmbQLI8~81k(ZZ?0SNZ24@r#K$lDk diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-39.pyc index e4cc7d277ff794fb098c419421b48f7461bf6cf7..96636aba6bfed2d3a382273d4b6d6d30a26cd476 100644 GIT binary patch delta 23 dcmeyQ^ht>?k(ZZ?0SNZ24@un1y^$|P5CBw^2G{@q delta 23 dcmeyQ^ht>?k(ZZ?0SGjzLK4+@Hu9wi0su*B1$h7f diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-39.pyc index cbe3368e264a710bdc1c24b4e5855fee0738f605..256afb56595b3a8cc9cc750fe33e86744f86da76 100644 GIT binary patch delta 25 fcmZ3qjd9U7M!rN|UM>b8*t0$)aZ%MqK9OhuWP}H> delta 25 fcmZ3qjd9U7M!rN|UM>b8(5MPYoL;w)Pb3-uT(Jh= diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-39.pyc index b87efac6d602f24dd959b44b8b6970d531adc07e..db31bdfc9f05d4d9dd0f9098d3f2905a35f42f70 100644 GIT binary patch delta 22 ccmaFD@`Qyqk(ZZ?0SNZ24@s2V$Q#ZC07O;=vj6}9 delta 22 ccmaFD@`Qyqk(ZZ?0SGjzLK2NP@`f`306qK#1ONa4 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-39.pyc index 68fa1f8b5e856ee377ac439e99bb2d00fead6d70..bf89a388e5557fbe4bbb1fabf216bb0e8432f74b 100644 GIT binary patch delta 22 ccmZoMZZYOfY7yd1Y7yd1vOvO2R3;+NC diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-39.pyc index a4cf7f039b007a19f11ef2191e864029d9cfa0d2..223d3fc9cee4d7b910162d8e2d4f3dde9bdc0842 100644 GIT binary patch delta 23 dcmX@Wd4Q8Ik(ZZ?0SNZ24@tbix{+@a3jj#<2ABW< delta 23 dcmX@Wd4Q8Ik(ZZ?0SGjzLK4~7Hu7y^0RTK{1pWX3 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-39.pyc index f3e4452ba3fa794aa55b95b995299434d3f82d3b..4b95ab54b8af493f45446e15ca9eeda651b506c1 100644 GIT binary patch delta 22 ccmcb>ae;$3k(ZZ?0SNZ24@pee$m`4k07B~p$N&HU delta 22 ccmcb>ae;$3k(ZZ?0SGjzLJ~VS@;b8s06g3UC;$Ke diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-39.pyc index fb0c23bcf8f57341f29eaeb8a56356be45aa3fc2..4112f6d5e1d40e1b088a886acab9da3e786db61e 100644 GIT binary patch delta 22 ccmeyu^@WQ!k(ZZ?0SNZ24@oT9$eYdz07=jWO#lD@ delta 22 ccmeyu^@WQ!k(ZZ?0SGjzLK4?)i_@% delta 22 ccmZ3-xsH=Jk(ZZ?0SGjzLJ}u!<1+k(ZZ?0SNZ24@vwgxslIB2>@0P2NM7Q delta 23 dcmccQa><1+k(ZZ?0SGjzLK06&ZRB%N0su{I1|R?c diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-39.pyc index 0c1c980566749b756eb454ea3f19241b4b6e020c..48225c07b6a841d623e3d73bec6ee28c26bd2451 100644 GIT binary patch delta 23 dcmbQGI7^W)k(ZZ?0SNZ24@rE+wUMt!002gc26X@c delta 23 dcmbQGI7^W)k(ZZ?0SGjzLK5A$H}dre0028G1q}cI diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-39.pyc index 6e4145bc5801aa15e25a403d594571cea06f613b..1b2cbcf8f2f42eda96b434d5d6a7bc0972eb50bc 100644 GIT binary patch delta 22 ccmcb{dySVjk(ZZ?0SNZ24@pei$a|6v07b$EX8-^I delta 22 ccmcb{dySVjk(ZZ?0SGjzLK5d}D19 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-39.pyc index b3e6e81a02f39162cccf0b38daa00ca14601fb78..4c127ecf3c48feb5280bd619fe77a4764b45c5a3 100644 GIT binary patch delta 81 zcmaD+|Dv8Rk(ZZ?0SNZ24@v9~-^h1Jn^WNzQw&!XQw-zGNE>1R delta 81 zcmaD+|Dv8Rk(ZZ?0SGjzLK6L=Hu4?P=H#qmic$E*6vMUoruG{i)x5;KTg;hxX?83? ZWmPQNKqim`idM1cLP(&<=2sT~*Z>U%8e0GW diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-39.pyc index 0657627a3a86eca5f1c6656cf0e9c259c2c9a102..64b77cd17216ba3625800eb0d9ee2521368b9b74 100644 GIT binary patch delta 22 ccmZn`ZWiWEh($ delta 22 bcmZn`ZWiWE)k(ZZ?0SNZ24@q?L+{kBS0svKu2DAVG delta 23 dcmX?*aUg>)k(ZZ?0SGjzLK0)WH}V;o002&s1_%HE diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-39.pyc index d9c41ae52fdbf315fac000ce7c95b4a3c318086a..6fac430156eb7ea797481670d74030393e838082 100644 GIT binary patch delta 25 fcmbQSpK->1M!rN|UM>b8*t0$)k$d7szOHxxVjKsk delta 25 fcmbQSpK->1M!rN|UM>b8(5MPYG@H7SuPYt^Ta5<} diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-39.pyc index cc263eac6f9fc8edc149480045230a4987eb49ff..58683f8e481f3ee6bc5d197440f2c6272151d718 100644 GIT binary patch delta 23 dcmZpPZi(hg3ek(ZZ?0SNZ24@pcE-^llZMVi^&HRKkHhpVH@Eq4Ea5Kn)<;9G1iu0F0I LuA2o}-w6N!>@pF6 delta 56 zcmeyb{a>3ek(ZZ?0SGjzLK3+pHuAk-k!JC5b#%GK=Hlw(8sd73-9I42)88-n7PGr+ K$Yw#-cLD&qNDyKG diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-39.pyc index 322936d572d7c574284a53cb3421f5ef7e91b0f3..0c792633f9ad9583ecc72e0711922f49fa95098e 100644 GIT binary patch delta 25 fcmaF0i1F1TM!rN|UM>b8*t0$)Q9ExVUrZnXYq$r~ delta 25 fcmaF0i1F1TM!rN|UM>b8(5MPYOeoyQ7ZV5oWnc$F diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-39.pyc index 791e208150ecf153c126849c9e811692f78ee7f5..516ff574938d444822843eb0279a90806850d407 100644 GIT binary patch delta 18 YcmX@hc$SeXk(ZZ?0SNZ2pU8C>04rt$^#A|> delta 18 YcmX@hc$SeXk(ZZ?0SGjzCUPAH04J^lEC2ui diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-39.pyc index 3d5a6bddc5bd578133120e99e7ce2813688b29a7..2fdee83d834c11e9a1fe733a88ff77ed8dd5f79c 100644 GIT binary patch delta 22 ccmbQpJ&~I?k(ZZ?0SNZ24@um+k++2v06Sp??*IS* delta 22 ccmbQpJ&~I?k(ZZ?0SGjzLJ}Wtn002={2220| delta 23 dcmccSaLs`)k(ZZ?0SGjzLJ~uCHu8BW002u71-<|P diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-39.pyc index 562b02add06bb6a13a648ed2a25cac6ea3ceb861..d6439a7158fb4091a9b9303842b6065f197215c7 100644 GIT binary patch delta 23 dcmdlWvq6S0k(ZZ?0SNZ24@ul5xRFnZ4**BS1_l5C delta 23 dcmdlWvq6S0k(ZZ?0SGjzLK1C+Hu5R)0RTNQ1i%0Q diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-39.pyc index 84b7e7bc7132216bd400b070b1debccf1033db1d..b6885f52a52c6058fc63695d5a807f7254029236 100644 GIT binary patch delta 23 dcmexR`Js|8k(ZZ?0SNZ24@vy(xRLLX4FF~<2%i7| delta 23 dcmexR`Js|8k(ZZ?0SGjzLK1&DZ{&Mq0{~u%2iE`q diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-39.pyc index 81a5946d44d682ecb4d5525cc6af982fd3b6f15c..1315891bc4147cf91cd6aee81c2acba0c44db0b9 100644 GIT binary patch delta 25 fcmbQUnsLr*M!rN|UM>b8*t0$)v8in%UtcHyVdV$z delta 25 fcmbQUnsLr*M!rN|UM>b8(5MPYlD1v%D1v%~H8~J{V0suV*1@372V?*M diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-39.pyc index 724b64227312a12df34c78ffa6d025eb41363cb3..ab0f769cd8ca4f40d9f1b0f333655786d4aaa95f 100644 GIT binary patch delta 23 dcmccRe#@ONk(ZZ?0SNZ24@nF$+sJoD830wu2QB~r delta 23 dcmccRe#@ONk(ZZ?0SGjzLJ}XCZ{$0p3;b8*t0$)F{^ze-}Y<(aRms# delta 25 fcmX?lo$=^(M!rN|UM>b8(5MPYoZr2XZ+kWXYO)A0 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-39.pyc index 1c5206c697bee46b0271b9bb2ee9b0a3b0f6c6d5..614d58e18298c79d305e87b5bf699239e7c0dbc3 100644 GIT binary patch delta 18 Ycmcb?c!QBEk(ZZ?0SNZ2pU8C%04(PP761SM delta 18 Ycmcb?c!QBEk(ZZ?0SGjzCUTtv04Xm7O#lD@ diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-39.pyc index 94cc9ee9c8bd5bdd9e4a3c634204707e0c6affc5..da20e719e0bed9a2f4a5da9ee950e867d494d3d1 100644 GIT binary patch delta 36 pcmZ3)wTO#1k(ZZ?0SNZ24@vCY$eYi^QN#@7-eOGJ+`=@E2>_$e3043A delta 36 pcmZ3)wTO#1k(ZZ?0SGjzLK63E_ar2*3aU diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-39.pyc index 2287af5ad42e7f4fe823e21a19bb83af57c6c1ca..8dafa3bf65fa3cf32208ff595ec5316c8728a0ec 100644 GIT binary patch delta 22 ccmX@aa)^aDk(ZZ?0SNZ24@sQAk=K+706`oD(*OVf delta 22 ccmX@aa)^aDk(ZZ?0SGjzLK3%cHvdFyxqHd+Nu diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-39.pyc index 7e819f5ccf756ddf437eedc7e0b5bc9870af4862..eb6151e6c275de43a6a54b00898ed7ab2d76a294 100644 GIT binary patch delta 22 ccmX@kb)1Vgk(ZZ?0SNZ24@q>{$ZN$406`=LmH+?% delta 22 ccmX@kb)1Vgk(ZZ?0SGjzLK15>@>;P106Sm>1poj5 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-39.pyc index 781e4f76c48b3b9dd79603f86265d44cf64e7971..8433b71c8437a4c5f7e626060378e0cf3d5ce8b2 100644 GIT binary patch delta 23 dcmZ3-v5tc;k(ZZ?0SNZ24@vyQxRFnR1pq}C1@-^{ delta 23 dcmZ3-v5tc;k(ZZ?0SGjzLJ~QcHu5R3001}p1VjJ; diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-39.pyc index e7748e04682351bac7492df7574e3244cf20bc8d..64852dfc5c8cbd623134c2afa0b3ba50e6d5c983 100644 GIT binary patch delta 22 ccmZpYZj$CrdaXNx8k(ZZ?0SNZ24@s1C-pFUG0{~OW27Ukl delta 23 dcmX>daXNx8k(ZZ?0SGjzLJ~P#H}cu)002wK1*QN1 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-39.pyc index d8e5e9b806c72bea488f6a1be1b23236aa9c25ef..aa71b0e8005a96d4d5c692b0b1ba84a9f0cfcf96 100644 GIT binary patch delta 36 pcmaE0^}vcZk(ZZ?0SNZ24@nf>$jd9hQDg?>-eOGJtR!H^3jnjl2=V{` delta 36 pcmaE0^}vcZk(ZZ?0SGjzLJ~i0@9&2Q~lz delta 23 dcmezA`qPy!k(ZZ?0SGjzLK5XQHuAkz0sv9n26_Mh diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-39.pyc index 0d616236928146b731e2e2e3b80a1673ab8e9d6d..6f4774943bd46aa444ccea9ba660efcd026de32d 100644 GIT binary patch delta 23 dcmdlMye*h7k(ZZ?0SNZ24@talwvlgzCID2C2WtQT delta 23 dcmdlMye*h7k(ZZ?0SGjzLK6EeHu9~|1OQ7G22=n5 diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-39.pyc index 39b03231c5883dca96e799d9503abcb502db6ac9..66c1dcb83d5fbde1b1b3a04371e7bfedd374d8ae 100644 GIT binary patch delta 22 ccmX>kaY%wUk(ZZ?0SNZ24@s2S$ZN_20716}f&c&j delta 22 ccmX>kaY%wUk(ZZ?0SGjzLK3%bk(ZZ?0SNZ24@q1sxsmUk(ZZ?0SGjzLK1DHHu4=81^`CV1=0Wj diff --git a/.venv/lib/python3.9/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-39.pyc b/.venv/lib/python3.9/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-39.pyc index 8399dd48b8e352cfd5beba38afdcccf02e958ba5..f0429a741b2b662792839d2f9ab93c0db65c882f 100644 GIT binary patch delta 23 dcmew;@==5@k(ZZ?0SNZ24@tZ%u#qpB3jk8E2F(Bf delta 23 dcmew;@==5@k(ZZ?0SGjzLJ}o}Hu5EN0RTp`1xo+` diff --git a/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/INSTALLER b/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/LICENSE b/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/LICENSE new file mode 100644 index 00000000..a77350d8 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 kaiJIN + +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. diff --git a/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/METADATA b/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/METADATA new file mode 100644 index 00000000..e92f11f2 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/METADATA @@ -0,0 +1,21 @@ +Metadata-Version: 2.1 +Name: tk +Version: 0.1.0 +Summary: TensorKit is a deep learning helper between Python and C++. +Home-page: https://github.com/atranitell/TensorKit +Author: Kai Jin +Author-email: atranitell@gmail.com +License: Apache 2.0 Licence +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Operating System :: OS Independent +Classifier: Intended Audience :: Science/Research +Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence +Description-Content-Type: text/markdown + +UNKNOWN + + diff --git a/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/RECORD b/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/RECORD new file mode 100644 index 00000000..7abb4eb4 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/RECORD @@ -0,0 +1,15 @@ +tk-0.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +tk-0.1.0.dist-info/LICENSE,sha256=MH9HhyfBy9HZBpz_T8Tq5FQg8vxyqh7PPbJVd5efsgU,1063 +tk-0.1.0.dist-info/METADATA,sha256=jN6gCFOYnMRb5d6SPF8Wbb-Fj-bPXIm_NOqkkqlRluY,693 +tk-0.1.0.dist-info/RECORD,, +tk-0.1.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +tk-0.1.0.dist-info/WHEEL,sha256=U88EhGIw8Sj2_phqajeu_EAi3RAo8-C6zV3REsWbWbs,92 +tk-0.1.0.dist-info/top_level.txt,sha256=JeUv2teCAcHSOK73Cj0C_bKyZfgzp6-ycI7zkFfXOLc,3 +tk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +tk/__pycache__/__init__.cpython-39.pyc,, +tk/structure/Tensor.py,sha256=s5OD2dL6qAcMeDMxUD0ZO7jMun9X0J-KSP_LYH-C49c,2703 +tk/structure/TensorMap.py,sha256=9z76_XV8hCxqjyd3W9xUyNoiOISKHNJlzUCRUKhRFA0,2029 +tk/structure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +tk/structure/__pycache__/Tensor.cpython-39.pyc,, +tk/structure/__pycache__/TensorMap.cpython-39.pyc,, +tk/structure/__pycache__/__init__.cpython-39.pyc,, diff --git a/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/REQUESTED b/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/WHEEL b/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/WHEEL new file mode 100644 index 00000000..e499438d --- /dev/null +++ b/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/top_level.txt b/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/top_level.txt new file mode 100644 index 00000000..a276a6ec --- /dev/null +++ b/.venv/lib/python3.9/site-packages/tk-0.1.0.dist-info/top_level.txt @@ -0,0 +1 @@ +tk diff --git a/.venv/lib/python3.9/site-packages/tk/__init__.py b/.venv/lib/python3.9/site-packages/tk/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/.venv/lib/python3.9/site-packages/tk/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/tk/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0661eab68c3bb2f90da25e77e1bb40df29d031c8 GIT binary patch literal 180 zcmYe~<>g`kf@|wT5<&E15P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;x_yeo<+jer{?? zW}<#}QD$*Tep+f#vA#=YakhRyWkyMUo_=t0Mt**dzFt{sUYUMQW|DqEWl2VUp0S># xesN|=s%}AIa&}^RYO#JvwtjqkW?p7Ve7s&kktMS$ zcSy!PwRir7SOp-F98cwvMVb*KxYO+8wKu|P|-45LFU zbOA<}F4A)_dUS~{!&sy%^gN6uN@|9`dIA!RY7^-978e3P|7isa}1Rn!vb9e3>T!c%@UDvY1gx;(L~w9rvMXtzk^q- z1IdgIIW&P<9eY3q=8^Tx$_meoXZFB8bYR6Am=}#BlNbZLW*n2M@5*v3jP?-gtYG`?aVJos~HPv!9nS0wj_xpzaAU>9BlhL z3V1&Wx{S7?V2`&&mZE^*c3bQPTl>3Nngq4xZkooy`csxX4dQkq=@PGcq95+_U&KwThkv zZpQ`RLfj(YW2<_Cm^ps?*wer(Nx$1*yq@j%n2-yPA1b$Q-;JXkA>H1-Vkm{Aqj}P) zWxSp2NNXz<$0kP=BuS^VlXf-gvWvje<|k{!BdcR2k^4H7^g&5ys3b@E{2e41fMeTZ z#I{mo%tnXY`RH!KxtF@&x^{uuS}zl_8M z5|$sglWgOfatnVOmuG2JsO?5Q_5rXb)Vf3tDtTln_UqLP>$K8~Uzvx}uC))?Cucwo z!yma#l@hQ8ABbt= z8u=Q`{8zXobbe&bEal2QvT`?0qoIGGCg_~#@OR-$l0;{s?{<_$8^9B)t*P9okSpWt zK>mC`eFi5-y38s8pPr7tVcbCh;2*(RrKPV6z}&bCm!Lvw9XCa_-|g*lAJ5K;yE5X< zcYTFwsfw%AS|JB3dGt+eny=fiWz8*bALssslBctYUj>Q2`|>Obi&~WjESaf63Bdt# zC)@q@v;q}!usorF-c$7#rB|;fP{itWS*q8&DecENuhi?m^rJZE6zg>nrL{sZUrXVblB=A#iNC_)kwHJw3_M|XsaQd zg247Ljc0LW7}XxO@l!XDpv*H?`43>MAsD_1v!QTXKwY1fJ$4FK{h#ol5`A};=vRf% z$Rhj#e(01VD5Up%;h6j(oEbaf`&j@+x{q@Q908FFE#0hg)i#E?qsvXMeCWX~>rTwN z(|165K^tFX5Tek>o*)+VsX;jA)tM|to(c)90T>cTqYEhsi+2*LQPx# literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/tk/structure/__pycache__/TensorMap.cpython-39.pyc b/.venv/lib/python3.9/site-packages/tk/structure/__pycache__/TensorMap.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4479a340187597dc6b9b17977e02494c24c2e4bd GIT binary patch literal 2773 zcmcIm&2QX96rb_HEu8#~^7G$4eq<>&Ftn|W{E@Auv~X|)yzT)+Ihp8Vz! z@+*EEzijwegGW6D!3n1+iO6HZEzVvM&IEnQB8%JHc|{_|UGBl#=00!0+u;km32&D# z@)o>3zQixU+vl`Hg5^V4k+gd#k6#Qv*5FZ(KnN01PQU`)pb-;xY4;_CwM(0BWz(x{ z`jyQ_WpjZqfvpR=u`V)|%kPr0w&Nn{_R!4HYY#x3h^nLPd0=Ki>*)wQ~BKY|t&x?Di?rvf*d=SK1p)OsfyVvTm)wAj+0*b*!=9qx4K%)$(38gh9G2^5| zBx(e<#K>z0FiAz^tm8}K{D5g&iL@_~pqhsm;tjV?UrNO?G$p5ZD{s9R|l572&-wDpW2|d z+sQ~=fw2+?dYSrk<-|Tw;s4sFd$dpaCbq7jKuXRLKo0lwccJfG2T`GC@BuBnaMc=! zZTNUC5Z2T(K*$OR3&3GhR_g*-oUM@C1bPubZ^}>ui$dy;{5=~p6Y|xWI}b9Iy1x zhySROolEmis^~&AAu5)kx4aIPO;iH!A0p5wBk)vYuO&yTauCKhip`t2EmKaaZS7t; zvz1b_9W=Ec#~DyNj`czuk8(aqvAr0_KTeXg8fnC_O7lX&K(m)7N{s}RJua7V0|r}U zrhE^@M<_lj6#0d(g`qZ^7y5RY?@4?+N)%rw`ktoQ6`#1$xnUWctjQf<9 zHNt8i;&4EtW~WGG@vJ)pdK^&gbti+A3wg{5w6Eud%jn;MzTe>?@&91{u?s zk)`PZO4*Rj;H-kYp!=+Lq^wg;boIFuW0CQr+Vn!eVKvwm9SGp-P!25l8LX~tjP+@E zmuukeagG(}E~qLji#A>UQ+^JOf9*6Jv6a)TE#HR~%EY_{t=g9X)RMpT1&hrZ%$WOf z8@~RNFNYZMGrmM#VSXo0A4&Ss@z9iQ_27g@2<{n=>Vi0D6P!cq}YCaUel=YFykeq zWeCHk5m~GagC71hN=$wE6^Ni=xCTEuCL>H{8IBvyNCZn_e2i0O#<9igbk+XdvLbwq QVKWKnv*jB;gN!xzU*Q)&fdBvi literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/tk/structure/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/tk/structure/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f768ec37c5a1651aebccef4d8aee54b55ace465b GIT binary patch literal 190 zcmYj~u?oU47=%-B5Wxp=u>asBh&VWlQ1=kiXn)csCI6p7AIZtLad7n!+?-4%J-F|< zTTadAGm-STpH$9Q#=nYGcF8nJs6{0f#o;DGo`3jg2+=`jYE)nY68nn@1bZY4$FX7W zpwf-^EtG?C1GIRCe&oixRk;R2Hp^aVtFDHCEf9yOIR*n#qC=Ll?8oPH)A>5KW}DC7 G$>Ixw!7|VQ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/AUTHORS b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/AUTHORS new file mode 100644 index 00000000..b5e878e2 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/AUTHORS @@ -0,0 +1,9 @@ +# This is the official list of YAPF authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS files. +# See the latter for an explanation. + +# Names should be added to this file as: +# Name or Organization +# The email address is not required for organizations. + +Google Inc. diff --git a/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/INSTALLER b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/LICENSE b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/METADATA b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/METADATA new file mode 100644 index 00000000..25084e77 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/METADATA @@ -0,0 +1,1026 @@ +Metadata-Version: 2.1 +Name: yapf +Version: 0.31.0 +Summary: A formatter for Python code. +Home-page: UNKNOWN +Author: Google Inc. +Maintainer: Bill Wendling +Maintainer-email: morbo@google.com +License: Apache License, Version 2.0 +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Software Development :: Quality Assurance + +==== +YAPF +==== + +.. image:: https://badge.fury.io/py/yapf.svg + :target: https://badge.fury.io/py/yapf + :alt: PyPI version + +.. image:: https://travis-ci.org/google/yapf.svg?branch=main + :target: https://travis-ci.org/google/yapf + :alt: Build status + +.. image:: https://coveralls.io/repos/google/yapf/badge.svg?branch=main + :target: https://coveralls.io/r/google/yapf?branch=main + :alt: Coverage status + + +Introduction +============ + +Most of the current formatters for Python --- e.g., autopep8, and pep8ify --- +are made to remove lint errors from code. This has some obvious limitations. +For instance, code that conforms to the PEP 8 guidelines may not be +reformatted. But it doesn't mean that the code looks good. + +YAPF takes a different approach. It's based off of `'clang-format' `_, developed by Daniel Jasper. In essence, +the algorithm takes the code and reformats it to the best formatting that +conforms to the style guide, even if the original code didn't violate the +style guide. The idea is also similar to the `'gofmt' `_ tool for the Go programming language: end all holy wars about +formatting - if the whole codebase of a project is simply piped through YAPF +whenever modifications are made, the style remains consistent throughout the +project and there's no point arguing about style in every code review. + +The ultimate goal is that the code YAPF produces is as good as the code that a +programmer would write if they were following the style guide. It takes away +some of the drudgery of maintaining your code. + +.. footer:: + + YAPF is not an official Google product (experimental or otherwise), it is + just code that happens to be owned by Google. + +.. contents:: + + +Installation +============ + +To install YAPF from PyPI: + +.. code-block:: shell + + $ pip install yapf + +(optional) If you are using Python 2.7 and want to enable multiprocessing: + +.. code-block:: shell + + $ pip install futures + +YAPF is still considered in "alpha" stage, and the released version may change +often; therefore, the best way to keep up-to-date with the latest development +is to clone this repository. + +Note that if you intend to use YAPF as a command-line tool rather than as a +library, installation is not necessary. YAPF supports being run as a directory +by the Python interpreter. If you cloned/unzipped YAPF into ``DIR``, it's +possible to run: + +.. code-block:: shell + + $ PYTHONPATH=DIR python DIR/yapf [options] ... + + +Python versions +=============== + +YAPF supports Python 2.7 and 3.6.4+. (Note that some Python 3 features may fail +to parse with Python versions before 3.6.4.) + +YAPF requires the code it formats to be valid Python for the version YAPF itself +runs under. Therefore, if you format Python 3 code with YAPF, run YAPF itself +under Python 3 (and similarly for Python 2). + + +Usage +===== + +Options:: + + usage: yapf [-h] [-v] [-d | -i] [-r | -l START-END] [-e PATTERN] + [--style STYLE] [--style-help] [--no-local-style] [-p] + [-vv] + [files [files ...]] + + Formatter for Python code. + + positional arguments: + files + + optional arguments: + -h, --help show this help message and exit + -v, --version show version number and exit + -d, --diff print the diff for the fixed source + -i, --in-place make changes to files in place + -r, --recursive run recursively over directories + -l START-END, --lines START-END + range of lines to reformat, one-based + -e PATTERN, --exclude PATTERN + patterns for files to exclude from formatting + --style STYLE specify formatting style: either a style name (for + example "pep8" or "google"), or the name of a file + with style settings. The default is pep8 unless a + .style.yapf or setup.cfg or pyproject.toml file + located in the same directory as the source or one of + its parent directories (for stdin, the current + directory is used). + --style-help show style settings and exit; this output can be saved + to .style.yapf to make your settings permanent + --no-local-style don't search for local style definition + -p, --parallel Run yapf in parallel when formatting multiple files. + Requires concurrent.futures in Python 2.X + -vv, --verbose Print out file names while processing + + +------------ +Return Codes +------------ + +Normally YAPF returns zero on successful program termination and non-zero otherwise. + +If ``--diff`` is supplied, YAPF returns zero when no changes were necessary, non-zero +otherwise (including program error). You can use this in a CI workflow to test that code +has been YAPF-formatted. + +--------------------------------------------- +Excluding files from formatting (.yapfignore) +--------------------------------------------- + +In addition to exclude patterns provided on commandline, YAPF looks for additional +patterns specified in a file named ``.yapfignore`` located in the working directory from +which YAPF is invoked. + +``.yapfignore``'s syntax is similar to UNIX's filename pattern matching:: + + * matches everything + ? matches any single character + [seq] matches any character in seq + [!seq] matches any character not in seq + +Note that no entry should begin with `./`. + + +Formatting style +================ + +The formatting style used by YAPF is configurable and there are many "knobs" +that can be used to tune how YAPF does formatting. See the ``style.py`` module +for the full list. + +To control the style, run YAPF with the ``--style`` argument. It accepts one of +the predefined styles (e.g., ``pep8`` or ``google``), a path to a configuration +file that specifies the desired style, or a dictionary of key/value pairs. + +The config file is a simple listing of (case-insensitive) ``key = value`` pairs +with a ``[yapf]`` heading. For example: + +.. code-block:: ini + + [yapf] + based_on_style = pep8 + spaces_before_comment = 4 + split_before_logical_operator = true + +The ``based_on_style`` setting determines which of the predefined styles this +custom style is based on (think of it like subclassing). Four +styles are predefined: + +- ``pep8`` (default) +- ``google`` (based off of the `Google Python Style Guide`_) +- ``yapf`` (for use with Google open source projects) +- ``facebook`` + +.. _`Google Python Style Guide`: https://github.com/google/styleguide/blob/gh-pages/pyguide.md + +See ``_STYLE_NAME_TO_FACTORY`` in style.py_ for details. + +.. _style.py: https://github.com/google/yapf/blob/main/yapf/yapflib/style.py + +It's also possible to do the same on the command line with a dictionary. For +example: + +.. code-block:: shell + + --style='{based_on_style: pep8, indent_width: 2}' + +This will take the ``pep8`` base style and modify it to have two space +indentations. + +YAPF will search for the formatting style in the following manner: + +1. Specified on the command line +2. In the ``[style]`` section of a ``.style.yapf`` file in either the current + directory or one of its parent directories. +3. In the ``[yapf]`` section of a ``setup.cfg`` file in either the current + directory or one of its parent directories. +4. In the ``[tool.yapf]`` section of a ``pyproject.toml`` file in either the current + directory or one of its parent directories. +5. In the ``[style]`` section of a ``~/.config/yapf/style`` file in your home + directory. + +If none of those files are found, the default style is used (PEP8). + + +Example +======= + +An example of the type of formatting that YAPF can do, it will take this ugly +code: + +.. code-block:: python + + x = { 'a':37,'b':42, + + 'c':927} + + y = 'hello ''world' + z = 'hello '+'world' + a = 'hello {}'.format('world') + class foo ( object ): + def f (self ): + return 37*-+2 + def g(self, x,y=42): + return y + def f ( a ) : + return 37+-+a[42-x : y**3] + +and reformat it into: + +.. code-block:: python + + x = {'a': 37, 'b': 42, 'c': 927} + + y = 'hello ' 'world' + z = 'hello ' + 'world' + a = 'hello {}'.format('world') + + + class foo(object): + def f(self): + return 37 * -+2 + + def g(self, x, y=42): + return y + + + def f(a): + return 37 + -+a[42 - x:y**3] + + +Example as a module +=================== + +The two main APIs for calling yapf are ``FormatCode`` and ``FormatFile``, these +share several arguments which are described below: + +.. code-block:: python + + >>> from yapf.yapflib.yapf_api import FormatCode # reformat a string of code + + >>> FormatCode("f ( a = 1, b = 2 )") + 'f(a=1, b=2)\n' + +A ``style_config`` argument: Either a style name or a path to a file that contains +formatting style settings. If None is specified, use the default style +as set in ``style.DEFAULT_STYLE_FACTORY``. + +.. code-block:: python + + >>> FormatCode("def g():\n return True", style_config='pep8') + 'def g():\n return True\n' + +A ``lines`` argument: A list of tuples of lines (ints), [start, end], +that we want to format. The lines are 1-based indexed. It can be used by +third-party code (e.g., IDEs) when reformatting a snippet of code rather +than a whole file. + +.. code-block:: python + + >>> FormatCode("def g( ):\n a=1\n b = 2\n return a==b", lines=[(1, 1), (2, 3)]) + 'def g():\n a = 1\n b = 2\n return a==b\n' + +A ``print_diff`` (bool): Instead of returning the reformatted source, return a +diff that turns the formatted source into reformatter source. + +.. code-block:: python + + >>> print(FormatCode("a==b", filename="foo.py", print_diff=True)) + --- foo.py (original) + +++ foo.py (reformatted) + @@ -1 +1 @@ + -a==b + +a == b + +Note: the ``filename`` argument for ``FormatCode`` is what is inserted into +the diff, the default is ````. + +``FormatFile`` returns reformatted code from the passed file along with its encoding: + +.. code-block:: python + + >>> from yapf.yapflib.yapf_api import FormatFile # reformat a file + + >>> print(open("foo.py").read()) # contents of file + a==b + + >>> FormatFile("foo.py") + ('a == b\n', 'utf-8') + +The ``in_place`` argument saves the reformatted code back to the file: + +.. code-block:: python + + >>> FormatFile("foo.py", in_place=True) + (None, 'utf-8') + + >>> print(open("foo.py").read()) # contents of file (now fixed) + a == b + +Formatting diffs +================ + +Options:: + + usage: yapf-diff [-h] [-i] [-p NUM] [--regex PATTERN] [--iregex PATTERN][-v] + [--style STYLE] [--binary BINARY] + + This script reads input from a unified diff and reformats all the changed + lines. This is useful to reformat all the lines touched by a specific patch. + Example usage for git/svn users: + + git diff -U0 --no-color --relative HEAD^ | yapf-diff -i + svn diff --diff-cmd=diff -x-U0 | yapf-diff -p0 -i + + It should be noted that the filename contained in the diff is used + unmodified to determine the source file to update. Users calling this script + directly should be careful to ensure that the path in the diff is correct + relative to the current working directory. + + optional arguments: + -h, --help show this help message and exit + -i, --in-place apply edits to files instead of displaying a diff + -p NUM, --prefix NUM strip the smallest prefix containing P slashes + --regex PATTERN custom pattern selecting file paths to reformat + (case sensitive, overrides -iregex) + --iregex PATTERN custom pattern selecting file paths to reformat + (case insensitive, overridden by -regex) + -v, --verbose be more verbose, ineffective without -i + --style STYLE specify formatting style: either a style name (for + example "pep8" or "google"), or the name of a file + with style settings. The default is pep8 unless a + .style.yapf or setup.cfg or pyproject.toml file + located in the same directory as the source or one of + its parent directories (for stdin, the current + directory is used). + --binary BINARY location of binary to use for yapf + +Knobs +===== + +``ALIGN_CLOSING_BRACKET_WITH_VISUAL_INDENT`` + Align closing bracket with visual indentation. + +``ALLOW_MULTILINE_LAMBDAS`` + Allow lambdas to be formatted on more than one line. + +``ALLOW_MULTILINE_DICTIONARY_KEYS`` + Allow dictionary keys to exist on multiple lines. For example: + + .. code-block:: python + + x = { + ('this is the first element of a tuple', + 'this is the second element of a tuple'): + value, + } + +``ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNS`` + Allow splitting before a default / named assignment in an argument list. + +``ALLOW_SPLIT_BEFORE_DICT_VALUE`` + Allow splits before the dictionary value. + +``ARITHMETIC_PRECEDENCE_INDICATION`` + Let spacing indicate operator precedence. For example: + + .. code-block:: python + + a = 1 * 2 + 3 / 4 + b = 1 / 2 - 3 * 4 + c = (1 + 2) * (3 - 4) + d = (1 - 2) / (3 + 4) + e = 1 * 2 - 3 + f = 1 + 2 + 3 + 4 + + will be formatted as follows to indicate precedence: + + .. code-block:: python + + a = 1*2 + 3/4 + b = 1/2 - 3*4 + c = (1+2) * (3-4) + d = (1-2) / (3+4) + e = 1*2 - 3 + f = 1 + 2 + 3 + 4 + +``BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF`` + Insert a blank line before a ``def`` or ``class`` immediately nested within + another ``def`` or ``class``. For example: + + .. code-block:: python + + class Foo: + # <------ this blank line + def method(): + pass + +``BLANK_LINE_BEFORE_MODULE_DOCSTRING`` + Insert a blank line before a module docstring. + +``BLANK_LINE_BEFORE_CLASS_DOCSTRING`` + Insert a blank line before a class-level docstring. + +``BLANK_LINES_AROUND_TOP_LEVEL_DEFINITION`` + Sets the number of desired blank lines surrounding top-level function and + class definitions. For example: + + .. code-block:: python + + class Foo: + pass + # <------ having two blank lines here + # <------ is the default setting + class Bar: + pass + +``BLANK_LINES_BETWEEN_TOP_LEVEL_IMPORTS_AND_VARIABLES`` + Sets the number of desired blank lines between top-level imports and + variable definitions. Useful for compatibility with tools like isort. + +``COALESCE_BRACKETS`` + Do not split consecutive brackets. Only relevant when + ``DEDENT_CLOSING_BRACKETS`` or ``INDENT_CLOSING_BRACKETS`` + is set. For example: + + .. code-block:: python + + call_func_that_takes_a_dict( + { + 'key1': 'value1', + 'key2': 'value2', + } + ) + + would reformat to: + + .. code-block:: python + + call_func_that_takes_a_dict({ + 'key1': 'value1', + 'key2': 'value2', + }) + + +``COLUMN_LIMIT`` + The column limit (or max line-length) + +``CONTINUATION_ALIGN_STYLE`` + The style for continuation alignment. Possible values are: + + - ``SPACE``: Use spaces for continuation alignment. This is default + behavior. + - ``FIXED``: Use fixed number (CONTINUATION_INDENT_WIDTH) of columns + (ie: CONTINUATION_INDENT_WIDTH/INDENT_WIDTH tabs or CONTINUATION_INDENT_WIDTH + spaces) for continuation alignment. + - ``VALIGN-RIGHT``: Vertically align continuation lines to multiple of + INDENT_WIDTH columns. Slightly right (one tab or a few spaces) if cannot + vertically align continuation lines with indent characters. + +``CONTINUATION_INDENT_WIDTH`` + Indent width used for line continuations. + +``DEDENT_CLOSING_BRACKETS`` + Put closing brackets on a separate line, dedented, if the bracketed + expression can't fit in a single line. Applies to all kinds of brackets, + including function definitions and calls. For example: + + .. code-block:: python + + config = { + 'key1': 'value1', + 'key2': 'value2', + } # <--- this bracket is dedented and on a separate line + + time_series = self.remote_client.query_entity_counters( + entity='dev3246.region1', + key='dns.query_latency_tcp', + transform=Transformation.AVERAGE(window=timedelta(seconds=60)), + start_ts=now()-timedelta(days=3), + end_ts=now(), + ) # <--- this bracket is dedented and on a separate line + +``DISABLE_ENDING_COMMA_HEURISTIC`` + Disable the heuristic which places each list element on a separate line if + the list is comma-terminated. + +``EACH_DICT_ENTRY_ON_SEPARATE_LINE`` + Place each dictionary entry onto its own line. + +``FORCE_MULTILINE_DICT`` + Respect EACH_DICT_ENTRY_ON_SEPARATE_LINE even if the line is shorter than + COLUMN_LIMIT. + +``I18N_COMMENT`` + The regex for an internationalization comment. The presence of this comment + stops reformatting of that line, because the comments are required to be + next to the string they translate. + +``I18N_FUNCTION_CALL`` + The internationalization function call names. The presence of this function + stops reformatting on that line, because the string it has cannot be moved + away from the i18n comment. + +``INDENT_DICTIONARY_VALUE`` + Indent the dictionary value if it cannot fit on the same line as the + dictionary key. For example: + + .. code-block:: python + + config = { + 'key1': + 'value1', + 'key2': value1 + + value2, + } + +``INDENT_WIDTH`` + The number of columns to use for indentation. + +``INDENT_BLANK_LINES`` + Set to ``True`` to prefer indented blank lines rather than empty + +``INDENT_CLOSING_BRACKETS`` + Put closing brackets on a separate line, indented, if the bracketed + expression can't fit in a single line. Applies to all kinds of brackets, + including function definitions and calls. For example: + + .. code-block:: python + + config = { + 'key1': 'value1', + 'key2': 'value2', + } # <--- this bracket is indented and on a separate line + + time_series = self.remote_client.query_entity_counters( + entity='dev3246.region1', + key='dns.query_latency_tcp', + transform=Transformation.AVERAGE(window=timedelta(seconds=60)), + start_ts=now()-timedelta(days=3), + end_ts=now(), + ) # <--- this bracket is indented and on a separate line + +``JOIN_MULTIPLE_LINES`` + Join short lines into one line. E.g., single line ``if`` statements. + +``NO_SPACES_AROUND_SELECTED_BINARY_OPERATORS`` + Do not include spaces around selected binary operators. For example: + + .. code-block:: python + + 1 + 2 * 3 - 4 / 5 + + will be formatted as follows when configured with ``*``, ``/``: + + .. code-block:: python + + 1 + 2*3 - 4/5 + +``SPACES_AROUND_POWER_OPERATOR`` + Set to ``True`` to prefer using spaces around ``**``. + +``SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN`` + Set to ``True`` to prefer spaces around the assignment operator for default + or keyword arguments. + +``SPACES_AROUND_DICT_DELIMITERS`` + Adds a space after the opening '{' and before the ending '}' dict delimiters. + + .. code-block:: python + + {1: 2} + + will be formatted as: + + .. code-block:: python + + { 1: 2 } + +``SPACES_AROUND_LIST_DELIMITERS`` + Adds a space after the opening '[' and before the ending ']' list delimiters. + + .. code-block:: python + + [1, 2] + + will be formatted as: + + .. code-block:: python + + [ 1, 2 ] + +``SPACES_AROUND_SUBSCRIPT_COLON`` + Use spaces around the subscript / slice operator. For example: + + .. code-block:: python + + my_list[1 : 10 : 2] + +``SPACES_AROUND_TUPLE_DELIMITERS`` + Adds a space after the opening '(' and before the ending ')' tuple delimiters. + + .. code-block:: python + + (1, 2, 3) + + will be formatted as: + + .. code-block:: python + + ( 1, 2, 3 ) + +``SPACES_BEFORE_COMMENT`` + The number of spaces required before a trailing comment. + This can be a single value (representing the number of spaces + before each trailing comment) or list of of values (representing + alignment column values; trailing comments within a block will + be aligned to the first column value that is greater than the maximum + line length within the block). For example: + + With ``spaces_before_comment=5``: + + .. code-block:: python + + 1 + 1 # Adding values + + will be formatted as: + + .. code-block:: python + + 1 + 1 # Adding values <-- 5 spaces between the end of the statement and comment + + With ``spaces_before_comment=15, 20``: + + .. code-block:: python + + 1 + 1 # Adding values + two + two # More adding + + longer_statement # This is a longer statement + short # This is a shorter statement + + a_very_long_statement_that_extends_beyond_the_final_column # Comment + short # This is a shorter statement + + will be formatted as: + + .. code-block:: python + + 1 + 1 # Adding values <-- end of line comments in block aligned to col 15 + two + two # More adding + + longer_statement # This is a longer statement <-- end of line comments in block aligned to col 20 + short # This is a shorter statement + + a_very_long_statement_that_extends_beyond_the_final_column # Comment <-- the end of line comments are aligned based on the line length + short # This is a shorter statement + +``SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKET`` + Insert a space between the ending comma and closing bracket of a list, etc. + +``SPACE_INSIDE_BRACKETS`` + Use spaces inside brackets, braces, and parentheses. For example: + + .. code-block:: python + + method_call( 1 ) + my_dict[ 3 ][ 1 ][ get_index( *args, **kwargs ) ] + my_set = { 1, 2, 3 } + +``SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED`` + Split before arguments if the argument list is terminated by a comma. + +``SPLIT_ALL_COMMA_SEPARATED_VALUES`` + If a comma separated list (``dict``, ``list``, ``tuple``, or function + ``def``) is on a line that is too long, split such that all elements + are on a single line. + +``SPLIT_ALL_TOP_LEVEL_COMMA_SEPARATED_VALUES`` + Variation on ``SPLIT_ALL_COMMA_SEPARATED_VALUES`` in which, if a + subexpression with a comma fits in its starting line, then the + subexpression is not split. This avoids splits like the one for + ``b`` in this code: + + .. code-block:: python + + abcdef( + aReallyLongThing: int, + b: [Int, + Int]) + + With the new knob this is split as: + + .. code-block:: python + + abcdef( + aReallyLongThing: int, + b: [Int, Int]) + +``SPLIT_BEFORE_BITWISE_OPERATOR`` + Set to ``True`` to prefer splitting before ``&``, ``|`` or ``^`` rather + than after. + +``SPLIT_BEFORE_ARITHMETIC_OPERATOR`` + Set to ``True`` to prefer splitting before ``+``, ``-``, ``*``, ``/``, ``//``, + or ``@`` rather than after. + +``SPLIT_BEFORE_CLOSING_BRACKET`` + Split before the closing bracket if a ``list`` or ``dict`` literal doesn't + fit on a single line. + +``SPLIT_BEFORE_DICT_SET_GENERATOR`` + Split before a dictionary or set generator (comp_for). For example, note + the split before the ``for``: + + .. code-block:: python + + foo = { + variable: 'Hello world, have a nice day!' + for variable in bar if variable != 42 + } + +``SPLIT_BEFORE_DOT`` + Split before the ``.`` if we need to split a longer expression: + + .. code-block:: python + + foo = ('This is a really long string: {}, {}, {}, {}'.format(a, b, c, d)) + + would reformat to something like: + + .. code-block:: python + + foo = ('This is a really long string: {}, {}, {}, {}' + .format(a, b, c, d)) + +``SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN`` + Split after the opening paren which surrounds an expression if it doesn't + fit on a single line. + +``SPLIT_BEFORE_FIRST_ARGUMENT`` + If an argument / parameter list is going to be split, then split before the + first argument. + +``SPLIT_BEFORE_LOGICAL_OPERATOR`` + Set to ``True`` to prefer splitting before ``and`` or ``or`` rather than + after. + +``SPLIT_BEFORE_NAMED_ASSIGNS`` + Split named assignments onto individual lines. + +``SPLIT_COMPLEX_COMPREHENSION`` + For list comprehensions and generator expressions with multiple clauses + (e.g multiple ``for`` calls, ``if`` filter expressions) and which need to + be reflowed, split each clause onto its own line. For example: + + .. code-block:: python + + result = [ + a_var + b_var for a_var in xrange(1000) for b_var in xrange(1000) + if a_var % b_var] + + would reformat to something like: + + .. code-block:: python + + result = [ + a_var + b_var + for a_var in xrange(1000) + for b_var in xrange(1000) + if a_var % b_var] + +``SPLIT_PENALTY_AFTER_OPENING_BRACKET`` + The penalty for splitting right after the opening bracket. + +``SPLIT_PENALTY_AFTER_UNARY_OPERATOR`` + The penalty for splitting the line after a unary operator. + +``SPLIT_PENALTY_ARITHMETIC_OPERATOR`` + The penalty of splitting the line around the ``+``, ``-``, ``*``, ``/``, + ``//``, ``%``, and ``@`` operators. + +``SPLIT_PENALTY_BEFORE_IF_EXPR`` + The penalty for splitting right before an ``if`` expression. + +``SPLIT_PENALTY_BITWISE_OPERATOR`` + The penalty of splitting the line around the ``&``, ``|``, and ``^`` + operators. + +``SPLIT_PENALTY_COMPREHENSION`` + The penalty for splitting a list comprehension or generator expression. + +``SPLIT_PENALTY_EXCESS_CHARACTER`` + The penalty for characters over the column limit. + +``SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT`` + The penalty incurred by adding a line split to the unwrapped line. The more + line splits added the higher the penalty. + +``SPLIT_PENALTY_IMPORT_NAMES`` + The penalty of splitting a list of ``import as`` names. For example: + + .. code-block:: python + + from a_very_long_or_indented_module_name_yada_yad import (long_argument_1, + long_argument_2, + long_argument_3) + + would reformat to something like: + + .. code-block:: python + + from a_very_long_or_indented_module_name_yada_yad import ( + long_argument_1, long_argument_2, long_argument_3) + +``SPLIT_PENALTY_LOGICAL_OPERATOR`` + The penalty of splitting the line around the ``and`` and ``or`` operators. + +``USE_TABS`` + Use the Tab character for indentation. + +(Potentially) Frequently Asked Questions +======================================== + +-------------------------------------------- +Why does YAPF destroy my awesome formatting? +-------------------------------------------- + +YAPF tries very hard to get the formatting correct. But for some code, it won't +be as good as hand-formatting. In particular, large data literals may become +horribly disfigured under YAPF. + +The reasons for this are manyfold. In short, YAPF is simply a tool to help +with development. It will format things to coincide with the style guide, but +that may not equate with readability. + +What can be done to alleviate this situation is to indicate regions YAPF should +ignore when reformatting something: + +.. code-block:: python + + # yapf: disable + FOO = { + # ... some very large, complex data literal. + } + + BAR = [ + # ... another large data literal. + ] + # yapf: enable + +You can also disable formatting for a single literal like this: + +.. code-block:: python + + BAZ = { + (1, 2, 3, 4), + (5, 6, 7, 8), + (9, 10, 11, 12), + } # yapf: disable + +To preserve the nice dedented closing brackets, use the +``dedent_closing_brackets`` in your style. Note that in this case all +brackets, including function definitions and calls, are going to use +that style. This provides consistency across the formatted codebase. + +------------------------------- +Why Not Improve Existing Tools? +------------------------------- + +We wanted to use clang-format's reformatting algorithm. It's very powerful and +designed to come up with the best formatting possible. Existing tools were +created with different goals in mind, and would require extensive modifications +to convert to using clang-format's algorithm. + +----------------------------- +Can I Use YAPF In My Program? +----------------------------- + +Please do! YAPF was designed to be used as a library as well as a command line +tool. This means that a tool or IDE plugin is free to use YAPF. + +----------------------------------------- +I still get non Pep8 compliant code! Why? +----------------------------------------- + +YAPF tries very hard to be fully PEP 8 compliant. However, it is paramount +to not risk altering the semantics of your code. Thus, YAPF tries to be as +safe as possible and does not change the token stream +(e.g., by adding parentheses). +All these cases however, can be easily fixed manually. For instance, + +.. code-block:: python + + from my_package import my_function_1, my_function_2, my_function_3, my_function_4, my_function_5 + + FOO = my_variable_1 + my_variable_2 + my_variable_3 + my_variable_4 + my_variable_5 + my_variable_6 + my_variable_7 + my_variable_8 + +won't be split, but you can easily get it right by just adding parentheses: + +.. code-block:: python + + from my_package import (my_function_1, my_function_2, my_function_3, + my_function_4, my_function_5) + + FOO = (my_variable_1 + my_variable_2 + my_variable_3 + my_variable_4 + + my_variable_5 + my_variable_6 + my_variable_7 + my_variable_8) + +Gory Details +============ + +---------------- +Algorithm Design +---------------- + +The main data structure in YAPF is the ``UnwrappedLine`` object. It holds a list +of ``FormatToken``\s, that we would want to place on a single line if there were +no column limit. An exception being a comment in the middle of an expression +statement will force the line to be formatted on more than one line. The +formatter works on one ``UnwrappedLine`` object at a time. + +An ``UnwrappedLine`` typically won't affect the formatting of lines before or +after it. There is a part of the algorithm that may join two or more +``UnwrappedLine``\s into one line. For instance, an if-then statement with a +short body can be placed on a single line: + +.. code-block:: python + + if a == 42: continue + +YAPF's formatting algorithm creates a weighted tree that acts as the solution +space for the algorithm. Each node in the tree represents the result of a +formatting decision --- i.e., whether to split or not to split before a token. +Each formatting decision has a cost associated with it. Therefore, the cost is +realized on the edge between two nodes. (In reality, the weighted tree doesn't +have separate edge objects, so the cost resides on the nodes themselves.) + +For example, take the following Python code snippet. For the sake of this +example, assume that line (1) violates the column limit restriction and needs to +be reformatted. + +.. code-block:: python + + def xxxxxxxxxxx(aaaaaaaaaaaa, bbbbbbbbb, cccccccc, dddddddd, eeeeee): # 1 + pass # 2 + +For line (1), the algorithm will build a tree where each node (a +``FormattingDecisionState`` object) is the state of the line at that token given +the decision to split before the token or not. Note: the ``FormatDecisionState`` +objects are copied by value so each node in the graph is unique and a change in +one doesn't affect other nodes. + +Heuristics are used to determine the costs of splitting or not splitting. +Because a node holds the state of the tree up to a token's insertion, it can +easily determine if a splitting decision will violate one of the style +requirements. For instance, the heuristic is able to apply an extra penalty to +the edge when not splitting between the previous token and the one being added. + +There are some instances where we will never want to split the line, because +doing so will always be detrimental (i.e., it will require a backslash-newline, +which is very rarely desirable). For line (1), we will never want to split the +first three tokens: ``def``, ``xxxxxxxxxxx``, and ``(``. Nor will we want to +split between the ``)`` and the ``:`` at the end. These regions are said to be +"unbreakable." This is reflected in the tree by there not being a "split" +decision (left hand branch) within the unbreakable region. + +Now that we have the tree, we determine what the "best" formatting is by finding +the path through the tree with the lowest cost. + +And that's it! + + diff --git a/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/RECORD b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/RECORD new file mode 100644 index 00000000..eb5ba6cb --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/RECORD @@ -0,0 +1,109 @@ +../../../bin/yapf,sha256=WCBLcotr5g3fIFZ1Ctzhm3Z757WtSRcsm4KqVz3CdkI,252 +../../../bin/yapf-diff,sha256=mDli66ek7j4vjfdisNZkay-ik3P2A1D5TDeoNJnWHag,276 +yapf-0.31.0.dist-info/AUTHORS,sha256=GjWR8Xly-Dl9VrKuzTLOvRoCbMNy278DxK2Sud9LcCw,307 +yapf-0.31.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +yapf-0.31.0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 +yapf-0.31.0.dist-info/METADATA,sha256=LVZ2UdIdDWvcyZvycrgLTvTQgk2I3p9lg5Uu49jWAYA,34036 +yapf-0.31.0.dist-info/RECORD,, +yapf-0.31.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +yapf-0.31.0.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 +yapf-0.31.0.dist-info/entry_points.txt,sha256=fc7WCcYyJWR7Twl8ubci_UQz4gt-U9VYkXKDZODxEHA,94 +yapf-0.31.0.dist-info/top_level.txt,sha256=Y1sKm3Or1-KlBNXU8zv3IuXSJx1lAU-I_Cv_qTNq-WQ,15 +yapf/__init__.py,sha256=vQ4lF_BZ0lW_KZF7-77Cljs8uZaSmMyflcZ4Q-xpYJg,12493 +yapf/__main__.py,sha256=jJ5Fcwe6tbXxqSuUxRO3uel44tHP53vVScojlus0cBM,680 +yapf/__pycache__/__init__.cpython-39.pyc,, +yapf/__pycache__/__main__.cpython-39.pyc,, +yapf/yapflib/__init__.py,sha256=abBqhqqPP10jK6pNCEt5VDVZfYK0u0fQugTp2AC0K4k,596 +yapf/yapflib/__pycache__/__init__.cpython-39.pyc,, +yapf/yapflib/__pycache__/blank_line_calculator.cpython-39.pyc,, +yapf/yapflib/__pycache__/comment_splicer.cpython-39.pyc,, +yapf/yapflib/__pycache__/continuation_splicer.cpython-39.pyc,, +yapf/yapflib/__pycache__/errors.cpython-39.pyc,, +yapf/yapflib/__pycache__/file_resources.cpython-39.pyc,, +yapf/yapflib/__pycache__/format_decision_state.cpython-39.pyc,, +yapf/yapflib/__pycache__/format_token.cpython-39.pyc,, +yapf/yapflib/__pycache__/identify_container.cpython-39.pyc,, +yapf/yapflib/__pycache__/line_joiner.cpython-39.pyc,, +yapf/yapflib/__pycache__/object_state.cpython-39.pyc,, +yapf/yapflib/__pycache__/py3compat.cpython-39.pyc,, +yapf/yapflib/__pycache__/pytree_unwrapper.cpython-39.pyc,, +yapf/yapflib/__pycache__/pytree_utils.cpython-39.pyc,, +yapf/yapflib/__pycache__/pytree_visitor.cpython-39.pyc,, +yapf/yapflib/__pycache__/reformatter.cpython-39.pyc,, +yapf/yapflib/__pycache__/split_penalty.cpython-39.pyc,, +yapf/yapflib/__pycache__/style.cpython-39.pyc,, +yapf/yapflib/__pycache__/subtype_assigner.cpython-39.pyc,, +yapf/yapflib/__pycache__/unwrapped_line.cpython-39.pyc,, +yapf/yapflib/__pycache__/verifier.cpython-39.pyc,, +yapf/yapflib/__pycache__/yapf_api.cpython-39.pyc,, +yapf/yapflib/blank_line_calculator.py,sha256=BIjdJNXN-jbYak17yM-GG1cTgntlRMxgfr7tm1w7ZC4,6297 +yapf/yapflib/comment_splicer.py,sha256=zZ3NQNgSACygyvc-zJb_wsdL1E_WcP-kwXYPHANGY4I,15240 +yapf/yapflib/continuation_splicer.py,sha256=5_Npzn98SLISqopH2hB3dSTBDVVs_iuCZBd-NJTNOKc,1776 +yapf/yapflib/errors.py,sha256=_fQDh4NEOXANkcm-Y7FobBI6g19szgqR38Hfy_Fmiqw,843 +yapf/yapflib/file_resources.py,sha256=RTMBisikbhupG-oYfr9YM4p2eXWO-NFCiidwia-UeDM,8570 +yapf/yapflib/format_decision_state.py,sha256=MM6qXrBNBUVizlmdIn36pEu7JmVdGTeSwh1IjvVEDEE,48673 +yapf/yapflib/format_token.py,sha256=KGCuDte6k11jBWXmB99o2DhNpvg0JKuedRlkdhDmQQI,12355 +yapf/yapflib/identify_container.py,sha256=ILh2GgBrcmQMvz0g9wPBzIQsOJG1KlmD_mAUR3SruHM,2279 +yapf/yapflib/line_joiner.py,sha256=jAc7Gt6sIbcbVy23y6fyD8l8jXMIyWmP4fWTSTThlew,3924 +yapf/yapflib/object_state.py,sha256=qO18NO2tpgJ9EegxD7DwccGy2PKFymg7lAyffMdY54E,8130 +yapf/yapflib/py3compat.py,sha256=nEKVr2KdYf-fXubA01E88ORixSy7AEUBKoZJOw6ZmfA,4228 +yapf/yapflib/pytree_unwrapper.py,sha256=6gODwJkN5j24jjl2UdhakaNbbm5tzeHRx3TVdH50Gzk,14899 +yapf/yapflib/pytree_utils.py,sha256=DvvGIOmN3C3PzvLqpeSEfaCtDq3075fcOTT22EKrc-Q,10864 +yapf/yapflib/pytree_visitor.py,sha256=qzH-34TqPA776YQIiVv63SfYRlOuxJiH2x3ynLxshmE,4528 +yapf/yapflib/reformatter.py,sha256=H3EaOpZ9YAd5q91cJGxMCW27gqdi78-OT5RMcbeHq9o,28773 +yapf/yapflib/split_penalty.py,sha256=cTqWMa0q_IBkM3q33upQyS2XqkLdcjoHdCaNqnPQGrA,24450 +yapf/yapflib/style.py,sha256=uXM1_0O6N_wpGqDEYbVca0Mp9ah-FTinJuMBnwCqFyY,31772 +yapf/yapflib/subtype_assigner.py,sha256=HlGVcJhmPj1r4DRSP8Nz0JHz-cLbgTCnZzPyW5YRiQE,20220 +yapf/yapflib/unwrapped_line.py,sha256=z9ug5YteMfYvBDp74w55wljXgGChcxykZ4Bt5u6hlpA,25819 +yapf/yapflib/verifier.py,sha256=qT5jlM1j96jeV7YwpdCczKX8vKm51I41TE1mkLX8dkk,3042 +yapf/yapflib/yapf_api.py,sha256=acHd6Mqglnz23VMwHuz2PaBfLn5aCaH0EZSqxowj01Y,10902 +yapftests/__init__.py,sha256=abBqhqqPP10jK6pNCEt5VDVZfYK0u0fQugTp2AC0K4k,596 +yapftests/__pycache__/__init__.cpython-39.pyc,, +yapftests/__pycache__/blank_line_calculator_test.cpython-39.pyc,, +yapftests/__pycache__/comment_splicer_test.cpython-39.pyc,, +yapftests/__pycache__/file_resources_test.cpython-39.pyc,, +yapftests/__pycache__/format_decision_state_test.cpython-39.pyc,, +yapftests/__pycache__/format_token_test.cpython-39.pyc,, +yapftests/__pycache__/line_joiner_test.cpython-39.pyc,, +yapftests/__pycache__/main_test.cpython-39.pyc,, +yapftests/__pycache__/pytree_unwrapper_test.cpython-39.pyc,, +yapftests/__pycache__/pytree_utils_test.cpython-39.pyc,, +yapftests/__pycache__/pytree_visitor_test.cpython-39.pyc,, +yapftests/__pycache__/reformatter_basic_test.cpython-39.pyc,, +yapftests/__pycache__/reformatter_buganizer_test.cpython-39.pyc,, +yapftests/__pycache__/reformatter_facebook_test.cpython-39.pyc,, +yapftests/__pycache__/reformatter_pep8_test.cpython-39.pyc,, +yapftests/__pycache__/reformatter_python3_test.cpython-39.pyc,, +yapftests/__pycache__/reformatter_style_config_test.cpython-39.pyc,, +yapftests/__pycache__/reformatter_verify_test.cpython-39.pyc,, +yapftests/__pycache__/split_penalty_test.cpython-39.pyc,, +yapftests/__pycache__/style_test.cpython-39.pyc,, +yapftests/__pycache__/subtype_assigner_test.cpython-39.pyc,, +yapftests/__pycache__/unwrapped_line_test.cpython-39.pyc,, +yapftests/__pycache__/utils.cpython-39.pyc,, +yapftests/__pycache__/yapf_test.cpython-39.pyc,, +yapftests/__pycache__/yapf_test_helper.cpython-39.pyc,, +yapftests/blank_line_calculator_test.py,sha256=gFd4ZB07U5vrjMKQokyGgKqQWrVD2Xy0VegYAJdXZ94,9157 +yapftests/comment_splicer_test.py,sha256=smvYTJaG99DLdK7nUcLZqCLuJxnzuqQUDmDfujGl3qg,11005 +yapftests/file_resources_test.py,sha256=PycS_nslonsWNHTaCMskA55ARgsA3M3kDTkqfyYGEfw,16831 +yapftests/format_decision_state_test.py,sha256=-TP1msflnJSN3tOX1tqXZCO_73OSm8xsbeu-z9AdDlA,4422 +yapftests/format_token_test.py,sha256=50pv1Gll3nHcPKqa-ycK9dNyrzWFvfZQPYCXt82Oz-g,2899 +yapftests/line_joiner_test.py,sha256=XPGvgP-yvbWGO7MoPZc1wsIhimV-o73MAireSHF_K_M,2616 +yapftests/main_test.py,sha256=XJdvrvhxJ7LfbeHobIWbByIo3DG12v0W9VpItMJbgl0,4174 +yapftests/pytree_unwrapper_test.py,sha256=nBfqDrSpbIzC0ukiecq6P-vXcY_AXQrIPRD_eZ-nHrQ,9368 +yapftests/pytree_utils_test.py,sha256=5NeI1iorER5zipo_CwIsm5FBWtWqeeOjalygUMNaWas,8140 +yapftests/pytree_visitor_test.py,sha256=ljVsmUmIDNGnOpbgoEOmYL6SV-KAIDZoNfiALbKhrP0,4068 +yapftests/reformatter_basic_test.py,sha256=j6E_gPKdjIS8DvTyKcyFD-O0QQt3W_jLLofJ89eRU7c,109414 +yapftests/reformatter_buganizer_test.py,sha256=_vKdQnTEaKwr0PTdi3tTz6i42DvQTQFh_YVa9kd9SHU,86368 +yapftests/reformatter_facebook_test.py,sha256=4G48CTQRLdBVieXSqhQs5U-6pNx0-C8Wjo2bMB5weDI,15205 +yapftests/reformatter_pep8_test.py,sha256=CM5M31rt6tZybbHYJ_j8_K1aZ02qXGUkNillMtch-nk,32620 +yapftests/reformatter_python3_test.py,sha256=PxBeDahwz9RCxLkxaPYvfrHwlBfWN9xsf0rO_WNBkH4,14355 +yapftests/reformatter_style_config_test.py,sha256=6qUvf0gQX29fNS55mIDREQGMjDPTeo_bxDTdmoicEX0,7219 +yapftests/reformatter_verify_test.py,sha256=GbyweTg98AOuV-H5sHdIMOo4q7JV4hJGul4lzsiKuJg,3579 +yapftests/split_penalty_test.py,sha256=oMFpOlCXFxdFUL54npVVkQa3-CfYy3EowQCDbyqhYJI,7417 +yapftests/style_test.py,sha256=I_-yqomVusqtkB3_NO3OiUngx5PAoVBr7maETEN0cgc,11568 +yapftests/subtype_assigner_test.py,sha256=Dab-QW39T-M4k7Nkzd6weztyVPV9PbnxdUrqVs3_oTI,11409 +yapftests/unwrapped_line_test.py,sha256=EVmXcgMRATc468iIWpv3kaW1DyCve-xYJvEeKOj82LE,3218 +yapftests/utils.py,sha256=kbrj8PEnvmrV7kJUEOaIrqOGapkpXWYEoCVEqW2iugM,2708 +yapftests/yapf_test.py,sha256=vSasOEGPHVWNDSwHAZKUhp8V9nkv-ZTPPOtkbJTqcCA,62012 +yapftests/yapf_test_helper.py,sha256=KdxSdP3NKZiqUSba_reXRmW79ECvllFvax3hn7ryCQ4,2825 diff --git a/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/REQUESTED b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/WHEEL b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/WHEEL new file mode 100644 index 00000000..8b701e93 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/entry_points.txt b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/entry_points.txt new file mode 100644 index 00000000..a08c5ad0 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/entry_points.txt @@ -0,0 +1,4 @@ +[console_scripts] +yapf = yapf:run_main +yapf-diff = yapf.third_party.yapf_diff.yapf_diff:main + diff --git a/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/top_level.txt b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/top_level.txt new file mode 100644 index 00000000..63289569 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf-0.31.0.dist-info/top_level.txt @@ -0,0 +1,2 @@ +yapf +yapftests diff --git a/.venv/lib/python3.9/site-packages/yapf/__init__.py b/.venv/lib/python3.9/site-packages/yapf/__init__.py new file mode 100644 index 00000000..a70db848 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/__init__.py @@ -0,0 +1,369 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""YAPF. + +YAPF uses the algorithm in clang-format to figure out the "best" formatting for +Python code. It looks at the program as a series of "unwrappable lines" --- +i.e., lines which, if there were no column limit, we would place all tokens on +that line. It then uses a priority queue to figure out what the best formatting +is --- i.e., the formatting with the least penalty. + +It differs from tools like autopep8 and pep8ify in that it doesn't just look for +violations of the style guide, but looks at the module as a whole, making +formatting decisions based on what's the best format for each line. + +If no filenames are specified, YAPF reads the code from stdin. +""" +from __future__ import print_function + +import argparse +import logging +import os +import sys + +from lib2to3.pgen2 import tokenize + +from yapf.yapflib import errors +from yapf.yapflib import file_resources +from yapf.yapflib import py3compat +from yapf.yapflib import style +from yapf.yapflib import yapf_api + +__version__ = '0.31.0' + + +def main(argv): + """Main program. + + Arguments: + argv: command-line arguments, such as sys.argv (including the program name + in argv[0]). + + Returns: + Zero on successful program termination, non-zero otherwise. + With --diff: zero if there were no changes, non-zero otherwise. + + Raises: + YapfError: if none of the supplied files were Python files. + """ + parser = _BuildParser() + args = parser.parse_args(argv[1:]) + if args.version: + print('yapf {}'.format(__version__)) + return 0 + + style_config = args.style + + if args.style_help: + _PrintHelp(args) + return 0 + + if args.lines and len(args.files) > 1: + parser.error('cannot use -l/--lines with more than one file') + + lines = _GetLines(args.lines) if args.lines is not None else None + if not args.files: + # No arguments specified. Read code from stdin. + if args.in_place or args.diff: + parser.error('cannot use --in-place or --diff flags when reading ' + 'from stdin') + + original_source = [] + while True: + if sys.stdin.closed: + break + try: + # Use 'raw_input' instead of 'sys.stdin.read', because otherwise the + # user will need to hit 'Ctrl-D' more than once if they're inputting + # the program by hand. 'raw_input' throws an EOFError exception if + # 'Ctrl-D' is pressed, which makes it easy to bail out of this loop. + original_source.append(py3compat.raw_input()) + except EOFError: + break + except KeyboardInterrupt: + return 1 + + if style_config is None and not args.no_local_style: + style_config = file_resources.GetDefaultStyleForDir(os.getcwd()) + + source = [line.rstrip() for line in original_source] + source[0] = py3compat.removeBOM(source[0]) + + try: + reformatted_source, _ = yapf_api.FormatCode( + py3compat.unicode('\n'.join(source) + '\n'), + filename='', + style_config=style_config, + lines=lines, + verify=args.verify) + except tokenize.TokenError as e: + raise errors.YapfError('%s:%s' % (e.args[1][0], e.args[0])) + + file_resources.WriteReformattedCode('', reformatted_source) + return 0 + + # Get additional exclude patterns from ignorefile + exclude_patterns_from_ignore_file = file_resources.GetExcludePatternsForDir( + os.getcwd()) + + files = file_resources.GetCommandLineFiles(args.files, args.recursive, + (args.exclude or []) + + exclude_patterns_from_ignore_file) + if not files: + raise errors.YapfError('Input filenames did not match any python files') + + changed = FormatFiles( + files, + lines, + style_config=args.style, + no_local_style=args.no_local_style, + in_place=args.in_place, + print_diff=args.diff, + verify=args.verify, + parallel=args.parallel, + quiet=args.quiet, + verbose=args.verbose) + return 1 if changed and (args.diff or args.quiet) else 0 + + +def _PrintHelp(args): + """Prints the help menu.""" + + if args.style is None and not args.no_local_style: + args.style = file_resources.GetDefaultStyleForDir(os.getcwd()) + style.SetGlobalStyle(style.CreateStyleFromConfig(args.style)) + print('[style]') + for option, docstring in sorted(style.Help().items()): + for line in docstring.splitlines(): + print('#', line and ' ' or '', line, sep='') + option_value = style.Get(option) + if isinstance(option_value, set) or isinstance(option_value, list): + option_value = ', '.join(map(str, option_value)) + print(option.lower(), '=', option_value, sep='') + print() + + +def FormatFiles(filenames, + lines, + style_config=None, + no_local_style=False, + in_place=False, + print_diff=False, + verify=False, + parallel=False, + quiet=False, + verbose=False): + """Format a list of files. + + Arguments: + filenames: (list of unicode) A list of files to reformat. + lines: (list of tuples of integers) A list of tuples of lines, [start, end], + that we want to format. The lines are 1-based indexed. This argument + overrides the 'args.lines'. It can be used by third-party code (e.g., + IDEs) when reformatting a snippet of code. + style_config: (string) Style name or file path. + no_local_style: (string) If style_config is None don't search for + directory-local style configuration. + in_place: (bool) Modify the files in place. + print_diff: (bool) Instead of returning the reformatted source, return a + diff that turns the formatted source into reformatter source. + verify: (bool) True if reformatted code should be verified for syntax. + parallel: (bool) True if should format multiple files in parallel. + quiet: (bool) True if should output nothing. + verbose: (bool) True if should print out filenames while processing. + + Returns: + True if the source code changed in any of the files being formatted. + """ + changed = False + if parallel: + import multiprocessing # pylint: disable=g-import-not-at-top + import concurrent.futures # pylint: disable=g-import-not-at-top + workers = min(multiprocessing.cpu_count(), len(filenames)) + with concurrent.futures.ProcessPoolExecutor(workers) as executor: + future_formats = [ + executor.submit(_FormatFile, filename, lines, style_config, + no_local_style, in_place, print_diff, verify, quiet, + verbose) for filename in filenames + ] + for future in concurrent.futures.as_completed(future_formats): + changed |= future.result() + else: + for filename in filenames: + changed |= _FormatFile(filename, lines, style_config, no_local_style, + in_place, print_diff, verify, quiet, verbose) + return changed + + +def _FormatFile(filename, + lines, + style_config=None, + no_local_style=False, + in_place=False, + print_diff=False, + verify=False, + quiet=False, + verbose=False): + """Format an individual file.""" + if verbose and not quiet: + print('Reformatting %s' % filename) + + if style_config is None and not no_local_style: + style_config = file_resources.GetDefaultStyleForDir( + os.path.dirname(filename)) + + try: + reformatted_code, encoding, has_change = yapf_api.FormatFile( + filename, + in_place=in_place, + style_config=style_config, + lines=lines, + print_diff=print_diff, + verify=verify, + logger=logging.warning) + except tokenize.TokenError as e: + raise errors.YapfError('%s:%s:%s' % (filename, e.args[1][0], e.args[0])) + except SyntaxError as e: + e.filename = filename + raise + + if not in_place and not quiet and reformatted_code: + file_resources.WriteReformattedCode(filename, reformatted_code, encoding, + in_place) + return has_change + + +def _GetLines(line_strings): + """Parses the start and end lines from a line string like 'start-end'. + + Arguments: + line_strings: (array of string) A list of strings representing a line + range like 'start-end'. + + Returns: + A list of tuples of the start and end line numbers. + + Raises: + ValueError: If the line string failed to parse or was an invalid line range. + """ + lines = [] + for line_string in line_strings: + # The 'list' here is needed by Python 3. + line = list(map(int, line_string.split('-', 1))) + if line[0] < 1: + raise errors.YapfError('invalid start of line range: %r' % line) + if line[0] > line[1]: + raise errors.YapfError('end comes before start in line range: %r' % line) + lines.append(tuple(line)) + return lines + + +def _BuildParser(): + """Constructs the parser for the command line arguments. + + Returns: + An ArgumentParser instance for the CLI. + """ + parser = argparse.ArgumentParser(description='Formatter for Python code.') + parser.add_argument( + '-v', + '--version', + action='store_true', + help='show version number and exit') + + diff_inplace_quiet_group = parser.add_mutually_exclusive_group() + diff_inplace_quiet_group.add_argument( + '-d', + '--diff', + action='store_true', + help='print the diff for the fixed source') + diff_inplace_quiet_group.add_argument( + '-i', + '--in-place', + action='store_true', + help='make changes to files in place') + diff_inplace_quiet_group.add_argument( + '-q', + '--quiet', + action='store_true', + help='output nothing and set return value') + + lines_recursive_group = parser.add_mutually_exclusive_group() + lines_recursive_group.add_argument( + '-r', + '--recursive', + action='store_true', + help='run recursively over directories') + lines_recursive_group.add_argument( + '-l', + '--lines', + metavar='START-END', + action='append', + default=None, + help='range of lines to reformat, one-based') + + parser.add_argument( + '-e', + '--exclude', + metavar='PATTERN', + action='append', + default=None, + help='patterns for files to exclude from formatting') + parser.add_argument( + '--style', + action='store', + help=('specify formatting style: either a style name (for example "pep8" ' + 'or "google"), or the name of a file with style settings. The ' + 'default is pep8 unless a %s or %s or %s file located in the same ' + 'directory as the source or one of its parent directories ' + '(for stdin, the current directory is used).' % + (style.LOCAL_STYLE, style.SETUP_CONFIG, style.PYPROJECT_TOML))) + parser.add_argument( + '--style-help', + action='store_true', + help=('show style settings and exit; this output can be ' + 'saved to .style.yapf to make your settings ' + 'permanent')) + parser.add_argument( + '--no-local-style', + action='store_true', + help="don't search for local style definition") + parser.add_argument('--verify', action='store_true', help=argparse.SUPPRESS) + parser.add_argument( + '-p', + '--parallel', + action='store_true', + help=('run yapf in parallel when formatting multiple files. Requires ' + 'concurrent.futures in Python 2.X')) + parser.add_argument( + '-vv', + '--verbose', + action='store_true', + help='print out file names while processing') + + parser.add_argument( + 'files', nargs='*', help='reads from stdin when no files are specified.') + return parser + + +def run_main(): # pylint: disable=invalid-name + try: + sys.exit(main(sys.argv)) + except errors.YapfError as e: + sys.stderr.write('yapf: ' + str(e) + '\n') + sys.exit(1) + + +if __name__ == '__main__': + run_main() diff --git a/.venv/lib/python3.9/site-packages/yapf/__main__.py b/.venv/lib/python3.9/site-packages/yapf/__main__.py new file mode 100644 index 00000000..f1d0e322 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/__main__.py @@ -0,0 +1,18 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Main entry point.""" +# pylint: disable=invalid-name +import yapf + +yapf.run_main() diff --git a/.venv/lib/python3.9/site-packages/yapf/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf43a840257c4c216fe506af24e51eded1b41f2a GIT binary patch literal 9680 zcmZ`<-ESLLcApuN!y!dcvMk%OlWZn(9Gi(q$w|6Rz20=a{z#lUvS4Y~8zx?M#5;SC+J`>OYx|G|ioO)+w%+ch zzjN-8qPz};nYnZ4ew=&m`S_i4J*o=C>N>) zE?X#1SEsq0L%CQjqMWbJh$&I{T&vECX;H-Un0P_ViesPa)j9E^m=niQIxgnL34EIu zC&ei|PlyF^8qbsNDRJh$A%Etc+}AK#YF#V6DoaDZ)m%?>4wpwt-eQ|zeUCTS~uDb&^Hin z#l9KY%^9pIcDY>6dlk2` zq$=#aZLhw)WP1%72vqFR%?~h9v(xg?sO3dVsI~WkPE*+JrccgjMwj-1>Gsesa6|umWbbq^ zBJq_OzUu`|C-MSXBQwViqb~Tk)$xS8WN%`(j_g4z5FLExE!f)*nrPE4d4ce84*Tjlj*j@+Q6t*#3!*j)w&Eh6q zN2rlVOcWo&NO*oF{|l&^R?_1lw#1KWjgDWZwXLGc;+^z*F3P4WWgtUpNK@6M8wMR& zcc~`V?!HwIT5Tu7ONN<&g4K1}jhfT;dge;yt&5eFx=vFiziB)RxUS*~-+^{S+P*f> z`}$Dtv)ccOaaudj2S(r6G2}{=5~*Q2${gtXI+QBCuA$x>q;Sv5_am!sOw{LOBg*5; z)V?nC`)S$0s0D$(I`zs4qod1SG)?7w-8Y0WNK@-4diZyE7Q?^5eMbJ6dzsX0OB-aO z*_~rMbMkKbn1U@ z_?js6b35mSej2`(L-Tejc=?22*|F?tk*kMVcWh_otXz6Kxl86>-hrTEtbswTx>; z%skEy3jM+pL%xmonI}fLLf`0}_(@chW}S~ASRXpj+r-*I>23Rp-0HMkKMF75#fDaF z?OuZIYPF#2WwJ?BrCKc6VF&sI1r57lg<9GdJip%TKtZ6$u-i=7=^sa%Ic&*?ufRas6_S+meml^Fp`6!`~%iRxXp> zx@2>M-!{YB@D*!cMUL2$hXb915v< zNaXy2^metEC4IL4XdvmeSFSt0A4Fu&?Q(Ou%q+zKM0hKJ34#sv!2%c?jMMw(Wb?A; zmzBGKDO0Po8%<{m-N{9ev0~>&)|#!<5z7Hvp`~%H;|k|-gOq9a3T!*H1MSa^2at-N zl1VdV7)h^PGGe2$5~pd?B>@n=J^grDcKqd*D?DfUzVyN0ce&|pF1Oj&zE%0X<Ba%^k zS765f!lm^VS`gC8gl_3#T&R7!<2A*aBY`u} zm7X=INXU)Ix5XJAFE*9mi>GQebf+)1n#^MSYF@2(+ikYvd~J<9()%b&+U7U~4;N=x zEaMEjqc~T4&y8*oevzlBNt#HFQ&3~_Ly)4_tT#cPh)tj!*B8>HW;yBXVY9%j*t&lE z2CGJV><`@TX5dJ1(}#}APCJq((O71v#|g}H&22cHX0%Su{zf3Lc``PFFgCZ`sJ`!mJAvmjFJ+3x&2JD`Vge)yb(|aPYMf@~ z&EEx1a__i`XOSyt!0H0%x&A4cD0j_?K(8MvlB&n?<*G7s#F!hT#aOUg?|{?0AjMVP z;weQRH;|_>w>(3)7jP?0^W?j+$-5}!*Xauh3-3gA2H0&2Myy#=ARso?vpOda=^TC2 zYq9QDUrDB|0VOcGH3DNbZ_9_VsL`g%S22E^t+QPdhl(nTRG((uK`HzUH?3&ubGoS) z^|WCcrf%Umujh>g-7*S#K9x2s-O!E9oL;~;)EIMm(J1P3hM}j?6W{Qc{#DVO)89dl zbSkZzU#3%NsT*G!D4FP!v_g-GzyCI;@ zo9d_Jj!3tgA_GK`5$5Bxu05!t?{pvI4boAupN?ksjqpcYn%y_#PegWjESigs_tX0Z zx3Pe6<_|Ps_0yv*JeKGp4*%xx-k z+dX5+eyV@7bb|HyP=Vw!m?9DLY4Rd&)#ADvz1IvjohGYO^~6_<3`=xu25rK+aZUtvauxoTBwSi8sQTKj)9g&R43h!#J@6)xbWrDpY62$ZES zK+MiSeCF{!uXC##bq;r_8Ggrb5#lAi5B~u-p%3!?to%!1Ah6X2Q~cBig~;en4O0hN zl{Y5SO;R<$KAy-}VU!zg(*@M}B zKFalH9~qC#N2y2pqx2)|QRY#0KgXl|xSxl7n9dDYEoDe-2N4P4Bp?g6(a%F+^ns(4 zOZJ6P?=q6Q&2cECkhquZcp@#I&By?nh<`%-GVEb9OUpT_gk_dv5rK@3O8_X zDM4`@=}`>p_$uONn_aOt5L|LM4yP`bRZ!;n!u`}0^ckTj%roQ1WGL8vDG>oGT{%z2 zyTU`9=jayz2=Of8C1G!N0gpT>03ak{V2;TyxRtHSh^(8}u463;8cHlbK_bTveGiU| zxlG*@V^|dvlmPxHQ7+l6O*Zk{2GAnj+pxads?SlUKhX>Ey$v9U{I6@VeY7?lcWPcdITN5V~Mhpp3Gwx9B53$F% z$4w|Wz#;9pWVk)T=Oa0RnXr{BT1r~j&X~>yL0-x%5KdRq@@^k?A~`w~I=HE1Fh!7p zU1MT4BoY^Z)01=aPKMi@5W!}14@TGEf7taS=hI|u35@!!!IHje%k386h6fo}3dQ_M zI;vq9gMHN)fP{nwf&aF_rtuO8t$kG&W;v&u#)=9dWVw+61u{Gk73o2blB1kfXWPqdm7TI@&i5U41 zFjB~kV+bNk&fxZsxI(HjQ^s!?K>Vin^5JaZ^8kM-AJ3@G9rHDwgU$e?NyMy`Mh8L) z+?GP980YHk4wSp&NAfJDiL;}x$JbQvHK^0|WD#+}3DLL(sexQ01adGD;&L2`4XZHemA6BCN03p>I;IbKz>qR5H!mOfl5q4##FQ*n-RK zSsXP?=h?yZ5j`UIB5J$dE!%}P` ze}`@qO2kv^Yz$T0LwYEG7q`;1k{G7+D@Ai0rBr7pOfO^};g#k3cw*{mew*}wV+r~D zGyyB^q2`i8{4=hQ$kXx=I0^$GbmOj=zIKwG$LTd2n3MZh9 zRQP#rTt>t5&jW7M9_ays$RWIkBc;O@eFQZQv0KszZm|v917n6Rz%4XD;)x|CuAV>Z z5x;Uc<{^}0A44$i$g*s|)7pd~Qi-^U#MgHTz_XNHvVm);_vFeO4&+u4(BwFmP|_Zy z=}EVM{gFN4)=V(DsHb}QP)m9*j~XdH!@nK2zGR=1y$i&4*kVA!P0~!_IFSyAc(f%l zF}ENu@6hH{F7Zl!1sLdPnDZ`8?rK<(%KiUsA1y zX4g0gGh0NwLYJiPb^0{=rBE2l^AbcWLMThp`&b`PfQzt&!VY1IECru^je-_R!{Li1 za`=)@zEBNL)KD`$QBxE%sF^*|o74T`7|z%-;&}1}2LN=|M(1pF#wN}@Hfc80zJSxX zm$>$86SXf3Tf7pbcQUw4Tv;;D7z^PJ_gci*XD8lY#rwI5_t!)QE43zS&Wj6ZQ$h`| z6EnXq-ayULL`_*##IjgXvp^d!_Sy(yp$(mSq|{O6QuzFa1QCKkxo9N{qgWyl;mKU` z6@Q$|X5E&MAIK5n-0@IXZ`~yE961L9t`IkS@?;S4`4nQ4I`W|u^7f4KZZB6ZC;2yo z(*Qtj4b-~57Xd=|2)j~dE>SI|Zl8J)VJe4Dh~hNm12B;2nJS6fJF5UBt&S3LWBM8% zqNW5JqJ!7Vm&ZBa-q&y#25zWywmJ!H~k^*bOa$$8KQAI8|6GfLMO+q>p_HyeRSMF?-udiN{q;{*lbIN2T z8jjsO3=)vvXr2m)0` zjM=5&F(ydbsk1r-tjLrSl^mW?f)iWjyb8rs$9-KI02xQNxZLKF?IItKr8-Gi#D$3+y#vxF*8PL@fLBA=#q zd~6^cIG;msE)VZK3Pp(&abbT+PC|-KM?2A_GZ?PrvqkEhoK<+xA?Od>$+$5cW%E)v z(YwU`68t=FgVWrQL+(|%C+nX(y{Xj*=YTJ6}pN*q&Sd8<4WP`v;Iz%81wOBhT(QlO7q%l}O z=iYnYCvoQKNlB7gl`WW%fTO`<1u+{`2re0h=h--eHX|_>Z&tq7OO6-npZ3 zA!iimtcHXFCu2!qsPeb^>pdtQoi;Pl;Js0#C5P0{98gzaP%=IxOIS-vh{y1PMTKr$ zypm*C*3_9o!4ZN^6gcY=zesN_1WI5^x5ny13GUjK3_5LfoG^9k_SGx5YU>*x-MU^a ztY6>w&RXs2?bRDM->VkaK3cnT`-AIOH))%;hyK{Ygy_Axdp{~^hvS4&b zK>ycJW9y@auAX2kffMk=o+L9q12A92AhV>KKS4n=30x+i^8ZW|`Rc>B%vY4ZsulHo zYFgu7>OGshXNtc<6qQTfer=lLQhIK3)=|A~fF8qPG82l@}Atxdf25N8bm zWZ@ta@QGOIeZ)9$w_U)`0rH4AVb*rcVOHokmq$Ey3ILZ*sFCAFUy)L0=7@jL`ZEpj z4?pRIS>RBwlwR$bB;1#5NhwnXT&0|(=s!-oa6z1Ym*1doURSUE}HX!(@7C|Qnd^n{N z=Y+fDD|EX;w?(>9EX+{{Lp9#4F}-A}LB*jAjw7Aex~%>Iz@gx_lGQzs{%ly}m)cjBWHS4tXJurjuJ8al)WDGK8pn9?R>& Qsa>yc&WIN$Xu(T<0Njg2>i_@% literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__init__.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/__init__.py new file mode 100644 index 00000000..e7522b2c --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1424018c4464fcaf5d7bf76f2facce73f37ce42a GIT binary patch literal 190 zcmYe~<>g`kf?4ZB5<{367#@Q-$bb>ZaRB0C79f$r5X_*-=(m!g2qcUkekJP{mFDT^ zrlw>j>Sq^a7MJ9wr4|+IyJQw;>jzY3l;r2>2PbFb=jZ6_m8IsD>E~o7=@(R%WaQ@= z>sjg-XO^Vu79=KTC#I(s>sKZgq=5;LqWJjCyv&mLc)fzkTO2mI`6;D2sdgaCKLarX E0E|g8u>b%7 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/blank_line_calculator.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/blank_line_calculator.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d41a26afeb725842254f3e8988d65fa64775c071 GIT binary patch literal 5529 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 a)Vf)>+@Bb48DDtct2^$+rsXcXFaHk}Se70D literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/continuation_splicer.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/continuation_splicer.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69fc9d467b725199bfddda1f9a246889a443da0d GIT binary patch literal 1424 zcmZ`(&ubhv6qYnUb~7E9CV?htp$PX7FC;V297;_H2?-RJvI+I}GNdfyktQqethALh zws+Y*IibxV_tKMn=pm>6KXdIVx1M?^6#6t{Y6sj|^muxD@9BM?-rIa*BSP@~`uiyV zGeqbQx4HNc*gS+~wm>kHA%+>L@Qh>xJKd|inV}k6O)n5=Em4r<;3uF*Q|gCU+%2tc2v7^kO`n<$B6B z6^5FLI^e9!WFgcgzHR7S^HLlo(X+a$DA;FI)t2UxLFklIVY`T~3{^T8p{Y8QPywa8 z^GX!_@r8=b)?nK?LAa2#tYzVFP<}L5+QR*N3pj;xW{TAnz<38Np#g5f`NH7>EiRRw z<#ue^ut)kuJ>$}vZ9qv|%D3rOmn#_pbptvAkgjA3frm;@sglXLv4bc|agMpo zME~O?f&F{%pqr3e*I}7oKv;le@jf{wdbmRS-id#TP6CEcvHk}3VQcF#a*A)FHFlo1 zzkkJ9nYY5sFG)#Q@CFERJ;wYsu@Rhpz(N+jBDa99C+LUdIazyaAL#Rs@j6%qnmM17 zc;&6g4YUeQp>J1&^}a-F@*``zwZFX6b*lk_|CdeI1&+~VNuEayjvA!h3l6--w~IM% zf`h!OdDC+V_>mpHYfm?tNEjiF&1J#0o2JbFmggmONZYDSSQ)Fuyota?TXQJv1Z>dy zQZ+%LYH77=k}Q7wbU4}>e*b8+^K{r;;SwHH=ax79Vj?Q0xokqX2WD;%Hohw~i(rVx zU8*bw|8aNDSrZ7!_z~oHq1n}on8z;kEpDRkc+t&+evAHAsjg)@<4ok~R10HO$+bzJ z2s2HeEhbjUbhnr&Riz2^=|Kv^okDv}l)RUGl^S9B-8sy5{(_ryk^B_6LG1P9#U?zRn z=JM0M05R;ET6)G@j;+|d{w*M5ZLXF$4nLDan?Kg59{7FcEA!Rz}!As8`0h4 ZZtk@9vi|+O0EBFUg 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 bhh^I1_W0NhI|mK^-@+Mt)Sk5q_V@n}Q5i7k literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/format_decision_state.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/format_decision_state.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2aceb3ab9419a5b54cb0d220b8ed28f6db2e7350 GIT binary patch literal 26596 zcmd6QYiu0Zm0neK^^?u!Lli|lMyk=g#Ic4N&)A+B#U2kuku$U@N-MTTGi{G+Tdbzk zO|qN3)s#l<=I&-SaT33v-8jy|>m-z87#;`kCL3d6%px2AFg8G7ED|rU8x$6X7cmUa z1~4|+`C$mQmG3*Zs`?>n{8$Hxh`x2}KF>Y(+;h)4_uNu>a4=`!-{=0ISib*H4C8Fzk$FrN`_~8)|$C)l`NC-1mcNOLgF^!cFC4_67ggyDe)BIsZz=`o;SR- zmwCdM5$S8M=PVhM_m}^(Wf=48 z8*7#IO1&2qEiG%nRD%T1?w1zGFmdiiq2cdlKjHY@%{ zdASmo_NQ{W+4Axgr`cGo)SasDY^cU^#rG?o)2LS*)Gj;C>U!lkqi6s{HyYJ?)2X8K zt_C#}&1(H}E`kKWsR}yxDpSt1b6J%)t~iYqRBrOO&3Ruv4wJD$6CrGhpp zgs|T5Do(YIAyvZ0Q1I=CKjjor_)29*ZD80HbTvAM@08M{U)ejk53Onpad~>oO<-EiMz+=zF=bzRqzYY1g?16pk||1b8~6 zza^62Npyp$T3$oLPUY2&hQe$*m#(8FOxk+G+ghtk<=(`KG$zd;uR(NWCit$2*A+^} z`=GzER&BZ=Vv&&ao7dMWh!nQ!*FaYr70=~VEwjPye+j%ihoAojf{IZxJ)>lKW+~xW zUIL5E_G~YSXVOb~X*^S2#>?WF4i|GKT+G>UG3Ua?Jm5`vd%UsNOf2)g-Z*Ludi%Ty zJPY1_?*N`d-a+pWp2OaK-eEjPyd$22=csqTcNEV(-UHr)c#e4wc@N{c*L%b}hUd69 z={<_)KJOjgaXcry$FS^A1bcSDa``VYK2rGdmQq+#;nK&N!Ah=sTxIpkAZpM}h$V+u zl1XE=U7C#e24|^KMw6NVL2*?~V72ZyD`jwo6$g}!l?e*;q`B!P*4Cvhu$Pmd2*+8e zD!=J!AWq6E)NxiNHAy}i2h*973d@bPt@XMtTHji~R8cItMLwjnz!&t|j|QuU!p<1e zHG2o@T&p~Sg&S5_yB_g2U`2OYue{pSR2O!PcMViHZcUh=U0r?y46W|2RjyXnbOnhL z&^lHckqr!0v2>129(O+U3V0?M%15_#<+a8&6wxDwHE+;O83^)g_?T}Q z3-$wI6zhJ2%dfwy8KkQU=!-ke&+akorK?|QIc_2B4FfN)10TT7E`4Hj<#lr11r)eP zpV4r39jmjlRbOs$Ym|=I6iCKzhP_uW*TLR(&n_n1<>1TMF&ZGpdC8Qy5YULxE_{=@ z>Qxs)(5V|Cl4OmsfsJaC(bNn8$XNXiaLpAiE#Zw7v<1e-s>@_u(Lcudo59b25kcFm z8EwNg+ZIBrZ6Zu~3~dRM9@A6JH1e$*)@9~oF0)2f!kp9_Xy$hYy~Hi%7CaklCRv8; zW6am9+@7ngijuYMIGq&Pk+^_?4M-W~6(VzEt-LH`)w{5r71daG9wF^M0_j08^hh^j zcqD9oT3y}}X-4yoXh9#l5V5TVG%+b$*A2A~kJ}q3AOW0MuXxq+ ziB-x;4KQ~9#ObQPdg9#mE6qmz#M1JWMq};7)YVG;>WQ`Lr4t+1AtTkFoO&hbLYjBFkwBw&^Qn#NLB_?#fc@P42k74)M_}YKW-9(Ggt6A4xw|Ec zsi^WYXDIpynYgn+K8cqmh`k2Fu7Uiw`AoD;H-V>(r!9FVmXA?O;yuatS_+HGbW@0@ zk(S0YgJ%X$EHD>RgJ-?QR=8&giFv4II!K9@~s6hfsLH{rg zBIDQa^Ept%Dwvt@FCRWfP5!m^-xJ%*q~GWt><_9BNkPhWE1RxcMhpH?1cseAb9XE&_fsoT_=#oberzRErhUgU!}K4u4(x_6 z-ORla#u;q`U8`0eYezkRR}IR8aZIRC76pK+S6sJ&EMKO;yjQ0z)
J}LZUmJTD* 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/format_token.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/format_token.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..893468c3579a64455355ec13c70d3e0ff5c698e8 GIT binary patch literal 12880 zcmbta%X1q?dY>6Q34%{iqAd9_mLC*snv^X&)@p69AqtXNra&$M`7!bC><~R90fIAd z&p+juTO-&UPeE#8|>(<&8MfrDnNPg0Ico$#q9spAeg{e$ytA;9mHABO1s+~Ga z8)=o=((TM)*2s!-2IZWQ6Xh(*c_XhXcDglT6mBal$MRn)EN@SKkur*Gf)&10j49Ml zvLfn>qJElbHKjDwYiu3++_rVcWwxguHT`|v{>HdDx(T}**>DXMixZ8CYYCB@Wl?~h46|=4szQG2SYDo<;zI$LhC`@#YuQuGn zj^*Q_C`XuGzuESvm**e1?FJ1>epEcXi?7!QuocirAsQJerWt9LGBPY}WLd_@v8<72 zIb(w5jRKo6CRqVgm^7wX(U@ja#tfS_X4#A}$7YRrHfNk+^Tq-@W1M9R#yNJ@SY+pn z^K8+0f}J-muqTX*?1J$myJ$Sco;03jPl0Mr2f12z$3O1ay@Rljq>*mzxLsctd-Xst zUBBJ7Eyrg1E_V<0j>SEqs=sgR4N!eWf6s1rJe}FT%@3Q7En0SL&rh7e3TEL%fo}xR zsFWf=T=Y$bK$bv`K%T$^0ph@KCJ7V?Oc9tSFhgLLz#M^j0%r&;5I9TV9Dzjw=LtMP z-~vFk^h}U9O~*R4O*1H%=Ap~FZ7LT{^V6=?4qI}j$=n92)78yt#hAWZEpLBpZf;e! z%k|CeVCKg9NJZJKe6+Ql=y7MXqIUO2ZEbsft8T7sZfsVKxk1H^?eg0DmAbKbvvR9^ zccX4@ZkyHeoytwKT&u0$t{VC&4Q6@!wz;uhs~g1+%G-FTjXc%r$(Qa5i`s**Ow#MAiI7tGbx?`&;U z#H14&`*4GMu83!)Fw|lF+>#QEytZA(t@TTXxyEgY$Z#KPy z)ve=w-*r}NjeXZ`uddv)oqMb8=FTbvd*5}guKaA(Yx?#p9jkF*?b+VyvDMiXfI3Ot zVhV9t=^S(7<7e>ot^wrLbULm6@INt2gCr#SP?>~f4PWndfIbxMJ%um#6{a1e`DK>! zmA=x~78RC0kKc>R7wUpiQ&rDQA5F0ld*|wiyJOF%o3Y=k$YpK%O0F%&z4_ zRq9r|x#t|(jt}La`_|45G(gi~s1WT!GnDyWm%4b@A>g|1fkd`WzJiTMcM3vAu2E?{X*HTzMSD2B-+zBk}P% zcB8r51if~SlY7wJ4pEj6D``gN*7`@4n>~o_1_b<-?e*L5)rF4yR-NFa2m|F?Rfj=I z5j9gmR#MlP6l+SV7!&dS2E5LfY49^m}Leto@M96jI$^&vh$)mhw>Bbf+)|Ue33mV%4gy^o?=f^ z4dz&g>z-kHSa&wAdzM`a>(0e>&#~vjy2ZHe1@>ZCcRsFLVwc0ZC*ryidnv5D5ZArT zmczP>!1WcjLQlq%D6g_BqWo0c_f_^<*!StU?kamdta}Dy-e7+w#^@-&$*zg=vvJ>_ zvFl;qOL5)L*;`@Vb8+3&aYi<0i6+w8u+E-67!qoHGGZ1Ejhk-AcCbo_fUUbbExQ482LB)CO;|h8k(NPa z$AzLLZXqPYMZ+l~ddR&ER1rw-AVYaQ*w z^$?oh1jFn$Kac;2(E-kp+yz=W6i|wwQ0urp`oV@WJ)D)uv!X+RgxhU8AdSF244GK#3BeD(FJ#w8TKXfXbk#SbLjbj$8cq{s*(>@NF#^1Mq zDUW75bnn4h-O#?=v8a<{{q zmT!lgV>u8s+d3GW2=59la%3;T8v?$dvA{%hi;hI_r#uz0&SBT{A3ITerr6VCXYyU& zYMX7_*&`Q;_9$v}StF(FggS(%VqPK6PNUr=H!|G*fDuJ=0&o32?ChS+Lt$gC?a{e4 z#RSq1Y&x(9Ry*dD*w@spLol5m@pilEn-FcQ?H`BIARh!%dL1;2xS!5a9N`JgNfR|F z2#r2ePT{+TulE%|U+pU<(iVX5vjGvR1E%)iW1DGF&WLiBX{gDu6kuM!36@5=AmC(Q zX%+b=K0F+jc}O$NI9bs$gO*wT8KBaddocfy=ACm2@|ns^h3(Du4ES$we7g}minZC=3%th#YBRmI3TmF&qkvdUMm(_6ylG|twx%4?OHd82}0t%3mc z&YeoNUOE$`DYar02G%l|9=2S@Y-9%_8xj;^HSQU618o^9Q)7Nm6=}aJPSMw>w~dSfaj$7oHq3h-K*?s+v42`toz}8|vs!NfiV@VS3w;|+(V!ej z^dYW{IrAMn_{sxtI@aKC0tDH%*msbEE-0n=FHmR9QkaAE zkm=Y*BFYM~`*w40-ybE&#YjOj^Tf&iEoSm4qoZgAwW!V`^eC#mr6esLGg|O#gQAk? zLm@W>OhS79fI>{8TZob=I({9JnOabMP(`$*AFARPGWkVnQMsS~^f$5xB4tpEYMcuw z(-@*R`Ylit9kzj%DgO5|QHgT;LFS=y6W;y(44deu7nKLuzL54-&ZKk6wMZjSDewIr zJ(Si&=b!qRk@}(~?@ad*+_&=m^qY!CdZd7pnzU|%5w`6;I6`DzrB#L~59p~&H$cRy zx-i#~3!3O7Ox;lvmT(6yP}lFkj)od>Feja~vlmWuQo)3W9b2t&0e-|0WE#eY_)_is zv@}69hs;F4aNV=pQD{%rE0Ljq4MU?GVC3)CDrUWWqbAsgzXC2X&aZ7&>+99KWy*V* zA`C}z?Bk6}Pz*)n!}Xi>_xLJ04+$li3u3?;z8<9<$rSvmcwg-)NtvYf?p& zRDJ{P&>h;!l|c1I#iZ~S`MH!!e&_e-_uu#`y{kz{C^Pn9>;rBI7jWgRw%f4U-a9Bn zqdCR%)lwlL#1zf*pAmQ)ASejkD1|oNg0CwTnGp4Sbaj&6wD*T15pN4iVF77LGh?#wx8?g7Zt1?u2;(U zUO<`-ah$l)Awvokx$p93kK(|#2na~ERmF*YtCsjJ5KAQ3gev&v5k93U{swA=3()cG zE^|$|Ft!65h)B|LgER0A4!dn!@!%P`H`10;tTGL9O@pk=CMLx1=d_IQ73hd?EkurK zX+ql3q6p97oKOlf$S}L(?+5wFu`&vcE*Em-xW**aMh~JvjtU#X2QilX_)*qdl+<}I zrbtajDE|heymtYJ`;egq9Q=}Vg532ZP0c^jw8EdX^tnfAEsZ(|DZ~?P=)VAgO>4d9 zl6-s0YD4Oi{2NlCf_2FcAlCKOmUa&s^=q{XXM;2rC-F6Aaph87uiiGpE0WsRs+6-h zw=eUZg-wJ6UabKqlP>H$T0l{I=aR?`x_p0p_^&X}Fh*+|o3$iH{MYC*O83dNHnI~E zq5nX8gwSFVp+uh{j0pKyxL?8pgJA)c5J9vMZ?sYmQ)FyVN^_lQj>b|DU(`UErK`P{ z6KheM=zjA+B7w+uapTCNtWb3y-f9-y6Vp*3gU*g+Xsgwz_yFwAc^~X?o6nD|W z>(s1C1CcuP_C~i1Czz6Krum=fD09o?+JSTC)lpYhb{yI?u|>RTy1w(n4da)z23)zn zP6=&&twyq>hcTdzdtT)42LXJTjikUu2C$Tr5iYinc%;;G%-*#i&Tx8($$~k=1yyt} zJIG*&>kT2fL19o~Ox3nF*6Sv?vAj|Lc2o8`0c}S*9?Oh?aXN=8qY@5*)M0C#*6CvC*-^GklLG7Vr{p;B|S=q9e==Gpdw@fF_U9L8RIRRioV?A9Ttt3U}_- za34uWHEth4L4=TEG7Suu+|H1y7<4vb^y6B=BA_y)O2k{0S1k~(alTzAJFDDL$ z(h-6s!xXdUc6q~Ifj|i(@ew8)hcTxHydDuMkW_Cz$w6|J?~UTsArwgoe18Om3K*m5 zI5kY2hM-h5LkN;`i`n``JWz;5iY;PmQe;f+D*Te4X=V4wn;{Boy(<;*ZU?=(07qYH zDY~je35ht4I|@KIjR;pUxgnZ-RTe*rjzdQED(5z~_Q8LB;If_0-}XGZ$Bx*O9F)`9a~hb- zvEpQ2OW=KB1n)$*AB1&Mh9HDq1L-=SG;jjR(qoaFCnTehSi zCTUBPoj@|?1A3)O+A&{iAvQzqLO8w1o1rC0lfLEDJD`_%C@(yYMMbLNW{iP0?0SP} zVSeCrJfcvbrTW?ci0PfL}Z`CP8%^ssS{)gyPQBKJ|1#~lgHyO;3-{%`H*O31_Y9)l&06H zIAx;8ktoQ448#z>Odxe;giJq$VK^O?#3Wn2d*?=Fdn_6tp()+g4`M{L-q}$^#Opez z6X)@~n?$8n-$u}ODk?IjHy(qE>~R8>m}$sEr*m>=0o4Z@W$DRnvB=S^(+iQ|+X9jN zi%Zows}R)4~)%J9Wkx}<=D{!D*FO(s_gCu44R2g}lZutb1f z4~_7^)jmIvDOmV#sY{nG^-@bqOVDfd8my3=AWvJMdxddl!#_a3U&p6X7)}C$g<`sd zS(y{(gRxQ<)BB?0e2{H#A=@yJpp;leh>=kg=@zfK1J8AD97e+5!mFW@qOBOU)Cqqp z?sNjDm}eG%6TP?Bg2VfT=FUsZh-<2(W6UrzPX)Ps%R`*YrL6x2hK<8bgy?PprBU^l zOm3aPDt5{VD?zDwU+^)?DG_aI)t>&`%1fW@bdEtD|N1B1OP5*Gv%mm-+`;0f^!C?j zVF?0_+d)QL4W6zd=V*&!s>nL{ggiODidIAds`u20J{a!()3!i%ZR{5K?@pm_AQ7g4 z5yHpciEy&_k3;x*L35rsQQbI70ikBWMrh z*2na(B0$0rMP^Vg^Jl4iiNJFNo+t1w03|WWZ}g9Oh3d8l{F1;Y1WW?IA;1Wb90U_> z-ZdMP!QuN*D`0znUasx|J>V^+Q^CBsi~kwlajN1`DAmVAT$9Wuopsg868 Sd19>y0mh$}P0e1)&;LK`G7>%j literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/identify_container.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/identify_container.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea6948a45edcb3a91a681574b6689d0839caa039 GIT binary patch literal 1827 zcmbtUTWcFf6rR~#tv0G;oWw1pgfN9dBdE2|yriZSr%7*MR1=#%ER@Z9XJk#Z+F8$z z)JoV;aQ;O5l=jU}{XhGfhvL7`m-L)jS(WMp3SF49XKv^6o$pN2>9h!Zzy5KU{237P z3MZ?d2a{bGK5xDtyeZu0jdM5hd2m3w zH|DRtmY|p{mTE2Vc zz}*H6AFVHKz&mjAEWfwhL)+HI>IwAF_4}6?wnp|>-roMBrJ)z(Z~Z8m1iueV}1K8H?!VfiU0Iz5GSp%2DSlsY|mbk^!E&a4WAA*`V@}x>ch# zi7c~J)9}oZs$;1c8;v;Yk6@|13xd!VZ95y(qg&K-w&*5ko38`cqwl?*fAEG%_SWpY zy+k?KMnL{giT-mr_AK0uzQ(uR!mZyyt&O6CViU!`AZgX9Bu0%N!nS>j*72y(nBRLl z4tTlW^{XI`b0}6ESFJd%-*V8~aeOjKvc*m_j)C=Ytnty)@2*E=W5Y_>Ci)QLLAnP} zmEfjb>qCRxfu*R8{oX?X{chQ!EzPinqt5>95Z)e}n$q^-O5RH^Rq$CI<>wpd3LSev Jo3`Dc^*1nO<8=T4 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/line_joiner.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/line_joiner.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ba6f74d268142873d763822aa24d178a8806aef GIT binary patch literal 2701 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/pytree_unwrapper.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/pytree_unwrapper.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b266ca7dd1e9995acdbaa68ec6720ac0d9482052 GIT binary patch literal 12902 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/pytree_utils.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/pytree_utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b53d6a806d1e25ad68d6eeaa2a614a4a196f1d5f GIT binary patch literal 9348 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 I*S5C*2b$PJ^8f$< literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/reformatter.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/reformatter.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a722ddd44957e37f110a531b6637b183dae90cb GIT binary patch literal 18388 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 K$LL>IO!+@t{^!mB literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/subtype_assigner.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/subtype_assigner.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..211cf5045841f7aaf4a2b661babb5c1a9a4728d8 GIT binary patch literal 14166 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/unwrapped_line.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/unwrapped_line.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a303a33c8d3a5b475612c9ba221433006bf8508a GIT binary patch literal 13922 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/verifier.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/verifier.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25cb5a32557888f93d59e2bc0d9c9fdd3e5c06cf GIT binary patch literal 2395 zcmZuyPj4GV6rWkI?e)e<)3kN}sH&DAp}3_s0*OLZRYCm&JrGqifUt^IlbvxqWIel` z87J{-eIez-0delhxga4S@fr9E960O|PVIpYkPEz-bsCqlt9>)`-kbN{%>LecWO30) z@I3oYvg$#l zSEE&0dy0B>TBjb29(5j}b|d@y3nqDg9OwbjKv=NN1d~KF8bk?Y0aw8;iFvu|`2OYq zIGXG*6_6n2f(1#x)Fgrit0Iv@P|uiJ4Y=+E4?3*#Hp~JoiBNrz!fx=Q1W!|@eJ*qo zsAS0WfQ#)iiUBEg(nK?%If(<%iIQQ;V+Iif@RUK{fdJRqH?6@T;UegdM5K8l0=Azf z(wt$-oD3o!CUj(WKZn~x8nVwL$Tm~mF-iND7$qAnXR?!yr33CRo5LH7dDz946PY_XevHZze0ShezW~WD zYozhi$0eOBt~hW4imV5@o&c6^J!Lc)0m%~M)~|5wj``!C8Rd-XRN zoU5_W1n?7)I35Gwq-2q{fcr>pkA{FnbuUPQ6Ta8XCq4Zlwny75+(fxCNuU z2$EL-R|SSKVgVP!2{oGH98Do9Er6UuG(oVo(3=4GCXRMo?N8>!5rrfb-!~i0)#0(5B9V-ZO|$}+L2j~Xzd2@#0$%XInF#z-mcM2B%QOBJdirG?NZhxwm6_~)dZzRuI+lNS#^0dlX8e}rw`P1w z&zF4g1@{06b0O<|3MD>JBgx8|Y-+ao$H#@+bvlSn_1R?Z<6Pr~n$6)KyOO6jfW~rW2Sy?Mtd7ndxkH^OM z5^OtB@w4SM$@EBye9T!)jmF|DzOt3ID1mMzMl9cwjO-YdWqSv6XUOU)B(Db1TYZ@f zgD~umz$$cxfDcW}3alKsWh3+3i_+9xdCHKpK#HnLW3Gz^6Ht;&qXv#mU0-P;wKA7o zxZfmP6pjQT^rC1WSIqu1hMWe{uF4D6mTBOsz`StHtmna@|1Xv0IncfVpIQfkoU^VE zZDJXFcnQ~V%V}cYW^)s`t$$p{!%b%ycs|I@XWrwv=U8j)hOB|9GB8sfq$v;futnpZ p{X@{mZT+#;!ETzXFt$h9GUMGUJL+w7QOXe4^B^>ME6Y`{^)EPqimU(t literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/yapf_api.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapf/yapflib/__pycache__/yapf_api.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2d7e9c3f7ec719d4ecbb5b144f7b991830bb4be GIT binary patch literal 9332 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 style.Get('CONTINUATION_INDENT_WIDTH') + + opening = _GetOpeningBracket(current) + if opening: + return not self._ContainerFitsOnStartLine(opening) + + if (current.value not in '{)' and previous.value == '(' and + self._ArgumentListHasDictionaryEntry(current)): + return True + + if style.Get('SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED'): + # Split before arguments in a function call or definition if the + # arguments are terminated by a comma. + opening = _GetOpeningBracket(current) + if opening and opening.previous_token and opening.previous_token.is_name: + if previous.value in '(,': + if opening.matching_bracket.previous_token.value == ',': + return True + + if ((current.is_name or current.value in {'*', '**'}) and + previous.value == ','): + # If we have a function call within an argument list and it won't fit on + # the remaining line, but it will fit on a line by itself, then go ahead + # and split before the call. + opening = _GetOpeningBracket(current) + if (opening and opening.value == '(' and opening.previous_token and + (opening.previous_token.is_name or + opening.previous_token.value in {'*', '**'})): + is_func_call = False + opening = current + while opening: + if opening.value == '(': + is_func_call = True + break + if (not (opening.is_name or opening.value in {'*', '**'}) and + opening.value != '.'): + break + opening = opening.next_token + + if is_func_call: + if (not self._FitsOnLine(current, opening.matching_bracket) or + (opening.matching_bracket.next_token and + opening.matching_bracket.next_token.value != ',' and + not opening.matching_bracket.next_token.ClosesScope())): + return True + + pprevious = previous.previous_token + + # A function call with a dictionary as its first argument may result in + # unreadable formatting if the dictionary spans multiple lines. The + # dictionary itself is formatted just fine, but the remaning arguments are + # indented too far: + # + # function_call({ + # KEY_1: 'value one', + # KEY_2: 'value two', + # }, + # default=False) + if (current.value == '{' and previous.value == '(' and pprevious and + pprevious.is_name): + dict_end = current.matching_bracket + next_token = dict_end.next_token + if next_token.value == ',' and not self._FitsOnLine(current, dict_end): + return True + + if (current.is_name and pprevious and pprevious.is_name and + previous.value == '('): + + if (not self._FitsOnLine(previous, previous.matching_bracket) and + _IsFunctionCallWithArguments(current)): + # There is a function call, with more than 1 argument, where the first + # argument is itself a function call with arguments that does not fit + # into the line. In this specific case, if we split after the first + # argument's opening '(', then the formatting will look bad for the + # rest of the arguments. E.g.: + # + # outer_function_call(inner_function_call( + # inner_arg1, inner_arg2), + # outer_arg1, outer_arg2) + # + # Instead, enforce a split before that argument to keep things looking + # good. + if (style.Get('SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN') or + style.Get('SPLIT_BEFORE_FIRST_ARGUMENT')): + return True + + opening = _GetOpeningBracket(current) + if (opening and opening.value == '(' and opening.previous_token and + (opening.previous_token.is_name or + opening.previous_token.value in {'*', '**'})): + is_func_call = False + opening = current + while opening: + if opening.value == '(': + is_func_call = True + break + if (not (opening.is_name or opening.value in {'*', '**'}) and + opening.value != '.'): + break + opening = opening.next_token + + if is_func_call: + if (not self._FitsOnLine(current, opening.matching_bracket) or + (opening.matching_bracket.next_token and + opening.matching_bracket.next_token.value != ',' and + not opening.matching_bracket.next_token.ClosesScope())): + return True + + if (previous.OpensScope() and not current.OpensScope() and + not current.is_comment and + format_token.Subtype.SUBSCRIPT_BRACKET not in previous.subtypes): + if pprevious and not pprevious.is_keyword and not pprevious.is_name: + # We want to split if there's a comment in the container. + token = current + while token != previous.matching_bracket: + if token.is_comment: + return True + token = token.next_token + if previous.value == '(': + pptoken = previous.previous_token + if not pptoken or not pptoken.is_name: + # Split after the opening of a tuple if it doesn't fit on the current + # line and it's not a function call. + if self._FitsOnLine(previous, previous.matching_bracket): + return False + elif not self._FitsOnLine(previous, previous.matching_bracket): + if len(previous.container_elements) == 1: + return False + + elements = previous.container_elements + [previous.matching_bracket] + i = 1 + while i < len(elements): + if (not elements[i - 1].OpensScope() and + not self._FitsOnLine(elements[i - 1], elements[i])): + return True + i += 1 + + if (self.column_limit - self.column) / float(self.column_limit) < 0.3: + # Try not to squish all of the arguments off to the right. + return True + else: + # Split after the opening of a container if it doesn't fit on the + # current line. + if not self._FitsOnLine(previous, previous.matching_bracket): + return True + + ########################################################################### + # Original Formatting Splitting + # These checks rely upon the original formatting. This is in order to + # attempt to keep hand-written code in the same condition as it was before. + # However, this may cause the formatter to fail to be idempotent. + if (style.Get('SPLIT_BEFORE_BITWISE_OPERATOR') and current.value in '&|' and + previous.lineno < current.lineno): + # Retain the split before a bitwise operator. + return True + + if (current.is_comment and + previous.lineno < current.lineno - current.value.count('\n')): + # If a comment comes in the middle of an unwrapped line (like an if + # conditional with comments interspersed), then we want to split if the + # original comments were on a separate line. + return True + + return False + + def AddTokenToState(self, newline, dry_run, must_split=False): + """Add a token to the format decision state. + + Allow the heuristic to try out adding the token with and without a newline. + Later on, the algorithm will determine which one has the lowest penalty. + + Arguments: + newline: (bool) Add the token on a new line if True. + dry_run: (bool) Don't commit whitespace changes to the FormatToken if + True. + must_split: (bool) A newline was required before this token. + + Returns: + The penalty of splitting after the current token. + """ + self._PushParameterListState(newline) + + penalty = 0 + if newline: + penalty = self._AddTokenOnNewline(dry_run, must_split) + else: + self._AddTokenOnCurrentLine(dry_run) + + penalty += self._CalculateComprehensionState(newline) + penalty += self._CalculateParameterListState(newline) + + return self.MoveStateToNextToken() + penalty + + def _AddTokenOnCurrentLine(self, dry_run): + """Puts the token on the current line. + + Appends the next token to the state and updates information necessary for + indentation. + + Arguments: + dry_run: (bool) Commit whitespace changes to the FormatToken if True. + """ + current = self.next_token + previous = current.previous_token + + spaces = current.spaces_required_before + if isinstance(spaces, list): + # Don't set the value here, as we need to look at the lines near + # this one to determine the actual horizontal alignment value. + spaces = 0 + + if not dry_run: + current.AddWhitespacePrefix(newlines_before=0, spaces=spaces) + + if previous.OpensScope(): + if not current.is_comment: + # Align closing scopes that are on a newline with the opening scope: + # + # foo = [a, + # b, + # ] + self.stack[-1].closing_scope_indent = self.column - 1 + if style.Get('ALIGN_CLOSING_BRACKET_WITH_VISUAL_INDENT'): + self.stack[-1].closing_scope_indent += 1 + self.stack[-1].indent = self.column + spaces + else: + self.stack[-1].closing_scope_indent = ( + self.stack[-1].indent - style.Get('CONTINUATION_INDENT_WIDTH')) + + self.column += spaces + + def _AddTokenOnNewline(self, dry_run, must_split): + """Adds a line break and necessary indentation. + + Appends the next token to the state and updates information necessary for + indentation. + + Arguments: + dry_run: (bool) Don't commit whitespace changes to the FormatToken if + True. + must_split: (bool) A newline was required before this token. + + Returns: + The split penalty for splitting after the current state. + """ + current = self.next_token + previous = current.previous_token + + self.column = self._GetNewlineColumn() + + if not dry_run: + indent_level = self.line.depth + spaces = self.column + if spaces: + spaces -= indent_level * style.Get('INDENT_WIDTH') + current.AddWhitespacePrefix( + newlines_before=1, spaces=spaces, indent_level=indent_level) + + if not current.is_comment: + self.stack[-1].last_space = self.column + self.lowest_level_on_line = self.paren_level + + if (previous.OpensScope() or + (previous.is_comment and previous.previous_token is not None and + previous.previous_token.OpensScope())): + dedent = (style.Get('CONTINUATION_INDENT_WIDTH'), + 0)[style.Get('INDENT_CLOSING_BRACKETS')] + self.stack[-1].closing_scope_indent = ( + max(0, self.stack[-1].indent - dedent)) + self.stack[-1].split_before_closing_bracket = True + + # Calculate the split penalty. + penalty = current.split_penalty + + if must_split: + # Don't penalize for a must split. + return penalty + + if previous.is_pseudo_paren and previous.value == '(': + # Small penalty for splitting after a pseudo paren. + penalty += 50 + + # Add a penalty for each increasing newline we add, but don't penalize for + # splitting before an if-expression or list comprehension. + if current.value not in {'if', 'for'}: + last = self.stack[-1] + last.num_line_splits += 1 + penalty += ( + style.Get('SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT') * + last.num_line_splits) + + if current.OpensScope() and previous.OpensScope(): + # Prefer to keep opening brackets coalesced (unless it's at the beginning + # of a function call). + pprev = previous.previous_token + if not pprev or not pprev.is_name: + penalty += 10 + + return penalty + 10 + + def MoveStateToNextToken(self): + """Calculate format decision state information and move onto the next token. + + Before moving onto the next token, we first calculate the format decision + state given the current token and its formatting decisions. Then the format + decision state is set up so that the next token can be added. + + Returns: + The penalty for the number of characters over the column limit. + """ + current = self.next_token + if not current.OpensScope() and not current.ClosesScope(): + self.lowest_level_on_line = min(self.lowest_level_on_line, + self.paren_level) + + # If we encounter an opening bracket, we add a level to our stack to prepare + # for the subsequent tokens. + if current.OpensScope(): + last = self.stack[-1] + new_indent = style.Get('CONTINUATION_INDENT_WIDTH') + last.last_space + + self.stack.append(_ParenState(new_indent, self.stack[-1].last_space)) + self.paren_level += 1 + + # If we encounter a closing bracket, we can remove a level from our + # parenthesis stack. + if len(self.stack) > 1 and current.ClosesScope(): + if format_token.Subtype.DICTIONARY_KEY_PART in current.subtypes: + self.stack[-2].last_space = self.stack[-2].indent + else: + self.stack[-2].last_space = self.stack[-1].last_space + self.stack.pop() + self.paren_level -= 1 + + is_multiline_string = current.is_string and '\n' in current.value + if is_multiline_string: + # This is a multiline string. Only look at the first line. + self.column += len(current.value.split('\n')[0]) + elif not current.is_pseudo_paren: + self.column += len(current.value) + + self.next_token = self.next_token.next_token + + # Calculate the penalty for overflowing the column limit. + penalty = 0 + if (not current.is_pylint_comment and not current.is_pytype_comment and + not current.is_copybara_comment and self.column > self.column_limit): + excess_characters = self.column - self.column_limit + penalty += style.Get('SPLIT_PENALTY_EXCESS_CHARACTER') * excess_characters + + if is_multiline_string: + # If this is a multiline string, the column is actually the + # end of the last line in the string. + self.column = len(current.value.split('\n')[-1]) + + return penalty + + def _CalculateComprehensionState(self, newline): + """Makes required changes to comprehension state. + + Args: + newline: Whether the current token is to be added on a newline. + + Returns: + The penalty for the token-newline combination given the current + comprehension state. + """ + current = self.next_token + previous = current.previous_token + top_of_stack = self.comp_stack[-1] if self.comp_stack else None + penalty = 0 + + if top_of_stack is not None: + # Check if the token terminates the current comprehension. + if current == top_of_stack.closing_bracket: + last = self.comp_stack.pop() + # Lightly penalize comprehensions that are split across multiple lines. + if last.has_interior_split: + penalty += style.Get('SPLIT_PENALTY_COMPREHENSION') + + return penalty + + if newline: + top_of_stack.has_interior_split = True + + if (format_token.Subtype.COMP_EXPR in current.subtypes and + format_token.Subtype.COMP_EXPR not in previous.subtypes): + self.comp_stack.append(object_state.ComprehensionState(current)) + return penalty + + if (current.value == 'for' and + format_token.Subtype.COMP_FOR in current.subtypes): + if top_of_stack.for_token is not None: + # Treat nested comprehensions like normal comp_if expressions. + # Example: + # my_comp = [ + # a.qux + b.qux + # for a in foo + # --> for b in bar <-- + # if a.zut + b.zut + # ] + if (style.Get('SPLIT_COMPLEX_COMPREHENSION') and + top_of_stack.has_split_at_for != newline and + (top_of_stack.has_split_at_for or + not top_of_stack.HasTrivialExpr())): + penalty += split_penalty.UNBREAKABLE + else: + top_of_stack.for_token = current + top_of_stack.has_split_at_for = newline + + # Try to keep trivial expressions on the same line as the comp_for. + if (style.Get('SPLIT_COMPLEX_COMPREHENSION') and newline and + top_of_stack.HasTrivialExpr()): + penalty += split_penalty.CONNECTED + + if (format_token.Subtype.COMP_IF in current.subtypes and + format_token.Subtype.COMP_IF not in previous.subtypes): + # Penalize breaking at comp_if when it doesn't match the newline structure + # in the rest of the comprehension. + if (style.Get('SPLIT_COMPLEX_COMPREHENSION') and + top_of_stack.has_split_at_for != newline and + (top_of_stack.has_split_at_for or not top_of_stack.HasTrivialExpr())): + penalty += split_penalty.UNBREAKABLE + + return penalty + + def _PushParameterListState(self, newline): + """Push a new parameter list state for a function definition. + + Args: + newline: Whether the current token is to be added on a newline. + """ + current = self.next_token + previous = current.previous_token + + if _IsFunctionDefinition(previous): + first_param_column = previous.total_length + self.stack[-2].indent + self.param_list_stack.append( + object_state.ParameterListState(previous, newline, + first_param_column)) + + def _CalculateParameterListState(self, newline): + """Makes required changes to parameter list state. + + Args: + newline: Whether the current token is to be added on a newline. + + Returns: + The penalty for the token-newline combination given the current + parameter state. + """ + current = self.next_token + previous = current.previous_token + penalty = 0 + + if _IsFunctionDefinition(previous): + first_param_column = previous.total_length + self.stack[-2].indent + if not newline: + param_list = self.param_list_stack[-1] + if param_list.parameters and param_list.has_typed_return: + last_param = param_list.parameters[-1].first_token + last_token = _LastTokenInLine(previous.matching_bracket) + total_length = last_token.total_length + total_length -= last_param.total_length - len(last_param.value) + if total_length + self.column > self.column_limit: + # If we need to split before the trailing code of a function + # definition with return types, then also split before the opening + # parameter so that the trailing bit isn't indented on a line by + # itself: + # + # def rrrrrrrrrrrrrrrrrrrrrr(ccccccccccccccccccccccc: Tuple[Text] + # ) -> List[Tuple[Text, Text]]: + # pass + penalty += split_penalty.VERY_STRONGLY_CONNECTED + return penalty + + if first_param_column <= self.column: + # Make sure we don't split after the opening bracket if the + # continuation indent is greater than the opening bracket: + # + # a( + # b=1, + # c=2) + penalty += split_penalty.VERY_STRONGLY_CONNECTED + return penalty + + if not self.param_list_stack: + return penalty + + param_list = self.param_list_stack[-1] + if current == self.param_list_stack[-1].closing_bracket: + self.param_list_stack.pop() # We're done with this state. + if newline and param_list.has_typed_return: + if param_list.split_before_closing_bracket: + penalty -= split_penalty.STRONGLY_CONNECTED + elif param_list.LastParamFitsOnLine(self.column): + penalty += split_penalty.STRONGLY_CONNECTED + + if (not newline and param_list.has_typed_return and + param_list.has_split_before_first_param): + # Prefer splitting before the closing bracket if there's a return type + # and we've already split before the first parameter. + penalty += split_penalty.STRONGLY_CONNECTED + + return penalty + + if not param_list.parameters: + return penalty + + if newline: + if self._FitsOnLine(param_list.parameters[0].first_token, + _LastTokenInLine(param_list.closing_bracket)): + penalty += split_penalty.STRONGLY_CONNECTED + + if (not newline and style.Get('SPLIT_BEFORE_NAMED_ASSIGNS') and + param_list.has_default_values and + current != param_list.parameters[0].first_token and + current != param_list.closing_bracket and + format_token.Subtype.PARAMETER_START in current.subtypes): + # If we want to split before parameters when there are named assigns, + # then add a penalty for not splitting. + penalty += split_penalty.STRONGLY_CONNECTED + + return penalty + + def _IndentWithContinuationAlignStyle(self, column): + if column == 0: + return column + align_style = style.Get('CONTINUATION_ALIGN_STYLE') + if align_style == 'FIXED': + return ((self.line.depth * style.Get('INDENT_WIDTH')) + + style.Get('CONTINUATION_INDENT_WIDTH')) + if align_style == 'VALIGN-RIGHT': + indent_width = style.Get('INDENT_WIDTH') + return indent_width * int((column + indent_width - 1) / indent_width) + return column + + def _GetNewlineColumn(self): + """Return the new column on the newline.""" + current = self.next_token + previous = current.previous_token + top_of_stack = self.stack[-1] + + if isinstance(current.spaces_required_before, list): + # Don't set the value here, as we need to look at the lines near + # this one to determine the actual horizontal alignment value. + return 0 + elif current.spaces_required_before > 2 or self.line.disable: + return current.spaces_required_before + + cont_aligned_indent = self._IndentWithContinuationAlignStyle( + top_of_stack.indent) + + if current.OpensScope(): + return cont_aligned_indent if self.paren_level else self.first_indent + + if current.ClosesScope(): + if (previous.OpensScope() or + (previous.is_comment and previous.previous_token is not None and + previous.previous_token.OpensScope())): + return max(0, + top_of_stack.indent - style.Get('CONTINUATION_INDENT_WIDTH')) + return top_of_stack.closing_scope_indent + + if (previous and previous.is_string and current.is_string and + format_token.Subtype.DICTIONARY_VALUE in current.subtypes): + return previous.column + + if style.Get('INDENT_DICTIONARY_VALUE'): + if previous and (previous.value == ':' or previous.is_pseudo_paren): + if format_token.Subtype.DICTIONARY_VALUE in current.subtypes: + return top_of_stack.indent + + if (not self.param_list_stack and _IsCompoundStatement(self.line.first) and + (not (style.Get('DEDENT_CLOSING_BRACKETS') or + style.Get('INDENT_CLOSING_BRACKETS')) or + style.Get('SPLIT_BEFORE_FIRST_ARGUMENT'))): + token_indent = ( + len(self.line.first.whitespace_prefix.split('\n')[-1]) + + style.Get('INDENT_WIDTH')) + if token_indent == top_of_stack.indent: + return token_indent + style.Get('CONTINUATION_INDENT_WIDTH') + + if (self.param_list_stack and + not self.param_list_stack[-1].SplitBeforeClosingBracket( + top_of_stack.indent) and top_of_stack.indent + == ((self.line.depth + 1) * style.Get('INDENT_WIDTH'))): + if (format_token.Subtype.PARAMETER_START in current.subtypes or + (previous.is_comment and + format_token.Subtype.PARAMETER_START in previous.subtypes)): + return top_of_stack.indent + style.Get('CONTINUATION_INDENT_WIDTH') + + return cont_aligned_indent + + def _FitsOnLine(self, start, end): + """Determines if line between start and end can fit on the current line.""" + length = end.total_length - start.total_length + if not start.is_pseudo_paren: + length += len(start.value) + return length + self.column <= self.column_limit + + def _EachDictEntryFitsOnOneLine(self, opening): + """Determine if each dict elems can fit on one line.""" + + def PreviousNonCommentToken(tok): + tok = tok.previous_token + while tok.is_comment: + tok = tok.previous_token + return tok + + def ImplicitStringConcatenation(tok): + num_strings = 0 + if tok.is_pseudo_paren: + tok = tok.next_token + while tok.is_string: + num_strings += 1 + tok = tok.next_token + return num_strings > 1 + + def DictValueIsContainer(opening, closing): + """Return true if the dictionary value is a container.""" + if not opening or not closing: + return False + colon = opening.previous_token + while colon: + if not colon.is_pseudo_paren: + break + colon = colon.previous_token + if not colon or colon.value != ':': + return False + key = colon.previous_token + if not key: + return False + return format_token.Subtype.DICTIONARY_KEY_PART in key.subtypes + + closing = opening.matching_bracket + entry_start = opening.next_token + current = opening.next_token.next_token + + while current and current != closing: + if format_token.Subtype.DICTIONARY_KEY in current.subtypes: + prev = PreviousNonCommentToken(current) + if prev.value == ',': + prev = PreviousNonCommentToken(prev.previous_token) + if not DictValueIsContainer(prev.matching_bracket, prev): + length = prev.total_length - entry_start.total_length + length += len(entry_start.value) + if length + self.stack[-2].indent >= self.column_limit: + return False + entry_start = current + if current.OpensScope(): + if ((current.value == '{' or + (current.is_pseudo_paren and current.next_token.value == '{') and + format_token.Subtype.DICTIONARY_VALUE in current.subtypes) or + ImplicitStringConcatenation(current)): + # A dictionary entry that cannot fit on a single line shouldn't matter + # to this calculation. If it can't fit on a single line, then the + # opening should be on the same line as the key and the rest on + # newlines after it. But the other entries should be on single lines + # if possible. + if current.matching_bracket: + current = current.matching_bracket + while current: + if current == closing: + return True + if format_token.Subtype.DICTIONARY_KEY in current.subtypes: + entry_start = current + break + current = current.next_token + else: + current = current.matching_bracket + else: + current = current.next_token + + # At this point, current is the closing bracket. Go back one to get the end + # of the dictionary entry. + current = PreviousNonCommentToken(current) + length = current.total_length - entry_start.total_length + length += len(entry_start.value) + return length + self.stack[-2].indent <= self.column_limit + + def _ArgumentListHasDictionaryEntry(self, token): + """Check if the function argument list has a dictionary as an arg.""" + if _IsArgumentToFunction(token): + while token: + if token.value == '{': + length = token.matching_bracket.total_length - token.total_length + return length + self.stack[-2].indent > self.column_limit + if token.ClosesScope(): + break + if token.OpensScope(): + token = token.matching_bracket + token = token.next_token + return False + + def _ContainerFitsOnStartLine(self, opening): + """Check if the container can fit on its starting line. + + Arguments: + opening: (FormatToken) The unwrapped line we're currently processing. + + Returns: + True if the container fits on the start line. + """ + return (opening.matching_bracket.total_length - opening.total_length + + self.stack[-1].indent) <= self.column_limit + + +_COMPOUND_STMTS = frozenset( + {'for', 'while', 'if', 'elif', 'with', 'except', 'def', 'class'}) + + +def _IsCompoundStatement(token): + if token.value == 'async': + token = token.next_token + return token.value in _COMPOUND_STMTS + + +def _IsFunctionDef(token): + if token.value == 'async': + token = token.next_token + return token.value == 'def' + + +def _IsFunctionCallWithArguments(token): + while token: + if token.value == '(': + token = token.next_token + return token and token.value != ')' + elif token.name not in {'NAME', 'DOT', 'EQUAL'}: + break + token = token.next_token + return False + + +def _IsArgumentToFunction(token): + bracket = unwrapped_line.IsSurroundedByBrackets(token) + if not bracket or bracket.value != '(': + return False + previous = bracket.previous_token + return previous and previous.is_name + + +def _GetOpeningBracket(current): + """Get the opening bracket containing the current token.""" + if current.matching_bracket and not current.is_pseudo_paren: + return current if current.OpensScope() else current.matching_bracket + + while current: + if current.ClosesScope(): + current = current.matching_bracket + elif current.is_pseudo_paren: + current = current.previous_token + elif current.OpensScope(): + return current + current = current.previous_token + return None + + +def _LastTokenInLine(current): + while not current.is_comment and current.next_token: + current = current.next_token + return current + + +def _IsFunctionDefinition(current): + prev = current.previous_token + return (current.value == '(' and prev and + format_token.Subtype.FUNC_DEF in prev.subtypes) + + +def _IsLastScopeInLine(current): + current = current.matching_bracket + while current: + current = current.next_token + if current and current.OpensScope(): + return False + return True + + +def _IsSingleElementTuple(token): + """Check if it's a single-element tuple.""" + close = token.matching_bracket + token = token.next_token + num_commas = 0 + while token != close: + if token.value == ',': + num_commas += 1 + if token.OpensScope(): + token = token.matching_bracket + else: + token = token.next_token + return num_commas == 1 + + +def _ScopeHasNoCommas(token): + """Check if the scope has no commas.""" + close = token.matching_bracket + token = token.next_token + while token != close: + if token.value == ',': + return False + if token.OpensScope(): + token = token.matching_bracket + else: + token = token.next_token + return True + + +class _ParenState(object): + """Maintains the state of the bracket enclosures. + + A stack of _ParenState objects are kept so that we know how to indent relative + to the brackets. + + Attributes: + indent: The column position to which a specified parenthesis level needs to + be indented. + last_space: The column position of the last space on each level. + closing_scope_indent: The column position of the closing indentation. + split_before_closing_bracket: Whether a newline needs to be inserted before + the closing bracket. We only want to insert a newline before the closing + bracket if there also was a newline after the beginning left bracket. + num_line_splits: Number of line splits this _ParenState contains already. + Each subsequent line split gets an increasing penalty. + """ + + # TODO(morbo): This doesn't track "bin packing." + + def __init__(self, indent, last_space): + self.indent = indent + self.last_space = last_space + self.closing_scope_indent = 0 + self.split_before_closing_bracket = False + self.num_line_splits = 0 + + def Clone(self): + state = _ParenState(self.indent, self.last_space) + state.closing_scope_indent = self.closing_scope_indent + state.split_before_closing_bracket = self.split_before_closing_bracket + state.num_line_splits = self.num_line_splits + return state + + def __repr__(self): + return '[indent::%d, last_space::%d, closing_scope_indent::%d]' % ( + self.indent, self.last_space, self.closing_scope_indent) + + def __eq__(self, other): + return hash(self) == hash(other) + + def __ne__(self, other): + return not self == other + + def __hash__(self, *args, **kwargs): + return hash((self.indent, self.last_space, self.closing_scope_indent, + self.split_before_closing_bracket, self.num_line_splits)) diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/format_token.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/format_token.py new file mode 100644 index 00000000..92c26ee5 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/format_token.py @@ -0,0 +1,385 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Pytree nodes with extra formatting information. + +This is a thin wrapper around a pytree.Leaf node. +""" + +import keyword +import re + +from lib2to3.pgen2 import token + +from yapf.yapflib import py3compat +from yapf.yapflib import pytree_utils +from yapf.yapflib import style + +CONTINUATION = token.N_TOKENS + + +class Subtype(object): + """Subtype information about tokens. + + Gleaned from parsing the code. Helps determine the best formatting. + """ + NONE = 0 + UNARY_OPERATOR = 1 + BINARY_OPERATOR = 2 + A_EXPR_OPERATOR = 3 + M_EXPR_OPERATOR = 4 + SUBSCRIPT_COLON = 5 + SUBSCRIPT_BRACKET = 6 + DEFAULT_OR_NAMED_ASSIGN = 7 + DEFAULT_OR_NAMED_ASSIGN_ARG_LIST = 8 + VARARGS_LIST = 9 + VARARGS_STAR = 10 + KWARGS_STAR_STAR = 11 + ASSIGN_OPERATOR = 12 + DICTIONARY_KEY = 13 + DICTIONARY_KEY_PART = 14 + DICTIONARY_VALUE = 15 + DICT_SET_GENERATOR = 16 + COMP_EXPR = 17 + COMP_FOR = 18 + COMP_IF = 19 + FUNC_DEF = 20 + DECORATOR = 21 + TYPED_NAME = 22 + TYPED_NAME_ARG_LIST = 23 + SIMPLE_EXPRESSION = 24 + PARAMETER_START = 25 + PARAMETER_STOP = 26 + + +def _TabbedContinuationAlignPadding(spaces, align_style, tab_width): + """Build padding string for continuation alignment in tabbed indentation. + + Arguments: + spaces: (int) The number of spaces to place before the token for alignment. + align_style: (str) The alignment style for continuation lines. + tab_width: (int) Number of columns of each tab character. + + Returns: + A padding string for alignment with style specified by align_style option. + """ + if align_style in ('FIXED', 'VALIGN-RIGHT'): + if spaces > 0: + return '\t' * int((spaces + tab_width - 1) / tab_width) + return '' + return ' ' * spaces + + +class FormatToken(object): + """A wrapper around pytree Leaf nodes. + + This represents the token plus additional information useful for reformatting + the code. + + Attributes: + node: The PyTree node this token represents. + next_token: The token in the unwrapped line after this token or None if this + is the last token in the unwrapped line. + previous_token: The token in the unwrapped line before this token or None if + this is the first token in the unwrapped line. + matching_bracket: If a bracket token ('[', '{', or '(') the matching + bracket. + parameters: If this and its following tokens make up a parameter list, then + this is a list of those parameters. + container_opening: If the object is in a container, this points to its + opening bracket. + container_elements: If this is the start of a container, a list of the + elements in the container. + whitespace_prefix: The prefix for the whitespace. + spaces_required_before: The number of spaces required before a token. This + is a lower-bound for the formatter and not a hard requirement. For + instance, a comment may have n required spaces before it. But the + formatter won't place n spaces before all comments. Only those that are + moved to the end of a line of code. The formatter may use different + spacing when appropriate. + can_break_before: True if we're allowed to break before this token. + must_break_before: True if we're required to break before this token. + total_length: The total length of the unwrapped line up to and including + whitespace and this token. However, this doesn't include the initial + indentation amount. + split_penalty: The penalty for splitting the line before this token. + """ + + def __init__(self, node): + """Constructor. + + Arguments: + node: (pytree.Leaf) The node that's being wrapped. + """ + self.node = node + self.next_token = None + self.previous_token = None + self.matching_bracket = None + self.parameters = [] + self.container_opening = None + self.container_elements = [] + self.whitespace_prefix = '' + self.can_break_before = False + self.must_break_before = False + self.total_length = 0 # TODO(morbo): Think up a better name. + self.split_penalty = 0 + + if self.is_comment: + self.spaces_required_before = style.Get('SPACES_BEFORE_COMMENT') + else: + self.spaces_required_before = 0 + + if self.is_continuation: + self.value = self.node.value.rstrip() + else: + self.value = self.node.value + + @property + def formatted_whitespace_prefix(self): + if style.Get('INDENT_BLANK_LINES'): + without_newlines = self.whitespace_prefix.lstrip('\n') + height = len(self.whitespace_prefix) - len(without_newlines) + if height: + return ('\n' + without_newlines) * height + return self.whitespace_prefix + + def AddWhitespacePrefix(self, newlines_before, spaces=0, indent_level=0): + """Register a token's whitespace prefix. + + This is the whitespace that will be output before a token's string. + + Arguments: + newlines_before: (int) The number of newlines to place before the token. + spaces: (int) The number of spaces to place before the token. + indent_level: (int) The indentation level. + """ + if style.Get('USE_TABS'): + if newlines_before > 0: + indent_before = '\t' * indent_level + _TabbedContinuationAlignPadding( + spaces, style.Get('CONTINUATION_ALIGN_STYLE'), + style.Get('INDENT_WIDTH')) + else: + indent_before = '\t' * indent_level + ' ' * spaces + else: + indent_before = (' ' * indent_level * style.Get('INDENT_WIDTH') + + ' ' * spaces) + + if self.is_comment: + comment_lines = [s.lstrip() for s in self.value.splitlines()] + self.node.value = ('\n' + indent_before).join(comment_lines) + + # Update our own value since we are changing node value + self.value = self.node.value + + if not self.whitespace_prefix: + self.whitespace_prefix = ('\n' * (self.newlines or newlines_before) + + indent_before) + else: + self.whitespace_prefix += indent_before + + def AdjustNewlinesBefore(self, newlines_before): + """Change the number of newlines before this token.""" + self.whitespace_prefix = ('\n' * newlines_before + + self.whitespace_prefix.lstrip('\n')) + + def RetainHorizontalSpacing(self, first_column, depth): + """Retains a token's horizontal spacing.""" + previous = self.previous_token + if not previous: + return + + if previous.is_pseudo_paren: + previous = previous.previous_token + if not previous: + return + + cur_lineno = self.lineno + prev_lineno = previous.lineno + if previous.is_multiline_string: + prev_lineno += previous.value.count('\n') + + if (cur_lineno != prev_lineno or + (previous.is_pseudo_paren and previous.value != ')' and + cur_lineno != previous.previous_token.lineno)): + self.spaces_required_before = ( + self.column - first_column + depth * style.Get('INDENT_WIDTH')) + return + + cur_column = self.node.column + prev_column = previous.node.column + prev_len = len(previous.value) + + if previous.is_pseudo_paren and previous.value == ')': + prev_column -= 1 + prev_len = 0 + + if previous.is_multiline_string: + prev_len = len(previous.value.split('\n')[-1]) + if '\n' in previous.value: + prev_column = 0 # Last line starts in column 0. + + self.spaces_required_before = cur_column - (prev_column + prev_len) + + def OpensScope(self): + return self.value in pytree_utils.OPENING_BRACKETS + + def ClosesScope(self): + return self.value in pytree_utils.CLOSING_BRACKETS + + def __repr__(self): + msg = 'FormatToken(name={0}, value={1}, lineno={2}'.format( + self.name, self.value, self.lineno) + msg += ', pseudo)' if self.is_pseudo_paren else ')' + return msg + + @property + @py3compat.lru_cache() + def node_split_penalty(self): + """Split penalty attached to the pytree node of this token.""" + return pytree_utils.GetNodeAnnotation( + self.node, pytree_utils.Annotation.SPLIT_PENALTY, default=0) + + @property + def newlines(self): + """The number of newlines needed before this token.""" + return pytree_utils.GetNodeAnnotation(self.node, + pytree_utils.Annotation.NEWLINES) + + @property + def must_split(self): + """Return true if the token requires a split before it.""" + return pytree_utils.GetNodeAnnotation(self.node, + pytree_utils.Annotation.MUST_SPLIT) + + @property + def column(self): + """The original column number of the node in the source.""" + return self.node.column + + @property + def lineno(self): + """The original line number of the node in the source.""" + return self.node.lineno + + @property + @py3compat.lru_cache() + def subtypes(self): + """Extra type information for directing formatting.""" + value = pytree_utils.GetNodeAnnotation(self.node, + pytree_utils.Annotation.SUBTYPE) + return [Subtype.NONE] if value is None else value + + @property + @py3compat.lru_cache() + def is_binary_op(self): + """Token is a binary operator.""" + return Subtype.BINARY_OPERATOR in self.subtypes + + @property + @py3compat.lru_cache() + def is_a_expr_op(self): + """Token is an a_expr operator.""" + return Subtype.A_EXPR_OPERATOR in self.subtypes + + @property + @py3compat.lru_cache() + def is_m_expr_op(self): + """Token is an m_expr operator.""" + return Subtype.M_EXPR_OPERATOR in self.subtypes + + @property + @py3compat.lru_cache() + def is_arithmetic_op(self): + """Token is an arithmetic operator.""" + return self.is_a_expr_op or self.is_m_expr_op + + @property + @py3compat.lru_cache() + def is_simple_expr(self): + """Token is an operator in a simple expression.""" + return Subtype.SIMPLE_EXPRESSION in self.subtypes + + @property + @py3compat.lru_cache() + def is_subscript_colon(self): + """Token is a subscript colon.""" + return Subtype.SUBSCRIPT_COLON in self.subtypes + + @property + @py3compat.lru_cache() + def name(self): + """A string representation of the node's name.""" + return pytree_utils.NodeName(self.node) + + @property + def is_comment(self): + return self.node.type == token.COMMENT + + @property + def is_continuation(self): + return self.node.type == CONTINUATION + + @property + @py3compat.lru_cache() + def is_keyword(self): + return keyword.iskeyword(self.value) + + @property + @py3compat.lru_cache() + def is_name(self): + return self.node.type == token.NAME and not self.is_keyword + + @property + def is_number(self): + return self.node.type == token.NUMBER + + @property + def is_string(self): + return self.node.type == token.STRING + + @property + @py3compat.lru_cache() + def is_multiline_string(self): + """Test if this string is a multiline string. + + Returns: + A multiline string always ends with triple quotes, so if it is a string + token, inspect the last 3 characters and return True if it is a triple + double or triple single quote mark. + """ + return self.is_string and self.value.endswith(('"""', "'''")) + + @property + @py3compat.lru_cache() + def is_docstring(self): + return self.is_multiline_string and not self.node.prev_sibling + + @property + @py3compat.lru_cache() + def is_pseudo_paren(self): + return hasattr(self.node, 'is_pseudo') and self.node.is_pseudo + + @property + def is_pylint_comment(self): + return self.is_comment and re.match(r'#.*\bpylint:\s*(disable|enable)=', + self.value) + + @property + def is_pytype_comment(self): + return self.is_comment and re.match(r'#.*\bpytype:\s*(disable|enable)=', + self.value) + + @property + def is_copybara_comment(self): + return self.is_comment and re.match(r'#.*\bcopybara:(strip|insert|replace)', + self.value) diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/identify_container.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/identify_container.py new file mode 100644 index 00000000..5c5fc5bf --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/identify_container.py @@ -0,0 +1,67 @@ +# Copyright 2018 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Identify containers for lib2to3 trees. + +This module identifies containers and the elements in them. Each element points +to the opening bracket and vice-versa. + + IdentifyContainers(): the main function exported by this module. +""" + +from yapf.yapflib import pytree_utils +from yapf.yapflib import pytree_visitor + + +def IdentifyContainers(tree): + """Run the identify containers visitor over the tree, modifying it in place. + + Arguments: + tree: the top-level pytree node to annotate with subtypes. + """ + identify_containers = _IdentifyContainers() + identify_containers.Visit(tree) + + +class _IdentifyContainers(pytree_visitor.PyTreeVisitor): + """_IdentifyContainers - see file-level docstring for detailed description.""" + + def Visit_trailer(self, node): # pylint: disable=invalid-name + for child in node.children: + self.Visit(child) + + if len(node.children) != 3: + return + if pytree_utils.NodeName(node.children[0]) != 'LPAR': + return + + if pytree_utils.NodeName(node.children[1]) == 'arglist': + for child in node.children[1].children: + pytree_utils.SetOpeningBracket( + pytree_utils.FirstLeafNode(child), node.children[0]) + else: + pytree_utils.SetOpeningBracket( + pytree_utils.FirstLeafNode(node.children[1]), node.children[0]) + + def Visit_atom(self, node): # pylint: disable=invalid-name + for child in node.children: + self.Visit(child) + + if len(node.children) != 3: + return + if pytree_utils.NodeName(node.children[0]) != 'LPAR': + return + + for child in node.children[1].children: + pytree_utils.SetOpeningBracket( + pytree_utils.FirstLeafNode(child), node.children[0]) diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/line_joiner.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/line_joiner.py new file mode 100644 index 00000000..84346c26 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/line_joiner.py @@ -0,0 +1,109 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Join unwrapped lines together. + +Determine how many lines can be joined into one line. For instance, we could +join these statements into one line: + + if a == 42: + continue + +like this: + + if a == 42: continue + +There are a few restrictions: + + 1. The lines should have been joined in the original source. + 2. The joined lines must not go over the column boundary if placed on the same + line. + 3. They need to be very simple statements. + +Note: Because we don't allow the use of a semicolon to separate statements, it +follows that there can only be at most two lines to join. +""" + +from yapf.yapflib import style + +_CLASS_OR_FUNC = frozenset({'def', 'class'}) + + +def CanMergeMultipleLines(lines, last_was_merged=False): + """Determine if multiple lines can be joined into one. + + Arguments: + lines: (list of UnwrappedLine) This is a splice of UnwrappedLines from the + full code base. + last_was_merged: (bool) The last line was merged. + + Returns: + True if two consecutive lines can be joined together. In reality, this will + only happen if two consecutive lines can be joined, due to the style guide. + """ + # The indentation amount for the starting line (number of spaces). + indent_amt = lines[0].depth * style.Get('INDENT_WIDTH') + if len(lines) == 1 or indent_amt > style.Get('COLUMN_LIMIT'): + return False + + if (len(lines) >= 3 and lines[2].depth >= lines[1].depth and + lines[0].depth != lines[2].depth): + # If lines[2]'s depth is greater than or equal to line[1]'s depth, we're not + # looking at a single statement (e.g., if-then, while, etc.). A following + # line with the same depth as the first line isn't part of the lines we + # would want to combine. + return False # Don't merge more than two lines together. + + if lines[0].first.value in _CLASS_OR_FUNC: + # Don't join lines onto the starting line of a class or function. + return False + + limit = style.Get('COLUMN_LIMIT') - indent_amt + if lines[0].last.total_length < limit: + limit -= lines[0].last.total_length + + if lines[0].first.value == 'if': + return _CanMergeLineIntoIfStatement(lines, limit) + if last_was_merged and lines[0].first.value in {'elif', 'else'}: + return _CanMergeLineIntoIfStatement(lines, limit) + + # TODO(morbo): Other control statements? + + return False + + +def _CanMergeLineIntoIfStatement(lines, limit): + """Determine if we can merge a short if-then statement into one line. + + Two lines of an if-then statement can be merged if they were that way in the + original source, fit on the line without going over the column limit, and are + considered "simple" statements --- typically statements like 'pass', + 'continue', and 'break'. + + Arguments: + lines: (list of UnwrappedLine) The lines we are wanting to merge. + limit: (int) The amount of space remaining on the line. + + Returns: + True if the lines can be merged, False otherwise. + """ + if len(lines[1].tokens) == 1 and lines[1].last.is_multiline_string: + # This might be part of a multiline shebang. + return True + if lines[0].lineno != lines[1].lineno: + # Don't merge lines if the original lines weren't merged. + return False + if lines[1].last.total_length >= limit: + # Don't merge lines if the result goes over the column limit. + return False + return style.Get('JOIN_MULTIPLE_LINES') diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/object_state.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/object_state.py new file mode 100644 index 00000000..4ae8eaeb --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/object_state.py @@ -0,0 +1,235 @@ +# Copyright 2017 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Represents the state of Python objects being formatted. + +Objects (e.g., list comprehensions, dictionaries, etc.) have specific +requirements on how they're formatted. These state objects keep track of these +requirements. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from yapf.yapflib import format_token +from yapf.yapflib import py3compat +from yapf.yapflib import style + + +class ComprehensionState(object): + """Maintains the state of list comprehension formatting decisions. + + A stack of ComprehensionState objects are kept to ensure that list + comprehensions are wrapped with well-defined rules. + + Attributes: + expr_token: The first token in the comprehension. + for_token: The first 'for' token of the comprehension. + opening_bracket: The opening bracket of the list comprehension. + closing_bracket: The closing bracket of the list comprehension. + has_split_at_for: Whether there is a newline immediately before the + for_token. + has_interior_split: Whether there is a newline within the comprehension. + That is, a split somewhere after expr_token or before closing_bracket. + """ + + def __init__(self, expr_token): + self.expr_token = expr_token + self.for_token = None + self.has_split_at_for = False + self.has_interior_split = False + + def HasTrivialExpr(self): + """Returns whether the comp_expr is "trivial" i.e. is a single token.""" + return self.expr_token.next_token.value == 'for' + + @property + def opening_bracket(self): + return self.expr_token.previous_token + + @property + def closing_bracket(self): + return self.opening_bracket.matching_bracket + + def Clone(self): + clone = ComprehensionState(self.expr_token) + clone.for_token = self.for_token + clone.has_split_at_for = self.has_split_at_for + clone.has_interior_split = self.has_interior_split + return clone + + def __repr__(self): + return ('[opening_bracket::%s, for_token::%s, has_split_at_for::%s,' + ' has_interior_split::%s, has_trivial_expr::%s]' % + (self.opening_bracket, self.for_token, self.has_split_at_for, + self.has_interior_split, self.HasTrivialExpr())) + + def __eq__(self, other): + return hash(self) == hash(other) + + def __ne__(self, other): + return not self == other + + def __hash__(self, *args, **kwargs): + return hash((self.expr_token, self.for_token, self.has_split_at_for, + self.has_interior_split)) + + +class ParameterListState(object): + """Maintains the state of function parameter list formatting decisions. + + Attributes: + opening_bracket: The opening bracket of the parameter list. + closing_bracket: The closing bracket of the parameter list. + has_typed_return: True if the function definition has a typed return. + ends_in_comma: True if the parameter list ends in a comma. + last_token: Returns the last token of the function declaration. + has_default_values: True if the parameters have default values. + has_split_before_first_param: Whether there is a newline before the first + parameter. + opening_column: The position of the opening parameter before a newline. + parameters: A list of parameter objects (Parameter). + split_before_closing_bracket: Split before the closing bracket. Sometimes + needed if the indentation would collide. + """ + + def __init__(self, opening_bracket, newline, opening_column): + self.opening_bracket = opening_bracket + self.has_split_before_first_param = newline + self.opening_column = opening_column + self.parameters = opening_bracket.parameters + self.split_before_closing_bracket = False + + @property + def closing_bracket(self): + return self.opening_bracket.matching_bracket + + @property + def has_typed_return(self): + return self.closing_bracket.next_token.value == '->' + + @property + @py3compat.lru_cache() + def has_default_values(self): + return any(param.has_default_value for param in self.parameters) + + @property + @py3compat.lru_cache() + def ends_in_comma(self): + if not self.parameters: + return False + return self.parameters[-1].last_token.next_token.value == ',' + + @property + @py3compat.lru_cache() + def last_token(self): + token = self.opening_bracket.matching_bracket + while not token.is_comment and token.next_token: + token = token.next_token + return token + + @py3compat.lru_cache() + def LastParamFitsOnLine(self, indent): + """Return true if the last parameter fits on a single line.""" + if not self.has_typed_return: + return False + if not self.parameters: + return True + total_length = self.last_token.total_length + last_param = self.parameters[-1].first_token + total_length -= last_param.total_length - len(last_param.value) + return total_length + indent <= style.Get('COLUMN_LIMIT') + + @py3compat.lru_cache() + def SplitBeforeClosingBracket(self, indent): + """Return true if there's a split before the closing bracket.""" + if style.Get('DEDENT_CLOSING_BRACKETS'): + return True + if self.ends_in_comma: + return True + if not self.parameters: + return False + total_length = self.last_token.total_length + last_param = self.parameters[-1].first_token + total_length -= last_param.total_length - len(last_param.value) + return total_length + indent > style.Get('COLUMN_LIMIT') + + def Clone(self): + clone = ParameterListState(self.opening_bracket, + self.has_split_before_first_param, + self.opening_column) + clone.split_before_closing_bracket = self.split_before_closing_bracket + clone.parameters = [param.Clone() for param in self.parameters] + return clone + + def __repr__(self): + return ('[opening_bracket::%s, has_split_before_first_param::%s, ' + 'opening_column::%d]' % + (self.opening_bracket, self.has_split_before_first_param, + self.opening_column)) + + def __eq__(self, other): + return hash(self) == hash(other) + + def __ne__(self, other): + return not self == other + + def __hash__(self, *args, **kwargs): + return hash( + (self.opening_bracket, self.has_split_before_first_param, + self.opening_column, (hash(param) for param in self.parameters))) + + +class Parameter(object): + """A parameter in a parameter list. + + Attributes: + first_token: (format_token.FormatToken) First token of parameter. + last_token: (format_token.FormatToken) Last token of parameter. + has_default_value: (boolean) True if the parameter has a default value + """ + + def __init__(self, first_token, last_token): + self.first_token = first_token + self.last_token = last_token + + @property + @py3compat.lru_cache() + def has_default_value(self): + """Returns true if the parameter has a default value.""" + tok = self.first_token + while tok != self.last_token: + if format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN in tok.subtypes: + return True + if tok.OpensScope(): + tok = tok.matching_bracket + else: + tok = tok.next_token + return False + + def Clone(self): + return Parameter(self.first_token, self.last_token) + + def __repr__(self): + return '[first_token::%s, last_token:%s]' % (self.first_token, + self.last_token) + + def __eq__(self, other): + return hash(self) == hash(other) + + def __ne__(self, other): + return not self == other + + def __hash__(self, *args, **kwargs): + return hash((self.first_token, self.last_token)) diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/py3compat.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/py3compat.py new file mode 100644 index 00000000..7c905237 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/py3compat.py @@ -0,0 +1,131 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Utilities for Python2 / Python3 compatibility.""" + +import codecs +import io +import os +import sys + +PY3 = sys.version_info[0] >= 3 +PY36 = sys.version_info[0] >= 3 and sys.version_info[1] >= 6 +PY37 = sys.version_info[0] >= 3 and sys.version_info[1] >= 7 +PY38 = sys.version_info[0] >= 3 and sys.version_info[1] >= 8 + +if PY3: + StringIO = io.StringIO + BytesIO = io.BytesIO + + import codecs + + def open_with_encoding(filename, mode, encoding, newline=''): # pylint: disable=unused-argument + return codecs.open(filename, mode=mode, encoding=encoding) + + import functools + lru_cache = functools.lru_cache + + range = range + ifilter = filter + + def raw_input(): + wrapper = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8') + return wrapper.buffer.raw.readall().decode('utf-8') + + import configparser + + # Mappings from strings to booleans (such as '1' to True, 'false' to False, + # etc.) + CONFIGPARSER_BOOLEAN_STATES = configparser.ConfigParser.BOOLEAN_STATES +else: + import __builtin__ + import cStringIO + StringIO = BytesIO = cStringIO.StringIO + + open_with_encoding = io.open + + # Python 2.7 doesn't have a native LRU cache, so do nothing. + def lru_cache(maxsize=128, typed=False): + + def fake_wrapper(user_function): + return user_function + + return fake_wrapper + + range = xrange + + from itertools import ifilter + raw_input = raw_input + + import ConfigParser as configparser + CONFIGPARSER_BOOLEAN_STATES = configparser.ConfigParser._boolean_states # pylint: disable=protected-access + + +def EncodeAndWriteToStdout(s, encoding='utf-8'): + """Encode the given string and emit to stdout. + + The string may contain non-ascii characters. This is a problem when stdout is + redirected, because then Python doesn't know the encoding and we may get a + UnicodeEncodeError. + + Arguments: + s: (string) The string to encode. + encoding: (string) The encoding of the string. + """ + if PY3: + sys.stdout.buffer.write(s.encode(encoding)) + elif sys.platform == 'win32': + # On python 2 and Windows universal newline transformation will be in + # effect on stdout. Python 2 will not let us avoid the easily because + # it happens based on whether the file handle is opened in O_BINARY or + # O_TEXT state. However we can tell Windows itself to change the current + # mode, and python 2 will follow suit. However we must take care to change + # the mode on the actual external stdout not just the current sys.stdout + # which may have been monkey-patched inside the python environment. + import msvcrt # pylint: disable=g-import-not-at-top + if sys.__stdout__ is sys.stdout: + msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) + sys.stdout.write(s.encode(encoding)) + else: + sys.stdout.write(s.encode(encoding)) + + +if PY3: + basestring = str + unicode = str # pylint: disable=redefined-builtin,invalid-name +else: + basestring = basestring + + def unicode(s): # pylint: disable=invalid-name + """Force conversion of s to unicode.""" + return __builtin__.unicode(s, 'utf-8') + + +# In Python 3.2+, readfp is deprecated in favor of read_file, which doesn't +# exist in Python 2 yet. To avoid deprecation warnings, subclass ConfigParser to +# fix this - now read_file works across all Python versions we care about. +class ConfigParser(configparser.ConfigParser): + if not PY3: + + def read_file(self, fp, source=None): + self.readfp(fp, filename=source) + + +def removeBOM(source): + """Remove any Byte-order-Mark bytes from the beginning of a file.""" + bom = codecs.BOM_UTF8 + if PY3: + bom = bom.decode('utf-8') + if source.startswith(bom): + return source[len(bom):] + return source diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/pytree_unwrapper.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/pytree_unwrapper.py new file mode 100644 index 00000000..c7e32a3e --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/pytree_unwrapper.py @@ -0,0 +1,424 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""PyTreeUnwrapper - produces a list of unwrapped lines from a pytree. + +[for a description of what an unwrapped line is, see unwrapped_line.py] + +This is a pytree visitor that goes over a parse tree and produces a list of +UnwrappedLine containers from it, each with its own depth and containing all +the tokens that could fit on the line if there were no maximal line-length +limitations. + +Note: a precondition to running this visitor and obtaining correct results is +for the tree to have its comments spliced in as nodes. Prefixes are ignored. + +For most uses, the convenience function UnwrapPyTree should be sufficient. +""" + +# The word "token" is overloaded within this module, so for clarity rename +# the imported pgen2.token module. +from lib2to3 import pytree +from lib2to3.pgen2 import token as grammar_token + +from yapf.yapflib import format_token +from yapf.yapflib import object_state +from yapf.yapflib import pytree_utils +from yapf.yapflib import pytree_visitor +from yapf.yapflib import split_penalty +from yapf.yapflib import style +from yapf.yapflib import unwrapped_line + + +def UnwrapPyTree(tree): + """Create and return a list of unwrapped lines from the given pytree. + + Arguments: + tree: the top-level pytree node to unwrap. + + Returns: + A list of UnwrappedLine objects. + """ + unwrapper = PyTreeUnwrapper() + unwrapper.Visit(tree) + uwlines = unwrapper.GetUnwrappedLines() + uwlines.sort(key=lambda x: x.lineno) + return uwlines + + +# Grammar tokens considered as whitespace for the purpose of unwrapping. +_WHITESPACE_TOKENS = frozenset([ + grammar_token.NEWLINE, grammar_token.DEDENT, grammar_token.INDENT, + grammar_token.ENDMARKER +]) + + +class PyTreeUnwrapper(pytree_visitor.PyTreeVisitor): + """PyTreeUnwrapper - see file-level docstring for detailed description. + + Note: since this implements PyTreeVisitor and node names in lib2to3 are + underscore_separated, the visiting methods of this class are named as + Visit_node_name. invalid-name pragmas are added to each such method to silence + a style warning. This is forced on us by the usage of lib2to3, and re-munging + method names to make them different from actual node names sounded like a + confusing and brittle affair that wasn't worth it for this small & controlled + deviation from the style guide. + + To understand the connection between visitor methods in this class, some + familiarity with the Python grammar is required. + """ + + def __init__(self): + # A list of all unwrapped lines finished visiting so far. + self._unwrapped_lines = [] + + # Builds up a "current" unwrapped line while visiting pytree nodes. Some + # nodes will finish a line and start a new one. + self._cur_unwrapped_line = unwrapped_line.UnwrappedLine(0) + + # Current indentation depth. + self._cur_depth = 0 + + def GetUnwrappedLines(self): + """Fetch the result of the tree walk. + + Note: only call this after visiting the whole tree. + + Returns: + A list of UnwrappedLine objects. + """ + # Make sure the last line that was being populated is flushed. + self._StartNewLine() + return self._unwrapped_lines + + def _StartNewLine(self): + """Finish current line and start a new one. + + Place the currently accumulated line into the _unwrapped_lines list and + start a new one. + """ + if self._cur_unwrapped_line.tokens: + self._unwrapped_lines.append(self._cur_unwrapped_line) + _MatchBrackets(self._cur_unwrapped_line) + _IdentifyParameterLists(self._cur_unwrapped_line) + _AdjustSplitPenalty(self._cur_unwrapped_line) + self._cur_unwrapped_line = unwrapped_line.UnwrappedLine(self._cur_depth) + + _STMT_TYPES = frozenset({ + 'if_stmt', + 'while_stmt', + 'for_stmt', + 'try_stmt', + 'expect_clause', + 'with_stmt', + 'funcdef', + 'classdef', + }) + + # pylint: disable=invalid-name,missing-docstring + def Visit_simple_stmt(self, node): + # A 'simple_stmt' conveniently represents a non-compound Python statement, + # i.e. a statement that does not contain other statements. + + # When compound nodes have a single statement as their suite, the parser + # can leave it in the tree directly without creating a suite. But we have + # to increase depth in these cases as well. However, don't increase the + # depth of we have a simple_stmt that's a comment node. This represents a + # standalone comment and in the case of it coming directly after the + # funcdef, it is a "top" comment for the whole function. + # TODO(eliben): add more relevant compound statements here. + single_stmt_suite = ( + node.parent and pytree_utils.NodeName(node.parent) in self._STMT_TYPES) + is_comment_stmt = pytree_utils.IsCommentStatement(node) + if single_stmt_suite and not is_comment_stmt: + self._cur_depth += 1 + self._StartNewLine() + self.DefaultNodeVisit(node) + if single_stmt_suite and not is_comment_stmt: + self._cur_depth -= 1 + + def _VisitCompoundStatement(self, node, substatement_names): + """Helper for visiting compound statements. + + Python compound statements serve as containers for other statements. Thus, + when we encounter a new compound statement we start a new unwrapped line. + + Arguments: + node: the node to visit. + substatement_names: set of node names. A compound statement will be + recognized as a NAME node with a name in this set. + """ + for child in node.children: + # A pytree is structured in such a way that a single 'if_stmt' node will + # contain all the 'if', 'elif' and 'else' nodes as children (similar + # structure applies to 'while' statements, 'try' blocks, etc). Therefore, + # we visit all children here and create a new line before the requested + # set of nodes. + if (child.type == grammar_token.NAME and + child.value in substatement_names): + self._StartNewLine() + self.Visit(child) + + _IF_STMT_ELEMS = frozenset({'if', 'else', 'elif'}) + + def Visit_if_stmt(self, node): # pylint: disable=invalid-name + self._VisitCompoundStatement(node, self._IF_STMT_ELEMS) + + _WHILE_STMT_ELEMS = frozenset({'while', 'else'}) + + def Visit_while_stmt(self, node): # pylint: disable=invalid-name + self._VisitCompoundStatement(node, self._WHILE_STMT_ELEMS) + + _FOR_STMT_ELEMS = frozenset({'for', 'else'}) + + def Visit_for_stmt(self, node): # pylint: disable=invalid-name + self._VisitCompoundStatement(node, self._FOR_STMT_ELEMS) + + _TRY_STMT_ELEMS = frozenset({'try', 'except', 'else', 'finally'}) + + def Visit_try_stmt(self, node): # pylint: disable=invalid-name + self._VisitCompoundStatement(node, self._TRY_STMT_ELEMS) + + _EXCEPT_STMT_ELEMS = frozenset({'except'}) + + def Visit_except_clause(self, node): # pylint: disable=invalid-name + self._VisitCompoundStatement(node, self._EXCEPT_STMT_ELEMS) + + _FUNC_DEF_ELEMS = frozenset({'def'}) + + def Visit_funcdef(self, node): # pylint: disable=invalid-name + self._VisitCompoundStatement(node, self._FUNC_DEF_ELEMS) + + def Visit_async_funcdef(self, node): # pylint: disable=invalid-name + self._StartNewLine() + index = 0 + for child in node.children: + index += 1 + self.Visit(child) + if pytree_utils.NodeName(child) == 'ASYNC': + break + for child in node.children[index].children: + self.Visit(child) + + _CLASS_DEF_ELEMS = frozenset({'class'}) + + def Visit_classdef(self, node): # pylint: disable=invalid-name + self._VisitCompoundStatement(node, self._CLASS_DEF_ELEMS) + + def Visit_async_stmt(self, node): # pylint: disable=invalid-name + self._StartNewLine() + index = 0 + for child in node.children: + index += 1 + self.Visit(child) + if pytree_utils.NodeName(child) == 'ASYNC': + break + for child in node.children[index].children: + if pytree_utils.NodeName(child) == 'NAME' and child.value == 'else': + self._StartNewLine() + self.Visit(child) + + def Visit_decorator(self, node): # pylint: disable=invalid-name + for child in node.children: + self.Visit(child) + if (pytree_utils.NodeName(child) == 'COMMENT' and + child == node.children[0]): + self._StartNewLine() + + def Visit_decorators(self, node): # pylint: disable=invalid-name + for child in node.children: + self._StartNewLine() + self.Visit(child) + + def Visit_decorated(self, node): # pylint: disable=invalid-name + for child in node.children: + self._StartNewLine() + self.Visit(child) + + _WITH_STMT_ELEMS = frozenset({'with'}) + + def Visit_with_stmt(self, node): # pylint: disable=invalid-name + self._VisitCompoundStatement(node, self._WITH_STMT_ELEMS) + + def Visit_suite(self, node): # pylint: disable=invalid-name + # A 'suite' starts a new indentation level in Python. + self._cur_depth += 1 + self._StartNewLine() + self.DefaultNodeVisit(node) + self._cur_depth -= 1 + + def Visit_listmaker(self, node): # pylint: disable=invalid-name + _DetermineMustSplitAnnotation(node) + self.DefaultNodeVisit(node) + + def Visit_dictsetmaker(self, node): # pylint: disable=invalid-name + _DetermineMustSplitAnnotation(node) + self.DefaultNodeVisit(node) + + def Visit_import_as_names(self, node): # pylint: disable=invalid-name + if node.prev_sibling.value == '(': + _DetermineMustSplitAnnotation(node) + self.DefaultNodeVisit(node) + + def Visit_testlist_gexp(self, node): # pylint: disable=invalid-name + _DetermineMustSplitAnnotation(node) + self.DefaultNodeVisit(node) + + def Visit_arglist(self, node): # pylint: disable=invalid-name + _DetermineMustSplitAnnotation(node) + self.DefaultNodeVisit(node) + + def Visit_typedargslist(self, node): # pylint: disable=invalid-name + _DetermineMustSplitAnnotation(node) + self.DefaultNodeVisit(node) + + def DefaultLeafVisit(self, leaf): + """Default visitor for tree leaves. + + A tree leaf is always just gets appended to the current unwrapped line. + + Arguments: + leaf: the leaf to visit. + """ + if leaf.type in _WHITESPACE_TOKENS: + self._StartNewLine() + elif leaf.type != grammar_token.COMMENT or leaf.value.strip(): + # Add non-whitespace tokens and comments that aren't empty. + self._cur_unwrapped_line.AppendNode(leaf) + + +_BRACKET_MATCH = {')': '(', '}': '{', ']': '['} + + +def _MatchBrackets(uwline): + """Visit the node and match the brackets. + + For every open bracket ('[', '{', or '('), find the associated closing bracket + and "match" them up. I.e., save in the token a pointer to its associated open + or close bracket. + + Arguments: + uwline: (UnwrappedLine) An unwrapped line. + """ + bracket_stack = [] + for token in uwline.tokens: + if token.value in pytree_utils.OPENING_BRACKETS: + bracket_stack.append(token) + elif token.value in pytree_utils.CLOSING_BRACKETS: + bracket_stack[-1].matching_bracket = token + token.matching_bracket = bracket_stack[-1] + bracket_stack.pop() + + for bracket in bracket_stack: + if id(pytree_utils.GetOpeningBracket(token.node)) == id(bracket.node): + bracket.container_elements.append(token) + token.container_opening = bracket + + +def _IdentifyParameterLists(uwline): + """Visit the node to create a state for parameter lists. + + For instance, a parameter is considered an "object" with its first and last + token uniquely identifying the object. + + Arguments: + uwline: (UnwrappedLine) An unwrapped line. + """ + func_stack = [] + param_stack = [] + for tok in uwline.tokens: + # Identify parameter list objects. + if format_token.Subtype.FUNC_DEF in tok.subtypes: + assert tok.next_token.value == '(' + func_stack.append(tok.next_token) + continue + + if func_stack and tok.value == ')': + if tok == func_stack[-1].matching_bracket: + func_stack.pop() + continue + + # Identify parameter objects. + if format_token.Subtype.PARAMETER_START in tok.subtypes: + param_stack.append(tok) + + # Not "elif", a parameter could be a single token. + if param_stack and format_token.Subtype.PARAMETER_STOP in tok.subtypes: + start = param_stack.pop() + func_stack[-1].parameters.append(object_state.Parameter(start, tok)) + + +def _AdjustSplitPenalty(uwline): + """Visit the node and adjust the split penalties if needed. + + A token shouldn't be split if it's not within a bracket pair. Mark any token + that's not within a bracket pair as "unbreakable". + + Arguments: + uwline: (UnwrappedLine) An unwrapped line. + """ + bracket_level = 0 + for index, token in enumerate(uwline.tokens): + if index and not bracket_level: + pytree_utils.SetNodeAnnotation(token.node, + pytree_utils.Annotation.SPLIT_PENALTY, + split_penalty.UNBREAKABLE) + if token.value in pytree_utils.OPENING_BRACKETS: + bracket_level += 1 + elif token.value in pytree_utils.CLOSING_BRACKETS: + bracket_level -= 1 + + +def _DetermineMustSplitAnnotation(node): + """Enforce a split in the list if the list ends with a comma.""" + if style.Get('DISABLE_ENDING_COMMA_HEURISTIC'): + return + if not _ContainsComments(node): + token = next(node.parent.leaves()) + if token.value == '(': + if sum(1 for ch in node.children + if pytree_utils.NodeName(ch) == 'COMMA') < 2: + return + if (not isinstance(node.children[-1], pytree.Leaf) or + node.children[-1].value != ','): + return + num_children = len(node.children) + index = 0 + _SetMustSplitOnFirstLeaf(node.children[0]) + while index < num_children - 1: + child = node.children[index] + if isinstance(child, pytree.Leaf) and child.value == ',': + next_child = node.children[index + 1] + if next_child.type == grammar_token.COMMENT: + index += 1 + if index >= num_children - 1: + break + _SetMustSplitOnFirstLeaf(node.children[index + 1]) + index += 1 + + +def _ContainsComments(node): + """Return True if the list has a comment in it.""" + if isinstance(node, pytree.Leaf): + return node.type == grammar_token.COMMENT + for child in node.children: + if _ContainsComments(child): + return True + return False + + +def _SetMustSplitOnFirstLeaf(node): + """Set the "must split" annotation on the first leaf node.""" + pytree_utils.SetNodeAnnotation( + pytree_utils.FirstLeafNode(node), pytree_utils.Annotation.MUST_SPLIT, + True) diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/pytree_utils.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/pytree_utils.py new file mode 100644 index 00000000..75d4ca20 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/pytree_utils.py @@ -0,0 +1,346 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""pytree-related utilities. + +This module collects various utilities related to the parse trees produced by +the lib2to3 library. + + NodeName(): produces a string name for pytree nodes. + ParseCodeToTree(): convenience wrapper around lib2to3 interfaces to parse + a given string with code to a pytree. + InsertNodeBefore(): insert a node before another in a pytree. + InsertNodeAfter(): insert a node after another in a pytree. + {Get,Set}NodeAnnotation(): manage custom annotations on pytree nodes. +""" + +import ast + +from lib2to3 import pygram +from lib2to3 import pytree +from lib2to3.pgen2 import driver +from lib2to3.pgen2 import parse +from lib2to3.pgen2 import token + +# TODO(eliben): We may want to get rid of this filtering at some point once we +# have a better understanding of what information we need from the tree. Then, +# these tokens may be filtered out from the tree before the tree gets to the +# unwrapper. +NONSEMANTIC_TOKENS = frozenset(['DEDENT', 'INDENT', 'NEWLINE', 'ENDMARKER']) + +OPENING_BRACKETS = frozenset({'(', '[', '{'}) +CLOSING_BRACKETS = frozenset({')', ']', '}'}) + + +class Annotation(object): + """Annotation names associated with pytrees.""" + CHILD_INDENT = 'child_indent' + NEWLINES = 'newlines' + MUST_SPLIT = 'must_split' + SPLIT_PENALTY = 'split_penalty' + SUBTYPE = 'subtype' + + +def NodeName(node): + """Produce a string name for a given node. + + For a Leaf this is the token name, and for a Node this is the type. + + Arguments: + node: a tree node + + Returns: + Name as a string. + """ + # Nodes with values < 256 are tokens. Values >= 256 are grammar symbols. + if node.type < 256: + return token.tok_name[node.type] + else: + return pygram.python_grammar.number2symbol[node.type] + + +def FirstLeafNode(node): + if isinstance(node, pytree.Leaf): + return node + return FirstLeafNode(node.children[0]) + + +def LastLeafNode(node): + if isinstance(node, pytree.Leaf): + return node + return LastLeafNode(node.children[-1]) + + +# lib2to3 thoughtfully provides pygram.python_grammar_no_print_statement for +# parsing Python 3 code that wouldn't parse otherwise (when 'print' is used in a +# context where a keyword is disallowed). +# It forgets to do the same for 'exec' though. Luckily, Python is amenable to +# monkey-patching. +_GRAMMAR_FOR_PY3 = pygram.python_grammar_no_print_statement.copy() +del _GRAMMAR_FOR_PY3.keywords['exec'] + +_GRAMMAR_FOR_PY2 = pygram.python_grammar.copy() +del _GRAMMAR_FOR_PY2.keywords['nonlocal'] + + +def ParseCodeToTree(code): + """Parse the given code to a lib2to3 pytree. + + Arguments: + code: a string with the code to parse. + + Raises: + SyntaxError if the code is invalid syntax. + parse.ParseError if some other parsing failure. + + Returns: + The root node of the parsed tree. + """ + # This function is tiny, but the incantation for invoking the parser correctly + # is sufficiently magical to be worth abstracting away. + try: + # Try to parse using a Python 3 grammar, which is more permissive (print and + # exec are not keywords). + parser_driver = driver.Driver(_GRAMMAR_FOR_PY3, convert=pytree.convert) + tree = parser_driver.parse_string(code, debug=False) + except parse.ParseError: + # Now try to parse using a Python 2 grammar; If this fails, then + # there's something else wrong with the code. + try: + parser_driver = driver.Driver(_GRAMMAR_FOR_PY2, convert=pytree.convert) + tree = parser_driver.parse_string(code, debug=False) + except parse.ParseError: + # Raise a syntax error if the code is invalid python syntax. + try: + ast.parse(code) + except SyntaxError as e: + raise e + else: + raise + return _WrapEndMarker(tree) + + +def _WrapEndMarker(tree): + """Wrap a single ENDMARKER token in a "file_input" node. + + Arguments: + tree: (pytree.Node) The root node of the parsed tree. + + Returns: + The root node of the parsed tree. If the tree is a single ENDMARKER node, + then that node is wrapped in a "file_input" node. That will ensure we don't + skip comments attached to that node. + """ + if isinstance(tree, pytree.Leaf) and tree.type == token.ENDMARKER: + return pytree.Node(pygram.python_symbols.file_input, [tree]) + return tree + + +def InsertNodesBefore(new_nodes, target): + """Insert new_nodes before the given target location in the tree. + + Arguments: + new_nodes: a sequence of new nodes to insert (the nodes should not be in the + tree). + target: the target node before which the new node node will be inserted. + + Raises: + RuntimeError: if the tree is corrupted, or the insertion would corrupt it. + """ + for node in new_nodes: + _InsertNodeAt(node, target, after=False) + + +def InsertNodesAfter(new_nodes, target): + """Insert new_nodes after the given target location in the tree. + + Arguments: + new_nodes: a sequence of new nodes to insert (the nodes should not be in the + tree). + target: the target node after which the new node node will be inserted. + + Raises: + RuntimeError: if the tree is corrupted, or the insertion would corrupt it. + """ + for node in reversed(new_nodes): + _InsertNodeAt(node, target, after=True) + + +def _InsertNodeAt(new_node, target, after=False): + """Underlying implementation for node insertion. + + Arguments: + new_node: a new node to insert (this node should not be in the tree). + target: the target node. + after: if True, new_node is inserted after target. Otherwise, it's inserted + before target. + + Returns: + nothing + + Raises: + RuntimeError: if the tree is corrupted, or the insertion would corrupt it. + """ + + # Protect against attempts to insert nodes which already belong to some tree. + if new_node.parent is not None: + raise RuntimeError('inserting node which already has a parent', + (new_node, new_node.parent)) + + # The code here is based on pytree.Base.next_sibling + parent_of_target = target.parent + if parent_of_target is None: + raise RuntimeError('expected target node to have a parent', (target,)) + + for i, child in enumerate(parent_of_target.children): + if child is target: + insertion_index = i + 1 if after else i + parent_of_target.insert_child(insertion_index, new_node) + return + + raise RuntimeError('unable to find insertion point for target node', + (target,)) + + +# The following constant and functions implement a simple custom annotation +# mechanism for pytree nodes. We attach new attributes to nodes. Each attribute +# is prefixed with _NODE_ANNOTATION_PREFIX. These annotations should only be +# managed through GetNodeAnnotation and SetNodeAnnotation. +_NODE_ANNOTATION_PREFIX = '_yapf_annotation_' + + +def CopyYapfAnnotations(src, dst): + """Copy all YAPF annotations from the source node to the destination node. + + Arguments: + src: the source node. + dst: the destination node. + """ + for annotation in dir(src): + if annotation.startswith(_NODE_ANNOTATION_PREFIX): + setattr(dst, annotation, getattr(src, annotation, None)) + + +def GetNodeAnnotation(node, annotation, default=None): + """Get annotation value from a node. + + Arguments: + node: the node. + annotation: annotation name - a string. + default: the default value to return if there's no annotation. + + Returns: + Value of the annotation in the given node. If the node doesn't have this + particular annotation name yet, returns default. + """ + return getattr(node, _NODE_ANNOTATION_PREFIX + annotation, default) + + +def SetNodeAnnotation(node, annotation, value): + """Set annotation value on a node. + + Arguments: + node: the node. + annotation: annotation name - a string. + value: annotation value to set. + """ + setattr(node, _NODE_ANNOTATION_PREFIX + annotation, value) + + +def AppendNodeAnnotation(node, annotation, value): + """Appends an annotation value to a list of annotations on the node. + + Arguments: + node: the node. + annotation: annotation name - a string. + value: annotation value to set. + """ + attr = GetNodeAnnotation(node, annotation, set()) + attr.add(value) + SetNodeAnnotation(node, annotation, attr) + + +def RemoveSubtypeAnnotation(node, value): + """Removes an annotation value from the subtype annotations on the node. + + Arguments: + node: the node. + value: annotation value to remove. + """ + attr = GetNodeAnnotation(node, Annotation.SUBTYPE) + if attr and value in attr: + attr.remove(value) + SetNodeAnnotation(node, Annotation.SUBTYPE, attr) + + +def GetOpeningBracket(node): + """Get opening bracket value from a node. + + Arguments: + node: the node. + + Returns: + The opening bracket node or None if it couldn't find one. + """ + return getattr(node, _NODE_ANNOTATION_PREFIX + 'container_bracket', None) + + +def SetOpeningBracket(node, bracket): + """Set opening bracket value for a node. + + Arguments: + node: the node. + bracket: opening bracket to set. + """ + setattr(node, _NODE_ANNOTATION_PREFIX + 'container_bracket', bracket) + + +def DumpNodeToString(node): + """Dump a string representation of the given node. For debugging. + + Arguments: + node: the node. + + Returns: + The string representation. + """ + if isinstance(node, pytree.Leaf): + fmt = ('{name}({value}) [lineno={lineno}, column={column}, ' + 'prefix={prefix}, penalty={penalty}]') + return fmt.format( + name=NodeName(node), + value=_PytreeNodeRepr(node), + lineno=node.lineno, + column=node.column, + prefix=repr(node.prefix), + penalty=GetNodeAnnotation(node, Annotation.SPLIT_PENALTY, None)) + else: + fmt = '{node} [{len} children] [child_indent="{indent}"]' + return fmt.format( + node=NodeName(node), + len=len(node.children), + indent=GetNodeAnnotation(node, Annotation.CHILD_INDENT)) + + +def _PytreeNodeRepr(node): + """Like pytree.Node.__repr__, but names instead of numbers for tokens.""" + if isinstance(node, pytree.Node): + return '%s(%s, %r)' % (node.__class__.__name__, NodeName(node), + [_PytreeNodeRepr(c) for c in node.children]) + if isinstance(node, pytree.Leaf): + return '%s(%s, %r)' % (node.__class__.__name__, NodeName(node), node.value) + + +def IsCommentStatement(node): + return (NodeName(node) == 'simple_stmt' and + node.children[0].type == token.COMMENT) diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/pytree_visitor.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/pytree_visitor.py new file mode 100644 index 00000000..49da0566 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/pytree_visitor.py @@ -0,0 +1,135 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Generic visitor pattern for pytrees. + +The lib2to3 parser produces a "pytree" - syntax tree consisting of Node +and Leaf types. This module implements a visitor pattern for such trees. + +It also exports a basic "dumping" visitor that dumps a textual representation of +a pytree into a stream. + + PyTreeVisitor: a generic visitor pattern fo pytrees. + PyTreeDumper: a configurable "dumper" for displaying pytrees. + DumpPyTree(): a convenience function to dump a pytree. +""" + +import sys + +from lib2to3 import pytree + +from yapf.yapflib import pytree_utils + + +class PyTreeVisitor(object): + """Visitor pattern for pytree trees. + + Methods named Visit_XXX will be invoked when a node with type XXX is + encountered in the tree. The type is either a token type (for Leaf nodes) or + grammar symbols (for Node nodes). The return value of Visit_XXX methods is + ignored by the visitor. + + Visitors can modify node contents but must not change the tree structure + (e.g. add/remove children and move nodes around). + + This is a very common visitor pattern in Python code; it's also used in the + Python standard library ast module for providing AST visitors. + + Note: this makes names that aren't style conformant, so such visitor methods + need to be marked with # pylint: disable=invalid-name We don't have a choice + here, because lib2to3 nodes have under_separated names. + + For more complex behavior, the visit, DefaultNodeVisit and DefaultLeafVisit + methods can be overridden. Don't forget to invoke DefaultNodeVisit for nodes + that may have children - otherwise the children will not be visited. + """ + + def Visit(self, node): + """Visit a node.""" + method = 'Visit_{0}'.format(pytree_utils.NodeName(node)) + if hasattr(self, method): + # Found a specific visitor for this node + getattr(self, method)(node) + else: + if isinstance(node, pytree.Leaf): + self.DefaultLeafVisit(node) + else: + self.DefaultNodeVisit(node) + + def DefaultNodeVisit(self, node): + """Default visitor for Node: visits the node's children depth-first. + + This method is invoked when no specific visitor for the node is defined. + + Arguments: + node: the node to visit + """ + for child in node.children: + self.Visit(child) + + def DefaultLeafVisit(self, leaf): + """Default visitor for Leaf: no-op. + + This method is invoked when no specific visitor for the leaf is defined. + + Arguments: + leaf: the leaf to visit + """ + pass + + +def DumpPyTree(tree, target_stream=sys.stdout): + """Convenience function for dumping a given pytree. + + This function presents a very minimal interface. For more configurability (for + example, controlling how specific node types are displayed), use PyTreeDumper + directly. + + Arguments: + tree: the tree to dump. + target_stream: the stream to dump the tree to. A file-like object. By + default will dump into stdout. + """ + dumper = PyTreeDumper(target_stream) + dumper.Visit(tree) + + +class PyTreeDumper(PyTreeVisitor): + """Visitor that dumps the tree to a stream. + + Implements the PyTreeVisitor interface. + """ + + def __init__(self, target_stream=sys.stdout): + """Create a tree dumper. + + Arguments: + target_stream: the stream to dump the tree to. A file-like object. By + default will dump into stdout. + """ + self._target_stream = target_stream + self._current_indent = 0 + + def _DumpString(self, s): + self._target_stream.write('{0}{1}\n'.format(' ' * self._current_indent, s)) + + def DefaultNodeVisit(self, node): + # Dump information about the current node, and then use the generic + # DefaultNodeVisit visitor to dump each of its children. + self._DumpString(pytree_utils.DumpNodeToString(node)) + self._current_indent += 2 + super(PyTreeDumper, self).DefaultNodeVisit(node) + self._current_indent -= 2 + + def DefaultLeafVisit(self, leaf): + self._DumpString(pytree_utils.DumpNodeToString(leaf)) diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/reformatter.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/reformatter.py new file mode 100644 index 00000000..60386e51 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/reformatter.py @@ -0,0 +1,800 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Decide what the format for the code should be. + +The `unwrapped_line.UnwrappedLine`s are now ready to be formatted. +UnwrappedLines that can be merged together are. The best formatting is returned +as a string. + + Reformat(): the main function exported by this module. +""" + +from __future__ import unicode_literals +import collections +import heapq +import re + +from lib2to3 import pytree +from lib2to3.pgen2 import token + +from yapf.yapflib import format_decision_state +from yapf.yapflib import format_token +from yapf.yapflib import line_joiner +from yapf.yapflib import pytree_utils +from yapf.yapflib import style +from yapf.yapflib import verifier + + +def Reformat(uwlines, verify=False, lines=None): + """Reformat the unwrapped lines. + + Arguments: + uwlines: (list of unwrapped_line.UnwrappedLine) Lines we want to format. + verify: (bool) True if reformatted code should be verified for syntax. + lines: (set of int) The lines which can be modified or None if there is no + line range restriction. + + Returns: + A string representing the reformatted code. + """ + final_lines = [] + prev_uwline = None # The previous line. + indent_width = style.Get('INDENT_WIDTH') + + for uwline in _SingleOrMergedLines(uwlines): + first_token = uwline.first + _FormatFirstToken(first_token, uwline.depth, prev_uwline, final_lines) + + indent_amt = indent_width * uwline.depth + state = format_decision_state.FormatDecisionState(uwline, indent_amt) + state.MoveStateToNextToken() + + if not uwline.disable: + if uwline.first.is_comment: + uwline.first.node.value = uwline.first.node.value.rstrip() + elif uwline.last.is_comment: + uwline.last.node.value = uwline.last.node.value.rstrip() + if prev_uwline and prev_uwline.disable: + # Keep the vertical spacing between a disabled and enabled formatting + # region. + _RetainRequiredVerticalSpacingBetweenTokens(uwline.first, + prev_uwline.last, lines) + if any(tok.is_comment for tok in uwline.tokens): + _RetainVerticalSpacingBeforeComments(uwline) + + if uwline.disable or _LineHasContinuationMarkers(uwline): + _RetainHorizontalSpacing(uwline) + _RetainRequiredVerticalSpacing(uwline, prev_uwline, lines) + _EmitLineUnformatted(state) + + elif (_LineContainsPylintDisableLineTooLong(uwline) or + _LineContainsI18n(uwline)): + # Don't modify vertical spacing, but fix any horizontal spacing issues. + _RetainRequiredVerticalSpacing(uwline, prev_uwline, lines) + _EmitLineUnformatted(state) + + elif _CanPlaceOnSingleLine(uwline) and not any(tok.must_split + for tok in uwline.tokens): + # The unwrapped line fits on one line. + while state.next_token: + state.AddTokenToState(newline=False, dry_run=False) + + else: + if not _AnalyzeSolutionSpace(state): + # Failsafe mode. If there isn't a solution to the line, then just emit + # it as is. + state = format_decision_state.FormatDecisionState(uwline, indent_amt) + state.MoveStateToNextToken() + _RetainHorizontalSpacing(uwline) + _RetainRequiredVerticalSpacing(uwline, prev_uwline, None) + _EmitLineUnformatted(state) + + final_lines.append(uwline) + prev_uwline = uwline + + _AlignTrailingComments(final_lines) + return _FormatFinalLines(final_lines, verify) + + +def _RetainHorizontalSpacing(uwline): + """Retain all horizontal spacing between tokens.""" + for tok in uwline.tokens: + tok.RetainHorizontalSpacing(uwline.first.column, uwline.depth) + + +def _RetainRequiredVerticalSpacing(cur_uwline, prev_uwline, lines): + """Retain all vertical spacing between lines.""" + prev_tok = None + if prev_uwline is not None: + prev_tok = prev_uwline.last + + for cur_tok in cur_uwline.tokens: + _RetainRequiredVerticalSpacingBetweenTokens(cur_tok, prev_tok, lines) + + prev_tok = cur_tok + if cur_uwline.disable: + # After the first token we are acting on a single line. So if it is + # disabled we must not reformat. + lines = set() + + +def _RetainRequiredVerticalSpacingBetweenTokens(cur_tok, prev_tok, lines): + """Retain vertical spacing between two tokens if not in editable range.""" + if prev_tok is None: + return + + if prev_tok.is_string: + prev_lineno = prev_tok.lineno + prev_tok.value.count('\n') + elif prev_tok.is_pseudo_paren: + if not prev_tok.previous_token.is_multiline_string: + prev_lineno = prev_tok.previous_token.lineno + else: + prev_lineno = prev_tok.lineno + else: + prev_lineno = prev_tok.lineno + + if cur_tok.is_comment: + cur_lineno = cur_tok.lineno - cur_tok.value.count('\n') + else: + cur_lineno = cur_tok.lineno + + if not prev_tok.is_comment and prev_tok.value.endswith('\\'): + prev_lineno += prev_tok.value.count('\n') + + required_newlines = cur_lineno - prev_lineno + if cur_tok.is_comment and not prev_tok.is_comment: + # Don't adjust between a comment and non-comment. + pass + elif lines and lines.intersection(range(prev_lineno, cur_lineno + 1)): + desired_newlines = cur_tok.whitespace_prefix.count('\n') + whitespace_lines = range(prev_lineno + 1, cur_lineno) + deletable_lines = len(lines.intersection(whitespace_lines)) + required_newlines = max(required_newlines - deletable_lines, + desired_newlines) + + cur_tok.AdjustNewlinesBefore(required_newlines) + + +def _RetainVerticalSpacingBeforeComments(uwline): + """Retain vertical spacing before comments.""" + prev_token = None + for tok in uwline.tokens: + if tok.is_comment and prev_token: + if tok.lineno - tok.value.count('\n') - prev_token.lineno > 1: + tok.AdjustNewlinesBefore(ONE_BLANK_LINE) + + prev_token = tok + + +def _EmitLineUnformatted(state): + """Emit the line without formatting. + + The line contains code that if reformatted would break a non-syntactic + convention. E.g., i18n comments and function calls are tightly bound by + convention. Instead, we calculate when / if a newline should occur and honor + that. But otherwise the code emitted will be the same as the original code. + + Arguments: + state: (format_decision_state.FormatDecisionState) The format decision + state. + """ + while state.next_token: + previous_token = state.next_token.previous_token + previous_lineno = previous_token.lineno + + if previous_token.is_multiline_string or previous_token.is_string: + previous_lineno += previous_token.value.count('\n') + + if previous_token.is_continuation: + newline = False + else: + newline = state.next_token.lineno > previous_lineno + + state.AddTokenToState(newline=newline, dry_run=False) + + +def _LineContainsI18n(uwline): + """Return true if there are i18n comments or function calls in the line. + + I18n comments and pseudo-function calls are closely related. They cannot + be moved apart without breaking i18n. + + Arguments: + uwline: (unwrapped_line.UnwrappedLine) The line currently being formatted. + + Returns: + True if the line contains i18n comments or function calls. False otherwise. + """ + if style.Get('I18N_COMMENT'): + for tok in uwline.tokens: + if tok.is_comment and re.match(style.Get('I18N_COMMENT'), tok.value): + # Contains an i18n comment. + return True + + if style.Get('I18N_FUNCTION_CALL'): + length = len(uwline.tokens) + index = 0 + while index < length - 1: + if (uwline.tokens[index + 1].value == '(' and + uwline.tokens[index].value in style.Get('I18N_FUNCTION_CALL')): + return True + index += 1 + + return False + + +def _LineContainsPylintDisableLineTooLong(uwline): + """Return true if there is a "pylint: disable=line-too-long" comment.""" + return re.search(r'\bpylint:\s+disable=line-too-long\b', uwline.last.value) + + +def _LineHasContinuationMarkers(uwline): + """Return true if the line has continuation markers in it.""" + return any(tok.is_continuation for tok in uwline.tokens) + + +def _CanPlaceOnSingleLine(uwline): + """Determine if the unwrapped line can go on a single line. + + Arguments: + uwline: (unwrapped_line.UnwrappedLine) The line currently being formatted. + + Returns: + True if the line can or should be added to a single line. False otherwise. + """ + token_names = [x.name for x in uwline.tokens] + if (style.Get('FORCE_MULTILINE_DICT') and 'LBRACE' in token_names): + return False + indent_amt = style.Get('INDENT_WIDTH') * uwline.depth + last = uwline.last + last_index = -1 + if (last.is_pylint_comment or last.is_pytype_comment or + last.is_copybara_comment): + last = last.previous_token + last_index = -2 + if last is None: + return True + return (last.total_length + indent_amt <= style.Get('COLUMN_LIMIT') and + not any(tok.is_comment for tok in uwline.tokens[:last_index])) + + +def _AlignTrailingComments(final_lines): + """Align trailing comments to the same column.""" + final_lines_index = 0 + while final_lines_index < len(final_lines): + line = final_lines[final_lines_index] + assert line.tokens + + processed_content = False + + for tok in line.tokens: + if (tok.is_comment and isinstance(tok.spaces_required_before, list) and + tok.value.startswith('#')): + # All trailing comments and comments that appear on a line by themselves + # in this block should be indented at the same level. The block is + # terminated by an empty line or EOF. Enumerate through each line in + # the block and calculate the max line length. Once complete, use the + # first col value greater than that value and create the necessary for + # each line accordingly. + all_pc_line_lengths = [] # All pre-comment line lengths + max_line_length = 0 + + while True: + # EOF + if final_lines_index + len(all_pc_line_lengths) == len(final_lines): + break + + this_line = final_lines[final_lines_index + len(all_pc_line_lengths)] + + # Blank line - note that content is preformatted so we don't need to + # worry about spaces/tabs; a blank line will always be '\n\n'. + assert this_line.tokens + if (all_pc_line_lengths and + this_line.tokens[0].formatted_whitespace_prefix.startswith('\n\n') + ): + break + + if this_line.disable: + all_pc_line_lengths.append([]) + continue + + # Calculate the length of each line in this unwrapped line. + line_content = '' + pc_line_lengths = [] + + for line_tok in this_line.tokens: + whitespace_prefix = line_tok.formatted_whitespace_prefix + + newline_index = whitespace_prefix.rfind('\n') + if newline_index != -1: + max_line_length = max(max_line_length, len(line_content)) + line_content = '' + + whitespace_prefix = whitespace_prefix[newline_index + 1:] + + if line_tok.is_comment: + pc_line_lengths.append(len(line_content)) + else: + line_content += '{}{}'.format(whitespace_prefix, line_tok.value) + + if pc_line_lengths: + max_line_length = max(max_line_length, max(pc_line_lengths)) + + all_pc_line_lengths.append(pc_line_lengths) + + # Calculate the aligned column value + max_line_length += 2 + + aligned_col = None + for potential_col in tok.spaces_required_before: + if potential_col > max_line_length: + aligned_col = potential_col + break + + if aligned_col is None: + aligned_col = max_line_length + + # Update the comment token values based on the aligned values + for all_pc_line_lengths_index, pc_line_lengths in enumerate( + all_pc_line_lengths): + if not pc_line_lengths: + continue + + this_line = final_lines[final_lines_index + all_pc_line_lengths_index] + + pc_line_length_index = 0 + for line_tok in this_line.tokens: + if line_tok.is_comment: + assert pc_line_length_index < len(pc_line_lengths) + assert pc_line_lengths[pc_line_length_index] < aligned_col + + # Note that there may be newlines embedded in the comments, so + # we need to apply a whitespace prefix to each line. + whitespace = ' ' * ( + aligned_col - pc_line_lengths[pc_line_length_index] - 1) + pc_line_length_index += 1 + + line_content = [] + + for comment_line_index, comment_line in enumerate( + line_tok.value.split('\n')): + line_content.append('{}{}'.format(whitespace, + comment_line.strip())) + + if comment_line_index == 0: + whitespace = ' ' * (aligned_col - 1) + + line_content = '\n'.join(line_content) + + # Account for initial whitespace already slated for the + # beginning of the line. + existing_whitespace_prefix = \ + line_tok.formatted_whitespace_prefix.lstrip('\n') + + if line_content.startswith(existing_whitespace_prefix): + line_content = line_content[len(existing_whitespace_prefix):] + + line_tok.value = line_content + + assert pc_line_length_index == len(pc_line_lengths) + + final_lines_index += len(all_pc_line_lengths) + + processed_content = True + break + + if not processed_content: + final_lines_index += 1 + + +def _FormatFinalLines(final_lines, verify): + """Compose the final output from the finalized lines.""" + formatted_code = [] + for line in final_lines: + formatted_line = [] + for tok in line.tokens: + if not tok.is_pseudo_paren: + formatted_line.append(tok.formatted_whitespace_prefix) + formatted_line.append(tok.value) + else: + if (not tok.next_token.whitespace_prefix.startswith('\n') and + not tok.next_token.whitespace_prefix.startswith(' ')): + if (tok.previous_token.value == ':' or + tok.next_token.value not in ',}])'): + formatted_line.append(' ') + + formatted_code.append(''.join(formatted_line)) + if verify: + verifier.VerifyCode(formatted_code[-1]) + + return ''.join(formatted_code) + '\n' + + +class _StateNode(object): + """An edge in the solution space from 'previous.state' to 'state'. + + Attributes: + state: (format_decision_state.FormatDecisionState) The format decision state + for this node. + newline: If True, then on the edge from 'previous.state' to 'state' a + newline is inserted. + previous: (_StateNode) The previous state node in the graph. + """ + + # TODO(morbo): Add a '__cmp__' method. + + def __init__(self, state, newline, previous): + self.state = state.Clone() + self.newline = newline + self.previous = previous + + def __repr__(self): # pragma: no cover + return 'StateNode(state=[\n{0}\n], newline={1})'.format( + self.state, self.newline) + + +# A tuple of (penalty, count) that is used to prioritize the BFS. In case of +# equal penalties, we prefer states that were inserted first. During state +# generation, we make sure that we insert states first that break the line as +# late as possible. +_OrderedPenalty = collections.namedtuple('OrderedPenalty', ['penalty', 'count']) + +# An item in the prioritized BFS search queue. The 'StateNode's 'state' has +# the given '_OrderedPenalty'. +_QueueItem = collections.namedtuple('QueueItem', + ['ordered_penalty', 'state_node']) + + +def _AnalyzeSolutionSpace(initial_state): + """Analyze the entire solution space starting from initial_state. + + This implements a variant of Dijkstra's algorithm on the graph that spans + the solution space (LineStates are the nodes). The algorithm tries to find + the shortest path (the one with the lowest penalty) from 'initial_state' to + the state where all tokens are placed. + + Arguments: + initial_state: (format_decision_state.FormatDecisionState) The initial state + to start the search from. + + Returns: + True if a formatting solution was found. False otherwise. + """ + count = 0 + seen = set() + p_queue = [] + + # Insert start element. + node = _StateNode(initial_state, False, None) + heapq.heappush(p_queue, _QueueItem(_OrderedPenalty(0, count), node)) + + count += 1 + while p_queue: + item = p_queue[0] + penalty = item.ordered_penalty.penalty + node = item.state_node + if not node.state.next_token: + break + heapq.heappop(p_queue) + + if count > 10000: + node.state.ignore_stack_for_comparison = True + + if node.state in seen: + continue + + seen.add(node.state) + + # FIXME(morbo): Add a 'decision' element? + + count = _AddNextStateToQueue(penalty, node, False, count, p_queue) + count = _AddNextStateToQueue(penalty, node, True, count, p_queue) + + if not p_queue: + # We weren't able to find a solution. Do nothing. + return False + + _ReconstructPath(initial_state, heapq.heappop(p_queue).state_node) + return True + + +def _AddNextStateToQueue(penalty, previous_node, newline, count, p_queue): + """Add the following state to the analysis queue. + + Assume the current state is 'previous_node' and has been reached with a + penalty of 'penalty'. Insert a line break if 'newline' is True. + + Arguments: + penalty: (int) The penalty associated with the path up to this point. + previous_node: (_StateNode) The last _StateNode inserted into the priority + queue. + newline: (bool) Add a newline if True. + count: (int) The number of elements in the queue. + p_queue: (heapq) The priority queue representing the solution space. + + Returns: + The updated number of elements in the queue. + """ + must_split = previous_node.state.MustSplit() + if newline and not previous_node.state.CanSplit(must_split): + # Don't add a newline if the token cannot be split. + return count + if not newline and must_split: + # Don't add a token we must split but where we aren't splitting. + return count + + node = _StateNode(previous_node.state, newline, previous_node) + penalty += node.state.AddTokenToState( + newline=newline, dry_run=True, must_split=must_split) + heapq.heappush(p_queue, _QueueItem(_OrderedPenalty(penalty, count), node)) + return count + 1 + + +def _ReconstructPath(initial_state, current): + """Reconstruct the path through the queue with lowest penalty. + + Arguments: + initial_state: (format_decision_state.FormatDecisionState) The initial state + to start the search from. + current: (_StateNode) The node in the decision graph that is the end point + of the path with the least penalty. + """ + path = collections.deque() + + while current.previous: + path.appendleft(current) + current = current.previous + + for node in path: + initial_state.AddTokenToState(newline=node.newline, dry_run=False) + + +NESTED_DEPTH = [] + + +def _FormatFirstToken(first_token, indent_depth, prev_uwline, final_lines): + """Format the first token in the unwrapped line. + + Add a newline and the required indent before the first token of the unwrapped + line. + + Arguments: + first_token: (format_token.FormatToken) The first token in the unwrapped + line. + indent_depth: (int) The line's indentation depth. + prev_uwline: (list of unwrapped_line.UnwrappedLine) The unwrapped line + previous to this line. + final_lines: (list of unwrapped_line.UnwrappedLine) The unwrapped lines + that have already been processed. + """ + global NESTED_DEPTH + while NESTED_DEPTH and NESTED_DEPTH[-1] > indent_depth: + NESTED_DEPTH.pop() + + first_nested = False + if _IsClassOrDef(first_token): + if not NESTED_DEPTH: + NESTED_DEPTH = [indent_depth] + elif NESTED_DEPTH[-1] < indent_depth: + first_nested = True + NESTED_DEPTH.append(indent_depth) + + first_token.AddWhitespacePrefix( + _CalculateNumberOfNewlines(first_token, indent_depth, prev_uwline, + final_lines, first_nested), + indent_level=indent_depth) + + +NO_BLANK_LINES = 1 +ONE_BLANK_LINE = 2 +TWO_BLANK_LINES = 3 + + +def _IsClassOrDef(tok): + if tok.value in {'class', 'def', '@'}: + return True + return (tok.next_token and tok.value == 'async' and + tok.next_token.value == 'def') + + +def _CalculateNumberOfNewlines(first_token, indent_depth, prev_uwline, + final_lines, first_nested): + """Calculate the number of newlines we need to add. + + Arguments: + first_token: (format_token.FormatToken) The first token in the unwrapped + line. + indent_depth: (int) The line's indentation depth. + prev_uwline: (list of unwrapped_line.UnwrappedLine) The unwrapped line + previous to this line. + final_lines: (list of unwrapped_line.UnwrappedLine) The unwrapped lines + that have already been processed. + first_nested: (boolean) Whether this is the first nested class or function. + + Returns: + The number of newlines needed before the first token. + """ + # TODO(morbo): Special handling for imports. + # TODO(morbo): Create a knob that can tune these. + if prev_uwline is None: + # The first line in the file. Don't add blank lines. + # FIXME(morbo): Is this correct? + if first_token.newlines is not None: + pytree_utils.SetNodeAnnotation(first_token.node, + pytree_utils.Annotation.NEWLINES, None) + return 0 + + if first_token.is_docstring: + if (prev_uwline.first.value == 'class' and + style.Get('BLANK_LINE_BEFORE_CLASS_DOCSTRING')): + # Enforce a blank line before a class's docstring. + return ONE_BLANK_LINE + elif (prev_uwline.first.value.startswith('#') and + style.Get('BLANK_LINE_BEFORE_MODULE_DOCSTRING')): + # Enforce a blank line before a module's docstring. + return ONE_BLANK_LINE + # The docstring shouldn't have a newline before it. + return NO_BLANK_LINES + + if first_token.is_name and not indent_depth: + if (prev_uwline.first.value == 'from' or + prev_uwline.first.value == 'import'): + # Support custom number of blank lines between top-level imports and + # variable definitions. + return 1 + style.Get( + 'BLANK_LINES_BETWEEN_TOP_LEVEL_IMPORTS_AND_VARIABLES') + + prev_last_token = prev_uwline.last + if prev_last_token.is_docstring: + if (not indent_depth and first_token.value in {'class', 'def', 'async'}): + # Separate a class or function from the module-level docstring with + # appropriate number of blank lines. + return 1 + style.Get('BLANK_LINES_AROUND_TOP_LEVEL_DEFINITION') + if (first_nested and + not style.Get('BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF') and + _IsClassOrDef(first_token)): + pytree_utils.SetNodeAnnotation(first_token.node, + pytree_utils.Annotation.NEWLINES, None) + return NO_BLANK_LINES + if _NoBlankLinesBeforeCurrentToken(prev_last_token.value, first_token, + prev_last_token): + return NO_BLANK_LINES + else: + return ONE_BLANK_LINE + + if _IsClassOrDef(first_token): + # TODO(morbo): This can go once the blank line calculator is more + # sophisticated. + if not indent_depth: + # This is a top-level class or function. + is_inline_comment = prev_last_token.whitespace_prefix.count('\n') == 0 + if (not prev_uwline.disable and prev_last_token.is_comment and + not is_inline_comment): + # This token follows a non-inline comment. + if _NoBlankLinesBeforeCurrentToken(prev_last_token.value, first_token, + prev_last_token): + # Assume that the comment is "attached" to the current line. + # Therefore, we want two blank lines before the comment. + index = len(final_lines) - 1 + while index > 0: + if not final_lines[index - 1].is_comment: + break + index -= 1 + if final_lines[index - 1].first.value == '@': + final_lines[index].first.AdjustNewlinesBefore(NO_BLANK_LINES) + else: + prev_last_token.AdjustNewlinesBefore( + 1 + style.Get('BLANK_LINES_AROUND_TOP_LEVEL_DEFINITION')) + if first_token.newlines is not None: + pytree_utils.SetNodeAnnotation(first_token.node, + pytree_utils.Annotation.NEWLINES, + None) + return NO_BLANK_LINES + elif _IsClassOrDef(prev_uwline.first): + if first_nested and not style.Get( + 'BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF'): + pytree_utils.SetNodeAnnotation(first_token.node, + pytree_utils.Annotation.NEWLINES, None) + return NO_BLANK_LINES + + # Calculate how many newlines were between the original lines. We want to + # retain that formatting if it doesn't violate one of the style guide rules. + if first_token.is_comment: + first_token_lineno = first_token.lineno - first_token.value.count('\n') + else: + first_token_lineno = first_token.lineno + + prev_last_token_lineno = prev_last_token.lineno + if prev_last_token.is_multiline_string: + prev_last_token_lineno += prev_last_token.value.count('\n') + + if first_token_lineno - prev_last_token_lineno > 1: + return ONE_BLANK_LINE + + return NO_BLANK_LINES + + +def _SingleOrMergedLines(uwlines): + """Generate the lines we want to format. + + Arguments: + uwlines: (list of unwrapped_line.UnwrappedLine) Lines we want to format. + + Yields: + Either a single line, if the current line cannot be merged with the + succeeding line, or the next two lines merged into one line. + """ + index = 0 + last_was_merged = False + while index < len(uwlines): + if uwlines[index].disable: + uwline = uwlines[index] + index += 1 + while index < len(uwlines): + column = uwline.last.column + 2 + if uwlines[index].lineno != uwline.lineno: + break + if uwline.last.value != ':': + leaf = pytree.Leaf( + type=token.SEMI, value=';', context=('', (uwline.lineno, column))) + uwline.AppendToken(format_token.FormatToken(leaf)) + for tok in uwlines[index].tokens: + uwline.AppendToken(tok) + index += 1 + yield uwline + elif line_joiner.CanMergeMultipleLines(uwlines[index:], last_was_merged): + # TODO(morbo): This splice is potentially very slow. Come up with a more + # performance-friendly way of determining if two lines can be merged. + next_uwline = uwlines[index + 1] + for tok in next_uwline.tokens: + uwlines[index].AppendToken(tok) + if (len(next_uwline.tokens) == 1 and + next_uwline.first.is_multiline_string): + # This may be a multiline shebang. In that case, we want to retain the + # formatting. Otherwise, it could mess up the shell script's syntax. + uwlines[index].disable = True + yield uwlines[index] + index += 2 + last_was_merged = True + else: + yield uwlines[index] + index += 1 + last_was_merged = False + + +def _NoBlankLinesBeforeCurrentToken(text, cur_token, prev_token): + """Determine if there are no blank lines before the current token. + + The previous token is a docstring or comment. The prev_token_lineno is the + start of the text of that token. Counting the number of newlines in its text + gives us the extent and thus where the line number of the end of the + docstring or comment. After that, we just compare it to the current token's + line number to see if there are blank lines between them. + + Arguments: + text: (unicode) The text of the docstring or comment before the current + token. + cur_token: (format_token.FormatToken) The current token in the unwrapped + line. + prev_token: (format_token.FormatToken) The previous token in the unwrapped + line. + + Returns: + True if there is no blank line before the current token. + """ + cur_token_lineno = cur_token.lineno + if cur_token.is_comment: + cur_token_lineno -= cur_token.value.count('\n') + num_newlines = text.count('\n') if not prev_token.is_comment else 0 + return prev_token.lineno + num_newlines == cur_token_lineno - 1 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/split_penalty.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/split_penalty.py new file mode 100644 index 00000000..d4c3dc47 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/split_penalty.py @@ -0,0 +1,629 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Computation of split penalties before/between tokens.""" + +import re + +from lib2to3 import pytree + +from yapf.yapflib import format_token +from yapf.yapflib import py3compat +from yapf.yapflib import pytree_utils +from yapf.yapflib import pytree_visitor +from yapf.yapflib import style + +# TODO(morbo): Document the annotations in a centralized place. E.g., the +# README file. +UNBREAKABLE = 1000 * 1000 +NAMED_ASSIGN = 15000 +DOTTED_NAME = 4000 +VERY_STRONGLY_CONNECTED = 3500 +STRONGLY_CONNECTED = 3000 +CONNECTED = 500 +TOGETHER = 100 + +OR_TEST = 1000 +AND_TEST = 1100 +NOT_TEST = 1200 +COMPARISON = 1300 +STAR_EXPR = 1300 +EXPR = 1400 +XOR_EXPR = 1500 +AND_EXPR = 1700 +SHIFT_EXPR = 1800 +ARITH_EXPR = 1900 +TERM = 2000 +FACTOR = 2100 +POWER = 2200 +ATOM = 2300 +ONE_ELEMENT_ARGUMENT = 500 +SUBSCRIPT = 6000 + + +def ComputeSplitPenalties(tree): + """Compute split penalties on tokens in the given parse tree. + + Arguments: + tree: the top-level pytree node to annotate with penalties. + """ + _SplitPenaltyAssigner().Visit(tree) + + +class _SplitPenaltyAssigner(pytree_visitor.PyTreeVisitor): + """Assigns split penalties to tokens, based on parse tree structure. + + Split penalties are attached as annotations to tokens. + """ + + def Visit(self, node): + if not hasattr(node, 'is_pseudo'): # Ignore pseudo tokens. + super(_SplitPenaltyAssigner, self).Visit(node) + + def Visit_import_as_names(self, node): # pyline: disable=invalid-name + # import_as_names ::= import_as_name (',' import_as_name)* [','] + self.DefaultNodeVisit(node) + prev_child = None + for child in node.children: + if (prev_child and isinstance(prev_child, pytree.Leaf) and + prev_child.value == ','): + _SetSplitPenalty(child, style.Get('SPLIT_PENALTY_IMPORT_NAMES')) + prev_child = child + + def Visit_classdef(self, node): # pylint: disable=invalid-name + # classdef ::= 'class' NAME ['(' [arglist] ')'] ':' suite + # + # NAME + _SetUnbreakable(node.children[1]) + if len(node.children) > 4: + # opening '(' + _SetUnbreakable(node.children[2]) + # ':' + _SetUnbreakable(node.children[-2]) + self.DefaultNodeVisit(node) + + def Visit_funcdef(self, node): # pylint: disable=invalid-name + # funcdef ::= 'def' NAME parameters ['->' test] ':' suite + # + # Can't break before the function name and before the colon. The parameters + # are handled by child iteration. + colon_idx = 1 + while pytree_utils.NodeName(node.children[colon_idx]) == 'simple_stmt': + colon_idx += 1 + _SetUnbreakable(node.children[colon_idx]) + arrow_idx = -1 + while colon_idx < len(node.children): + if isinstance(node.children[colon_idx], pytree.Leaf): + if node.children[colon_idx].value == ':': + break + if node.children[colon_idx].value == '->': + arrow_idx = colon_idx + colon_idx += 1 + _SetUnbreakable(node.children[colon_idx]) + self.DefaultNodeVisit(node) + if arrow_idx > 0: + _SetSplitPenalty( + pytree_utils.LastLeafNode(node.children[arrow_idx - 1]), 0) + _SetUnbreakable(node.children[arrow_idx]) + _SetStronglyConnected(node.children[arrow_idx + 1]) + + def Visit_lambdef(self, node): # pylint: disable=invalid-name + # lambdef ::= 'lambda' [varargslist] ':' test + # Loop over the lambda up to and including the colon. + allow_multiline_lambdas = style.Get('ALLOW_MULTILINE_LAMBDAS') + if not allow_multiline_lambdas: + for child in node.children: + if pytree_utils.NodeName(child) == 'COMMENT': + if re.search(r'pylint:.*disable=.*\bg-long-lambda', child.value): + allow_multiline_lambdas = True + break + + if allow_multiline_lambdas: + _SetExpressionPenalty(node, STRONGLY_CONNECTED) + else: + _SetExpressionPenalty(node, VERY_STRONGLY_CONNECTED) + + def Visit_parameters(self, node): # pylint: disable=invalid-name + # parameters ::= '(' [typedargslist] ')' + self.DefaultNodeVisit(node) + + # Can't break before the opening paren of a parameter list. + _SetUnbreakable(node.children[0]) + if not (style.Get('INDENT_CLOSING_BRACKETS') or + style.Get('DEDENT_CLOSING_BRACKETS')): + _SetStronglyConnected(node.children[-1]) + + def Visit_arglist(self, node): # pylint: disable=invalid-name + # arglist ::= argument (',' argument)* [','] + if pytree_utils.NodeName(node.children[0]) == 'STAR': + # Python 3 treats a star expression as a specific expression type. + # Process it in that method. + self.Visit_star_expr(node) + return + + self.DefaultNodeVisit(node) + + for index in py3compat.range(1, len(node.children)): + child = node.children[index] + if isinstance(child, pytree.Leaf) and child.value == ',': + _SetUnbreakable(child) + + for child in node.children: + if pytree_utils.NodeName(child) == 'atom': + _IncreasePenalty(child, CONNECTED) + + def Visit_argument(self, node): # pylint: disable=invalid-name + # argument ::= test [comp_for] | test '=' test # Really [keyword '='] test + self.DefaultNodeVisit(node) + + for index in py3compat.range(1, len(node.children) - 1): + child = node.children[index] + if isinstance(child, pytree.Leaf) and child.value == '=': + _SetSplitPenalty( + pytree_utils.FirstLeafNode(node.children[index]), NAMED_ASSIGN) + _SetSplitPenalty( + pytree_utils.FirstLeafNode(node.children[index + 1]), NAMED_ASSIGN) + + def Visit_tname(self, node): # pylint: disable=invalid-name + # tname ::= NAME [':' test] + self.DefaultNodeVisit(node) + + for index in py3compat.range(1, len(node.children) - 1): + child = node.children[index] + if isinstance(child, pytree.Leaf) and child.value == ':': + _SetSplitPenalty( + pytree_utils.FirstLeafNode(node.children[index]), NAMED_ASSIGN) + _SetSplitPenalty( + pytree_utils.FirstLeafNode(node.children[index + 1]), NAMED_ASSIGN) + + def Visit_dotted_name(self, node): # pylint: disable=invalid-name + # dotted_name ::= NAME ('.' NAME)* + for child in node.children: + self.Visit(child) + start = 2 if hasattr(node.children[0], 'is_pseudo') else 1 + for i in py3compat.range(start, len(node.children)): + _SetUnbreakable(node.children[i]) + + def Visit_dictsetmaker(self, node): # pylint: disable=invalid-name + # dictsetmaker ::= ( (test ':' test + # (comp_for | (',' test ':' test)* [','])) | + # (test (comp_for | (',' test)* [','])) ) + for child in node.children: + self.Visit(child) + if pytree_utils.NodeName(child) == 'COLON': + # This is a key to a dictionary. We don't want to split the key if at + # all possible. + _SetStronglyConnected(child) + + def Visit_trailer(self, node): # pylint: disable=invalid-name + # trailer ::= '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME + if node.children[0].value == '.': + before = style.Get('SPLIT_BEFORE_DOT') + _SetSplitPenalty(node.children[0], + VERY_STRONGLY_CONNECTED if before else DOTTED_NAME) + _SetSplitPenalty(node.children[1], + DOTTED_NAME if before else VERY_STRONGLY_CONNECTED) + elif len(node.children) == 2: + # Don't split an empty argument list if at all possible. + _SetSplitPenalty(node.children[1], VERY_STRONGLY_CONNECTED) + elif len(node.children) == 3: + name = pytree_utils.NodeName(node.children[1]) + if name in {'argument', 'comparison'}: + # Don't split an argument list with one element if at all possible. + _SetStronglyConnected(node.children[1]) + if (len(node.children[1].children) > 1 and + pytree_utils.NodeName(node.children[1].children[1]) == 'comp_for'): + # Don't penalize splitting before a comp_for expression. + _SetSplitPenalty(pytree_utils.FirstLeafNode(node.children[1]), 0) + else: + _SetSplitPenalty( + pytree_utils.FirstLeafNode(node.children[1]), + ONE_ELEMENT_ARGUMENT) + elif (pytree_utils.NodeName(node.children[0]) == 'LSQB' and + len(node.children[1].children) > 2 and + (name.endswith('_test') or name.endswith('_expr'))): + _SetStronglyConnected(node.children[1].children[0]) + _SetStronglyConnected(node.children[1].children[2]) + + # Still allow splitting around the operator. + split_before = ((name.endswith('_test') and + style.Get('SPLIT_BEFORE_LOGICAL_OPERATOR')) or + (name.endswith('_expr') and + style.Get('SPLIT_BEFORE_BITWISE_OPERATOR'))) + if split_before: + _SetSplitPenalty( + pytree_utils.LastLeafNode(node.children[1].children[1]), 0) + else: + _SetSplitPenalty( + pytree_utils.FirstLeafNode(node.children[1].children[2]), 0) + + # Don't split the ending bracket of a subscript list. + _RecAnnotate(node.children[-1], pytree_utils.Annotation.SPLIT_PENALTY, + VERY_STRONGLY_CONNECTED) + elif name not in { + 'arglist', 'argument', 'term', 'or_test', 'and_test', 'comparison', + 'atom', 'power' + }: + # Don't split an argument list with one element if at all possible. + subtypes = pytree_utils.GetNodeAnnotation( + pytree_utils.FirstLeafNode(node), pytree_utils.Annotation.SUBTYPE) + if subtypes and format_token.Subtype.SUBSCRIPT_BRACKET in subtypes: + _IncreasePenalty(node, SUBSCRIPT) + + # Bump up the split penalty for the first part of a subscript. We + # would rather not split there. + _IncreasePenalty(node.children[1], CONNECTED) + else: + _SetStronglyConnected(node.children[1], node.children[2]) + + if name == 'arglist': + _SetStronglyConnected(node.children[-1]) + + self.DefaultNodeVisit(node) + + def Visit_power(self, node): # pylint: disable=invalid-name,missing-docstring + # power ::= atom trailer* ['**' factor] + self.DefaultNodeVisit(node) + + # When atom is followed by a trailer, we can not break between them. + # E.g. arr[idx] - no break allowed between 'arr' and '['. + if (len(node.children) > 1 and + pytree_utils.NodeName(node.children[1]) == 'trailer'): + # children[1] itself is a whole trailer: we don't want to + # mark all of it as unbreakable, only its first token: (, [ or . + first = pytree_utils.FirstLeafNode(node.children[1]) + if first.value != '.': + _SetUnbreakable(node.children[1].children[0]) + + # A special case when there are more trailers in the sequence. Given: + # atom tr1 tr2 + # The last token of tr1 and the first token of tr2 comprise an unbreakable + # region. For example: foo.bar.baz(1) + # We can't put breaks between either of the '.', '(', or '[' and the names + # *preceding* them. + prev_trailer_idx = 1 + while prev_trailer_idx < len(node.children) - 1: + cur_trailer_idx = prev_trailer_idx + 1 + cur_trailer = node.children[cur_trailer_idx] + if pytree_utils.NodeName(cur_trailer) != 'trailer': + break + + # Now we know we have two trailers one after the other + prev_trailer = node.children[prev_trailer_idx] + if prev_trailer.children[-1].value != ')': + # Set the previous node unbreakable if it's not a function call: + # atom tr1() tr2 + # It may be necessary (though undesirable) to split up a previous + # function call's parentheses to the next line. + _SetStronglyConnected(prev_trailer.children[-1]) + _SetStronglyConnected(cur_trailer.children[0]) + prev_trailer_idx = cur_trailer_idx + + # We don't want to split before the last ')' of a function call. This also + # takes care of the special case of: + # atom tr1 tr2 ... trn + # where the 'tr#' are trailers that may end in a ')'. + for trailer in node.children[1:]: + if pytree_utils.NodeName(trailer) != 'trailer': + break + if trailer.children[0].value in '([': + if len(trailer.children) > 2: + subtypes = pytree_utils.GetNodeAnnotation( + trailer.children[0], pytree_utils.Annotation.SUBTYPE) + if subtypes and format_token.Subtype.SUBSCRIPT_BRACKET in subtypes: + _SetStronglyConnected( + pytree_utils.FirstLeafNode(trailer.children[1])) + + last_child_node = pytree_utils.LastLeafNode(trailer) + if last_child_node.value.strip().startswith('#'): + last_child_node = last_child_node.prev_sibling + if not (style.Get('INDENT_CLOSING_BRACKETS') or + style.Get('DEDENT_CLOSING_BRACKETS')): + last = pytree_utils.LastLeafNode(last_child_node.prev_sibling) + if last.value != ',': + if last_child_node.value == ']': + _SetUnbreakable(last_child_node) + else: + _SetSplitPenalty(last_child_node, VERY_STRONGLY_CONNECTED) + else: + # If the trailer's children are '()', then make it a strongly + # connected region. It's sometimes necessary, though undesirable, to + # split the two. + _SetStronglyConnected(trailer.children[-1]) + + def Visit_subscriptlist(self, node): # pylint: disable=invalid-name + # subscriptlist ::= subscript (',' subscript)* [','] + self.DefaultNodeVisit(node) + _SetSplitPenalty(pytree_utils.FirstLeafNode(node), 0) + prev_child = None + for child in node.children: + if prev_child and pytree_utils.NodeName(prev_child) == 'COMMA': + _SetSplitPenalty(pytree_utils.FirstLeafNode(child), 0) + prev_child = child + + def Visit_subscript(self, node): # pylint: disable=invalid-name + # subscript ::= test | [test] ':' [test] [sliceop] + _SetStronglyConnected(*node.children) + self.DefaultNodeVisit(node) + + def Visit_comp_for(self, node): # pylint: disable=invalid-name + # comp_for ::= 'for' exprlist 'in' testlist_safe [comp_iter] + _SetSplitPenalty(pytree_utils.FirstLeafNode(node), 0) + _SetStronglyConnected(*node.children[1:]) + self.DefaultNodeVisit(node) + + def Visit_old_comp_for(self, node): # pylint: disable=invalid-name + # Python 3.7 + self.Visit_comp_for(node) + + def Visit_comp_if(self, node): # pylint: disable=invalid-name + # comp_if ::= 'if' old_test [comp_iter] + _SetSplitPenalty(node.children[0], + style.Get('SPLIT_PENALTY_BEFORE_IF_EXPR')) + _SetStronglyConnected(*node.children[1:]) + self.DefaultNodeVisit(node) + + def Visit_old_comp_if(self, node): # pylint: disable=invalid-name + # Python 3.7 + self.Visit_comp_if(node) + + def Visit_test(self, node): # pylint: disable=invalid-name + # test ::= or_test ['if' or_test 'else' test] | lambdef + _IncreasePenalty(node, OR_TEST) + self.DefaultNodeVisit(node) + + def Visit_or_test(self, node): # pylint: disable=invalid-name + # or_test ::= and_test ('or' and_test)* + self.DefaultNodeVisit(node) + _IncreasePenalty(node, OR_TEST) + index = 1 + while index + 1 < len(node.children): + if style.Get('SPLIT_BEFORE_LOGICAL_OPERATOR'): + _DecrementSplitPenalty( + pytree_utils.FirstLeafNode(node.children[index]), OR_TEST) + else: + _DecrementSplitPenalty( + pytree_utils.FirstLeafNode(node.children[index + 1]), OR_TEST) + index += 2 + + def Visit_and_test(self, node): # pylint: disable=invalid-name + # and_test ::= not_test ('and' not_test)* + self.DefaultNodeVisit(node) + _IncreasePenalty(node, AND_TEST) + index = 1 + while index + 1 < len(node.children): + if style.Get('SPLIT_BEFORE_LOGICAL_OPERATOR'): + _DecrementSplitPenalty( + pytree_utils.FirstLeafNode(node.children[index]), AND_TEST) + else: + _DecrementSplitPenalty( + pytree_utils.FirstLeafNode(node.children[index + 1]), AND_TEST) + index += 2 + + def Visit_not_test(self, node): # pylint: disable=invalid-name + # not_test ::= 'not' not_test | comparison + self.DefaultNodeVisit(node) + _IncreasePenalty(node, NOT_TEST) + + def Visit_comparison(self, node): # pylint: disable=invalid-name + # comparison ::= expr (comp_op expr)* + self.DefaultNodeVisit(node) + if len(node.children) == 3 and _StronglyConnectedCompOp(node): + _IncreasePenalty(node.children[1], VERY_STRONGLY_CONNECTED) + _SetSplitPenalty( + pytree_utils.FirstLeafNode(node.children[2]), STRONGLY_CONNECTED) + else: + _IncreasePenalty(node, COMPARISON) + + def Visit_star_expr(self, node): # pylint: disable=invalid-name + # star_expr ::= '*' expr + self.DefaultNodeVisit(node) + _IncreasePenalty(node, STAR_EXPR) + + def Visit_expr(self, node): # pylint: disable=invalid-name + # expr ::= xor_expr ('|' xor_expr)* + self.DefaultNodeVisit(node) + _IncreasePenalty(node, EXPR) + _SetBitwiseOperandPenalty(node, '|') + + def Visit_xor_expr(self, node): # pylint: disable=invalid-name + # xor_expr ::= and_expr ('^' and_expr)* + self.DefaultNodeVisit(node) + _IncreasePenalty(node, XOR_EXPR) + _SetBitwiseOperandPenalty(node, '^') + + def Visit_and_expr(self, node): # pylint: disable=invalid-name + # and_expr ::= shift_expr ('&' shift_expr)* + self.DefaultNodeVisit(node) + _IncreasePenalty(node, AND_EXPR) + _SetBitwiseOperandPenalty(node, '&') + + def Visit_shift_expr(self, node): # pylint: disable=invalid-name + # shift_expr ::= arith_expr (('<<'|'>>') arith_expr)* + self.DefaultNodeVisit(node) + _IncreasePenalty(node, SHIFT_EXPR) + + _ARITH_OPS = frozenset({'PLUS', 'MINUS'}) + + def Visit_arith_expr(self, node): # pylint: disable=invalid-name + # arith_expr ::= term (('+'|'-') term)* + self.DefaultNodeVisit(node) + _IncreasePenalty(node, ARITH_EXPR) + _SetExpressionOperandPenalty(node, self._ARITH_OPS) + + _TERM_OPS = frozenset({'STAR', 'AT', 'SLASH', 'PERCENT', 'DOUBLESLASH'}) + + def Visit_term(self, node): # pylint: disable=invalid-name + # term ::= factor (('*'|'@'|'/'|'%'|'//') factor)* + self.DefaultNodeVisit(node) + _IncreasePenalty(node, TERM) + _SetExpressionOperandPenalty(node, self._TERM_OPS) + + def Visit_factor(self, node): # pyline: disable=invalid-name + # factor ::= ('+'|'-'|'~') factor | power + self.DefaultNodeVisit(node) + _IncreasePenalty(node, FACTOR) + + def Visit_atom(self, node): # pylint: disable=invalid-name + # atom ::= ('(' [yield_expr|testlist_gexp] ')' + # '[' [listmaker] ']' | + # '{' [dictsetmaker] '}') + self.DefaultNodeVisit(node) + if (node.children[0].value == '(' and + not hasattr(node.children[0], 'is_pseudo')): + if node.children[-1].value == ')': + if pytree_utils.NodeName(node.parent) == 'if_stmt': + _SetSplitPenalty(node.children[-1], STRONGLY_CONNECTED) + else: + if len(node.children) > 2: + _SetSplitPenalty(pytree_utils.FirstLeafNode(node.children[1]), EXPR) + _SetSplitPenalty(node.children[-1], ATOM) + elif node.children[0].value in '[{' and len(node.children) == 2: + # Keep empty containers together if we can. + _SetUnbreakable(node.children[-1]) + + def Visit_testlist_gexp(self, node): # pylint: disable=invalid-name + self.DefaultNodeVisit(node) + prev_was_comma = False + for child in node.children: + if isinstance(child, pytree.Leaf) and child.value == ',': + _SetUnbreakable(child) + prev_was_comma = True + else: + if prev_was_comma: + _SetSplitPenalty(pytree_utils.FirstLeafNode(child), TOGETHER) + prev_was_comma = False + + +def _SetUnbreakable(node): + """Set an UNBREAKABLE penalty annotation for the given node.""" + _RecAnnotate(node, pytree_utils.Annotation.SPLIT_PENALTY, UNBREAKABLE) + + +def _SetStronglyConnected(*nodes): + """Set a STRONGLY_CONNECTED penalty annotation for the given nodes.""" + for node in nodes: + _RecAnnotate(node, pytree_utils.Annotation.SPLIT_PENALTY, + STRONGLY_CONNECTED) + + +def _SetExpressionPenalty(node, penalty): + """Set a penalty annotation on children nodes.""" + + def RecExpression(node, first_child_leaf): + if node is first_child_leaf: + return + + if isinstance(node, pytree.Leaf): + if node.value in {'(', 'for', 'if'}: + return + penalty_annotation = pytree_utils.GetNodeAnnotation( + node, pytree_utils.Annotation.SPLIT_PENALTY, default=0) + if penalty_annotation < penalty: + _SetSplitPenalty(node, penalty) + else: + for child in node.children: + RecExpression(child, first_child_leaf) + + RecExpression(node, pytree_utils.FirstLeafNode(node)) + + +def _SetBitwiseOperandPenalty(node, op): + for index in py3compat.range(1, len(node.children) - 1): + child = node.children[index] + if isinstance(child, pytree.Leaf) and child.value == op: + if style.Get('SPLIT_BEFORE_BITWISE_OPERATOR'): + _SetSplitPenalty(child, style.Get('SPLIT_PENALTY_BITWISE_OPERATOR')) + else: + _SetSplitPenalty( + pytree_utils.FirstLeafNode(node.children[index + 1]), + style.Get('SPLIT_PENALTY_BITWISE_OPERATOR')) + + +def _SetExpressionOperandPenalty(node, ops): + for index in py3compat.range(1, len(node.children) - 1): + child = node.children[index] + if pytree_utils.NodeName(child) in ops: + if style.Get('SPLIT_BEFORE_ARITHMETIC_OPERATOR'): + _SetSplitPenalty(child, style.Get('SPLIT_PENALTY_ARITHMETIC_OPERATOR')) + else: + _SetSplitPenalty( + pytree_utils.FirstLeafNode(node.children[index + 1]), + style.Get('SPLIT_PENALTY_ARITHMETIC_OPERATOR')) + + +def _IncreasePenalty(node, amt): + """Increase a penalty annotation on children nodes.""" + + def RecExpression(node, first_child_leaf): + if node is first_child_leaf: + return + + if isinstance(node, pytree.Leaf): + if node.value in {'(', 'for'}: + return + penalty = pytree_utils.GetNodeAnnotation( + node, pytree_utils.Annotation.SPLIT_PENALTY, default=0) + _SetSplitPenalty(node, penalty + amt) + else: + for child in node.children: + RecExpression(child, first_child_leaf) + + RecExpression(node, pytree_utils.FirstLeafNode(node)) + + +def _RecAnnotate(tree, annotate_name, annotate_value): + """Recursively set the given annotation on all leafs of the subtree. + + Takes care to only increase the penalty. If the node already has a higher + or equal penalty associated with it, this is a no-op. + + Args: + tree: subtree to annotate + annotate_name: name of the annotation to set + annotate_value: value of the annotation to set + """ + for child in tree.children: + _RecAnnotate(child, annotate_name, annotate_value) + if isinstance(tree, pytree.Leaf): + cur_annotate = pytree_utils.GetNodeAnnotation( + tree, annotate_name, default=0) + if cur_annotate < annotate_value: + pytree_utils.SetNodeAnnotation(tree, annotate_name, annotate_value) + + +def _StronglyConnectedCompOp(op): + if (len(op.children[1].children) == 2 and + pytree_utils.NodeName(op.children[1]) == 'comp_op'): + if (pytree_utils.FirstLeafNode(op.children[1]).value == 'not' and + pytree_utils.LastLeafNode(op.children[1]).value == 'in'): + return True + if (pytree_utils.FirstLeafNode(op.children[1]).value == 'is' and + pytree_utils.LastLeafNode(op.children[1]).value == 'not'): + return True + if (isinstance(op.children[1], pytree.Leaf) and + op.children[1].value in {'==', 'in'}): + return True + return False + + +def _DecrementSplitPenalty(node, amt): + penalty = pytree_utils.GetNodeAnnotation( + node, pytree_utils.Annotation.SPLIT_PENALTY, default=amt) + penalty = penalty - amt if amt < penalty else 0 + _SetSplitPenalty(node, penalty) + + +def _SetSplitPenalty(node, penalty): + pytree_utils.SetNodeAnnotation(node, pytree_utils.Annotation.SPLIT_PENALTY, + penalty) diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/style.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/style.py new file mode 100644 index 00000000..6bd2372f --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/style.py @@ -0,0 +1,849 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Python formatting style settings.""" + +import os +import re +import textwrap + +from yapf.yapflib import errors +from yapf.yapflib import py3compat + + +class StyleConfigError(errors.YapfError): + """Raised when there's a problem reading the style configuration.""" + pass + + +def Get(setting_name): + """Get a style setting.""" + return _style[setting_name] + + +def GetOrDefault(setting_name, default_value): + """Get a style setting or default value if the setting does not exist.""" + return _style.get(setting_name, default_value) + + +def Help(): + """Return dict mapping style names to help strings.""" + return _STYLE_HELP + + +def SetGlobalStyle(style): + """Set a style dict.""" + global _style + global _GLOBAL_STYLE_FACTORY + factory = _GetStyleFactory(style) + if factory: + _GLOBAL_STYLE_FACTORY = factory + _style = style + + +_STYLE_HELP = dict( + ALIGN_CLOSING_BRACKET_WITH_VISUAL_INDENT=textwrap.dedent("""\ + Align closing bracket with visual indentation."""), + ALLOW_MULTILINE_LAMBDAS=textwrap.dedent("""\ + Allow lambdas to be formatted on more than one line."""), + ALLOW_MULTILINE_DICTIONARY_KEYS=textwrap.dedent("""\ + Allow dictionary keys to exist on multiple lines. For example: + + x = { + ('this is the first element of a tuple', + 'this is the second element of a tuple'): + value, + }"""), + ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNS=textwrap.dedent("""\ + Allow splitting before a default / named assignment in an argument list. + """), + ALLOW_SPLIT_BEFORE_DICT_VALUE=textwrap.dedent("""\ + Allow splits before the dictionary value."""), + ARITHMETIC_PRECEDENCE_INDICATION=textwrap.dedent("""\ + Let spacing indicate operator precedence. For example: + + a = 1 * 2 + 3 / 4 + b = 1 / 2 - 3 * 4 + c = (1 + 2) * (3 - 4) + d = (1 - 2) / (3 + 4) + e = 1 * 2 - 3 + f = 1 + 2 + 3 + 4 + + will be formatted as follows to indicate precedence: + + a = 1*2 + 3/4 + b = 1/2 - 3*4 + c = (1+2) * (3-4) + d = (1-2) / (3+4) + e = 1*2 - 3 + f = 1 + 2 + 3 + 4 + + """), + BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF=textwrap.dedent("""\ + Insert a blank line before a 'def' or 'class' immediately nested + within another 'def' or 'class'. For example: + + class Foo: + # <------ this blank line + def method(): + ..."""), + BLANK_LINE_BEFORE_CLASS_DOCSTRING=textwrap.dedent("""\ + Insert a blank line before a class-level docstring."""), + BLANK_LINE_BEFORE_MODULE_DOCSTRING=textwrap.dedent("""\ + Insert a blank line before a module docstring."""), + BLANK_LINES_AROUND_TOP_LEVEL_DEFINITION=textwrap.dedent("""\ + Number of blank lines surrounding top-level function and class + definitions."""), + BLANK_LINES_BETWEEN_TOP_LEVEL_IMPORTS_AND_VARIABLES=textwrap.dedent("""\ + Number of blank lines between top-level imports and variable + definitions."""), + COALESCE_BRACKETS=textwrap.dedent("""\ + Do not split consecutive brackets. Only relevant when + dedent_closing_brackets is set. For example: + + call_func_that_takes_a_dict( + { + 'key1': 'value1', + 'key2': 'value2', + } + ) + + would reformat to: + + call_func_that_takes_a_dict({ + 'key1': 'value1', + 'key2': 'value2', + })"""), + COLUMN_LIMIT=textwrap.dedent("""\ + The column limit."""), + CONTINUATION_ALIGN_STYLE=textwrap.dedent("""\ + The style for continuation alignment. Possible values are: + + - SPACE: Use spaces for continuation alignment. This is default behavior. + - FIXED: Use fixed number (CONTINUATION_INDENT_WIDTH) of columns + (ie: CONTINUATION_INDENT_WIDTH/INDENT_WIDTH tabs or + CONTINUATION_INDENT_WIDTH spaces) for continuation alignment. + - VALIGN-RIGHT: Vertically align continuation lines to multiple of + INDENT_WIDTH columns. Slightly right (one tab or a few spaces) if + cannot vertically align continuation lines with indent characters."""), + CONTINUATION_INDENT_WIDTH=textwrap.dedent("""\ + Indent width used for line continuations."""), + DEDENT_CLOSING_BRACKETS=textwrap.dedent("""\ + Put closing brackets on a separate line, dedented, if the bracketed + expression can't fit in a single line. Applies to all kinds of brackets, + including function definitions and calls. For example: + + config = { + 'key1': 'value1', + 'key2': 'value2', + } # <--- this bracket is dedented and on a separate line + + time_series = self.remote_client.query_entity_counters( + entity='dev3246.region1', + key='dns.query_latency_tcp', + transform=Transformation.AVERAGE(window=timedelta(seconds=60)), + start_ts=now()-timedelta(days=3), + end_ts=now(), + ) # <--- this bracket is dedented and on a separate line + """), + DISABLE_ENDING_COMMA_HEURISTIC=textwrap.dedent("""\ + Disable the heuristic which places each list element on a separate line + if the list is comma-terminated."""), + EACH_DICT_ENTRY_ON_SEPARATE_LINE=textwrap.dedent("""\ + Place each dictionary entry onto its own line."""), + FORCE_MULTILINE_DICT=textwrap.dedent("""\ + Require multiline dictionary even if it would normally fit on one line. + For example: + + config = { + 'key1': 'value1' + }"""), + I18N_COMMENT=textwrap.dedent("""\ + The regex for an i18n comment. The presence of this comment stops + reformatting of that line, because the comments are required to be + next to the string they translate."""), + I18N_FUNCTION_CALL=textwrap.dedent("""\ + The i18n function call names. The presence of this function stops + reformattting on that line, because the string it has cannot be moved + away from the i18n comment."""), + INDENT_CLOSING_BRACKETS=textwrap.dedent("""\ + Put closing brackets on a separate line, indented, if the bracketed + expression can't fit in a single line. Applies to all kinds of brackets, + including function definitions and calls. For example: + + config = { + 'key1': 'value1', + 'key2': 'value2', + } # <--- this bracket is indented and on a separate line + + time_series = self.remote_client.query_entity_counters( + entity='dev3246.region1', + key='dns.query_latency_tcp', + transform=Transformation.AVERAGE(window=timedelta(seconds=60)), + start_ts=now()-timedelta(days=3), + end_ts=now(), + ) # <--- this bracket is indented and on a separate line + """), + INDENT_DICTIONARY_VALUE=textwrap.dedent("""\ + Indent the dictionary value if it cannot fit on the same line as the + dictionary key. For example: + + config = { + 'key1': + 'value1', + 'key2': value1 + + value2, + } + """), + INDENT_WIDTH=textwrap.dedent("""\ + The number of columns to use for indentation."""), + INDENT_BLANK_LINES=textwrap.dedent("""\ + Indent blank lines."""), + JOIN_MULTIPLE_LINES=textwrap.dedent("""\ + Join short lines into one line. E.g., single line 'if' statements."""), + NO_SPACES_AROUND_SELECTED_BINARY_OPERATORS=textwrap.dedent("""\ + Do not include spaces around selected binary operators. For example: + + 1 + 2 * 3 - 4 / 5 + + will be formatted as follows when configured with "*,/": + + 1 + 2*3 - 4/5 + """), + SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKET=textwrap.dedent("""\ + Insert a space between the ending comma and closing bracket of a list, + etc."""), + SPACE_INSIDE_BRACKETS=textwrap.dedent("""\ + Use spaces inside brackets, braces, and parentheses. For example: + + method_call( 1 ) + my_dict[ 3 ][ 1 ][ get_index( *args, **kwargs ) ] + my_set = { 1, 2, 3 } + """), + SPACES_AROUND_POWER_OPERATOR=textwrap.dedent("""\ + Use spaces around the power operator."""), + SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN=textwrap.dedent("""\ + Use spaces around default or named assigns."""), + SPACES_AROUND_DICT_DELIMITERS=textwrap.dedent("""\ + Adds a space after the opening '{' and before the ending '}' dict delimiters. + + {1: 2} + + will be formatted as: + + { 1: 2 } + """), + SPACES_AROUND_LIST_DELIMITERS=textwrap.dedent("""\ + Adds a space after the opening '[' and before the ending ']' list delimiters. + + [1, 2] + + will be formatted as: + + [ 1, 2 ] + """), + SPACES_AROUND_SUBSCRIPT_COLON=textwrap.dedent("""\ + Use spaces around the subscript / slice operator. For example: + + my_list[1 : 10 : 2] + """), + SPACES_AROUND_TUPLE_DELIMITERS=textwrap.dedent("""\ + Adds a space after the opening '(' and before the ending ')' tuple delimiters. + + (1, 2, 3) + + will be formatted as: + + ( 1, 2, 3 ) + """), + SPACES_BEFORE_COMMENT=textwrap.dedent("""\ + The number of spaces required before a trailing comment. + This can be a single value (representing the number of spaces + before each trailing comment) or list of values (representing + alignment column values; trailing comments within a block will + be aligned to the first column value that is greater than the maximum + line length within the block). For example: + + With spaces_before_comment=5: + + 1 + 1 # Adding values + + will be formatted as: + + 1 + 1 # Adding values <-- 5 spaces between the end of the statement and comment + + With spaces_before_comment=15, 20: + + 1 + 1 # Adding values + two + two # More adding + + longer_statement # This is a longer statement + short # This is a shorter statement + + a_very_long_statement_that_extends_beyond_the_final_column # Comment + short # This is a shorter statement + + will be formatted as: + + 1 + 1 # Adding values <-- end of line comments in block aligned to col 15 + two + two # More adding + + longer_statement # This is a longer statement <-- end of line comments in block aligned to col 20 + short # This is a shorter statement + + a_very_long_statement_that_extends_beyond_the_final_column # Comment <-- the end of line comments are aligned based on the line length + short # This is a shorter statement + + """), + SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED=textwrap.dedent("""\ + Split before arguments if the argument list is terminated by a + comma."""), + SPLIT_ALL_COMMA_SEPARATED_VALUES=textwrap.dedent("""\ + Split before arguments"""), + SPLIT_ALL_TOP_LEVEL_COMMA_SEPARATED_VALUES=textwrap.dedent("""\ + Split before arguments, but do not split all subexpressions recursively + (unless needed)."""), + SPLIT_BEFORE_ARITHMETIC_OPERATOR=textwrap.dedent("""\ + Set to True to prefer splitting before '+', '-', '*', '/', '//', or '@' + rather than after."""), + SPLIT_BEFORE_BITWISE_OPERATOR=textwrap.dedent("""\ + Set to True to prefer splitting before '&', '|' or '^' rather than + after."""), + SPLIT_BEFORE_CLOSING_BRACKET=textwrap.dedent("""\ + Split before the closing bracket if a list or dict literal doesn't fit on + a single line."""), + SPLIT_BEFORE_DICT_SET_GENERATOR=textwrap.dedent("""\ + Split before a dictionary or set generator (comp_for). For example, note + the split before the 'for': + + foo = { + variable: 'Hello world, have a nice day!' + for variable in bar if variable != 42 + }"""), + SPLIT_BEFORE_DOT=textwrap.dedent("""\ + Split before the '.' if we need to split a longer expression: + + foo = ('This is a really long string: {}, {}, {}, {}'.format(a, b, c, d)) + + would reformat to something like: + + foo = ('This is a really long string: {}, {}, {}, {}' + .format(a, b, c, d)) + """), + SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN=textwrap.dedent("""\ + Split after the opening paren which surrounds an expression if it doesn't + fit on a single line. + """), + SPLIT_BEFORE_FIRST_ARGUMENT=textwrap.dedent("""\ + If an argument / parameter list is going to be split, then split before + the first argument."""), + SPLIT_BEFORE_LOGICAL_OPERATOR=textwrap.dedent("""\ + Set to True to prefer splitting before 'and' or 'or' rather than + after."""), + SPLIT_BEFORE_NAMED_ASSIGNS=textwrap.dedent("""\ + Split named assignments onto individual lines."""), + SPLIT_COMPLEX_COMPREHENSION=textwrap.dedent("""\ + Set to True to split list comprehensions and generators that have + non-trivial expressions and multiple clauses before each of these + clauses. For example: + + result = [ + a_long_var + 100 for a_long_var in xrange(1000) + if a_long_var % 10] + + would reformat to something like: + + result = [ + a_long_var + 100 + for a_long_var in xrange(1000) + if a_long_var % 10] + """), + SPLIT_PENALTY_AFTER_OPENING_BRACKET=textwrap.dedent("""\ + The penalty for splitting right after the opening bracket."""), + SPLIT_PENALTY_AFTER_UNARY_OPERATOR=textwrap.dedent("""\ + The penalty for splitting the line after a unary operator."""), + SPLIT_PENALTY_ARITHMETIC_OPERATOR=textwrap.dedent("""\ + The penalty of splitting the line around the '+', '-', '*', '/', '//', + ``%``, and '@' operators."""), + SPLIT_PENALTY_BEFORE_IF_EXPR=textwrap.dedent("""\ + The penalty for splitting right before an if expression."""), + SPLIT_PENALTY_BITWISE_OPERATOR=textwrap.dedent("""\ + The penalty of splitting the line around the '&', '|', and '^' + operators."""), + SPLIT_PENALTY_COMPREHENSION=textwrap.dedent("""\ + The penalty for splitting a list comprehension or generator + expression."""), + SPLIT_PENALTY_EXCESS_CHARACTER=textwrap.dedent("""\ + The penalty for characters over the column limit."""), + SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT=textwrap.dedent("""\ + The penalty incurred by adding a line split to the unwrapped line. The + more line splits added the higher the penalty."""), + SPLIT_PENALTY_IMPORT_NAMES=textwrap.dedent("""\ + The penalty of splitting a list of "import as" names. For example: + + from a_very_long_or_indented_module_name_yada_yad import (long_argument_1, + long_argument_2, + long_argument_3) + + would reformat to something like: + + from a_very_long_or_indented_module_name_yada_yad import ( + long_argument_1, long_argument_2, long_argument_3) + """), + SPLIT_PENALTY_LOGICAL_OPERATOR=textwrap.dedent("""\ + The penalty of splitting the line around the 'and' and 'or' + operators."""), + USE_TABS=textwrap.dedent("""\ + Use the Tab character for indentation."""), + # BASED_ON_STYLE='Which predefined style this style is based on', +) + + +def CreatePEP8Style(): + """Create the PEP8 formatting style.""" + return dict( + ALIGN_CLOSING_BRACKET_WITH_VISUAL_INDENT=True, + ALLOW_MULTILINE_LAMBDAS=False, + ALLOW_MULTILINE_DICTIONARY_KEYS=False, + ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNS=True, + ALLOW_SPLIT_BEFORE_DICT_VALUE=True, + ARITHMETIC_PRECEDENCE_INDICATION=False, + BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF=False, + BLANK_LINE_BEFORE_CLASS_DOCSTRING=False, + BLANK_LINE_BEFORE_MODULE_DOCSTRING=False, + BLANK_LINES_AROUND_TOP_LEVEL_DEFINITION=2, + BLANK_LINES_BETWEEN_TOP_LEVEL_IMPORTS_AND_VARIABLES=1, + COALESCE_BRACKETS=False, + COLUMN_LIMIT=79, + CONTINUATION_ALIGN_STYLE='SPACE', + CONTINUATION_INDENT_WIDTH=4, + DEDENT_CLOSING_BRACKETS=False, + INDENT_CLOSING_BRACKETS=False, + DISABLE_ENDING_COMMA_HEURISTIC=False, + EACH_DICT_ENTRY_ON_SEPARATE_LINE=True, + FORCE_MULTILINE_DICT=False, + I18N_COMMENT='', + I18N_FUNCTION_CALL='', + INDENT_DICTIONARY_VALUE=False, + INDENT_WIDTH=4, + INDENT_BLANK_LINES=False, + JOIN_MULTIPLE_LINES=True, + NO_SPACES_AROUND_SELECTED_BINARY_OPERATORS=set(), + SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKET=True, + SPACE_INSIDE_BRACKETS=False, + SPACES_AROUND_POWER_OPERATOR=False, + SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN=False, + SPACES_AROUND_DICT_DELIMITERS=False, + SPACES_AROUND_LIST_DELIMITERS=False, + SPACES_AROUND_SUBSCRIPT_COLON=False, + SPACES_AROUND_TUPLE_DELIMITERS=False, + SPACES_BEFORE_COMMENT=2, + SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED=False, + SPLIT_ALL_COMMA_SEPARATED_VALUES=False, + SPLIT_ALL_TOP_LEVEL_COMMA_SEPARATED_VALUES=False, + SPLIT_BEFORE_ARITHMETIC_OPERATOR=False, + SPLIT_BEFORE_BITWISE_OPERATOR=True, + SPLIT_BEFORE_CLOSING_BRACKET=True, + SPLIT_BEFORE_DICT_SET_GENERATOR=True, + SPLIT_BEFORE_DOT=False, + SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN=False, + SPLIT_BEFORE_FIRST_ARGUMENT=False, + SPLIT_BEFORE_LOGICAL_OPERATOR=True, + SPLIT_BEFORE_NAMED_ASSIGNS=True, + SPLIT_COMPLEX_COMPREHENSION=False, + SPLIT_PENALTY_AFTER_OPENING_BRACKET=300, + SPLIT_PENALTY_AFTER_UNARY_OPERATOR=10000, + SPLIT_PENALTY_ARITHMETIC_OPERATOR=300, + SPLIT_PENALTY_BEFORE_IF_EXPR=0, + SPLIT_PENALTY_BITWISE_OPERATOR=300, + SPLIT_PENALTY_COMPREHENSION=80, + SPLIT_PENALTY_EXCESS_CHARACTER=7000, + SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT=30, + SPLIT_PENALTY_IMPORT_NAMES=0, + SPLIT_PENALTY_LOGICAL_OPERATOR=300, + USE_TABS=False, + ) + + +def CreateGoogleStyle(): + """Create the Google formatting style.""" + style = CreatePEP8Style() + style['ALIGN_CLOSING_BRACKET_WITH_VISUAL_INDENT'] = False + style['BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF'] = True + style['COLUMN_LIMIT'] = 80 + style['INDENT_DICTIONARY_VALUE'] = True + style['INDENT_WIDTH'] = 4 + style['I18N_COMMENT'] = r'#\..*' + style['I18N_FUNCTION_CALL'] = ['N_', '_'] + style['JOIN_MULTIPLE_LINES'] = False + style['SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKET'] = False + style['SPLIT_BEFORE_BITWISE_OPERATOR'] = False + style['SPLIT_BEFORE_DICT_SET_GENERATOR'] = False + style['SPLIT_BEFORE_LOGICAL_OPERATOR'] = False + style['SPLIT_COMPLEX_COMPREHENSION'] = True + style['SPLIT_PENALTY_COMPREHENSION'] = 2100 + return style + + +def CreateYapfStyle(): + """Create the YAPF formatting style.""" + style = CreateGoogleStyle() + style['ALLOW_MULTILINE_DICTIONARY_KEYS'] = True + style['ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNS'] = False + style['INDENT_WIDTH'] = 2 + style['SPLIT_BEFORE_BITWISE_OPERATOR'] = True + style['SPLIT_BEFORE_DOT'] = True + style['SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN'] = True + return style + + +def CreateFacebookStyle(): + """Create the Facebook formatting style.""" + style = CreatePEP8Style() + style['ALIGN_CLOSING_BRACKET_WITH_VISUAL_INDENT'] = False + style['COLUMN_LIMIT'] = 80 + style['DEDENT_CLOSING_BRACKETS'] = True + style['INDENT_CLOSING_BRACKETS'] = False + style['INDENT_DICTIONARY_VALUE'] = True + style['JOIN_MULTIPLE_LINES'] = False + style['SPACES_BEFORE_COMMENT'] = 2 + style['SPLIT_PENALTY_AFTER_OPENING_BRACKET'] = 0 + style['SPLIT_PENALTY_BEFORE_IF_EXPR'] = 30 + style['SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT'] = 30 + style['SPLIT_BEFORE_LOGICAL_OPERATOR'] = False + style['SPLIT_BEFORE_BITWISE_OPERATOR'] = False + return style + + +_STYLE_NAME_TO_FACTORY = dict( + pep8=CreatePEP8Style, + google=CreateGoogleStyle, + facebook=CreateFacebookStyle, + yapf=CreateYapfStyle, +) + +_DEFAULT_STYLE_TO_FACTORY = [ + (CreateFacebookStyle(), CreateFacebookStyle), + (CreateGoogleStyle(), CreateGoogleStyle), + (CreatePEP8Style(), CreatePEP8Style), + (CreateYapfStyle(), CreateYapfStyle), +] + + +def _GetStyleFactory(style): + for def_style, factory in _DEFAULT_STYLE_TO_FACTORY: + if style == def_style: + return factory + return None + + +def _ContinuationAlignStyleStringConverter(s): + """Option value converter for a continuation align style string.""" + accepted_styles = ('SPACE', 'FIXED', 'VALIGN-RIGHT') + if s: + r = s.strip('"\'').replace('_', '-').upper() + if r not in accepted_styles: + raise ValueError('unknown continuation align style: %r' % (s,)) + else: + r = accepted_styles[0] + return r + + +def _StringListConverter(s): + """Option value converter for a comma-separated list of strings.""" + return [part.strip() for part in s.split(',')] + + +def _StringSetConverter(s): + """Option value converter for a comma-separated set of strings.""" + if len(s) > 2 and s[0] in '"\'': + s = s[1:-1] + return set(part.strip() for part in s.split(',')) + + +def _BoolConverter(s): + """Option value converter for a boolean.""" + return py3compat.CONFIGPARSER_BOOLEAN_STATES[s.lower()] + + +def _IntListConverter(s): + """Option value converter for a comma-separated list of integers.""" + s = s.strip() + if s.startswith('[') and s.endswith(']'): + s = s[1:-1] + + return [int(part.strip()) for part in s.split(',') if part.strip()] + + +def _IntOrIntListConverter(s): + """Option value converter for an integer or list of integers.""" + if len(s) > 2 and s[0] in '"\'': + s = s[1:-1] + return _IntListConverter(s) if ',' in s else int(s) + + +# Different style options need to have their values interpreted differently when +# read from the config file. This dict maps an option name to a "converter" +# function that accepts the string read for the option's value from the file and +# returns it wrapper in actual Python type that's going to be meaningful to +# yapf. +# +# Note: this dict has to map all the supported style options. +_STYLE_OPTION_VALUE_CONVERTER = dict( + ALIGN_CLOSING_BRACKET_WITH_VISUAL_INDENT=_BoolConverter, + ALLOW_MULTILINE_LAMBDAS=_BoolConverter, + ALLOW_MULTILINE_DICTIONARY_KEYS=_BoolConverter, + ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNS=_BoolConverter, + ALLOW_SPLIT_BEFORE_DICT_VALUE=_BoolConverter, + ARITHMETIC_PRECEDENCE_INDICATION=_BoolConverter, + BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF=_BoolConverter, + BLANK_LINE_BEFORE_CLASS_DOCSTRING=_BoolConverter, + BLANK_LINE_BEFORE_MODULE_DOCSTRING=_BoolConverter, + BLANK_LINES_AROUND_TOP_LEVEL_DEFINITION=int, + BLANK_LINES_BETWEEN_TOP_LEVEL_IMPORTS_AND_VARIABLES=int, + COALESCE_BRACKETS=_BoolConverter, + COLUMN_LIMIT=int, + CONTINUATION_ALIGN_STYLE=_ContinuationAlignStyleStringConverter, + CONTINUATION_INDENT_WIDTH=int, + DEDENT_CLOSING_BRACKETS=_BoolConverter, + INDENT_CLOSING_BRACKETS=_BoolConverter, + DISABLE_ENDING_COMMA_HEURISTIC=_BoolConverter, + EACH_DICT_ENTRY_ON_SEPARATE_LINE=_BoolConverter, + FORCE_MULTILINE_DICT=_BoolConverter, + I18N_COMMENT=str, + I18N_FUNCTION_CALL=_StringListConverter, + INDENT_DICTIONARY_VALUE=_BoolConverter, + INDENT_WIDTH=int, + INDENT_BLANK_LINES=_BoolConverter, + JOIN_MULTIPLE_LINES=_BoolConverter, + NO_SPACES_AROUND_SELECTED_BINARY_OPERATORS=_StringSetConverter, + SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKET=_BoolConverter, + SPACE_INSIDE_BRACKETS=_BoolConverter, + SPACES_AROUND_POWER_OPERATOR=_BoolConverter, + SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN=_BoolConverter, + SPACES_AROUND_DICT_DELIMITERS=_BoolConverter, + SPACES_AROUND_LIST_DELIMITERS=_BoolConverter, + SPACES_AROUND_SUBSCRIPT_COLON=_BoolConverter, + SPACES_AROUND_TUPLE_DELIMITERS=_BoolConverter, + SPACES_BEFORE_COMMENT=_IntOrIntListConverter, + SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED=_BoolConverter, + SPLIT_ALL_COMMA_SEPARATED_VALUES=_BoolConverter, + SPLIT_ALL_TOP_LEVEL_COMMA_SEPARATED_VALUES=_BoolConverter, + SPLIT_BEFORE_ARITHMETIC_OPERATOR=_BoolConverter, + SPLIT_BEFORE_BITWISE_OPERATOR=_BoolConverter, + SPLIT_BEFORE_CLOSING_BRACKET=_BoolConverter, + SPLIT_BEFORE_DICT_SET_GENERATOR=_BoolConverter, + SPLIT_BEFORE_DOT=_BoolConverter, + SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN=_BoolConverter, + SPLIT_BEFORE_FIRST_ARGUMENT=_BoolConverter, + SPLIT_BEFORE_LOGICAL_OPERATOR=_BoolConverter, + SPLIT_BEFORE_NAMED_ASSIGNS=_BoolConverter, + SPLIT_COMPLEX_COMPREHENSION=_BoolConverter, + SPLIT_PENALTY_AFTER_OPENING_BRACKET=int, + SPLIT_PENALTY_AFTER_UNARY_OPERATOR=int, + SPLIT_PENALTY_ARITHMETIC_OPERATOR=int, + SPLIT_PENALTY_BEFORE_IF_EXPR=int, + SPLIT_PENALTY_BITWISE_OPERATOR=int, + SPLIT_PENALTY_COMPREHENSION=int, + SPLIT_PENALTY_EXCESS_CHARACTER=int, + SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT=int, + SPLIT_PENALTY_IMPORT_NAMES=int, + SPLIT_PENALTY_LOGICAL_OPERATOR=int, + USE_TABS=_BoolConverter, +) + + +def CreateStyleFromConfig(style_config): + """Create a style dict from the given config. + + Arguments: + style_config: either a style name or a file name. The file is expected to + contain settings. It can have a special BASED_ON_STYLE setting naming the + style which it derives from. If no such setting is found, it derives from + the default style. When style_config is None, the _GLOBAL_STYLE_FACTORY + config is created. + + Returns: + A style dict. + + Raises: + StyleConfigError: if an unknown style option was encountered. + """ + + def GlobalStyles(): + for style, _ in _DEFAULT_STYLE_TO_FACTORY: + yield style + + def_style = False + if style_config is None: + for style in GlobalStyles(): + if _style == style: + def_style = True + break + if not def_style: + return _style + return _GLOBAL_STYLE_FACTORY() + + if isinstance(style_config, dict): + config = _CreateConfigParserFromConfigDict(style_config) + elif isinstance(style_config, py3compat.basestring): + style_factory = _STYLE_NAME_TO_FACTORY.get(style_config.lower()) + if style_factory is not None: + return style_factory() + if style_config.startswith('{'): + # Most likely a style specification from the command line. + config = _CreateConfigParserFromConfigString(style_config) + else: + # Unknown config name: assume it's a file name then. + config = _CreateConfigParserFromConfigFile(style_config) + return _CreateStyleFromConfigParser(config) + + +def _CreateConfigParserFromConfigDict(config_dict): + config = py3compat.ConfigParser() + config.add_section('style') + for key, value in config_dict.items(): + config.set('style', key, str(value)) + return config + + +def _CreateConfigParserFromConfigString(config_string): + """Given a config string from the command line, return a config parser.""" + if config_string[0] != '{' or config_string[-1] != '}': + raise StyleConfigError( + "Invalid style dict syntax: '{}'.".format(config_string)) + config = py3compat.ConfigParser() + config.add_section('style') + for key, value, _ in re.findall( + r'([a-zA-Z0-9_]+)\s*[:=]\s*' + r'(?:' + r'((?P[\'"]).*?(?P=quote)|' + r'[a-zA-Z0-9_]+)' + r')', config_string): # yapf: disable + config.set('style', key, value) + return config + + +def _CreateConfigParserFromConfigFile(config_filename): + """Read the file and return a ConfigParser object.""" + if not os.path.exists(config_filename): + # Provide a more meaningful error here. + raise StyleConfigError( + '"{0}" is not a valid style or file path'.format(config_filename)) + with open(config_filename) as style_file: + config = py3compat.ConfigParser() + if config_filename.endswith(PYPROJECT_TOML): + try: + import toml + except ImportError: + raise errors.YapfError( + "toml package is needed for using pyproject.toml as a configuration file" + ) + + pyproject_toml = toml.load(style_file) + style_dict = pyproject_toml.get("tool", {}).get("yapf", None) + if style_dict is None: + raise StyleConfigError( + 'Unable to find section [tool.yapf] in {0}'.format(config_filename)) + config.add_section('style') + for k, v in style_dict.items(): + config.set('style', k, str(v)) + return config + + config.read_file(style_file) + if config_filename.endswith(SETUP_CONFIG): + if not config.has_section('yapf'): + raise StyleConfigError( + 'Unable to find section [yapf] in {0}'.format(config_filename)) + return config + + if config_filename.endswith(LOCAL_STYLE): + if not config.has_section('style'): + raise StyleConfigError( + 'Unable to find section [style] in {0}'.format(config_filename)) + return config + + if not config.has_section('style'): + raise StyleConfigError( + 'Unable to find section [style] in {0}'.format(config_filename)) + return config + + +def _CreateStyleFromConfigParser(config): + """Create a style dict from a configuration file. + + Arguments: + config: a ConfigParser object. + + Returns: + A style dict. + + Raises: + StyleConfigError: if an unknown style option was encountered. + """ + # Initialize the base style. + section = 'yapf' if config.has_section('yapf') else 'style' + if config.has_option('style', 'based_on_style'): + based_on = config.get('style', 'based_on_style').lower() + base_style = _STYLE_NAME_TO_FACTORY[based_on]() + elif config.has_option('yapf', 'based_on_style'): + based_on = config.get('yapf', 'based_on_style').lower() + base_style = _STYLE_NAME_TO_FACTORY[based_on]() + else: + base_style = _GLOBAL_STYLE_FACTORY() + + # Read all options specified in the file and update the style. + for option, value in config.items(section): + if option.lower() == 'based_on_style': + # Now skip this one - we've already handled it and it's not one of the + # recognized style options. + continue + option = option.upper() + if option not in _STYLE_OPTION_VALUE_CONVERTER: + raise StyleConfigError('Unknown style option "{0}"'.format(option)) + try: + base_style[option] = _STYLE_OPTION_VALUE_CONVERTER[option](value) + except ValueError: + raise StyleConfigError("'{}' is not a valid setting for {}.".format( + value, option)) + return base_style + + +# The default style - used if yapf is not invoked without specifically +# requesting a formatting style. +DEFAULT_STYLE = 'pep8' +DEFAULT_STYLE_FACTORY = CreatePEP8Style +_GLOBAL_STYLE_FACTORY = CreatePEP8Style + +# The name of the file to use for global style definition. +GLOBAL_STYLE = ( + os.path.join( + os.getenv('XDG_CONFIG_HOME') or os.path.expanduser('~/.config'), 'yapf', + 'style')) + +# The name of the file to use for directory-local style definition. +LOCAL_STYLE = '.style.yapf' + +# Alternative place for directory-local style definition. Style should be +# specified in the '[yapf]' section. +SETUP_CONFIG = 'setup.cfg' + +# Style definition by local pyproject.toml file. Style should be specified +# in the '[tool.yapf]' section. +PYPROJECT_TOML = 'pyproject.toml' + +# TODO(eliben): For now we're preserving the global presence of a style dict. +# Refactor this so that the style is passed around through yapf rather than +# being global. +_style = None +SetGlobalStyle(_GLOBAL_STYLE_FACTORY()) diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/subtype_assigner.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/subtype_assigner.py new file mode 100644 index 00000000..0fa2d966 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/subtype_assigner.py @@ -0,0 +1,509 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Subtype assigner for lib2to3 trees. + +This module assigns extra type information to the lib2to3 trees. This +information is more specific than whether something is an operator or an +identifier. For instance, it can specify if a node in the tree is part of a +subscript. + + AssignSubtypes(): the main function exported by this module. + +Annotations: + subtype: The subtype of a pytree token. See 'format_token' module for a list + of subtypes. +""" + +from lib2to3 import pytree +from lib2to3.pgen2 import token +from lib2to3.pygram import python_symbols as syms + +from yapf.yapflib import format_token +from yapf.yapflib import pytree_utils +from yapf.yapflib import pytree_visitor +from yapf.yapflib import style + + +def AssignSubtypes(tree): + """Run the subtype assigner visitor over the tree, modifying it in place. + + Arguments: + tree: the top-level pytree node to annotate with subtypes. + """ + subtype_assigner = _SubtypeAssigner() + subtype_assigner.Visit(tree) + + +# Map tokens in argument lists to their respective subtype. +_ARGLIST_TOKEN_TO_SUBTYPE = { + '=': format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN, + ':': format_token.Subtype.TYPED_NAME, + '*': format_token.Subtype.VARARGS_STAR, + '**': format_token.Subtype.KWARGS_STAR_STAR, +} + + +class _SubtypeAssigner(pytree_visitor.PyTreeVisitor): + """_SubtypeAssigner - see file-level docstring for detailed description. + + The subtype is added as an annotation to the pytree token. + """ + + def Visit_dictsetmaker(self, node): # pylint: disable=invalid-name + # dictsetmaker ::= (test ':' test (comp_for | + # (',' test ':' test)* [','])) | + # (test (comp_for | (',' test)* [','])) + for child in node.children: + self.Visit(child) + + comp_for = False + dict_maker = False + + for child in node.children: + if pytree_utils.NodeName(child) == 'comp_for': + comp_for = True + _AppendFirstLeafTokenSubtype(child, + format_token.Subtype.DICT_SET_GENERATOR) + elif pytree_utils.NodeName(child) in ('COLON', 'DOUBLESTAR'): + dict_maker = True + + if not comp_for and dict_maker: + last_was_colon = False + unpacking = False + for child in node.children: + if pytree_utils.NodeName(child) == 'DOUBLESTAR': + _AppendFirstLeafTokenSubtype(child, + format_token.Subtype.KWARGS_STAR_STAR) + if last_was_colon: + if style.Get('INDENT_DICTIONARY_VALUE'): + _InsertPseudoParentheses(child) + else: + _AppendFirstLeafTokenSubtype(child, + format_token.Subtype.DICTIONARY_VALUE) + elif (isinstance(child, pytree.Node) or + (not child.value.startswith('#') and child.value not in '{:,')): + # Mark the first leaf of a key entry as a DICTIONARY_KEY. We + # normally want to split before them if the dictionary cannot exist + # on a single line. + if not unpacking or pytree_utils.FirstLeafNode(child).value == '**': + _AppendFirstLeafTokenSubtype(child, + format_token.Subtype.DICTIONARY_KEY) + _AppendSubtypeRec(child, format_token.Subtype.DICTIONARY_KEY_PART) + last_was_colon = pytree_utils.NodeName(child) == 'COLON' + if pytree_utils.NodeName(child) == 'DOUBLESTAR': + unpacking = True + elif last_was_colon: + unpacking = False + + def Visit_expr_stmt(self, node): # pylint: disable=invalid-name + # expr_stmt ::= testlist_star_expr (augassign (yield_expr|testlist) + # | ('=' (yield_expr|testlist_star_expr))*) + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value == '=': + _AppendTokenSubtype(child, format_token.Subtype.ASSIGN_OPERATOR) + + def Visit_or_test(self, node): # pylint: disable=invalid-name + # or_test ::= and_test ('or' and_test)* + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value == 'or': + _AppendTokenSubtype(child, format_token.Subtype.BINARY_OPERATOR) + + def Visit_and_test(self, node): # pylint: disable=invalid-name + # and_test ::= not_test ('and' not_test)* + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value == 'and': + _AppendTokenSubtype(child, format_token.Subtype.BINARY_OPERATOR) + + def Visit_not_test(self, node): # pylint: disable=invalid-name + # not_test ::= 'not' not_test | comparison + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value == 'not': + _AppendTokenSubtype(child, format_token.Subtype.UNARY_OPERATOR) + + def Visit_comparison(self, node): # pylint: disable=invalid-name + # comparison ::= expr (comp_op expr)* + # comp_op ::= '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not in'|'is'|'is not' + for child in node.children: + self.Visit(child) + if (isinstance(child, pytree.Leaf) and + child.value in {'<', '>', '==', '>=', '<=', '<>', '!=', 'in', 'is'}): + _AppendTokenSubtype(child, format_token.Subtype.BINARY_OPERATOR) + elif pytree_utils.NodeName(child) == 'comp_op': + for grandchild in child.children: + _AppendTokenSubtype(grandchild, format_token.Subtype.BINARY_OPERATOR) + + def Visit_star_expr(self, node): # pylint: disable=invalid-name + # star_expr ::= '*' expr + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value == '*': + _AppendTokenSubtype(child, format_token.Subtype.UNARY_OPERATOR) + _AppendTokenSubtype(child, format_token.Subtype.VARARGS_STAR) + + def Visit_expr(self, node): # pylint: disable=invalid-name + # expr ::= xor_expr ('|' xor_expr)* + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value == '|': + _AppendTokenSubtype(child, format_token.Subtype.BINARY_OPERATOR) + + def Visit_xor_expr(self, node): # pylint: disable=invalid-name + # xor_expr ::= and_expr ('^' and_expr)* + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value == '^': + _AppendTokenSubtype(child, format_token.Subtype.BINARY_OPERATOR) + + def Visit_and_expr(self, node): # pylint: disable=invalid-name + # and_expr ::= shift_expr ('&' shift_expr)* + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value == '&': + _AppendTokenSubtype(child, format_token.Subtype.BINARY_OPERATOR) + + def Visit_shift_expr(self, node): # pylint: disable=invalid-name + # shift_expr ::= arith_expr (('<<'|'>>') arith_expr)* + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value in {'<<', '>>'}: + _AppendTokenSubtype(child, format_token.Subtype.BINARY_OPERATOR) + + def Visit_arith_expr(self, node): # pylint: disable=invalid-name + # arith_expr ::= term (('+'|'-') term)* + for child in node.children: + self.Visit(child) + if _IsAExprOperator(child): + _AppendTokenSubtype(child, format_token.Subtype.BINARY_OPERATOR) + _AppendTokenSubtype(child, format_token.Subtype.A_EXPR_OPERATOR) + + if _IsSimpleExpression(node): + for child in node.children: + if _IsAExprOperator(child): + _AppendTokenSubtype(child, format_token.Subtype.SIMPLE_EXPRESSION) + + def Visit_term(self, node): # pylint: disable=invalid-name + # term ::= factor (('*'|'/'|'%'|'//'|'@') factor)* + for child in node.children: + self.Visit(child) + if _IsMExprOperator(child): + _AppendTokenSubtype(child, format_token.Subtype.BINARY_OPERATOR) + _AppendTokenSubtype(child, format_token.Subtype.M_EXPR_OPERATOR) + + if _IsSimpleExpression(node): + for child in node.children: + if _IsMExprOperator(child): + _AppendTokenSubtype(child, format_token.Subtype.SIMPLE_EXPRESSION) + + def Visit_factor(self, node): # pylint: disable=invalid-name + # factor ::= ('+'|'-'|'~') factor | power + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value in '+-~': + _AppendTokenSubtype(child, format_token.Subtype.UNARY_OPERATOR) + + def Visit_power(self, node): # pylint: disable=invalid-name + # power ::= atom trailer* ['**' factor] + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value == '**': + _AppendTokenSubtype(child, format_token.Subtype.BINARY_OPERATOR) + + def Visit_trailer(self, node): # pylint: disable=invalid-name + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value in '[]': + _AppendTokenSubtype(child, format_token.Subtype.SUBSCRIPT_BRACKET) + + def Visit_subscript(self, node): # pylint: disable=invalid-name + # subscript ::= test | [test] ':' [test] [sliceop] + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value == ':': + _AppendTokenSubtype(child, format_token.Subtype.SUBSCRIPT_COLON) + + def Visit_sliceop(self, node): # pylint: disable=invalid-name + # sliceop ::= ':' [test] + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value == ':': + _AppendTokenSubtype(child, format_token.Subtype.SUBSCRIPT_COLON) + + def Visit_argument(self, node): # pylint: disable=invalid-name + # argument ::= + # test [comp_for] | test '=' test + self._ProcessArgLists(node) + + def Visit_arglist(self, node): # pylint: disable=invalid-name + # arglist ::= + # (argument ',')* (argument [','] + # | '*' test (',' argument)* [',' '**' test] + # | '**' test) + self._ProcessArgLists(node) + _SetArgListSubtype(node, format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN, + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN_ARG_LIST) + + def Visit_tname(self, node): # pylint: disable=invalid-name + self._ProcessArgLists(node) + _SetArgListSubtype(node, format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN, + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN_ARG_LIST) + + def Visit_decorator(self, node): # pylint: disable=invalid-name + # decorator ::= + # '@' dotted_name [ '(' [arglist] ')' ] NEWLINE + for child in node.children: + if isinstance(child, pytree.Leaf) and child.value == '@': + _AppendTokenSubtype(child, subtype=format_token.Subtype.DECORATOR) + self.Visit(child) + + def Visit_funcdef(self, node): # pylint: disable=invalid-name + # funcdef ::= + # 'def' NAME parameters ['->' test] ':' suite + for child in node.children: + if pytree_utils.NodeName(child) == 'NAME' and child.value != 'def': + _AppendTokenSubtype(child, format_token.Subtype.FUNC_DEF) + break + for child in node.children: + self.Visit(child) + + def Visit_parameters(self, node): # pylint: disable=invalid-name + # parameters ::= '(' [typedargslist] ')' + self._ProcessArgLists(node) + if len(node.children) > 2: + _AppendFirstLeafTokenSubtype(node.children[1], + format_token.Subtype.PARAMETER_START) + _AppendLastLeafTokenSubtype(node.children[-2], + format_token.Subtype.PARAMETER_STOP) + + def Visit_typedargslist(self, node): # pylint: disable=invalid-name + # typedargslist ::= + # ((tfpdef ['=' test] ',')* + # ('*' [tname] (',' tname ['=' test])* [',' '**' tname] + # | '**' tname) + # | tfpdef ['=' test] (',' tfpdef ['=' test])* [',']) + self._ProcessArgLists(node) + _SetArgListSubtype(node, format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN, + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN_ARG_LIST) + tname = False + if not node.children: + return + + _AppendFirstLeafTokenSubtype(node.children[0], + format_token.Subtype.PARAMETER_START) + _AppendLastLeafTokenSubtype(node.children[-1], + format_token.Subtype.PARAMETER_STOP) + + i = 1 + tname = pytree_utils.NodeName(node.children[0]) == 'tname' + while i < len(node.children): + prev_child = node.children[i - 1] + child = node.children[i] + i += 1 + + if pytree_utils.NodeName(prev_child) == 'COMMA': + _AppendFirstLeafTokenSubtype(child, + format_token.Subtype.PARAMETER_START) + elif pytree_utils.NodeName(child) == 'COMMA': + _AppendLastLeafTokenSubtype(prev_child, + format_token.Subtype.PARAMETER_STOP) + + if pytree_utils.NodeName(child) == 'tname': + tname = True + _SetArgListSubtype(child, format_token.Subtype.TYPED_NAME, + format_token.Subtype.TYPED_NAME_ARG_LIST) + elif pytree_utils.NodeName(child) == 'COMMA': + tname = False + elif pytree_utils.NodeName(child) == 'EQUAL' and tname: + _AppendTokenSubtype(child, subtype=format_token.Subtype.TYPED_NAME) + tname = False + + def Visit_varargslist(self, node): # pylint: disable=invalid-name + # varargslist ::= + # ((vfpdef ['=' test] ',')* + # ('*' [vname] (',' vname ['=' test])* [',' '**' vname] + # | '**' vname) + # | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) + self._ProcessArgLists(node) + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf) and child.value == '=': + _AppendTokenSubtype(child, format_token.Subtype.VARARGS_LIST) + + def Visit_comp_for(self, node): # pylint: disable=invalid-name + # comp_for ::= 'for' exprlist 'in' testlist_safe [comp_iter] + _AppendSubtypeRec(node, format_token.Subtype.COMP_FOR) + # Mark the previous node as COMP_EXPR unless this is a nested comprehension + # as these will have the outer comprehension as their previous node. + attr = pytree_utils.GetNodeAnnotation(node.parent, + pytree_utils.Annotation.SUBTYPE) + if not attr or format_token.Subtype.COMP_FOR not in attr: + _AppendSubtypeRec(node.parent.children[0], format_token.Subtype.COMP_EXPR) + self.DefaultNodeVisit(node) + + def Visit_old_comp_for(self, node): # pylint: disable=invalid-name + # Python 3.7 + self.Visit_comp_for(node) + + def Visit_comp_if(self, node): # pylint: disable=invalid-name + # comp_if ::= 'if' old_test [comp_iter] + _AppendSubtypeRec(node, format_token.Subtype.COMP_IF) + self.DefaultNodeVisit(node) + + def Visit_old_comp_if(self, node): # pylint: disable=invalid-name + # Python 3.7 + self.Visit_comp_if(node) + + def _ProcessArgLists(self, node): + """Common method for processing argument lists.""" + for child in node.children: + self.Visit(child) + if isinstance(child, pytree.Leaf): + _AppendTokenSubtype( + child, + subtype=_ARGLIST_TOKEN_TO_SUBTYPE.get(child.value, + format_token.Subtype.NONE)) + + +def _SetArgListSubtype(node, node_subtype, list_subtype): + """Set named assign subtype on elements in a arg list.""" + + def HasSubtype(node): + """Return True if the arg list has a named assign subtype.""" + if isinstance(node, pytree.Leaf): + return node_subtype in pytree_utils.GetNodeAnnotation( + node, pytree_utils.Annotation.SUBTYPE, set()) + + for child in node.children: + node_name = pytree_utils.NodeName(child) + if node_name not in {'atom', 'arglist', 'power'}: + if HasSubtype(child): + return True + + return False + + if not HasSubtype(node): + return + + for child in node.children: + node_name = pytree_utils.NodeName(child) + if node_name not in {'atom', 'COMMA'}: + _AppendFirstLeafTokenSubtype(child, list_subtype) + + +def _AppendTokenSubtype(node, subtype): + """Append the token's subtype only if it's not already set.""" + pytree_utils.AppendNodeAnnotation(node, pytree_utils.Annotation.SUBTYPE, + subtype) + + +def _AppendFirstLeafTokenSubtype(node, subtype): + """Append the first leaf token's subtypes.""" + if isinstance(node, pytree.Leaf): + _AppendTokenSubtype(node, subtype) + return + _AppendFirstLeafTokenSubtype(node.children[0], subtype) + + +def _AppendLastLeafTokenSubtype(node, subtype): + """Append the last leaf token's subtypes.""" + if isinstance(node, pytree.Leaf): + _AppendTokenSubtype(node, subtype) + return + _AppendLastLeafTokenSubtype(node.children[-1], subtype) + + +def _AppendSubtypeRec(node, subtype, force=True): + """Append the leafs in the node to the given subtype.""" + if isinstance(node, pytree.Leaf): + _AppendTokenSubtype(node, subtype) + return + for child in node.children: + _AppendSubtypeRec(child, subtype, force=force) + + +def _InsertPseudoParentheses(node): + """Insert pseudo parentheses so that dicts can be formatted correctly.""" + comment_node = None + if isinstance(node, pytree.Node): + if node.children[-1].type == token.COMMENT: + comment_node = node.children[-1].clone() + node.children[-1].remove() + + first = pytree_utils.FirstLeafNode(node) + last = pytree_utils.LastLeafNode(node) + + if first == last and first.type == token.COMMENT: + # A comment was inserted before the value, which is a pytree.Leaf. + # Encompass the dictionary's value into an ATOM node. + last = first.next_sibling + last_clone = last.clone() + new_node = pytree.Node(syms.atom, [first.clone(), last_clone]) + for orig_leaf, clone_leaf in zip(last.leaves(), last_clone.leaves()): + pytree_utils.CopyYapfAnnotations(orig_leaf, clone_leaf) + if hasattr(orig_leaf, 'is_pseudo'): + clone_leaf.is_pseudo = orig_leaf.is_pseudo + + node.replace(new_node) + node = new_node + last.remove() + + first = pytree_utils.FirstLeafNode(node) + last = pytree_utils.LastLeafNode(node) + + lparen = pytree.Leaf( + token.LPAR, u'(', context=('', (first.get_lineno(), first.column - 1))) + last_lineno = last.get_lineno() + if last.type == token.STRING and '\n' in last.value: + last_lineno += last.value.count('\n') + + if last.type == token.STRING and '\n' in last.value: + last_column = len(last.value.split('\n')[-1]) + 1 + else: + last_column = last.column + len(last.value) + 1 + rparen = pytree.Leaf( + token.RPAR, u')', context=('', (last_lineno, last_column))) + + lparen.is_pseudo = True + rparen.is_pseudo = True + + if isinstance(node, pytree.Node): + node.insert_child(0, lparen) + node.append_child(rparen) + if comment_node: + node.append_child(comment_node) + _AppendFirstLeafTokenSubtype(node, format_token.Subtype.DICTIONARY_VALUE) + else: + clone = node.clone() + for orig_leaf, clone_leaf in zip(node.leaves(), clone.leaves()): + pytree_utils.CopyYapfAnnotations(orig_leaf, clone_leaf) + new_node = pytree.Node(syms.atom, [lparen, clone, rparen]) + node.replace(new_node) + _AppendFirstLeafTokenSubtype(clone, format_token.Subtype.DICTIONARY_VALUE) + + +def _IsAExprOperator(node): + return isinstance(node, pytree.Leaf) and node.value in {'+', '-'} + + +def _IsMExprOperator(node): + return isinstance(node, + pytree.Leaf) and node.value in {'*', '/', '%', '//', '@'} + + +def _IsSimpleExpression(node): + """A node with only leafs as children.""" + return all(isinstance(child, pytree.Leaf) for child in node.children) diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/unwrapped_line.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/unwrapped_line.py new file mode 100644 index 00000000..475bd6e0 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/unwrapped_line.py @@ -0,0 +1,673 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""UnwrappedLine primitive for formatting. + +An unwrapped line is the containing data structure produced by the parser. It +collects all nodes (stored in FormatToken objects) that could appear on a +single line if there were no line length restrictions. It's then used by the +parser to perform the wrapping required to comply with the style guide. +""" + +from yapf.yapflib import format_token +from yapf.yapflib import py3compat +from yapf.yapflib import pytree_utils +from yapf.yapflib import split_penalty +from yapf.yapflib import style + +from lib2to3.fixer_util import syms as python_symbols + + +class UnwrappedLine(object): + """Represents a single unwrapped line in the output. + + Attributes: + depth: indentation depth of this line. This is just a numeric value used to + distinguish lines that are more deeply nested than others. It is not the + actual amount of spaces, which is style-dependent. + """ + + def __init__(self, depth, tokens=None): + """Constructor. + + Creates a new unwrapped line with the given depth an initial list of tokens. + Constructs the doubly-linked lists for format tokens using their built-in + next_token and previous_token attributes. + + Arguments: + depth: indentation depth of this line + tokens: initial list of tokens + """ + self.depth = depth + self._tokens = tokens or [] + self.disable = False + + if self._tokens: + # Set up a doubly linked list. + for index, tok in enumerate(self._tokens[1:]): + # Note, 'index' is the index to the previous token. + tok.previous_token = self._tokens[index] + self._tokens[index].next_token = tok + + def CalculateFormattingInformation(self): + """Calculate the split penalty and total length for the tokens.""" + # Say that the first token in the line should have a space before it. This + # means only that if this unwrapped line is joined with a predecessor line, + # then there will be a space between them. + self.first.spaces_required_before = 1 + self.first.total_length = len(self.first.value) + + prev_token = self.first + prev_length = self.first.total_length + for token in self._tokens[1:]: + if (token.spaces_required_before == 0 and + _SpaceRequiredBetween(prev_token, token, self.disable)): + token.spaces_required_before = 1 + + tok_len = len(token.value) if not token.is_pseudo_paren else 0 + + spaces_required_before = token.spaces_required_before + if isinstance(spaces_required_before, list): + assert token.is_comment, token + + # If here, we are looking at a comment token that appears on a line + # with other tokens (but because it is a comment, it is always the last + # token). Rather than specifying the actual number of spaces here, + # hard code a value of 0 and then set it later. This logic only works + # because this comment token is guaranteed to be the last token in the + # list. + spaces_required_before = 0 + + token.total_length = prev_length + tok_len + spaces_required_before + + # The split penalty has to be computed before {must|can}_break_before, + # because these may use it for their decision. + token.split_penalty += _SplitPenalty(prev_token, token) + token.must_break_before = _MustBreakBefore(prev_token, token) + token.can_break_before = ( + token.must_break_before or _CanBreakBefore(prev_token, token)) + + prev_length = token.total_length + prev_token = token + + def Split(self): + """Split the line at semicolons.""" + if not self.has_semicolon or self.disable: + return [self] + + uwlines = [] + uwline = UnwrappedLine(self.depth) + for tok in self._tokens: + if tok.value == ';': + uwlines.append(uwline) + uwline = UnwrappedLine(self.depth) + else: + uwline.AppendToken(tok) + + if uwline.tokens: + uwlines.append(uwline) + + for uwline in uwlines: + pytree_utils.SetNodeAnnotation(uwline.first.node, + pytree_utils.Annotation.MUST_SPLIT, True) + uwline.first.previous_token = None + uwline.last.next_token = None + + return uwlines + + ############################################################################ + # Token Access and Manipulation Methods # + ############################################################################ + + def AppendToken(self, token): + """Append a new FormatToken to the tokens contained in this line.""" + if self._tokens: + token.previous_token = self.last + self.last.next_token = token + self._tokens.append(token) + + def AppendNode(self, node): + """Convenience method to append a pytree node directly. + + Wraps the node with a FormatToken. + + Arguments: + node: the node to append + """ + self.AppendToken(format_token.FormatToken(node)) + + @property + def first(self): + """Returns the first non-whitespace token.""" + return self._tokens[0] + + @property + def last(self): + """Returns the last non-whitespace token.""" + return self._tokens[-1] + + ############################################################################ + # Token -> String Methods # + ############################################################################ + + def AsCode(self, indent_per_depth=2): + """Return a "code" representation of this line. + + The code representation shows how the line would be printed out as code. + + TODO(eliben): for now this is rudimentary for debugging - once we add + formatting capabilities, this method will have other uses (not all tokens + have spaces around them, for example). + + Arguments: + indent_per_depth: how much spaces to indend per depth level. + + Returns: + A string representing the line as code. + """ + indent = ' ' * indent_per_depth * self.depth + tokens_str = ' '.join(tok.value for tok in self._tokens) + return indent + tokens_str + + def __str__(self): # pragma: no cover + return self.AsCode() + + def __repr__(self): # pragma: no cover + tokens_repr = ','.join( + ['{0}({1!r})'.format(tok.name, tok.value) for tok in self._tokens]) + return 'UnwrappedLine(depth={0}, tokens=[{1}])'.format( + self.depth, tokens_repr) + + ############################################################################ + # Properties # + ############################################################################ + + @property + def tokens(self): + """Access the tokens contained within this line. + + The caller must not modify the tokens list returned by this method. + + Returns: + List of tokens in this line. + """ + return self._tokens + + @property + def lineno(self): + """Return the line number of this unwrapped line. + + Returns: + The line number of the first token in this unwrapped line. + """ + return self.first.lineno + + @property + def is_comment(self): + return self.first.is_comment + + @property + def has_semicolon(self): + return any(tok.value == ';' for tok in self._tokens) + + +def _IsIdNumberStringToken(tok): + return tok.is_keyword or tok.is_name or tok.is_number or tok.is_string + + +def _IsUnaryOperator(tok): + return format_token.Subtype.UNARY_OPERATOR in tok.subtypes + + +def _HasPrecedence(tok): + """Whether a binary operation has precedence within its context.""" + node = tok.node + + # We let ancestor be the statement surrounding the operation that tok is the + # operator in. + ancestor = node.parent.parent + + while ancestor is not None: + # Search through the ancestor nodes in the parse tree for operators with + # lower precedence. + predecessor_type = pytree_utils.NodeName(ancestor) + if predecessor_type in ['arith_expr', 'term']: + # An ancestor "arith_expr" or "term" means we have found an operator + # with lower precedence than our tok. + return True + if predecessor_type != 'atom': + # We understand the context to look for precedence within as an + # arbitrary nesting of "arith_expr", "term", and "atom" nodes. If we + # leave this context we have not found a lower precedence operator. + return False + # Under normal usage we expect a complete parse tree to be available and + # we will return before we get an AttributeError from the root. + ancestor = ancestor.parent + + +def _PriorityIndicatingNoSpace(tok): + """Whether to remove spaces around an operator due to precedence.""" + if not tok.is_arithmetic_op or not tok.is_simple_expr: + # Limit space removal to highest priority arithmetic operators + return False + return _HasPrecedence(tok) + + +def _IsSubscriptColonAndValuePair(token1, token2): + return (token1.is_number or token1.is_name) and token2.is_subscript_colon + + +def _SpaceRequiredBetween(left, right, is_line_disabled): + """Return True if a space is required between the left and right token.""" + lval = left.value + rval = right.value + if (left.is_pseudo_paren and _IsIdNumberStringToken(right) and + left.previous_token and _IsIdNumberStringToken(left.previous_token)): + # Space between keyword... tokens and pseudo parens. + return True + if left.is_pseudo_paren or right.is_pseudo_paren: + # There should be a space after the ':' in a dictionary. + if left.OpensScope(): + return True + # The closing pseudo-paren shouldn't affect spacing. + return False + if left.is_continuation or right.is_continuation: + # The continuation node's value has all of the spaces it needs. + return False + if right.name in pytree_utils.NONSEMANTIC_TOKENS: + # No space before a non-semantic token. + return False + if _IsIdNumberStringToken(left) and _IsIdNumberStringToken(right): + # Spaces between keyword, string, number, and identifier tokens. + return True + if lval == ',' and rval == ':': + # We do want a space between a comma and colon. + return True + if style.Get('SPACE_INSIDE_BRACKETS'): + # Supersede the "no space before a colon or comma" check. + if lval in pytree_utils.OPENING_BRACKETS and rval == ':': + return True + if rval in pytree_utils.CLOSING_BRACKETS and lval == ':': + return True + if (style.Get('SPACES_AROUND_SUBSCRIPT_COLON') and + (_IsSubscriptColonAndValuePair(left, right) or + _IsSubscriptColonAndValuePair(right, left))): + # Supersede the "never want a space before a colon or comma" check. + return True + if rval in ':,': + # Otherwise, we never want a space before a colon or comma. + return False + if lval == ',' and rval in ']})': + # Add a space between ending ',' and closing bracket if requested. + return style.Get('SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKET') + if lval == ',': + # We want a space after a comma. + return True + if lval == 'from' and rval == '.': + # Space before the '.' in an import statement. + return True + if lval == '.' and rval == 'import': + # Space after the '.' in an import statement. + return True + if (lval == '=' and rval == '.' and + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN not in left.subtypes): + # Space between equal and '.' as in "X = ...". + return True + if ((right.is_keyword or right.is_name) and + (left.is_keyword or left.is_name)): + # Don't merge two keywords/identifiers. + return True + if (format_token.Subtype.SUBSCRIPT_COLON in left.subtypes or + format_token.Subtype.SUBSCRIPT_COLON in right.subtypes): + # A subscript shouldn't have spaces separating its colons. + return False + if (format_token.Subtype.TYPED_NAME in left.subtypes or + format_token.Subtype.TYPED_NAME in right.subtypes): + # A typed argument should have a space after the colon. + return True + if left.is_string: + if (rval == '=' and format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN_ARG_LIST + in right.subtypes): + # If there is a type hint, then we don't want to add a space between the + # equal sign and the hint. + return False + if rval not in '[)]}.' and not right.is_binary_op: + # A string followed by something other than a subscript, closing bracket, + # dot, or a binary op should have a space after it. + return True + if rval in pytree_utils.CLOSING_BRACKETS: + # A string followed by closing brackets should have a space after it + # depending on SPACE_INSIDE_BRACKETS. A string followed by opening + # brackets, however, should not. + return style.Get('SPACE_INSIDE_BRACKETS') + if format_token.Subtype.SUBSCRIPT_BRACKET in right.subtypes: + # It's legal to do this in Python: 'hello'[a] + return False + if left.is_binary_op and lval != '**' and _IsUnaryOperator(right): + # Space between the binary operator and the unary operator. + return True + if left.is_keyword and _IsUnaryOperator(right): + # Handle things like "not -3 < x". + return True + if _IsUnaryOperator(left) and _IsUnaryOperator(right): + # No space between two unary operators. + return False + if left.is_binary_op or right.is_binary_op: + if lval == '**' or rval == '**': + # Space around the "power" operator. + return style.Get('SPACES_AROUND_POWER_OPERATOR') + # Enforce spaces around binary operators except the blocked ones. + block_list = style.Get('NO_SPACES_AROUND_SELECTED_BINARY_OPERATORS') + if lval in block_list or rval in block_list: + return False + if style.Get('ARITHMETIC_PRECEDENCE_INDICATION'): + if _PriorityIndicatingNoSpace(left) or _PriorityIndicatingNoSpace(right): + return False + else: + return True + else: + return True + if (_IsUnaryOperator(left) and lval != 'not' and + (right.is_name or right.is_number or rval == '(')): + # The previous token was a unary op. No space is desired between it and + # the current token. + return False + if (format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN in left.subtypes and + format_token.Subtype.TYPED_NAME not in right.subtypes): + # A named argument or default parameter shouldn't have spaces around it. + return style.Get('SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN') + if (format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN in right.subtypes and + format_token.Subtype.TYPED_NAME not in left.subtypes): + # A named argument or default parameter shouldn't have spaces around it. + return style.Get('SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN') + if (format_token.Subtype.VARARGS_LIST in left.subtypes or + format_token.Subtype.VARARGS_LIST in right.subtypes): + return False + if (format_token.Subtype.VARARGS_STAR in left.subtypes or + format_token.Subtype.KWARGS_STAR_STAR in left.subtypes): + # Don't add a space after a vararg's star or a keyword's star-star. + return False + if lval == '@' and format_token.Subtype.DECORATOR in left.subtypes: + # Decorators shouldn't be separated from the 'at' sign. + return False + if left.is_keyword and rval == '.': + # Add space between keywords and dots. + return lval != 'None' and lval != 'print' + if lval == '.' and right.is_keyword: + # Add space between keywords and dots. + return rval != 'None' and rval != 'print' + if lval == '.' or rval == '.': + # Don't place spaces between dots. + return False + if ((lval == '(' and rval == ')') or (lval == '[' and rval == ']') or + (lval == '{' and rval == '}')): + # Empty objects shouldn't be separated by spaces. + return False + if not is_line_disabled and (left.OpensScope() or right.ClosesScope()): + if (style.GetOrDefault('SPACES_AROUND_DICT_DELIMITERS', False) and ( + (lval == '{' and _IsDictListTupleDelimiterTok(left, is_opening=True)) or + (rval == '}' and + _IsDictListTupleDelimiterTok(right, is_opening=False)))): + return True + if (style.GetOrDefault('SPACES_AROUND_LIST_DELIMITERS', False) and ( + (lval == '[' and _IsDictListTupleDelimiterTok(left, is_opening=True)) or + (rval == ']' and + _IsDictListTupleDelimiterTok(right, is_opening=False)))): + return True + if (style.GetOrDefault('SPACES_AROUND_TUPLE_DELIMITERS', False) and ( + (lval == '(' and _IsDictListTupleDelimiterTok(left, is_opening=True)) or + (rval == ')' and + _IsDictListTupleDelimiterTok(right, is_opening=False)))): + return True + if (lval in pytree_utils.OPENING_BRACKETS and + rval in pytree_utils.OPENING_BRACKETS): + # Nested objects' opening brackets shouldn't be separated, unless enabled + # by SPACE_INSIDE_BRACKETS. + return style.Get('SPACE_INSIDE_BRACKETS') + if (lval in pytree_utils.CLOSING_BRACKETS and + rval in pytree_utils.CLOSING_BRACKETS): + # Nested objects' closing brackets shouldn't be separated, unless enabled + # by SPACE_INSIDE_BRACKETS. + return style.Get('SPACE_INSIDE_BRACKETS') + if lval in pytree_utils.CLOSING_BRACKETS and rval in '([': + # A call, set, dictionary, or subscript that has a call or subscript after + # it shouldn't have a space between them. + return False + if lval in pytree_utils.OPENING_BRACKETS and _IsIdNumberStringToken(right): + # Don't separate the opening bracket from the first item, unless enabled + # by SPACE_INSIDE_BRACKETS. + return style.Get('SPACE_INSIDE_BRACKETS') + if left.is_name and rval in '([': + # Don't separate a call or array access from the name. + return False + if rval in pytree_utils.CLOSING_BRACKETS: + # Don't separate the closing bracket from the last item, unless enabled + # by SPACE_INSIDE_BRACKETS. + # FIXME(morbo): This might be too permissive. + return style.Get('SPACE_INSIDE_BRACKETS') + if lval == 'print' and rval == '(': + # Special support for the 'print' function. + return False + if lval in pytree_utils.OPENING_BRACKETS and _IsUnaryOperator(right): + # Don't separate a unary operator from the opening bracket, unless enabled + # by SPACE_INSIDE_BRACKETS. + return style.Get('SPACE_INSIDE_BRACKETS') + if (lval in pytree_utils.OPENING_BRACKETS and + (format_token.Subtype.VARARGS_STAR in right.subtypes or + format_token.Subtype.KWARGS_STAR_STAR in right.subtypes)): + # Don't separate a '*' or '**' from the opening bracket, unless enabled + # by SPACE_INSIDE_BRACKETS. + return style.Get('SPACE_INSIDE_BRACKETS') + if rval == ';': + # Avoid spaces before a semicolon. (Why is there a semicolon?!) + return False + if lval == '(' and rval == 'await': + # Special support for the 'await' keyword. Don't separate the 'await' + # keyword from an opening paren, unless enabled by SPACE_INSIDE_BRACKETS. + return style.Get('SPACE_INSIDE_BRACKETS') + return True + + +def _MustBreakBefore(prev_token, cur_token): + """Return True if a line break is required before the current token.""" + if prev_token.is_comment or (prev_token.previous_token and + prev_token.is_pseudo_paren and + prev_token.previous_token.is_comment): + # Must break if the previous token was a comment. + return True + if (cur_token.is_string and prev_token.is_string and + IsSurroundedByBrackets(cur_token)): + # We want consecutive strings to be on separate lines. This is a + # reasonable assumption, because otherwise they should have written them + # all on the same line, or with a '+'. + return True + return pytree_utils.GetNodeAnnotation( + cur_token.node, pytree_utils.Annotation.MUST_SPLIT, default=False) + + +def _CanBreakBefore(prev_token, cur_token): + """Return True if a line break may occur before the current token.""" + pval = prev_token.value + cval = cur_token.value + if py3compat.PY3: + if pval == 'yield' and cval == 'from': + # Don't break before a yield argument. + return False + if pval in {'async', 'await'} and cval in {'def', 'with', 'for'}: + # Don't break after sync keywords. + return False + if cur_token.split_penalty >= split_penalty.UNBREAKABLE: + return False + if pval == '@': + # Don't break right after the beginning of a decorator. + return False + if cval == ':': + # Don't break before the start of a block of code. + return False + if cval == ',': + # Don't break before a comma. + return False + if prev_token.is_name and cval == '(': + # Don't break in the middle of a function definition or call. + return False + if prev_token.is_name and cval == '[': + # Don't break in the middle of an array dereference. + return False + if cur_token.is_comment and prev_token.lineno == cur_token.lineno: + # Don't break a comment at the end of the line. + return False + if format_token.Subtype.UNARY_OPERATOR in prev_token.subtypes: + # Don't break after a unary token. + return False + if not style.Get('ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNS'): + if (format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN in cur_token.subtypes or + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN in prev_token.subtypes): + return False + return True + + +def IsSurroundedByBrackets(tok): + """Return True if the token is surrounded by brackets.""" + paren_count = 0 + brace_count = 0 + sq_bracket_count = 0 + previous_token = tok.previous_token + while previous_token: + if previous_token.value == ')': + paren_count -= 1 + elif previous_token.value == '}': + brace_count -= 1 + elif previous_token.value == ']': + sq_bracket_count -= 1 + + if previous_token.value == '(': + if paren_count == 0: + return previous_token + paren_count += 1 + elif previous_token.value == '{': + if brace_count == 0: + return previous_token + brace_count += 1 + elif previous_token.value == '[': + if sq_bracket_count == 0: + return previous_token + sq_bracket_count += 1 + + previous_token = previous_token.previous_token + return None + + +def _IsDictListTupleDelimiterTok(tok, is_opening): + assert tok + + if tok.matching_bracket is None: + return False + + if is_opening: + open_tok = tok + close_tok = tok.matching_bracket + else: + open_tok = tok.matching_bracket + close_tok = tok + + # There must be something in between the tokens + if open_tok.next_token == close_tok: + return False + + assert open_tok.next_token.node + assert open_tok.next_token.node.parent + + return open_tok.next_token.node.parent.type in [ + python_symbols.dictsetmaker, + python_symbols.listmaker, + python_symbols.testlist_gexp, + ] + + +_LOGICAL_OPERATORS = frozenset({'and', 'or'}) +_BITWISE_OPERATORS = frozenset({'&', '|', '^'}) +_ARITHMETIC_OPERATORS = frozenset({'+', '-', '*', '/', '%', '//', '@'}) + + +def _SplitPenalty(prev_token, cur_token): + """Return the penalty for breaking the line before the current token.""" + pval = prev_token.value + cval = cur_token.value + if pval == 'not': + return split_penalty.UNBREAKABLE + + if cur_token.node_split_penalty > 0: + return cur_token.node_split_penalty + + if style.Get('SPLIT_BEFORE_LOGICAL_OPERATOR'): + # Prefer to split before 'and' and 'or'. + if pval in _LOGICAL_OPERATORS: + return style.Get('SPLIT_PENALTY_LOGICAL_OPERATOR') + if cval in _LOGICAL_OPERATORS: + return 0 + else: + # Prefer to split after 'and' and 'or'. + if pval in _LOGICAL_OPERATORS: + return 0 + if cval in _LOGICAL_OPERATORS: + return style.Get('SPLIT_PENALTY_LOGICAL_OPERATOR') + + if style.Get('SPLIT_BEFORE_BITWISE_OPERATOR'): + # Prefer to split before '&', '|', and '^'. + if pval in _BITWISE_OPERATORS: + return style.Get('SPLIT_PENALTY_BITWISE_OPERATOR') + if cval in _BITWISE_OPERATORS: + return 0 + else: + # Prefer to split after '&', '|', and '^'. + if pval in _BITWISE_OPERATORS: + return 0 + if cval in _BITWISE_OPERATORS: + return style.Get('SPLIT_PENALTY_BITWISE_OPERATOR') + + if (format_token.Subtype.COMP_FOR in cur_token.subtypes or + format_token.Subtype.COMP_IF in cur_token.subtypes): + # We don't mind breaking before the 'for' or 'if' of a list comprehension. + return 0 + if format_token.Subtype.UNARY_OPERATOR in prev_token.subtypes: + # Try not to break after a unary operator. + return style.Get('SPLIT_PENALTY_AFTER_UNARY_OPERATOR') + if pval == ',': + # Breaking after a comma is fine, if need be. + return 0 + if pval == '**' or cval == '**': + return split_penalty.STRONGLY_CONNECTED + if (format_token.Subtype.VARARGS_STAR in prev_token.subtypes or + format_token.Subtype.KWARGS_STAR_STAR in prev_token.subtypes): + # Don't split after a varargs * or kwargs **. + return split_penalty.UNBREAKABLE + if prev_token.OpensScope() and cval != '(': + # Slightly prefer + return style.Get('SPLIT_PENALTY_AFTER_OPENING_BRACKET') + if cval == ':': + # Don't split before a colon. + return split_penalty.UNBREAKABLE + if cval == '=': + # Don't split before an assignment. + return split_penalty.UNBREAKABLE + if (format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN in prev_token.subtypes or + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN in cur_token.subtypes): + # Don't break before or after an default or named assignment. + return split_penalty.UNBREAKABLE + if cval == '==': + # We would rather not split before an equality operator. + return split_penalty.STRONGLY_CONNECTED + if cur_token.ClosesScope(): + # Give a slight penalty for splitting before the closing scope. + return 100 + return 0 diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/verifier.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/verifier.py new file mode 100644 index 00000000..bcbe6fb6 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/verifier.py @@ -0,0 +1,93 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Verify that the generated code is valid code. + +This takes a line of code and "normalizes" it. I.e., it transforms the snippet +into something that has the potential to compile. + + VerifyCode(): the main function exported by this module. +""" + +import ast +import re +import sys +import textwrap + + +class InternalError(Exception): + """Internal error in verifying formatted code.""" + pass + + +def VerifyCode(code): + """Verify that the reformatted code is syntactically correct. + + Arguments: + code: (unicode) The reformatted code snippet. + + Raises: + SyntaxError if the code was reformatted incorrectly. + """ + try: + compile(textwrap.dedent(code).encode('UTF-8'), '', 'exec') + except SyntaxError: + try: + ast.parse(textwrap.dedent(code.lstrip('\n')).lstrip(), '', 'exec') + except SyntaxError: + try: + normalized_code = _NormalizeCode(code) + compile(normalized_code.encode('UTF-8'), '', 'exec') + except SyntaxError: + raise InternalError(sys.exc_info()[1]) + + +def _NormalizeCode(code): + """Make sure that the code snippet is compilable.""" + code = textwrap.dedent(code.lstrip('\n')).lstrip() + + # Split the code to lines and get rid of all leading full-comment lines as + # they can mess up the normalization attempt. + lines = code.split('\n') + i = 0 + for i, line in enumerate(lines): + line = line.strip() + if line and not line.startswith('#'): + break + code = '\n'.join(lines[i:]) + '\n' + + if re.match(r'(if|while|for|with|def|class|async|await)\b', code): + code += '\n pass' + elif re.match(r'(elif|else)\b', code): + try: + try_code = 'if True:\n pass\n' + code + '\n pass' + ast.parse( + textwrap.dedent(try_code.lstrip('\n')).lstrip(), '', 'exec') + code = try_code + except SyntaxError: + # The assumption here is that the code is on a single line. + code = 'if True: pass\n' + code + elif code.startswith('@'): + code += '\ndef _():\n pass' + elif re.match(r'try\b', code): + code += '\n pass\nexcept:\n pass' + elif re.match(r'(except|finally)\b', code): + code = 'try:\n pass\n' + code + '\n pass' + elif re.match(r'(return|yield)\b', code): + code = 'def _():\n ' + code + elif re.match(r'(continue|break)\b', code): + code = 'while True:\n ' + code + elif re.match(r'print\b', code): + code = 'from __future__ import print_function\n' + code + + return code + '\n' diff --git a/.venv/lib/python3.9/site-packages/yapf/yapflib/yapf_api.py b/.venv/lib/python3.9/site-packages/yapf/yapflib/yapf_api.py new file mode 100644 index 00000000..dde1df93 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapf/yapflib/yapf_api.py @@ -0,0 +1,319 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Entry points for YAPF. + +The main APIs that YAPF exposes to drive the reformatting. + + FormatFile(): reformat a file. + FormatCode(): reformat a string of code. + +These APIs have some common arguments: + + style_config: (string) Either a style name or a path to a file that contains + formatting style settings. If None is specified, use the default style + as set in style.DEFAULT_STYLE_FACTORY + lines: (list of tuples of integers) A list of tuples of lines, [start, end], + that we want to format. The lines are 1-based indexed. It can be used by + third-party code (e.g., IDEs) when reformatting a snippet of code rather + than a whole file. + print_diff: (bool) Instead of returning the reformatted source, return a + diff that turns the formatted source into reformatter source. + verify: (bool) True if reformatted code should be verified for syntax. +""" + +import difflib +import re +import sys + +from lib2to3.pgen2 import parse + +from yapf.yapflib import blank_line_calculator +from yapf.yapflib import comment_splicer +from yapf.yapflib import continuation_splicer +from yapf.yapflib import file_resources +from yapf.yapflib import identify_container +from yapf.yapflib import py3compat +from yapf.yapflib import pytree_unwrapper +from yapf.yapflib import pytree_utils +from yapf.yapflib import reformatter +from yapf.yapflib import split_penalty +from yapf.yapflib import style +from yapf.yapflib import subtype_assigner + + +def FormatFile(filename, + style_config=None, + lines=None, + print_diff=False, + verify=False, + in_place=False, + logger=None): + """Format a single Python file and return the formatted code. + + Arguments: + filename: (unicode) The file to reformat. + style_config: (string) Either a style name or a path to a file that contains + formatting style settings. If None is specified, use the default style + as set in style.DEFAULT_STYLE_FACTORY + lines: (list of tuples of integers) A list of tuples of lines, [start, end], + that we want to format. The lines are 1-based indexed. It can be used by + third-party code (e.g., IDEs) when reformatting a snippet of code rather + than a whole file. + print_diff: (bool) Instead of returning the reformatted source, return a + diff that turns the formatted source into reformatter source. + verify: (bool) True if reformatted code should be verified for syntax. + in_place: (bool) If True, write the reformatted code back to the file. + logger: (io streamer) A stream to output logging. + + Returns: + Tuple of (reformatted_code, encoding, changed). reformatted_code is None if + the file is successfully written to (having used in_place). reformatted_code + is a diff if print_diff is True. + + Raises: + IOError: raised if there was an error reading the file. + ValueError: raised if in_place and print_diff are both specified. + """ + _CheckPythonVersion() + + if in_place and print_diff: + raise ValueError('Cannot pass both in_place and print_diff.') + + original_source, newline, encoding = ReadFile(filename, logger) + reformatted_source, changed = FormatCode( + original_source, + style_config=style_config, + filename=filename, + lines=lines, + print_diff=print_diff, + verify=verify) + if reformatted_source.rstrip('\n'): + lines = reformatted_source.rstrip('\n').split('\n') + reformatted_source = newline.join(line for line in lines) + newline + if in_place: + if original_source and original_source != reformatted_source: + file_resources.WriteReformattedCode(filename, reformatted_source, + encoding, in_place) + return None, encoding, changed + + return reformatted_source, encoding, changed + + +def FormatCode(unformatted_source, + filename='', + style_config=None, + lines=None, + print_diff=False, + verify=False): + """Format a string of Python code. + + This provides an alternative entry point to YAPF. + + Arguments: + unformatted_source: (unicode) The code to format. + filename: (unicode) The name of the file being reformatted. + style_config: (string) Either a style name or a path to a file that contains + formatting style settings. If None is specified, use the default style + as set in style.DEFAULT_STYLE_FACTORY + lines: (list of tuples of integers) A list of tuples of lines, [start, end], + that we want to format. The lines are 1-based indexed. It can be used by + third-party code (e.g., IDEs) when reformatting a snippet of code rather + than a whole file. + print_diff: (bool) Instead of returning the reformatted source, return a + diff that turns the formatted source into reformatter source. + verify: (bool) True if reformatted code should be verified for syntax. + + Returns: + Tuple of (reformatted_source, changed). reformatted_source conforms to the + desired formatting style. changed is True if the source changed. + """ + _CheckPythonVersion() + style.SetGlobalStyle(style.CreateStyleFromConfig(style_config)) + if not unformatted_source.endswith('\n'): + unformatted_source += '\n' + + try: + tree = pytree_utils.ParseCodeToTree(unformatted_source) + except parse.ParseError as e: + e.msg = filename + ': ' + e.msg + raise + + # Run passes on the tree, modifying it in place. + comment_splicer.SpliceComments(tree) + continuation_splicer.SpliceContinuations(tree) + subtype_assigner.AssignSubtypes(tree) + identify_container.IdentifyContainers(tree) + split_penalty.ComputeSplitPenalties(tree) + blank_line_calculator.CalculateBlankLines(tree) + + uwlines = pytree_unwrapper.UnwrapPyTree(tree) + for uwl in uwlines: + uwl.CalculateFormattingInformation() + + lines = _LineRangesToSet(lines) + _MarkLinesToFormat(uwlines, lines) + reformatted_source = reformatter.Reformat( + _SplitSemicolons(uwlines), verify, lines) + + if unformatted_source == reformatted_source: + return '' if print_diff else reformatted_source, False + + code_diff = _GetUnifiedDiff( + unformatted_source, reformatted_source, filename=filename) + + if print_diff: + return code_diff, code_diff.strip() != '' # pylint: disable=g-explicit-bool-comparison + + return reformatted_source, True + + +def _CheckPythonVersion(): # pragma: no cover + errmsg = 'yapf is only supported for Python 2.7 or 3.4+' + if sys.version_info[0] == 2: + if sys.version_info[1] < 7: + raise RuntimeError(errmsg) + elif sys.version_info[0] == 3: + if sys.version_info[1] < 4: + raise RuntimeError(errmsg) + + +def ReadFile(filename, logger=None): + """Read the contents of the file. + + An optional logger can be specified to emit messages to your favorite logging + stream. If specified, then no exception is raised. This is external so that it + can be used by third-party applications. + + Arguments: + filename: (unicode) The name of the file. + logger: (function) A function or lambda that takes a string and emits it. + + Returns: + The contents of filename. + + Raises: + IOError: raised if there was an error reading the file. + """ + try: + encoding = file_resources.FileEncoding(filename) + + # Preserves line endings. + with py3compat.open_with_encoding( + filename, mode='r', encoding=encoding, newline='') as fd: + lines = fd.readlines() + + line_ending = file_resources.LineEnding(lines) + source = '\n'.join(line.rstrip('\r\n') for line in lines) + '\n' + return source, line_ending, encoding + except IOError as err: # pragma: no cover + if logger: + logger(err) + raise + except UnicodeDecodeError as err: # pragma: no cover + if logger: + logger('Could not parse %s! Consider excluding this file with --exclude.', + filename) + logger(err) + raise + + +def _SplitSemicolons(uwlines): + res = [] + for uwline in uwlines: + res.extend(uwline.Split()) + return res + + +DISABLE_PATTERN = r'^#.*\byapf:\s*disable\b' +ENABLE_PATTERN = r'^#.*\byapf:\s*enable\b' + + +def _LineRangesToSet(line_ranges): + """Return a set of lines in the range.""" + + if line_ranges is None: + return None + + line_set = set() + for low, high in sorted(line_ranges): + line_set.update(range(low, high + 1)) + + return line_set + + +def _MarkLinesToFormat(uwlines, lines): + """Skip sections of code that we shouldn't reformat.""" + if lines: + for uwline in uwlines: + uwline.disable = not lines.intersection( + range(uwline.lineno, uwline.last.lineno + 1)) + + # Now go through the lines and disable any lines explicitly marked as + # disabled. + index = 0 + while index < len(uwlines): + uwline = uwlines[index] + if uwline.is_comment: + if _DisableYAPF(uwline.first.value.strip()): + index += 1 + while index < len(uwlines): + uwline = uwlines[index] + if uwline.is_comment and _EnableYAPF(uwline.first.value.strip()): + if not re.search(DISABLE_PATTERN, + uwline.first.value.strip().split('\n')[-1].strip(), + re.IGNORECASE): + break + uwline.disable = True + index += 1 + elif re.search(DISABLE_PATTERN, uwline.last.value.strip(), re.IGNORECASE): + uwline.disable = True + index += 1 + + +def _DisableYAPF(line): + return (re.search(DISABLE_PATTERN, + line.split('\n')[0].strip(), re.IGNORECASE) or + re.search(DISABLE_PATTERN, + line.split('\n')[-1].strip(), re.IGNORECASE)) + + +def _EnableYAPF(line): + return (re.search(ENABLE_PATTERN, + line.split('\n')[0].strip(), re.IGNORECASE) or + re.search(ENABLE_PATTERN, + line.split('\n')[-1].strip(), re.IGNORECASE)) + + +def _GetUnifiedDiff(before, after, filename='code'): + """Get a unified diff of the changes. + + Arguments: + before: (unicode) The original source code. + after: (unicode) The reformatted source code. + filename: (unicode) The code's filename. + + Returns: + The unified diff text. + """ + before = before.splitlines() + after = after.splitlines() + return '\n'.join( + difflib.unified_diff( + before, + after, + filename, + filename, + '(original)', + '(reformatted)', + lineterm='')) + '\n' diff --git a/.venv/lib/python3.9/site-packages/yapftests/__init__.py b/.venv/lib/python3.9/site-packages/yapftests/__init__.py new file mode 100644 index 00000000..e7522b2c --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/__init__.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..362d53e429f6e27c259c07cb29d44446873b981c GIT binary patch literal 187 zcmYe~<>g`kf?4ZB5<{367#@Q-$bb>ZaRB0C79f$r5X_*-=(m!g2qcUkekJG^mFDT^ zrlw>j>Sq^a7MJ9wr4|+IyJQw;>jzY3l;r2>2PbFb=jZ6_m8IsD>E~o7=@(R%WaQ@= z>sjg-XO^Vu79=KTC#I(s>sKZgq?M!=mlW&A$7kkcmc+;F6;$5hu*uC&Da}c>1KIo; Gh#3I&voXs6 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/blank_line_calculator_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/blank_line_calculator_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3f27d3cc02a2678e4ee5b0c69bd3a1bba9b14a7 GIT binary patch literal 8658 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/file_resources_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/file_resources_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb22b22d81aec795e874764dd2d73e0cf53bcc9a GIT binary patch literal 16551 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 S)ANtc&&|!uzis|-&ir58k@V*P literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/format_decision_state_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/format_decision_state_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..057cb4c5dc34a382d5036aaa25adbb3e5b9b1833 GIT binary patch literal 3113 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/line_joiner_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/line_joiner_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6df57adec0bbc2e23281ce5a5bde774a6281beab GIT binary patch literal 2999 zcmbuBTW=dh6vy}GczwyGDFv#6Is%DeRBWUQltyjU$i0Xv4HiyS*auddos)Qz^{$y2 z=VF<@!0T*Q!yp28J4P$2f1v}~ zT18JvV_)$#C)Gg+SXiJguEG)A7K9xTKJ^$+CcZqyM>f!ah9We_0F$H~YVUN%;wHBa zH7Cb&d-eXU{&a?+V=f_fRo8(!EXbl~<7 z96hK$tjR#ZmmSaF@wPzLh$2Ch*lI*S#aitgBt;48O{X4uQr;mY1{%%i-9D?ldfLh- zJ;Ou*a`>bW7#0XZUmxhdn0-W{%pt>o z02XYrJ*@JgbVwGc>PbJE!6hmZdyDR{Wj0;vTv|y3ZVdg&`mR-Sg2X#>4Npi|iFhW! znMaTyR2}_z{&Uw01p#$#)xGF7h%I>C4OP$yAyrwi5=%n3nONj@Qap9X$#?hCsnc-C zjEw^&H{6sSb*H!tqOH65S&}PSzNq)uum%K0Z1r68GcioQjbivCe4*dR>G$b34P+2W6i~}E=iLGE? z(N9ihIB@)ZVwNflK^vARk)hZh6Z@D2GJq`tU5_q;7@_V@PMYNQL8x$^}OXB5=>1;+&-Uh0LB5A=q8RKL29$tyhv~jM- z=)rVGFl2<)=N8Rn5UN*zuoBuG@}zH>7ge zb?Hz%sVVt%?PvquTev9TEa{0LZc^zzGPlUQPv!$MACfseBhnI`ih`~nxA95uVYXr5 zfnXQy89Q&=XlK%T@~G|MdGDfkdDrE!@48|EdpUMD3KR)<%IPhY4Bn{HqdU946-Jk+ w?9{h^Txq;m#~$g>g62*v8hx63iTx-8@PxL0NmE*et=mRfFB@fZamm*I0aiB!+5i9m literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/main_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/main_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..628f5ed4941d5a828306d3e058b1978511046c48 GIT binary patch literal 5535 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 b4AT;NF<}|RBg*kB=KNWMm&Y&d$yZcE0|) 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/pytree_visitor_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/pytree_visitor_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d7e894a209b80231d417bbaf2ac51a10d156f8d GIT binary patch literal 3644 zcmcgvOLH5?5#HGcuvmhS%p_)H%l61GX%iVp%p7dlvc(cnE+!O6i?CC*F4xu)Ga#2- z?7}k(T0}u7smdq+ft<+Pc=G?5YjW{l$SK`3AOTX8Q@MCq+nCq(bobX^&oEhB3@mv5 z@l!YX_chD<7k1_!7dj8%l|vBBiY!K$oso#ZuansWCvpgmxzKhaSGPTAdyz-1FDzDJ z)#nzga&N!#%!#VZk9<~(YA_S91(;djWIuqJ1zuPqsAI(3` zv?D))2DiXDE3z4h9A-1;xfQuTSbcDjdC&dGGcH9H29Cg7^#{wfA|H$m)Kc6j81Ezl z{;XHDQVBFkkI2ahfgFe`ZUQhvo;4slBRiC(1d2GESo_< z>1tVubZ1m@c@KINm&dp=)(Y;ODdkLmf(p;I-=)c6l4i+H#_9KaJl8X&NDjG>Nv5?? znt~B9(9~VjX|x|E*$B2gQ!l3`q5jV5qc+VrsFCzen$v`_v`h<7U%(E9HfjR!4 zgO(WOtpR6g(mD_j(xMN(x7Jd5(AqlMD~r6f-P{R zFg=ZGgN)y}BC4~sVGXlPXML=KI35&il<_!L^*H`+lw{MHY8v?`^2sJZr$}Aoj>E>1pT6*_vua|f}LaxttY|wW{~#j z6Rc41dt@q=;N?iu3O-)F^_*-%^^<}eovFoUuSzaE1V1b!>5rVH*X zTbg}3CWXMG;zA`s(~)`_x4%N8)D$`)Pf6)Kv!2=$``9()*@Z*wpX8|nSb7s@V((W@ zYyvfh*)ZzrQ5Qz5IEslGI-Rhgf_@4SPxIlZR0}d44525>L8)r|$xxW4i?}MU{pDAy z8v?6=s&?9c-&pUo#aqx56a|ipx6fPeKuguyowY}+kN?(w9J-MMaaIn5IRY_O&$#|J3zs;=e531e;Yg?Q5hBh#Fz<;pWC>2P-X{8bYI4 zS?{d1J6+L&Pi8B{pRoI96u3%!hyv3hS}=^cq%G9E~Q5Ya-_XBOAisEjz6HlGsIM}KVnOl1ud{FsF%Uo0kkZXZ{tNceL|_-uxR&*qR2_dsb_yDDDd6PPlg3eYqYF7YXj-be8nic6W> zIP>1DK7b`A0yahfQ&dNQzB~fv!w%fDevkTZpm+^M6UE0U9-vr7G28u|JmL+QK>H-t zT;KMu`LFnOJ&H&AAW8E$4jbZin2r1q+#}KCsILD5LIGD(oi8RPI#m{pQPZPPmwJ;| z_&-hLcd-a3Q1NkVZMJf8pR3GM{-@?H@fj9niB}fa_HB$x-C26g_1x;xJ)is+y^4Z~ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_basic_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_basic_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4e87f70790d95092efa274fa0fbd45c3f2a1b98 GIT binary patch literal 93792 zcmeIb31A$_bsmh1BnTeMy$|iKn&7TxK!SsV;PTLdyC4aY*d+mq0GGSua>tFS1~9~6 zX105V0EUEQ9kygkwk27%C0Vj}?L^7Sb}T85583h&<#*!bPvSV&Z^r(e#E$|63{%5D`nV)KH`9u1l zULE-HH2%D62w2PI7S_tz3ayu0dE9on4RL#+eWBxWM=QPS!2PDnoA~`E+;6_Tncr_N zY+2~M+}YZ4x`l0FogZmoolfVqtsic`+~sUzTj$%{8K>=)?XR{Vb=zc1PgiaCaofx1 ztcv4RJZq-pTFZ8MCgVD|U9c+^$Ibi+n$$Ah(|T)bdHF!Dv{1Gy__0k%f}fkb%5uTM z%`VEHrQ))4PND3$Im)hH!MA=LcTNkwvE_1`(@tOdk(Lj)UhZJ+tm7jsmp8FZY%}7` z;!7@XVOv=jes{8MY&+tuYzNzkxQpGvb|K!z?qqi%-p=l3_aNTE?q&BO-pTG~4#}MDk9%t`Cd>>1(G~)YN58I3Q z0k)6zB7TtVXBor~u|C$1_+4y(4I+M+9biLXwtb`tU9Y?Pfs{2q3iok5&pW9%8kY4$8Ti@1lKW8;YT zvI%w`@jmuGb^&oOn`Bdn_p^)aIm8)ui9L_FkG;SyBkpHc*o%k<*j4rt;z5>W-+}l5 zv)MG_A(mqd@j>RW8N^SpSvH6G5X-Y`h!3-QRzQ4&EwCcuqpZZrh~LXzW-j63><8E<5kJd5#XgPrEc-$B8N}z<53wIc zJkEZEeHQTq`yBf`;`8iB*%uJMkA0E-7~%`;$Jr~0C)um)ClF7upJaap@kRDm*_RMM z$Nn1o>xeJ0*Vva4KhJ)O{WRhi*w3)Pf%r1}S@spgSJ+qC*ATzR{wDi5#8=thVn2`g zCH4#K7ZGRKFR`y9{toub>{k%m>>KP?5l^#UW513#$9{wTZN!Xyll>jU4*Or&Zz7&y zf0z9|#Ix+T*xyGy$NmBPUlHfoKV<(1@iq33*>5ABXa9u#4&nm)r|h30USR*6{R_lJ z_AlB0hPcFjm)$~KX8(%)9^#kT@3a3MvCIB|{cFS?`#0?0BCfDMWPgOX%KjbuW5n0l z|H1w};zjl+>^~r0V*io-pNN;)|Hb}q#5MN+u>XYk2K!U?pAp|=|1bM9#4GH-u>Xqq z{p`Q7Zz28w`~TSMh`*ElIr|I5A7uYO`|pT9~*lP&3oT3cFf z-NVV}g^*lMf%4_>Cb;OHNZtwjd3PbGw7k-azqVIfUTp;#ZUGr?9q(y(DbcN+lTPJy zp)_q5CW)Zly5ofF*cImm5LNyF6t+EA@Lp?iX+n9u*ymP@eG3lD+kNwH-m8>m9M|hR znfK=V&M(hZO2xj(++3+t=*wJpir4!J`RTs$a%HYmJdiok=jAKT{<58$w`U!%j|exP z2Kp4zo}H%Yfz$I$dHGhC=Tt71PZVs=dzikb4M9s=?cH%u$b@M%fY5ht#vcdB5Wph= z!dhR&zt)yY`zsx+?bX(mR({uxySB=vS2o|o+m-g4Ew603*;eU%W$R76d9}??-w~wW z)KvP-LHaFCrSA;VZ*3}lSCF3W8n=I2kbZlk^c-b&jMt9d@XCdJC2JQ7SUc-3id%Jhtz4;4T_|P?`GtJts5R8T@_Nn+F4ytOrK0DY%;zfBuyv!m zl3xH4+Y9Axt7S*r3%E&ufogyl151`Js#T__c2v$i|iYk?FL3d`BL2X)VLcCnJ3cbqcEjmn(k zIaGqzb5yBU)Ktb$Rvy0o)r1Bp>13*C)#fBkq-?U;(IyvVV=RJKwo)w@9Q5gxIylum zh_=Zxwcx7qU9W%5P@j^9QUtX{o<}QsupvVe5shO%;mi-{@YoMdLJ8!>?}A~E%Yi4pfc>~+;H0NwRon*JSf$*DwYN_ zAX`h~>giFk)IOI`v67Bb-A+3qMexd+Y+6qjpP}6?n7VG=E2d>WC7*Ij3nxm&nf&an z&Wf{CS#<64t<7Mbonpn^M5%Y4w_VQ}DYA=2{_+ltImfM>C^2XB<*Hq9+bLD2+|10mj$)DJO#*;a*2!eTuO#YH>S?K^9)5W$`w%zQYF;cmo--bIjn_^pj7OzZ&K5BLubKsMcK{XK zofO4O*kVp{`^4OqlcGxx${AtX2r>oEfvA9+C?TGXtTpF zhgCc~L2O&3{M5+t6JW7MrgOd49-4ci?@x}N!uylX47~?~6@7np;w;{uEfwhfVx{i= z=`&+^e|jz-o##@|JWDyBnJ=hsRMxKctE*^y!`3%!{<^onXGb{yx%blOypMwWDIluu zK0v{P6wq|$K7`=bHZjxjS?*SQ!6{+|Ns|$ut9mxMw1{*cq2N&p-i_e$y>_mGNij0R zMJKk0wW(&RR6a{Y$e-XAP>wf_K$+k+1rwZ@*l41oiH%}8v2E&V?P`6Xb$gqb|g%N*?r$G{rB3ICP<(AE{yLe(MoZmm0!RDRW7HzOZm#29JeRLu=V~BdA&{qEv;SK zyLN!`JZYvpjf<-zLL@un;j2Lc9brcB#cr z-6dq8#a;UEenA*XkSFR8BE5tXd7Fetj|iy{=`~6(M0%87i1Zqz7a~1MFSz=I^qf#{ z8?QYf$2>X-3vH55Shi|_K(bX|VOMg_@f*{& zhlORSnB{wUNBK@57`cL7oQLQTi_7e^Q(1JJVm4&@MKurxfMdIEyLo%MKw`(imD&;W zC&)K@tVswL>gamyluS_n5%NurM9|i8yM~!B_%6%RL_@VRGIf19AuyUM>9n~d`G!wg zB}newq$Z8YUu4JxqjrgwR}g30siOxD^`@p%M~4P`!{Sr9)X^h@ zhgQNTwE+OK z4s0d{zLsgC&y|AeIyaaUKc;mqYg=i<^af&&KjeuV`6ZQv{*S-+*C6@r*uc z_Y)s`xuxdiG zOzaSJhYBStm0B#h1*R}Y%Da8hmv;E_#!4z9B;;v7RXEKBxMx{dW8xBn$+9#~f@31R z<)Z_!_BOyIN@0P{?cKj`Fu-qt$Fsq>S{@!6jARcASPpXeHBy^wtH)B=8Xq_Py7ukg zXI~i_+`nXD(Z9TR?}2dZ#=aDVd=ecFs#Za6MZsDN!J4x6)xB;2^^iCOa5qygNx1lj z`hoxL2M$?#Edp}T=qQw}7%=;pqcmzJZEO7z*0B$D5OA&ipm;iL&9fCBvFECVN*)Wl zi?f_p_I{K`tiOia)pbwesEp>_m{Iv@1vf-zoKmNf5a_xzW{)*eso1$Wht+ZFqLkyH z_`!r^DrJ@{wPeAy=Vyx~n*vr1DZRPJ@)y4rv<^jWm69bYSi}+;Q$wx<-G-8z2{7Px z@;qHEmC8X0`Y-u8wZ@-g5KRRIi=y6FT{0FW0cHQl>bfPUVr~5r6l3a`Ai?cG`F8T? zeWCwqqGy!$#!3xC!qI%+n1}p!Vo;^H=9|h;zpv|E80x!?yr|5h4RI2f2NUmJed3i; zhBoXBcHC^`;$R4hX@8J2h;8Gwha@gR0z60J-+=%a{0m-d=YsZI9khqch3rwm)SW^w zRh%t2egnTn-$ZQ!pH1BLdyHQ+i5i1!+Gi0f6nxei_=#{W6MP_jaqyAy>7e$s)@ue! zkRvF=+|`e&U9C#%CZRg#cyB13&ljb&14dBE&aW>;gWKBB!M@G=uF@WNrF0hW&LsqL{&s3+Q=G_;|EK0*Lu0Sq#`H{QaqB}ua4WO zLhcpR)uN{yu@;C2CHB*r@wK&-?^K%28?OB>0~D3CzwC-xJ%vMvhPF>az`u!sjup$A zfE|8E47g<#4WJz~WwqcA%jY$`1AuLwt9H`(JtrRZ*J;rew=GvIi zcvKmU!09u5fzOxs>HwsX5@2!ArF-P)37!Z%Az4$*$^!+8_rV}nt04Rkuj?z~@9Or> z`6TMg$+UGNN0S!EdQCYg?w%eauK%nksNZNKEZrl1Cz8Z`vB@wL*Td_MrB1 zpf`MFhR`Dfp(!%dAQEdIC;K_)tnF2xDen}2Qh^Fr&Z`X?p<*m#V;~V2M#LqMvWGXX-hW5b`;oBc+F zFch&d=unf;d7Ac7!_O4_p!HdR^F^ z)gRnW<>qeW(z0;hQjF}AQg-isBk0LiXy1}ftyx-TE@fjn^NInW(6n$%(*e+^1A`wl z8et9~m+rCziuK;QBws~(t6|~wMQa6{dxC37`y8yVeG~S>?=B<3u(y*CcV%ML)SPpkZYscvYU8XYi664A+!}(q! zTxVf>4LFru2ZY^&H1m%X0B<5amD*k-$*Rk|F^~=H7EMs_Z5E{-U$zLFK1}#mG~g2$ zxoIPki4^;k{RVnV7fHGFRB?U9drMCS-Sa`E=RPNjGxwa#%{32AEtZLb_L|y9J+CLG z_9)*UHqDF>-LVL99#-{^J5h8<9qvyR?AXHX=?*oI9a>2ngDPLD2YZ#2Loq2sU_XQ2k%H0?g z{YQofS8OZe+%v1dRgs4J6hUlW)Tl7wcK!SD+tqyvPm>84Y44&1Z+Qk`YHD|r$h3Qfu zU4(j2rm|didZ6do{iM}Rk=32KR>~LCJRyAlK^LHyF7|MCsYnwl&xJjO0^`}NW8Gb~ z%S{){0lS*A-Q%Ra5ocYun}9uDdSBJ4I+IQT98;+{Ry>zytN>9G!T&-4_KuGB4g&iV zMzALqWbS~q;O8-kcXn`L`8DldnVh`RJr-0{uUh0-Wl-UUpKLlmWsl@GBk|(`u0q|( zmn2M9r@fq;FIUKf=LFmmdEXJhmK4TFW$b7IY#S72hA%_!zgd!tx;AO zwzg4yvbr#b8P|qlaLu13{0Rp51}!9)+}Yp-*9g8wsK;%BRAYV`-eb+8V8c4h7`c`a zAGl!yr!)muZR%Q;wiuz#=~?)1$0$WmhXsle`d+0bA*@}MT^mzLqbg!6(26(r<-4gb zgIz0MiYT2N!H3ZY6^gN$3qgjA-IY+xhV+d6VP$JJd;W!~GZW+4$*Ga4(Q~8YQT{wRlLdQWn%Uf%3eMgNTv9NeIe`$xxp*0ffc-BaHu0P zDVzt)@d)%Xk*Eo!PSc)AP!KdONvG10$x?!03Esm;1l+;#!c|`-(AC@QqSSiM=vr(_49`%jfhDsQsKQuH?!K<%+!C|L`3QDsNg@{AZ} zMax)#GfsU!G{Gxio#*o!ze2F|ZCFSUVK$3Zx_~=QT2C-`OE8j4v{Zk}^3|+UA?ljH z>oMY?_+m*eytvXjm|(6c!(F?2zomR9Exe8x*{DV(Y2U5+YP_tkyArID0#o63en%b; zI=E9S?kR>_F?CePd|tI;f|>ijmT)2~C4fr$(#!}~n(0(3B~wsbkCgP(gqY%8J#wz+ z^9Zt1(P(qn%bIa6ZH3I}hB=nyEWm#koNX^vtbM~|T=3*vWub5^Tm=ZPuzZU$)HjCv zK)Yhimf*>_g#9A?B%dne@!8@YpSkoOi--kMYu!)dBlG06dyM{qq5I_Yu@g1hJ!(DK zH+>8h?_=Z@x^ks^9O|MaXl!<0-AC<-50e+-oD(agqv1O&PeH<*R=BjNg(^U*?-#(CqOsyWaBxq|0T_n=s z8=tEl!blf|aa`8MQ08<>y6qbvIUITHQyln_4-H{i#l6qot*rnjIqCXsB39(~6NZJ` zxCy8hUT{WTx8$Z%)gpPWvS4yfvS^64NtF|%4GNo}N?h0tq0_8W;o|O;zHk;bDPdZq zrJWf0R6sdSY|Yh0&e;`+(2KKtRuB9&%cpdJgudr*Ru_?Z;!9c;w43%v`B7yU3Dw6_ zDz`{|kUj5~U@hyx|1|CPdR(myyV;oQHBAzW+tfiR7_f)Z!(54R;Fm>iK!|*mSGfa$ z0+pkg?-8(Rmy+*B=z9}TD^{CCDKX&l*tx<{2bhl1JWsEM(=o7_ojL2+F=2s8 zcg^&mnNr+G)2V7QExh^cRH#E2{6)6b_8I5W`rI2r5o#wT6o@Il!To=&1aPB;P?|pr z>0=JhuJC7}HcIW9R!Weco{~2*`8HBAUPa0cQbu!zb(x{g71LD@oi#7JQ%j~S;| zFNOL8*-LSpoNz(cv@45@@5>^OHcH%3MO9RlbTWaB2^4El8HYkA*|`E6eQA=!{28EpUNd#cgN1IouCS4rvpjlXw*UD zFIPPmYn-ER;;6ZWr72oiE{c^sLYNRC93F@e1`I(fkAn$GZIHM|2TJ;+%oDSiCNE4C z9AW8YV0co%kF?m+wsJ@P)q1uHuQy(19I}LQ)R)fjBP@8;vExyWOA&MZMXdISPHn9G1Fw8ZJ z)jbx7#eQG(8dw|NZ`5Csa+`V#QW8}&De^PWpS_ZnWZt%8=$6?1Hiq?NpZ5)s{a#BF z{lvJZ=W3Tw4UO9#^e#Q7>`5b((k#LPvdLeGgGt1deyHS?S7^%-k z*<{%|S;#Q0B+nNdoFRZw?d0aI0o3$57KW3r~$%C({ z$i=&_Dc?=%j%F`x&6Ku|ps>$0&6xPRrV5n8tr9zKk;Vm>8qOU7eX`Kp2# z#5yD_C}MJJh=7vTXF+ke9wo?iWJuS-zN0Qaht)>Rib4We##mJF6+$)wR{67jW|3O- zJRa751#``?KiBkHw9Xi&puRt6=o;o>uQe;KVL$G*=G1Fg{V`WxR9;-ee(Xn~6w_XA z1Uv=X-ZJPZZ4iCwLotA6U4kZ|TbC~i?YaaSyw?hSGZ+6JTG5X#(Z&{W5hqI6RHPkJ z3_%;(7SB4%@NmbxZ_;q|d3mA9_+H}*zj0~W@LU^5uN*WqL$X?npYF@Iwn?c(qe@Lq zUfhu?pSrl;(D715s_FlpLX>E>GCNX@&Ay(W{of_6p|KKC!>QwNDQ)aS(CKA}tcy6# z7^fa(ptj=_Sv|qQ2?JgRmQ!=mkO~&#d|5OT4sh8Xv44q;Nw~xHGPJ|V@-A$zM3%Vp zXxW%|p0|U}M@bv&QZ@j?%uMS=erG+|s1f)Mn*55MIWK9`Xk7d@p;{gC^UjLhF~$HAh*cnlL+bjaIg0`&NW};vIg4KvhRkH zvBbcRt~)@)%oe$c1!)MlHm1nF-c&c!4m0{Y00`l#kD2^UO@AYh6>o5(zY+M0H@Jzu zq5hzX(DC)}l$UXD)z`7_wFL1g^dyEfkwlSH5e%ZQ5s!jzjiOSV;D;L_YZx#_N(3HE zK;f83?vU;!bn-Vv37O0$$PJ5HM}(?9F6kIQk};FXSiYlq+F}a8U}gZgE4K?y0psSn zGscfj3~0DFtb8+R|CbkK4UzQ&&m*NRAh`U_SBi32ybTGdkE(Aj^;P1k;C#wLrVz) zD{zp^tK06<*3Lc`t29V^odh|FrpbU)O8&NjoO!(T(s+sb6O}tT9%K~QbLAE@mmRk> z8H}V>a3nO1j2K5!vt?>yY;EjG?Uy7L_*<}{1XbyHS|U%!2~e?A*0eGdx@&V05SC>; zK}fE3dQ7!zQd9rOFfH~pi4mpLP}@Aiab2hJk}oiWk~mlK=FWhzLseC#I5IRa>pB^W zFn7RXtJpvNv#MM0ec*VQv*ayo(|RquO1r6-9;3C$9L}{aqv6@>d1n#3UP{LhP=d?P z(^n|X=8JtiE5E(He4s$hW`vhSw=ezF`6uayq*2FST-?_qS^!;p5;*xq^(1Voa=`@G zYbDQ?;jHq(u)jJsqrc38iI~jho?87T>fe))_BT=eeQ)`c4-#=+t$akWLD)w^CZPvT zTK^f=pNjN5JSn<}7Var;n=!S1tA z9$v8WW%wS2O=JP0B`*(sVHl47Lx z1$Y|GRjOXb>V7fWech8d`BE0?*Rx<(-8@pCvz;77r5;r@TXmqLJPRFX%g$lJhC;7{ zU3XoORn((4C8iP^s~PAh7qQt6f1k2(us2%3Ic-p1=3kbv&bzkb(dn6Z!`tnUO;RBb z2bU!a_dqKcdeW}A7xyW_XI#%$Y{#;zXmrLJM^mwlp35_AU&v2^dpG#5hvqeTq=)u3 zhcXN`p=?0gvH@IUK_)14D$yx%;fZ0PD(~DwI>Kc&~~TS3?+1C3L^)fHN9#Q|g{vcxg*_1t8gI8>sdnC__0n67E!b?*5!$#&&N-YcpttWh+lHa?uOy@c4pwNGL z;9auZYNIKTgkGNbX&zkC&(Cx8(d`=wI0(heMxxxtG`Gk{HPtscd zR-P7~#O(}-&X0bfI3AJPHb*=1H^Xo5pl?5wfC{T9)(nl+54_)%h%r;JXT8kH(NkmN zqabQt#3(TZ=CTa_65Ej;INU2&^#PbN(`|niUd<#N9{5hJOEo_M!|*4VzRjbUo28E~ zlq<_Ld~IxOxZXbwyNbIaGn=DFGHRWHLc)Eth|3J9XR?MCwE;UMTxN8@-nm_InE@9X zugZge;WFbt%Fg3^L#0v%7@fY6iqW#CM=5ytGF~uN!LADVg^!JZ=^UvALTDOnhz?Jo>$k^0L8=0T^FTvp@~^ zYYC!Ff80j*dhk(v48uS1!x&eJn+fi9g8QH7q8B{i4kvtfIpE2JuLy5!X0i$k|7sCV zWR5S3mC^6gQ1?Ahw3EK5&-^60%}Fj%qXBD_?)(SY_j`8tO+zT)%>~c^KiOS@kfqy# zWf`vE1q>gHp`{w!3WAxout7OIFnAzHM4tMrzN+W)Vx8i3Uwg&seykr}ejj_fTP*@h zsDZ&lLFSo!a7z^jKYYn94$KW6`Nv>E4+VAP-BR&N3Qb8}B}O)d28GQwQ)u0t)8w2p z4Ml$)cm`$5-=j7*H&;I$m>>oRe#ocn2`$(6|f-KpMW|wVdi@>Smvi@J1Cj=jA zFgcRNCdIOdK{^@(E6yy6JJ8IG$8`Zn2N-xv3ezKeNK9cfRw`$C9oROLTW7R;VAcdk zE@wSq{c#Bl;z?hwVx>i2EzhSRu~mlN;2+k%ut30;eGl-=(rv#|l!h{5C4gxz0)PG% zR?3bWCJ9e`SqaeEjI2@M5*L^!=Mcg}GHuRmSAa_bv8I3 z8M+OLd@5yWF*>_koV*CJhLiS&>rWF(J?=e@1Mob4{#^>*spm;$6>JTS=F+2ctBwjs5w`|AyNAUwS8IL05w+57yFRQ1an{(aUNZT2pNWX zX)zl-p=CXUE-u*PT!nk|fZt4dke`Nxftw@E*Rb)Qr^MKHZJuwGI*GTAk_t9YT=Wj84i}OXy z^Fg!(Z5XX_z7FOCT31F%k0e!?ujj%8uQS#exK+SOmt-RY$rrPip9*J1f;%b5$-E>m zo*_+nt!IFyL4w^lnkJm8n;}^ouH-Wnu53DZ7$q)2dKhG#VAdcyOv#Jgz+Vn@h# z!7?bE39Z2i%qhE2p0jDyf@I`DeI?{T#9{XGMMw5z|m_M#kx#DHndSpdgl-;Ab$z`6f7~J$q9D7*YaRNmUEivKaS5F`ij2!GfKbF zuAv#9qdCp}wF+^Q{QwrMaa*)p#OYh>1H3))vKd|3g1G#kNKu_Aocfqo>A*C~I+(Dh$mNNo zskAhLt&`<|jT)JOXSRH0`MI!HJIL3OS)Q0s$hvfJ?S7(9phQH4(z#(^?B2aj&q~6_ zarJtscR+Tig4oO`-_(k4GOO3u=Utyqc|80S@j>;UwUYEM`W#fFLWLD%H&4%Yy?Smdtd$#o&< zUO5Ca-^?-Vf9d(w6Sx-za0#1Ka)B|T&JC$){bvrIefMDZ6HGNcKf!^MKPgGYQ1isi zEg&^rPJdHnSpfzyGiD3OxZD~@)=MMOo(&|JVp^C2@+tlkBtA}JxhnQw>ef<{Sthy@ znYh!s^o|xvM7>k6t!OAkRK&Ad$53a!lgbTQU;B%14Xh)bLIB(#=)W^-3VTS5={Sd| ze0zotClxArXY+6;{Sg|@zNJbRKMTUVK@-WUjpa2i_HI#!lJj5eMypzJ_HZ`|nfR#H z)RU)`7vQWR!*WRhB`3C!Em$Gt=7=5R!YwY-gQhcRp-dp0-%VTTa@CuIxTAp0D&gh( z(2b#v(e*{Yx^=4T8A@0>Y+Im9%7?w9-tmu9y{E!*soR1ru3C$cycB(Ry zKc@hl)`DjLE=i@VC)o1}0`sFN15CqU6=wj1dK%$o&(!GTl%En0t;el&zDWD>Gs2|U z-=*ijB<`BQ#?@Ia79njSl`)5LRffRTx7b4abp>+C>MRWkT2J78T>wuA2uQ0#<%Uw% zyiyTsG9tGai6oBA(xbFTX4Dm-r%b4RV@1VHo^7yEKAA&KWK=NfZ=x>0*UY`aoeB7k zTHq&}HZ6U9=##>o0GCF2{~*#KW>*4@%hLK}z4+YPM@8>6FPR{vyDD{KZU(1)(6-4m z9S~;c=DqYJMbJ=mhWP_R^PVf!6o2fcuEIH^{Dns-B_$UPmR0-gdNw2&pR&+3v`ipD z9P_h}CJ$wYO}KRt(`X<^ zzq}s259j8fKA(P(?Rzm320gf~Taw5Q&|`n*(GJ7v$;@ILmD2+_nzpY0!t81b!n*k# zHK?b_7Wm7kuu@5Z-=eR^v0QJ(cjq!J;F7>A&m?xf)+=g1#AAX~sBNy7)$-!|Ra&w% z*Jtb5*qF{)eRFkCo2d#HswyNv8f%RBhBp6Bp(I`0g_>Ecno!J!P>;^2XG8qc z=oxwSe5rT>0z}G=a4lfEQdct`=}n|ly^(!pQ)rV0~U zx=yfIO_j00F{3*7!l@{_U=P8Y#7Z|mU0D8e1Ri@Cm&M`d+H`MC9w#}fe8fThCE(3RAU{+0BNf!*#(PfF@HBW*^k6zGoYBZ#Bi z@snF7@dHjoiK-gKS2m!5bx5$DEjA+vcTfdE1~wX@Hb=G~a3ncWWMeZswuJoD<}O<7 zm|axG7O)}6VSiGYK*ipnh5)g9ec~7!-!bkO~olIv>K)t3S&q?%7xuu2k zt}~NgQkVXs%dr}z({^ZI7Vk-!Tl^+TRIwEP7AMZh<&i`e3yM2Xjn5r@H5LOzM|y?xsrw$uLd`gcm*cvwX*5!__YG}%-2JyX|!HTG0pd2jLu zh27PF8mN*Y$r5>wD%7Bhj;c$b2C)Tb)F4S&Zv!j?o+pH$i$vAa*q2r{gy^iD^k6?d z-G875x}@ps=?h~gvlk{VP0~ZCcaUM5Q=Elgt^L+OzrxPfE{JmdlK1XaG>`mp_wKDL zb?@G!GVMo$!Bj`zVyGJ)aqWo=NK0;>bbkc4SlhBSVw~XL@;rW zb!zPSbED~nk~>|(2H8dEB+%h8P(BpLu*tkB%!x21w3#?w1}2{kN`m1d#Or7VnPmzI ze5DGTCQm(@k06+XS~@77@0boMUa70_5@*~B76`l$XuF3h?|ir9ID9IRe_-Ft@erY| zuOZjroA;61KJ%VQqyPqUn%LMSECTzDXgW z84dV40+WFU*6`UyAdm+((f2ogiSWTc6A5f0>_=!%!Mv6*6k|q@)oZo<7t!&}(9bE` zn?Gk4;hw_fvhfNG|1cKM*|YiFxl(RE$^+7RVK_xnbV`|BK$1G3i=Gt<&cjy*4j$@1 zF!02Yp`k}`2_yFIel~o^Ly{g@W zx!$=luMrM;)m+YTpoQt{De4Agk$H-t5M%;6`PtH>>emx02#h@JAw>jH0{}dz+55UE&TkDmcC(JaAc?L5*H?CNq&)N&q%=T(D(jP(=e%|zsw$={(YkQ;ZjSe`=+uYju#^&|} z&ERNhZ=W%LK|#}VBj>Z1#-`3>&rXb=&OST(!X!qdx+O|#T*89~_me`(VY;i7DCSadk!x+DfMa zhaspO>?35gR{vhm+~vlTNxtou1n03HA* zoyWd!k}tqXuU8dh7E{?sEI)t=-&c#O(>R4D6hCw;s$@X}2s;H(NTt((&`TaPC$8u; zN2Eb2ekKv#$G_$Ui5*~g(#PpVi79z%@>&+8O~EfJC{LD-fnCmKagrFUL9?ZqESwwR zgmB%mO16n&P5mQ$5mE#BY(*{?#Dg$Fjn$!Y*(o0;dl-^yW*76UGDpV;LO2)dgZWZV z`F1Est{^-Y%^&5w*~)9%T*6%UehP@ubb-t*?!6R{T*-Za0$QfKG|{;aQb2kEuXPB^ zd2T9CM)S9JL5eH2ePS){INuD-2B?&W11Mbi{3;D2vc|`3x>K1;;oYRGb$c6yJKGYt zX>-Zic%rWgxasf3k6MLB6#m)-FHDDP`R(m0X-%s5bSm~DAGdi*7MR7#n-UZ=HD}!>KB8lhV<^$G{71^X?zwLNW=GC1xKSeIT%8xd1@~s@HO3&S)^0B z<ob7uwpfMO-iUB_l~Dm6KJcJ#!Qm6t2% zQx_)ASsXcis9riVdSTRpjWe<4H&#MbRy-oEqPw?SY*^E8*{5c~4nG`^K6r$&!252T z;_7AqPYP{GN!@%nUNfbwBM|M!0=A6M)mCSZ`0b8*L*1Bk)H7lemY}N3SVgZbal3Nt z;qtEF(wOX=W0%R>o0rA^z@Z6AYnC!lovS!du%t1Wn=9pWp?d;Rpw1Ryua|2NP?6LE zzdGu6HStGSTWa z=t20zEOP#U`FmfUQUg z*Vg*LA&&A@)Z)13O|~+a79>>y1NEghf#D~kdcJ&!>||mEOq2kI@uZI?w>zo-SQc_h zc-Kb?eyG%n`+dZde18mM;(OW-)SE6r2?o1==OJ;0fzP8fZesX*>~bhcwX191HTx?A>usWOte$A5=!8PYNnP#9@Pi&BXT>STDZq`7 z3986t-D_%1fOu4(-?Y`V#LRf`Oh!N6WiS+=$q`F=8%dWBU4! zC3I=hT$?AK`uUW~Hq5CFURl<3Y02@fw2S2om|mQw47bo=c+=%lzF6@xSn{Q5 z1vuP~&8?UHXZDhOrYzEGZ@d$~Q^Q#K0Tizu0A}RnP6h(ZohSy(GR^}g^h1GEv?|d`gE=U zpVmd|<&%tjxq=#4(k?Tn7yH9>5z(LhX+!2WG4b)RiyR%M0qHy7kVl zTU_d|>(-U}Yi+TnRB!HcttkcsXq2X|Q8DFcEu+tlNz*KnG-^*1%kxkh&(M}8mgZp@ z3Z#Kv)=a-XVMp2%kqjs`g~(VtQMYy$`W_x%&dOf*vXBZF!RO#;9oWH(^FkdQ=}TO@ zzp(u@2xe5`o}x{_fE15NIVw51CFY3yKSM^eV1JM(`=erwv#sk9<0jUVMqAn@D$!{D z8fC7Zr0%4PpLS9yRZ8-llL}7!fg3*ZVPREp1`27`6-zJM0WvkrVNRKj79Mt_SuVGW z`am2|Il?t(zfQpRHD^hN{kRdRYAy|W>$P`bA4f?XjtIEBv*6=(*GY=lAf;=lotSf= zmzKKR)J5BI!w3j%70$+NT*nO%<7<3j6_=@AMNx}x<12c;{-W}B(}$!cFHW8x9X~mG zQa#Zu*?~Xy@&hOn?0pDcYIMnu;LCe zulVw(5-(HXbIDhHRg=wMrh4;+E55=D=F3#UHRBau#rvANWNlHr3spYsPaDYyA$YT- zL>UZCQIpHEWfAP*b#lsK3?lGQYF-6Zc_FF(WYVHkSWjJ^r*ad>3;#Y{gE#ui{C$n6 z%q96z(eCE88iMGO2z8CCZyCHdCVuNfj9>(lv8cO;M%y$y%d$8j>Zm)PsxsL*)~$W#CN|Cl-rm zp6AnUc`Z;>p6Flr-d}Lmx%!)MnY_ z6?l}6ZDrFf`vdw6y4I;>8wSlJzz+`VkRMb)|NG+e*6jmB&}%$zd^c!G!ZyYr%WZz1 znIiBbW5cl=(1QO)q+pj=8S^9LVc52X`#~_D3mH?4nHH>JtJgk;Rix~%>2eqwNFP*iz~kPl!TJ#$U~rG&p#q|BxtY)NnOj z)Ik4{!=k8D$yd`Q4jvx#Kl60MtNB6?J>hr2nZ{T1r5-tOP<;GYxr z69hOK;%Vv|0;1~E$0;ZbT6Vb%w|yS`58)6Nk=0%lCBtY0b{u*M(WZxsMxPiBV9W}@ zoNwmROAm-2zftN6S!8<-n{G1QhD;$buy1ZoQQAul^mTpo&eeYzy1L1EBwAnn1aaL^ z!78VW+nXLRkZ)%ypz(kEWS=Ts6N#q+)<(|xcdv1!Q++Qt6F!z^$iN!W0%$grrPHb5cFlC z4;HH_$QvMDS4B)07;4ozqft2_XsFeVx(Zf*2K>O0R9d}?^{RPPa^DHzkxjzv`UPb; zc6IHz+kYI7DGETJCa*M^GP&={Fqn-;+2HUrVqGKvd`X>|nmV6N z;nedb&z;F+pP#&NDmyjt?C5y*%;?C;(F+-H#05L&q*MFBo~E+=NFAH|$V{z-;v|DD zC|3~=U7=`#1?5MbKx0%Ko=kdanQ+?#w1Zr?K(x7pQ#@dFC+?i<4%{C2KO=NSEy&;S zX{MBlwM;I|W)n(NHm(|!Xu%{E4HhLrca>VL6dav4;@om^7sjEq$yeDUL3Yt0L3WjJ z)z>tj)1l1{j1vmckaoQk4{H8V56}<7e3$OFxt@?X%7xZWm?Y-;@`;?CWT2WrYD6)w zr`>twCC-T<^;f>D6AXmfbxH8nx2m85UVMGMoUTY~^G8TI$EARu(@u8W$`S2%kW?P) z&M}yrzy#X+9)-rVbMI=88FfUIY#Y;4za_yJGo8okNiX7@5jZS80Bt1@pG*lySHi5n zGMD96+Ayd|!+iow0Ty7jgCl9+M{7~Rds$m@EQ=bJH$9f^Su;%6tbpHC*Z>6`Rr_gK z==yz1P`E5Q=G!dU$W^sg%u7EJU<${XZTNXhm@AQq(+Ib40t$@KVMG%%H0VF0Adiq# zCzvLg3eiwW)64xVS`ep~o3s}dNl!isI^g#Uo;>ikHSqhT?|yZtyI=4_AX0}qy4vqR zN4NGx*%7{T56x|KcX#(m9QTA%RQ-dgGT|&_StA7xj(N!Znjb{WCl!XHbZN6p>1Pz8 z=Hj>nRexBYWw~cC&D=YRf?ud>o_t_gZ++{YGH4@C7wqDEmT0lGu;b9pVi!z!9F&@f zJ;09FRF425%_H@~sD9#ZB7A|xvd}(1LH@|c1__qon=pvUOAOu^xw&|+MJ|QrBg-EVLqXg^5>i(qcR6cU_K_k5k zm=*W!ViwB;96;_Ama|-$UY>E!4NKq_H0Wof|^){Mp=8yQ{j8o)d`a}r_L}K0kAeg7nhBx_mMlGX; z5o=qq*WN8b4C;xcExST%20N5+h!2We=W*qP;H0bYM87nBmcPD(=f;{@B_SrW_G#;d z?3#Nuf2PneKGxr{@OT_S3j$XYPLM5Y6>gAWk#2N^+{@iA$26kphET#)HHI>n8>BQP z#1i|6BKTP?gx^$fD$S?wY|^LoDj~Q^=$VNIKLUk>@6ls2y*`C_Y;SPrL2LmVGSX^; z1XQ}7AI@aL^~nn$Ezgr7FdkZT>aF#B&=IvEkpp>RA zQs7K2nNC4$D9<0j!3KCA00z4d_!77b5t(2#2zmBOS1rG`QiJjd?9nQMm%J+XII%@> zt9@=ibl!8StOV&0PUm?p1a!yd4)U^YwjfgT)d3sjyve?~JK&LjQ|%z>oMI8KdTf~? zo8!O%kA(w7;i=Yl*JI`2@)2`y8j8$~gD5 zIx#cpKx3NmQ>3I=KD`XpAQE{ND|2vXWG_S3RI0jOboWJ~d3=mbQg|SPhYL^CfCBS5 zx8(oQR^)=!3Q#ok3`A^0wn1ZqY}5=>%Tf33w#NM#P@e>}9cmtJPX-N3fZa)Kdz=;e>f0MvN~1P5Lh}QS(Hs`qyw~6-SajMC zD_Fk8faPay6U*x=d)pv+S|E9@M4s$(5JZcktUSRh5bq~8=rf8hNzi4$EL+LLoga7o zOFAdIz@%PFp_(Fc2i}oWJq_&%->NB2!SP;D@|Xmm?c{4)rc-~`6Z>k4&jKjVFdLvk zL1n2*pWen)>dyd3z(@o{Lm*UB zW&kJ}3AH{0k5z|PjXA4_XzZTw@$tBijuS=NOaF>8M6qU!orwC3Lo~ijZ6uN`3Uvtn z{UzLldu+;yI`EkDYOCs9A9iJ1Znp9hb?6;D>o@H=zxI0)TR?5$QXU%!*(_1$?ravC z)5UDITit!-+_!%=6}i3wr;~Hk1aLTz%V9POmu#|pin}pf^XwuV#22(;!!+>r1%C_+ zP8#QVTj?jPz1AW84GtlA0_XT4=;@*5A2chTuofL>9$MK*ZWtA{@zvo)f}L*0W`G4p#iY{YH^Ky zI6_Sy@o=uwv(EBj$z}hZ`j8)i)&|ez?X*de*mrdWn7irC8R7e6FDzl2yaFi*T*boG z5)NZH*lRt}YaLQlCu>g{1`Nx4bW#GeJ!rqt_gORN(AhVYd`@l@^8<_GK7apvBTKL{1)!6(n~cS2ASWq!Kvd`OBP6Q)4kUA>O(Cy! z4#@Z@xxE9+UjIW0e2(G%iX5sks$3)s0j_opr~6^i=g;_o_+*%$HD>KU24j|@Msy>Z zcdMz&ulKfUl%Hnb5fxs`?^Fl?9j|h`9~~6av)Zo@a#C9xG@vmkg3`?GkT5YG`IYGK zIN`{zV>H2>ipAv;@xvM!qzc+RS1w!zlgpNmfMxgtqR8{k9&1&7NtIv_TSy3blL_tEX63mz2TNmY+;Z_OC4?$`0cOa4q!ptsaD2TA8m0ym zOKKe!;!u~N>O7njS)d!y1W!32Iyf1YyW9y-%Ranncm#O`0^UA&q6H-YE0WX*yC9u5 z>24J88jL*dug5SrxS~>78FE|2@pBrtcF@SJC6)RP9&1-_ADI%zTBv~&41?PkYt*`g zu@+OwTF2Uz0H5Ewu@>`L0(L>$ni^|s1zv-(#w8DiQ9*h=KiFWXndJ`&g}!}8+RLk@ z;x`7!sZiX^#&C>PsRBa^IcvpCUP3z+E;DqJZ7<8Ht znb<|<%OO0|i_|iO`ygu>#`NjxNTxQ*iIW;7=gyegBI9{iTj+nIsX?G`%iu(6l|h#L zoW8{+pOPoe2pkyO+aXWuh7@a{ zQ?&Q=^BSGHr;ZC>HJzeD>*y4z9iPCTw-yIxy^ytw&WCeAviq?{babX6F|8{Qi}W}Y z(_q%#JurA+=-?CGIC?qK&$1?yLA-pA5|F#ww!4i5#F)Fw+|dClpNrTpdwP1~%FgAw z_2sJG0_?2`2pu|nq#xgz++NBn(-TM=r}lFY1Q~1464^3Q17+bh(F11S$Q*FxxT>Z& z&h0g2u!*Lq?2T++7^~DJd`frmZ|X}6)7fLnbP)^~1xsVcOZ-^zd)3^jNI*RjHw=u> z_w&S|ccVN;wDlX>5M5kw#qPMXc)5Svb2wis52*l=f38}Sci@ZqIoD#K^UY}su9aH`;~7-LVFi4Xp0)GS&&lpmoNrDF;zGMY+mtTu z@=NtMtwX!vhi^bt7-~fe^wr$bmEpVLGlq8aYkk;HFXNOk4h))lQn|T&fe~n+({dx_ zmF)%Gq@3AVFSP>A@s}m^qZyUK3O-9KMSDg0^Q-y$*}o?Q(xbrwCrWdkI_wiY&2B_h1LydjQ3>wEC<^ z8(Hdhw9#>yU0ZgxCHOBg6sciK2TBe$X{Yg{cGiq3Hwj0i5<`3J_G~lwf%EMjG2q9H z4I7J<+OVm=^)A+X6o?|SHP?4>+6i%^m!An314_R1NKyCPr*%(Pdk4D4m(dOw1xBV4 z>oraeWDeJL*?RDcwQ&J1Qukc4tfK%r97&|F3|!qi(BI$Ra}1#(s4KgqBQ%q`v9w}g zp;?BAv;t$u{A|h+(!bh-S{{n?OM~_hFV8wgaZ@FV0y#zP>2T?^SeN_!_%*tV^ZC(5 zyR?_=f?M?tQkQUYN-FnIW~jZ}*a;%Xc+Y2UbxIwqTU}7V;>NPs?5*wD?8_LsLObi$ zHqIl6Qxsj)(&AbayoZ7`1$!yjN5OsyG8FVtFi61x3W&dV4^r?11&1g&Ou-Qfj#BVm z3ZA53n1W*zJVn9N6pT;28>@rQj?D=O`GbV1k146uggu z3lvOJFh#*d3ZA3j5(Upw@B#&wDY!xbDLJ`UDIh%>H%q~HP+(I)G{ntOz$kDin4w^n zf;kHE6kMZVo`M1eMG8t3lqq5Qt)FG{5S=#Q1B`RKS{w~q2Nmt{51;xIt8y$@MQ{qih`e};BQdy zvlM)Vg0E8WH3YXht1y@#gumS7&F9M(i%{Y9T=23jx7yFYaKQbWl=9~&_<0I`k%C{M z;Oi9pG6lav!8a)Qbqan1!Q~F*J?#E%`rV}m+vw+J1P|fQd$_fwr4u??UG1IcIy>CS_lTROLQ-r2de^F5t=@T;qHSLeN*cXjT-vz?uHF zL{NktXU~pXTe4)mpUny$;_m{8m$#EGQig&;ewz24+fGpKpqE?eId!n-5+`@L^M#S~ zr>5|m7wvu%&u(>4>2V!(tMf@gzmDxhI`24wj<(L$&bIBX_}8|*{jLwRtnS}PXY2m} Dd^}>H3Kd%m=|UMXt7!l1Xk3NAVq-EE+J~vm}&sC zoSDXU&yd7$DL*7XVq3NqTec)Smt8x4$d_E~dnE^1+!#_2Ns_vezs;j>G>Z`B5`syq5p@&8XaDDD?ubChH zz~I2|(Sv#oQ`R0~c zue2=3XjpE;H8yR>*fn=HQ;vn(n%QVrPU=f2%D~F_;DeLOTRa|h8@p8tH;+(~66H|Z zwyHapQ>GN^bp#L3;m`f|xU&XOoq-!e))A`ICk8$~cw?9yVZ)yoxN(#nWycVs_-q96 zadv`@A|7EU*(t;)*hB0z;!*Z6dj#=G_9%M{@hSEO_Bi5)*c;iK5T9mmW^Y0KFncR| z8{$XU6YTAXA7$@g??n6TN0{C1XOdBpEv)2x8_ovg@a5WkDfvN^;Cdk=dC@sn(x zJ&SmZy_Y?Q_zYWM=Mg`}7TE>FXW0^4M*ME}JbNGF1iQ%Ik2uL*V3!b&v&(D+@i}&d zT}Avf`vAL!c!I66HN=zbI{P5v6#Ec+5%CmziQPb)X6x+3h%@Xa`v~GJE3uCv&M}j1 zAkMQgV~D4j#WoQa*cRJHTx1pYGU6F_i&YWNvKp%+o?|xKLHr)}3Ud%Y!(7%tJkOf! zHsWX59d;M-d)Y2)A%2eCW3M7!VE5U_5T9q?#J(BvBKsEht%xtMkF!r8USi+Iz8� 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 RP91sdn+Cf7d-urT{}1R5(slp< literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_facebook_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_facebook_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b51c00d8dc5d3b433dd6c63a5d8b310092b46a7 GIT binary patch literal 14220 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 M!JlR5@5N&Fzt;FJ*Z=?k literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_pep8_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_pep8_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f5b681ab670c96cc57ae113c5d64a9a95c410db GIT binary patch literal 29256 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_python3_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_python3_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62373b890397fba9174a76b0ab801eab95135998 GIT binary patch literal 12996 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 Zw312Ur;I1@Q^r%{$y0xwpx<&P`Tqzf3ta#J literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_style_config_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/reformatter_style_config_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ed89beff6738213858c96e2c6979f958a20ebe5 GIT binary patch literal 6107 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 J{wS=<;WZI>M$Ci(KB6>;F<|?!7V7c0CLeS zD!B-9$t@|l6k5HqTP7OQ_iScvSE#kG-`8lF+PfOHS$Vtq%6LWGIW|u#J39Xf^cMCt zcvoN7YSrO|4JM>;Ix%+!e$uIP24c^blJWZAuuZL5BWXDqTy4j_#FsFsOsK%LAmkuq zAXv{B4>|$kATOdVPl9Q$%ff{5;i-r0X+PjhIIV%~#*y<)8?8@1225^46W5?)8o;8t zIx`TQT@73?sX@(M%`MOZEy7r&C2GM~%A9pAT0xi6)9BJ;+{~aEXJeay$?=1-32gdEr|>}B zEocglA3;DoDA^}3iPZOu5lZ?<+cRZhySPt&{+wvCv~7)as#D{&PP88YGZTKV45CGg zS2S_&Yakf@o7rgIM>V0h$* ztDMK2BLu1S@R0j8BQ*sJJLzIS8fOFb+A(EmssB6-BCvwN&N|Hb^bE!+ zM@z6ER7D`RX_I+!nGC;}5tbRRPQ?dlSc0bFgSjygAB+@W`%=#%WniR6I>u^bV8*=G z_aR1#)rBUn!u!LUV|3ps0LMbG#-X-p2PM7$17E}rQRkm>79XFnh`)<1lLqm^FD!ip}9~<8X9%+;cpy)0chDJkJSwNzA2_ z@F0@#Z`4Lw*?BTh)^XZ?7<#=yzPc>CET2r}(d5GNQa4zt9a#!G@Y%@k;YV-Xa+W-= z=LeDJElnokiBGA0)$;9ZC}IqMe@}1n_utPQ$C>3&ZtR^ra!$f`%%`=QJ&WfYj}28x z_!*S2ekhjnPeH0pP(5SxXSjZh*5{7$eoY1Zfr|EZP*tZA5WK9ahHh65XcsbtOhGYh^<>;dhhI7;B%UDULh?p6G0O3kq#9{1hv50YB z#@v%#UwVP?!Z_M;0^u~{h&g^losdP#Q})OEz)@MsjR@zadh;y|eJ7JmJkrN?D7B#o#k3znO-ietho?zaq0)*94O|(z zG36EX;$!SCVuyDiehIsybW;)@#2m8#-Bug744v49Wm|LBMYVz-&+1-nF)eu>joY55 z(%-fEQ2=*hA>FFFCSwOzH;%WhEc@}4Ru#c5=l3>sFuFyt6C@8hsnL3J)wQ17X{{kh q>Wkcgw^9>7I%~hFbu)wD+j-CvcyyY&MJ&Ba)K9M(RdV)wi~I-cZYxLt literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/split_penalty_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/split_penalty_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b374ccd38d6e7c37d8f426ba36773271b9d6a98 GIT binary patch literal 4796 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 Cqp1l1 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/subtype_assigner_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/subtype_assigner_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..759bf83baf64cb85e2ffdedfa9db06b90483311c GIT binary patch literal 6356 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/yapf_test.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/yapf_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2e635206d5c5dba40813b8ba252c403d0af143b GIT binary patch literal 56072 zcmeHw3wRt!Uf;Ym8p*cSkM*wi)s}Zxl2?)~%l7W+>^;k}ysJBVBrJLNcD!b;HQkcN z9?j^wN47OTRd@AkdPb60!oJImt?KUTs_Lr$tE&F>uYajqwqzpseeV}%)MI}diTo}fyuUU) zoWP&?v1lZsMRE}>s>MptTvS|RxtO@db8&G^;1*>Z~}j3KLR}hLWx*J^05erB(5cJO=w9ig=tLKWN$@p zL%aUx*AVJHZ~rJOsj(eg&9$I@2wS6HK4(7@Bwbj%4d|6%8^Z9xvpI@wK%O&1-=JVt@>y4lkgEVM7#^7;( zodnsCVvKeK`|&4;JsnFY)2Vbu#5Na6KZ5jY7fD(MqN$C22d-(W=Rm(D`ioq~>Lqd= zR^O28w0eZx7ONk~ZMCF-Zkr|Zb6u9K&plwt_}q4FuhxxncWC>xCvn}WJ*7R3>n^QF z>&5j!tq%fhzZ8k5izQ1WdfAruWL+T=x8jDRek*c4l8;gR-Hv80UR+$7L-u;x;$^L> zFD}(Ph|_#^aY-v0x1$!p2KX^)>ecg06DZT<7b4NxP7BAfB7-7nVi+R z9=QbGv*fX{50R)+%3NTtQ%@O-RYTW}9z+|x3<9-)98rx^m8<15cquEgJ5Ujs#@Aa= z7Es2Ex@2*Kej$1}ZoF5E-iTk1Yq4h|;u^mhxgI6ZZbj{wgy&7n^M-v(T(+bynXNs@ zZi<~S`UYjOXyQ^>7|GN+$L;O`qU8Bn0)bNN$cz@Mpm9d^#p{Vnm14P`F_%ikDg}U< zOU$XoQeQ&gBDclqU_^hD5Mg}LoDaaq*n);l;?E@VBhfTOemc6Hf3e!*0WbynHy`FW z$YY-&p!FTN36q{84iLBzuf}f1f!73kg*T^eB&x|vsp|<1y*hg0_>JU^)QuEmZ5v>o zq^z~yryAbJt@kgZw@%>S>+xu$+%*(2KY9>@9sYZTgC6$eZP`0L%>^+9wIhdX`mh6`!qA>KdCfMU7cH3POG<&Ra$Rdi>jMY7&O1m6mL^tHJ? zK<-folNO!GF+`qUZ2p#Ad_7I3#mH^J*v^XVU=ZMstz={uï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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/__pycache__/yapf_test_helper.cpython-39.pyc b/.venv/lib/python3.9/site-packages/yapftests/__pycache__/yapf_test_helper.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af329f6680b25feeca8aebf38971fd7e847cfbbd GIT binary patch literal 2390 zcmZuy&u<$=6yBfqdSg3j(gH$Ih9VG_z&>!os;Z_*Q$XoFgYL{2?4T?UfV%0vzDIS-XV5u6E{|AN$_So9}%Sb~?TR&ksMHgsnBh z_zfG^9|sx_;gdf@!3=6JlUa#LODZO=BN$o3=Gx1Kgn@|hBx z2Sxf)gn6#}+N(YlClcm#m+cp^jBB?YbfmTX*Q@>eKIt2EDT z@e7{z*t)Qlv4HcwGB2FcTv%7euJL{U!c}(ZzBWte+!2pTd*Lvrbl)+qOw)LNPq*D0 z?FNpO*8f_#ykUXeuu!*~+Je1sRpYE#TdG&YJl0}9TYKZ`8OFk6?M17EHDj9@u=~#8 z{LW6sG$E!T&?A;mMU&yY_4rlJBgNT}ws*ccc=q%#IM{!>e=>JJen38zbC>9iNE5Jfteau$b!a}i5eC>L_D8_V;-(QKl!bZ{I^vMd?& zU-0zB0G2QSu1>P_tNzymAS?ee52N#N%;f+RN~f1b0m5Ly6JUHlpH=HXS1uIB{qb`M z-aVvP9}2_t;PuTmyc^cWzmQ`(W&>Ue-#?wdoaX$!6>`0!fWoNLV-5h*p#-8|Sjt-1rG*qz z&ca=y#sa9R`#hjvjr_&h615kd8kMG?s(ZFxT599$7Bk;iU}bZ$g`*dCX+x5=A>o|G z?JEOPYEohfTOl1Vx-gVafBwFYhKP|>%@T?d6Emws|mrFeW#*=LHc0bGL^}%k>q#YHCF$d*`m4?&a9npj% zr|UX|$m5gj1hyb-?Cl=w>tUx3oD@hCy0z;3=em#rZd;hXt;PGemU1bOS#)!Md4KGz zt`8|tjVY+rG%plKbLvQ62{D%fsY$nXmbVpugg4j$YKZV~#NUM&9nEl!l`UtoYSh6I zsPeS^Oy5WKIKBJU${r9PRB*kG_fsT;zT|qYcprcAR_9hZczU#1ywr4~Hh>%XRCRTr zwo_Jnx(@~CIdav<$}lmJV72BST5ueVt>gMejG5Qul7OMC(a^+5U*stRrE zyBiD8BOL~P2s-FGlzNN$xO6CV6t&#e(f9D;+X+FBFz2<`Yl}x=6sQQ5cfZz<2VH1M S>~bs=E6+l)y7AhZAN&okXpWiy literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.9/site-packages/yapftests/blank_line_calculator_test.py b/.venv/lib/python3.9/site-packages/yapftests/blank_line_calculator_test.py new file mode 100644 index 00000000..1ec0a5e5 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/blank_line_calculator_test.py @@ -0,0 +1,422 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.blank_line_calculator.""" + +import textwrap +import unittest + +from yapf.yapflib import reformatter +from yapf.yapflib import style +from yapf.yapflib import yapf_api + +from yapftests import yapf_test_helper + + +class BasicBlankLineCalculatorTest(yapf_test_helper.YAPFTest): + + @classmethod + def setUpClass(cls): + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testDecorators(self): + unformatted_code = textwrap.dedent("""\ + @bork() + + def foo(): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + @bork() + def foo(): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testComplexDecorators(self): + unformatted_code = textwrap.dedent("""\ + import sys + @bork() + + def foo(): + pass + @fork() + + class moo(object): + @bar() + @baz() + + def method(self): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + import sys + + + @bork() + def foo(): + pass + + + @fork() + class moo(object): + + @bar() + @baz() + def method(self): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testCodeAfterFunctionsAndClasses(self): + unformatted_code = textwrap.dedent("""\ + def foo(): + pass + top_level_code = True + class moo(object): + def method_1(self): + pass + ivar_a = 42 + ivar_b = 13 + def method_2(self): + pass + try: + raise Error + except Error as error: + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): + pass + + + top_level_code = True + + + class moo(object): + + def method_1(self): + pass + + ivar_a = 42 + ivar_b = 13 + + def method_2(self): + pass + + + try: + raise Error + except Error as error: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testCommentSpacing(self): + unformatted_code = textwrap.dedent("""\ + # This is the first comment + # And it's multiline + + # This is the second comment + + def foo(): + pass + + # multiline before a + # class definition + + # This is the second comment + + class qux(object): + pass + + + # An attached comment. + class bar(object): + '''class docstring''' + # Comment attached to + # function + def foo(self): + '''Another docstring.''' + # Another multiline + # comment + pass + """) + expected_formatted_code = textwrap.dedent("""\ + # This is the first comment + # And it's multiline + + # This is the second comment + + + def foo(): + pass + + + # multiline before a + # class definition + + # This is the second comment + + + class qux(object): + pass + + + # An attached comment. + class bar(object): + '''class docstring''' + + # Comment attached to + # function + def foo(self): + '''Another docstring.''' + # Another multiline + # comment + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testCommentBeforeMethod(self): + code = textwrap.dedent("""\ + class foo(object): + + # pylint: disable=invalid-name + def f(self): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testCommentsBeforeClassDefs(self): + code = textwrap.dedent('''\ + """Test.""" + + # Comment + + + class Foo(object): + pass + ''') + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testCommentsBeforeDecorator(self): + code = textwrap.dedent("""\ + # The @foo operator adds bork to a(). + @foo() + def a(): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + code = textwrap.dedent("""\ + # Hello world + + + @foo() + def a(): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testCommentsAfterDecorator(self): + code = textwrap.dedent("""\ + class _(): + + def _(): + pass + + @pytest.mark.xfail(reason="#709 and #710") + # also + #@pytest.mark.xfail(setuptools.tests.is_ascii, + # reason="https://github.com/pypa/setuptools/issues/706") + def test_unicode_filename_in_sdist(self, sdist_unicode, tmpdir, monkeypatch): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testInnerClasses(self): + unformatted_code = textwrap.dedent("""\ + class DeployAPIClient(object): + class Error(Exception): pass + + class TaskValidationError(Error): pass + + class DeployAPIHTTPError(Error): pass + """) + expected_formatted_code = textwrap.dedent("""\ + class DeployAPIClient(object): + + class Error(Exception): + pass + + class TaskValidationError(Error): + pass + + class DeployAPIHTTPError(Error): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testLinesOnRangeBoundary(self): + unformatted_code = textwrap.dedent(u"""\ + def A(): + pass + + def B(): # 4 + pass # 5 + + def C(): + pass + def D(): # 9 + pass # 10 + def E(): + pass + """) + expected_formatted_code = textwrap.dedent(u"""\ + def A(): + pass + + + def B(): # 4 + pass # 5 + + + def C(): + pass + + + def D(): # 9 + pass # 10 + + + def E(): + pass + """) + code, changed = yapf_api.FormatCode( + unformatted_code, lines=[(4, 5), (9, 10)]) + self.assertCodeEqual(expected_formatted_code, code) + self.assertTrue(changed) + + def testLinesRangeBoundaryNotOutside(self): + unformatted_code = textwrap.dedent(u"""\ + def A(): + pass + + + + def B(): # 6 + pass # 7 + + + + def C(): + pass + """) + expected_formatted_code = textwrap.dedent(u"""\ + def A(): + pass + + + + def B(): # 6 + pass # 7 + + + + def C(): + pass + """) + code, changed = yapf_api.FormatCode(unformatted_code, lines=[(6, 7)]) + self.assertCodeEqual(expected_formatted_code, code) + self.assertFalse(changed) + + def testLinesRangeRemove(self): + unformatted_code = textwrap.dedent(u"""\ + def A(): + pass + + + + def B(): # 6 + pass # 7 + + + + + def C(): + pass + """) + expected_formatted_code = textwrap.dedent(u"""\ + def A(): + pass + + + def B(): # 6 + pass # 7 + + + def C(): + pass + """) + code, changed = yapf_api.FormatCode(unformatted_code, lines=[(5, 9)]) + self.assertCodeEqual(expected_formatted_code, code) + self.assertTrue(changed) + + def testLinesRangeRemoveSome(self): + unformatted_code = textwrap.dedent(u"""\ + def A(): + pass + + + + + def B(): # 7 + pass # 8 + + + + + def C(): + pass + """) + expected_formatted_code = textwrap.dedent(u"""\ + def A(): + pass + + + + def B(): # 7 + pass # 8 + + + + def C(): + pass + """) + code, changed = yapf_api.FormatCode(unformatted_code, lines=[(6, 9)]) + self.assertCodeEqual(expected_formatted_code, code) + self.assertTrue(changed) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/comment_splicer_test.py b/.venv/lib/python3.9/site-packages/yapftests/comment_splicer_test.py new file mode 100644 index 00000000..aacc8882 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/comment_splicer_test.py @@ -0,0 +1,334 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.comment_splicer.""" + +import textwrap +import unittest + +from yapf.yapflib import comment_splicer +from yapf.yapflib import py3compat +from yapf.yapflib import pytree_utils + + +class CommentSplicerTest(unittest.TestCase): + + def _AssertNodeType(self, expected_type, node): + self.assertEqual(expected_type, pytree_utils.NodeName(node)) + + def _AssertNodeIsComment(self, node, text_in_comment=None): + if pytree_utils.NodeName(node) == 'simple_stmt': + self._AssertNodeType('COMMENT', node.children[0]) + node_value = node.children[0].value + else: + self._AssertNodeType('COMMENT', node) + node_value = node.value + if text_in_comment is not None: + self.assertIn(text_in_comment, node_value) + + def _FindNthChildNamed(self, node, name, n=1): + for i, child in enumerate( + py3compat.ifilter(lambda c: pytree_utils.NodeName(c) == name, + node.pre_order())): + if i == n - 1: + return child + raise RuntimeError('No Nth child for n={0}'.format(n)) + + def testSimpleInline(self): + code = 'foo = 1 # and a comment\n' + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + expr = tree.children[0].children[0] + # Check that the expected node is still expr_stmt, but now it has 4 children + # (before comment splicing it had 3), the last child being the comment. + self._AssertNodeType('expr_stmt', expr) + self.assertEqual(4, len(expr.children)) + comment_node = expr.children[3] + self._AssertNodeIsComment(comment_node, '# and a comment') + + def testSimpleSeparateLine(self): + code = textwrap.dedent(r''' + foo = 1 + # first comment + bar = 2 + ''') + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + # The comment should've been added to the root's children (now 4, including + # the ENDMARKER in the end. + self.assertEqual(4, len(tree.children)) + comment_node = tree.children[1] + self._AssertNodeIsComment(comment_node) + + def testTwoLineComment(self): + code = textwrap.dedent(r''' + foo = 1 + # first comment + # second comment + bar = 2 + ''') + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + # This is similar to the single-line standalone comment. + self.assertEqual(4, len(tree.children)) + self._AssertNodeIsComment(tree.children[1]) + + def testCommentIsFirstChildInCompound(self): + code = textwrap.dedent(r''' + if x: + # a comment + foo = 1 + ''') + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + # Look into the suite node under the 'if'. We don't care about the NEWLINE + # leaf but the new COMMENT must be a child of the suite and before the + # actual code leaf. + if_suite = tree.children[0].children[3] + self._AssertNodeType('NEWLINE', if_suite.children[0]) + self._AssertNodeIsComment(if_suite.children[1]) + + def testCommentIsLastChildInCompound(self): + code = textwrap.dedent(r''' + if x: + foo = 1 + # a comment + ''') + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + # Look into the suite node under the 'if'. We don't care about the DEDENT + # leaf but the new COMMENT must be a child of the suite and after the + # actual code leaf. + if_suite = tree.children[0].children[3] + self._AssertNodeType('DEDENT', if_suite.children[-1]) + self._AssertNodeIsComment(if_suite.children[-2]) + + def testInlineAfterSeparateLine(self): + code = textwrap.dedent(r''' + bar = 1 + # line comment + foo = 1 # inline comment + ''') + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + # The separate line comment should become a child of the root, while + # the inline comment remains within its simple_node. + sep_comment_node = tree.children[1] + self._AssertNodeIsComment(sep_comment_node, '# line comment') + + expr = tree.children[2].children[0] + inline_comment_node = expr.children[-1] + self._AssertNodeIsComment(inline_comment_node, '# inline comment') + + def testSeparateLineAfterInline(self): + code = textwrap.dedent(r''' + bar = 1 + foo = 1 # inline comment + # line comment + ''') + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + # The separate line comment should become a child of the root, while + # the inline comment remains within its simple_node. + sep_comment_node = tree.children[-2] + self._AssertNodeIsComment(sep_comment_node, '# line comment') + + expr = tree.children[1].children[0] + inline_comment_node = expr.children[-1] + self._AssertNodeIsComment(inline_comment_node, '# inline comment') + + def testCommentBeforeDedent(self): + code = textwrap.dedent(r''' + if bar: + z = 1 + # a comment + j = 2 + ''') + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + # The comment should go under the tree root, not under the 'if'. + self._AssertNodeIsComment(tree.children[1]) + if_suite = tree.children[0].children[3] + self._AssertNodeType('DEDENT', if_suite.children[-1]) + + def testCommentBeforeDedentTwoLevel(self): + code = textwrap.dedent(r''' + if foo: + if bar: + z = 1 + # a comment + y = 1 + ''') + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + if_suite = tree.children[0].children[3] + # The comment is in the first if_suite, not the nested if under it. It's + # right before the DEDENT + self._AssertNodeIsComment(if_suite.children[-2]) + self._AssertNodeType('DEDENT', if_suite.children[-1]) + + def testCommentBeforeDedentTwoLevelImproperlyIndented(self): + code = textwrap.dedent(r''' + if foo: + if bar: + z = 1 + # comment 2 + y = 1 + ''') + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + # The comment here is indented by 3 spaces, which is unlike any of the + # surrounding statement indentation levels. The splicer attaches it to the + # "closest" parent with smaller indentation. + if_suite = tree.children[0].children[3] + # The comment is in the first if_suite, not the nested if under it. It's + # right before the DEDENT + self._AssertNodeIsComment(if_suite.children[-2]) + self._AssertNodeType('DEDENT', if_suite.children[-1]) + + def testCommentBeforeDedentThreeLevel(self): + code = textwrap.dedent(r''' + if foo: + if bar: + z = 1 + # comment 2 + # comment 1 + # comment 0 + j = 2 + ''') + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + # comment 0 should go under the tree root + self._AssertNodeIsComment(tree.children[1], '# comment 0') + + # comment 1 is in the first if_suite, right before the DEDENT + if_suite_1 = self._FindNthChildNamed(tree, 'suite', n=1) + self._AssertNodeIsComment(if_suite_1.children[-2], '# comment 1') + self._AssertNodeType('DEDENT', if_suite_1.children[-1]) + + # comment 2 is in if_suite nested under the first if suite, + # right before the DEDENT + if_suite_2 = self._FindNthChildNamed(tree, 'suite', n=2) + self._AssertNodeIsComment(if_suite_2.children[-2], '# comment 2') + self._AssertNodeType('DEDENT', if_suite_2.children[-1]) + + def testCommentsInClass(self): + code = textwrap.dedent(r''' + class Foo: + """docstring abc...""" + # top-level comment + def foo(): pass + # another comment + ''') + + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + class_suite = tree.children[0].children[3] + another_comment = class_suite.children[-2] + self._AssertNodeIsComment(another_comment, '# another') + + # It's OK for the comment to be a child of funcdef, as long as it's + # the first child and thus comes before the 'def'. + funcdef = class_suite.children[3] + toplevel_comment = funcdef.children[0] + self._AssertNodeIsComment(toplevel_comment, '# top-level') + + def testMultipleBlockComments(self): + code = textwrap.dedent(r''' + # Block comment number 1 + + # Block comment number 2 + def f(): + pass + ''') + + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + funcdef = tree.children[0] + block_comment_1 = funcdef.children[0] + self._AssertNodeIsComment(block_comment_1, '# Block comment number 1') + + block_comment_2 = funcdef.children[1] + self._AssertNodeIsComment(block_comment_2, '# Block comment number 2') + + def testCommentsOnDedents(self): + code = textwrap.dedent(r''' + class Foo(object): + # A comment for qux. + def qux(self): + pass + + # Interim comment. + + def mux(self): + pass + ''') + + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + classdef = tree.children[0] + class_suite = classdef.children[6] + qux_comment = class_suite.children[1] + self._AssertNodeIsComment(qux_comment, '# A comment for qux.') + + interim_comment = class_suite.children[4] + self._AssertNodeIsComment(interim_comment, '# Interim comment.') + + def testExprComments(self): + code = textwrap.dedent(r''' + foo( # Request fractions of an hour. + 948.0/3600, 20) + ''') + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + trailer = self._FindNthChildNamed(tree, 'trailer', 1) + comment = trailer.children[1] + self._AssertNodeIsComment(comment, '# Request fractions of an hour.') + + def testMultipleCommentsInOneExpr(self): + code = textwrap.dedent(r''' + foo( # com 1 + 948.0/3600, # com 2 + 20 + 12 # com 3 + ) + ''') + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + + trailer = self._FindNthChildNamed(tree, 'trailer', 1) + self._AssertNodeIsComment(trailer.children[1], '# com 1') + + arglist = self._FindNthChildNamed(tree, 'arglist', 1) + self._AssertNodeIsComment(arglist.children[2], '# com 2') + + arith_expr = self._FindNthChildNamed(tree, 'arith_expr', 1) + self._AssertNodeIsComment(arith_expr.children[-1], '# com 3') + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/file_resources_test.py b/.venv/lib/python3.9/site-packages/yapftests/file_resources_test.py new file mode 100644 index 00000000..a4b12305 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/file_resources_test.py @@ -0,0 +1,493 @@ +# -*- coding: utf-8 -*- +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.file_resources.""" + +import contextlib +import os +import shutil +import tempfile +import unittest + +from yapf.yapflib import errors +from yapf.yapflib import file_resources +from yapf.yapflib import py3compat + +from yapftests import utils + + +@contextlib.contextmanager +def _restore_working_dir(): + curdir = os.getcwd() + try: + yield + finally: + os.chdir(curdir) + + +@contextlib.contextmanager +def _exists_mocked_in_module(module, mock_implementation): + unmocked_exists = getattr(module, 'exists') + setattr(module, 'exists', mock_implementation) + try: + yield + finally: + setattr(module, 'exists', unmocked_exists) + + +class GetExcludePatternsForDir(unittest.TestCase): + + def setUp(self): # pylint: disable=g-missing-super-call + self.test_tmpdir = tempfile.mkdtemp() + + def tearDown(self): # pylint: disable=g-missing-super-call + shutil.rmtree(self.test_tmpdir) + + def _make_test_dir(self, name): + fullpath = os.path.normpath(os.path.join(self.test_tmpdir, name)) + os.makedirs(fullpath) + return fullpath + + def test_get_exclude_file_patterns(self): + local_ignore_file = os.path.join(self.test_tmpdir, '.yapfignore') + ignore_patterns = ['temp/**/*.py', 'temp2/*.py'] + with open(local_ignore_file, 'w') as f: + f.writelines('\n'.join(ignore_patterns)) + + self.assertEqual( + sorted(file_resources.GetExcludePatternsForDir(self.test_tmpdir)), + sorted(ignore_patterns)) + + +class GetDefaultStyleForDirTest(unittest.TestCase): + + def setUp(self): # pylint: disable=g-missing-super-call + self.test_tmpdir = tempfile.mkdtemp() + + def tearDown(self): # pylint: disable=g-missing-super-call + shutil.rmtree(self.test_tmpdir) + + def test_no_local_style(self): + test_file = os.path.join(self.test_tmpdir, 'file.py') + style_name = file_resources.GetDefaultStyleForDir(test_file) + self.assertEqual(style_name, 'pep8') + + def test_no_local_style_custom_default(self): + test_file = os.path.join(self.test_tmpdir, 'file.py') + style_name = file_resources.GetDefaultStyleForDir( + test_file, default_style='custom-default') + self.assertEqual(style_name, 'custom-default') + + def test_with_local_style(self): + # Create an empty .style.yapf file in test_tmpdir + style_file = os.path.join(self.test_tmpdir, '.style.yapf') + open(style_file, 'w').close() + + test_filename = os.path.join(self.test_tmpdir, 'file.py') + self.assertEqual(style_file, + file_resources.GetDefaultStyleForDir(test_filename)) + + test_filename = os.path.join(self.test_tmpdir, 'dir1', 'file.py') + self.assertEqual(style_file, + file_resources.GetDefaultStyleForDir(test_filename)) + + def test_setup_config(self): + # An empty setup.cfg file should not be used + setup_config = os.path.join(self.test_tmpdir, 'setup.cfg') + open(setup_config, 'w').close() + + test_dir = os.path.join(self.test_tmpdir, 'dir1') + style_name = file_resources.GetDefaultStyleForDir(test_dir) + self.assertEqual(style_name, 'pep8') + + # One with a '[yapf]' section should be used + with open(setup_config, 'w') as f: + f.write('[yapf]\n') + self.assertEqual(setup_config, + file_resources.GetDefaultStyleForDir(test_dir)) + + def test_pyproject_toml(self): + # An empty pyproject.toml file should not be used + try: + import toml + except ImportError: + return + + pyproject_toml = os.path.join(self.test_tmpdir, 'pyproject.toml') + open(pyproject_toml, 'w').close() + + test_dir = os.path.join(self.test_tmpdir, 'dir1') + style_name = file_resources.GetDefaultStyleForDir(test_dir) + self.assertEqual(style_name, 'pep8') + + # One with a '[tool.yapf]' section should be used + with open(pyproject_toml, 'w') as f: + f.write('[tool.yapf]\n') + self.assertEqual(pyproject_toml, + file_resources.GetDefaultStyleForDir(test_dir)) + + def test_local_style_at_root(self): + # Test behavior of files located on the root, and under root. + rootdir = os.path.abspath(os.path.sep) + test_dir_at_root = os.path.join(rootdir, 'dir1') + test_dir_under_root = os.path.join(rootdir, 'dir1', 'dir2') + + # Fake placing only a style file at the root by mocking `os.path.exists`. + style_file = os.path.join(rootdir, '.style.yapf') + + def mock_exists_implementation(path): + return path == style_file + + with _exists_mocked_in_module(file_resources.os.path, + mock_exists_implementation): + # Both files should find the style file at the root. + default_style_at_root = file_resources.GetDefaultStyleForDir( + test_dir_at_root) + self.assertEqual(style_file, default_style_at_root) + default_style_under_root = file_resources.GetDefaultStyleForDir( + test_dir_under_root) + self.assertEqual(style_file, default_style_under_root) + + +def _touch_files(filenames): + for name in filenames: + open(name, 'a').close() + + +class GetCommandLineFilesTest(unittest.TestCase): + + def setUp(self): # pylint: disable=g-missing-super-call + self.test_tmpdir = tempfile.mkdtemp() + self.old_dir = os.getcwd() + + def tearDown(self): # pylint: disable=g-missing-super-call + os.chdir(self.old_dir) + shutil.rmtree(self.test_tmpdir) + + def _make_test_dir(self, name): + fullpath = os.path.normpath(os.path.join(self.test_tmpdir, name)) + os.makedirs(fullpath) + return fullpath + + def test_find_files_not_dirs(self): + tdir1 = self._make_test_dir('test1') + tdir2 = self._make_test_dir('test2') + file1 = os.path.join(tdir1, 'testfile1.py') + file2 = os.path.join(tdir2, 'testfile2.py') + _touch_files([file1, file2]) + + self.assertEqual( + file_resources.GetCommandLineFiles([file1, file2], + recursive=False, + exclude=None), [file1, file2]) + self.assertEqual( + file_resources.GetCommandLineFiles([file1, file2], + recursive=True, + exclude=None), [file1, file2]) + + def test_nonrecursive_find_in_dir(self): + tdir1 = self._make_test_dir('test1') + tdir2 = self._make_test_dir('test1/foo') + file1 = os.path.join(tdir1, 'testfile1.py') + file2 = os.path.join(tdir2, 'testfile2.py') + _touch_files([file1, file2]) + + self.assertRaises( + errors.YapfError, + file_resources.GetCommandLineFiles, + command_line_file_list=[tdir1], + recursive=False, + exclude=None) + + def test_recursive_find_in_dir(self): + tdir1 = self._make_test_dir('test1') + tdir2 = self._make_test_dir('test2/testinner/') + tdir3 = self._make_test_dir('test3/foo/bar/bas/xxx') + files = [ + os.path.join(tdir1, 'testfile1.py'), + os.path.join(tdir2, 'testfile2.py'), + os.path.join(tdir3, 'testfile3.py'), + ] + _touch_files(files) + + self.assertEqual( + sorted( + file_resources.GetCommandLineFiles([self.test_tmpdir], + recursive=True, + exclude=None)), sorted(files)) + + def test_recursive_find_in_dir_with_exclude(self): + tdir1 = self._make_test_dir('test1') + tdir2 = self._make_test_dir('test2/testinner/') + tdir3 = self._make_test_dir('test3/foo/bar/bas/xxx') + files = [ + os.path.join(tdir1, 'testfile1.py'), + os.path.join(tdir2, 'testfile2.py'), + os.path.join(tdir3, 'testfile3.py'), + ] + _touch_files(files) + + self.assertEqual( + sorted( + file_resources.GetCommandLineFiles([self.test_tmpdir], + recursive=True, + exclude=['*test*3.py'])), + sorted([ + os.path.join(tdir1, 'testfile1.py'), + os.path.join(tdir2, 'testfile2.py'), + ])) + + def test_find_with_excluded_hidden_dirs(self): + tdir1 = self._make_test_dir('.test1') + tdir2 = self._make_test_dir('test_2') + tdir3 = self._make_test_dir('test.3') + files = [ + os.path.join(tdir1, 'testfile1.py'), + os.path.join(tdir2, 'testfile2.py'), + os.path.join(tdir3, 'testfile3.py'), + ] + _touch_files(files) + + actual = file_resources.GetCommandLineFiles([self.test_tmpdir], + recursive=True, + exclude=['*.test1*']) + + self.assertEqual( + sorted(actual), + sorted([ + os.path.join(tdir2, 'testfile2.py'), + os.path.join(tdir3, 'testfile3.py'), + ])) + + def test_find_with_excluded_hidden_dirs_relative(self): + """Test find with excluded hidden dirs. + + A regression test against a specific case where a hidden directory (one + beginning with a period) is being excluded, but it is also an immediate + child of the current directory which has been specified in a relative + manner. + + At its core, the bug has to do with overzelous stripping of "./foo" so that + it removes too much from "./.foo" . + """ + tdir1 = self._make_test_dir('.test1') + tdir2 = self._make_test_dir('test_2') + tdir3 = self._make_test_dir('test.3') + files = [ + os.path.join(tdir1, 'testfile1.py'), + os.path.join(tdir2, 'testfile2.py'), + os.path.join(tdir3, 'testfile3.py'), + ] + _touch_files(files) + + # We must temporarily change the current directory, so that we test against + # patterns like ./.test1/file instead of /tmp/foo/.test1/file + with _restore_working_dir(): + + os.chdir(self.test_tmpdir) + actual = file_resources.GetCommandLineFiles( + [os.path.relpath(self.test_tmpdir)], + recursive=True, + exclude=['*.test1*']) + + self.assertEqual( + sorted(actual), + sorted([ + os.path.join( + os.path.relpath(self.test_tmpdir), os.path.basename(tdir2), + 'testfile2.py'), + os.path.join( + os.path.relpath(self.test_tmpdir), os.path.basename(tdir3), + 'testfile3.py'), + ])) + + def test_find_with_excluded_dirs(self): + tdir1 = self._make_test_dir('test1') + tdir2 = self._make_test_dir('test2/testinner/') + tdir3 = self._make_test_dir('test3/foo/bar/bas/xxx') + files = [ + os.path.join(tdir1, 'testfile1.py'), + os.path.join(tdir2, 'testfile2.py'), + os.path.join(tdir3, 'testfile3.py'), + ] + _touch_files(files) + + os.chdir(self.test_tmpdir) + + found = sorted( + file_resources.GetCommandLineFiles(['test1', 'test2', 'test3'], + recursive=True, + exclude=[ + 'test1', + 'test2/testinner/', + ])) + + self.assertEqual( + found, ['test3/foo/bar/bas/xxx/testfile3.py'.replace("/", os.path.sep)]) + + found = sorted( + file_resources.GetCommandLineFiles(['.'], + recursive=True, + exclude=[ + 'test1', + 'test3', + ])) + + self.assertEqual( + found, ['./test2/testinner/testfile2.py'.replace("/", os.path.sep)]) + + def test_find_with_excluded_current_dir(self): + with self.assertRaises(errors.YapfError): + file_resources.GetCommandLineFiles([], False, exclude=['./z']) + + +class IsPythonFileTest(unittest.TestCase): + + def setUp(self): # pylint: disable=g-missing-super-call + self.test_tmpdir = tempfile.mkdtemp() + + def tearDown(self): # pylint: disable=g-missing-super-call + shutil.rmtree(self.test_tmpdir) + + def test_with_py_extension(self): + file1 = os.path.join(self.test_tmpdir, 'testfile1.py') + self.assertTrue(file_resources.IsPythonFile(file1)) + + def test_empty_without_py_extension(self): + file1 = os.path.join(self.test_tmpdir, 'testfile1') + self.assertFalse(file_resources.IsPythonFile(file1)) + file2 = os.path.join(self.test_tmpdir, 'testfile1.rb') + self.assertFalse(file_resources.IsPythonFile(file2)) + + def test_python_shebang(self): + file1 = os.path.join(self.test_tmpdir, 'testfile1') + with open(file1, 'w') as f: + f.write(u'#!/usr/bin/python\n') + self.assertTrue(file_resources.IsPythonFile(file1)) + + file2 = os.path.join(self.test_tmpdir, 'testfile2.run') + with open(file2, 'w') as f: + f.write(u'#! /bin/python2\n') + self.assertTrue(file_resources.IsPythonFile(file1)) + + def test_with_latin_encoding(self): + file1 = os.path.join(self.test_tmpdir, 'testfile1') + with py3compat.open_with_encoding(file1, mode='w', encoding='latin-1') as f: + f.write(u'#! /bin/python2\n') + self.assertTrue(file_resources.IsPythonFile(file1)) + + def test_with_invalid_encoding(self): + file1 = os.path.join(self.test_tmpdir, 'testfile1') + with open(file1, 'w') as f: + f.write(u'#! /bin/python2\n') + f.write(u'# -*- coding: iso-3-14159 -*-\n') + self.assertFalse(file_resources.IsPythonFile(file1)) + + +class IsIgnoredTest(unittest.TestCase): + + def test_root_path(self): + self.assertTrue(file_resources.IsIgnored('media', ['media'])) + self.assertFalse(file_resources.IsIgnored('media', ['media/*'])) + + def test_sub_path(self): + self.assertTrue(file_resources.IsIgnored('media/a', ['*/a'])) + self.assertTrue(file_resources.IsIgnored('media/b', ['media/*'])) + self.assertTrue(file_resources.IsIgnored('media/b/c', ['*/*/c'])) + + def test_trailing_slash(self): + self.assertTrue(file_resources.IsIgnored('z', ['z'])) + self.assertTrue(file_resources.IsIgnored('z', ['z' + os.path.sep])) + + +class BufferedByteStream(object): + + def __init__(self): + self.stream = py3compat.BytesIO() + + def getvalue(self): # pylint: disable=invalid-name + return self.stream.getvalue().decode('utf-8') + + @property + def buffer(self): + return self.stream + + +class WriteReformattedCodeTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): # pylint: disable=g-missing-super-call + cls.test_tmpdir = tempfile.mkdtemp() + + @classmethod + def tearDownClass(cls): # pylint: disable=g-missing-super-call + shutil.rmtree(cls.test_tmpdir) + + def test_write_to_file(self): + s = u'foobar\n' + with utils.NamedTempFile(dirname=self.test_tmpdir) as (f, fname): + file_resources.WriteReformattedCode( + fname, s, in_place=True, encoding='utf-8') + f.flush() + + with open(fname) as f2: + self.assertEqual(f2.read(), s) + + def test_write_to_stdout(self): + s = u'foobar' + stream = BufferedByteStream() if py3compat.PY3 else py3compat.StringIO() + with utils.stdout_redirector(stream): + file_resources.WriteReformattedCode( + None, s, in_place=False, encoding='utf-8') + self.assertEqual(stream.getvalue(), s) + + def test_write_encoded_to_stdout(self): + s = '\ufeff# -*- coding: utf-8 -*-\nresult = "passed"\n' # pylint: disable=anomalous-unicode-escape-in-string + stream = BufferedByteStream() if py3compat.PY3 else py3compat.StringIO() + with utils.stdout_redirector(stream): + file_resources.WriteReformattedCode( + None, s, in_place=False, encoding='utf-8') + self.assertEqual(stream.getvalue(), s) + + +class LineEndingTest(unittest.TestCase): + + def test_line_ending_linefeed(self): + lines = ['spam\n', 'spam\n'] + actual = file_resources.LineEnding(lines) + self.assertEqual(actual, '\n') + + def test_line_ending_carriage_return(self): + lines = ['spam\r', 'spam\r'] + actual = file_resources.LineEnding(lines) + self.assertEqual(actual, '\r') + + def test_line_ending_combo(self): + lines = ['spam\r\n', 'spam\r\n'] + actual = file_resources.LineEnding(lines) + self.assertEqual(actual, '\r\n') + + def test_line_ending_weighted(self): + lines = [ + 'spam\n', + 'spam\n', + 'spam\r', + 'spam\r\n', + ] + actual = file_resources.LineEnding(lines) + self.assertEqual(actual, '\n') + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/format_decision_state_test.py b/.venv/lib/python3.9/site-packages/yapftests/format_decision_state_test.py new file mode 100644 index 00000000..39e7e8e0 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/format_decision_state_test.py @@ -0,0 +1,145 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.format_decision_state.""" + +import textwrap +import unittest + +from yapf.yapflib import format_decision_state +from yapf.yapflib import pytree_utils +from yapf.yapflib import style +from yapf.yapflib import unwrapped_line + +from yapftests import yapf_test_helper + + +class FormatDecisionStateTest(yapf_test_helper.YAPFTest): + + @classmethod + def setUpClass(cls): + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testSimpleFunctionDefWithNoSplitting(self): + code = textwrap.dedent(r""" + def f(a, b): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + uwline = unwrapped_line.UnwrappedLine(0, _FilterLine(uwlines[0])) + uwline.CalculateFormattingInformation() + + # Add: 'f' + state = format_decision_state.FormatDecisionState(uwline, 0) + state.MoveStateToNextToken() + self.assertEqual('f', state.next_token.value) + self.assertFalse(state.CanSplit(False)) + + # Add: '(' + state.AddTokenToState(False, True) + self.assertEqual('(', state.next_token.value) + self.assertFalse(state.CanSplit(False)) + self.assertFalse(state.MustSplit()) + + # Add: 'a' + state.AddTokenToState(False, True) + self.assertEqual('a', state.next_token.value) + self.assertTrue(state.CanSplit(False)) + self.assertFalse(state.MustSplit()) + + # Add: ',' + state.AddTokenToState(False, True) + self.assertEqual(',', state.next_token.value) + self.assertFalse(state.CanSplit(False)) + self.assertFalse(state.MustSplit()) + + # Add: 'b' + state.AddTokenToState(False, True) + self.assertEqual('b', state.next_token.value) + self.assertTrue(state.CanSplit(False)) + self.assertFalse(state.MustSplit()) + + # Add: ')' + state.AddTokenToState(False, True) + self.assertEqual(')', state.next_token.value) + self.assertTrue(state.CanSplit(False)) + self.assertFalse(state.MustSplit()) + + # Add: ':' + state.AddTokenToState(False, True) + self.assertEqual(':', state.next_token.value) + self.assertFalse(state.CanSplit(False)) + self.assertFalse(state.MustSplit()) + + clone = state.Clone() + self.assertEqual(repr(state), repr(clone)) + + def testSimpleFunctionDefWithSplitting(self): + code = textwrap.dedent(r""" + def f(a, b): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + uwline = unwrapped_line.UnwrappedLine(0, _FilterLine(uwlines[0])) + uwline.CalculateFormattingInformation() + + # Add: 'f' + state = format_decision_state.FormatDecisionState(uwline, 0) + state.MoveStateToNextToken() + self.assertEqual('f', state.next_token.value) + self.assertFalse(state.CanSplit(False)) + + # Add: '(' + state.AddTokenToState(True, True) + self.assertEqual('(', state.next_token.value) + self.assertFalse(state.CanSplit(False)) + + # Add: 'a' + state.AddTokenToState(True, True) + self.assertEqual('a', state.next_token.value) + self.assertTrue(state.CanSplit(False)) + + # Add: ',' + state.AddTokenToState(True, True) + self.assertEqual(',', state.next_token.value) + self.assertFalse(state.CanSplit(False)) + + # Add: 'b' + state.AddTokenToState(True, True) + self.assertEqual('b', state.next_token.value) + self.assertTrue(state.CanSplit(False)) + + # Add: ')' + state.AddTokenToState(True, True) + self.assertEqual(')', state.next_token.value) + self.assertTrue(state.CanSplit(False)) + + # Add: ':' + state.AddTokenToState(True, True) + self.assertEqual(':', state.next_token.value) + self.assertFalse(state.CanSplit(False)) + + clone = state.Clone() + self.assertEqual(repr(state), repr(clone)) + + +def _FilterLine(uwline): + """Filter out nonsemantic tokens from the UnwrappedLines.""" + return [ + ft for ft in uwline.tokens + if ft.name not in pytree_utils.NONSEMANTIC_TOKENS + ] + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/format_token_test.py b/.venv/lib/python3.9/site-packages/yapftests/format_token_test.py new file mode 100644 index 00000000..b4c71510 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/format_token_test.py @@ -0,0 +1,88 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.format_token.""" + +import unittest + +from lib2to3 import pytree +from lib2to3.pgen2 import token + +from yapf.yapflib import format_token + + +class TabbedContinuationAlignPaddingTest(unittest.TestCase): + + def testSpace(self): + align_style = 'SPACE' + + pad = format_token._TabbedContinuationAlignPadding(0, align_style, 2) + self.assertEqual(pad, '') + + pad = format_token._TabbedContinuationAlignPadding(2, align_style, 2) + self.assertEqual(pad, ' ' * 2) + + pad = format_token._TabbedContinuationAlignPadding(5, align_style, 2) + self.assertEqual(pad, ' ' * 5) + + def testFixed(self): + align_style = 'FIXED' + + pad = format_token._TabbedContinuationAlignPadding(0, align_style, 4) + self.assertEqual(pad, '') + + pad = format_token._TabbedContinuationAlignPadding(2, align_style, 4) + self.assertEqual(pad, '\t') + + pad = format_token._TabbedContinuationAlignPadding(5, align_style, 4) + self.assertEqual(pad, '\t' * 2) + + def testVAlignRight(self): + align_style = 'VALIGN-RIGHT' + + pad = format_token._TabbedContinuationAlignPadding(0, align_style, 4) + self.assertEqual(pad, '') + + pad = format_token._TabbedContinuationAlignPadding(2, align_style, 4) + self.assertEqual(pad, '\t') + + pad = format_token._TabbedContinuationAlignPadding(4, align_style, 4) + self.assertEqual(pad, '\t') + + pad = format_token._TabbedContinuationAlignPadding(5, align_style, 4) + self.assertEqual(pad, '\t' * 2) + + +class FormatTokenTest(unittest.TestCase): + + def testSimple(self): + tok = format_token.FormatToken(pytree.Leaf(token.STRING, "'hello world'")) + self.assertEqual("FormatToken(name=STRING, value='hello world', lineno=0)", + str(tok)) + self.assertTrue(tok.is_string) + + tok = format_token.FormatToken(pytree.Leaf(token.COMMENT, '# A comment')) + self.assertEqual('FormatToken(name=COMMENT, value=# A comment, lineno=0)', + str(tok)) + self.assertTrue(tok.is_comment) + + def testIsMultilineString(self): + tok = format_token.FormatToken(pytree.Leaf(token.STRING, '"""hello"""')) + self.assertTrue(tok.is_multiline_string) + + tok = format_token.FormatToken(pytree.Leaf(token.STRING, 'r"""hello"""')) + self.assertTrue(tok.is_multiline_string) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/line_joiner_test.py b/.venv/lib/python3.9/site-packages/yapftests/line_joiner_test.py new file mode 100644 index 00000000..6501bc88 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/line_joiner_test.py @@ -0,0 +1,82 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.line_joiner.""" + +import textwrap +import unittest + +from yapf.yapflib import line_joiner +from yapf.yapflib import style + +from yapftests import yapf_test_helper + + +class LineJoinerTest(yapf_test_helper.YAPFTest): + + @classmethod + def setUpClass(cls): + style.SetGlobalStyle(style.CreatePEP8Style()) + + def _CheckLineJoining(self, code, join_lines): + """Check that the given UnwrappedLines are joined as expected. + + Arguments: + code: The code to check to see if we can join it. + join_lines: True if we expect the lines to be joined. + """ + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(line_joiner.CanMergeMultipleLines(uwlines), join_lines) + + def testSimpleSingleLineStatement(self): + code = textwrap.dedent(u"""\ + if isinstance(a, int): continue + """) + self._CheckLineJoining(code, join_lines=True) + + def testSimpleMultipleLineStatement(self): + code = textwrap.dedent(u"""\ + if isinstance(b, int): + continue + """) + self._CheckLineJoining(code, join_lines=False) + + def testSimpleMultipleLineComplexStatement(self): + code = textwrap.dedent(u"""\ + if isinstance(c, int): + while True: + continue + """) + self._CheckLineJoining(code, join_lines=False) + + def testSimpleMultipleLineStatementWithComment(self): + code = textwrap.dedent(u"""\ + if isinstance(d, int): continue # We're pleased that d's an int. + """) + self._CheckLineJoining(code, join_lines=True) + + def testSimpleMultipleLineStatementWithLargeIndent(self): + code = textwrap.dedent(u"""\ + if isinstance(e, int): continue + """) + self._CheckLineJoining(code, join_lines=True) + + def testOverColumnLimit(self): + code = textwrap.dedent(u"""\ + if instance(bbbbbbbbbbbbbbbbbbbbbbbbb, int): cccccccccccccccccccccccccc = ddddddddddddddddddddd + """) + self._CheckLineJoining(code, join_lines=False) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/main_test.py b/.venv/lib/python3.9/site-packages/yapftests/main_test.py new file mode 100644 index 00000000..94daaaa9 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/main_test.py @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.__init__.main.""" + +from contextlib import contextmanager +import sys +import unittest +import yapf + +from yapf.yapflib import py3compat + + +class IO(object): + """IO is a thin wrapper around StringIO. + + This is strictly to wrap the Python 3 StringIO object so that it can supply a + "buffer" attribute. + """ + + class Buffer(object): + + def __init__(self): + self.string_io = py3compat.StringIO() + + def write(self, s): + if py3compat.PY3 and isinstance(s, bytes): + s = str(s, 'utf-8') + self.string_io.write(s) + + def getvalue(self): + return self.string_io.getvalue() + + def __init__(self): + self.buffer = self.Buffer() + + def write(self, s): + self.buffer.write(s) + + def getvalue(self): + return self.buffer.getvalue() + + +@contextmanager +def captured_output(): + new_out, new_err = IO(), IO() + old_out, old_err = sys.stdout, sys.stderr + try: + sys.stdout, sys.stderr = new_out, new_err + yield sys.stdout, sys.stderr + finally: + sys.stdout, sys.stderr = old_out, old_err + + +@contextmanager +def patched_input(code): + """Monkey patch code as though it were coming from stdin.""" + + def lines(): + for line in code.splitlines(): + yield line + raise EOFError() + + def patch_raw_input(lines=lines()): + return next(lines) + + try: + orig_raw_import = yapf.py3compat.raw_input + yapf.py3compat.raw_input = patch_raw_input + yield + finally: + yapf.py3compat.raw_input = orig_raw_import + + +class RunMainTest(unittest.TestCase): + + def testShouldHandleYapfError(self): + """run_main should handle YapfError and sys.exit(1).""" + expected_message = 'yapf: Input filenames did not match any python files\n' + sys.argv = ['yapf', 'foo.c'] + with captured_output() as (out, err): + with self.assertRaises(SystemExit): + yapf.run_main() + self.assertEqual(out.getvalue(), '') + self.assertEqual(err.getvalue(), expected_message) + + +class MainTest(unittest.TestCase): + + def testNoPythonFilesMatched(self): + with self.assertRaisesRegexp(yapf.errors.YapfError, + 'did not match any python files'): + yapf.main(['yapf', 'foo.c']) + + def testEchoInput(self): + code = 'a = 1\nb = 2\n' + with patched_input(code): + with captured_output() as (out, _): + ret = yapf.main([]) + self.assertEqual(ret, 0) + self.assertEqual(out.getvalue(), code) + + def testEchoInputWithStyle(self): + code = 'def f(a = 1):\n return 2*a\n' + yapf_code = 'def f(a=1):\n return 2 * a\n' + with patched_input(code): + with captured_output() as (out, _): + ret = yapf.main(['-', '--style=yapf']) + self.assertEqual(ret, 0) + self.assertEqual(out.getvalue(), yapf_code) + + def testEchoBadInput(self): + bad_syntax = ' a = 1\n' + with patched_input(bad_syntax): + with captured_output() as (_, _): + with self.assertRaisesRegexp(SyntaxError, 'unexpected indent'): + yapf.main([]) + + def testHelp(self): + with captured_output() as (out, _): + ret = yapf.main(['-', '--style-help', '--style=pep8']) + self.assertEqual(ret, 0) + help_message = out.getvalue() + self.assertIn('indent_width=4', help_message) + self.assertIn('The number of spaces required before a trailing comment.', + help_message) + + def testVersion(self): + with captured_output() as (out, _): + ret = yapf.main(['-', '--version']) + self.assertEqual(ret, 0) + version = 'yapf {}\n'.format(yapf.__version__) + self.assertEqual(version, out.getvalue()) diff --git a/.venv/lib/python3.9/site-packages/yapftests/pytree_unwrapper_test.py b/.venv/lib/python3.9/site-packages/yapftests/pytree_unwrapper_test.py new file mode 100644 index 00000000..f95f3666 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/pytree_unwrapper_test.py @@ -0,0 +1,356 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.pytree_unwrapper.""" + +import textwrap +import unittest + +from yapf.yapflib import pytree_utils + +from yapftests import yapf_test_helper + + +class PytreeUnwrapperTest(yapf_test_helper.YAPFTest): + + def _CheckUnwrappedLines(self, uwlines, list_of_expected): + """Check that the given UnwrappedLines match expectations. + + Args: + uwlines: list of UnwrappedLine + list_of_expected: list of (depth, values) pairs. Non-semantic tokens are + filtered out from the expected values. + """ + actual = [] + for uwl in uwlines: + filtered_values = [ + ft.value + for ft in uwl.tokens + if ft.name not in pytree_utils.NONSEMANTIC_TOKENS + ] + actual.append((uwl.depth, filtered_values)) + + self.assertEqual(list_of_expected, actual) + + def testSimpleFileScope(self): + code = textwrap.dedent(r""" + x = 1 + # a comment + y = 2 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['x', '=', '1']), + (0, ['# a comment']), + (0, ['y', '=', '2']), + ]) + + def testSimpleMultilineStatement(self): + code = textwrap.dedent(r""" + y = (1 + + x) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['y', '=', '(', '1', '+', 'x', ')']), + ]) + + def testFileScopeWithInlineComment(self): + code = textwrap.dedent(r""" + x = 1 # a comment + y = 2 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['x', '=', '1', '# a comment']), + (0, ['y', '=', '2']), + ]) + + def testSimpleIf(self): + code = textwrap.dedent(r""" + if foo: + x = 1 + y = 2 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['if', 'foo', ':']), + (1, ['x', '=', '1']), + (1, ['y', '=', '2']), + ]) + + def testSimpleIfWithComments(self): + code = textwrap.dedent(r""" + # c1 + if foo: # c2 + x = 1 + y = 2 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['# c1']), + (0, ['if', 'foo', ':', '# c2']), + (1, ['x', '=', '1']), + (1, ['y', '=', '2']), + ]) + + def testIfWithCommentsInside(self): + code = textwrap.dedent(r""" + if foo: + # c1 + x = 1 # c2 + # c3 + y = 2 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['if', 'foo', ':']), + (1, ['# c1']), + (1, ['x', '=', '1', '# c2']), + (1, ['# c3']), + (1, ['y', '=', '2']), + ]) + + def testIfElifElse(self): + code = textwrap.dedent(r""" + if x: + x = 1 # c1 + elif y: # c2 + y = 1 + else: + # c3 + z = 1 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['if', 'x', ':']), + (1, ['x', '=', '1', '# c1']), + (0, ['elif', 'y', ':', '# c2']), + (1, ['y', '=', '1']), + (0, ['else', ':']), + (1, ['# c3']), + (1, ['z', '=', '1']), + ]) + + def testNestedCompoundTwoLevel(self): + code = textwrap.dedent(r""" + if x: + x = 1 # c1 + while t: + # c2 + j = 1 + k = 1 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['if', 'x', ':']), + (1, ['x', '=', '1', '# c1']), + (1, ['while', 't', ':']), + (2, ['# c2']), + (2, ['j', '=', '1']), + (1, ['k', '=', '1']), + ]) + + def testSimpleWhile(self): + code = textwrap.dedent(r""" + while x > 1: # c1 + # c2 + x = 1 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['while', 'x', '>', '1', ':', '# c1']), + (1, ['# c2']), + (1, ['x', '=', '1']), + ]) + + def testSimpleTry(self): + code = textwrap.dedent(r""" + try: + pass + except: + pass + except: + pass + else: + pass + finally: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['try', ':']), + (1, ['pass']), + (0, ['except', ':']), + (1, ['pass']), + (0, ['except', ':']), + (1, ['pass']), + (0, ['else', ':']), + (1, ['pass']), + (0, ['finally', ':']), + (1, ['pass']), + ]) + + def testSimpleFuncdef(self): + code = textwrap.dedent(r""" + def foo(x): # c1 + # c2 + return x + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['def', 'foo', '(', 'x', ')', ':', '# c1']), + (1, ['# c2']), + (1, ['return', 'x']), + ]) + + def testTwoFuncDefs(self): + code = textwrap.dedent(r""" + def foo(x): # c1 + # c2 + return x + + def bar(): # c3 + # c4 + return x + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['def', 'foo', '(', 'x', ')', ':', '# c1']), + (1, ['# c2']), + (1, ['return', 'x']), + (0, ['def', 'bar', '(', ')', ':', '# c3']), + (1, ['# c4']), + (1, ['return', 'x']), + ]) + + def testSimpleClassDef(self): + code = textwrap.dedent(r""" + class Klass: # c1 + # c2 + p = 1 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['class', 'Klass', ':', '# c1']), + (1, ['# c2']), + (1, ['p', '=', '1']), + ]) + + def testSingleLineStmtInFunc(self): + code = textwrap.dedent(r""" + def f(): return 37 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['def', 'f', '(', ')', ':']), + (1, ['return', '37']), + ]) + + def testMultipleComments(self): + code = textwrap.dedent(r""" + # Comment #1 + + # Comment #2 + def f(): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [ + (0, ['# Comment #1']), + (0, ['# Comment #2']), + (0, ['def', 'f', '(', ')', ':']), + (1, ['pass']), + ]) + + def testSplitListWithComment(self): + code = textwrap.dedent(r""" + a = [ + 'a', + 'b', + 'c', # hello world + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckUnwrappedLines(uwlines, [(0, [ + 'a', '=', '[', "'a'", ',', "'b'", ',', "'c'", ',', '# hello world', ']' + ])]) + + +class MatchBracketsTest(yapf_test_helper.YAPFTest): + + def _CheckMatchingBrackets(self, uwlines, list_of_expected): + """Check that the tokens have the expected matching bracket. + + Arguments: + uwlines: list of UnwrappedLine. + list_of_expected: list of (index, index) pairs. The matching brackets at + the indexes need to match. Non-semantic tokens are filtered out from the + expected values. + """ + actual = [] + for uwl in uwlines: + filtered_values = [(ft, ft.matching_bracket) + for ft in uwl.tokens + if ft.name not in pytree_utils.NONSEMANTIC_TOKENS] + if filtered_values: + actual.append(filtered_values) + + for index, bracket_list in enumerate(list_of_expected): + uwline = actual[index] + if not bracket_list: + for value in uwline: + self.assertIsNone(value[1]) + else: + for open_bracket, close_bracket in bracket_list: + self.assertEqual(uwline[open_bracket][0], uwline[close_bracket][1]) + self.assertEqual(uwline[close_bracket][0], uwline[open_bracket][1]) + + def testFunctionDef(self): + code = textwrap.dedent("""\ + def foo(a, b=['w','d'], c=[42, 37]): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckMatchingBrackets(uwlines, [ + [(2, 20), (7, 11), (15, 19)], + [], + ]) + + def testDecorator(self): + code = textwrap.dedent("""\ + @bar() + def foo(a, b, c): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckMatchingBrackets(uwlines, [ + [(2, 3)], + [(2, 8)], + [], + ]) + + def testClassDef(self): + code = textwrap.dedent("""\ + class A(B, C, D): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckMatchingBrackets(uwlines, [ + [(2, 8)], + [], + ]) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/pytree_utils_test.py b/.venv/lib/python3.9/site-packages/yapftests/pytree_utils_test.py new file mode 100644 index 00000000..3b9fde7f --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/pytree_utils_test.py @@ -0,0 +1,205 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.pytree_utils.""" + +import unittest + +from lib2to3 import pygram +from lib2to3 import pytree +from lib2to3.pgen2 import token + +from yapf.yapflib import pytree_utils + +# More direct access to the symbol->number mapping living within the grammar +# module. +_GRAMMAR_SYMBOL2NUMBER = pygram.python_grammar.symbol2number + +_FOO = 'foo' +_FOO1 = 'foo1' +_FOO2 = 'foo2' +_FOO3 = 'foo3' +_FOO4 = 'foo4' +_FOO5 = 'foo5' + + +class NodeNameTest(unittest.TestCase): + + def testNodeNameForLeaf(self): + leaf = pytree.Leaf(token.LPAR, '(') + self.assertEqual('LPAR', pytree_utils.NodeName(leaf)) + + def testNodeNameForNode(self): + leaf = pytree.Leaf(token.LPAR, '(') + node = pytree.Node(pygram.python_grammar.symbol2number['suite'], [leaf]) + self.assertEqual('suite', pytree_utils.NodeName(node)) + + +class ParseCodeToTreeTest(unittest.TestCase): + + def testParseCodeToTree(self): + # Since ParseCodeToTree is a thin wrapper around underlying lib2to3 + # functionality, only a sanity test here... + tree = pytree_utils.ParseCodeToTree('foo = 2\n') + self.assertEqual('file_input', pytree_utils.NodeName(tree)) + self.assertEqual(2, len(tree.children)) + self.assertEqual('simple_stmt', pytree_utils.NodeName(tree.children[0])) + + def testPrintFunctionToTree(self): + tree = pytree_utils.ParseCodeToTree( + 'print("hello world", file=sys.stderr)\n') + self.assertEqual('file_input', pytree_utils.NodeName(tree)) + self.assertEqual(2, len(tree.children)) + self.assertEqual('simple_stmt', pytree_utils.NodeName(tree.children[0])) + + def testPrintStatementToTree(self): + tree = pytree_utils.ParseCodeToTree('print "hello world"\n') + self.assertEqual('file_input', pytree_utils.NodeName(tree)) + self.assertEqual(2, len(tree.children)) + self.assertEqual('simple_stmt', pytree_utils.NodeName(tree.children[0])) + + def testClassNotLocal(self): + tree = pytree_utils.ParseCodeToTree('class nonlocal: pass\n') + self.assertEqual('file_input', pytree_utils.NodeName(tree)) + self.assertEqual(2, len(tree.children)) + self.assertEqual('classdef', pytree_utils.NodeName(tree.children[0])) + + +class InsertNodesBeforeAfterTest(unittest.TestCase): + + def _BuildSimpleTree(self): + # Builds a simple tree we can play with in the tests. + # The tree looks like this: + # + # suite: + # LPAR + # LPAR + # simple_stmt: + # NAME('foo') + # + lpar1 = pytree.Leaf(token.LPAR, '(') + lpar2 = pytree.Leaf(token.LPAR, '(') + simple_stmt = pytree.Node(_GRAMMAR_SYMBOL2NUMBER['simple_stmt'], + [pytree.Leaf(token.NAME, 'foo')]) + return pytree.Node(_GRAMMAR_SYMBOL2NUMBER['suite'], + [lpar1, lpar2, simple_stmt]) + + def _MakeNewNodeRPAR(self): + return pytree.Leaf(token.RPAR, ')') + + def setUp(self): + self._simple_tree = self._BuildSimpleTree() + + def testInsertNodesBefore(self): + # Insert before simple_stmt and make sure it went to the right place + pytree_utils.InsertNodesBefore([self._MakeNewNodeRPAR()], + self._simple_tree.children[2]) + self.assertEqual(4, len(self._simple_tree.children)) + self.assertEqual('RPAR', + pytree_utils.NodeName(self._simple_tree.children[2])) + self.assertEqual('simple_stmt', + pytree_utils.NodeName(self._simple_tree.children[3])) + + def testInsertNodesBeforeFirstChild(self): + # Insert before the first child of its parent + simple_stmt = self._simple_tree.children[2] + foo_child = simple_stmt.children[0] + pytree_utils.InsertNodesBefore([self._MakeNewNodeRPAR()], foo_child) + self.assertEqual(3, len(self._simple_tree.children)) + self.assertEqual(2, len(simple_stmt.children)) + self.assertEqual('RPAR', pytree_utils.NodeName(simple_stmt.children[0])) + self.assertEqual('NAME', pytree_utils.NodeName(simple_stmt.children[1])) + + def testInsertNodesAfter(self): + # Insert after and make sure it went to the right place + pytree_utils.InsertNodesAfter([self._MakeNewNodeRPAR()], + self._simple_tree.children[2]) + self.assertEqual(4, len(self._simple_tree.children)) + self.assertEqual('simple_stmt', + pytree_utils.NodeName(self._simple_tree.children[2])) + self.assertEqual('RPAR', + pytree_utils.NodeName(self._simple_tree.children[3])) + + def testInsertNodesAfterLastChild(self): + # Insert after the last child of its parent + simple_stmt = self._simple_tree.children[2] + foo_child = simple_stmt.children[0] + pytree_utils.InsertNodesAfter([self._MakeNewNodeRPAR()], foo_child) + self.assertEqual(3, len(self._simple_tree.children)) + self.assertEqual(2, len(simple_stmt.children)) + self.assertEqual('NAME', pytree_utils.NodeName(simple_stmt.children[0])) + self.assertEqual('RPAR', pytree_utils.NodeName(simple_stmt.children[1])) + + def testInsertNodesWhichHasParent(self): + # Try to insert an existing tree node into another place and fail. + with self.assertRaises(RuntimeError): + pytree_utils.InsertNodesAfter([self._simple_tree.children[1]], + self._simple_tree.children[0]) + + +class AnnotationsTest(unittest.TestCase): + + def setUp(self): + self._leaf = pytree.Leaf(token.LPAR, '(') + self._node = pytree.Node(_GRAMMAR_SYMBOL2NUMBER['simple_stmt'], + [pytree.Leaf(token.NAME, 'foo')]) + + def testGetWhenNone(self): + self.assertIsNone(pytree_utils.GetNodeAnnotation(self._leaf, _FOO)) + + def testSetWhenNone(self): + pytree_utils.SetNodeAnnotation(self._leaf, _FOO, 20) + self.assertEqual(pytree_utils.GetNodeAnnotation(self._leaf, _FOO), 20) + + def testSetAgain(self): + pytree_utils.SetNodeAnnotation(self._leaf, _FOO, 20) + self.assertEqual(pytree_utils.GetNodeAnnotation(self._leaf, _FOO), 20) + pytree_utils.SetNodeAnnotation(self._leaf, _FOO, 30) + self.assertEqual(pytree_utils.GetNodeAnnotation(self._leaf, _FOO), 30) + + def testMultiple(self): + pytree_utils.SetNodeAnnotation(self._leaf, _FOO, 20) + pytree_utils.SetNodeAnnotation(self._leaf, _FOO1, 1) + pytree_utils.SetNodeAnnotation(self._leaf, _FOO2, 2) + pytree_utils.SetNodeAnnotation(self._leaf, _FOO3, 3) + pytree_utils.SetNodeAnnotation(self._leaf, _FOO4, 4) + pytree_utils.SetNodeAnnotation(self._leaf, _FOO5, 5) + + self.assertEqual(pytree_utils.GetNodeAnnotation(self._leaf, _FOO), 20) + self.assertEqual(pytree_utils.GetNodeAnnotation(self._leaf, _FOO1), 1) + self.assertEqual(pytree_utils.GetNodeAnnotation(self._leaf, _FOO2), 2) + self.assertEqual(pytree_utils.GetNodeAnnotation(self._leaf, _FOO3), 3) + self.assertEqual(pytree_utils.GetNodeAnnotation(self._leaf, _FOO4), 4) + self.assertEqual(pytree_utils.GetNodeAnnotation(self._leaf, _FOO5), 5) + + def testSubtype(self): + pytree_utils.AppendNodeAnnotation(self._leaf, + pytree_utils.Annotation.SUBTYPE, _FOO) + + self.assertSetEqual( + pytree_utils.GetNodeAnnotation(self._leaf, + pytree_utils.Annotation.SUBTYPE), {_FOO}) + + pytree_utils.RemoveSubtypeAnnotation(self._leaf, _FOO) + + self.assertSetEqual( + pytree_utils.GetNodeAnnotation(self._leaf, + pytree_utils.Annotation.SUBTYPE), set()) + + def testSetOnNode(self): + pytree_utils.SetNodeAnnotation(self._node, _FOO, 20) + self.assertEqual(pytree_utils.GetNodeAnnotation(self._node, _FOO), 20) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/pytree_visitor_test.py b/.venv/lib/python3.9/site-packages/yapftests/pytree_visitor_test.py new file mode 100644 index 00000000..1908249d --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/pytree_visitor_test.py @@ -0,0 +1,120 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.pytree_visitor.""" + +import unittest + +from yapf.yapflib import py3compat +from yapf.yapflib import pytree_utils +from yapf.yapflib import pytree_visitor + + +class _NodeNameCollector(pytree_visitor.PyTreeVisitor): + """A tree visitor that collects the names of all tree nodes into a list. + + Attributes: + all_node_names: collected list of the names, available when the traversal + is over. + name_node_values: collects a list of NAME leaves (in addition to those going + into all_node_names). + """ + + def __init__(self): + self.all_node_names = [] + self.name_node_values = [] + + def DefaultNodeVisit(self, node): + self.all_node_names.append(pytree_utils.NodeName(node)) + super(_NodeNameCollector, self).DefaultNodeVisit(node) + + def DefaultLeafVisit(self, leaf): + self.all_node_names.append(pytree_utils.NodeName(leaf)) + + def Visit_NAME(self, leaf): + self.name_node_values.append(leaf.value) + self.DefaultLeafVisit(leaf) + + +_VISITOR_TEST_SIMPLE_CODE = r""" +foo = bar +baz = x +""" + +_VISITOR_TEST_NESTED_CODE = r""" +if x: + if y: + return z +""" + + +class PytreeVisitorTest(unittest.TestCase): + + def testCollectAllNodeNamesSimpleCode(self): + tree = pytree_utils.ParseCodeToTree(_VISITOR_TEST_SIMPLE_CODE) + collector = _NodeNameCollector() + collector.Visit(tree) + expected_names = [ + 'file_input', + 'simple_stmt', 'expr_stmt', 'NAME', 'EQUAL', 'NAME', 'NEWLINE', + 'simple_stmt', 'expr_stmt', 'NAME', 'EQUAL', 'NAME', 'NEWLINE', + 'ENDMARKER', + ] # yapf: disable + self.assertEqual(expected_names, collector.all_node_names) + + expected_name_node_values = ['foo', 'bar', 'baz', 'x'] + self.assertEqual(expected_name_node_values, collector.name_node_values) + + def testCollectAllNodeNamesNestedCode(self): + tree = pytree_utils.ParseCodeToTree(_VISITOR_TEST_NESTED_CODE) + collector = _NodeNameCollector() + collector.Visit(tree) + expected_names = [ + 'file_input', + 'if_stmt', 'NAME', 'NAME', 'COLON', + 'suite', 'NEWLINE', + 'INDENT', 'if_stmt', 'NAME', 'NAME', 'COLON', 'suite', 'NEWLINE', + 'INDENT', 'simple_stmt', 'return_stmt', 'NAME', 'NAME', 'NEWLINE', + 'DEDENT', 'DEDENT', 'ENDMARKER', + ] # yapf: disable + self.assertEqual(expected_names, collector.all_node_names) + + expected_name_node_values = ['if', 'x', 'if', 'y', 'return', 'z'] + self.assertEqual(expected_name_node_values, collector.name_node_values) + + def testDumper(self): + # PyTreeDumper is mainly a debugging utility, so only do basic sanity + # checking. + tree = pytree_utils.ParseCodeToTree(_VISITOR_TEST_SIMPLE_CODE) + stream = py3compat.StringIO() + pytree_visitor.PyTreeDumper(target_stream=stream).Visit(tree) + + dump_output = stream.getvalue() + self.assertIn('file_input [3 children]', dump_output) + self.assertIn("NAME(Leaf(NAME, 'foo'))", dump_output) + self.assertIn("EQUAL(Leaf(EQUAL, '='))", dump_output) + + def testDumpPyTree(self): + # Similar sanity checking for the convenience wrapper DumpPyTree + tree = pytree_utils.ParseCodeToTree(_VISITOR_TEST_SIMPLE_CODE) + stream = py3compat.StringIO() + pytree_visitor.DumpPyTree(tree, target_stream=stream) + + dump_output = stream.getvalue() + self.assertIn('file_input [3 children]', dump_output) + self.assertIn("NAME(Leaf(NAME, 'foo'))", dump_output) + self.assertIn("EQUAL(Leaf(EQUAL, '='))", dump_output) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/reformatter_basic_test.py b/.venv/lib/python3.9/site-packages/yapftests/reformatter_basic_test.py new file mode 100644 index 00000000..a67e4c47 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/reformatter_basic_test.py @@ -0,0 +1,3140 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Basic tests for yapf.reformatter.""" + +import textwrap +import unittest + +from yapf.yapflib import py3compat +from yapf.yapflib import reformatter +from yapf.yapflib import style + +from yapftests import yapf_test_helper + + +class BasicReformatterTest(yapf_test_helper.YAPFTest): + + @classmethod + def setUpClass(cls): + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testSplittingAllArgs(self): + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{split_all_comma_separated_values: true, column_limit: 40}')) + unformatted_code = textwrap.dedent("""\ + responseDict = {"timestamp": timestamp, "someValue": value, "whatever": 120} + """) + expected_formatted_code = textwrap.dedent("""\ + responseDict = { + "timestamp": timestamp, + "someValue": value, + "whatever": 120 + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + yes = { 'yes': 'no', 'no': 'yes', } + """) + expected_formatted_code = textwrap.dedent("""\ + yes = { + 'yes': 'no', + 'no': 'yes', + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + unformatted_code = textwrap.dedent("""\ + def foo(long_arg, really_long_arg, really_really_long_arg, cant_keep_all_these_args): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(long_arg, + really_long_arg, + really_really_long_arg, + cant_keep_all_these_args): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + unformatted_code = textwrap.dedent("""\ + foo_tuple = [long_arg, really_long_arg, really_really_long_arg, cant_keep_all_these_args] + """) + expected_formatted_code = textwrap.dedent("""\ + foo_tuple = [ + long_arg, + really_long_arg, + really_really_long_arg, + cant_keep_all_these_args + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + unformatted_code = textwrap.dedent("""\ + foo_tuple = [short, arg] + """) + expected_formatted_code = textwrap.dedent("""\ + foo_tuple = [short, arg] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + # There is a test for split_all_top_level_comma_separated_values, with + # different expected value + unformatted_code = textwrap.dedent("""\ + someLongFunction(this_is_a_very_long_parameter, + abc=(a, this_will_just_fit_xxxxxxx)) + """) + expected_formatted_code = textwrap.dedent("""\ + someLongFunction( + this_is_a_very_long_parameter, + abc=(a, + this_will_just_fit_xxxxxxx)) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSplittingTopLevelAllArgs(self): + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{split_all_top_level_comma_separated_values: true, column_limit: 40}' + )) + # Works the same way as split_all_comma_separated_values + unformatted_code = textwrap.dedent("""\ + responseDict = {"timestamp": timestamp, "someValue": value, "whatever": 120} + """) + expected_formatted_code = textwrap.dedent("""\ + responseDict = { + "timestamp": timestamp, + "someValue": value, + "whatever": 120 + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + # Works the same way as split_all_comma_separated_values + unformatted_code = textwrap.dedent("""\ + def foo(long_arg, really_long_arg, really_really_long_arg, cant_keep_all_these_args): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(long_arg, + really_long_arg, + really_really_long_arg, + cant_keep_all_these_args): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + # Works the same way as split_all_comma_separated_values + unformatted_code = textwrap.dedent("""\ + foo_tuple = [long_arg, really_long_arg, really_really_long_arg, cant_keep_all_these_args] + """) + expected_formatted_code = textwrap.dedent("""\ + foo_tuple = [ + long_arg, + really_long_arg, + really_really_long_arg, + cant_keep_all_these_args + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + # Works the same way as split_all_comma_separated_values + unformatted_code = textwrap.dedent("""\ + foo_tuple = [short, arg] + """) + expected_formatted_code = textwrap.dedent("""\ + foo_tuple = [short, arg] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + # There is a test for split_all_comma_separated_values, with different + # expected value + unformatted_code = textwrap.dedent("""\ + someLongFunction(this_is_a_very_long_parameter, + abc=(a, this_will_just_fit_xxxxxxx)) + """) + expected_formatted_code = textwrap.dedent("""\ + someLongFunction( + this_is_a_very_long_parameter, + abc=(a, this_will_just_fit_xxxxxxx)) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + actual_formatted_code = reformatter.Reformat(uwlines) + self.assertEqual(40, len(actual_formatted_code.splitlines()[-1])) + self.assertCodeEqual(expected_formatted_code, actual_formatted_code) + + unformatted_code = textwrap.dedent("""\ + someLongFunction(this_is_a_very_long_parameter, + abc=(a, this_will_not_fit_xxxxxxxxx)) + """) + expected_formatted_code = textwrap.dedent("""\ + someLongFunction( + this_is_a_very_long_parameter, + abc=(a, + this_will_not_fit_xxxxxxxxx)) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + # Exercise the case where there's no opening bracket (for a, b) + unformatted_code = textwrap.dedent("""\ + a, b = f( + a_very_long_parameter, yet_another_one, and_another) + """) + expected_formatted_code = textwrap.dedent("""\ + a, b = f( + a_very_long_parameter, yet_another_one, and_another) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + # Don't require splitting before comments. + unformatted_code = textwrap.dedent("""\ + KO = { + 'ABC': Abc, # abc + 'DEF': Def, # def + 'LOL': Lol, # wtf + 'GHI': Ghi, + 'JKL': Jkl, + } + """) + expected_formatted_code = textwrap.dedent("""\ + KO = { + 'ABC': Abc, # abc + 'DEF': Def, # def + 'LOL': Lol, # wtf + 'GHI': Ghi, + 'JKL': Jkl, + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSimpleFunctionsWithTrailingComments(self): + unformatted_code = textwrap.dedent("""\ + def g(): # Trailing comment + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + def f( # Intermediate comment + ): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def g(): # Trailing comment + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + + def f( # Intermediate comment + ): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testBlankLinesBetweenTopLevelImportsAndVariables(self): + unformatted_code = textwrap.dedent("""\ + import foo as bar + VAR = 'baz' + """) + expected_formatted_code = textwrap.dedent("""\ + import foo as bar + + VAR = 'baz' + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + import foo as bar + + VAR = 'baz' + """) + expected_formatted_code = textwrap.dedent("""\ + import foo as bar + + + VAR = 'baz' + """) + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: yapf, blank_lines_between_top_level_imports_and_variables: 2}' + )) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + unformatted_code = textwrap.dedent("""\ + import foo as bar + # Some comment + """) + expected_formatted_code = textwrap.dedent("""\ + import foo as bar + # Some comment + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + import foo as bar + class Baz(): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + import foo as bar + + + class Baz(): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + import foo as bar + def foobar(): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + import foo as bar + + + def foobar(): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + def foobar(): + from foo import Bar + Bar.baz() + """) + expected_formatted_code = textwrap.dedent("""\ + def foobar(): + from foo import Bar + Bar.baz() + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testBlankLinesAtEndOfFile(self): + unformatted_code = textwrap.dedent("""\ + def foobar(): # foo + pass + + + + """) + expected_formatted_code = textwrap.dedent("""\ + def foobar(): # foo + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + x = { 'a':37,'b':42, + + 'c':927} + + """) + expected_formatted_code = textwrap.dedent("""\ + x = {'a': 37, 'b': 42, 'c': 927} + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testIndentBlankLines(self): + unformatted_code = textwrap.dedent("""\ + class foo(object): + + def foobar(self): + + pass + + def barfoo(self, x, y): # bar + + if x: + + return y + + + def bar(): + + return 0 + """) + expected_formatted_code = """\ +class foo(object):\n \n def foobar(self):\n \n pass\n \n def barfoo(self, x, y): # bar\n \n if x:\n \n return y\n\n\ndef bar():\n \n return 0 +""" + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: yapf, indent_blank_lines: true}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + unformatted_code, expected_formatted_code = (expected_formatted_code, + unformatted_code) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testMultipleUgliness(self): + unformatted_code = textwrap.dedent("""\ + x = { 'a':37,'b':42, + + 'c':927} + + y = 'hello ''world' + z = 'hello '+'world' + a = 'hello {}'.format('world') + class foo ( object ): + def f (self ): + return 37*-+2 + def g(self, x,y=42): + return y + def f ( a ) : + return 37+-+a[42-x : y**3] + """) + expected_formatted_code = textwrap.dedent("""\ + x = {'a': 37, 'b': 42, 'c': 927} + + y = 'hello ' 'world' + z = 'hello ' + 'world' + a = 'hello {}'.format('world') + + + class foo(object): + + def f(self): + return 37 * -+2 + + def g(self, x, y=42): + return y + + + def f(a): + return 37 + -+a[42 - x:y**3] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testComments(self): + unformatted_code = textwrap.dedent("""\ + class Foo(object): + pass + + # Attached comment + class Bar(object): + pass + + global_assignment = 42 + + # Comment attached to class with decorator. + # Comment attached to class with decorator. + @noop + @noop + class Baz(object): + pass + + # Intermediate comment + + class Qux(object): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + class Foo(object): + pass + + + # Attached comment + class Bar(object): + pass + + + global_assignment = 42 + + + # Comment attached to class with decorator. + # Comment attached to class with decorator. + @noop + @noop + class Baz(object): + pass + + + # Intermediate comment + + + class Qux(object): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSingleComment(self): + code = textwrap.dedent("""\ + # Thing 1 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testCommentsWithTrailingSpaces(self): + unformatted_code = textwrap.dedent("""\ + # Thing 1 + # Thing 2 + """) + expected_formatted_code = textwrap.dedent("""\ + # Thing 1 + # Thing 2 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testCommentsInDataLiteral(self): + code = textwrap.dedent("""\ + def f(): + return collections.OrderedDict({ + # First comment. + 'fnord': 37, + + # Second comment. + # Continuation of second comment. + 'bork': 42, + + # Ending comment. + }) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testEndingWhitespaceAfterSimpleStatement(self): + code = textwrap.dedent("""\ + import foo as bar + # Thing 1 + # Thing 2 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testDocstrings(self): + unformatted_code = textwrap.dedent('''\ + u"""Module-level docstring.""" + import os + class Foo(object): + + """Class-level docstring.""" + # A comment for qux. + def qux(self): + + + """Function-level docstring. + + A multiline function docstring. + """ + print('hello {}'.format('world')) + return 42 + ''') + expected_formatted_code = textwrap.dedent('''\ + u"""Module-level docstring.""" + import os + + + class Foo(object): + """Class-level docstring.""" + + # A comment for qux. + def qux(self): + """Function-level docstring. + + A multiline function docstring. + """ + print('hello {}'.format('world')) + return 42 + ''') + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testDocstringAndMultilineComment(self): + unformatted_code = textwrap.dedent('''\ + """Hello world""" + # A multiline + # comment + class bar(object): + """class docstring""" + # class multiline + # comment + def foo(self): + """Another docstring.""" + # Another multiline + # comment + pass + ''') + expected_formatted_code = textwrap.dedent('''\ + """Hello world""" + + + # A multiline + # comment + class bar(object): + """class docstring""" + + # class multiline + # comment + def foo(self): + """Another docstring.""" + # Another multiline + # comment + pass + ''') + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testMultilineDocstringAndMultilineComment(self): + unformatted_code = textwrap.dedent('''\ + """Hello world + + RIP Dennis Richie. + """ + # A multiline + # comment + class bar(object): + """class docstring + + A classy class. + """ + # class multiline + # comment + def foo(self): + """Another docstring. + + A functional function. + """ + # Another multiline + # comment + pass + ''') + expected_formatted_code = textwrap.dedent('''\ + """Hello world + + RIP Dennis Richie. + """ + + + # A multiline + # comment + class bar(object): + """class docstring + + A classy class. + """ + + # class multiline + # comment + def foo(self): + """Another docstring. + + A functional function. + """ + # Another multiline + # comment + pass + ''') + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testTupleCommaBeforeLastParen(self): + unformatted_code = textwrap.dedent("""\ + a = ( 1, ) + """) + expected_formatted_code = textwrap.dedent("""\ + a = (1,) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testNoBreakOutsideOfBracket(self): + # FIXME(morbo): How this is formatted is not correct. But it's syntactically + # correct. + unformatted_code = textwrap.dedent("""\ + def f(): + assert port >= minimum, \ +'Unexpected port %d when minimum was %d.' % (port, minimum) + """) + expected_formatted_code = textwrap.dedent("""\ + def f(): + assert port >= minimum, 'Unexpected port %d when minimum was %d.' % (port, + minimum) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testBlankLinesBeforeDecorators(self): + unformatted_code = textwrap.dedent("""\ + @foo() + class A(object): + @bar() + @baz() + def x(self): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + @foo() + class A(object): + + @bar() + @baz() + def x(self): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testCommentBetweenDecorators(self): + unformatted_code = textwrap.dedent("""\ + @foo() + # frob + @bar + def x (self): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + @foo() + # frob + @bar + def x(self): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testListComprehension(self): + unformatted_code = textwrap.dedent("""\ + def given(y): + [k for k in () + if k in y] + """) + expected_formatted_code = textwrap.dedent("""\ + def given(y): + [k for k in () if k in y] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testListComprehensionPreferOneLine(self): + unformatted_code = textwrap.dedent("""\ + def given(y): + long_variable_name = [ + long_var_name + 1 + for long_var_name in () + if long_var_name == 2] + """) + expected_formatted_code = textwrap.dedent("""\ + def given(y): + long_variable_name = [ + long_var_name + 1 for long_var_name in () if long_var_name == 2 + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testListComprehensionPreferOneLineOverArithmeticSplit(self): + unformatted_code = textwrap.dedent("""\ + def given(used_identifiers): + return (sum(len(identifier) + for identifier in used_identifiers) / len(used_identifiers)) + """) + expected_formatted_code = textwrap.dedent("""\ + def given(used_identifiers): + return (sum(len(identifier) for identifier in used_identifiers) / + len(used_identifiers)) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testListComprehensionPreferThreeLinesForLineWrap(self): + unformatted_code = textwrap.dedent("""\ + def given(y): + long_variable_name = [ + long_var_name + 1 + for long_var_name, number_two in () + if long_var_name == 2 and number_two == 3] + """) + expected_formatted_code = textwrap.dedent("""\ + def given(y): + long_variable_name = [ + long_var_name + 1 + for long_var_name, number_two in () + if long_var_name == 2 and number_two == 3 + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testListComprehensionPreferNoBreakForTrivialExpression(self): + unformatted_code = textwrap.dedent("""\ + def given(y): + long_variable_name = [ + long_var_name + for long_var_name, number_two in () + if long_var_name == 2 and number_two == 3] + """) + expected_formatted_code = textwrap.dedent("""\ + def given(y): + long_variable_name = [ + long_var_name for long_var_name, number_two in () + if long_var_name == 2 and number_two == 3 + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testOpeningAndClosingBrackets(self): + unformatted_code = """\ +foo( (1, ) ) +foo( ( 1, 2, 3 ) ) +foo( ( 1, 2, 3, ) ) +""" + expected_formatted_code = """\ +foo((1,)) +foo((1, 2, 3)) +foo(( + 1, + 2, + 3, +)) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSingleLineFunctions(self): + unformatted_code = textwrap.dedent("""\ + def foo(): return 42 + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): + return 42 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testNoQueueSeletionInMiddleOfLine(self): + # If the queue isn't properly constructed, then a token in the middle of the + # line may be selected as the one with least penalty. The tokens after that + # one are then splatted at the end of the line with no formatting. + unformatted_code = """\ +find_symbol(node.type) + "< " + " ".join(find_pattern(n) for n in node.child) + " >" +""" + expected_formatted_code = """\ +find_symbol(node.type) + "< " + " ".join( + find_pattern(n) for n in node.child) + " >" +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testNoSpacesBetweenSubscriptsAndCalls(self): + unformatted_code = textwrap.dedent("""\ + aaaaaaaaaa = bbbbbbbb.ccccccccc() [42] (a, 2) + """) + expected_formatted_code = textwrap.dedent("""\ + aaaaaaaaaa = bbbbbbbb.ccccccccc()[42](a, 2) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testNoSpacesBetweenOpeningBracketAndStartingOperator(self): + # Unary operator. + unformatted_code = textwrap.dedent("""\ + aaaaaaaaaa = bbbbbbbb.ccccccccc[ -1 ]( -42 ) + """) + expected_formatted_code = textwrap.dedent("""\ + aaaaaaaaaa = bbbbbbbb.ccccccccc[-1](-42) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + # Varargs and kwargs. + unformatted_code = textwrap.dedent("""\ + aaaaaaaaaa = bbbbbbbb.ccccccccc( *varargs ) + aaaaaaaaaa = bbbbbbbb.ccccccccc( **kwargs ) + """) + expected_formatted_code = textwrap.dedent("""\ + aaaaaaaaaa = bbbbbbbb.ccccccccc(*varargs) + aaaaaaaaaa = bbbbbbbb.ccccccccc(**kwargs) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testMultilineCommentReformatted(self): + unformatted_code = textwrap.dedent("""\ + if True: + # This is a multiline + # comment. + pass + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + # This is a multiline + # comment. + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testDictionaryMakerFormatting(self): + unformatted_code = textwrap.dedent("""\ + _PYTHON_STATEMENTS = frozenset({ + lambda x, y: 'simple_stmt': 'small_stmt', 'expr_stmt': 'print_stmt', 'del_stmt': + 'pass_stmt', lambda: 'break_stmt': 'continue_stmt', 'return_stmt': 'raise_stmt', + 'yield_stmt': 'import_stmt', lambda: 'global_stmt': 'exec_stmt', 'assert_stmt': + 'if_stmt', 'while_stmt': 'for_stmt', + }) + """) + expected_formatted_code = textwrap.dedent("""\ + _PYTHON_STATEMENTS = frozenset({ + lambda x, y: 'simple_stmt': 'small_stmt', + 'expr_stmt': 'print_stmt', + 'del_stmt': 'pass_stmt', + lambda: 'break_stmt': 'continue_stmt', + 'return_stmt': 'raise_stmt', + 'yield_stmt': 'import_stmt', + lambda: 'global_stmt': 'exec_stmt', + 'assert_stmt': 'if_stmt', + 'while_stmt': 'for_stmt', + }) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSimpleMultilineCode(self): + unformatted_code = textwrap.dedent("""\ + if True: + aaaaaaaaaaaaaa.bbbbbbbbbbbbbb.ccccccc(zzzzzzzzzzzz, \ +xxxxxxxxxxx, yyyyyyyyyyyy, vvvvvvvvv) + aaaaaaaaaaaaaa.bbbbbbbbbbbbbb.ccccccc(zzzzzzzzzzzz, \ +xxxxxxxxxxx, yyyyyyyyyyyy, vvvvvvvvv) + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + aaaaaaaaaaaaaa.bbbbbbbbbbbbbb.ccccccc(zzzzzzzzzzzz, xxxxxxxxxxx, yyyyyyyyyyyy, + vvvvvvvvv) + aaaaaaaaaaaaaa.bbbbbbbbbbbbbb.ccccccc(zzzzzzzzzzzz, xxxxxxxxxxx, yyyyyyyyyyyy, + vvvvvvvvv) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testMultilineComment(self): + code = textwrap.dedent("""\ + if Foo: + # Hello world + # Yo man. + # Yo man. + # Yo man. + # Yo man. + a = 42 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testSpaceBetweenStringAndParentheses(self): + code = textwrap.dedent("""\ + b = '0' ('hello') + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testMultilineString(self): + code = textwrap.dedent("""\ + code = textwrap.dedent('''\ + if Foo: + # Hello world + # Yo man. + # Yo man. + # Yo man. + # Yo man. + a = 42 + ''') + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent('''\ + def f(): + email_text += """This is a really long docstring that goes over the column limit and is multi-line.

+ Czar: """+despot["Nicholas"]+"""
+ Minion: """+serf["Dmitri"]+"""
+ Residence: """+palace["Winter"]+"""
+ + """ + ''') + expected_formatted_code = textwrap.dedent('''\ + def f(): + email_text += """This is a really long docstring that goes over the column limit and is multi-line.

+ Czar: """ + despot["Nicholas"] + """
+ Minion: """ + serf["Dmitri"] + """
+ Residence: """ + palace["Winter"] + """
+ + """ + ''') + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSimpleMultilineWithComments(self): + code = textwrap.dedent("""\ + if ( # This is the first comment + a and # This is the second comment + # This is the third comment + b): # A trailing comment + # Whoa! A normal comment!! + pass # Another trailing comment + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testMatchingParenSplittingMatching(self): + unformatted_code = textwrap.dedent("""\ + def f(): + raise RuntimeError('unable to find insertion point for target node', + (target,)) + """) + expected_formatted_code = textwrap.dedent("""\ + def f(): + raise RuntimeError('unable to find insertion point for target node', + (target,)) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testContinuationIndent(self): + unformatted_code = textwrap.dedent('''\ + class F: + def _ProcessArgLists(self, node): + """Common method for processing argument lists.""" + for child in node.children: + if isinstance(child, pytree.Leaf): + self._SetTokenSubtype( + child, subtype=_ARGLIST_TOKEN_TO_SUBTYPE.get( + child.value, format_token.Subtype.NONE)) + ''') + expected_formatted_code = textwrap.dedent('''\ + class F: + + def _ProcessArgLists(self, node): + """Common method for processing argument lists.""" + for child in node.children: + if isinstance(child, pytree.Leaf): + self._SetTokenSubtype( + child, + subtype=_ARGLIST_TOKEN_TO_SUBTYPE.get(child.value, + format_token.Subtype.NONE)) + ''') + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testTrailingCommaAndBracket(self): + unformatted_code = textwrap.dedent('''\ + a = { 42, } + b = ( 42, ) + c = [ 42, ] + ''') + expected_formatted_code = textwrap.dedent('''\ + a = { + 42, + } + b = (42,) + c = [ + 42, + ] + ''') + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testI18n(self): + code = textwrap.dedent("""\ + N_('Some years ago - never mind how long precisely - having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world.') # A comment is here. + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + code = textwrap.dedent("""\ + foo('Fake function call') #. Some years ago - never mind how long precisely - having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world. + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testI18nCommentsInDataLiteral(self): + code = textwrap.dedent("""\ + def f(): + return collections.OrderedDict({ + #. First i18n comment. + 'bork': 'foo', + + #. Second i18n comment. + 'snork': 'bar#.*=\\\\0', + }) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testClosingBracketIndent(self): + code = textwrap.dedent('''\ + def f(): + + def g(): + while (xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxxxxxxxxxxx( + yyyyyyyyyyyyy[zzzzz].aaaaaaaa[0]) == 'bbbbbbb'): + pass + ''') + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testClosingBracketsInlinedInCall(self): + unformatted_code = textwrap.dedent("""\ + class Foo(object): + + def bar(self): + self.aaaaaaaa = xxxxxxxxxxxxxxxxxxx.yyyyyyyyyyyyy( + self.cccccc.ddddddddd.eeeeeeee, + options={ + "forkforkfork": 1, + "borkborkbork": 2, + "corkcorkcork": 3, + "horkhorkhork": 4, + "porkporkpork": 5, + }) + """) + expected_formatted_code = textwrap.dedent("""\ + class Foo(object): + + def bar(self): + self.aaaaaaaa = xxxxxxxxxxxxxxxxxxx.yyyyyyyyyyyyy( + self.cccccc.ddddddddd.eeeeeeee, + options={ + "forkforkfork": 1, + "borkborkbork": 2, + "corkcorkcork": 3, + "horkhorkhork": 4, + "porkporkpork": 5, + }) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testLineWrapInForExpression(self): + code = textwrap.dedent("""\ + class A: + + def x(self, node, name, n=1): + for i, child in enumerate( + itertools.ifilter(lambda c: pytree_utils.NodeName(c) == name, + node.pre_order())): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testFunctionCallContinuationLine(self): + code = """\ +class foo: + + def bar(self, node, name, n=1): + if True: + if True: + return [(aaaaaaaaaa, + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb( + cccc, ddddddddddddddddddddddddddddddddddddd))] +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testI18nNonFormatting(self): + code = textwrap.dedent("""\ + class F(object): + + def __init__(self, fieldname, + #. Error message indicating an invalid e-mail address. + message=N_('Please check your email address.'), **kwargs): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testNoSpaceBetweenUnaryOpAndOpeningParen(self): + code = textwrap.dedent("""\ + if ~(a or b): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testCommentBeforeFuncDef(self): + code = textwrap.dedent("""\ + class Foo(object): + + a = 42 + + # This is a comment. + def __init__(self, + xxxxxxx, + yyyyy=0, + zzzzzzz=None, + aaaaaaaaaaaaaaaaaa=False, + bbbbbbbbbbbbbbb=False): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testExcessLineCountWithDefaultKeywords(self): + unformatted_code = textwrap.dedent("""\ + class Fnord(object): + def Moo(self): + aaaaaaaaaaaaaaaa = self._bbbbbbbbbbbbbbbbbbbbbbb( + ccccccccccccc=ccccccccccccc, ddddddd=ddddddd, eeee=eeee, + fffff=fffff, ggggggg=ggggggg, hhhhhhhhhhhhh=hhhhhhhhhhhhh, + iiiiiii=iiiiiiiiiiiiii) + """) + expected_formatted_code = textwrap.dedent("""\ + class Fnord(object): + + def Moo(self): + aaaaaaaaaaaaaaaa = self._bbbbbbbbbbbbbbbbbbbbbbb( + ccccccccccccc=ccccccccccccc, + ddddddd=ddddddd, + eeee=eeee, + fffff=fffff, + ggggggg=ggggggg, + hhhhhhhhhhhhh=hhhhhhhhhhhhh, + iiiiiii=iiiiiiiiiiiiii) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSpaceAfterNotOperator(self): + code = textwrap.dedent("""\ + if not (this and that): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testNoPenaltySplitting(self): + code = textwrap.dedent("""\ + def f(): + if True: + if True: + python_files.extend( + os.path.join(filename, f) + for f in os.listdir(filename) + if IsPythonFile(os.path.join(filename, f))) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testExpressionPenalties(self): + code = textwrap.dedent("""\ + def f(): + if ((left.value == '(' and right.value == ')') or + (left.value == '[' and right.value == ']') or + (left.value == '{' and right.value == '}')): + return False + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testLineDepthOfSingleLineStatement(self): + unformatted_code = textwrap.dedent("""\ + while True: continue + for x in range(3): continue + try: a = 42 + except: b = 42 + with open(a) as fd: a = fd.read() + """) + expected_formatted_code = textwrap.dedent("""\ + while True: + continue + for x in range(3): + continue + try: + a = 42 + except: + b = 42 + with open(a) as fd: + a = fd.read() + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSplitListWithTerminatingComma(self): + unformatted_code = textwrap.dedent("""\ + FOO = ['bar', 'baz', 'mux', 'qux', 'quux', 'quuux', 'quuuux', + 'quuuuux', 'quuuuuux', 'quuuuuuux', lambda a, b: 37,] + """) + expected_formatted_code = textwrap.dedent("""\ + FOO = [ + 'bar', + 'baz', + 'mux', + 'qux', + 'quux', + 'quuux', + 'quuuux', + 'quuuuux', + 'quuuuuux', + 'quuuuuuux', + lambda a, b: 37, + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSplitListWithInterspersedComments(self): + code = textwrap.dedent("""\ + FOO = [ + 'bar', # bar + 'baz', # baz + 'mux', # mux + 'qux', # qux + 'quux', # quux + 'quuux', # quuux + 'quuuux', # quuuux + 'quuuuux', # quuuuux + 'quuuuuux', # quuuuuux + 'quuuuuuux', # quuuuuuux + lambda a, b: 37 # lambda + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testRelativeImportStatements(self): + code = textwrap.dedent("""\ + from ... import bork + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testSingleLineList(self): + # A list on a single line should prefer to remain contiguous. + unformatted_code = textwrap.dedent("""\ + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = aaaaaaaaaaa( + ("...", "."), "..", + ".............................................." + ) + """) + expected_formatted_code = textwrap.dedent("""\ + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = aaaaaaaaaaa( + ("...", "."), "..", "..............................................") + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testBlankLinesBeforeFunctionsNotInColumnZero(self): + unformatted_code = textwrap.dedent("""\ + import signal + + + try: + signal.SIGALRM + # .................................................................. + # ............................................................... + + + def timeout(seconds=1): + pass + except: + pass + """) + expected_formatted_code = textwrap.dedent("""\ + import signal + + try: + signal.SIGALRM + + # .................................................................. + # ............................................................... + + + def timeout(seconds=1): + pass + except: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testNoKeywordArgumentBreakage(self): + code = textwrap.dedent("""\ + class A(object): + + def b(self): + if self.aaaaaaaaaaaaaaaaaaaa not in self.bbbbbbbbbb( + cccccccccccccccccccc=True): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testTrailerOnSingleLine(self): + code = """\ +urlpatterns = patterns('', url(r'^$', 'homepage_view'), + url(r'^/login/$', 'login_view'), + url(r'^/login/$', 'logout_view'), + url(r'^/user/(?P\\w+)/$', 'profile_view')) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testIfConditionalParens(self): + code = textwrap.dedent("""\ + class Foo: + + def bar(): + if True: + if (child.type == grammar_token.NAME and + child.value in substatement_names): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testContinuationMarkers(self): + code = textwrap.dedent("""\ + text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. "\\ + "Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur "\\ + "ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis "\\ + "sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. "\\ + "Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet" + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + code = textwrap.dedent("""\ + from __future__ import nested_scopes, generators, division, absolute_import, with_statement, \\ + print_function, unicode_literals + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + code = textwrap.dedent("""\ + if aaaaaaaaa == 42 and bbbbbbbbbbbbbb == 42 and \\ + cccccccc == 42: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testCommentsWithContinuationMarkers(self): + code = textwrap.dedent("""\ + def fn(arg): + v = fn2(key1=True, + #c1 + key2=arg)\\ + .fn3() + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testMultipleContinuationMarkers(self): + code = textwrap.dedent("""\ + xyz = \\ + \\ + some_thing() + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testContinuationMarkerAfterStringWithContinuation(self): + code = """\ +s = 'foo \\ + bar' \\ + .format() +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testEmptyContainers(self): + code = textwrap.dedent("""\ + flags.DEFINE_list( + 'output_dirs', [], + 'Lorem ipsum dolor sit amet, consetetur adipiscing elit. Donec a diam lectus. ' + 'Sed sit amet ipsum mauris. Maecenas congue.') + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testSplitStringsIfSurroundedByParens(self): + unformatted_code = textwrap.dedent("""\ + a = foo.bar({'xxxxxxxxxxxxxxxxxxxxxxx' 'yyyyyyyyyyyyyyyyyyyyyyyyyy': baz[42]} + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 'bbbbbbbbbbbbbbbbbbbbbbbbbb' 'cccccccccccccccccccccccccccccccc' 'ddddddddddddddddddddddddddddd') + """) + expected_formatted_code = textwrap.dedent("""\ + a = foo.bar({'xxxxxxxxxxxxxxxxxxxxxxx' + 'yyyyyyyyyyyyyyyyyyyyyyyyyy': baz[42]} + + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'bbbbbbbbbbbbbbbbbbbbbbbbbb' + 'cccccccccccccccccccccccccccccccc' + 'ddddddddddddddddddddddddddddd') + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + code = textwrap.dedent("""\ + a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' \ +'bbbbbbbbbbbbbbbbbbbbbbbbbb' 'cccccccccccccccccccccccccccccccc' \ +'ddddddddddddddddddddddddddddd' + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testMultilineShebang(self): + code = textwrap.dedent("""\ + #!/bin/sh + if "true" : '''\' + then + + export FOO=123 + exec /usr/bin/env python "$0" "$@" + + exit 127 + fi + ''' + + import os + + assert os.environ['FOO'] == '123' + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testNoSplittingAroundTermOperators(self): + code = textwrap.dedent("""\ + a_very_long_function_call_yada_yada_etc_etc_etc(long_arg1, + long_arg2 / long_arg3) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testNoSplittingWithinSubscriptList(self): + code = textwrap.dedent("""\ + somequitelongvariablename.somemember[(a, b)] = { + 'somelongkey': 1, + 'someotherlongkey': 2 + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testExcessCharacters(self): + code = textwrap.dedent("""\ + class foo: + + def bar(self): + self.write(s=[ + '%s%s %s' % ('many of really', 'long strings', '+ just makes up 81') + ]) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + def _(): + if True: + if True: + if contract == allow_contract and attr_dict.get(if_attribute) == has_value: + return True + """) + expected_code = textwrap.dedent("""\ + def _(): + if True: + if True: + if contract == allow_contract and attr_dict.get( + if_attribute) == has_value: + return True + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines)) + + def testDictSetGenerator(self): + code = textwrap.dedent("""\ + foo = { + variable: 'hello world. How are you today?' + for variable in fnord + if variable != 37 + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testUnaryOpInDictionaryValue(self): + code = textwrap.dedent("""\ + beta = "123" + + test = {'alpha': beta[-1]} + + print(beta[-1]) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testUnaryNotOperator(self): + code = textwrap.dedent("""\ + if True: + if True: + if True: + if True: + remote_checksum = self.get_checksum(conn, tmp, dest, inject, + not directory_prepended, source) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testRelaxArraySubscriptAffinity(self): + code = """\ +class A(object): + + def f(self, aaaaaaaaa, bbbbbbbbbbbbb, row): + if True: + if True: + if True: + if True: + if row[4] is None or row[5] is None: + bbbbbbbbbbbbb[ + '..............'] = row[5] if row[5] is not None else 5 +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testFunctionCallInDict(self): + code = "a = {'a': b(c=d, **e)}\n" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testFunctionCallInNestedDict(self): + code = "a = {'a': {'a': {'a': b(c=d, **e)}}}\n" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testUnbreakableNot(self): + code = textwrap.dedent("""\ + def test(): + if not "Foooooooooooooooooooooooooooooo" or "Foooooooooooooooooooooooooooooo" == "Foooooooooooooooooooooooooooooo": + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testSplitListWithComment(self): + code = textwrap.dedent("""\ + a = [ + 'a', + 'b', + 'c' # hello world + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testOverColumnLimit(self): + unformatted_code = textwrap.dedent("""\ + class Test: + + def testSomething(self): + expected = { + ('aaaaaaaaaaaaa', 'bbbb'): 'ccccccccccccccccccccccccccccccccccccccccccc', + ('aaaaaaaaaaaaa', 'bbbb'): 'ccccccccccccccccccccccccccccccccccccccccccc', + ('aaaaaaaaaaaaa', 'bbbb'): 'ccccccccccccccccccccccccccccccccccccccccccc', + } + """) + expected_formatted_code = textwrap.dedent("""\ + class Test: + + def testSomething(self): + expected = { + ('aaaaaaaaaaaaa', 'bbbb'): + 'ccccccccccccccccccccccccccccccccccccccccccc', + ('aaaaaaaaaaaaa', 'bbbb'): + 'ccccccccccccccccccccccccccccccccccccccccccc', + ('aaaaaaaaaaaaa', 'bbbb'): + 'ccccccccccccccccccccccccccccccccccccccccccc', + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testEndingComment(self): + code = textwrap.dedent("""\ + a = f( + a="something", + b="something requiring comment which is quite long", # comment about b (pushes line over 79) + c="something else, about which comment doesn't make sense") + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testContinuationSpaceRetention(self): + code = textwrap.dedent("""\ + def fn(): + return module \\ + .method(Object(data, + fn2(arg) + )) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testIfExpressionWithFunctionCall(self): + code = textwrap.dedent("""\ + if x or z.y( + a, + c, + aaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaaaaaaa, + bbbbbbbbbbbbbbbbbbbbb=bbbbbbbbbbbbbbbbbb): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testUnformattedAfterMultilineString(self): + code = textwrap.dedent("""\ + def foo(): + com_text = \\ + ''' + TEST + ''' % (input_fname, output_fname) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testNoSpacesAroundKeywordDefaultValues(self): + code = textwrap.dedent("""\ + sources = { + 'json': request.get_json(silent=True) or {}, + 'json2': request.get_json(silent=True), + } + json = request.get_json(silent=True) or {} + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testNoSplittingBeforeEndingSubscriptBracket(self): + unformatted_code = textwrap.dedent("""\ + if True: + if True: + status = cf.describe_stacks(StackName=stackname)[u'Stacks'][0][u'StackStatus'] + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + if True: + status = cf.describe_stacks( + StackName=stackname)[u'Stacks'][0][u'StackStatus'] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testNoSplittingOnSingleArgument(self): + unformatted_code = textwrap.dedent("""\ + xxxxxxxxxxxxxx = (re.search(r'(\\d+\\.\\d+\\.\\d+\\.)\\d+', + aaaaaaa.bbbbbbbbbbbb).group(1) + + re.search(r'\\d+\\.\\d+\\.\\d+\\.(\\d+)', + ccccccc).group(1)) + xxxxxxxxxxxxxx = (re.search(r'(\\d+\\.\\d+\\.\\d+\\.)\\d+', + aaaaaaa.bbbbbbbbbbbb).group(a.b) + + re.search(r'\\d+\\.\\d+\\.\\d+\\.(\\d+)', + ccccccc).group(c.d)) + """) + expected_formatted_code = textwrap.dedent("""\ + xxxxxxxxxxxxxx = ( + re.search(r'(\\d+\\.\\d+\\.\\d+\\.)\\d+', aaaaaaa.bbbbbbbbbbbb).group(1) + + re.search(r'\\d+\\.\\d+\\.\\d+\\.(\\d+)', ccccccc).group(1)) + xxxxxxxxxxxxxx = ( + re.search(r'(\\d+\\.\\d+\\.\\d+\\.)\\d+', aaaaaaa.bbbbbbbbbbbb).group(a.b) + + re.search(r'\\d+\\.\\d+\\.\\d+\\.(\\d+)', ccccccc).group(c.d)) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSplittingArraysSensibly(self): + unformatted_code = textwrap.dedent("""\ + while True: + while True: + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = list['bbbbbbbbbbbbbbbbbbbbbbbbb'].split(',') + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = list('bbbbbbbbbbbbbbbbbbbbbbbbb').split(',') + """) + expected_formatted_code = textwrap.dedent("""\ + while True: + while True: + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = list[ + 'bbbbbbbbbbbbbbbbbbbbbbbbb'].split(',') + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = list( + 'bbbbbbbbbbbbbbbbbbbbbbbbb').split(',') + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testComprehensionForAndIf(self): + unformatted_code = textwrap.dedent("""\ + class f: + + def __repr__(self): + tokens_repr = ','.join(['{0}({1!r})'.format(tok.name, tok.value) for tok in self._tokens]) + """) + expected_formatted_code = textwrap.dedent("""\ + class f: + + def __repr__(self): + tokens_repr = ','.join( + ['{0}({1!r})'.format(tok.name, tok.value) for tok in self._tokens]) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testFunctionCallArguments(self): + unformatted_code = textwrap.dedent("""\ + def f(): + if True: + pytree_utils.InsertNodesBefore(_CreateCommentsFromPrefix( + comment_prefix, comment_lineno, comment_column, + standalone=True), ancestor_at_indent) + pytree_utils.InsertNodesBefore(_CreateCommentsFromPrefix( + comment_prefix, comment_lineno, comment_column, + standalone=True)) + """) + expected_formatted_code = textwrap.dedent("""\ + def f(): + if True: + pytree_utils.InsertNodesBefore( + _CreateCommentsFromPrefix( + comment_prefix, comment_lineno, comment_column, standalone=True), + ancestor_at_indent) + pytree_utils.InsertNodesBefore( + _CreateCommentsFromPrefix( + comment_prefix, comment_lineno, comment_column, standalone=True)) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testBinaryOperators(self): + unformatted_code = textwrap.dedent("""\ + a = b ** 37 + c = (20 ** -3) / (_GRID_ROWS ** (code_length - 10)) + """) + expected_formatted_code = textwrap.dedent("""\ + a = b**37 + c = (20**-3) / (_GRID_ROWS**(code_length - 10)) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + code = textwrap.dedent("""\ + def f(): + if True: + if (self.stack[-1].split_before_closing_bracket and + # FIXME(morbo): Use the 'matching_bracket' instead of this. + # FIXME(morbo): Don't forget about tuples! + current.value in ']}'): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testContiguousList(self): + code = textwrap.dedent("""\ + [retval1, retval2] = a_very_long_function(argument_1, argument2, argument_3, + argument_4) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testArgsAndKwargsFormatting(self): + code = textwrap.dedent("""\ + a(a=aaaaaaaaaaaaaaaaaaaaa, + b=aaaaaaaaaaaaaaaaaaaaaaaa, + c=aaaaaaaaaaaaaaaaaa, + *d, + **e) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + code = textwrap.dedent("""\ + def foo(): + return [ + Bar(xxx='some string', + yyy='another long string', + zzz='a third long string') + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testCommentColumnLimitOverflow(self): + code = textwrap.dedent("""\ + def f(): + if True: + TaskManager.get_tags = MagicMock( + name='get_tags_mock', + return_value=[157031694470475], + # side_effect=[(157031694470475), (157031694470475),], + ) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testMultilineLambdas(self): + unformatted_code = textwrap.dedent("""\ + class SomeClass(object): + do_something = True + + def succeeded(self, dddddddddddddd): + d = defer.succeed(None) + + if self.do_something: + d.addCallback(lambda _: self.aaaaaa.bbbbbbbbbbbbbbbb.cccccccccccccccccccccccccccccccc(dddddddddddddd)) + return d + """) + expected_formatted_code = textwrap.dedent("""\ + class SomeClass(object): + do_something = True + + def succeeded(self, dddddddddddddd): + d = defer.succeed(None) + + if self.do_something: + d.addCallback(lambda _: self.aaaaaa.bbbbbbbbbbbbbbbb. + cccccccccccccccccccccccccccccccc(dddddddddddddd)) + return d + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: yapf, allow_multiline_lambdas: true}')) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testMultilineDictionaryKeys(self): + unformatted_code = textwrap.dedent("""\ + MAP_WITH_LONG_KEYS = { + ('lorem ipsum', 'dolor sit amet'): + 1, + ('consectetur adipiscing elit.', 'Vestibulum mauris justo, ornare eget dolor eget'): + 2, + ('vehicula convallis nulla. Vestibulum dictum nisl in malesuada finibus.',): + 3 + } + """) + expected_formatted_code = textwrap.dedent("""\ + MAP_WITH_LONG_KEYS = { + ('lorem ipsum', 'dolor sit amet'): + 1, + ('consectetur adipiscing elit.', + 'Vestibulum mauris justo, ornare eget dolor eget'): + 2, + ('vehicula convallis nulla. Vestibulum dictum nisl in malesuada finibus.',): + 3 + } + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig('{based_on_style: yapf, ' + 'allow_multiline_dictionary_keys: true}')) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testStableDictionaryFormatting(self): + code = textwrap.dedent("""\ + class A(object): + def method(self): + filters = { + 'expressions': [{ + 'field': { + 'search_field': { + 'user_field': 'latest_party__number_of_guests' + }, + } + }] + } + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: pep8, indent_width: 2, ' + 'continuation_indent_width: 4, indent_dictionary_value: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(code) + reformatted_code = reformatter.Reformat(uwlines) + self.assertCodeEqual(code, reformatted_code) + + uwlines = yapf_test_helper.ParseAndUnwrap(reformatted_code) + reformatted_code = reformatter.Reformat(uwlines) + self.assertCodeEqual(code, reformatted_code) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testStableInlinedDictionaryFormatting(self): + try: + style.SetGlobalStyle(style.CreatePEP8Style()) + unformatted_code = textwrap.dedent("""\ + def _(): + url = "http://{0}/axis-cgi/admin/param.cgi?{1}".format( + value, urllib.urlencode({'action': 'update', 'parameter': value})) + """) + expected_formatted_code = textwrap.dedent("""\ + def _(): + url = "http://{0}/axis-cgi/admin/param.cgi?{1}".format( + value, urllib.urlencode({ + 'action': 'update', + 'parameter': value + })) + """) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + reformatted_code = reformatter.Reformat(uwlines) + self.assertCodeEqual(expected_formatted_code, reformatted_code) + + uwlines = yapf_test_helper.ParseAndUnwrap(reformatted_code) + reformatted_code = reformatter.Reformat(uwlines) + self.assertCodeEqual(expected_formatted_code, reformatted_code) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testDontSplitKeywordValueArguments(self): + unformatted_code = textwrap.dedent("""\ + def mark_game_scored(gid): + _connect.execute(_games.update().where(_games.c.gid == gid).values( + scored=True)) + """) + expected_formatted_code = textwrap.dedent("""\ + def mark_game_scored(gid): + _connect.execute( + _games.update().where(_games.c.gid == gid).values(scored=True)) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testDontAddBlankLineAfterMultilineString(self): + code = textwrap.dedent("""\ + query = '''SELECT id + FROM table + WHERE day in {}''' + days = ",".join(days) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testFormattingListComprehensions(self): + code = textwrap.dedent("""\ + def a(): + if True: + if True: + if True: + columns = [ + x for x, y in self._heap_this_is_very_long if x.route[0] == choice + ] + self._heap = [x for x in self._heap if x.route and x.route[0] == choice] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testNoSplittingWhenBinPacking(self): + code = textwrap.dedent("""\ + a_very_long_function_name( + long_argument_name_1=1, + long_argument_name_2=2, + long_argument_name_3=3, + long_argument_name_4=4, + ) + + a_very_long_function_name( + long_argument_name_1=1, long_argument_name_2=2, long_argument_name_3=3, + long_argument_name_4=4 + ) + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: pep8, indent_width: 2, ' + 'continuation_indent_width: 4, indent_dictionary_value: True, ' + 'dedent_closing_brackets: True, ' + 'split_before_named_assigns: False}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(code) + reformatted_code = reformatter.Reformat(uwlines) + self.assertCodeEqual(code, reformatted_code) + + uwlines = yapf_test_helper.ParseAndUnwrap(reformatted_code) + reformatted_code = reformatter.Reformat(uwlines) + self.assertCodeEqual(code, reformatted_code) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testNotSplittingAfterSubscript(self): + unformatted_code = textwrap.dedent("""\ + if not aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b(c == d[ + 'eeeeee']).ffffff(): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + if not aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b( + c == d['eeeeee']).ffffff(): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSplittingOneArgumentList(self): + unformatted_code = textwrap.dedent("""\ + def _(): + if True: + if True: + if True: + if True: + if True: + boxes[id_] = np.concatenate((points.min(axis=0), qoints.max(axis=0))) + """) + expected_formatted_code = textwrap.dedent("""\ + def _(): + if True: + if True: + if True: + if True: + if True: + boxes[id_] = np.concatenate( + (points.min(axis=0), qoints.max(axis=0))) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSplittingBeforeFirstElementListArgument(self): + unformatted_code = textwrap.dedent("""\ + class _(): + @classmethod + def _pack_results_for_constraint_or(cls, combination, constraints): + if True: + if True: + if True: + return cls._create_investigation_result( + ( + clue for clue in combination if not clue == Verifier.UNMATCHED + ), constraints, InvestigationResult.OR + ) + """) + expected_formatted_code = textwrap.dedent("""\ + class _(): + + @classmethod + def _pack_results_for_constraint_or(cls, combination, constraints): + if True: + if True: + if True: + return cls._create_investigation_result( + (clue for clue in combination if not clue == Verifier.UNMATCHED), + constraints, InvestigationResult.OR) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSplittingArgumentsTerminatedByComma(self): + unformatted_code = textwrap.dedent("""\ + function_name(argument_name_1=1, argument_name_2=2, argument_name_3=3) + + function_name(argument_name_1=1, argument_name_2=2, argument_name_3=3,) + + a_very_long_function_name(long_argument_name_1=1, long_argument_name_2=2, long_argument_name_3=3, long_argument_name_4=4) + + a_very_long_function_name(long_argument_name_1, long_argument_name_2, long_argument_name_3, long_argument_name_4,) + + r =f0 (1, 2,3,) + """) + expected_formatted_code = textwrap.dedent("""\ + function_name(argument_name_1=1, argument_name_2=2, argument_name_3=3) + + function_name( + argument_name_1=1, + argument_name_2=2, + argument_name_3=3, + ) + + a_very_long_function_name( + long_argument_name_1=1, + long_argument_name_2=2, + long_argument_name_3=3, + long_argument_name_4=4) + + a_very_long_function_name( + long_argument_name_1, + long_argument_name_2, + long_argument_name_3, + long_argument_name_4, + ) + + r = f0( + 1, + 2, + 3, + ) + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: yapf, ' + 'split_arguments_when_comma_terminated: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + reformatted_code = reformatter.Reformat(uwlines) + self.assertCodeEqual(expected_formatted_code, reformatted_code) + + uwlines = yapf_test_helper.ParseAndUnwrap(reformatted_code) + reformatted_code = reformatter.Reformat(uwlines) + self.assertCodeEqual(expected_formatted_code, reformatted_code) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testImportAsList(self): + code = textwrap.dedent("""\ + from toto import titi, tata, tutu # noqa + from toto import titi, tata, tutu + from toto import (titi, tata, tutu) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testDictionaryValuesOnOwnLines(self): + unformatted_code = textwrap.dedent("""\ + a = { + 'aaaaaaaaaaaaaaaaaaaaaaaa': + Check('ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ', '=', True), + 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb': + Check('YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY', '=', True), + 'ccccccccccccccc': + Check('XXXXXXXXXXXXXXXXXXX', '!=', 'SUSPENDED'), + 'dddddddddddddddddddddddddddddd': + Check('WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW', '=', False), + 'eeeeeeeeeeeeeeeeeeeeeeeeeeeee': + Check('VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV', '=', False), + 'ffffffffffffffffffffffffff': + Check('UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU', '=', True), + 'ggggggggggggggggg': + Check('TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT', '=', True), + 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh': + Check('SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS', '=', True), + 'iiiiiiiiiiiiiiiiiiiiiiii': + Check('RRRRRRRRRRRRRRRRRRRRRRRRRRR', '=', True), + 'jjjjjjjjjjjjjjjjjjjjjjjjjj': + Check('QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ', '=', False), + } + """) + expected_formatted_code = textwrap.dedent("""\ + a = { + 'aaaaaaaaaaaaaaaaaaaaaaaa': + Check('ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ', '=', True), + 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb': + Check('YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY', '=', True), + 'ccccccccccccccc': + Check('XXXXXXXXXXXXXXXXXXX', '!=', 'SUSPENDED'), + 'dddddddddddddddddddddddddddddd': + Check('WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW', '=', False), + 'eeeeeeeeeeeeeeeeeeeeeeeeeeeee': + Check('VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV', '=', False), + 'ffffffffffffffffffffffffff': + Check('UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU', '=', True), + 'ggggggggggggggggg': + Check('TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT', '=', True), + 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh': + Check('SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS', '=', True), + 'iiiiiiiiiiiiiiiiiiiiiiii': + Check('RRRRRRRRRRRRRRRRRRRRRRRRRRR', '=', True), + 'jjjjjjjjjjjjjjjjjjjjjjjjjj': + Check('QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ', '=', False), + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testDictionaryOnOwnLine(self): + unformatted_code = textwrap.dedent("""\ + doc = test_utils.CreateTestDocumentViaController( + content={ 'a': 'b' }, + branch_key=branch.key, + collection_key=collection.key) + """) + expected_formatted_code = textwrap.dedent("""\ + doc = test_utils.CreateTestDocumentViaController( + content={'a': 'b'}, branch_key=branch.key, collection_key=collection.key) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + doc = test_utils.CreateTestDocumentViaController( + content={ 'a': 'b' }, + branch_key=branch.key, + collection_key=collection.key, + collection_key2=collection.key2) + """) + expected_formatted_code = textwrap.dedent("""\ + doc = test_utils.CreateTestDocumentViaController( + content={'a': 'b'}, + branch_key=branch.key, + collection_key=collection.key, + collection_key2=collection.key2) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testNestedListsInDictionary(self): + unformatted_code = textwrap.dedent("""\ + _A = { + 'cccccccccc': ('^^1',), + 'rrrrrrrrrrrrrrrrrrrrrrrrr': ('^7913', # AAAAAAAAAAAAAA. + ), + 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee': ('^6242', # BBBBBBBBBBBBBBB. + ), + 'vvvvvvvvvvvvvvvvvvv': ('^27959', # CCCCCCCCCCCCCCCCCC. + '^19746', # DDDDDDDDDDDDDDDDDDDDDDD. + '^22907', # EEEEEEEEEEEEEEEEEEEEEEEE. + '^21098', # FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF. + '^22826', # GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG. + '^22769', # HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH. + '^22935', # IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII. + '^3982', # JJJJJJJJJJJJJ. + ), + 'uuuuuuuuuuuu': ('^19745', # LLLLLLLLLLLLLLLLLLLLLLLLLL. + '^21324', # MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM. + '^22831', # NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN. + '^17081', # OOOOOOOOOOOOOOOOOOOOO. + ), + 'eeeeeeeeeeeeee': ( + '^9416', # Reporter email. Not necessarily the reporter. + '^^3', # This appears to be the raw email field. + ), + 'cccccccccc': ('^21109', # PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP. + ), + } + """) + expected_formatted_code = textwrap.dedent("""\ + _A = { + 'cccccccccc': ('^^1',), + 'rrrrrrrrrrrrrrrrrrrrrrrrr': ( + '^7913', # AAAAAAAAAAAAAA. + ), + 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee': ( + '^6242', # BBBBBBBBBBBBBBB. + ), + 'vvvvvvvvvvvvvvvvvvv': ( + '^27959', # CCCCCCCCCCCCCCCCCC. + '^19746', # DDDDDDDDDDDDDDDDDDDDDDD. + '^22907', # EEEEEEEEEEEEEEEEEEEEEEEE. + '^21098', # FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF. + '^22826', # GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG. + '^22769', # HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH. + '^22935', # IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII. + '^3982', # JJJJJJJJJJJJJ. + ), + 'uuuuuuuuuuuu': ( + '^19745', # LLLLLLLLLLLLLLLLLLLLLLLLLL. + '^21324', # MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM. + '^22831', # NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN. + '^17081', # OOOOOOOOOOOOOOOOOOOOO. + ), + 'eeeeeeeeeeeeee': ( + '^9416', # Reporter email. Not necessarily the reporter. + '^^3', # This appears to be the raw email field. + ), + 'cccccccccc': ( + '^21109', # PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP. + ), + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testNestedDictionary(self): + unformatted_code = textwrap.dedent("""\ + class _(): + def _(): + breadcrumbs = [{'name': 'Admin', + 'url': url_for(".home")}, + {'title': title},] + breadcrumbs = [{'name': 'Admin', + 'url': url_for(".home")}, + {'title': title}] + """) + expected_formatted_code = textwrap.dedent("""\ + class _(): + def _(): + breadcrumbs = [ + { + 'name': 'Admin', + 'url': url_for(".home") + }, + { + 'title': title + }, + ] + breadcrumbs = [{'name': 'Admin', 'url': url_for(".home")}, {'title': title}] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testDictionaryElementsOnOneLine(self): + code = textwrap.dedent("""\ + class _(): + + @mock.patch.dict( + os.environ, + {'HTTP_' + xsrf._XSRF_TOKEN_HEADER.replace('-', '_'): 'atoken'}) + def _(): + pass + + + AAAAAAAAAAAAAAAAAAAAAAAA = { + Environment.XXXXXXXXXX: 'some text more text even more tex', + Environment.YYYYYYY: 'some text more text even more text yet ag', + Environment.ZZZZZZZZZZZ: 'some text more text even mor etext yet again tex', + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testNotInParams(self): + unformatted_code = textwrap.dedent("""\ + list("a long line to break the line. a long line to break the brk a long lin", not True) + """) + expected_code = textwrap.dedent("""\ + list("a long line to break the line. a long line to break the brk a long lin", + not True) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines)) + + def testNamedAssignNotAtEndOfLine(self): + unformatted_code = textwrap.dedent("""\ + def _(): + if True: + with py3compat.open_with_encoding(filename, mode='w', + encoding=encoding) as fd: + pass + """) + expected_code = textwrap.dedent("""\ + def _(): + if True: + with py3compat.open_with_encoding( + filename, mode='w', encoding=encoding) as fd: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines)) + + def testBlankLineBeforeClassDocstring(self): + unformatted_code = textwrap.dedent('''\ + class A: + + """Does something. + + Also, here are some details. + """ + + def __init__(self): + pass + ''') + expected_code = textwrap.dedent('''\ + class A: + """Does something. + + Also, here are some details. + """ + + def __init__(self): + pass + ''') + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent('''\ + class A: + + """Does something. + + Also, here are some details. + """ + + def __init__(self): + pass + ''') + expected_formatted_code = textwrap.dedent('''\ + class A: + + """Does something. + + Also, here are some details. + """ + + def __init__(self): + pass + ''') + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: yapf, ' + 'blank_line_before_class_docstring: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testBlankLineBeforeModuleDocstring(self): + unformatted_code = textwrap.dedent('''\ + #!/usr/bin/env python + # -*- coding: utf-8 name> -*- + + """Some module docstring.""" + + + def foobar(): + pass + ''') + expected_code = textwrap.dedent('''\ + #!/usr/bin/env python + # -*- coding: utf-8 name> -*- + """Some module docstring.""" + + + def foobar(): + pass + ''') + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent('''\ + #!/usr/bin/env python + # -*- coding: utf-8 name> -*- + """Some module docstring.""" + + + def foobar(): + pass + ''') + expected_formatted_code = textwrap.dedent('''\ + #!/usr/bin/env python + # -*- coding: utf-8 name> -*- + + """Some module docstring.""" + + + def foobar(): + pass + ''') + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: pep8, ' + 'blank_line_before_module_docstring: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testTupleCohesion(self): + unformatted_code = textwrap.dedent("""\ + def f(): + this_is_a_very_long_function_name(an_extremely_long_variable_name, ( + 'a string that may be too long %s' % 'M15')) + """) + expected_code = textwrap.dedent("""\ + def f(): + this_is_a_very_long_function_name( + an_extremely_long_variable_name, + ('a string that may be too long %s' % 'M15')) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines)) + + def testSubscriptExpression(self): + code = textwrap.dedent("""\ + foo = d[not a] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testListWithFunctionCalls(self): + unformatted_code = textwrap.dedent("""\ + def foo(): + return [ + Bar( + xxx='some string', + yyy='another long string', + zzz='a third long string'), Bar( + xxx='some string', + yyy='another long string', + zzz='a third long string') + ] + """) + expected_code = textwrap.dedent("""\ + def foo(): + return [ + Bar(xxx='some string', + yyy='another long string', + zzz='a third long string'), + Bar(xxx='some string', + yyy='another long string', + zzz='a third long string') + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines)) + + def testEllipses(self): + unformatted_code = textwrap.dedent("""\ + X=... + Y = X if ... else X + """) + expected_code = textwrap.dedent("""\ + X = ... + Y = X if ... else X + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines)) + + def testPseudoParens(self): + unformatted_code = """\ +my_dict = { + 'key': # Some comment about the key + {'nested_key': 1, }, +} +""" + expected_code = """\ +my_dict = { + 'key': # Some comment about the key + { + 'nested_key': 1, + }, +} +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines)) + + def testSplittingBeforeFirstArgumentOnFunctionCall(self): + """Tests split_before_first_argument on a function call.""" + unformatted_code = textwrap.dedent("""\ + a_very_long_function_name("long string with formatting {0:s}".format( + "mystring")) + """) + expected_formatted_code = textwrap.dedent("""\ + a_very_long_function_name( + "long string with formatting {0:s}".format("mystring")) + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: yapf, split_before_first_argument: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testSplittingBeforeFirstArgumentOnFunctionDefinition(self): + """Tests split_before_first_argument on a function definition.""" + unformatted_code = textwrap.dedent("""\ + def _GetNumberOfSecondsFromElements(year, month, day, hours, + minutes, seconds, microseconds): + return + """) + expected_formatted_code = textwrap.dedent("""\ + def _GetNumberOfSecondsFromElements( + year, month, day, hours, minutes, seconds, microseconds): + return + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: yapf, split_before_first_argument: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testSplittingBeforeFirstArgumentOnCompoundStatement(self): + """Tests split_before_first_argument on a compound statement.""" + unformatted_code = textwrap.dedent("""\ + if (long_argument_name_1 == 1 or + long_argument_name_2 == 2 or + long_argument_name_3 == 3 or + long_argument_name_4 == 4): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + if (long_argument_name_1 == 1 or long_argument_name_2 == 2 or + long_argument_name_3 == 3 or long_argument_name_4 == 4): + pass + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: yapf, split_before_first_argument: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testCoalesceBracketsOnDict(self): + """Tests coalesce_brackets on a dictionary.""" + unformatted_code = textwrap.dedent("""\ + date_time_values = ( + { + u'year': year, + u'month': month, + u'day_of_month': day_of_month, + u'hours': hours, + u'minutes': minutes, + u'seconds': seconds + } + ) + """) + expected_formatted_code = textwrap.dedent("""\ + date_time_values = ({ + u'year': year, + u'month': month, + u'day_of_month': day_of_month, + u'hours': hours, + u'minutes': minutes, + u'seconds': seconds + }) + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: yapf, coalesce_brackets: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testSplitAfterComment(self): + code = textwrap.dedent("""\ + if __name__ == "__main__": + with another_resource: + account = { + "validUntil": + int(time() + (6 * 7 * 24 * 60 * 60)) # in 6 weeks time + } + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: yapf, coalesce_brackets: True, ' + 'dedent_closing_brackets: true}')) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + @unittest.skipUnless(not py3compat.PY3, 'Requires Python 2.7') + def testAsyncAsNonKeyword(self): + try: + style.SetGlobalStyle(style.CreatePEP8Style()) + + # In Python 2, async may be used as a non-keyword identifier. + code = textwrap.dedent("""\ + from util import async + + + class A(object): + def foo(self): + async.run() + """) + + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testDisableEndingCommaHeuristic(self): + code = textwrap.dedent("""\ + x = [1, 2, 3, 4, 5, 6, 7,] + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig('{based_on_style: yapf,' + ' disable_ending_comma_heuristic: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testDedentClosingBracketsWithTypeAnnotationExceedingLineLength(self): + unformatted_code = textwrap.dedent("""\ + def function(first_argument_xxxxxxxxxxxxxxxx=(0,), second_argument=None) -> None: + pass + + + def function(first_argument_xxxxxxxxxxxxxxxxxxxxxxx=(0,), second_argument=None) -> None: + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def function( + first_argument_xxxxxxxxxxxxxxxx=(0,), second_argument=None + ) -> None: + pass + + + def function( + first_argument_xxxxxxxxxxxxxxxxxxxxxxx=(0,), second_argument=None + ) -> None: + pass + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig('{based_on_style: yapf,' + ' dedent_closing_brackets: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testIndentClosingBracketsWithTypeAnnotationExceedingLineLength(self): + unformatted_code = textwrap.dedent("""\ + def function(first_argument_xxxxxxxxxxxxxxxx=(0,), second_argument=None) -> None: + pass + + + def function(first_argument_xxxxxxxxxxxxxxxxxxxxxxx=(0,), second_argument=None) -> None: + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def function( + first_argument_xxxxxxxxxxxxxxxx=(0,), second_argument=None + ) -> None: + pass + + + def function( + first_argument_xxxxxxxxxxxxxxxxxxxxxxx=(0,), second_argument=None + ) -> None: + pass + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig('{based_on_style: yapf,' + ' indent_closing_brackets: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testIndentClosingBracketsInFunctionCall(self): + unformatted_code = textwrap.dedent("""\ + def function(first_argument_xxxxxxxxxxxxxxxx=(0,), second_argument=None, third_and_final_argument=True): + pass + + + def function(first_argument_xxxxxxxxxxxxxxxxxxxxxxx=(0,), second_and_last_argument=None): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def function( + first_argument_xxxxxxxxxxxxxxxx=(0,), + second_argument=None, + third_and_final_argument=True + ): + pass + + + def function( + first_argument_xxxxxxxxxxxxxxxxxxxxxxx=(0,), second_and_last_argument=None + ): + pass + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig('{based_on_style: yapf,' + ' indent_closing_brackets: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testIndentClosingBracketsInTuple(self): + unformatted_code = textwrap.dedent("""\ + def function(): + some_var = ('a long element', 'another long element', 'short element', 'really really long element') + return True + + def function(): + some_var = ('a couple', 'small', 'elemens') + return False + """) + expected_formatted_code = textwrap.dedent("""\ + def function(): + some_var = ( + 'a long element', 'another long element', 'short element', + 'really really long element' + ) + return True + + + def function(): + some_var = ('a couple', 'small', 'elemens') + return False + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig('{based_on_style: yapf,' + ' indent_closing_brackets: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testIndentClosingBracketsInList(self): + unformatted_code = textwrap.dedent("""\ + def function(): + some_var = ['a long element', 'another long element', 'short element', 'really really long element'] + return True + + def function(): + some_var = ['a couple', 'small', 'elemens'] + return False + """) + expected_formatted_code = textwrap.dedent("""\ + def function(): + some_var = [ + 'a long element', 'another long element', 'short element', + 'really really long element' + ] + return True + + + def function(): + some_var = ['a couple', 'small', 'elemens'] + return False + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig('{based_on_style: yapf,' + ' indent_closing_brackets: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testIndentClosingBracketsInDict(self): + unformatted_code = textwrap.dedent("""\ + def function(): + some_var = {1: ('a long element', 'and another really really long element that is really really amazingly long'), 2: 'another long element', 3: 'short element', 4: 'really really long element'} + return True + + def function(): + some_var = {1: 'a couple', 2: 'small', 3: 'elemens'} + return False + """) + expected_formatted_code = textwrap.dedent("""\ + def function(): + some_var = { + 1: + ( + 'a long element', + 'and another really really long element that is really really amazingly long' + ), + 2: 'another long element', + 3: 'short element', + 4: 'really really long element' + } + return True + + + def function(): + some_var = {1: 'a couple', 2: 'small', 3: 'elemens'} + return False + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig('{based_on_style: yapf,' + ' indent_closing_brackets: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testMultipleDictionariesInList(self): + unformatted_code = textwrap.dedent("""\ + class A: + def b(): + d = { + "123456": [ + { + "12": "aa" + }, + { + "12": "bb" + }, + { + "12": "cc", + "1234567890": { + "1234567": [{ + "12": "dd", + "12345": "text 1" + }, { + "12": "ee", + "12345": "text 2" + }] + } + } + ] + } + """) + expected_formatted_code = textwrap.dedent("""\ + class A: + + def b(): + d = { + "123456": [{ + "12": "aa" + }, { + "12": "bb" + }, { + "12": "cc", + "1234567890": { + "1234567": [{ + "12": "dd", + "12345": "text 1" + }, { + "12": "ee", + "12345": "text 2" + }] + } + }] + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testForceMultilineDict_True(self): + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig('{force_multiline_dict: true}')) + unformatted_code = textwrap.dedent( + "responseDict = {'childDict': {'spam': 'eggs'}}\n") + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + actual = reformatter.Reformat(uwlines) + expected = textwrap.dedent("""\ + responseDict = { + 'childDict': { + 'spam': 'eggs' + } + } + """) + self.assertCodeEqual(expected, actual) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testForceMultilineDict_False(self): + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig('{force_multiline_dict: false}')) + unformatted_code = textwrap.dedent("""\ + responseDict = {'childDict': {'spam': 'eggs'}} + """) + expected_formatted_code = unformatted_code + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + @unittest.skipUnless(py3compat.PY38, 'Requires Python 3.8') + def testWalrus(self): + unformatted_code = textwrap.dedent("""\ + if (x := len([1]*1000)>100): + print(f'{x} is pretty big' ) + """) + expected = textwrap.dedent("""\ + if (x := len([1] * 1000) > 100): + print(f'{x} is pretty big') + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected, reformatter.Reformat(uwlines)) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/reformatter_buganizer_test.py b/.venv/lib/python3.9/site-packages/yapftests/reformatter_buganizer_test.py new file mode 100644 index 00000000..e96f6da7 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/reformatter_buganizer_test.py @@ -0,0 +1,2350 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Buganizer tests for yapf.reformatter.""" + +import textwrap +import unittest + +from yapf.yapflib import reformatter +from yapf.yapflib import style + +from yapftests import yapf_test_helper + + +class BuganizerFixes(yapf_test_helper.YAPFTest): + + @classmethod + def setUpClass(cls): + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testB137580392(self): + code = """\ +def _create_testing_simulator_and_sink( +) -> Tuple[_batch_simulator:_batch_simulator.BatchSimulator, + _batch_simulator.SimulationSink]: + pass +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB73279849(self): + unformatted_code = """\ +class A: + def _(a): + return 'hello' [ a ] +""" + expected_formatted_code = """\ +class A: + def _(a): + return 'hello'[a] +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB122455211(self): + unformatted_code = """\ +_zzzzzzzzzzzzzzzzzzzz = Union[sssssssssssssssssssss.pppppppppppppppp, + sssssssssssssssssssss.pppppppppppppppppppppppppppp] +""" + expected_formatted_code = """\ +_zzzzzzzzzzzzzzzzzzzz = Union[ + sssssssssssssssssssss.pppppppppppppppp, + sssssssssssssssssssss.pppppppppppppppppppppppppppp] +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB119300344(self): + code = """\ +def _GenerateStatsEntries( + process_id: Text, + timestamp: Optional[rdfvalue.RDFDatetime] = None +) -> Sequence[stats_values.StatsStoreEntry]: + pass +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB132886019(self): + code = """\ +X = { + 'some_dict_key': + frozenset([ + # pylint: disable=line-too-long + '//this/path/is/really/too/long/for/this/line/and/probably/should/be/split', + ]), +} +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB26521719(self): + code = """\ +class _(): + + def _(self): + self.stubs.Set(some_type_of_arg, 'ThisIsAStringArgument', + lambda *unused_args, **unused_kwargs: fake_resolver) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB122541552(self): + code = """\ +# pylint: disable=g-explicit-bool-comparison,singleton-comparison +_QUERY = account.Account.query(account.Account.enabled == True) +# pylint: enable=g-explicit-bool-comparison,singleton-comparison + + +def _(): + pass +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB124415889(self): + code = """\ +class _(): + + def run_queue_scanners(): + return xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( + { + components.NAME.FNOR: True, + components.NAME.DEVO: True, + }, + default=False) + + def modules_to_install(): + modules = DeepCopy(GetDef({})) + modules.update({ + 'xxxxxxxxxxxxxxxxxxxx': + GetDef('zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz', None), + }) + return modules +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB73166511(self): + code = """\ +def _(): + if min_std is not None: + groundtruth_age_variances = tf.maximum(groundtruth_age_variances, + min_std**2) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB118624921(self): + code = """\ +def _(): + function_call( + alert_name='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', + time_delta='1h', + alert_level='bbbbbbbb', + metric='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + bork=foo) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB35417079(self): + code = """\ +class _(): + + def _(): + X = ( + _ares_label_prefix + + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' # pylint: disable=line-too-long + 'PyTypePyTypePyTypePyTypePyTypePyTypePyTypePyTypePyTypePyTypePyTypePyTypePyType' # pytype: disable=attribute-error + 'CopybaraCopybaraCopybaraCopybaraCopybaraCopybaraCopybaraCopybaraCopybara' # copybara:strip + ) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB120047670(self): + unformatted_code = """\ +X = { + 'NO_PING_COMPONENTS': [ + 79775, # Releases / FOO API + 79770, # Releases / BAZ API + 79780], # Releases / MUX API + + 'PING_BLOCKED_BUGS': False, +} +""" + expected_formatted_code = """\ +X = { + 'NO_PING_COMPONENTS': [ + 79775, # Releases / FOO API + 79770, # Releases / BAZ API + 79780 + ], # Releases / MUX API + 'PING_BLOCKED_BUGS': False, +} +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB120245013(self): + unformatted_code = """\ +class Foo(object): + def testNoAlertForShortPeriod(self, rutabaga): + self.targets[:][streamz_path,self._fillInOtherFields(streamz_path, {streamz_field_of_interest:True})] = series.Counter('1s', '+ 500x10000') +""" + expected_formatted_code = """\ +class Foo(object): + + def testNoAlertForShortPeriod(self, rutabaga): + self.targets[:][ + streamz_path, + self._fillInOtherFields(streamz_path, {streamz_field_of_interest: True} + )] = series.Counter('1s', '+ 500x10000') +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB117841880(self): + code = """\ +def xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( + aaaaaaaaaaaaaaaaaaa: AnyStr, + bbbbbbbbbbbb: Optional[Sequence[AnyStr]] = None, + cccccccccc: AnyStr = cst.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, + dddddddddd: Sequence[SliceDimension] = (), + eeeeeeeeeeee: AnyStr = cst.DEFAULT_CONTROL_NAME, + ffffffffffffffffffff: Optional[Callable[[pd.DataFrame], + pd.DataFrame]] = None, + gggggggggggggg: ooooooooooooo = ooooooooooooo() +) -> pd.DataFrame: + pass +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB111764402(self): + unformatted_code = """\ +x = self.stubs.stub(video_classification_map, 'read_video_classifications', (lambda external_ids, **unused_kwargs: {external_id: self._get_serving_classification('video') for external_id in external_ids})) +""" + expected_formatted_code = """\ +x = self.stubs.stub(video_classification_map, 'read_video_classifications', + (lambda external_ids, **unused_kwargs: { + external_id: self._get_serving_classification('video') + for external_id in external_ids + })) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB116825060(self): + code = """\ +result_df = pd.DataFrame({LEARNED_CTR_COLUMN: learned_ctr}, + index=df_metrics.index) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB112711217(self): + code = """\ +def _(): + stats['moderated'] = ~stats.moderation_reason.isin( + approved_moderation_reasons) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB112867548(self): + unformatted_code = """\ +def _(): + return flask.make_response( + 'Records: {}, Problems: {}, More: {}'.format( + process_result.result_ct, process_result.problem_ct, + process_result.has_more), + httplib.ACCEPTED if process_result.has_more else httplib.OK, + {'content-type': _TEXT_CONTEXT_TYPE}) +""" + expected_formatted_code = """\ +def _(): + return flask.make_response( + 'Records: {}, Problems: {}, More: {}'.format(process_result.result_ct, + process_result.problem_ct, + process_result.has_more), + httplib.ACCEPTED if process_result.has_more else httplib.OK, + {'content-type': _TEXT_CONTEXT_TYPE}) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB112651423(self): + unformatted_code = """\ +def potato(feeditems, browse_use_case=None): + for item in turnip: + if kumquat: + if not feeds_variants.variants['FEEDS_LOAD_PLAYLIST_VIDEOS_FOR_ALL_ITEMS'] and item.video: + continue +""" + expected_formatted_code = """\ +def potato(feeditems, browse_use_case=None): + for item in turnip: + if kumquat: + if not feeds_variants.variants[ + 'FEEDS_LOAD_PLAYLIST_VIDEOS_FOR_ALL_ITEMS'] and item.video: + continue +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB80484938(self): + code = """\ +for sssssss, aaaaaaaaaa in [ + ('ssssssssssssssssssss', 'sssssssssssssssssssssssss'), + ('nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn', + 'nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn'), + ('pppppppppppppppppppppppppppp', 'pppppppppppppppppppppppppppppppp'), + ('wwwwwwwwwwwwwwwwwwww', 'wwwwwwwwwwwwwwwwwwwwwwwww'), + ('sssssssssssssssss', 'sssssssssssssssssssssss'), + ('ggggggggggggggggggggggg', 'gggggggggggggggggggggggggggg'), + ('ggggggggggggggggg', 'gggggggggggggggggggggg'), + ('eeeeeeeeeeeeeeeeeeeeee', 'eeeeeeeeeeeeeeeeeeeeeeeeeee') +]: + pass + +for sssssss, aaaaaaaaaa in [ + ('ssssssssssssssssssss', 'sssssssssssssssssssssssss'), + ('nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn', 'nnnnnnnnnnnnnnnnnnnnnnnnn'), + ('pppppppppppppppppppppppppppp', 'pppppppppppppppppppppppppppppppp'), + ('wwwwwwwwwwwwwwwwwwww', 'wwwwwwwwwwwwwwwwwwwwwwwww'), + ('sssssssssssssssss', 'sssssssssssssssssssssss'), + ('ggggggggggggggggggggggg', 'gggggggggggggggggggggggggggg'), + ('ggggggggggggggggg', 'gggggggggggggggggggggg'), + ('eeeeeeeeeeeeeeeeeeeeee', 'eeeeeeeeeeeeeeeeeeeeeeeeeee') +]: + pass + +for sssssss, aaaaaaaaaa in [ + ('ssssssssssssssssssss', 'sssssssssssssssssssssssss'), + ('nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn', + 'nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn'), + ('pppppppppppppppppppppppppppp', 'pppppppppppppppppppppppppppppppp'), + ('wwwwwwwwwwwwwwwwwwww', 'wwwwwwwwwwwwwwwwwwwwwwwww'), + ('sssssssssssssssss', 'sssssssssssssssssssssss'), + ('ggggggggggggggggggggggg', 'gggggggggggggggggggggggggggg'), + ('ggggggggggggggggg', 'gggggggggggggggggggggg'), + ('eeeeeeeeeeeeeeeeeeeeee', 'eeeeeeeeeeeeeeeeeeeeeeeeeee'), +]: + pass +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB120771563(self): + code = """\ +class A: + + def b(): + d = { + "123456": [{ + "12": "aa" + }, { + "12": "bb" + }, { + "12": "cc", + "1234567890": { + "1234567": [{ + "12": "dd", + "12345": "text 1" + }, { + "12": "ee", + "12345": "text 2" + }] + } + }] + } +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB79462249(self): + code = """\ +foo.bar(baz, [ + quux(thud=42), + norf, +]) +foo.bar(baz, [ + quux(), + norf, +]) +foo.bar(baz, quux(thud=42), aaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbbbbb, + ccccccccccccccccccc) +foo.bar( + baz, + quux(thud=42), + aaaaaaaaaaaaaaaaaaaaaa=1, + bbbbbbbbbbbbbbbbbbbbb=2, + ccccccccccccccccccc=3) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB113210278(self): + unformatted_code = """\ +def _(): + aaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.cccccccccccccccccccccccccccc(\ +eeeeeeeeeeeeeeeeeeeeeeeeee.fffffffffffffffffffffffffffffffffffffff.\ +ggggggggggggggggggggggggggggggggg.hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh()) +""" + expected_formatted_code = """\ +def _(): + aaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.cccccccccccccccccccccccccccc( + eeeeeeeeeeeeeeeeeeeeeeeeee.fffffffffffffffffffffffffffffffffffffff + .ggggggggggggggggggggggggggggggggg.hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh()) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB77923341(self): + code = """\ +def f(): + if (aaaaaaaaaaaaaa.bbbbbbbbbbbb.ccccc <= 0 and # pytype: disable=attribute-error + ddddddddddd.eeeeeeeee == constants.FFFFFFFFFFFFFF): + raise "yo" +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB77329955(self): + code = """\ +class _(): + + @parameterized.named_parameters( + ('ReadyExpiredSuccess', True, True, True, None, None), + ('SpannerUpdateFails', True, False, True, None, None), + ('ReadyNotExpired', False, True, True, True, None), + # ('ReadyNotExpiredNotHealthy', False, True, True, False, True), + # ('ReadyNotExpiredNotHealthyErrorFails', False, True, True, False, False + # ('ReadyNotExpiredNotHealthyUpdateFails', False, False, True, False, True + ) + def _(): + pass +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB65197969(self): + unformatted_code = """\ +class _(): + + def _(): + return timedelta(seconds=max(float(time_scale), small_interval) * + 1.41 ** min(num_attempts, 9)) +""" + expected_formatted_code = """\ +class _(): + + def _(): + return timedelta( + seconds=max(float(time_scale), small_interval) * + 1.41**min(num_attempts, 9)) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB65546221(self): + unformatted_code = """\ +SUPPORTED_PLATFORMS = ( + "centos-6", + "centos-7", + "ubuntu-1204-precise", + "ubuntu-1404-trusty", + "ubuntu-1604-xenial", + "debian-7-wheezy", + "debian-8-jessie", + "debian-9-stretch",) +""" + expected_formatted_code = """\ +SUPPORTED_PLATFORMS = ( + "centos-6", + "centos-7", + "ubuntu-1204-precise", + "ubuntu-1404-trusty", + "ubuntu-1604-xenial", + "debian-7-wheezy", + "debian-8-jessie", + "debian-9-stretch", +) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB30500455(self): + unformatted_code = """\ +INITIAL_SYMTAB = dict([(name, 'exception#' + name) for name in INITIAL_EXCEPTIONS +] * [(name, 'type#' + name) for name in INITIAL_TYPES] + [ + (name, 'function#' + name) for name in INITIAL_FUNCTIONS +] + [(name, 'const#' + name) for name in INITIAL_CONSTS]) +""" + expected_formatted_code = """\ +INITIAL_SYMTAB = dict( + [(name, 'exception#' + name) for name in INITIAL_EXCEPTIONS] * + [(name, 'type#' + name) for name in INITIAL_TYPES] + + [(name, 'function#' + name) for name in INITIAL_FUNCTIONS] + + [(name, 'const#' + name) for name in INITIAL_CONSTS]) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB38343525(self): + code = """\ +# This does foo. +@arg.String('some_path_to_a_file', required=True) +# This does bar. +@arg.String('some_path_to_a_file', required=True) +def f(): + print 1 +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB37099651(self): + unformatted_code = """\ +_MEMCACHE = lazy.MakeLazy( + # pylint: disable=g-long-lambda + lambda: function.call.mem.clients(FLAGS.some_flag_thingy, default_namespace=_LAZY_MEM_NAMESPACE, allow_pickle=True) + # pylint: enable=g-long-lambda +) +""" + expected_formatted_code = """\ +_MEMCACHE = lazy.MakeLazy( + # pylint: disable=g-long-lambda + lambda: function.call.mem.clients( + FLAGS.some_flag_thingy, + default_namespace=_LAZY_MEM_NAMESPACE, + allow_pickle=True) + # pylint: enable=g-long-lambda +) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB33228502(self): + unformatted_code = """\ +def _(): + success_rate_stream_table = module.Precompute( + query_function=module.DefineQueryFunction( + name='Response error ratio', + expression=((m.Fetch( + m.Raw('monarch.BorgTask', + '/corp/travel/trips2/dispatcher/email/response'), + {'borg_job': module_config.job, 'metric:response_type': 'SUCCESS'}), + m.Fetch(m.Raw('monarch.BorgTask', '/corp/travel/trips2/dispatcher/email/response'), {'borg_job': module_config.job})) + | m.Window(m.Delta('1h')) + | m.Join('successes', 'total') + | m.Point(m.VAL['successes'] / m.VAL['total'])))) +""" + expected_formatted_code = """\ +def _(): + success_rate_stream_table = module.Precompute( + query_function=module.DefineQueryFunction( + name='Response error ratio', + expression=( + (m.Fetch( + m.Raw('monarch.BorgTask', + '/corp/travel/trips2/dispatcher/email/response'), { + 'borg_job': module_config.job, + 'metric:response_type': 'SUCCESS' + }), + m.Fetch( + m.Raw('monarch.BorgTask', + '/corp/travel/trips2/dispatcher/email/response'), + {'borg_job': module_config.job})) + | m.Window(m.Delta('1h')) + | m.Join('successes', 'total') + | m.Point(m.VAL['successes'] / m.VAL['total'])))) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB30394228(self): + code = """\ +class _(): + + def _(self): + return some.randome.function.calling( + wf, None, alert.Format(alert.subject, alert=alert, threshold=threshold), + alert.Format(alert.body, alert=alert, threshold=threshold), + alert.html_formatting) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB65246454(self): + unformatted_code = """\ +class _(): + + def _(self): + self.assertEqual({i.id + for i in successful_instances}, + {i.id + for i in self._statuses.successful_instances}) +""" + expected_formatted_code = """\ +class _(): + + def _(self): + self.assertEqual({i.id for i in successful_instances}, + {i.id for i in self._statuses.successful_instances}) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB67935450(self): + unformatted_code = """\ +def _(): + return ( + (Gauge( + metric='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + group_by=group_by + ['metric:process_name'], + metric_filter={'metric:process_name': process_name_re}), + Gauge( + metric='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', + group_by=group_by + ['metric:process_name'], + metric_filter={'metric:process_name': process_name_re})) + | expr.Join( + left_name='start', left_default=0, right_name='end', right_default=0) + | m.Point( + m.Cond(m.VAL['end'] != 0, m.VAL['end'], k.TimestampMicros() / + 1000000L) - m.Cond(m.VAL['start'] != 0, m.VAL['start'], + m.TimestampMicros() / 1000000L))) +""" + expected_formatted_code = """\ +def _(): + return ( + (Gauge( + metric='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + group_by=group_by + ['metric:process_name'], + metric_filter={'metric:process_name': process_name_re}), + Gauge( + metric='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', + group_by=group_by + ['metric:process_name'], + metric_filter={'metric:process_name': process_name_re})) + | expr.Join( + left_name='start', left_default=0, right_name='end', right_default=0) + | m.Point( + m.Cond(m.VAL['end'] != 0, m.VAL['end'], + k.TimestampMicros() / 1000000L) - + m.Cond(m.VAL['start'] != 0, m.VAL['start'], + m.TimestampMicros() / 1000000L))) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB66011084(self): + unformatted_code = """\ +X = { +"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": # Comment 1. +([] if True else [ # Comment 2. + "bbbbbbbbbbbbbbbbbbb", # Comment 3. + "cccccccccccccccccccccccc", # Comment 4. + "ddddddddddddddddddddddddd", # Comment 5. + "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", # Comment 6. + "fffffffffffffffffffffffffffffff", # Comment 7. + "ggggggggggggggggggggggggggg", # Comment 8. + "hhhhhhhhhhhhhhhhhh", # Comment 9. +]), +} +""" + expected_formatted_code = """\ +X = { + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": # Comment 1. + ([] if True else [ # Comment 2. + "bbbbbbbbbbbbbbbbbbb", # Comment 3. + "cccccccccccccccccccccccc", # Comment 4. + "ddddddddddddddddddddddddd", # Comment 5. + "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", # Comment 6. + "fffffffffffffffffffffffffffffff", # Comment 7. + "ggggggggggggggggggggggggggg", # Comment 8. + "hhhhhhhhhhhhhhhhhh", # Comment 9. + ]), +} +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB67455376(self): + unformatted_code = """\ +sponge_ids.extend(invocation.id() for invocation in self._client.GetInvocationsByLabels(labels)) +""" + expected_formatted_code = """\ +sponge_ids.extend(invocation.id() + for invocation in self._client.GetInvocationsByLabels(labels)) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB35210351(self): + unformatted_code = """\ +def _(): + config.AnotherRuleThing( + 'the_title_to_the_thing_here', + {'monitorname': 'firefly', + 'service': ACCOUNTING_THING, + 'severity': 'the_bug', + 'monarch_module_name': alerts.TheLabel(qa_module_regexp, invert=True)}, + fanout, + alerts.AlertUsToSomething( + GetTheAlertToIt('the_title_to_the_thing_here'), + GetNotificationTemplate('your_email_here'))) +""" + expected_formatted_code = """\ +def _(): + config.AnotherRuleThing( + 'the_title_to_the_thing_here', { + 'monitorname': 'firefly', + 'service': ACCOUNTING_THING, + 'severity': 'the_bug', + 'monarch_module_name': alerts.TheLabel(qa_module_regexp, invert=True) + }, fanout, + alerts.AlertUsToSomething( + GetTheAlertToIt('the_title_to_the_thing_here'), + GetNotificationTemplate('your_email_here'))) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB34774905(self): + unformatted_code = """\ +x=[VarExprType(ir_name=IrName( value='x', +expr_type=UnresolvedAttrExprType( atom=UnknownExprType(), attr_name=IrName( + value='x', expr_type=UnknownExprType(), usage='UNKNOWN', fqn=None, + astn=None), usage='REF'), usage='ATTR', fqn='.x', astn=None))] +""" + expected_formatted_code = """\ +x = [ + VarExprType( + ir_name=IrName( + value='x', + expr_type=UnresolvedAttrExprType( + atom=UnknownExprType(), + attr_name=IrName( + value='x', + expr_type=UnknownExprType(), + usage='UNKNOWN', + fqn=None, + astn=None), + usage='REF'), + usage='ATTR', + fqn='.x', + astn=None)) +] +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB65176185(self): + code = """\ +xx = zip(*[(a, b) for (a, b, c) in yy]) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB35210166(self): + unformatted_code = """\ +def _(): + query = ( + m.Fetch(n.Raw('monarch.BorgTask', '/proc/container/memory/usage'), { 'borg_user': borguser, 'borg_job': jobname }) + | o.Window(m.Align('5m')) | p.GroupBy(['borg_user', 'borg_job', 'borg_cell'], q.Mean())) +""" + expected_formatted_code = """\ +def _(): + query = ( + m.Fetch( + n.Raw('monarch.BorgTask', '/proc/container/memory/usage'), { + 'borg_user': borguser, + 'borg_job': jobname + }) + | o.Window(m.Align('5m')) + | p.GroupBy(['borg_user', 'borg_job', 'borg_cell'], q.Mean())) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB32167774(self): + unformatted_code = """\ +X = ( + 'is_official', + 'is_cover', + 'is_remix', + 'is_instrumental', + 'is_live', + 'has_lyrics', + 'is_album', + 'is_compilation',) +""" + expected_formatted_code = """\ +X = ( + 'is_official', + 'is_cover', + 'is_remix', + 'is_instrumental', + 'is_live', + 'has_lyrics', + 'is_album', + 'is_compilation', +) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB66912275(self): + unformatted_code = """\ +def _(): + with self.assertRaisesRegexp(errors.HttpError, 'Invalid'): + patch_op = api_client.forwardingRules().patch( + project=project_id, + region=region, + forwardingRule=rule_name, + body={'fingerprint': base64.urlsafe_b64encode('invalid_fingerprint')}).execute() +""" + expected_formatted_code = """\ +def _(): + with self.assertRaisesRegexp(errors.HttpError, 'Invalid'): + patch_op = api_client.forwardingRules().patch( + project=project_id, + region=region, + forwardingRule=rule_name, + body={ + 'fingerprint': base64.urlsafe_b64encode('invalid_fingerprint') + }).execute() +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB67312284(self): + code = """\ +def _(): + self.assertEqual( + [u'to be published 2', u'to be published 1', u'to be published 0'], + [el.text for el in page.first_column_tds]) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB65241516(self): + unformatted_code = """\ +checkpoint_files = gfile.Glob(os.path.join(TrainTraceDir(unit_key, "*", "*"), embedding_model.CHECKPOINT_FILENAME + "-*")) +""" + expected_formatted_code = """\ +checkpoint_files = gfile.Glob( + os.path.join( + TrainTraceDir(unit_key, "*", "*"), + embedding_model.CHECKPOINT_FILENAME + "-*")) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB37460004(self): + code = textwrap.dedent("""\ + assert all(s not in (_SENTINEL, None) for s in nested_schemas + ), 'Nested schemas should never contain None/_SENTINEL' + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB36806207(self): + code = """\ +def _(): + linearity_data = [[row] for row in [ + "%.1f mm" % (np.mean(linearity_values["pos_error"]) * 1000.0), + "%.1f mm" % (np.max(linearity_values["pos_error"]) * 1000.0), + "%.1f mm" % (np.mean(linearity_values["pos_error_chunk_mean"]) * 1000.0), + "%.1f mm" % (np.max(linearity_values["pos_error_chunk_max"]) * 1000.0), + "%.1f deg" % math.degrees(np.mean(linearity_values["rot_noise"])), + "%.1f deg" % math.degrees(np.max(linearity_values["rot_noise"])), + "%.1f deg" % math.degrees(np.mean(linearity_values["rot_drift"])), + "%.1f deg" % math.degrees(np.max(linearity_values["rot_drift"])), + "%.1f%%" % (np.max(linearity_values["pos_discontinuity"]) * 100.0), + "%.1f%%" % (np.max(linearity_values["rot_discontinuity"]) * 100.0) + ]] +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB36215507(self): + code = textwrap.dedent("""\ + class X(): + + def _(): + aaaaaaaaaaaaa._bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb( + mmmmmmmmmmmmm, nnnnn, ooooooooo, + _(ppppppppppppppppppppppppppppppppppppp), + *(qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq), + **(qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq)) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB35212469(self): + unformatted_code = textwrap.dedent("""\ + def _(): + X = { + 'retain': { + 'loadtest': # This is a comment in the middle of a dictionary entry + ('/some/path/to/a/file/that/is/needed/by/this/process') + } + } + """) + expected_formatted_code = textwrap.dedent("""\ + def _(): + X = { + 'retain': { + 'loadtest': # This is a comment in the middle of a dictionary entry + ('/some/path/to/a/file/that/is/needed/by/this/process') + } + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB31063453(self): + unformatted_code = textwrap.dedent("""\ + def _(): + while ((not mpede_proc) or ((time_time() - last_modified) < FLAGS_boot_idle_timeout)): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def _(): + while ((not mpede_proc) or + ((time_time() - last_modified) < FLAGS_boot_idle_timeout)): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB35021894(self): + unformatted_code = textwrap.dedent("""\ + def _(): + labelacl = Env(qa={ + 'read': 'name/some-type-of-very-long-name-for-reading-perms', + 'modify': 'name/some-other-type-of-very-long-name-for-modifying' + }, + prod={ + 'read': 'name/some-type-of-very-long-name-for-reading-perms', + 'modify': 'name/some-other-type-of-very-long-name-for-modifying' + }) + """) + expected_formatted_code = textwrap.dedent("""\ + def _(): + labelacl = Env( + qa={ + 'read': 'name/some-type-of-very-long-name-for-reading-perms', + 'modify': 'name/some-other-type-of-very-long-name-for-modifying' + }, + prod={ + 'read': 'name/some-type-of-very-long-name-for-reading-perms', + 'modify': 'name/some-other-type-of-very-long-name-for-modifying' + }) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB34682902(self): + unformatted_code = textwrap.dedent("""\ + logging.info("Mean angular velocity norm: %.3f", np.linalg.norm(np.mean(ang_vel_arr, axis=0))) + """) + expected_formatted_code = textwrap.dedent("""\ + logging.info("Mean angular velocity norm: %.3f", + np.linalg.norm(np.mean(ang_vel_arr, axis=0))) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB33842726(self): + unformatted_code = textwrap.dedent("""\ + class _(): + def _(): + hints.append(('hg tag -f -l -r %s %s # %s' % (short(ctx.node( + )), candidatetag, firstline))[:78]) + """) + expected_formatted_code = textwrap.dedent("""\ + class _(): + def _(): + hints.append(('hg tag -f -l -r %s %s # %s' % + (short(ctx.node()), candidatetag, firstline))[:78]) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB32931780(self): + unformatted_code = textwrap.dedent("""\ + environments = { + 'prod': { + # this is a comment before the first entry. + 'entry one': + 'an entry.', + # this is the comment before the second entry. + 'entry number 2.': + 'something', + # this is the comment before the third entry and it's a doozy. So big! + 'who': + 'allin', + # This is an entry that has a dictionary in it. It's ugly + 'something': { + 'page': ['this-is-a-page@xxxxxxxx.com', 'something-for-eml@xxxxxx.com'], + 'bug': ['bugs-go-here5300@xxxxxx.com'], + 'email': ['sometypeof-email@xxxxxx.com'], + }, + # a short comment + 'yolo!!!!!': + 'another-email-address@xxxxxx.com', + # this entry has an implicit string concatenation + 'implicit': + 'https://this-is-very-long.url-addr.com/' + '?something=something%20some%20more%20stuff..', + # A more normal entry. + '.....': + 'this is an entry', + } + } + """) + expected_formatted_code = textwrap.dedent("""\ + environments = { + 'prod': { + # this is a comment before the first entry. + 'entry one': 'an entry.', + # this is the comment before the second entry. + 'entry number 2.': 'something', + # this is the comment before the third entry and it's a doozy. So big! + 'who': 'allin', + # This is an entry that has a dictionary in it. It's ugly + 'something': { + 'page': [ + 'this-is-a-page@xxxxxxxx.com', 'something-for-eml@xxxxxx.com' + ], + 'bug': ['bugs-go-here5300@xxxxxx.com'], + 'email': ['sometypeof-email@xxxxxx.com'], + }, + # a short comment + 'yolo!!!!!': 'another-email-address@xxxxxx.com', + # this entry has an implicit string concatenation + 'implicit': 'https://this-is-very-long.url-addr.com/' + '?something=something%20some%20more%20stuff..', + # A more normal entry. + '.....': 'this is an entry', + } + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB33047408(self): + code = textwrap.dedent("""\ + def _(): + for sort in (sorts or []): + request['sorts'].append({ + 'field': { + 'user_field': sort + }, + 'order': 'ASCENDING' + }) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB32714745(self): + code = textwrap.dedent("""\ + class _(): + + def _BlankDefinition(): + '''Return a generic blank dictionary for a new field.''' + return { + 'type': '', + 'validation': '', + 'name': 'fieldname', + 'label': 'Field Label', + 'help': '', + 'initial': '', + 'required': False, + 'required_msg': 'Required', + 'invalid_msg': 'Please enter a valid value', + 'options': { + 'regex': '', + 'widget_attr': '', + 'choices_checked': '', + 'choices_count': '', + 'choices': {} + }, + 'isnew': True, + 'dirty': False, + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB32737279(self): + unformatted_code = textwrap.dedent("""\ + here_is_a_dict = { + 'key': + # Comment. + 'value' + } + """) + expected_formatted_code = textwrap.dedent("""\ + here_is_a_dict = { + 'key': # Comment. + 'value' + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB32570937(self): + code = textwrap.dedent("""\ + def _(): + if (job_message.ball not in ('*', ball) or + job_message.call not in ('*', call) or + job_message.mall not in ('*', job_name)): + return False + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB31937033(self): + code = textwrap.dedent("""\ + class _(): + + def __init__(self, metric, fields_cb=None): + self._fields_cb = fields_cb or (lambda *unused_args, **unused_kwargs: {}) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB31911533(self): + code = """\ +class _(): + + @parameterized.NamedParameters( + ('IncludingModInfoWithHeaderList', AAAA, aaaa), + ('IncludingModInfoWithoutHeaderList', BBBB, bbbbb), + ('ExcludingModInfoWithHeaderList', CCCCC, cccc), + ('ExcludingModInfoWithoutHeaderList', DDDDD, ddddd), + ) + def _(): + pass +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB31847238(self): + unformatted_code = textwrap.dedent("""\ + class _(): + + def aaaaa(self, bbbbb, cccccccccccccc=None): # TODO(who): pylint: disable=unused-argument + return 1 + + def xxxxx(self, yyyyy, zzzzzzzzzzzzzz=None): # A normal comment that runs over the column limit. + return 1 + """) + expected_formatted_code = textwrap.dedent("""\ + class _(): + + def aaaaa(self, bbbbb, cccccccccccccc=None): # TODO(who): pylint: disable=unused-argument + return 1 + + def xxxxx( + self, + yyyyy, + zzzzzzzzzzzzzz=None): # A normal comment that runs over the column limit. + return 1 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB30760569(self): + unformatted_code = textwrap.dedent("""\ + {'1234567890123456789012345678901234567890123456789012345678901234567890': + '1234567890123456789012345678901234567890'} + """) + expected_formatted_code = textwrap.dedent("""\ + { + '1234567890123456789012345678901234567890123456789012345678901234567890': + '1234567890123456789012345678901234567890' + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB26034238(self): + unformatted_code = textwrap.dedent("""\ + class Thing: + + def Function(self): + thing.Scrape('/aaaaaaaaa/bbbbbbbbbb/ccccc/dddd/eeeeeeeeeeeeee/ffffffffffffff').AndReturn(42) + """) + expected_formatted_code = textwrap.dedent("""\ + class Thing: + + def Function(self): + thing.Scrape( + '/aaaaaaaaa/bbbbbbbbbb/ccccc/dddd/eeeeeeeeeeeeee/ffffffffffffff' + ).AndReturn(42) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB30536435(self): + unformatted_code = textwrap.dedent("""\ + def main(unused_argv): + if True: + if True: + aaaaaaaaaaa.comment('import-from[{}] {} {}'.format( + bbbbbbbbb.usage, + ccccccccc.within, + imports.ddddddddddddddddddd(name_item.ffffffffffffffff))) + """) + expected_formatted_code = textwrap.dedent("""\ + def main(unused_argv): + if True: + if True: + aaaaaaaaaaa.comment('import-from[{}] {} {}'.format( + bbbbbbbbb.usage, ccccccccc.within, + imports.ddddddddddddddddddd(name_item.ffffffffffffffff))) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB30442148(self): + unformatted_code = textwrap.dedent("""\ + def lulz(): + return (some_long_module_name.SomeLongClassName. + some_long_attribute_name.some_long_method_name()) + """) + expected_formatted_code = textwrap.dedent("""\ + def lulz(): + return (some_long_module_name.SomeLongClassName.some_long_attribute_name + .some_long_method_name()) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB26868213(self): + unformatted_code = textwrap.dedent("""\ + def _(): + xxxxxxxxxxxxxxxxxxx = { + 'ssssss': {'ddddd': 'qqqqq', + 'p90': aaaaaaaaaaaaaaaaa, + 'p99': bbbbbbbbbbbbbbbbb, + 'lllllllllllll': yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy(),}, + 'bbbbbbbbbbbbbbbbbbbbbbbbbbbb': { + 'ddddd': 'bork bork bork bo', + 'p90': wwwwwwwwwwwwwwwww, + 'p99': wwwwwwwwwwwwwwwww, + 'lllllllllllll': None, # use the default + } + } + """) + expected_formatted_code = textwrap.dedent("""\ + def _(): + xxxxxxxxxxxxxxxxxxx = { + 'ssssss': { + 'ddddd': 'qqqqq', + 'p90': aaaaaaaaaaaaaaaaa, + 'p99': bbbbbbbbbbbbbbbbb, + 'lllllllllllll': yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy(), + }, + 'bbbbbbbbbbbbbbbbbbbbbbbbbbbb': { + 'ddddd': 'bork bork bork bo', + 'p90': wwwwwwwwwwwwwwwww, + 'p99': wwwwwwwwwwwwwwwww, + 'lllllllllllll': None, # use the default + } + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB30173198(self): + code = textwrap.dedent("""\ + class _(): + + def _(): + self.assertFalse( + evaluation_runner.get_larps_in_eval_set('these_arent_the_larps')) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB29908765(self): + code = textwrap.dedent("""\ + class _(): + + def __repr__(self): + return '' % ( + self._id, self._stub._stub.rpc_channel().target()) # pylint:disable=protected-access + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB30087362(self): + code = textwrap.dedent("""\ + def _(): + for s in sorted(env['foo']): + bar() + # This is a comment + + # This is another comment + foo() + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB30087363(self): + code = textwrap.dedent("""\ + if False: + bar() + # This is a comment + # This is another comment + elif True: + foo() + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB29093579(self): + unformatted_code = textwrap.dedent("""\ + def _(): + _xxxxxxxxxxxxxxx(aaaaaaaa, bbbbbbbbbbbbbb.cccccccccc[ + dddddddddddddddddddddddddddd.eeeeeeeeeeeeeeeeeeeeee.fffffffffffffffffffff]) + """) + expected_formatted_code = textwrap.dedent("""\ + def _(): + _xxxxxxxxxxxxxxx( + aaaaaaaa, + bbbbbbbbbbbbbb.cccccccccc[dddddddddddddddddddddddddddd + .eeeeeeeeeeeeeeeeeeeeee.fffffffffffffffffffff]) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB26382315(self): + code = textwrap.dedent("""\ + @hello_world + # This is a first comment + + # Comment + def foo(): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB27616132(self): + unformatted_code = textwrap.dedent("""\ + if True: + query.fetch_page.assert_has_calls([ + mock.call(100, + start_cursor=None), + mock.call(100, + start_cursor=cursor_1), + mock.call(100, + start_cursor=cursor_2), + ]) + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + query.fetch_page.assert_has_calls([ + mock.call(100, start_cursor=None), + mock.call(100, start_cursor=cursor_1), + mock.call(100, start_cursor=cursor_2), + ]) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB27590179(self): + unformatted_code = textwrap.dedent("""\ + if True: + if True: + self.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = ( + { True: + self.bbb.cccccccccc(ddddddddddddddddddddddd.eeeeeeeeeeeeeeeeeeeeee), + False: + self.bbb.cccccccccc(ddddddddddddddddddddddd.eeeeeeeeeeeeeeeeeeeeee) + }) + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + if True: + self.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = ({ + True: + self.bbb.cccccccccc(ddddddddddddddddddddddd.eeeeeeeeeeeeeeeeeeeeee), + False: + self.bbb.cccccccccc(ddddddddddddddddddddddd.eeeeeeeeeeeeeeeeeeeeee) + }) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB27266946(self): + unformatted_code = textwrap.dedent("""\ + def _(): + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = (self.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.cccccccccccccccccccccccccccccccccccc) + """) + expected_formatted_code = textwrap.dedent("""\ + def _(): + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = ( + self.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + .cccccccccccccccccccccccccccccccccccc) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB25505359(self): + code = textwrap.dedent("""\ + _EXAMPLE = { + 'aaaaaaaaaaaaaa': [{ + 'bbbb': 'cccccccccccccccccccccc', + 'dddddddddddd': [] + }, { + 'bbbb': 'ccccccccccccccccccc', + 'dddddddddddd': [] + }] + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB25324261(self): + code = textwrap.dedent("""\ + aaaaaaaaa = set(bbbb.cccc + for ddd in eeeeee.fffffffffff.gggggggggggggggg + for cccc in ddd.specification) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB25136704(self): + code = textwrap.dedent("""\ + class f: + + def test(self): + self.bbbbbbb[0]['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', { + 'xxxxxx': 'yyyyyy' + }] = cccccc.ddd('1m', '10x1+1') + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB25165602(self): + code = textwrap.dedent("""\ + def f(): + ids = {u: i for u, i in zip(self.aaaaa, xrange(42, 42 + len(self.aaaaaa)))} + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB25157123(self): + code = textwrap.dedent("""\ + def ListArgs(): + FairlyLongMethodName([relatively_long_identifier_for_a_list], + another_argument_with_a_long_identifier) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB25136820(self): + unformatted_code = textwrap.dedent("""\ + def foo(): + return collections.OrderedDict({ + # Preceding comment. + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa': + '$bbbbbbbbbbbbbbbbbbbbbbbb', + }) + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): + return collections.OrderedDict({ + # Preceding comment. + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa': + '$bbbbbbbbbbbbbbbbbbbbbbbb', + }) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB25131481(self): + unformatted_code = textwrap.dedent("""\ + APPARENT_ACTIONS = ('command_type', { + 'materialize': lambda x: some_type_of_function('materialize ' + x.command_def), + '#': lambda x: x # do nothing + }) + """) + expected_formatted_code = textwrap.dedent("""\ + APPARENT_ACTIONS = ( + 'command_type', + { + 'materialize': + lambda x: some_type_of_function('materialize ' + x.command_def), + '#': + lambda x: x # do nothing + }) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB23445244(self): + unformatted_code = textwrap.dedent("""\ + def foo(): + if True: + return xxxxxxxxxxxxxxxx( + command, + extra_env={ + "OOOOOOOOOOOOOOOOOOOOO": FLAGS.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz, + "PPPPPPPPPPPPPPPPPPPPP": + FLAGS.aaaaaaaaaaaaaa + FLAGS.bbbbbbbbbbbbbbbbbbb, + }) + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): + if True: + return xxxxxxxxxxxxxxxx( + command, + extra_env={ + "OOOOOOOOOOOOOOOOOOOOO": + FLAGS.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz, + "PPPPPPPPPPPPPPPPPPPPP": + FLAGS.aaaaaaaaaaaaaa + FLAGS.bbbbbbbbbbbbbbbbbbb, + }) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB20559654(self): + unformatted_code = textwrap.dedent("""\ + class A(object): + + def foo(self): + unused_error, result = server.Query( + ['AA BBBB CCC DDD EEEEEEEE X YY ZZZZ FFF EEE AAAAAAAA'], + aaaaaaaaaaa=True, bbbbbbbb=None) + """) + expected_formatted_code = textwrap.dedent("""\ + class A(object): + + def foo(self): + unused_error, result = server.Query( + ['AA BBBB CCC DDD EEEEEEEE X YY ZZZZ FFF EEE AAAAAAAA'], + aaaaaaaaaaa=True, + bbbbbbbb=None) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB23943842(self): + unformatted_code = textwrap.dedent("""\ + class F(): + def f(): + self.assertDictEqual( + accounts, { + 'foo': + {'account': 'foo', + 'lines': 'l1\\nl2\\nl3\\n1 line(s) were elided.'}, + 'bar': {'account': 'bar', + 'lines': 'l5\\nl6\\nl7'}, + 'wiz': {'account': 'wiz', + 'lines': 'l8'} + }) + """) + expected_formatted_code = textwrap.dedent("""\ + class F(): + + def f(): + self.assertDictEqual( + accounts, { + 'foo': { + 'account': 'foo', + 'lines': 'l1\\nl2\\nl3\\n1 line(s) were elided.' + }, + 'bar': { + 'account': 'bar', + 'lines': 'l5\\nl6\\nl7' + }, + 'wiz': { + 'account': 'wiz', + 'lines': 'l8' + } + }) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB20551180(self): + unformatted_code = textwrap.dedent("""\ + def foo(): + if True: + return (struct.pack('aaaa', bbbbbbbbbb, ccccccccccccccc, dddddddd) + eeeeeee) + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): + if True: + return (struct.pack('aaaa', bbbbbbbbbb, ccccccccccccccc, dddddddd) + + eeeeeee) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB23944849(self): + unformatted_code = textwrap.dedent("""\ + class A(object): + def xxxxxxxxx(self, aaaaaaa, bbbbbbb=ccccccccccc, dddddd=300, eeeeeeeeeeeeee=None, fffffffffffffff=0): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + class A(object): + + def xxxxxxxxx(self, + aaaaaaa, + bbbbbbb=ccccccccccc, + dddddd=300, + eeeeeeeeeeeeee=None, + fffffffffffffff=0): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB23935890(self): + unformatted_code = textwrap.dedent("""\ + class F(): + def functioni(self, aaaaaaa, bbbbbbb, cccccc, dddddddddddddd, eeeeeeeeeeeeeee): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + class F(): + + def functioni(self, aaaaaaa, bbbbbbb, cccccc, dddddddddddddd, + eeeeeeeeeeeeeee): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB28414371(self): + code = textwrap.dedent("""\ + def _(): + return ((m.fffff( + m.rrr('mmmmmmmmmmmmmmmm', 'ssssssssssssssssssssssssss'), ffffffffffffffff) + | m.wwwwww(m.ddddd('1h')) + | m.ggggggg(bbbbbbbbbbbbbbb) + | m.ppppp( + (1 - m.ffffffffffffffff(llllllllllllllllllllll * 1000000, m.vvv)) + * m.ddddddddddddddddd(m.vvv)), + m.fffff( + m.rrr('mmmmmmmmmmmmmmmm', 'sssssssssssssssssssssss'), + dict( + ffffffffffffffff, **{ + 'mmmmmm:ssssss': + m.rrrrrrrrrrr('|'.join(iiiiiiiiiiiiii), iiiiii=True) + })) + | m.wwwwww(m.rrrr('1h')) + | m.ggggggg(bbbbbbbbbbbbbbb)) + | m.jjjj() + | m.ppppp(m.vvv[0] + m.vvv[1])) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB20127686(self): + code = textwrap.dedent("""\ + def f(): + if True: + return ((m.fffff( + m.rrr('xxxxxxxxxxxxxxxx', + 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'), + mmmmmmmm) + | m.wwwwww(m.rrrr(self.tttttttttt, self.mmmmmmmmmmmmmmmmmmmmm)) + | m.ggggggg(self.gggggggg, m.sss()), m.fffff('aaaaaaaaaaaaaaaa') + | m.wwwwww(m.ddddd(self.tttttttttt, self.mmmmmmmmmmmmmmmmmmmmm)) + | m.ggggggg(self.gggggggg)) + | m.jjjj() + | m.ppppp(m.VAL[0] / m.VAL[1])) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB20016122(self): + unformatted_code = textwrap.dedent("""\ + from a_very_long_or_indented_module_name_yada_yada import (long_argument_1, + long_argument_2) + """) + expected_formatted_code = textwrap.dedent("""\ + from a_very_long_or_indented_module_name_yada_yada import ( + long_argument_1, long_argument_2) + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: pep8, split_penalty_import_names: 350}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + + code = textwrap.dedent("""\ + class foo(): + + def __eq__(self, other): + return (isinstance(other, type(self)) + and self.xxxxxxxxxxx == other.xxxxxxxxxxx + and self.xxxxxxxx == other.xxxxxxxx + and self.aaaaaaaaaaaa == other.aaaaaaaaaaaa + and self.bbbbbbbbbbb == other.bbbbbbbbbbb + and self.ccccccccccccccccc == other.ccccccccccccccccc + and self.ddddddddddddddddddddddd == other.ddddddddddddddddddddddd + and self.eeeeeeeeeeee == other.eeeeeeeeeeee + and self.ffffffffffffff == other.time_completed + and self.gggggg == other.gggggg and self.hhh == other.hhh + and len(self.iiiiiiii) == len(other.iiiiiiii) + and all(jjjjjjj in other.iiiiiiii for jjjjjjj in self.iiiiiiii)) + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig('{based_on_style: yapf, ' + 'split_before_logical_operator: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testB22527411(self): + unformatted_code = textwrap.dedent("""\ + def f(): + if True: + aaaaaa.bbbbbbbbbbbbbbbbbbbb[-1].cccccccccccccc.ddd().eeeeeeee(ffffffffffffff) + """) + expected_formatted_code = textwrap.dedent("""\ + def f(): + if True: + aaaaaa.bbbbbbbbbbbbbbbbbbbb[-1].cccccccccccccc.ddd().eeeeeeee( + ffffffffffffff) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB20849933(self): + unformatted_code = textwrap.dedent("""\ + def main(unused_argv): + if True: + aaaaaaaa = { + 'xxx': '%s/cccccc/ddddddddddddddddddd.jar' % + (eeeeee.FFFFFFFFFFFFFFFFFF), + } + """) + expected_formatted_code = textwrap.dedent("""\ + def main(unused_argv): + if True: + aaaaaaaa = { + 'xxx': + '%s/cccccc/ddddddddddddddddddd.jar' % (eeeeee.FFFFFFFFFFFFFFFFFF), + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB20813997(self): + code = textwrap.dedent("""\ + def myfunc_1(): + myarray = numpy.zeros((2, 2, 2)) + print(myarray[:, 1, :]) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB20605036(self): + code = textwrap.dedent("""\ + foo = { + 'aaaa': { + # A comment for no particular reason. + 'xxxxxxxx': 'bbbbbbbbb', + 'yyyyyyyyyyyyyyyyyy': 'cccccccccccccccccccccccccccccc' + 'dddddddddddddddddddddddddddddddddddddddddd', + } + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB20562732(self): + code = textwrap.dedent("""\ + foo = [ + # Comment about first list item + 'First item', + # Comment about second list item + 'Second item', + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB20128830(self): + code = textwrap.dedent("""\ + a = { + 'xxxxxxxxxxxxxxxxxxxx': { + 'aaaa': + 'mmmmmmm', + 'bbbbb': + 'mmmmmmmmmmmmmmmmmmmmm', + 'cccccccccc': [ + 'nnnnnnnnnnn', + 'ooooooooooo', + 'ppppppppppp', + 'qqqqqqqqqqq', + ], + }, + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB20073838(self): + code = textwrap.dedent("""\ + class DummyModel(object): + + def do_nothing(self, class_1_count): + if True: + class_0_count = num_votes - class_1_count + return ('{class_0_name}={class_0_count}, {class_1_name}={class_1_count}' + .format( + class_0_name=self.class_0_name, + class_0_count=class_0_count, + class_1_name=self.class_1_name, + class_1_count=class_1_count)) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB19626808(self): + code = textwrap.dedent("""\ + if True: + aaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbb( + 'ccccccccccc', ddddddddd='eeeee').fffffffff([ggggggggggggggggggggg]) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB19547210(self): + code = textwrap.dedent("""\ + while True: + if True: + if True: + if True: + if xxxxxxxxxxxx.yyyyyyy(aa).zzzzzzz() not in ( + xxxxxxxxxxxx.yyyyyyyyyyyyyy.zzzzzzzz, + xxxxxxxxxxxx.yyyyyyyyyyyyyy.zzzzzzzz): + continue + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB19377034(self): + code = textwrap.dedent("""\ + def f(): + if (aaaaaaaaaaaaaaa.start >= aaaaaaaaaaaaaaa.end or + bbbbbbbbbbbbbbb.start >= bbbbbbbbbbbbbbb.end): + return False + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB19372573(self): + code = textwrap.dedent("""\ + def f(): + if a: return 42 + while True: + if b: continue + if c: break + return 0 + """) + + try: + style.SetGlobalStyle(style.CreatePEP8Style()) + + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreateYapfStyle()) + + def testB19353268(self): + code = textwrap.dedent("""\ + a = {1, 2, 3}[x] + b = {'foo': 42, 'bar': 37}['foo'] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB19287512(self): + unformatted_code = textwrap.dedent("""\ + class Foo(object): + + def bar(self): + with xxxxxxxxxx.yyyyy( + 'aaaaaaa.bbbbbbbb.ccccccc.dddddddddddddddddddd.eeeeeeeeeee', + fffffffffff=(aaaaaaa.bbbbbbbb.ccccccc.dddddddddddddddddddd + .Mmmmmmmmmmmmmmmmmm(-1, 'permission error'))): + self.assertRaises(nnnnnnnnnnnnnnnn.ooooo, ppppp.qqqqqqqqqqqqqqqqq) + """) + expected_formatted_code = textwrap.dedent("""\ + class Foo(object): + + def bar(self): + with xxxxxxxxxx.yyyyy( + 'aaaaaaa.bbbbbbbb.ccccccc.dddddddddddddddddddd.eeeeeeeeeee', + fffffffffff=( + aaaaaaa.bbbbbbbb.ccccccc.dddddddddddddddddddd.Mmmmmmmmmmmmmmmmmm( + -1, 'permission error'))): + self.assertRaises(nnnnnnnnnnnnnnnn.ooooo, ppppp.qqqqqqqqqqqqqqqqq) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB19194420(self): + code = textwrap.dedent("""\ + method.Set( + 'long argument goes here that causes the line to break', + lambda arg2=0.5: arg2) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB19073499(self): + code = """\ +instance = ( + aaaaaaa.bbbbbbb().ccccccccccccccccc().ddddddddddd({ + 'aa': 'context!' + }).eeeeeeeeeeeeeeeeeee({ # Inline comment about why fnord has the value 6. + 'fnord': 6 + })) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB18257115(self): + code = textwrap.dedent("""\ + if True: + if True: + self._Test(aaaa, bbbbbbb.cccccccccc, dddddddd, eeeeeeeeeee, + [ffff, ggggggggggg, hhhhhhhhhhhh, iiiiii, jjjj]) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB18256666(self): + code = textwrap.dedent("""\ + class Foo(object): + + def Bar(self): + aaaaa.bbbbbbb( + ccc='ddddddddddddddd', + eeee='ffffffffffffffffffffff-%s-%s' % (gggg, int(time.time())), + hhhhhh={ + 'iiiiiiiiiii': iiiiiiiiiii, + 'jjjj': jjjj.jjjjj(), + 'kkkkkkkkkkkk': kkkkkkkkkkkk, + }, + llllllllll=mmmmmm.nnnnnnnnnnnnnnnn) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB18256826(self): + code = textwrap.dedent("""\ + if True: + pass + # A multiline comment. + # Line two. + elif False: + pass + + if True: + pass + # A multiline comment. + # Line two. + elif False: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB18255697(self): + code = textwrap.dedent("""\ + AAAAAAAAAAAAAAA = { + 'XXXXXXXXXXXXXX': 4242, # Inline comment + # Next comment + 'YYYYYYYYYYYYYYYY': ['zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'], + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testB17534869(self): + unformatted_code = textwrap.dedent("""\ + if True: + self.assertLess(abs(time.time()-aaaa.bbbbbbbbbbb( + datetime.datetime.now())), 1) + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + self.assertLess( + abs(time.time() - aaaa.bbbbbbbbbbb(datetime.datetime.now())), 1) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB17489866(self): + unformatted_code = textwrap.dedent("""\ + def f(): + if True: + if True: + return aaaa.bbbbbbbbb(ccccccc=dddddddddddddd({('eeee', \ +'ffffffff'): str(j)})) + """) + expected_formatted_code = textwrap.dedent("""\ + def f(): + if True: + if True: + return aaaa.bbbbbbbbb( + ccccccc=dddddddddddddd({('eeee', 'ffffffff'): str(j)})) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB17133019(self): + unformatted_code = textwrap.dedent("""\ + class aaaaaaaaaaaaaa(object): + + def bbbbbbbbbb(self): + with io.open("/dev/null", "rb"): + with io.open(os.path.join(aaaaa.bbbbb.ccccccccccc, + DDDDDDDDDDDDDDD, + "eeeeeeeee ffffffffff" + ), "rb") as gggggggggggggggggggg: + print(gggggggggggggggggggg) + """) + expected_formatted_code = textwrap.dedent("""\ + class aaaaaaaaaaaaaa(object): + + def bbbbbbbbbb(self): + with io.open("/dev/null", "rb"): + with io.open( + os.path.join(aaaaa.bbbbb.ccccccccccc, DDDDDDDDDDDDDDD, + "eeeeeeeee ffffffffff"), "rb") as gggggggggggggggggggg: + print(gggggggggggggggggggg) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB17011869(self): + unformatted_code = textwrap.dedent("""\ + '''blah......''' + + class SomeClass(object): + '''blah.''' + + AAAAAAAAAAAA = { # Comment. + 'BBB': 1.0, + 'DDDDDDDD': 0.4811 + } + """) + expected_formatted_code = textwrap.dedent("""\ + '''blah......''' + + + class SomeClass(object): + '''blah.''' + + AAAAAAAAAAAA = { # Comment. + 'BBB': 1.0, + 'DDDDDDDD': 0.4811 + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB16783631(self): + unformatted_code = textwrap.dedent("""\ + if True: + with aaaaaaaaaaaaaa.bbbbbbbbbbbbb.ccccccc(ddddddddddddd, + eeeeeeeee=self.fffffffffffff + )as gggg: + pass + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + with aaaaaaaaaaaaaa.bbbbbbbbbbbbb.ccccccc( + ddddddddddddd, eeeeeeeee=self.fffffffffffff) as gggg: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB16572361(self): + unformatted_code = textwrap.dedent("""\ + def foo(self): + def bar(my_dict_name): + self.my_dict_name['foo-bar-baz-biz-boo-baa-baa'].IncrementBy.assert_called_once_with('foo_bar_baz_boo') + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(self): + + def bar(my_dict_name): + self.my_dict_name[ + 'foo-bar-baz-biz-boo-baa-baa'].IncrementBy.assert_called_once_with( + 'foo_bar_baz_boo') + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB15884241(self): + unformatted_code = textwrap.dedent("""\ + if 1: + if 1: + for row in AAAA: + self.create(aaaaaaaa="/aaa/bbbb/cccc/dddddd/eeeeeeeeeeeeeeeeeeeeeeeeee/%s" % row [0].replace(".foo", ".bar"), aaaaa=bbb[1], ccccc=bbb[2], dddd=bbb[3], eeeeeeeeeee=[s.strip() for s in bbb[4].split(",")], ffffffff=[s.strip() for s in bbb[5].split(",")], gggggg=bbb[6]) + """) + expected_formatted_code = textwrap.dedent("""\ + if 1: + if 1: + for row in AAAA: + self.create( + aaaaaaaa="/aaa/bbbb/cccc/dddddd/eeeeeeeeeeeeeeeeeeeeeeeeee/%s" % + row[0].replace(".foo", ".bar"), + aaaaa=bbb[1], + ccccc=bbb[2], + dddd=bbb[3], + eeeeeeeeeee=[s.strip() for s in bbb[4].split(",")], + ffffffff=[s.strip() for s in bbb[5].split(",")], + gggggg=bbb[6]) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB15697268(self): + unformatted_code = textwrap.dedent("""\ + def main(unused_argv): + ARBITRARY_CONSTANT_A = 10 + an_array_with_an_exceedingly_long_name = range(ARBITRARY_CONSTANT_A + 1) + ok = an_array_with_an_exceedingly_long_name[:ARBITRARY_CONSTANT_A] + bad_slice = map(math.sqrt, an_array_with_an_exceedingly_long_name[:ARBITRARY_CONSTANT_A]) + a_long_name_slicing = an_array_with_an_exceedingly_long_name[:ARBITRARY_CONSTANT_A] + bad_slice = ("I am a crazy, no good, string whats too long, etc." + " no really ")[:ARBITRARY_CONSTANT_A] + """) + expected_formatted_code = textwrap.dedent("""\ + def main(unused_argv): + ARBITRARY_CONSTANT_A = 10 + an_array_with_an_exceedingly_long_name = range(ARBITRARY_CONSTANT_A + 1) + ok = an_array_with_an_exceedingly_long_name[:ARBITRARY_CONSTANT_A] + bad_slice = map(math.sqrt, + an_array_with_an_exceedingly_long_name[:ARBITRARY_CONSTANT_A]) + a_long_name_slicing = an_array_with_an_exceedingly_long_name[: + ARBITRARY_CONSTANT_A] + bad_slice = ("I am a crazy, no good, string whats too long, etc." + + " no really ")[:ARBITRARY_CONSTANT_A] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB15597568(self): + unformatted_code = """\ +if True: + if True: + if True: + print(("Return code was %d" + (", and the process timed out." if did_time_out else ".")) % errorcode) +""" + expected_formatted_code = """\ +if True: + if True: + if True: + print(("Return code was %d" + + (", and the process timed out." if did_time_out else ".")) % + errorcode) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB15542157(self): + unformatted_code = textwrap.dedent("""\ + aaaaaaaaaaaa = bbbb.ccccccccccccccc(dddddd.eeeeeeeeeeeeee, ffffffffffffffffff, gggggg.hhhhhhhhhhhhhhhhh) + """) + expected_formatted_code = textwrap.dedent("""\ + aaaaaaaaaaaa = bbbb.ccccccccccccccc(dddddd.eeeeeeeeeeeeee, ffffffffffffffffff, + gggggg.hhhhhhhhhhhhhhhhh) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB15438132(self): + unformatted_code = textwrap.dedent("""\ + if aaaaaaa.bbbbbbbbbb: + cccccc.dddddddddd(eeeeeeeeeee=fffffffffffff.gggggggggggggggggg) + if hhhhhh.iiiii.jjjjjjjjjjjjj: + # This is a comment in the middle of it all. + kkkkkkk.llllllllll.mmmmmmmmmmmmm = True + if (aaaaaa.bbbbb.ccccccccccccc != ddddddd.eeeeeeeeee.fffffffffffff or + eeeeee.fffff.ggggggggggggggggggggggggggg() != hhhhhhh.iiiiiiiiii.jjjjjjjjjjjj): + aaaaaaaa.bbbbbbbbbbbb( + aaaaaa.bbbbb.cc, + dddddddddddd=eeeeeeeeeeeeeeeeeee.fffffffffffffffff( + gggggg.hh, + iiiiiiiiiiiiiiiiiii.jjjjjjjjjj.kkkkkkk, + lllll.mm), + nnnnnnnnnn=ooooooo.pppppppppp) + """) + expected_formatted_code = textwrap.dedent("""\ + if aaaaaaa.bbbbbbbbbb: + cccccc.dddddddddd(eeeeeeeeeee=fffffffffffff.gggggggggggggggggg) + if hhhhhh.iiiii.jjjjjjjjjjjjj: + # This is a comment in the middle of it all. + kkkkkkk.llllllllll.mmmmmmmmmmmmm = True + if (aaaaaa.bbbbb.ccccccccccccc != ddddddd.eeeeeeeeee.fffffffffffff or + eeeeee.fffff.ggggggggggggggggggggggggggg() != + hhhhhhh.iiiiiiiiii.jjjjjjjjjjjj): + aaaaaaaa.bbbbbbbbbbbb( + aaaaaa.bbbbb.cc, + dddddddddddd=eeeeeeeeeeeeeeeeeee.fffffffffffffffff( + gggggg.hh, iiiiiiiiiiiiiiiiiii.jjjjjjjjjj.kkkkkkk, lllll.mm), + nnnnnnnnnn=ooooooo.pppppppppp) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB14468247(self): + unformatted_code = """\ +call(a=1, + b=2, +) +""" + expected_formatted_code = """\ +call( + a=1, + b=2, +) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB14406499(self): + unformatted_code = textwrap.dedent("""\ + def foo1(parameter_1, parameter_2, parameter_3, parameter_4, \ +parameter_5, parameter_6): pass + """) + expected_formatted_code = textwrap.dedent("""\ + def foo1(parameter_1, parameter_2, parameter_3, parameter_4, parameter_5, + parameter_6): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB13900309(self): + unformatted_code = textwrap.dedent("""\ + self.aaaaaaaaaaa( # A comment in the middle of it all. + 948.0/3600, self.bbb.ccccccccccccccccccccc(dddddddddddddddd.eeee, True)) + """) + expected_formatted_code = textwrap.dedent("""\ + self.aaaaaaaaaaa( # A comment in the middle of it all. + 948.0 / 3600, self.bbb.ccccccccccccccccccccc(dddddddddddddddd.eeee, True)) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + code = textwrap.dedent("""\ + aaaaaaaaaa.bbbbbbbbbbbbbbbbbbbbbbbb.cccccccccccccccccccccccccccccc( + DC_1, (CL - 50, CL), AAAAAAAA, BBBBBBBBBBBBBBBB, 98.0, + CCCCCCC).ddddddddd( # Look! A comment is here. + AAAAAAAA - (20 * 60 - 5)) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + aaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbb.ccccccccccccccccccccccccc().dddddddddddddddddddddddddd(1, 2, 3, 4) + """) + expected_formatted_code = textwrap.dedent("""\ + aaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbb.ccccccccccccccccccccccccc( + ).dddddddddddddddddddddddddd(1, 2, 3, 4) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + aaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbb.ccccccccccccccccccccccccc(x).dddddddddddddddddddddddddd(1, 2, 3, 4) + """) + expected_formatted_code = textwrap.dedent("""\ + aaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbb.ccccccccccccccccccccccccc( + x).dddddddddddddddddddddddddd(1, 2, 3, 4) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + aaaaaaaaaaaaaaaaaaaaaaaa(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx).dddddddddddddddddddddddddd(1, 2, 3, 4) + """) + expected_formatted_code = textwrap.dedent("""\ + aaaaaaaaaaaaaaaaaaaaaaaa( + xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx).dddddddddddddddddddddddddd(1, 2, 3, 4) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + aaaaaaaaaaaaaaaaaaaaaaaa().bbbbbbbbbbbbbbbbbbbbbbbb().ccccccccccccccccccc().\ +dddddddddddddddddd().eeeeeeeeeeeeeeeeeeeee().fffffffffffffffff().gggggggggggggggggg() + """) + expected_formatted_code = textwrap.dedent("""\ + aaaaaaaaaaaaaaaaaaaaaaaa().bbbbbbbbbbbbbbbbbbbbbbbb().ccccccccccccccccccc( + ).dddddddddddddddddd().eeeeeeeeeeeeeeeeeeeee().fffffffffffffffff( + ).gggggggggggggggggg() + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testB67935687(self): + code = textwrap.dedent("""\ + Fetch( + Raw('monarch.BorgTask', '/union/row_operator_action_delay'), + {'borg_user': self.borg_user}) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + shelf_renderer.expand_text = text.translate_to_unicode( + expand_text % { + 'creator': creator + }) + """) + expected_formatted_code = textwrap.dedent("""\ + shelf_renderer.expand_text = text.translate_to_unicode(expand_text % + {'creator': creator}) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/reformatter_facebook_test.py b/.venv/lib/python3.9/site-packages/yapftests/reformatter_facebook_test.py new file mode 100644 index 00000000..289aa853 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/reformatter_facebook_test.py @@ -0,0 +1,432 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Facebook tests for yapf.reformatter.""" + +import textwrap +import unittest + +from yapf.yapflib import reformatter +from yapf.yapflib import style + +from yapftests import yapf_test_helper + + +class TestsForFacebookStyle(yapf_test_helper.YAPFTest): + + @classmethod + def setUpClass(cls): + style.SetGlobalStyle(style.CreateFacebookStyle()) + + def testNoNeedForLineBreaks(self): + unformatted_code = textwrap.dedent("""\ + def overly_long_function_name( + just_one_arg, **kwargs): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def overly_long_function_name(just_one_arg, **kwargs): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testDedentClosingBracket(self): + unformatted_code = textwrap.dedent("""\ + def overly_long_function_name( + first_argument_on_the_same_line, + second_argument_makes_the_line_too_long): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def overly_long_function_name( + first_argument_on_the_same_line, second_argument_makes_the_line_too_long + ): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testBreakAfterOpeningBracketIfContentsTooBig(self): + unformatted_code = textwrap.dedent("""\ + def overly_long_function_name(a, b, c, d, e, f, g, h, i, j, k, l, m, + n, o, p, q, r, s, t, u, v, w, x, y, z): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def overly_long_function_name( + a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, \ +v, w, x, y, z + ): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testDedentClosingBracketWithComments(self): + unformatted_code = textwrap.dedent("""\ + def overly_long_function_name( + # comment about the first argument + first_argument_with_a_very_long_name_or_so, + # comment about the second argument + second_argument_makes_the_line_too_long): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def overly_long_function_name( + # comment about the first argument + first_argument_with_a_very_long_name_or_so, + # comment about the second argument + second_argument_makes_the_line_too_long + ): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testDedentImportAsNames(self): + code = textwrap.dedent("""\ + from module import ( + internal_function as function, + SOME_CONSTANT_NUMBER1, + SOME_CONSTANT_NUMBER2, + SOME_CONSTANT_NUMBER3, + ) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testDedentTestListGexp(self): + unformatted_code = textwrap.dedent("""\ + try: + pass + except ( + IOError, OSError, LookupError, RuntimeError, OverflowError + ) as exception: + pass + + try: + pass + except ( + IOError, OSError, LookupError, RuntimeError, OverflowError, + ) as exception: + pass + """) + expected_formatted_code = textwrap.dedent("""\ + try: + pass + except ( + IOError, OSError, LookupError, RuntimeError, OverflowError + ) as exception: + pass + + try: + pass + except ( + IOError, + OSError, + LookupError, + RuntimeError, + OverflowError, + ) as exception: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testBrokenIdempotency(self): + # TODO(ambv): The following behaviour should be fixed. + pass0_code = textwrap.dedent("""\ + try: + pass + except (IOError, OSError, LookupError, RuntimeError, OverflowError) as exception: + pass + """) + pass1_code = textwrap.dedent("""\ + try: + pass + except ( + IOError, OSError, LookupError, RuntimeError, OverflowError + ) as exception: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(pass0_code) + self.assertCodeEqual(pass1_code, reformatter.Reformat(uwlines)) + + pass2_code = textwrap.dedent("""\ + try: + pass + except ( + IOError, OSError, LookupError, RuntimeError, OverflowError + ) as exception: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(pass1_code) + self.assertCodeEqual(pass2_code, reformatter.Reformat(uwlines)) + + def testIfExprHangingIndent(self): + unformatted_code = textwrap.dedent("""\ + if True: + if True: + if True: + if not self.frobbies and ( + self.foobars.counters['db.cheeses'] != 1 or + self.foobars.counters['db.marshmellow_skins'] != 1): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + if True: + if True: + if not self.frobbies and ( + self.foobars.counters['db.cheeses'] != 1 or + self.foobars.counters['db.marshmellow_skins'] != 1 + ): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSimpleDedenting(self): + unformatted_code = textwrap.dedent("""\ + if True: + self.assertEqual(result.reason_not_added, "current preflight is still running") + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + self.assertEqual( + result.reason_not_added, "current preflight is still running" + ) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testDedentingWithSubscripts(self): + unformatted_code = textwrap.dedent("""\ + class Foo: + class Bar: + @classmethod + def baz(cls, clues_list, effect, constraints, constraint_manager): + if clues_lists: + return cls.single_constraint_not(clues_lists, effect, constraints[0], constraint_manager) + + """) + expected_formatted_code = textwrap.dedent("""\ + class Foo: + class Bar: + @classmethod + def baz(cls, clues_list, effect, constraints, constraint_manager): + if clues_lists: + return cls.single_constraint_not( + clues_lists, effect, constraints[0], constraint_manager + ) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testDedentingCallsWithInnerLists(self): + code = textwrap.dedent("""\ + class _(): + def _(): + cls.effect_clues = { + 'effect': Clue((cls.effect_time, 'apache_host'), effect_line, 40) + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testDedentingListComprehension(self): + unformatted_code = textwrap.dedent("""\ + class Foo(): + def _pack_results_for_constraint_or(): + self.param_groups = dict( + ( + key + 1, ParamGroup(groups[key], default_converter) + ) for key in six.moves.range(len(groups)) + ) + + for combination in cls._clues_combinations(clues_lists): + if all( + cls._verify_constraint(combination, effect, constraint) + for constraint in constraints + ): + pass + + guessed_dict = dict( + ( + key, guessed_pattern_matches[key] + ) for key in six.moves.range(len(guessed_pattern_matches)) + ) + + content = "".join( + itertools.chain( + (first_line_fragment, ), lines_between, (last_line_fragment, ) + ) + ) + + rule = Rule( + [self.cause1, self.cause2, self.cause1, self.cause2], self.effect, constraints1, + Rule.LINKAGE_AND + ) + + assert sorted(log_type.files_to_parse) == [ + ('localhost', os.path.join(path, 'node_1.log'), super_parser), + ('localhost', os.path.join(path, 'node_2.log'), super_parser) + ] + """) + expected_formatted_code = textwrap.dedent("""\ + class Foo(): + def _pack_results_for_constraint_or(): + self.param_groups = dict( + (key + 1, ParamGroup(groups[key], default_converter)) + for key in six.moves.range(len(groups)) + ) + + for combination in cls._clues_combinations(clues_lists): + if all( + cls._verify_constraint(combination, effect, constraint) + for constraint in constraints + ): + pass + + guessed_dict = dict( + (key, guessed_pattern_matches[key]) + for key in six.moves.range(len(guessed_pattern_matches)) + ) + + content = "".join( + itertools.chain( + (first_line_fragment, ), lines_between, (last_line_fragment, ) + ) + ) + + rule = Rule( + [self.cause1, self.cause2, self.cause1, self.cause2], self.effect, + constraints1, Rule.LINKAGE_AND + ) + + assert sorted(log_type.files_to_parse) == [ + ('localhost', os.path.join(path, 'node_1.log'), super_parser), + ('localhost', os.path.join(path, 'node_2.log'), super_parser) + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testMustSplitDedenting(self): + code = textwrap.dedent("""\ + class _(): + def _(): + effect_line = FrontInput( + effect_line_offset, line_content, + LineSource('localhost', xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) + ) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testDedentIfConditional(self): + code = textwrap.dedent("""\ + class _(): + def _(): + if True: + if not self.frobbies and ( + self.foobars.counters['db.cheeses'] != 1 or + self.foobars.counters['db.marshmellow_skins'] != 1 + ): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testDedentSet(self): + code = textwrap.dedent("""\ + class _(): + def _(): + assert set(self.constraint_links.get_links()) == set( + [ + (2, 10, 100), + (2, 10, 200), + (2, 20, 100), + (2, 20, 200), + ] + ) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testDedentingInnerScope(self): + code = textwrap.dedent("""\ + class Foo(): + @classmethod + def _pack_results_for_constraint_or(cls, combination, constraints): + return cls._create_investigation_result( + (clue for clue in combination if not clue == Verifier.UNMATCHED), + constraints, InvestigationResult.OR + ) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + reformatted_code = reformatter.Reformat(uwlines) + self.assertCodeEqual(code, reformatted_code) + + uwlines = yapf_test_helper.ParseAndUnwrap(reformatted_code) + reformatted_code = reformatter.Reformat(uwlines) + self.assertCodeEqual(code, reformatted_code) + + def testCommentWithNewlinesInPrefix(self): + unformatted_code = textwrap.dedent("""\ + def foo(): + if 0: + return False + + + #a deadly comment + elif 1: + return True + + + print(foo()) + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): + if 0: + return False + + #a deadly comment + elif 1: + return True + + + print(foo()) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testIfStmtClosingBracket(self): + unformatted_code = """\ +if (isinstance(value , (StopIteration , StopAsyncIteration )) and exc.__cause__ is value_asdfasdfasdfasdfsafsafsafdasfasdfs): + return False +""" + expected_formatted_code = """\ +if ( + isinstance(value, (StopIteration, StopAsyncIteration)) and + exc.__cause__ is value_asdfasdfasdfasdfsafsafsafdasfasdfs +): + return False +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/reformatter_pep8_test.py b/.venv/lib/python3.9/site-packages/yapftests/reformatter_pep8_test.py new file mode 100644 index 00000000..bdd074a7 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/reformatter_pep8_test.py @@ -0,0 +1,919 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""PEP8 tests for yapf.reformatter.""" + +import textwrap +import unittest + +from yapf.yapflib import py3compat +from yapf.yapflib import reformatter +from yapf.yapflib import style + +from yapftests import yapf_test_helper + + +class TestsForPEP8Style(yapf_test_helper.YAPFTest): + + @classmethod + def setUpClass(cls): # pylint: disable=g-missing-super-call + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testIndent4(self): + unformatted_code = textwrap.dedent("""\ + if a+b: + pass + """) + expected_formatted_code = textwrap.dedent("""\ + if a + b: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSingleLineIfStatements(self): + code = textwrap.dedent("""\ + if True: a = 42 + elif False: b = 42 + else: c = 42 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testNoBlankBetweenClassAndDef(self): + unformatted_code = textwrap.dedent("""\ + class Foo: + + def joe(): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + class Foo: + def joe(): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testNoBlankBetweenDefsInClass(self): + unformatted_code = textwrap.dedent('''\ + class TestClass: + def __init__(self): + self.running = False + def run(self): + """Override in subclass""" + def is_running(self): + return self.running + ''') + expected_formatted_code = textwrap.dedent('''\ + class TestClass: + def __init__(self): + self.running = False + + def run(self): + """Override in subclass""" + + def is_running(self): + return self.running + ''') + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSingleWhiteBeforeTrailingComment(self): + unformatted_code = textwrap.dedent("""\ + if a+b: # comment + pass + """) + expected_formatted_code = textwrap.dedent("""\ + if a + b: # comment + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSpaceBetweenEndingCommandAndClosingBracket(self): + unformatted_code = textwrap.dedent("""\ + a = ( + 1, + ) + """) + expected_formatted_code = textwrap.dedent("""\ + a = (1, ) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testContinuedNonOutdentedLine(self): + code = textwrap.dedent("""\ + class eld(d): + if str(geom.geom_type).upper( + ) != self.geom_type and not self.geom_type == 'GEOMETRY': + ror(code='om_type') + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testWrappingPercentExpressions(self): + unformatted_code = textwrap.dedent("""\ + def f(): + if True: + zzzzz = '%s-%s' % (xxxxxxxxxxxxxxxxxxxxxxxxxx + 1, xxxxxxxxxxxxxxxxx.yyy + 1) + zzzzz = '%s-%s'.ww(xxxxxxxxxxxxxxxxxxxxxxxxxx + 1, xxxxxxxxxxxxxxxxx.yyy + 1) + zzzzz = '%s-%s' % (xxxxxxxxxxxxxxxxxxxxxxx + 1, xxxxxxxxxxxxxxxxxxxxx + 1) + zzzzz = '%s-%s'.ww(xxxxxxxxxxxxxxxxxxxxxxx + 1, xxxxxxxxxxxxxxxxxxxxx + 1) + """) + expected_formatted_code = textwrap.dedent("""\ + def f(): + if True: + zzzzz = '%s-%s' % (xxxxxxxxxxxxxxxxxxxxxxxxxx + 1, + xxxxxxxxxxxxxxxxx.yyy + 1) + zzzzz = '%s-%s'.ww(xxxxxxxxxxxxxxxxxxxxxxxxxx + 1, + xxxxxxxxxxxxxxxxx.yyy + 1) + zzzzz = '%s-%s' % (xxxxxxxxxxxxxxxxxxxxxxx + 1, + xxxxxxxxxxxxxxxxxxxxx + 1) + zzzzz = '%s-%s'.ww(xxxxxxxxxxxxxxxxxxxxxxx + 1, + xxxxxxxxxxxxxxxxxxxxx + 1) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testAlignClosingBracketWithVisualIndentation(self): + unformatted_code = textwrap.dedent("""\ + TEST_LIST = ('foo', 'bar', # first comment + 'baz' # second comment + ) + """) + expected_formatted_code = textwrap.dedent("""\ + TEST_LIST = ( + 'foo', + 'bar', # first comment + 'baz' # second comment + ) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + def f(): + + def g(): + while (xxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz].aaaaaaaa[0]) == 'bbbbbbb' + ): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def f(): + def g(): + while (xxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz]) == 'aaaaaaaaaaa' + and xxxxxxxxxxxxxxxxxxxx( + yyyyyyyyyyyyy[zzzzz].aaaaaaaa[0]) == 'bbbbbbb'): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testIndentSizeChanging(self): + unformatted_code = textwrap.dedent("""\ + if True: + runtime_mins = (program_end_time - program_start_time).total_seconds() / 60.0 + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + runtime_mins = (program_end_time - + program_start_time).total_seconds() / 60.0 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testHangingIndentCollision(self): + unformatted_code = textwrap.dedent("""\ + if (aaaaaaaaaaaaaa + bbbbbbbbbbbbbbbb == ccccccccccccccccc and xxxxxxxxxxxxx or yyyyyyyyyyyyyyyyy): + pass + elif (xxxxxxxxxxxxxxx(aaaaaaaaaaa, bbbbbbbbbbbbbb, cccccccccccc, dddddddddd=None)): + pass + + + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + for connection in itertools.chain(branch.contact, branch.address, morestuff.andmore.andmore.andmore.andmore.andmore.andmore.andmore): + dosomething(connection) + """) + expected_formatted_code = textwrap.dedent("""\ + if (aaaaaaaaaaaaaa + bbbbbbbbbbbbbbbb == ccccccccccccccccc and xxxxxxxxxxxxx + or yyyyyyyyyyyyyyyyy): + pass + elif (xxxxxxxxxxxxxxx(aaaaaaaaaaa, + bbbbbbbbbbbbbb, + cccccccccccc, + dddddddddd=None)): + pass + + + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + for connection in itertools.chain( + branch.contact, branch.address, + morestuff.andmore.andmore.andmore.andmore.andmore.andmore.andmore): + dosomething(connection) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSplittingBeforeLogicalOperator(self): + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: pep8, split_before_logical_operator: True}')) + unformatted_code = textwrap.dedent("""\ + def foo(): + return bool(update.message.new_chat_member or update.message.left_chat_member or + update.message.new_chat_title or update.message.new_chat_photo or + update.message.delete_chat_photo or update.message.group_chat_created or + update.message.supergroup_chat_created or update.message.channel_chat_created + or update.message.migrate_to_chat_id or update.message.migrate_from_chat_id or + update.message.pinned_message) + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): + return bool( + update.message.new_chat_member or update.message.left_chat_member + or update.message.new_chat_title or update.message.new_chat_photo + or update.message.delete_chat_photo + or update.message.group_chat_created + or update.message.supergroup_chat_created + or update.message.channel_chat_created + or update.message.migrate_to_chat_id + or update.message.migrate_from_chat_id + or update.message.pinned_message) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testContiguousListEndingWithComment(self): + unformatted_code = textwrap.dedent("""\ + if True: + if True: + keys.append(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) # may be unassigned. + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + if True: + keys.append( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) # may be unassigned. + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSplittingBeforeFirstArgument(self): + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: pep8, split_before_first_argument: True}')) + unformatted_code = textwrap.dedent("""\ + a_very_long_function_name(long_argument_name_1=1, long_argument_name_2=2, + long_argument_name_3=3, long_argument_name_4=4) + """) + expected_formatted_code = textwrap.dedent("""\ + a_very_long_function_name( + long_argument_name_1=1, + long_argument_name_2=2, + long_argument_name_3=3, + long_argument_name_4=4) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testSplittingExpressionsInsideSubscripts(self): + unformatted_code = textwrap.dedent("""\ + def foo(): + df = df[(df['campaign_status'] == 'LIVE') & (df['action_status'] == 'LIVE')] + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): + df = df[(df['campaign_status'] == 'LIVE') + & (df['action_status'] == 'LIVE')] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSplitListsAndDictSetMakersIfCommaTerminated(self): + unformatted_code = textwrap.dedent("""\ + DJANGO_TEMPLATES_OPTIONS = {"context_processors": []} + DJANGO_TEMPLATES_OPTIONS = {"context_processors": [],} + x = ["context_processors"] + x = ["context_processors",] + """) + expected_formatted_code = textwrap.dedent("""\ + DJANGO_TEMPLATES_OPTIONS = {"context_processors": []} + DJANGO_TEMPLATES_OPTIONS = { + "context_processors": [], + } + x = ["context_processors"] + x = [ + "context_processors", + ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSplitAroundNamedAssigns(self): + unformatted_code = textwrap.dedent("""\ + class a(): + def a(): return a( + aaaaaaaaaa=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) + """) + expected_formatted_code = textwrap.dedent("""\ + class a(): + def a(): + return a( + aaaaaaaaaa=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testUnaryOperator(self): + unformatted_code = textwrap.dedent("""\ + if not -3 < x < 3: + pass + if -3 < x < 3: + pass + """) + expected_formatted_code = textwrap.dedent("""\ + if not -3 < x < 3: + pass + if -3 < x < 3: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testNoSplitBeforeDictValue(self): + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig('{based_on_style: pep8, ' + 'allow_split_before_dict_value: false, ' + 'coalesce_brackets: true, ' + 'dedent_closing_brackets: true, ' + 'each_dict_entry_on_separate_line: true, ' + 'split_before_logical_operator: true}')) + + unformatted_code = textwrap.dedent("""\ + some_dict = { + 'title': _("I am example data"), + 'description': _("Lorem ipsum dolor met sit amet elit, si vis pacem para bellum " + "elites nihi very long string."), + } + """) + expected_formatted_code = textwrap.dedent("""\ + some_dict = { + 'title': _("I am example data"), + 'description': _( + "Lorem ipsum dolor met sit amet elit, si vis pacem para bellum " + "elites nihi very long string." + ), + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + X = {'a': 1, 'b': 2, 'key': this_is_a_function_call_that_goes_over_the_column_limit_im_pretty_sure()} + """) + expected_formatted_code = textwrap.dedent("""\ + X = { + 'a': 1, + 'b': 2, + 'key': this_is_a_function_call_that_goes_over_the_column_limit_im_pretty_sure() + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + attrs = { + 'category': category, + 'role': forms.ModelChoiceField(label=_("Role"), required=False, queryset=category_roles, initial=selected_role, empty_label=_("No access"),), + } + """) + expected_formatted_code = textwrap.dedent("""\ + attrs = { + 'category': category, + 'role': forms.ModelChoiceField( + label=_("Role"), + required=False, + queryset=category_roles, + initial=selected_role, + empty_label=_("No access"), + ), + } + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + + unformatted_code = textwrap.dedent("""\ + css_class = forms.CharField( + label=_("CSS class"), + required=False, + help_text=_("Optional CSS class used to customize this category appearance from templates."), + ) + """) + expected_formatted_code = textwrap.dedent("""\ + css_class = forms.CharField( + label=_("CSS class"), + required=False, + help_text=_( + "Optional CSS class used to customize this category appearance from templates." + ), + ) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testBitwiseOperandSplitting(self): + unformatted_code = """\ +def _(): + include_values = np.where( + (cdffile['Quality_Flag'][:] >= 5) & ( + cdffile['Day_Night_Flag'][:] == 1) & ( + cdffile['Longitude'][:] >= select_lon - radius) & ( + cdffile['Longitude'][:] <= select_lon + radius) & ( + cdffile['Latitude'][:] >= select_lat - radius) & ( + cdffile['Latitude'][:] <= select_lat + radius)) +""" + expected_code = """\ +def _(): + include_values = np.where( + (cdffile['Quality_Flag'][:] >= 5) & (cdffile['Day_Night_Flag'][:] == 1) + & (cdffile['Longitude'][:] >= select_lon - radius) + & (cdffile['Longitude'][:] <= select_lon + radius) + & (cdffile['Latitude'][:] >= select_lat - radius) + & (cdffile['Latitude'][:] <= select_lat + radius)) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertEqual(expected_code, reformatter.Reformat(uwlines)) + + def testNoBlankLinesOnlyForFirstNestedObject(self): + unformatted_code = '''\ +class Demo: + """ + Demo docs + """ + def foo(self): + """ + foo docs + """ + def bar(self): + """ + bar docs + """ +''' + expected_code = '''\ +class Demo: + """ + Demo docs + """ + def foo(self): + """ + foo docs + """ + + def bar(self): + """ + bar docs + """ +''' + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertEqual(expected_code, reformatter.Reformat(uwlines)) + + def testSplitBeforeArithmeticOperators(self): + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: pep8, split_before_arithmetic_operator: true}')) + + unformatted_code = """\ +def _(): + raise ValueError('This is a long message that ends with an argument: ' + str(42)) +""" + expected_formatted_code = """\ +def _(): + raise ValueError('This is a long message that ends with an argument: ' + + str(42)) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testListSplitting(self): + unformatted_code = """\ +foo([(1,1), (1,1), (1,1), (1,1), (1,1), (1,1), (1,1), + (1,1), (1,1), (1,1), (1,1), (1,1), (1,1), (1,1), + (1,10), (1,11), (1, 10), (1,11), (10,11)]) +""" + expected_code = """\ +foo([(1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), + (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 10), (1, 11), (1, 10), + (1, 11), (10, 11)]) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines)) + + def testNoBlankLineBeforeNestedFuncOrClass(self): + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: pep8, ' + 'blank_line_before_nested_class_or_def: false}')) + + unformatted_code = '''\ +def normal_function(): + """Return the nested function.""" + + def nested_function(): + """Do nothing just nest within.""" + + @nested(klass) + class nested_class(): + pass + + pass + + return nested_function +''' + expected_formatted_code = '''\ +def normal_function(): + """Return the nested function.""" + def nested_function(): + """Do nothing just nest within.""" + @nested(klass) + class nested_class(): + pass + + pass + + return nested_function +''' + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testParamListIndentationCollision1(self): + unformatted_code = textwrap.dedent("""\ +class _(): + + def __init__(self, title: Optional[str], diffs: Collection[BinaryDiff] = (), charset: Union[Type[AsciiCharset], Type[LineCharset]] = AsciiCharset, preprocess: Callable[[str], str] = identity, + # TODO(somebody): Make this a Literal type. + justify: str = 'rjust'): + self._cs = charset + self._preprocess = preprocess + """) + expected_formatted_code = textwrap.dedent("""\ +class _(): + def __init__( + self, + title: Optional[str], + diffs: Collection[BinaryDiff] = (), + charset: Union[Type[AsciiCharset], + Type[LineCharset]] = AsciiCharset, + preprocess: Callable[[str], str] = identity, + # TODO(somebody): Make this a Literal type. + justify: str = 'rjust'): + self._cs = charset + self._preprocess = preprocess + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testParamListIndentationCollision2(self): + code = textwrap.dedent("""\ + def simple_pass_function_with_an_extremely_long_name_and_some_arguments( + argument0, argument1): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testParamListIndentationCollision3(self): + code = textwrap.dedent("""\ + def func1( + arg1, + arg2, + ) -> None: + pass + + + def func2( + arg1, + arg2, + ): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testTwoWordComparisonOperators(self): + unformatted_code = textwrap.dedent("""\ + _ = (klsdfjdklsfjksdlfjdklsfjdslkfjsdkl is not ksldfjsdklfjdklsfjdklsfjdklsfjdsklfjdklsfj) + _ = (klsdfjdklsfjksdlfjdklsfjdslkfjsdkl not in {ksldfjsdklfjdklsfjdklsfjdklsfjdsklfjdklsfj}) + """) + expected_formatted_code = textwrap.dedent("""\ + _ = (klsdfjdklsfjksdlfjdklsfjdslkfjsdkl + is not ksldfjsdklfjdklsfjdklsfjdklsfjdsklfjdklsfj) + _ = (klsdfjdklsfjksdlfjdklsfjdslkfjsdkl + not in {ksldfjsdklfjdklsfjdklsfjdklsfjdsklfjdklsfj}) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + @unittest.skipUnless(not py3compat.PY3, 'Requires Python 2.7') + def testAsyncAsNonKeyword(self): + # In Python 2, async may be used as a non-keyword identifier. + code = textwrap.dedent("""\ + from util import async + + + class A(object): + def foo(self): + async.run() + + def bar(self): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines, verify=False)) + + def testStableInlinedDictionaryFormatting(self): + unformatted_code = textwrap.dedent("""\ + def _(): + url = "http://{0}/axis-cgi/admin/param.cgi?{1}".format( + value, urllib.urlencode({'action': 'update', 'parameter': value})) + """) + expected_formatted_code = textwrap.dedent("""\ + def _(): + url = "http://{0}/axis-cgi/admin/param.cgi?{1}".format( + value, urllib.urlencode({ + 'action': 'update', + 'parameter': value + })) + """) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + reformatted_code = reformatter.Reformat(uwlines) + self.assertCodeEqual(expected_formatted_code, reformatted_code) + + uwlines = yapf_test_helper.ParseAndUnwrap(reformatted_code) + reformatted_code = reformatter.Reformat(uwlines) + self.assertCodeEqual(expected_formatted_code, reformatted_code) + + +class TestsForSpacesInsideBrackets(yapf_test_helper.YAPFTest): + """Test the SPACE_INSIDE_BRACKETS style option.""" + unformatted_code = textwrap.dedent("""\ + foo() + foo(1) + foo(1,2) + foo((1,)) + foo((1, 2)) + foo((1, 2,)) + foo(bar['baz'][0]) + set1 = {1, 2, 3} + dict1 = {1: 1, foo: 2, 3: bar} + dict2 = { + 1: 1, + foo: 2, + 3: bar, + } + dict3[3][1][get_index(*args,**kwargs)] + dict4[3][1][get_index(**kwargs)] + x = dict5[4](foo(*args)) + a = list1[:] + b = list2[slice_start:] + c = list3[slice_start:slice_end] + d = list4[slice_start:slice_end:] + e = list5[slice_start:slice_end:slice_step] + # Print gets special handling + print(set2) + compound = ((10+3)/(5-2**(6+x))) + string_idx = "mystring"[3] + """) + + def testEnabled(self): + style.SetGlobalStyle( + style.CreateStyleFromConfig('{space_inside_brackets: True}')) + + expected_formatted_code = textwrap.dedent("""\ + foo() + foo( 1 ) + foo( 1, 2 ) + foo( ( 1, ) ) + foo( ( 1, 2 ) ) + foo( ( + 1, + 2, + ) ) + foo( bar[ 'baz' ][ 0 ] ) + set1 = { 1, 2, 3 } + dict1 = { 1: 1, foo: 2, 3: bar } + dict2 = { + 1: 1, + foo: 2, + 3: bar, + } + dict3[ 3 ][ 1 ][ get_index( *args, **kwargs ) ] + dict4[ 3 ][ 1 ][ get_index( **kwargs ) ] + x = dict5[ 4 ]( foo( *args ) ) + a = list1[ : ] + b = list2[ slice_start: ] + c = list3[ slice_start:slice_end ] + d = list4[ slice_start:slice_end: ] + e = list5[ slice_start:slice_end:slice_step ] + # Print gets special handling + print( set2 ) + compound = ( ( 10 + 3 ) / ( 5 - 2**( 6 + x ) ) ) + string_idx = "mystring"[ 3 ] + """) + + uwlines = yapf_test_helper.ParseAndUnwrap(self.unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testDefault(self): + style.SetGlobalStyle(style.CreatePEP8Style()) + + expected_formatted_code = textwrap.dedent("""\ + foo() + foo(1) + foo(1, 2) + foo((1, )) + foo((1, 2)) + foo(( + 1, + 2, + )) + foo(bar['baz'][0]) + set1 = {1, 2, 3} + dict1 = {1: 1, foo: 2, 3: bar} + dict2 = { + 1: 1, + foo: 2, + 3: bar, + } + dict3[3][1][get_index(*args, **kwargs)] + dict4[3][1][get_index(**kwargs)] + x = dict5[4](foo(*args)) + a = list1[:] + b = list2[slice_start:] + c = list3[slice_start:slice_end] + d = list4[slice_start:slice_end:] + e = list5[slice_start:slice_end:slice_step] + # Print gets special handling + print(set2) + compound = ((10 + 3) / (5 - 2**(6 + x))) + string_idx = "mystring"[3] + """) + + uwlines = yapf_test_helper.ParseAndUnwrap(self.unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + @unittest.skipUnless(py3compat.PY36, 'Requires Python 3.6') + def testAwait(self): + style.SetGlobalStyle( + style.CreateStyleFromConfig('{space_inside_brackets: True}')) + unformatted_code = textwrap.dedent("""\ + import asyncio + import time + + @print_args + async def slow_operation(): + await asyncio.sleep(1) + # print("Slow operation {} complete".format(n)) + async def main(): + start = time.time() + if (await get_html()): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + import asyncio + import time + + + @print_args + async def slow_operation(): + await asyncio.sleep( 1 ) + + # print("Slow operation {} complete".format(n)) + async def main(): + start = time.time() + if ( await get_html() ): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + +class TestsForSpacesAroundSubscriptColon(yapf_test_helper.YAPFTest): + """Test the SPACES_AROUND_SUBSCRIPT_COLON style option.""" + unformatted_code = textwrap.dedent("""\ + a = list1[ : ] + b = list2[ slice_start: ] + c = list3[ slice_start:slice_end ] + d = list4[ slice_start:slice_end: ] + e = list5[ slice_start:slice_end:slice_step ] + a1 = list1[ : ] + b1 = list2[ 1: ] + c1 = list3[ 1:20 ] + d1 = list4[ 1:20: ] + e1 = list5[ 1:20:3 ] + """) + + def testEnabled(self): + style.SetGlobalStyle( + style.CreateStyleFromConfig('{spaces_around_subscript_colon: True}')) + expected_formatted_code = textwrap.dedent("""\ + a = list1[:] + b = list2[slice_start :] + c = list3[slice_start : slice_end] + d = list4[slice_start : slice_end :] + e = list5[slice_start : slice_end : slice_step] + a1 = list1[:] + b1 = list2[1 :] + c1 = list3[1 : 20] + d1 = list4[1 : 20 :] + e1 = list5[1 : 20 : 3] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(self.unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testWithSpaceInsideBrackets(self): + style.SetGlobalStyle( + style.CreateStyleFromConfig('{' + 'spaces_around_subscript_colon: true, ' + 'space_inside_brackets: true,' + '}')) + expected_formatted_code = textwrap.dedent("""\ + a = list1[ : ] + b = list2[ slice_start : ] + c = list3[ slice_start : slice_end ] + d = list4[ slice_start : slice_end : ] + e = list5[ slice_start : slice_end : slice_step ] + a1 = list1[ : ] + b1 = list2[ 1 : ] + c1 = list3[ 1 : 20 ] + d1 = list4[ 1 : 20 : ] + e1 = list5[ 1 : 20 : 3 ] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(self.unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testDefault(self): + style.SetGlobalStyle(style.CreatePEP8Style()) + expected_formatted_code = textwrap.dedent("""\ + a = list1[:] + b = list2[slice_start:] + c = list3[slice_start:slice_end] + d = list4[slice_start:slice_end:] + e = list5[slice_start:slice_end:slice_step] + a1 = list1[:] + b1 = list2[1:] + c1 = list3[1:20] + d1 = list4[1:20:] + e1 = list5[1:20:3] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(self.unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/reformatter_python3_test.py b/.venv/lib/python3.9/site-packages/yapftests/reformatter_python3_test.py new file mode 100644 index 00000000..d06e4062 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/reformatter_python3_test.py @@ -0,0 +1,471 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Python 3 tests for yapf.reformatter.""" + +import sys +import textwrap +import unittest + +from yapf.yapflib import py3compat +from yapf.yapflib import reformatter +from yapf.yapflib import style + +from yapftests import yapf_test_helper + + +@unittest.skipUnless(py3compat.PY3, 'Requires Python 3') +class TestsForPython3Code(yapf_test_helper.YAPFTest): + """Test a few constructs that are new Python 3 syntax.""" + + @classmethod + def setUpClass(cls): # pylint: disable=g-missing-super-call + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testTypedNames(self): + unformatted_code = textwrap.dedent("""\ + def x(aaaaaaaaaaaaaaa:int,bbbbbbbbbbbbbbbb:str,ccccccccccccccc:dict,eeeeeeeeeeeeee:set={1, 2, 3})->bool: + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def x(aaaaaaaaaaaaaaa: int, + bbbbbbbbbbbbbbbb: str, + ccccccccccccccc: dict, + eeeeeeeeeeeeee: set = {1, 2, 3}) -> bool: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testTypedNameWithLongNamedArg(self): + unformatted_code = textwrap.dedent("""\ + def func(arg=long_function_call_that_pushes_the_line_over_eighty_characters()) -> ReturnType: + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def func(arg=long_function_call_that_pushes_the_line_over_eighty_characters() + ) -> ReturnType: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testKeywordOnlyArgSpecifier(self): + unformatted_code = textwrap.dedent("""\ + def foo(a, *, kw): + return a+kw + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(a, *, kw): + return a + kw + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + @unittest.skipUnless(py3compat.PY36, 'Requires Python 3.6') + def testPEP448ParameterExpansion(self): + unformatted_code = textwrap.dedent("""\ + { ** x } + { **{} } + { **{ **x }, **x } + {'a': 1, **kw , 'b':3, **kw2 } + """) + expected_formatted_code = textwrap.dedent("""\ + {**x} + {**{}} + {**{**x}, **x} + {'a': 1, **kw, 'b': 3, **kw2} + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testAnnotations(self): + unformatted_code = textwrap.dedent("""\ + def foo(a: list, b: "bar") -> dict: + return a+b + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(a: list, b: "bar") -> dict: + return a + b + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testExecAsNonKeyword(self): + unformatted_code = 'methods.exec( sys.modules[name])\n' + expected_formatted_code = 'methods.exec(sys.modules[name])\n' + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testAsyncFunctions(self): + if sys.version_info[1] < 5: + return + code = textwrap.dedent("""\ + import asyncio + import time + + + @print_args + async def slow_operation(): + await asyncio.sleep(1) + # print("Slow operation {} complete".format(n)) + + + async def main(): + start = time.time() + if (await get_html()): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines, verify=False)) + + def testNoSpacesAroundPowerOperator(self): + unformatted_code = textwrap.dedent("""\ + a**b + """) + expected_formatted_code = textwrap.dedent("""\ + a ** b + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: pep8, SPACES_AROUND_POWER_OPERATOR: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testSpacesAroundDefaultOrNamedAssign(self): + unformatted_code = textwrap.dedent("""\ + f(a=5) + """) + expected_formatted_code = textwrap.dedent("""\ + f(a = 5) + """) + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: pep8, ' + 'SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN: True}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testTypeHint(self): + unformatted_code = textwrap.dedent("""\ + def foo(x: int=42): + pass + + + def foo2(x: 'int' =42): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(x: int = 42): + pass + + + def foo2(x: 'int' = 42): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testMatrixMultiplication(self): + unformatted_code = textwrap.dedent("""\ + a=b@c + """) + expected_formatted_code = textwrap.dedent("""\ + a = b @ c + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testNoneKeyword(self): + code = """\ +None.__ne__() +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testAsyncWithPrecedingComment(self): + if sys.version_info[1] < 5: + return + unformatted_code = textwrap.dedent("""\ + import asyncio + + # Comment + async def bar(): + pass + + async def foo(): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + import asyncio + + + # Comment + async def bar(): + pass + + + async def foo(): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testAsyncFunctionsNested(self): + if sys.version_info[1] < 5: + return + code = textwrap.dedent("""\ + async def outer(): + async def inner(): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testKeepTypesIntact(self): + if sys.version_info[1] < 5: + return + unformatted_code = textwrap.dedent("""\ + def _ReduceAbstractContainers( + self, *args: Optional[automation_converter.PyiCollectionAbc]) -> List[ + automation_converter.PyiCollectionAbc]: + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def _ReduceAbstractContainers( + self, *args: Optional[automation_converter.PyiCollectionAbc] + ) -> List[automation_converter.PyiCollectionAbc]: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testContinuationIndentWithAsync(self): + if sys.version_info[1] < 5: + return + unformatted_code = textwrap.dedent("""\ + async def start_websocket(): + async with session.ws_connect( + r"ws://a_really_long_long_long_long_long_long_url") as ws: + pass + """) + expected_formatted_code = textwrap.dedent("""\ + async def start_websocket(): + async with session.ws_connect( + r"ws://a_really_long_long_long_long_long_long_url") as ws: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testSplittingArguments(self): + if sys.version_info[1] < 5: + return + + unformatted_code = """\ +async def open_file(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None): + pass + +async def run_sync_in_worker_thread(sync_fn, *args, cancellable=False, limiter=None): + pass + +def open_file(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None): + pass + +def run_sync_in_worker_thread(sync_fn, *args, cancellable=False, limiter=None): + pass +""" + expected_formatted_code = """\ +async def open_file( + file, + mode='r', + buffering=-1, + encoding=None, + errors=None, + newline=None, + closefd=True, + opener=None +): + pass + + +async def run_sync_in_worker_thread( + sync_fn, *args, cancellable=False, limiter=None +): + pass + + +def open_file( + file, + mode='r', + buffering=-1, + encoding=None, + errors=None, + newline=None, + closefd=True, + opener=None +): + pass + + +def run_sync_in_worker_thread(sync_fn, *args, cancellable=False, limiter=None): + pass +""" + + try: + style.SetGlobalStyle( + style.CreateStyleFromConfig( + '{based_on_style: pep8, ' + 'dedent_closing_brackets: true, ' + 'coalesce_brackets: false, ' + 'space_between_ending_comma_and_closing_bracket: false, ' + 'split_arguments_when_comma_terminated: true, ' + 'split_before_first_argument: true}')) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testDictUnpacking(self): + if sys.version_info[1] < 5: + return + unformatted_code = """\ +class Foo: + def foo(self): + foofoofoofoofoofoofoofoo('foofoofoofoofoo', { + + 'foo': 'foo', + + **foofoofoo + }) +""" + expected_formatted_code = """\ +class Foo: + def foo(self): + foofoofoofoofoofoofoofoo('foofoofoofoofoo', { + 'foo': 'foo', + **foofoofoo + }) +""" + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testMultilineFormatString(self): + if sys.version_info[1] < 6: + return + code = """\ +# yapf: disable +(f''' + ''') +# yapf: enable +""" + # https://github.com/google/yapf/issues/513 + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testEllipses(self): + if sys.version_info[1] < 6: + return + code = """\ +def dirichlet(x12345678901234567890123456789012345678901234567890=...) -> None: + return +""" + # https://github.com/google/yapf/issues/533 + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testFunctionTypedReturnNextLine(self): + code = """\ +def _GenerateStatsEntries( + process_id: Text, + timestamp: Optional[ffffffff.FFFFFFFFFFF] = None +) -> Sequence[ssssssssssss.SSSSSSSSSSSSSSS]: + pass +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testFunctionTypedReturnSameLine(self): + code = """\ +def rrrrrrrrrrrrrrrrrrrrrr( + ccccccccccccccccccccccc: Tuple[Text, Text]) -> List[Tuple[Text, Text]]: + pass +""" + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testAsyncForElseNotIndentedInsideBody(self): + if sys.version_info[1] < 5: + return + code = textwrap.dedent("""\ + async def fn(): + async for message in websocket: + for i in range(10): + pass + else: + pass + else: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testForElseInAsyncNotMixedWithAsyncFor(self): + if sys.version_info[1] < 5: + return + code = textwrap.dedent("""\ + async def fn(): + for i in range(10): + pass + else: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self.assertCodeEqual(code, reformatter.Reformat(uwlines)) + + def testParameterListIndentationConflicts(self): + unformatted_code = textwrap.dedent("""\ + def raw_message( # pylint: disable=too-many-arguments + self, text, user_id=1000, chat_type='private', forward_date=None, forward_from=None): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def raw_message( # pylint: disable=too-many-arguments + self, + text, + user_id=1000, + chat_type='private', + forward_date=None, + forward_from=None): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/reformatter_style_config_test.py b/.venv/lib/python3.9/site-packages/yapftests/reformatter_style_config_test.py new file mode 100644 index 00000000..d77c1970 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/reformatter_style_config_test.py @@ -0,0 +1,198 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Style config tests for yapf.reformatter.""" + +import textwrap +import unittest + +from yapf.yapflib import reformatter +from yapf.yapflib import style + +from yapftests import yapf_test_helper + + +class TestsForStyleConfig(yapf_test_helper.YAPFTest): + + def setUp(self): + self.current_style = style.DEFAULT_STYLE + + def testSetGlobalStyle(self): + try: + style.SetGlobalStyle(style.CreateYapfStyle()) + unformatted_code = textwrap.dedent(u"""\ + for i in range(5): + print('bar') + """) + expected_formatted_code = textwrap.dedent(u"""\ + for i in range(5): + print('bar') + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + style.DEFAULT_STYLE = self.current_style + + unformatted_code = textwrap.dedent(u"""\ + for i in range(5): + print('bar') + """) + expected_formatted_code = textwrap.dedent(u"""\ + for i in range(5): + print('bar') + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines)) + + def testOperatorNoSpaceStyle(self): + try: + sympy_style = style.CreatePEP8Style() + sympy_style['NO_SPACES_AROUND_SELECTED_BINARY_OPERATORS'] = \ + style._StringSetConverter('*,/') + style.SetGlobalStyle(sympy_style) + unformatted_code = textwrap.dedent("""\ + a = 1+2 * 3 - 4 / 5 + b = '0' * 1 + """) + expected_formatted_code = textwrap.dedent("""\ + a = 1 + 2*3 - 4/5 + b = '0'*1 + """) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + style.DEFAULT_STYLE = self.current_style + + def testOperatorPrecedenceStyle(self): + try: + pep8_with_precedence = style.CreatePEP8Style() + pep8_with_precedence['ARITHMETIC_PRECEDENCE_INDICATION'] = True + style.SetGlobalStyle(pep8_with_precedence) + unformatted_code = textwrap.dedent("""\ + 1+2 + (1 + 2) * (3 - (4 / 5)) + a = 1 * 2 + 3 / 4 + b = 1 / 2 - 3 * 4 + c = (1 + 2) * (3 - 4) + d = (1 - 2) / (3 + 4) + e = 1 * 2 - 3 + f = 1 + 2 + 3 + 4 + g = 1 * 2 * 3 * 4 + h = 1 + 2 - 3 + 4 + i = 1 * 2 / 3 * 4 + j = (1 * 2 - 3) + 4 + k = (1 * 2 * 3) + (4 * 5 * 6 * 7 * 8) + """) + expected_formatted_code = textwrap.dedent("""\ + 1 + 2 + (1+2) * (3 - (4/5)) + a = 1*2 + 3/4 + b = 1/2 - 3*4 + c = (1+2) * (3-4) + d = (1-2) / (3+4) + e = 1*2 - 3 + f = 1 + 2 + 3 + 4 + g = 1 * 2 * 3 * 4 + h = 1 + 2 - 3 + 4 + i = 1 * 2 / 3 * 4 + j = (1*2 - 3) + 4 + k = (1*2*3) + (4*5*6*7*8) + """) + + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + style.DEFAULT_STYLE = self.current_style + + def testNoSplitBeforeFirstArgumentStyle1(self): + try: + pep8_no_split_before_first = style.CreatePEP8Style() + pep8_no_split_before_first['SPLIT_BEFORE_FIRST_ARGUMENT'] = False + pep8_no_split_before_first['SPLIT_BEFORE_NAMED_ASSIGNS'] = False + style.SetGlobalStyle(pep8_no_split_before_first) + formatted_code = textwrap.dedent("""\ + # Example from in-code MustSplit comments + foo = outer_function_call(fitting_inner_function_call(inner_arg1, inner_arg2), + outer_arg1, outer_arg2) + + foo = outer_function_call( + not_fitting_inner_function_call(inner_arg1, inner_arg2), outer_arg1, + outer_arg2) + + # Examples Issue#424 + a_super_long_version_of_print(argument1, argument2, argument3, argument4, + argument5, argument6, argument7) + + CREDS_FILE = os.path.join(os.path.expanduser('~'), + 'apis/super-secret-admin-creds.json') + + # Examples Issue#556 + i_take_a_lot_of_params(arg1, param1=very_long_expression1(), + param2=very_long_expression2(), + param3=very_long_expression3(), + param4=very_long_expression4()) + + # Examples Issue#590 + plt.plot(numpy.linspace(0, 1, 10), numpy.linspace(0, 1, 10), marker="x", + color="r") + + plt.plot(veryverylongvariablename, veryverylongvariablename, marker="x", + color="r") + """) + uwlines = yapf_test_helper.ParseAndUnwrap(formatted_code) + self.assertCodeEqual(formatted_code, reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + style.DEFAULT_STYLE = self.current_style + + def testNoSplitBeforeFirstArgumentStyle2(self): + try: + pep8_no_split_before_first = style.CreatePEP8Style() + pep8_no_split_before_first['SPLIT_BEFORE_FIRST_ARGUMENT'] = False + pep8_no_split_before_first['SPLIT_BEFORE_NAMED_ASSIGNS'] = True + style.SetGlobalStyle(pep8_no_split_before_first) + formatted_code = textwrap.dedent("""\ + # Examples Issue#556 + i_take_a_lot_of_params(arg1, + param1=very_long_expression1(), + param2=very_long_expression2(), + param3=very_long_expression3(), + param4=very_long_expression4()) + + # Examples Issue#590 + plt.plot(numpy.linspace(0, 1, 10), + numpy.linspace(0, 1, 10), + marker="x", + color="r") + + plt.plot(veryverylongvariablename, + veryverylongvariablename, + marker="x", + color="r") + """) + uwlines = yapf_test_helper.ParseAndUnwrap(formatted_code) + self.assertCodeEqual(formatted_code, reformatter.Reformat(uwlines)) + finally: + style.SetGlobalStyle(style.CreatePEP8Style()) + style.DEFAULT_STYLE = self.current_style + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/reformatter_verify_test.py b/.venv/lib/python3.9/site-packages/yapftests/reformatter_verify_test.py new file mode 100644 index 00000000..1b3d5b08 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/reformatter_verify_test.py @@ -0,0 +1,108 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.reformatter.""" + +import textwrap +import unittest + +from yapf.yapflib import py3compat +from yapf.yapflib import reformatter +from yapf.yapflib import style +from yapf.yapflib import verifier + +from yapftests import yapf_test_helper + + +@unittest.skipIf(py3compat.PY3, 'Requires Python 2') +class TestVerifyNoVerify(yapf_test_helper.YAPFTest): + + @classmethod + def setUpClass(cls): + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testVerifyException(self): + unformatted_code = textwrap.dedent("""\ + class ABC(metaclass=type): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + with self.assertRaises(verifier.InternalError): + reformatter.Reformat(uwlines, verify=True) + reformatter.Reformat(uwlines) # verify should be False by default. + + def testNoVerify(self): + unformatted_code = textwrap.dedent("""\ + class ABC(metaclass=type): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + class ABC(metaclass=type): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines, verify=False)) + + def testVerifyFutureImport(self): + unformatted_code = textwrap.dedent("""\ + from __future__ import print_function + + def call_my_function(the_function): + the_function("hi") + + if __name__ == "__main__": + call_my_function(print) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + with self.assertRaises(verifier.InternalError): + reformatter.Reformat(uwlines, verify=True) + + expected_formatted_code = textwrap.dedent("""\ + from __future__ import print_function + + + def call_my_function(the_function): + the_function("hi") + + + if __name__ == "__main__": + call_my_function(print) + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines, verify=False)) + + def testContinuationLineShouldBeDistinguished(self): + unformatted_code = textwrap.dedent("""\ + class Foo(object): + + def bar(self): + if self.solo_generator_that_is_long is None and len( + self.generators + self.next_batch) == 1: + pass + """) + expected_formatted_code = textwrap.dedent("""\ + class Foo(object): + def bar(self): + if self.solo_generator_that_is_long is None and len( + self.generators + self.next_batch) == 1: + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) + self.assertCodeEqual(expected_formatted_code, + reformatter.Reformat(uwlines, verify=False)) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/split_penalty_test.py b/.venv/lib/python3.9/site-packages/yapftests/split_penalty_test.py new file mode 100644 index 00000000..4d551291 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/split_penalty_test.py @@ -0,0 +1,266 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.split_penalty.""" + +import sys +import textwrap +import unittest + +from lib2to3 import pytree + +from yapf.yapflib import pytree_utils +from yapf.yapflib import pytree_visitor +from yapf.yapflib import split_penalty +from yapf.yapflib import style + +from yapftests import yapf_test_helper + +UNBREAKABLE = split_penalty.UNBREAKABLE +VERY_STRONGLY_CONNECTED = split_penalty.VERY_STRONGLY_CONNECTED +DOTTED_NAME = split_penalty.DOTTED_NAME +STRONGLY_CONNECTED = split_penalty.STRONGLY_CONNECTED + + +class SplitPenaltyTest(yapf_test_helper.YAPFTest): + + @classmethod + def setUpClass(cls): + style.SetGlobalStyle(style.CreateYapfStyle()) + + def _ParseAndComputePenalties(self, code, dumptree=False): + """Parses the code and computes split penalties. + + Arguments: + code: code to parse as a string + dumptree: if True, the parsed pytree (after penalty assignment) is dumped + to stderr. Useful for debugging. + + Returns: + Parse tree. + """ + tree = pytree_utils.ParseCodeToTree(code) + split_penalty.ComputeSplitPenalties(tree) + if dumptree: + pytree_visitor.DumpPyTree(tree, target_stream=sys.stderr) + return tree + + def _CheckPenalties(self, tree, list_of_expected): + """Check that the tokens in the tree have the correct penalties. + + Args: + tree: the pytree. + list_of_expected: list of (name, penalty) pairs. Non-semantic tokens are + filtered out from the expected values. + """ + + def FlattenRec(tree): + if pytree_utils.NodeName(tree) in pytree_utils.NONSEMANTIC_TOKENS: + return [] + if isinstance(tree, pytree.Leaf): + return [(tree.value, + pytree_utils.GetNodeAnnotation( + tree, pytree_utils.Annotation.SPLIT_PENALTY))] + nodes = [] + for node in tree.children: + nodes += FlattenRec(node) + return nodes + + self.assertEqual(list_of_expected, FlattenRec(tree)) + + def testUnbreakable(self): + # Test function definitions. + code = textwrap.dedent(r""" + def foo(x): + pass + """) + tree = self._ParseAndComputePenalties(code) + self._CheckPenalties(tree, [ + ('def', None), + ('foo', UNBREAKABLE), + ('(', UNBREAKABLE), + ('x', None), + (')', STRONGLY_CONNECTED), + (':', UNBREAKABLE), + ('pass', None), + ]) + + # Test function definition with trailing comment. + code = textwrap.dedent(r""" + def foo(x): # trailing comment + pass + """) + tree = self._ParseAndComputePenalties(code) + self._CheckPenalties(tree, [ + ('def', None), + ('foo', UNBREAKABLE), + ('(', UNBREAKABLE), + ('x', None), + (')', STRONGLY_CONNECTED), + (':', UNBREAKABLE), + ('pass', None), + ]) + + # Test class definitions. + code = textwrap.dedent(r""" + class A: + pass + class B(A): + pass + """) + tree = self._ParseAndComputePenalties(code) + self._CheckPenalties(tree, [ + ('class', None), + ('A', UNBREAKABLE), + (':', UNBREAKABLE), + ('pass', None), + ('class', None), + ('B', UNBREAKABLE), + ('(', UNBREAKABLE), + ('A', None), + (')', None), + (':', UNBREAKABLE), + ('pass', None), + ]) + + # Test lambda definitions. + code = textwrap.dedent(r""" + lambda a, b: None + """) + tree = self._ParseAndComputePenalties(code) + self._CheckPenalties(tree, [ + ('lambda', None), + ('a', VERY_STRONGLY_CONNECTED), + (',', VERY_STRONGLY_CONNECTED), + ('b', VERY_STRONGLY_CONNECTED), + (':', VERY_STRONGLY_CONNECTED), + ('None', VERY_STRONGLY_CONNECTED), + ]) + + # Test dotted names. + code = textwrap.dedent(r""" + import a.b.c + """) + tree = self._ParseAndComputePenalties(code) + self._CheckPenalties(tree, [ + ('import', None), + ('a', None), + ('.', UNBREAKABLE), + ('b', UNBREAKABLE), + ('.', UNBREAKABLE), + ('c', UNBREAKABLE), + ]) + + def testStronglyConnected(self): + # Test dictionary keys. + code = textwrap.dedent(r""" + a = { + 'x': 42, + y(lambda a: 23): 37, + } + """) + tree = self._ParseAndComputePenalties(code) + self._CheckPenalties(tree, [ + ('a', None), + ('=', None), + ('{', None), + ("'x'", None), + (':', STRONGLY_CONNECTED), + ('42', None), + (',', None), + ('y', None), + ('(', UNBREAKABLE), + ('lambda', STRONGLY_CONNECTED), + ('a', VERY_STRONGLY_CONNECTED), + (':', VERY_STRONGLY_CONNECTED), + ('23', VERY_STRONGLY_CONNECTED), + (')', VERY_STRONGLY_CONNECTED), + (':', STRONGLY_CONNECTED), + ('37', None), + (',', None), + ('}', None), + ]) + + # Test list comprehension. + code = textwrap.dedent(r""" + [a for a in foo if a.x == 37] + """) + tree = self._ParseAndComputePenalties(code) + self._CheckPenalties(tree, [ + ('[', None), + ('a', None), + ('for', 0), + ('a', STRONGLY_CONNECTED), + ('in', STRONGLY_CONNECTED), + ('foo', STRONGLY_CONNECTED), + ('if', 0), + ('a', STRONGLY_CONNECTED), + ('.', VERY_STRONGLY_CONNECTED), + ('x', DOTTED_NAME), + ('==', STRONGLY_CONNECTED), + ('37', STRONGLY_CONNECTED), + (']', None), + ]) + + def testFuncCalls(self): + code = 'foo(1, 2, 3)\n' + tree = self._ParseAndComputePenalties(code) + self._CheckPenalties(tree, [ + ('foo', None), + ('(', UNBREAKABLE), + ('1', None), + (',', UNBREAKABLE), + ('2', None), + (',', UNBREAKABLE), + ('3', None), + (')', VERY_STRONGLY_CONNECTED), + ]) + + # Now a method call, which has more than one trailer + code = 'foo.bar.baz(1, 2, 3)\n' + tree = self._ParseAndComputePenalties(code) + self._CheckPenalties(tree, [ + ('foo', None), + ('.', VERY_STRONGLY_CONNECTED), + ('bar', DOTTED_NAME), + ('.', VERY_STRONGLY_CONNECTED), + ('baz', DOTTED_NAME), + ('(', STRONGLY_CONNECTED), + ('1', None), + (',', UNBREAKABLE), + ('2', None), + (',', UNBREAKABLE), + ('3', None), + (')', VERY_STRONGLY_CONNECTED), + ]) + + # Test single generator argument. + code = 'max(i for i in xrange(10))\n' + tree = self._ParseAndComputePenalties(code) + self._CheckPenalties(tree, [ + ('max', None), + ('(', UNBREAKABLE), + ('i', 0), + ('for', 0), + ('i', STRONGLY_CONNECTED), + ('in', STRONGLY_CONNECTED), + ('xrange', STRONGLY_CONNECTED), + ('(', UNBREAKABLE), + ('10', STRONGLY_CONNECTED), + (')', VERY_STRONGLY_CONNECTED), + (')', VERY_STRONGLY_CONNECTED), + ]) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/style_test.py b/.venv/lib/python3.9/site-packages/yapftests/style_test.py new file mode 100644 index 00000000..2fd3f2d0 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/style_test.py @@ -0,0 +1,336 @@ +# -*- coding: utf-8 -*- +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.style.""" + +import os +import shutil +import tempfile +import textwrap +import unittest + +from yapf.yapflib import style + +from yapftests import utils + + +class UtilsTest(unittest.TestCase): + + def testContinuationAlignStyleStringConverter(self): + for cont_align_space in ('', 'space', '"space"', '\'space\''): + self.assertEqual( + style._ContinuationAlignStyleStringConverter(cont_align_space), + 'SPACE') + for cont_align_fixed in ('fixed', '"fixed"', '\'fixed\''): + self.assertEqual( + style._ContinuationAlignStyleStringConverter(cont_align_fixed), + 'FIXED') + for cont_align_valignright in ( + 'valign-right', + '"valign-right"', + '\'valign-right\'', + 'valign_right', + '"valign_right"', + '\'valign_right\'', + ): + self.assertEqual( + style._ContinuationAlignStyleStringConverter(cont_align_valignright), + 'VALIGN-RIGHT') + with self.assertRaises(ValueError) as ctx: + style._ContinuationAlignStyleStringConverter('blahblah') + self.assertIn("unknown continuation align style: 'blahblah'", + str(ctx.exception)) + + def testStringListConverter(self): + self.assertEqual(style._StringListConverter('foo, bar'), ['foo', 'bar']) + self.assertEqual(style._StringListConverter('foo,bar'), ['foo', 'bar']) + self.assertEqual(style._StringListConverter(' foo'), ['foo']) + self.assertEqual( + style._StringListConverter('joe ,foo, bar'), ['joe', 'foo', 'bar']) + + def testBoolConverter(self): + self.assertEqual(style._BoolConverter('true'), True) + self.assertEqual(style._BoolConverter('1'), True) + self.assertEqual(style._BoolConverter('false'), False) + self.assertEqual(style._BoolConverter('0'), False) + + def testIntListConverter(self): + self.assertEqual(style._IntListConverter('1, 2, 3'), [1, 2, 3]) + self.assertEqual(style._IntListConverter('[ 1, 2, 3 ]'), [1, 2, 3]) + self.assertEqual(style._IntListConverter('[ 1, 2, 3, ]'), [1, 2, 3]) + + def testIntOrIntListConverter(self): + self.assertEqual(style._IntOrIntListConverter('10'), 10) + self.assertEqual(style._IntOrIntListConverter('1, 2, 3'), [1, 2, 3]) + + +def _LooksLikeGoogleStyle(cfg): + return cfg['COLUMN_LIMIT'] == 80 and cfg['SPLIT_COMPLEX_COMPREHENSION'] + + +def _LooksLikePEP8Style(cfg): + return cfg['COLUMN_LIMIT'] == 79 + + +def _LooksLikeFacebookStyle(cfg): + return cfg['DEDENT_CLOSING_BRACKETS'] + + +def _LooksLikeYapfStyle(cfg): + return cfg['SPLIT_BEFORE_DOT'] + + +class PredefinedStylesByNameTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): # pylint: disable=g-missing-super-call + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testDefault(self): + # default is PEP8 + cfg = style.CreateStyleFromConfig(None) + self.assertTrue(_LooksLikePEP8Style(cfg)) + + def testPEP8ByName(self): + for pep8_name in ('PEP8', 'pep8', 'Pep8'): + cfg = style.CreateStyleFromConfig(pep8_name) + self.assertTrue(_LooksLikePEP8Style(cfg)) + + def testGoogleByName(self): + for google_name in ('google', 'Google', 'GOOGLE'): + cfg = style.CreateStyleFromConfig(google_name) + self.assertTrue(_LooksLikeGoogleStyle(cfg)) + + def testYapfByName(self): + for yapf_name in ('yapf', 'YAPF'): + cfg = style.CreateStyleFromConfig(yapf_name) + self.assertTrue(_LooksLikeYapfStyle(cfg)) + + def testFacebookByName(self): + for fb_name in ('facebook', 'FACEBOOK', 'Facebook'): + cfg = style.CreateStyleFromConfig(fb_name) + self.assertTrue(_LooksLikeFacebookStyle(cfg)) + + +class StyleFromFileTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): # pylint: disable=g-missing-super-call + cls.test_tmpdir = tempfile.mkdtemp() + style.SetGlobalStyle(style.CreatePEP8Style()) + + @classmethod + def tearDownClass(cls): # pylint: disable=g-missing-super-call + shutil.rmtree(cls.test_tmpdir) + + def testDefaultBasedOnStyle(self): + cfg = textwrap.dedent(u'''\ + [style] + continuation_indent_width = 20 + ''') + with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: + cfg = style.CreateStyleFromConfig(filepath) + self.assertTrue(_LooksLikePEP8Style(cfg)) + self.assertEqual(cfg['CONTINUATION_INDENT_WIDTH'], 20) + + def testDefaultBasedOnPEP8Style(self): + cfg = textwrap.dedent(u'''\ + [style] + based_on_style = pep8 + continuation_indent_width = 40 + ''') + with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: + cfg = style.CreateStyleFromConfig(filepath) + self.assertTrue(_LooksLikePEP8Style(cfg)) + self.assertEqual(cfg['CONTINUATION_INDENT_WIDTH'], 40) + + def testDefaultBasedOnGoogleStyle(self): + cfg = textwrap.dedent(u'''\ + [style] + based_on_style = google + continuation_indent_width = 20 + ''') + with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: + cfg = style.CreateStyleFromConfig(filepath) + self.assertTrue(_LooksLikeGoogleStyle(cfg)) + self.assertEqual(cfg['CONTINUATION_INDENT_WIDTH'], 20) + + def testDefaultBasedOnFacebookStyle(self): + cfg = textwrap.dedent(u'''\ + [style] + based_on_style = facebook + continuation_indent_width = 20 + ''') + with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: + cfg = style.CreateStyleFromConfig(filepath) + self.assertTrue(_LooksLikeFacebookStyle(cfg)) + self.assertEqual(cfg['CONTINUATION_INDENT_WIDTH'], 20) + + def testBoolOptionValue(self): + cfg = textwrap.dedent(u'''\ + [style] + based_on_style = pep8 + SPLIT_BEFORE_NAMED_ASSIGNS=False + split_before_logical_operator = true + ''') + with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: + cfg = style.CreateStyleFromConfig(filepath) + self.assertTrue(_LooksLikePEP8Style(cfg)) + self.assertEqual(cfg['SPLIT_BEFORE_NAMED_ASSIGNS'], False) + self.assertEqual(cfg['SPLIT_BEFORE_LOGICAL_OPERATOR'], True) + + def testStringListOptionValue(self): + cfg = textwrap.dedent(u'''\ + [style] + based_on_style = pep8 + I18N_FUNCTION_CALL = N_, V_, T_ + ''') + with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: + cfg = style.CreateStyleFromConfig(filepath) + self.assertTrue(_LooksLikePEP8Style(cfg)) + self.assertEqual(cfg['I18N_FUNCTION_CALL'], ['N_', 'V_', 'T_']) + + def testErrorNoStyleFile(self): + with self.assertRaisesRegexp(style.StyleConfigError, + 'is not a valid style or file path'): + style.CreateStyleFromConfig('/8822/xyznosuchfile') + + def testErrorNoStyleSection(self): + cfg = textwrap.dedent(u'''\ + [s] + indent_width=2 + ''') + with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: + with self.assertRaisesRegexp(style.StyleConfigError, + 'Unable to find section'): + style.CreateStyleFromConfig(filepath) + + def testErrorUnknownStyleOption(self): + cfg = textwrap.dedent(u'''\ + [style] + indent_width=2 + hummus=2 + ''') + with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: + with self.assertRaisesRegexp(style.StyleConfigError, + 'Unknown style option'): + style.CreateStyleFromConfig(filepath) + + def testPyprojectTomlNoYapfSection(self): + try: + import toml + except ImportError: + return + + filepath = os.path.join(self.test_tmpdir, 'pyproject.toml') + _ = open(filepath, 'w') + with self.assertRaisesRegexp(style.StyleConfigError, + 'Unable to find section'): + style.CreateStyleFromConfig(filepath) + + def testPyprojectTomlParseYapfSection(self): + try: + import toml + except ImportError: + return + + cfg = textwrap.dedent(u'''\ + [tool.yapf] + based_on_style = "pep8" + continuation_indent_width = 40 + ''') + filepath = os.path.join(self.test_tmpdir, 'pyproject.toml') + with open(filepath, 'w') as f: + f.write(cfg) + cfg = style.CreateStyleFromConfig(filepath) + self.assertTrue(_LooksLikePEP8Style(cfg)) + self.assertEqual(cfg['CONTINUATION_INDENT_WIDTH'], 40) + + +class StyleFromDict(unittest.TestCase): + + @classmethod + def setUpClass(cls): # pylint: disable=g-missing-super-call + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testDefaultBasedOnStyle(self): + config_dict = { + 'based_on_style': 'pep8', + 'indent_width': 2, + 'blank_line_before_nested_class_or_def': True + } + cfg = style.CreateStyleFromConfig(config_dict) + self.assertTrue(_LooksLikePEP8Style(cfg)) + self.assertEqual(cfg['INDENT_WIDTH'], 2) + + def testDefaultBasedOnStyleBadDict(self): + self.assertRaisesRegexp(style.StyleConfigError, 'Unknown style option', + style.CreateStyleFromConfig, + {'based_on_styl': 'pep8'}) + self.assertRaisesRegexp(style.StyleConfigError, 'not a valid', + style.CreateStyleFromConfig, + {'INDENT_WIDTH': 'FOUR'}) + + +class StyleFromCommandLine(unittest.TestCase): + + @classmethod + def setUpClass(cls): # pylint: disable=g-missing-super-call + style.SetGlobalStyle(style.CreatePEP8Style()) + + def testDefaultBasedOnStyle(self): + cfg = style.CreateStyleFromConfig( + '{based_on_style: pep8,' + ' indent_width: 2,' + ' blank_line_before_nested_class_or_def: True}') + self.assertTrue(_LooksLikePEP8Style(cfg)) + self.assertEqual(cfg['INDENT_WIDTH'], 2) + + def testDefaultBasedOnStyleNotStrict(self): + cfg = style.CreateStyleFromConfig( + '{based_on_style : pep8' + ' ,indent_width=2' + ' blank_line_before_nested_class_or_def:True}') + self.assertTrue(_LooksLikePEP8Style(cfg)) + self.assertEqual(cfg['INDENT_WIDTH'], 2) + + def testDefaultBasedOnExplicitlyUnicodeTypeString(self): + cfg = style.CreateStyleFromConfig(u'{}') + self.assertIsInstance(cfg, dict) + + def testDefaultBasedOnDetaultTypeString(self): + cfg = style.CreateStyleFromConfig('{}') + self.assertIsInstance(cfg, dict) + + def testDefaultBasedOnStyleBadString(self): + self.assertRaisesRegexp(style.StyleConfigError, 'Unknown style option', + style.CreateStyleFromConfig, + '{based_on_styl: pep8}') + self.assertRaisesRegexp(style.StyleConfigError, 'not a valid', + style.CreateStyleFromConfig, '{INDENT_WIDTH: FOUR}') + self.assertRaisesRegexp(style.StyleConfigError, 'Invalid style dict', + style.CreateStyleFromConfig, + '{based_on_style: pep8') + + +class StyleHelp(unittest.TestCase): + + def testHelpKeys(self): + settings = sorted(style.Help()) + expected = sorted(style._style) + self.assertListEqual(settings, expected) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/subtype_assigner_test.py b/.venv/lib/python3.9/site-packages/yapftests/subtype_assigner_test.py new file mode 100644 index 00000000..b42b8cfa --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/subtype_assigner_test.py @@ -0,0 +1,304 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.subtype_assigner.""" + +import textwrap +import unittest + +from yapf.yapflib import format_token +from yapf.yapflib import pytree_utils + +from yapftests import yapf_test_helper + + +class SubtypeAssignerTest(yapf_test_helper.YAPFTest): + + def _CheckFormatTokenSubtypes(self, uwlines, list_of_expected): + """Check that the tokens in the UnwrappedLines have the expected subtypes. + + Args: + uwlines: list of UnwrappedLine. + list_of_expected: list of (name, subtype) pairs. Non-semantic tokens are + filtered out from the expected values. + """ + actual = [] + for uwl in uwlines: + filtered_values = [(ft.value, ft.subtypes) + for ft in uwl.tokens + if ft.name not in pytree_utils.NONSEMANTIC_TOKENS] + if filtered_values: + actual.append(filtered_values) + + self.assertEqual(list_of_expected, actual) + + def testFuncDefDefaultAssign(self): + self.maxDiff = None # pylint: disable=invalid-name + code = textwrap.dedent(r""" + def foo(a=37, *b, **c): + return -x[:42] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckFormatTokenSubtypes(uwlines, [ + [ + ('def', [format_token.Subtype.NONE]), + ('foo', {format_token.Subtype.FUNC_DEF}), + ('(', {format_token.Subtype.NONE}), + ('a', { + format_token.Subtype.NONE, + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN_ARG_LIST, + format_token.Subtype.PARAMETER_START, + }), + ('=', { + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN, + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN_ARG_LIST, + }), + ('37', { + format_token.Subtype.NONE, + format_token.Subtype.PARAMETER_STOP, + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN_ARG_LIST, + }), + (',', {format_token.Subtype.NONE}), + ('*', { + format_token.Subtype.PARAMETER_START, + format_token.Subtype.VARARGS_STAR, + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN_ARG_LIST, + }), + ('b', { + format_token.Subtype.NONE, + format_token.Subtype.PARAMETER_STOP, + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN_ARG_LIST, + }), + (',', {format_token.Subtype.NONE}), + ('**', { + format_token.Subtype.PARAMETER_START, + format_token.Subtype.KWARGS_STAR_STAR, + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN_ARG_LIST, + }), + ('c', { + format_token.Subtype.NONE, + format_token.Subtype.PARAMETER_STOP, + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN_ARG_LIST, + }), + (')', {format_token.Subtype.NONE}), + (':', [format_token.Subtype.NONE]), + ], + [ + ('return', [format_token.Subtype.NONE]), + ('-', {format_token.Subtype.UNARY_OPERATOR}), + ('x', [format_token.Subtype.NONE]), + ('[', {format_token.Subtype.SUBSCRIPT_BRACKET}), + (':', {format_token.Subtype.SUBSCRIPT_COLON}), + ('42', [format_token.Subtype.NONE]), + (']', {format_token.Subtype.SUBSCRIPT_BRACKET}), + ], + ]) + + def testFuncCallWithDefaultAssign(self): + code = textwrap.dedent(r""" + foo(x, a='hello world') + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckFormatTokenSubtypes(uwlines, [ + [ + ('foo', [format_token.Subtype.NONE]), + ('(', [format_token.Subtype.NONE]), + ('x', { + format_token.Subtype.NONE, + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN_ARG_LIST, + }), + (',', {format_token.Subtype.NONE}), + ('a', { + format_token.Subtype.NONE, + format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN_ARG_LIST, + }), + ('=', {format_token.Subtype.DEFAULT_OR_NAMED_ASSIGN}), + ("'hello world'", {format_token.Subtype.NONE}), + (')', [format_token.Subtype.NONE]), + ], + ]) + + def testSetComprehension(self): + code = textwrap.dedent("""\ + def foo(strs): + return {s.lower() for s in strs} + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckFormatTokenSubtypes(uwlines, [ + [ + ('def', [format_token.Subtype.NONE]), + ('foo', {format_token.Subtype.FUNC_DEF}), + ('(', {format_token.Subtype.NONE}), + ('strs', { + format_token.Subtype.NONE, + format_token.Subtype.PARAMETER_START, + format_token.Subtype.PARAMETER_STOP, + }), + (')', {format_token.Subtype.NONE}), + (':', [format_token.Subtype.NONE]), + ], + [ + ('return', [format_token.Subtype.NONE]), + ('{', [format_token.Subtype.NONE]), + ('s', {format_token.Subtype.COMP_EXPR}), + ('.', {format_token.Subtype.COMP_EXPR}), + ('lower', {format_token.Subtype.COMP_EXPR}), + ('(', {format_token.Subtype.COMP_EXPR}), + (')', {format_token.Subtype.COMP_EXPR}), + ('for', { + format_token.Subtype.DICT_SET_GENERATOR, + format_token.Subtype.COMP_FOR, + }), + ('s', {format_token.Subtype.COMP_FOR}), + ('in', {format_token.Subtype.COMP_FOR}), + ('strs', {format_token.Subtype.COMP_FOR}), + ('}', [format_token.Subtype.NONE]), + ], + ]) + + def testUnaryNotOperator(self): + code = textwrap.dedent("""\ + not a + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckFormatTokenSubtypes( + uwlines, [[('not', {format_token.Subtype.UNARY_OPERATOR}), + ('a', [format_token.Subtype.NONE])]]) + + def testBitwiseOperators(self): + code = textwrap.dedent("""\ + x = ((a | (b ^ 3) & c) << 3) >> 1 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckFormatTokenSubtypes(uwlines, [ + [ + ('x', [format_token.Subtype.NONE]), + ('=', {format_token.Subtype.ASSIGN_OPERATOR}), + ('(', [format_token.Subtype.NONE]), + ('(', [format_token.Subtype.NONE]), + ('a', [format_token.Subtype.NONE]), + ('|', {format_token.Subtype.BINARY_OPERATOR}), + ('(', [format_token.Subtype.NONE]), + ('b', [format_token.Subtype.NONE]), + ('^', {format_token.Subtype.BINARY_OPERATOR}), + ('3', [format_token.Subtype.NONE]), + (')', [format_token.Subtype.NONE]), + ('&', {format_token.Subtype.BINARY_OPERATOR}), + ('c', [format_token.Subtype.NONE]), + (')', [format_token.Subtype.NONE]), + ('<<', {format_token.Subtype.BINARY_OPERATOR}), + ('3', [format_token.Subtype.NONE]), + (')', [format_token.Subtype.NONE]), + ('>>', {format_token.Subtype.BINARY_OPERATOR}), + ('1', [format_token.Subtype.NONE]), + ], + ]) + + def testArithmeticOperators(self): + code = textwrap.dedent("""\ + x = ((a + (b - 3) * (1 % c) @ d) / 3) // 1 + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckFormatTokenSubtypes(uwlines, [ + [ + ('x', [format_token.Subtype.NONE]), + ('=', {format_token.Subtype.ASSIGN_OPERATOR}), + ('(', [format_token.Subtype.NONE]), + ('(', [format_token.Subtype.NONE]), + ('a', [format_token.Subtype.NONE]), + ('+', { + format_token.Subtype.BINARY_OPERATOR, + format_token.Subtype.A_EXPR_OPERATOR, + }), + ('(', [format_token.Subtype.NONE]), + ('b', [format_token.Subtype.NONE]), + ('-', { + format_token.Subtype.BINARY_OPERATOR, + format_token.Subtype.A_EXPR_OPERATOR, + format_token.Subtype.SIMPLE_EXPRESSION, + }), + ('3', [format_token.Subtype.NONE]), + (')', [format_token.Subtype.NONE]), + ('*', { + format_token.Subtype.BINARY_OPERATOR, + format_token.Subtype.M_EXPR_OPERATOR, + }), + ('(', [format_token.Subtype.NONE]), + ('1', [format_token.Subtype.NONE]), + ('%', { + format_token.Subtype.BINARY_OPERATOR, + format_token.Subtype.M_EXPR_OPERATOR, + format_token.Subtype.SIMPLE_EXPRESSION, + }), + ('c', [format_token.Subtype.NONE]), + (')', [format_token.Subtype.NONE]), + ('@', { + format_token.Subtype.BINARY_OPERATOR, + format_token.Subtype.M_EXPR_OPERATOR, + }), + ('d', [format_token.Subtype.NONE]), + (')', [format_token.Subtype.NONE]), + ('/', { + format_token.Subtype.BINARY_OPERATOR, + format_token.Subtype.M_EXPR_OPERATOR, + }), + ('3', [format_token.Subtype.NONE]), + (')', [format_token.Subtype.NONE]), + ('//', { + format_token.Subtype.BINARY_OPERATOR, + format_token.Subtype.M_EXPR_OPERATOR, + }), + ('1', [format_token.Subtype.NONE]), + ], + ]) + + def testSubscriptColon(self): + code = textwrap.dedent("""\ + x[0:42:1] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckFormatTokenSubtypes(uwlines, [ + [ + ('x', [format_token.Subtype.NONE]), + ('[', {format_token.Subtype.SUBSCRIPT_BRACKET}), + ('0', [format_token.Subtype.NONE]), + (':', {format_token.Subtype.SUBSCRIPT_COLON}), + ('42', [format_token.Subtype.NONE]), + (':', {format_token.Subtype.SUBSCRIPT_COLON}), + ('1', [format_token.Subtype.NONE]), + (']', {format_token.Subtype.SUBSCRIPT_BRACKET}), + ], + ]) + + def testFunctionCallWithStarExpression(self): + code = textwrap.dedent("""\ + [a, *b] + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + self._CheckFormatTokenSubtypes(uwlines, [ + [ + ('[', [format_token.Subtype.NONE]), + ('a', [format_token.Subtype.NONE]), + (',', [format_token.Subtype.NONE]), + ('*', { + format_token.Subtype.UNARY_OPERATOR, + format_token.Subtype.VARARGS_STAR, + }), + ('b', [format_token.Subtype.NONE]), + (']', [format_token.Subtype.NONE]), + ], + ]) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/unwrapped_line_test.py b/.venv/lib/python3.9/site-packages/yapftests/unwrapped_line_test.py new file mode 100644 index 00000000..90be1a13 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/unwrapped_line_test.py @@ -0,0 +1,96 @@ +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.unwrapped_line.""" + +import textwrap +import unittest + +from lib2to3 import pytree +from lib2to3.pgen2 import token + +from yapf.yapflib import format_token +from yapf.yapflib import split_penalty +from yapf.yapflib import unwrapped_line + +from yapftests import yapf_test_helper + + +class UnwrappedLineBasicTest(unittest.TestCase): + + def testConstruction(self): + toks = _MakeFormatTokenList([(token.DOT, '.'), (token.VBAR, '|')]) + uwl = unwrapped_line.UnwrappedLine(20, toks) + self.assertEqual(20, uwl.depth) + self.assertEqual(['DOT', 'VBAR'], [tok.name for tok in uwl.tokens]) + + def testFirstLast(self): + toks = _MakeFormatTokenList([(token.DOT, '.'), (token.LPAR, '('), + (token.VBAR, '|')]) + uwl = unwrapped_line.UnwrappedLine(20, toks) + self.assertEqual(20, uwl.depth) + self.assertEqual('DOT', uwl.first.name) + self.assertEqual('VBAR', uwl.last.name) + + def testAsCode(self): + toks = _MakeFormatTokenList([(token.DOT, '.'), (token.LPAR, '('), + (token.VBAR, '|')]) + uwl = unwrapped_line.UnwrappedLine(2, toks) + self.assertEqual(' . ( |', uwl.AsCode()) + + def testAppendToken(self): + uwl = unwrapped_line.UnwrappedLine(0) + uwl.AppendToken(_MakeFormatTokenLeaf(token.LPAR, '(')) + uwl.AppendToken(_MakeFormatTokenLeaf(token.RPAR, ')')) + self.assertEqual(['LPAR', 'RPAR'], [tok.name for tok in uwl.tokens]) + + def testAppendNode(self): + uwl = unwrapped_line.UnwrappedLine(0) + uwl.AppendNode(pytree.Leaf(token.LPAR, '(')) + uwl.AppendNode(pytree.Leaf(token.RPAR, ')')) + self.assertEqual(['LPAR', 'RPAR'], [tok.name for tok in uwl.tokens]) + + +class UnwrappedLineFormattingInformationTest(yapf_test_helper.YAPFTest): + + def testFuncDef(self): + code = textwrap.dedent(r""" + def f(a, b): + pass + """) + uwlines = yapf_test_helper.ParseAndUnwrap(code) + + f = uwlines[0].tokens[1] + self.assertFalse(f.can_break_before) + self.assertFalse(f.must_break_before) + self.assertEqual(f.split_penalty, split_penalty.UNBREAKABLE) + + lparen = uwlines[0].tokens[2] + self.assertFalse(lparen.can_break_before) + self.assertFalse(lparen.must_break_before) + self.assertEqual(lparen.split_penalty, split_penalty.UNBREAKABLE) + + +def _MakeFormatTokenLeaf(token_type, token_value): + return format_token.FormatToken(pytree.Leaf(token_type, token_value)) + + +def _MakeFormatTokenList(token_type_values): + return [ + _MakeFormatTokenLeaf(token_type, token_value) + for token_type, token_value in token_type_values + ] + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/utils.py b/.venv/lib/python3.9/site-packages/yapftests/utils.py new file mode 100644 index 00000000..268b8c43 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/utils.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Utilities for tests.""" + +import contextlib +import io +import os +import sys +import tempfile + + +@contextlib.contextmanager +def stdout_redirector(stream): # pylint: disable=invalid-name + old_stdout = sys.stdout + sys.stdout = stream + try: + yield + finally: + sys.stdout = old_stdout + + +# NamedTemporaryFile is useless because on Windows the temporary file would be +# created with O_TEMPORARY, which would not allow the file to be opened a +# second time, even by the same process, unless the same flag is used. +# Thus we provide a simplified version ourselves. +# +# Note: returns a tuple of (io.file_obj, file_path), instead of a file_obj with +# a .name attribute +# +# Note: `buffering` is set to -1 despite documentation of NamedTemporaryFile +# says None. This is probably a problem with the python documentation. +@contextlib.contextmanager +def NamedTempFile(mode='w+b', + buffering=-1, + encoding=None, + errors=None, + newline=None, + suffix=None, + prefix=None, + dirname=None, + text=False): + """Context manager creating a new temporary file in text mode.""" + if sys.version_info < (3, 5): # covers also python 2 + if suffix is None: + suffix = '' + if prefix is None: + prefix = 'tmp' + (fd, fname) = tempfile.mkstemp( + suffix=suffix, prefix=prefix, dir=dirname, text=text) + f = io.open( + fd, + mode=mode, + buffering=buffering, + encoding=encoding, + errors=errors, + newline=newline) + yield f, fname + f.close() + os.remove(fname) + + +@contextlib.contextmanager +def TempFileContents(dirname, + contents, + encoding='utf-8', + newline='', + suffix=None): + # Note: NamedTempFile properly handles unicode encoding when using mode='w' + with NamedTempFile( + dirname=dirname, + mode='w', + encoding=encoding, + newline=newline, + suffix=suffix) as (f, fname): + f.write(contents) + f.flush() + yield fname diff --git a/.venv/lib/python3.9/site-packages/yapftests/yapf_test.py b/.venv/lib/python3.9/site-packages/yapftests/yapf_test.py new file mode 100644 index 00000000..e3e3df38 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/yapf_test.py @@ -0,0 +1,2038 @@ +# -*- coding: utf-8 -*- +# Copyright 2015 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for yapf.yapf.""" + +import io +import logging +import os +import shutil +import subprocess +import sys +import tempfile +import textwrap +import unittest + +from lib2to3.pgen2 import tokenize + +from yapf.yapflib import py3compat +from yapf.yapflib import style +from yapf.yapflib import yapf_api + +from yapftests import utils +from yapftests import yapf_test_helper + +ROOT_DIR = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) + +# Verification is turned off by default, but want to enable it for testing. +YAPF_BINARY = [sys.executable, '-m', 'yapf', '--verify', '--no-local-style'] + + +class FormatCodeTest(yapf_test_helper.YAPFTest): + + def _Check(self, unformatted_code, expected_formatted_code): + formatted_code, _ = yapf_api.FormatCode( + unformatted_code, style_config='yapf') + self.assertCodeEqual(expected_formatted_code, formatted_code) + + def testSimple(self): + unformatted_code = textwrap.dedent("""\ + print('foo') + """) + self._Check(unformatted_code, unformatted_code) + + def testNoEndingNewline(self): + unformatted_code = textwrap.dedent("""\ + if True: + pass""") + expected_formatted_code = textwrap.dedent("""\ + if True: + pass + """) + self._Check(unformatted_code, expected_formatted_code) + + def testPrintAfterPeriod(self): + unformatted_code = textwrap.dedent("""a.print\n""") + expected_formatted_code = textwrap.dedent("""a.print\n""") + self._Check(unformatted_code, expected_formatted_code) + + +class FormatFileTest(unittest.TestCase): + + def setUp(self): # pylint: disable=g-missing-super-call + self.test_tmpdir = tempfile.mkdtemp() + + def tearDown(self): # pylint: disable=g-missing-super-call + shutil.rmtree(self.test_tmpdir) + + def assertCodeEqual(self, expected_code, code): + if code != expected_code: + msg = 'Code format mismatch:\n' + msg += 'Expected:\n >' + msg += '\n > '.join(expected_code.splitlines()) + msg += '\nActual:\n >' + msg += '\n > '.join(code.splitlines()) + # TODO(sbc): maybe using difflib here to produce easy to read deltas? + self.fail(msg) + + def testFormatFile(self): + unformatted_code = textwrap.dedent(u"""\ + if True: + pass + """) + expected_formatted_code_pep8 = textwrap.dedent(u"""\ + if True: + pass + """) + expected_formatted_code_yapf = textwrap.dedent(u"""\ + if True: + pass + """) + with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') + self.assertCodeEqual(expected_formatted_code_pep8, formatted_code) + + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='yapf') + self.assertCodeEqual(expected_formatted_code_yapf, formatted_code) + + def testDisableLinesPattern(self): + unformatted_code = textwrap.dedent(u"""\ + if a: b + + # yapf: disable + if f: g + + if h: i + """) + expected_formatted_code = textwrap.dedent(u"""\ + if a: b + + # yapf: disable + if f: g + + if h: i + """) + with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') + self.assertCodeEqual(expected_formatted_code, formatted_code) + + def testDisableAndReenableLinesPattern(self): + unformatted_code = textwrap.dedent(u"""\ + if a: b + + # yapf: disable + if f: g + # yapf: enable + + if h: i + """) + expected_formatted_code = textwrap.dedent(u"""\ + if a: b + + # yapf: disable + if f: g + # yapf: enable + + if h: i + """) + with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') + self.assertCodeEqual(expected_formatted_code, formatted_code) + + def testDisablePartOfMultilineComment(self): + unformatted_code = textwrap.dedent(u"""\ + if a: b + + # This is a multiline comment that disables YAPF. + # yapf: disable + if f: g + # yapf: enable + # This is a multiline comment that enables YAPF. + + if h: i + """) + + expected_formatted_code = textwrap.dedent(u"""\ + if a: b + + # This is a multiline comment that disables YAPF. + # yapf: disable + if f: g + # yapf: enable + # This is a multiline comment that enables YAPF. + + if h: i + """) + with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') + self.assertCodeEqual(expected_formatted_code, formatted_code) + + code = textwrap.dedent(u"""\ + def foo_function(): + # some comment + # yapf: disable + + foo( + bar, + baz + ) + + # yapf: enable + """) + with utils.TempFileContents(self.test_tmpdir, code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') + self.assertCodeEqual(code, formatted_code) + + def testEnabledDisabledSameComment(self): + code = textwrap.dedent(u"""\ + # yapf: disable + a(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, ccccccccccccccccccccccccccccccc, ddddddddddddddddddddddd, eeeeeeeeeeeeeeeeeeeeeeeeeee) + # yapf: enable + # yapf: disable + a(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, ccccccccccccccccccccccccccccccc, ddddddddddddddddddddddd, eeeeeeeeeeeeeeeeeeeeeeeeeee) + # yapf: enable + """) + with utils.TempFileContents(self.test_tmpdir, code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') + self.assertCodeEqual(code, formatted_code) + + def testFormatFileLinesSelection(self): + unformatted_code = textwrap.dedent(u"""\ + if a: b + + if f: g + + if h: i + """) + expected_formatted_code_lines1and2 = textwrap.dedent(u"""\ + if a: b + + if f: g + + if h: i + """) + expected_formatted_code_lines3 = textwrap.dedent(u"""\ + if a: b + + if f: g + + if h: i + """) + with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile( + filepath, style_config='pep8', lines=[(1, 2)]) + self.assertCodeEqual(expected_formatted_code_lines1and2, formatted_code) + formatted_code, _, _ = yapf_api.FormatFile( + filepath, style_config='pep8', lines=[(3, 3)]) + self.assertCodeEqual(expected_formatted_code_lines3, formatted_code) + + def testFormatFileDiff(self): + unformatted_code = textwrap.dedent(u"""\ + if True: + pass + """) + with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: + diff, _, _ = yapf_api.FormatFile(filepath, print_diff=True) + self.assertIn(u'+ pass', diff) + + def testFormatFileInPlace(self): + unformatted_code = u'True==False\n' + formatted_code = u'True == False\n' + with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: + result, _, _ = yapf_api.FormatFile(filepath, in_place=True) + self.assertEqual(result, None) + with open(filepath) as fd: + if sys.version_info[0] <= 2: + self.assertCodeEqual(formatted_code, fd.read().decode('ascii')) + else: + self.assertCodeEqual(formatted_code, fd.read()) + + self.assertRaises( + ValueError, + yapf_api.FormatFile, + filepath, + in_place=True, + print_diff=True) + + def testNoFile(self): + stream = py3compat.StringIO() + handler = logging.StreamHandler(stream) + logger = logging.getLogger('mylogger') + logger.addHandler(handler) + self.assertRaises( + IOError, yapf_api.FormatFile, 'not_a_file.py', logger=logger.error) + self.assertEqual(stream.getvalue(), + "[Errno 2] No such file or directory: 'not_a_file.py'\n") + + def testCommentsUnformatted(self): + code = textwrap.dedent(u"""\ + foo = [# A list of things + # bork + 'one', + # quark + 'two'] # yapf: disable + """) + with utils.TempFileContents(self.test_tmpdir, code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') + self.assertCodeEqual(code, formatted_code) + + def testDisabledHorizontalFormattingOnNewLine(self): + code = textwrap.dedent(u"""\ + # yapf: disable + a = [ + 1] + # yapf: enable + """) + with utils.TempFileContents(self.test_tmpdir, code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') + self.assertCodeEqual(code, formatted_code) + + def testSplittingSemicolonStatements(self): + unformatted_code = textwrap.dedent(u"""\ + def f(): + x = y + 42 ; z = n * 42 + if True: a += 1 ; b += 1; c += 1 + """) + expected_formatted_code = textwrap.dedent(u"""\ + def f(): + x = y + 42 + z = n * 42 + if True: + a += 1 + b += 1 + c += 1 + """) + with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') + self.assertCodeEqual(expected_formatted_code, formatted_code) + + def testSemicolonStatementsDisabled(self): + unformatted_code = textwrap.dedent(u"""\ + def f(): + x = y + 42 ; z = n * 42 # yapf: disable + if True: a += 1 ; b += 1; c += 1 + """) + expected_formatted_code = textwrap.dedent(u"""\ + def f(): + x = y + 42 ; z = n * 42 # yapf: disable + if True: + a += 1 + b += 1 + c += 1 + """) + with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') + self.assertCodeEqual(expected_formatted_code, formatted_code) + + def testDisabledSemiColonSeparatedStatements(self): + code = textwrap.dedent(u"""\ + # yapf: disable + if True: a ; b + """) + with utils.TempFileContents(self.test_tmpdir, code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') + self.assertCodeEqual(code, formatted_code) + + def testDisabledMultilineStringInDictionary(self): + code = textwrap.dedent(u"""\ + # yapf: disable + + A = [ + { + "aaaaaaaaaaaaaaaaaaa": ''' + bbbbbbbbbbb: "ccccccccccc" + dddddddddddddd: 1 + eeeeeeee: 0 + ffffffffff: "ggggggg" + ''', + }, + ] + """) + with utils.TempFileContents(self.test_tmpdir, code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='yapf') + self.assertCodeEqual(code, formatted_code) + + def testDisabledWithPrecedingText(self): + code = textwrap.dedent(u"""\ + # TODO(fix formatting): yapf: disable + + A = [ + { + "aaaaaaaaaaaaaaaaaaa": ''' + bbbbbbbbbbb: "ccccccccccc" + dddddddddddddd: 1 + eeeeeeee: 0 + ffffffffff: "ggggggg" + ''', + }, + ] + """) + with utils.TempFileContents(self.test_tmpdir, code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='yapf') + self.assertCodeEqual(code, formatted_code) + + def testCRLFLineEnding(self): + code = u'class _():\r\n pass\r\n' + with utils.TempFileContents(self.test_tmpdir, code) as filepath: + formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='yapf') + self.assertCodeEqual(code, formatted_code) + + +class CommandLineTest(unittest.TestCase): + """Test how calling yapf from the command line acts.""" + + @classmethod + def setUpClass(cls): # pylint: disable=g-missing-super-call + cls.test_tmpdir = tempfile.mkdtemp() + + @classmethod + def tearDownClass(cls): # pylint: disable=g-missing-super-call + shutil.rmtree(cls.test_tmpdir) + + def assertYapfReformats(self, + unformatted, + expected, + extra_options=None, + env=None): + """Check that yapf reformats the given code as expected. + + Invokes yapf in a subprocess, piping the unformatted code into its stdin. + Checks that the formatted output is as expected. + + Arguments: + unformatted: unformatted code - input to yapf + expected: expected formatted code at the output of yapf + extra_options: iterable of extra command-line options to pass to yapf + env: dict of environment variables. + """ + cmdline = YAPF_BINARY + (extra_options or []) + p = subprocess.Popen( + cmdline, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, + env=env) + reformatted_code, stderrdata = p.communicate( + unformatted.encode('utf-8-sig')) + self.assertEqual(stderrdata, b'') + self.assertMultiLineEqual(reformatted_code.decode('utf-8'), expected) + + def testUnicodeEncodingPipedToFile(self): + unformatted_code = textwrap.dedent(u"""\ + def foo(): + print('⇒') + """) + with utils.NamedTempFile( + dirname=self.test_tmpdir, suffix='.py') as (out, _): + with utils.TempFileContents( + self.test_tmpdir, unformatted_code, suffix='.py') as filepath: + subprocess.check_call(YAPF_BINARY + ['--diff', filepath], stdout=out) + + def testInPlaceReformatting(self): + unformatted_code = textwrap.dedent(u"""\ + def foo(): + x = 37 + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): + x = 37 + """) + with utils.TempFileContents( + self.test_tmpdir, unformatted_code, suffix='.py') as filepath: + p = subprocess.Popen(YAPF_BINARY + ['--in-place', filepath]) + p.wait() + with io.open(filepath, mode='r', newline='') as fd: + reformatted_code = fd.read() + self.assertEqual(reformatted_code, expected_formatted_code) + + def testInPlaceReformattingBlank(self): + unformatted_code = u'\n\n' + expected_formatted_code = u'\n' + with utils.TempFileContents( + self.test_tmpdir, unformatted_code, suffix='.py') as filepath: + p = subprocess.Popen(YAPF_BINARY + ['--in-place', filepath]) + p.wait() + with io.open(filepath, mode='r', encoding='utf-8', newline='') as fd: + reformatted_code = fd.read() + self.assertEqual(reformatted_code, expected_formatted_code) + + def testInPlaceReformattingEmpty(self): + unformatted_code = u'' + expected_formatted_code = u'' + with utils.TempFileContents( + self.test_tmpdir, unformatted_code, suffix='.py') as filepath: + p = subprocess.Popen(YAPF_BINARY + ['--in-place', filepath]) + p.wait() + with io.open(filepath, mode='r', encoding='utf-8', newline='') as fd: + reformatted_code = fd.read() + self.assertEqual(reformatted_code, expected_formatted_code) + + def testReadFromStdin(self): + unformatted_code = textwrap.dedent("""\ + def foo(): + x = 37 + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): + x = 37 + """) + self.assertYapfReformats(unformatted_code, expected_formatted_code) + + def testReadFromStdinWithEscapedStrings(self): + unformatted_code = textwrap.dedent("""\ + s = "foo\\nbar" + """) + expected_formatted_code = textwrap.dedent("""\ + s = "foo\\nbar" + """) + self.assertYapfReformats(unformatted_code, expected_formatted_code) + + def testSetYapfStyle(self): + unformatted_code = textwrap.dedent("""\ + def foo(): # trail + x = 37 + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): # trail + x = 37 + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style=yapf']) + + def testSetCustomStyleBasedOnYapf(self): + unformatted_code = textwrap.dedent("""\ + def foo(): # trail + x = 37 + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): # trail + x = 37 + """) + style_file = textwrap.dedent(u'''\ + [style] + based_on_style = yapf + spaces_before_comment = 4 + ''') + with utils.TempFileContents(self.test_tmpdir, style_file) as stylepath: + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style={0}'.format(stylepath)]) + + def testSetCustomStyleSpacesBeforeComment(self): + unformatted_code = textwrap.dedent("""\ + a_very_long_statement_that_extends_way_beyond # Comment + short # This is a shorter statement + """) + expected_formatted_code = textwrap.dedent("""\ + a_very_long_statement_that_extends_way_beyond # Comment + short # This is a shorter statement + """) + style_file = textwrap.dedent(u'''\ + [style] + spaces_before_comment = 15, 20 + ''') + with utils.TempFileContents(self.test_tmpdir, style_file) as stylepath: + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style={0}'.format(stylepath)]) + + def testReadSingleLineCodeFromStdin(self): + unformatted_code = textwrap.dedent("""\ + if True: pass + """) + expected_formatted_code = textwrap.dedent("""\ + if True: pass + """) + self.assertYapfReformats(unformatted_code, expected_formatted_code) + + def testEncodingVerification(self): + unformatted_code = textwrap.dedent(u"""\ + '''The module docstring.''' + # -*- coding: utf-8 -*- + def f(): + x = 37 + """) + + with utils.NamedTempFile( + suffix='.py', dirname=self.test_tmpdir) as (out, _): + with utils.TempFileContents( + self.test_tmpdir, unformatted_code, suffix='.py') as filepath: + try: + subprocess.check_call(YAPF_BINARY + ['--diff', filepath], stdout=out) + except subprocess.CalledProcessError as e: + # Indicates the text changed. + self.assertEqual(e.returncode, 1) # pylint: disable=g-assert-in-except + + def testReformattingSpecificLines(self): + unformatted_code = textwrap.dedent("""\ + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + + def g(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + + def g(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + """) + # TODO(ambv): the `expected_formatted_code` here is not PEP8 compliant, + # raising "E129 visually indented line with same indent as next logical + # line" with flake8. + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '1-2']) + + def testOmitFormattingLinesBeforeDisabledFunctionComment(self): + unformatted_code = textwrap.dedent("""\ + import sys + + # Comment + def some_func(x): + x = ["badly" , "formatted","line" ] + """) + expected_formatted_code = textwrap.dedent("""\ + import sys + + # Comment + def some_func(x): + x = ["badly", "formatted", "line"] + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '5-5']) + + def testReformattingSkippingLines(self): + unformatted_code = textwrap.dedent("""\ + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + # yapf: disable + def g(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + # yapf: enable + """) + expected_formatted_code = textwrap.dedent("""\ + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + + # yapf: disable + def g(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + # yapf: enable + """) + self.assertYapfReformats(unformatted_code, expected_formatted_code) + + def testReformattingSkippingToEndOfFile(self): + unformatted_code = textwrap.dedent("""\ + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + # yapf: disable + def g(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + def f(): + def e(): + while (xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz].aaaaaaaa[0]) == + 'bbbbbbb'): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + + # yapf: disable + def g(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + def f(): + def e(): + while (xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz].aaaaaaaa[0]) == + 'bbbbbbb'): + pass + """) + self.assertYapfReformats(unformatted_code, expected_formatted_code) + + def testReformattingSkippingSingleLine(self): + unformatted_code = textwrap.dedent("""\ + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + def g(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): # yapf: disable + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + + def g(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): # yapf: disable + pass + """) + self.assertYapfReformats(unformatted_code, expected_formatted_code) + + def testDisableWholeDataStructure(self): + unformatted_code = textwrap.dedent("""\ + A = set([ + 'hello', + 'world', + ]) # yapf: disable + """) + expected_formatted_code = textwrap.dedent("""\ + A = set([ + 'hello', + 'world', + ]) # yapf: disable + """) + self.assertYapfReformats(unformatted_code, expected_formatted_code) + + def testDisableButAdjustIndentations(self): + unformatted_code = textwrap.dedent("""\ + class SplitPenaltyTest(unittest.TestCase): + def testUnbreakable(self): + self._CheckPenalties(tree, [ + ]) # yapf: disable + """) + expected_formatted_code = textwrap.dedent("""\ + class SplitPenaltyTest(unittest.TestCase): + def testUnbreakable(self): + self._CheckPenalties(tree, [ + ]) # yapf: disable + """) + self.assertYapfReformats(unformatted_code, expected_formatted_code) + + def testRetainingHorizontalWhitespace(self): + unformatted_code = textwrap.dedent("""\ + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + def g(): + if (xxxxxxxxxxxx.yyyyyyyy (zzzzzzzzzzzzz [0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): # yapf: disable + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + + def g(): + if (xxxxxxxxxxxx.yyyyyyyy (zzzzzzzzzzzzz [0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): # yapf: disable + pass + """) + self.assertYapfReformats(unformatted_code, expected_formatted_code) + + def testRetainingVerticalWhitespace(self): + unformatted_code = textwrap.dedent("""\ + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + def g(): + + + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def h(): + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and + xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + pass + + def g(): + + + if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): + + pass + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '1-2']) + + unformatted_code = textwrap.dedent("""\ + + + if a: b + + + if c: + to_much + indent + + same + + + + #comment + + # trailing whitespace + """) + expected_formatted_code = textwrap.dedent("""\ + if a: b + + + if c: + to_much + indent + + same + + + + #comment + + # trailing whitespace + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '3-3', '--lines', '13-13']) + + unformatted_code = textwrap.dedent("""\ + ''' + docstring + + ''' + + import blah + """) + + self.assertYapfReformats( + unformatted_code, unformatted_code, extra_options=['--lines', '2-2']) + + def testVerticalSpacingWithCommentWithContinuationMarkers(self): + unformatted_code = """\ +# \\ +# \\ +# \\ + +x = { +} +""" + expected_formatted_code = """\ +# \\ +# \\ +# \\ + +x = { +} +""" + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '1-1']) + + def testRetainingSemicolonsWhenSpecifyingLines(self): + unformatted_code = textwrap.dedent("""\ + a = line_to_format + def f(): + x = y + 42; z = n * 42 + if True: a += 1 ; b += 1 ; c += 1 + """) + expected_formatted_code = textwrap.dedent("""\ + a = line_to_format + + + def f(): + x = y + 42; z = n * 42 + if True: a += 1 ; b += 1 ; c += 1 + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '1-1']) + + def testDisabledMultilineStrings(self): + unformatted_code = textwrap.dedent('''\ + foo=42 + def f(): + email_text += """This is a really long docstring that goes over the column limit and is multi-line.

+ Czar: """+despot["Nicholas"]+"""
+ Minion: """+serf["Dmitri"]+"""
+ Residence: """+palace["Winter"]+"""
+ + """ + ''') + expected_formatted_code = textwrap.dedent('''\ + foo = 42 + + + def f(): + email_text += """This is a really long docstring that goes over the column limit and is multi-line.

+ Czar: """+despot["Nicholas"]+"""
+ Minion: """+serf["Dmitri"]+"""
+ Residence: """+palace["Winter"]+"""
+ + """ + ''') + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '1-1']) + + def testDisableWhenSpecifyingLines(self): + unformatted_code = textwrap.dedent("""\ + # yapf: disable + A = set([ + 'hello', + 'world', + ]) + # yapf: enable + B = set([ + 'hello', + 'world', + ]) # yapf: disable + """) + expected_formatted_code = textwrap.dedent("""\ + # yapf: disable + A = set([ + 'hello', + 'world', + ]) + # yapf: enable + B = set([ + 'hello', + 'world', + ]) # yapf: disable + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '1-10']) + + def testDisableFormattingInDataLiteral(self): + unformatted_code = textwrap.dedent("""\ + def horrible(): + oh_god() + why_would_you() + [ + 'do', + + 'that', + ] + + def still_horrible(): + oh_god() + why_would_you() + [ + 'do', + + 'that' + ] + """) + expected_formatted_code = textwrap.dedent("""\ + def horrible(): + oh_god() + why_would_you() + [ + 'do', + + 'that', + ] + + def still_horrible(): + oh_god() + why_would_you() + ['do', 'that'] + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '14-15']) + + def testRetainVerticalFormattingBetweenDisabledAndEnabledLines(self): + unformatted_code = textwrap.dedent("""\ + class A(object): + def aaaaaaaaaaaaa(self): + c = bbbbbbbbb.ccccccccc('challenge', 0, 1, 10) + self.assertEqual( + ('ddddddddddddddddddddddddd', + 'eeeeeeeeeeeeeeeeeeeeeeeee.%s' % + c.ffffffffffff), + gggggggggggg.hhhhhhhhh(c, c.ffffffffffff)) + iiiii = jjjjjjjjjjjjjj.iiiii + """) + expected_formatted_code = textwrap.dedent("""\ + class A(object): + def aaaaaaaaaaaaa(self): + c = bbbbbbbbb.ccccccccc('challenge', 0, 1, 10) + self.assertEqual(('ddddddddddddddddddddddddd', + 'eeeeeeeeeeeeeeeeeeeeeeeee.%s' % c.ffffffffffff), + gggggggggggg.hhhhhhhhh(c, c.ffffffffffff)) + iiiii = jjjjjjjjjjjjjj.iiiii + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '4-7']) + + def testRetainVerticalFormattingBetweenDisabledLines(self): + unformatted_code = textwrap.dedent("""\ + class A(object): + def aaaaaaaaaaaaa(self): + pass + + + def bbbbbbbbbbbbb(self): # 5 + pass + """) + expected_formatted_code = textwrap.dedent("""\ + class A(object): + def aaaaaaaaaaaaa(self): + pass + + def bbbbbbbbbbbbb(self): # 5 + pass + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '4-4']) + + def testFormatLinesSpecifiedInMiddleOfExpression(self): + unformatted_code = textwrap.dedent("""\ + class A(object): + def aaaaaaaaaaaaa(self): + c = bbbbbbbbb.ccccccccc('challenge', 0, 1, 10) + self.assertEqual( + ('ddddddddddddddddddddddddd', + 'eeeeeeeeeeeeeeeeeeeeeeeee.%s' % + c.ffffffffffff), + gggggggggggg.hhhhhhhhh(c, c.ffffffffffff)) + iiiii = jjjjjjjjjjjjjj.iiiii + """) + expected_formatted_code = textwrap.dedent("""\ + class A(object): + def aaaaaaaaaaaaa(self): + c = bbbbbbbbb.ccccccccc('challenge', 0, 1, 10) + self.assertEqual(('ddddddddddddddddddddddddd', + 'eeeeeeeeeeeeeeeeeeeeeeeee.%s' % c.ffffffffffff), + gggggggggggg.hhhhhhhhh(c, c.ffffffffffff)) + iiiii = jjjjjjjjjjjjjj.iiiii + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '5-6']) + + def testCommentFollowingMultilineString(self): + unformatted_code = textwrap.dedent("""\ + def foo(): + '''First line. + Second line. + ''' # comment + x = '''hello world''' # second comment + return 42 # another comment + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): + '''First line. + Second line. + ''' # comment + x = '''hello world''' # second comment + return 42 # another comment + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '1-1']) + + def testDedentClosingBracket(self): + # no line-break on the first argument, not dedenting closing brackets + unformatted_code = textwrap.dedent("""\ + def overly_long_function_name(first_argument_on_the_same_line, + second_argument_makes_the_line_too_long): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def overly_long_function_name(first_argument_on_the_same_line, + second_argument_makes_the_line_too_long): + pass + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style=pep8']) + + # TODO(ambv): currently the following produces the closing bracket on a new + # line but indented to the opening bracket which is the worst of both + # worlds. Expected behaviour would be to format as --style=pep8 does in + # this case. + # self.assertYapfReformats(unformatted_code, expected_formatted_code, + # extra_options=['--style=facebook']) + + # line-break before the first argument, dedenting closing brackets if set + unformatted_code = textwrap.dedent("""\ + def overly_long_function_name( + first_argument_on_the_same_line, + second_argument_makes_the_line_too_long): + pass + """) + # expected_formatted_pep8_code = textwrap.dedent("""\ + # def overly_long_function_name( + # first_argument_on_the_same_line, + # second_argument_makes_the_line_too_long): + # pass + # """) + expected_formatted_fb_code = textwrap.dedent("""\ + def overly_long_function_name( + first_argument_on_the_same_line, second_argument_makes_the_line_too_long + ): + pass + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_fb_code, + extra_options=['--style=facebook']) + # TODO(ambv): currently the following produces code that is not PEP8 + # compliant, raising "E125 continuation line with same indent as next + # logical line" with flake8. Expected behaviour for PEP8 would be to use + # double-indentation here. + # self.assertYapfReformats(unformatted_code, expected_formatted_pep8_code, + # extra_options=['--style=pep8']) + + def testCoalesceBrackets(self): + unformatted_code = textwrap.dedent("""\ + some_long_function_name_foo( + { + 'first_argument_of_the_thing': id, + 'second_argument_of_the_thing': "some thing" + } + )""") + expected_formatted_code = textwrap.dedent("""\ + some_long_function_name_foo({ + 'first_argument_of_the_thing': id, + 'second_argument_of_the_thing': "some thing" + }) + """) + with utils.NamedTempFile(dirname=self.test_tmpdir, mode='w') as (f, name): + f.write( + textwrap.dedent(u'''\ + [style] + column_limit=82 + coalesce_brackets = True + ''')) + f.flush() + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style={0}'.format(name)]) + + def testPseudoParenSpaces(self): + unformatted_code = textwrap.dedent("""\ + def foo(): + def bar(): + return {msg_id: author for author, msg_id in reader} + """) + expected_formatted_code = textwrap.dedent("""\ + def foo(): + + def bar(): + return {msg_id: author for author, msg_id in reader} + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '1-1', '--style', 'yapf']) + + def testMultilineCommentFormattingDisabled(self): + unformatted_code = textwrap.dedent("""\ + # This is a comment + FOO = { + aaaaaaaa.ZZZ: [ + bbbbbbbbbb.Pop(), + # Multiline comment. + # Line two. + bbbbbbbbbb.Pop(), + ], + 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx': + ('yyyyy', zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz), + '#': lambda x: x # do nothing + } + """) + expected_formatted_code = textwrap.dedent("""\ + # This is a comment + FOO = { + aaaaaaaa.ZZZ: [ + bbbbbbbbbb.Pop(), + # Multiline comment. + # Line two. + bbbbbbbbbb.Pop(), + ], + 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx': + ('yyyyy', zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz), + '#': lambda x: x # do nothing + } + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '1-1', '--style', 'yapf']) + + def testTrailingCommentsWithDisabledFormatting(self): + unformatted_code = textwrap.dedent("""\ + import os + + SCOPES = [ + 'hello world' # This is a comment. + ] + """) + expected_formatted_code = textwrap.dedent("""\ + import os + + SCOPES = [ + 'hello world' # This is a comment. + ] + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '1-1', '--style', 'yapf']) + + def testUseTabs(self): + unformatted_code = """\ +def foo_function(): + if True: + pass +""" + expected_formatted_code = """\ +def foo_function(): + if True: + pass +""" + style_contents = u"""\ +[style] +based_on_style = yapf +USE_TABS = true +INDENT_WIDTH=1 +""" + with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath: + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style={0}'.format(stylepath)]) + + def testUseTabsWith(self): + unformatted_code = """\ +def f(): + return ['hello', 'world',] +""" + expected_formatted_code = """\ +def f(): + return [ + 'hello', + 'world', + ] +""" + style_contents = u"""\ +[style] +based_on_style = yapf +USE_TABS = true +INDENT_WIDTH=1 +""" + with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath: + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style={0}'.format(stylepath)]) + + def testUseTabsContinuationAlignStyleFixed(self): + unformatted_code = """\ +def foo_function(arg1, arg2, arg3): + return ['hello', 'world',] +""" + expected_formatted_code = """\ +def foo_function( + arg1, arg2, arg3): + return [ + 'hello', + 'world', + ] +""" + style_contents = u"""\ +[style] +based_on_style = yapf +USE_TABS = true +COLUMN_LIMIT=32 +INDENT_WIDTH=4 +CONTINUATION_INDENT_WIDTH=8 +CONTINUATION_ALIGN_STYLE = fixed +""" + with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath: + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style={0}'.format(stylepath)]) + + def testUseTabsContinuationAlignStyleVAlignRight(self): + unformatted_code = """\ +def foo_function(arg1, arg2, arg3): + return ['hello', 'world',] +""" + expected_formatted_code = """\ +def foo_function(arg1, arg2, + arg3): + return [ + 'hello', + 'world', + ] +""" + style_contents = u"""\ +[style] +based_on_style = yapf +USE_TABS = true +COLUMN_LIMIT=32 +INDENT_WIDTH=4 +CONTINUATION_INDENT_WIDTH=8 +CONTINUATION_ALIGN_STYLE = valign-right +""" + with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath: + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style={0}'.format(stylepath)]) + + def testUseSpacesContinuationAlignStyleFixed(self): + unformatted_code = """\ +def foo_function(arg1, arg2, arg3): + return ['hello', 'world',] +""" + expected_formatted_code = """\ +def foo_function( + arg1, arg2, arg3): + return [ + 'hello', + 'world', + ] +""" + style_contents = u"""\ +[style] +based_on_style = yapf +COLUMN_LIMIT=32 +INDENT_WIDTH=4 +CONTINUATION_INDENT_WIDTH=8 +CONTINUATION_ALIGN_STYLE = fixed +""" + with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath: + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style={0}'.format(stylepath)]) + + def testUseSpacesContinuationAlignStyleVAlignRight(self): + unformatted_code = """\ +def foo_function(arg1, arg2, arg3): + return ['hello', 'world',] +""" + expected_formatted_code = """\ +def foo_function(arg1, arg2, + arg3): + return [ + 'hello', + 'world', + ] +""" + style_contents = u"""\ +[style] +based_on_style = yapf +COLUMN_LIMIT=32 +INDENT_WIDTH=4 +CONTINUATION_INDENT_WIDTH=8 +CONTINUATION_ALIGN_STYLE = valign-right +""" + with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath: + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style={0}'.format(stylepath)]) + + def testStyleOutputRoundTrip(self): + unformatted_code = textwrap.dedent("""\ + def foo_function(): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def foo_function(): + pass + """) + + with utils.NamedTempFile(dirname=self.test_tmpdir) as (stylefile, + stylepath): + p = subprocess.Popen( + YAPF_BINARY + ['--style-help'], + stdout=stylefile, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE) + _, stderrdata = p.communicate() + self.assertEqual(stderrdata, b'') + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style={0}'.format(stylepath)]) + + def testSpacingBeforeComments(self): + unformatted_code = textwrap.dedent("""\ + A = 42 + + + # A comment + def x(): + pass + def _(): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + A = 42 + + + # A comment + def x(): + pass + def _(): + pass + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--lines', '1-2']) + + def testSpacingBeforeCommentsInDicts(self): + unformatted_code = textwrap.dedent("""\ + A=42 + + X = { + # 'Valid' statuses. + PASSED: # Passed + 'PASSED', + FAILED: # Failed + 'FAILED', + TIMED_OUT: # Timed out. + 'FAILED', + BORKED: # Broken. + 'BROKEN' + } + """) + expected_formatted_code = textwrap.dedent("""\ + A = 42 + + X = { + # 'Valid' statuses. + PASSED: # Passed + 'PASSED', + FAILED: # Failed + 'FAILED', + TIMED_OUT: # Timed out. + 'FAILED', + BORKED: # Broken. + 'BROKEN' + } + """) + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style', 'yapf', '--lines', '1-1']) + + @unittest.skipUnless(py3compat.PY36, 'Requires Python 3.6') + def testNoSpacesAroundBinaryOperators(self): + unformatted_code = """\ +a = 4-b/c@d**37 +""" + expected_formatted_code = """\ +a = 4-b / c@d**37 +""" + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=[ + '--style', + '{based_on_style: pep8, ' + 'no_spaces_around_selected_binary_operators: "@,**,-"}', + ]) + + @unittest.skipUnless(py3compat.PY36, 'Requires Python 3.6') + def testCP936Encoding(self): + unformatted_code = 'print("中文")\n' + expected_formatted_code = 'print("中文")\n' + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + env={'PYTHONIOENCODING': 'cp936'}) + + def testDisableWithLineRanges(self): + unformatted_code = """\ +# yapf: disable +a = [ + 1, + 2, + + 3 +] +""" + expected_formatted_code = """\ +# yapf: disable +a = [ + 1, + 2, + + 3 +] +""" + self.assertYapfReformats( + unformatted_code, + expected_formatted_code, + extra_options=['--style', 'yapf', '--lines', '1-100']) + + +class BadInputTest(unittest.TestCase): + """Test yapf's behaviour when passed bad input.""" + + def testBadSyntax(self): + code = ' a = 1\n' + self.assertRaises(SyntaxError, yapf_api.FormatCode, code) + + def testBadCode(self): + code = 'x = """hello\n' + self.assertRaises(tokenize.TokenError, yapf_api.FormatCode, code) + + +class DiffIndentTest(unittest.TestCase): + + @staticmethod + def _OwnStyle(): + my_style = style.CreatePEP8Style() + my_style['INDENT_WIDTH'] = 3 + my_style['CONTINUATION_INDENT_WIDTH'] = 3 + return my_style + + def _Check(self, unformatted_code, expected_formatted_code): + formatted_code, _ = yapf_api.FormatCode( + unformatted_code, style_config=style.SetGlobalStyle(self._OwnStyle())) + self.assertEqual(expected_formatted_code, formatted_code) + + def testSimple(self): + unformatted_code = textwrap.dedent("""\ + for i in range(5): + print('bar') + """) + expected_formatted_code = textwrap.dedent("""\ + for i in range(5): + print('bar') + """) + self._Check(unformatted_code, expected_formatted_code) + + +class HorizontallyAlignedTrailingCommentsTest(yapf_test_helper.YAPFTest): + + @staticmethod + def _OwnStyle(): + my_style = style.CreatePEP8Style() + my_style['SPACES_BEFORE_COMMENT'] = [ + 15, + 25, + 35, + ] + return my_style + + def _Check(self, unformatted_code, expected_formatted_code): + formatted_code, _ = yapf_api.FormatCode( + unformatted_code, style_config=style.SetGlobalStyle(self._OwnStyle())) + self.assertCodeEqual(expected_formatted_code, formatted_code) + + def testSimple(self): + unformatted_code = textwrap.dedent("""\ + foo = '1' # Aligned at first list value + + foo = '2__<15>' # Aligned at second list value + + foo = '3____________<25>' # Aligned at third list value + + foo = '4______________________<35>' # Aligned beyond list values + """) + expected_formatted_code = textwrap.dedent("""\ + foo = '1' # Aligned at first list value + + foo = '2__<15>' # Aligned at second list value + + foo = '3____________<25>' # Aligned at third list value + + foo = '4______________________<35>' # Aligned beyond list values + """) + self._Check(unformatted_code, expected_formatted_code) + + def testBlock(self): + unformatted_code = textwrap.dedent("""\ + func(1) # Line 1 + func(2) # Line 2 + # Line 3 + func(3) # Line 4 + # Line 5 + # Line 6 + """) + expected_formatted_code = textwrap.dedent("""\ + func(1) # Line 1 + func(2) # Line 2 + # Line 3 + func(3) # Line 4 + # Line 5 + # Line 6 + """) + self._Check(unformatted_code, expected_formatted_code) + + def testBlockWithLongLine(self): + unformatted_code = textwrap.dedent("""\ + func(1) # Line 1 + func___________________(2) # Line 2 + # Line 3 + func(3) # Line 4 + # Line 5 + # Line 6 + """) + expected_formatted_code = textwrap.dedent("""\ + func(1) # Line 1 + func___________________(2) # Line 2 + # Line 3 + func(3) # Line 4 + # Line 5 + # Line 6 + """) + self._Check(unformatted_code, expected_formatted_code) + + def testBlockFuncSuffix(self): + unformatted_code = textwrap.dedent("""\ + func(1) # Line 1 + func(2) # Line 2 + # Line 3 + func(3) # Line 4 + # Line 5 + # Line 6 + + def Func(): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + func(1) # Line 1 + func(2) # Line 2 + # Line 3 + func(3) # Line 4 + # Line 5 + # Line 6 + + + def Func(): + pass + """) + self._Check(unformatted_code, expected_formatted_code) + + def testBlockCommentSuffix(self): + unformatted_code = textwrap.dedent("""\ + func(1) # Line 1 + func(2) # Line 2 + # Line 3 + func(3) # Line 4 + # Line 5 - SpliceComments makes this part of the previous block + # Line 6 + + # Aligned with prev comment block + """) + expected_formatted_code = textwrap.dedent("""\ + func(1) # Line 1 + func(2) # Line 2 + # Line 3 + func(3) # Line 4 + # Line 5 - SpliceComments makes this part of the previous block + # Line 6 + + # Aligned with prev comment block + """) + self._Check(unformatted_code, expected_formatted_code) + + def testBlockIndentedFuncSuffix(self): + unformatted_code = textwrap.dedent("""\ + if True: + func(1) # Line 1 + func(2) # Line 2 + # Line 3 + func(3) # Line 4 + # Line 5 - SpliceComments makes this a new block + # Line 6 + + # Aligned with Func + + def Func(): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + func(1) # Line 1 + func(2) # Line 2 + # Line 3 + func(3) # Line 4 + + # Line 5 - SpliceComments makes this a new block + # Line 6 + + # Aligned with Func + + + def Func(): + pass + """) + self._Check(unformatted_code, expected_formatted_code) + + def testBlockIndentedCommentSuffix(self): + unformatted_code = textwrap.dedent("""\ + if True: + func(1) # Line 1 + func(2) # Line 2 + # Line 3 + func(3) # Line 4 + # Line 5 + # Line 6 + + # Not aligned + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + func(1) # Line 1 + func(2) # Line 2 + # Line 3 + func(3) # Line 4 + # Line 5 + # Line 6 + + # Not aligned + """) + self._Check(unformatted_code, expected_formatted_code) + + def testBlockMultiIndented(self): + unformatted_code = textwrap.dedent("""\ + if True: + if True: + if True: + func(1) # Line 1 + func(2) # Line 2 + # Line 3 + func(3) # Line 4 + # Line 5 + # Line 6 + + # Not aligned + """) + expected_formatted_code = textwrap.dedent("""\ + if True: + if True: + if True: + func(1) # Line 1 + func(2) # Line 2 + # Line 3 + func(3) # Line 4 + # Line 5 + # Line 6 + + # Not aligned + """) + self._Check(unformatted_code, expected_formatted_code) + + def testArgs(self): + unformatted_code = textwrap.dedent("""\ + def MyFunc( + arg1, # Desc 1 + arg2, # Desc 2 + a_longer_var_name, # Desc 3 + arg4, + arg5, # Desc 5 + arg6, + ): + pass + """) + expected_formatted_code = textwrap.dedent("""\ + def MyFunc( + arg1, # Desc 1 + arg2, # Desc 2 + a_longer_var_name, # Desc 3 + arg4, + arg5, # Desc 5 + arg6, + ): + pass + """) + self._Check(unformatted_code, expected_formatted_code) + + def testDisableBlock(self): + unformatted_code = textwrap.dedent("""\ + a() # comment 1 + b() # comment 2 + + # yapf: disable + c() # comment 3 + d() # comment 4 + # yapf: enable + + e() # comment 5 + f() # comment 6 + """) + expected_formatted_code = textwrap.dedent("""\ + a() # comment 1 + b() # comment 2 + + # yapf: disable + c() # comment 3 + d() # comment 4 + # yapf: enable + + e() # comment 5 + f() # comment 6 + """) + self._Check(unformatted_code, expected_formatted_code) + + def testDisabledLine(self): + unformatted_code = textwrap.dedent("""\ + short # comment 1 + do_not_touch1 # yapf: disable + do_not_touch2 # yapf: disable + a_longer_statement # comment 2 + """) + expected_formatted_code = textwrap.dedent("""\ + short # comment 1 + do_not_touch1 # yapf: disable + do_not_touch2 # yapf: disable + a_longer_statement # comment 2 + """) + self._Check(unformatted_code, expected_formatted_code) + + +class _SpacesAroundDictListTupleTestImpl(unittest.TestCase): + + @staticmethod + def _OwnStyle(): + my_style = style.CreatePEP8Style() + my_style['DISABLE_ENDING_COMMA_HEURISTIC'] = True + my_style['SPLIT_ALL_COMMA_SEPARATED_VALUES'] = False + my_style['SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED'] = False + return my_style + + def _Check(self, unformatted_code, expected_formatted_code): + formatted_code, _ = yapf_api.FormatCode( + unformatted_code, style_config=style.SetGlobalStyle(self._OwnStyle())) + self.assertEqual(expected_formatted_code, formatted_code) + + def setUp(self): + self.maxDiff = None + + +class SpacesAroundDictTest(_SpacesAroundDictListTupleTestImpl): + + @classmethod + def _OwnStyle(cls): + style = super(SpacesAroundDictTest, cls)._OwnStyle() + style['SPACES_AROUND_DICT_DELIMITERS'] = True + + return style + + def testStandard(self): + unformatted_code = textwrap.dedent("""\ + {1 : 2} + {k:v for k, v in other.items()} + {k for k in [1, 2, 3]} + + # The following statements should not change + {} + {1 : 2} # yapf: disable + + # yapf: disable + {1 : 2} + # yapf: enable + + # Dict settings should not impact lists or tuples + [1, 2] + (3, 4) + """) + expected_formatted_code = textwrap.dedent("""\ + { 1: 2 } + { k: v for k, v in other.items() } + { k for k in [1, 2, 3] } + + # The following statements should not change + {} + {1 : 2} # yapf: disable + + # yapf: disable + {1 : 2} + # yapf: enable + + # Dict settings should not impact lists or tuples + [1, 2] + (3, 4) + """) + + self._Check(unformatted_code, expected_formatted_code) + + +class SpacesAroundListTest(_SpacesAroundDictListTupleTestImpl): + + @classmethod + def _OwnStyle(cls): + style = super(SpacesAroundListTest, cls)._OwnStyle() + style['SPACES_AROUND_LIST_DELIMITERS'] = True + + return style + + def testStandard(self): + unformatted_code = textwrap.dedent("""\ + [a,b,c] + [4,5,] + [6, [7, 8], 9] + [v for v in [1,2,3] if v & 1] + + # The following statements should not change + index[0] + index[a, b] + [] + [v for v in [1,2,3] if v & 1] # yapf: disable + + # yapf: disable + [a,b,c] + [4,5,] + # yapf: enable + + # List settings should not impact dicts or tuples + {a: b} + (1, 2) + """) + expected_formatted_code = textwrap.dedent("""\ + [ a, b, c ] + [ 4, 5, ] + [ 6, [ 7, 8 ], 9 ] + [ v for v in [ 1, 2, 3 ] if v & 1 ] + + # The following statements should not change + index[0] + index[a, b] + [] + [v for v in [1,2,3] if v & 1] # yapf: disable + + # yapf: disable + [a,b,c] + [4,5,] + # yapf: enable + + # List settings should not impact dicts or tuples + {a: b} + (1, 2) + """) + + self._Check(unformatted_code, expected_formatted_code) + + +class SpacesAroundTupleTest(_SpacesAroundDictListTupleTestImpl): + + @classmethod + def _OwnStyle(cls): + style = super(SpacesAroundTupleTest, cls)._OwnStyle() + style['SPACES_AROUND_TUPLE_DELIMITERS'] = True + + return style + + def testStandard(self): + unformatted_code = textwrap.dedent("""\ + (0, 1) + (2, 3) + (4, 5, 6,) + func((7, 8), 9) + + # The following statements should not change + func(1, 2) + (this_func or that_func)(3, 4) + if (True and False): pass + () + + (0, 1) # yapf: disable + + # yapf: disable + (0, 1) + (2, 3) + # yapf: enable + + # Tuple settings should not impact dicts or lists + {a: b} + [3, 4] + """) + expected_formatted_code = textwrap.dedent("""\ + ( 0, 1 ) + ( 2, 3 ) + ( 4, 5, 6, ) + func(( 7, 8 ), 9) + + # The following statements should not change + func(1, 2) + (this_func or that_func)(3, 4) + if (True and False): pass + () + + (0, 1) # yapf: disable + + # yapf: disable + (0, 1) + (2, 3) + # yapf: enable + + # Tuple settings should not impact dicts or lists + {a: b} + [3, 4] + """) + + self._Check(unformatted_code, expected_formatted_code) + + +if __name__ == '__main__': + unittest.main() diff --git a/.venv/lib/python3.9/site-packages/yapftests/yapf_test_helper.py b/.venv/lib/python3.9/site-packages/yapftests/yapf_test_helper.py new file mode 100644 index 00000000..1f21b363 --- /dev/null +++ b/.venv/lib/python3.9/site-packages/yapftests/yapf_test_helper.py @@ -0,0 +1,89 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Support module for tests for yapf.""" + +import difflib +import sys +import unittest + +from yapf.yapflib import blank_line_calculator +from yapf.yapflib import comment_splicer +from yapf.yapflib import continuation_splicer +from yapf.yapflib import identify_container +from yapf.yapflib import pytree_unwrapper +from yapf.yapflib import pytree_utils +from yapf.yapflib import pytree_visitor +from yapf.yapflib import split_penalty +from yapf.yapflib import style +from yapf.yapflib import subtype_assigner + + +class YAPFTest(unittest.TestCase): + + def assertCodeEqual(self, expected_code, code): + if code != expected_code: + msg = ['Code format mismatch:', 'Expected:'] + linelen = style.Get('COLUMN_LIMIT') + for l in expected_code.splitlines(): + if len(l) > linelen: + msg.append('!> %s' % l) + else: + msg.append(' > %s' % l) + msg.append('Actual:') + for l in code.splitlines(): + if len(l) > linelen: + msg.append('!> %s' % l) + else: + msg.append(' > %s' % l) + msg.append('Diff:') + msg.extend( + difflib.unified_diff( + code.splitlines(), + expected_code.splitlines(), + fromfile='actual', + tofile='expected', + lineterm='')) + self.fail('\n'.join(msg)) + + +def ParseAndUnwrap(code, dumptree=False): + """Produces unwrapped lines from the given code. + + Parses the code into a tree, performs comment splicing and runs the + unwrapper. + + Arguments: + code: code to parse as a string + dumptree: if True, the parsed pytree (after comment splicing) is dumped + to stderr. Useful for debugging. + + Returns: + List of unwrapped lines. + """ + tree = pytree_utils.ParseCodeToTree(code) + comment_splicer.SpliceComments(tree) + continuation_splicer.SpliceContinuations(tree) + subtype_assigner.AssignSubtypes(tree) + identify_container.IdentifyContainers(tree) + split_penalty.ComputeSplitPenalties(tree) + blank_line_calculator.CalculateBlankLines(tree) + + if dumptree: + pytree_visitor.DumpPyTree(tree, target_stream=sys.stderr) + + uwlines = pytree_unwrapper.UnwrapPyTree(tree) + for uwl in uwlines: + uwl.CalculateFormattingInformation() + + return uwlines