From eb9905f04da443f383ed8d6c58eb4ea27665747f Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Fri, 19 Oct 2018 09:14:43 +0300 Subject: [PATCH 01/35] [Chore #161335865] Adding the Directory structure --- .env | 6 + .gitgnore | 1 + __init__.py | 0 __pycache__/__init__.cpython-37.pyc | Bin 0 -> 124 bytes __pycache__/run.cpython-37.pyc | Bin 0 -> 319 bytes app/__init__.py | 17 + app/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 586 bytes app/api/__init__.py | 14 + app/api/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 132 bytes app/api/v1/__init__.py | 14 + .../v1/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 594 bytes app/api/v1/__pycache__/models.cpython-37.pyc | Bin 0 -> 1856 bytes app/api/v1/__pycache__/views.cpython-37.pyc | Bin 0 -> 2542 bytes app/api/v1/models.py | 0 app/api/v1/views.py | 0 app/tests/__init__.py | 0 app/tests/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 134 bytes .../test_products.cpython-37-PYTEST.pyc | Bin 0 -> 1690 bytes app/tests/test_products.py | 38 + instance/__init__.py | 0 instance/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 133 bytes instance/__pycache__/config.cpython-37.pyc | Bin 0 -> 1206 bytes instance/config.py | 32 + run.py | 12 + venv/Include/Python-ast.h | 637 ++ venv/Include/Python.h | 140 + venv/Include/abstract.h | 1109 +++ venv/Include/accu.h | 37 + venv/Include/asdl.h | 46 + venv/Include/ast.h | 29 + venv/Include/bitset.h | 32 + venv/Include/bltinmodule.h | 14 + venv/Include/boolobject.h | 34 + venv/Include/bytearrayobject.h | 62 + venv/Include/bytes_methods.h | 69 + venv/Include/bytesobject.h | 224 + venv/Include/cellobject.h | 29 + venv/Include/ceval.h | 237 + venv/Include/classobject.h | 58 + venv/Include/code.h | 157 + venv/Include/codecs.h | 240 + venv/Include/compile.h | 93 + venv/Include/complexobject.h | 69 + venv/Include/context.h | 86 + venv/Include/datetime.h | 273 + venv/Include/descrobject.h | 110 + venv/Include/dictobject.h | 179 + venv/Include/dtoa.h | 19 + venv/Include/dynamic_annotations.h | 499 + venv/Include/enumobject.h | 17 + venv/Include/errcode.h | 38 + venv/Include/eval.h | 37 + venv/Include/fileobject.h | 55 + venv/Include/fileutils.h | 177 + venv/Include/floatobject.h | 130 + venv/Include/frameobject.h | 93 + venv/Include/funcobject.h | 103 + venv/Include/genobject.h | 105 + venv/Include/graminit.h | 89 + venv/Include/grammar.h | 94 + venv/Include/import.h | 154 + venv/Include/intrcheck.h | 33 + venv/Include/iterobject.h | 25 + venv/Include/listobject.h | 81 + venv/Include/longintrepr.h | 99 + venv/Include/longobject.h | 220 + venv/Include/marshal.h | 28 + venv/Include/memoryobject.h | 72 + venv/Include/metagrammar.h | 18 + venv/Include/methodobject.h | 135 + venv/Include/modsupport.h | 229 + venv/Include/moduleobject.h | 89 + venv/Include/namespaceobject.h | 19 + venv/Include/node.h | 44 + venv/Include/object.h | 1104 +++ venv/Include/objimpl.h | 370 + venv/Include/odictobject.h | 43 + venv/Include/opcode.h | 147 + venv/Include/osdefs.h | 47 + venv/Include/osmodule.h | 17 + venv/Include/parsetok.h | 108 + venv/Include/patchlevel.h | 35 + venv/Include/pgen.h | 18 + venv/Include/pgenheaders.h | 43 + venv/Include/py_curses.h | 159 + venv/Include/pyarena.h | 64 + venv/Include/pyatomic.h | 535 ++ venv/Include/pycapsule.h | 59 + venv/Include/pyconfig.h | 693 ++ venv/Include/pyctype.h | 33 + venv/Include/pydebug.h | 40 + venv/Include/pydtrace.h | 57 + venv/Include/pyerrors.h | 504 + venv/Include/pyexpat.h | 53 + venv/Include/pyfpe.h | 12 + venv/Include/pyhash.h | 145 + venv/Include/pylifecycle.h | 214 + venv/Include/pymacconfig.h | 102 + venv/Include/pymacro.h | 100 + venv/Include/pymath.h | 230 + venv/Include/pymem.h | 244 + venv/Include/pyport.h | 793 ++ venv/Include/pystate.h | 452 + venv/Include/pystrcmp.h | 23 + venv/Include/pystrhex.h | 19 + venv/Include/pystrtod.h | 45 + venv/Include/pythonrun.h | 181 + venv/Include/pythread.h | 155 + venv/Include/pytime.h | 246 + venv/Include/rangeobject.h | 27 + venv/Include/setobject.h | 108 + venv/Include/sliceobject.h | 63 + venv/Include/structmember.h | 74 + venv/Include/structseq.h | 49 + venv/Include/symtable.h | 118 + venv/Include/sysmodule.h | 48 + venv/Include/token.h | 92 + venv/Include/traceback.h | 119 + venv/Include/tupleobject.h | 73 + venv/Include/typeslots.h | 85 + venv/Include/ucnhash.h | 36 + venv/Include/unicodeobject.h | 2334 +++++ venv/Include/warnings.h | 67 + venv/Include/weakrefobject.h | 86 + venv/Lib/__future__.py | 146 + .../Lib/__pycache__/__future__.cpython-37.pyc | Bin 0 -> 4130 bytes .../__pycache__/_bootlocale.cpython-37.pyc | Bin 0 -> 1247 bytes .../_collections_abc.cpython-37.pyc | Bin 0 -> 28940 bytes .../__pycache__/_weakrefset.cpython-37.pyc | Bin 0 -> 7460 bytes venv/Lib/__pycache__/abc.cpython-37.pyc | Bin 0 -> 6449 bytes venv/Lib/__pycache__/base64.cpython-37.pyc | Bin 0 -> 17057 bytes venv/Lib/__pycache__/bisect.cpython-37.pyc | Bin 0 -> 2696 bytes venv/Lib/__pycache__/codecs.cpython-37.pyc | Bin 0 -> 33896 bytes venv/Lib/__pycache__/copy.cpython-37.pyc | Bin 0 -> 7099 bytes venv/Lib/__pycache__/copyreg.cpython-37.pyc | Bin 0 -> 4242 bytes venv/Lib/__pycache__/enum.cpython-37.pyc | Bin 0 -> 23745 bytes venv/Lib/__pycache__/fnmatch.cpython-37.pyc | Bin 0 -> 3335 bytes venv/Lib/__pycache__/functools.cpython-37.pyc | Bin 0 -> 23812 bytes .../__pycache__/genericpath.cpython-37.pyc | Bin 0 -> 3746 bytes venv/Lib/__pycache__/hashlib.cpython-37.pyc | Bin 0 -> 6533 bytes venv/Lib/__pycache__/heapq.cpython-37.pyc | Bin 0 -> 14360 bytes venv/Lib/__pycache__/hmac.cpython-37.pyc | Bin 0 -> 6111 bytes venv/Lib/__pycache__/imp.cpython-37.pyc | Bin 0 -> 9704 bytes venv/Lib/__pycache__/io.cpython-37.pyc | Bin 0 -> 3407 bytes venv/Lib/__pycache__/keyword.cpython-37.pyc | Bin 0 -> 1807 bytes venv/Lib/__pycache__/linecache.cpython-37.pyc | Bin 0 -> 3787 bytes venv/Lib/__pycache__/locale.cpython-37.pyc | Bin 0 -> 34553 bytes venv/Lib/__pycache__/ntpath.cpython-37.pyc | Bin 0 -> 12917 bytes venv/Lib/__pycache__/operator.cpython-37.pyc | Bin 0 -> 13898 bytes venv/Lib/__pycache__/os.cpython-37.pyc | Bin 0 -> 29691 bytes venv/Lib/__pycache__/posixpath.cpython-37.pyc | Bin 0 -> 10394 bytes venv/Lib/__pycache__/random.cpython-37.pyc | Bin 0 -> 19354 bytes venv/Lib/__pycache__/re.cpython-37.pyc | Bin 0 -> 13802 bytes venv/Lib/__pycache__/reprlib.cpython-37.pyc | Bin 0 -> 5348 bytes venv/Lib/__pycache__/shutil.cpython-37.pyc | Bin 0 -> 30543 bytes venv/Lib/__pycache__/site.cpython-37.pyc | Bin 0 -> 20626 bytes .../__pycache__/sre_compile.cpython-37.pyc | Bin 0 -> 15201 bytes .../__pycache__/sre_constants.cpython-37.pyc | Bin 0 -> 6289 bytes venv/Lib/__pycache__/sre_parse.cpython-37.pyc | Bin 0 -> 21355 bytes venv/Lib/__pycache__/stat.cpython-37.pyc | Bin 0 -> 3871 bytes venv/Lib/__pycache__/struct.cpython-37.pyc | Bin 0 -> 332 bytes venv/Lib/__pycache__/tarfile.cpython-37.pyc | Bin 0 -> 61783 bytes venv/Lib/__pycache__/tempfile.cpython-37.pyc | Bin 0 -> 22143 bytes venv/Lib/__pycache__/token.cpython-37.pyc | Bin 0 -> 3597 bytes venv/Lib/__pycache__/tokenize.cpython-37.pyc | Bin 0 -> 17728 bytes venv/Lib/__pycache__/types.cpython-37.pyc | Bin 0 -> 8972 bytes venv/Lib/__pycache__/warnings.cpython-37.pyc | Bin 0 -> 13764 bytes venv/Lib/__pycache__/weakref.cpython-37.pyc | Bin 0 -> 19108 bytes venv/Lib/_bootlocale.py | 46 + venv/Lib/_collections_abc.py | 1011 ++ venv/Lib/_dummy_thread.py | 163 + venv/Lib/_weakrefset.py | 196 + venv/Lib/abc.py | 170 + venv/Lib/base64.py | 602 ++ venv/Lib/bisect.py | 92 + venv/Lib/codecs.py | 1114 +++ venv/Lib/collections/__init__.py | 1279 +++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 46650 bytes .../__pycache__/abc.cpython-37.pyc | Bin 0 -> 245 bytes venv/Lib/collections/abc.py | 2 + venv/Lib/copy.py | 313 + venv/Lib/copyreg.py | 206 + venv/Lib/distutils/__init__.py | 101 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2829 bytes venv/Lib/distutils/distutils.cfg | 6 + venv/Lib/encodings/__init__.py | 170 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3987 bytes .../__pycache__/aliases.cpython-37.pyc | Bin 0 -> 6336 bytes .../__pycache__/ascii.cpython-37.pyc | Bin 0 -> 1924 bytes .../__pycache__/cp1252.cpython-37.pyc | Bin 0 -> 2496 bytes .../__pycache__/cp437.cpython-37.pyc | Bin 0 -> 7883 bytes .../encodings/__pycache__/idna.cpython-37.pyc | Bin 0 -> 5764 bytes .../__pycache__/latin_1.cpython-37.pyc | Bin 0 -> 1936 bytes .../__pycache__/unicode_escape.cpython-37.pyc | Bin 0 -> 1747 bytes .../__pycache__/utf_16_be.cpython-37.pyc | Bin 0 -> 1674 bytes .../__pycache__/utf_16_le.cpython-37.pyc | Bin 0 -> 1674 bytes .../__pycache__/utf_8.cpython-37.pyc | Bin 0 -> 1654 bytes venv/Lib/encodings/aliases.py | 550 ++ venv/Lib/encodings/ascii.py | 50 + venv/Lib/encodings/base64_codec.py | 55 + venv/Lib/encodings/big5.py | 39 + venv/Lib/encodings/big5hkscs.py | 39 + venv/Lib/encodings/bz2_codec.py | 78 + venv/Lib/encodings/charmap.py | 69 + venv/Lib/encodings/cp037.py | 307 + venv/Lib/encodings/cp1006.py | 307 + venv/Lib/encodings/cp1026.py | 307 + venv/Lib/encodings/cp1125.py | 698 ++ venv/Lib/encodings/cp1140.py | 307 + venv/Lib/encodings/cp1250.py | 307 + venv/Lib/encodings/cp1251.py | 307 + venv/Lib/encodings/cp1252.py | 307 + venv/Lib/encodings/cp1253.py | 307 + venv/Lib/encodings/cp1254.py | 307 + venv/Lib/encodings/cp1255.py | 307 + venv/Lib/encodings/cp1256.py | 307 + venv/Lib/encodings/cp1257.py | 307 + venv/Lib/encodings/cp1258.py | 307 + venv/Lib/encodings/cp273.py | 307 + venv/Lib/encodings/cp424.py | 307 + venv/Lib/encodings/cp437.py | 698 ++ venv/Lib/encodings/cp500.py | 307 + venv/Lib/encodings/cp65001.py | 43 + venv/Lib/encodings/cp720.py | 309 + venv/Lib/encodings/cp737.py | 698 ++ venv/Lib/encodings/cp775.py | 697 ++ venv/Lib/encodings/cp850.py | 698 ++ venv/Lib/encodings/cp852.py | 698 ++ venv/Lib/encodings/cp855.py | 698 ++ venv/Lib/encodings/cp856.py | 307 + venv/Lib/encodings/cp857.py | 694 ++ venv/Lib/encodings/cp858.py | 698 ++ venv/Lib/encodings/cp860.py | 698 ++ venv/Lib/encodings/cp861.py | 698 ++ venv/Lib/encodings/cp862.py | 698 ++ venv/Lib/encodings/cp863.py | 698 ++ venv/Lib/encodings/cp864.py | 690 ++ venv/Lib/encodings/cp865.py | 698 ++ venv/Lib/encodings/cp866.py | 698 ++ venv/Lib/encodings/cp869.py | 689 ++ venv/Lib/encodings/cp874.py | 307 + venv/Lib/encodings/cp875.py | 307 + venv/Lib/encodings/cp932.py | 39 + venv/Lib/encodings/cp949.py | 39 + venv/Lib/encodings/cp950.py | 39 + venv/Lib/encodings/euc_jis_2004.py | 39 + venv/Lib/encodings/euc_jisx0213.py | 39 + venv/Lib/encodings/euc_jp.py | 39 + venv/Lib/encodings/euc_kr.py | 39 + venv/Lib/encodings/gb18030.py | 39 + venv/Lib/encodings/gb2312.py | 39 + venv/Lib/encodings/gbk.py | 39 + venv/Lib/encodings/hex_codec.py | 55 + venv/Lib/encodings/hp_roman8.py | 314 + venv/Lib/encodings/hz.py | 39 + venv/Lib/encodings/idna.py | 309 + venv/Lib/encodings/iso2022_jp.py | 39 + venv/Lib/encodings/iso2022_jp_1.py | 39 + venv/Lib/encodings/iso2022_jp_2.py | 39 + venv/Lib/encodings/iso2022_jp_2004.py | 39 + venv/Lib/encodings/iso2022_jp_3.py | 39 + venv/Lib/encodings/iso2022_jp_ext.py | 39 + venv/Lib/encodings/iso2022_kr.py | 39 + venv/Lib/encodings/iso8859_1.py | 307 + venv/Lib/encodings/iso8859_10.py | 307 + venv/Lib/encodings/iso8859_11.py | 307 + venv/Lib/encodings/iso8859_13.py | 307 + venv/Lib/encodings/iso8859_14.py | 307 + venv/Lib/encodings/iso8859_15.py | 307 + venv/Lib/encodings/iso8859_16.py | 307 + venv/Lib/encodings/iso8859_2.py | 307 + venv/Lib/encodings/iso8859_3.py | 307 + venv/Lib/encodings/iso8859_4.py | 307 + venv/Lib/encodings/iso8859_5.py | 307 + venv/Lib/encodings/iso8859_6.py | 307 + venv/Lib/encodings/iso8859_7.py | 307 + venv/Lib/encodings/iso8859_8.py | 307 + venv/Lib/encodings/iso8859_9.py | 307 + venv/Lib/encodings/johab.py | 39 + venv/Lib/encodings/koi8_r.py | 307 + venv/Lib/encodings/koi8_t.py | 308 + venv/Lib/encodings/koi8_u.py | 307 + venv/Lib/encodings/kz1048.py | 307 + venv/Lib/encodings/latin_1.py | 50 + venv/Lib/encodings/mac_arabic.py | 698 ++ venv/Lib/encodings/mac_centeuro.py | 307 + venv/Lib/encodings/mac_croatian.py | 307 + venv/Lib/encodings/mac_cyrillic.py | 307 + venv/Lib/encodings/mac_farsi.py | 307 + venv/Lib/encodings/mac_greek.py | 307 + venv/Lib/encodings/mac_iceland.py | 307 + venv/Lib/encodings/mac_latin2.py | 312 + venv/Lib/encodings/mac_roman.py | 307 + venv/Lib/encodings/mac_romanian.py | 307 + venv/Lib/encodings/mac_turkish.py | 307 + venv/Lib/encodings/mbcs.py | 47 + venv/Lib/encodings/oem.py | 41 + venv/Lib/encodings/palmos.py | 308 + venv/Lib/encodings/ptcp154.py | 312 + venv/Lib/encodings/punycode.py | 237 + venv/Lib/encodings/quopri_codec.py | 56 + venv/Lib/encodings/raw_unicode_escape.py | 45 + venv/Lib/encodings/rot_13.py | 113 + venv/Lib/encodings/shift_jis.py | 39 + venv/Lib/encodings/shift_jis_2004.py | 39 + venv/Lib/encodings/shift_jisx0213.py | 39 + venv/Lib/encodings/tis_620.py | 307 + venv/Lib/encodings/undefined.py | 49 + venv/Lib/encodings/unicode_escape.py | 45 + venv/Lib/encodings/unicode_internal.py | 45 + venv/Lib/encodings/utf_16.py | 155 + venv/Lib/encodings/utf_16_be.py | 42 + venv/Lib/encodings/utf_16_le.py | 42 + venv/Lib/encodings/utf_32.py | 150 + venv/Lib/encodings/utf_32_be.py | 37 + venv/Lib/encodings/utf_32_le.py | 37 + venv/Lib/encodings/utf_7.py | 38 + venv/Lib/encodings/utf_8.py | 42 + venv/Lib/encodings/utf_8_sig.py | 130 + venv/Lib/encodings/uu_codec.py | 99 + venv/Lib/encodings/zlib_codec.py | 77 + venv/Lib/enum.py | 901 ++ venv/Lib/fnmatch.py | 128 + venv/Lib/functools.py | 828 ++ venv/Lib/genericpath.py | 151 + venv/Lib/hashlib.py | 251 + venv/Lib/heapq.py | 607 ++ venv/Lib/hmac.py | 188 + venv/Lib/imp.py | 346 + venv/Lib/importlib/__init__.py | 176 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3772 bytes .../importlib/__pycache__/abc.cpython-37.pyc | Bin 0 -> 13526 bytes .../__pycache__/machinery.cpython-37.pyc | Bin 0 -> 1012 bytes .../importlib/__pycache__/util.cpython-37.pyc | Bin 0 -> 9396 bytes venv/Lib/importlib/_bootstrap.py | 1164 +++ venv/Lib/importlib/_bootstrap_external.py | 1562 ++++ venv/Lib/importlib/abc.py | 388 + venv/Lib/importlib/machinery.py | 21 + venv/Lib/importlib/resources.py | 343 + venv/Lib/importlib/util.py | 300 + venv/Lib/io.py | 99 + venv/Lib/keyword.py | 96 + venv/Lib/linecache.py | 177 + venv/Lib/locale.py | 1749 ++++ venv/Lib/no-global-site-packages.txt | 0 venv/Lib/ntpath.py | 671 ++ venv/Lib/operator.py | 464 + venv/Lib/orig-prefix.txt | 1 + venv/Lib/os.py | 1078 +++ venv/Lib/posixpath.py | 522 ++ venv/Lib/random.py | 775 ++ venv/Lib/re.py | 366 + venv/Lib/reprlib.py | 161 + venv/Lib/rlcompleter.py | 205 + venv/Lib/shutil.py | 1169 +++ .../Click-7.0.dist-info/INSTALLER | 1 + .../Click-7.0.dist-info/LICENSE.txt | 39 + .../Click-7.0.dist-info/METADATA | 121 + .../site-packages/Click-7.0.dist-info/RECORD | 40 + .../site-packages/Click-7.0.dist-info/WHEEL | 6 + .../Click-7.0.dist-info/top_level.txt | 1 + .../Flask-1.0.2.dist-info/INSTALLER | 1 + .../Flask-1.0.2.dist-info/LICENSE.txt | 31 + .../Flask-1.0.2.dist-info/METADATA | 130 + .../Flask-1.0.2.dist-info/RECORD | 48 + .../site-packages/Flask-1.0.2.dist-info/WHEEL | 6 + .../Flask-1.0.2.dist-info/entry_points.txt | 3 + .../Flask-1.0.2.dist-info/top_level.txt | 1 + .../DESCRIPTION.rst | 3 + .../Flask_RESTful-0.3.6.dist-info/INSTALLER | 1 + .../Flask_RESTful-0.3.6.dist-info/METADATA | 31 + .../Flask_RESTful-0.3.6.dist-info/RECORD | 29 + .../Flask_RESTful-0.3.6.dist-info/WHEEL | 6 + .../metadata.json | 1 + .../top_level.txt | 1 + .../Jinja2-2.10.dist-info/DESCRIPTION.rst | 37 + .../Jinja2-2.10.dist-info/INSTALLER | 1 + .../Jinja2-2.10.dist-info/LICENSE.txt | 31 + .../Jinja2-2.10.dist-info/METADATA | 68 + .../Jinja2-2.10.dist-info/RECORD | 63 + .../site-packages/Jinja2-2.10.dist-info/WHEEL | 6 + .../Jinja2-2.10.dist-info/entry_points.txt | 4 + .../Jinja2-2.10.dist-info/metadata.json | 1 + .../Jinja2-2.10.dist-info/top_level.txt | 1 + .../MarkupSafe-1.0-py3.7.egg-info/PKG-INFO | 133 + .../MarkupSafe-1.0-py3.7.egg-info/SOURCES.txt | 18 + .../dependency_links.txt | 1 + .../installed-files.txt | 14 + .../not-zip-safe | 1 + .../top_level.txt | 1 + .../Werkzeug-0.14.1.dist-info/DESCRIPTION.rst | 80 + .../Werkzeug-0.14.1.dist-info/INSTALLER | 1 + .../Werkzeug-0.14.1.dist-info/LICENSE.txt | 31 + .../Werkzeug-0.14.1.dist-info/METADATA | 116 + .../Werkzeug-0.14.1.dist-info/RECORD | 97 + .../Werkzeug-0.14.1.dist-info/WHEEL | 6 + .../Werkzeug-0.14.1.dist-info/metadata.json | 1 + .../Werkzeug-0.14.1.dist-info/top_level.txt | 1 + .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 316 bytes .../__pycache__/itsdangerous.cpython-37.pyc | Bin 0 -> 29306 bytes .../__pycache__/mccabe.cpython-37.pyc | Bin 0 -> 11139 bytes .../__pycache__/pep8.cpython-37.pyc | Bin 0 -> 60921 bytes .../__pycache__/pytest.cpython-37.pyc | Bin 0 -> 1965 bytes .../__pycache__/six.cpython-37.pyc | Bin 0 -> 24974 bytes venv/Lib/site-packages/_pytest/__init__.py | 8 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 307 bytes .../__pycache__/_argcomplete.cpython-37.pyc | Bin 0 -> 3936 bytes .../__pycache__/_version.cpython-37.pyc | Bin 0 -> 191 bytes .../__pycache__/cacheprovider.cpython-37.pyc | Bin 0 -> 12577 bytes .../__pycache__/capture.cpython-37.pyc | Bin 0 -> 26350 bytes .../_pytest/__pycache__/compat.cpython-37.pyc | Bin 0 -> 12292 bytes .../__pycache__/debugging.cpython-37.pyc | Bin 0 -> 6134 bytes .../__pycache__/deprecated.cpython-37.pyc | Bin 0 -> 3901 bytes .../__pycache__/doctest.cpython-37.pyc | Bin 0 -> 15248 bytes .../__pycache__/fixtures.cpython-37.pyc | Bin 0 -> 38668 bytes .../__pycache__/freeze_support.cpython-37.pyc | Bin 0 -> 1396 bytes .../__pycache__/helpconfig.cpython-37.pyc | Bin 0 -> 6337 bytes .../__pycache__/hookspec.cpython-37.pyc | Bin 0 -> 21504 bytes .../__pycache__/junitxml.cpython-37.pyc | Bin 0 -> 16424 bytes .../__pycache__/logging.cpython-37.pyc | Bin 0 -> 17878 bytes .../_pytest/__pycache__/main.cpython-37.pyc | Bin 0 -> 17559 bytes .../__pycache__/monkeypatch.cpython-37.pyc | Bin 0 -> 9831 bytes .../_pytest/__pycache__/nodes.cpython-37.pyc | Bin 0 -> 16932 bytes .../_pytest/__pycache__/nose.cpython-37.pyc | Bin 0 -> 2441 bytes .../__pycache__/outcomes.cpython-37.pyc | Bin 0 -> 5682 bytes .../__pycache__/pastebin.cpython-37.pyc | Bin 0 -> 3299 bytes .../__pycache__/pathlib.cpython-37.pyc | Bin 0 -> 7735 bytes .../__pycache__/pytester.cpython-37.pyc | Bin 0 -> 47534 bytes .../_pytest/__pycache__/python.cpython-37.pyc | Bin 0 -> 41943 bytes .../__pycache__/python_api.cpython-37.pyc | Bin 0 -> 23758 bytes .../__pycache__/recwarn.cpython-37.pyc | Bin 0 -> 7818 bytes .../__pycache__/reports.cpython-37.pyc | Bin 0 -> 5941 bytes .../__pycache__/resultlog.cpython-37.pyc | Bin 0 -> 3730 bytes .../_pytest/__pycache__/runner.cpython-37.pyc | Bin 0 -> 11223 bytes .../__pycache__/setuponly.cpython-37.pyc | Bin 0 -> 2451 bytes .../__pycache__/setupplan.cpython-37.pyc | Bin 0 -> 1022 bytes .../__pycache__/skipping.cpython-37.pyc | Bin 0 -> 7711 bytes .../__pycache__/terminal.cpython-37.pyc | Bin 0 -> 25804 bytes .../_pytest/__pycache__/tmpdir.cpython-37.pyc | Bin 0 -> 6297 bytes .../__pycache__/unittest.cpython-37.pyc | Bin 0 -> 7914 bytes .../__pycache__/warning_types.cpython-37.pyc | Bin 0 -> 2455 bytes .../__pycache__/warnings.cpython-37.pyc | Bin 0 -> 5323 bytes .../Lib/site-packages/_pytest/_argcomplete.py | 106 + .../site-packages/_pytest/_code/__init__.py | 11 + .../_code/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 647 bytes .../__pycache__/_py2traceback.cpython-37.pyc | Bin 0 -> 2383 bytes .../_code/__pycache__/code.cpython-37.pyc | Bin 0 -> 31201 bytes .../_code/__pycache__/source.cpython-37.pyc | Bin 0 -> 9462 bytes .../_pytest/_code/_py2traceback.py | 89 + venv/Lib/site-packages/_pytest/_code/code.py | 1044 +++ .../Lib/site-packages/_pytest/_code/source.py | 322 + venv/Lib/site-packages/_pytest/_version.py | 4 + .../_pytest/assertion/__init__.py | 151 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 5534 bytes .../__pycache__/rewrite.cpython-37.pyc | Bin 0 -> 29393 bytes .../__pycache__/truncate.cpython-37.pyc | Bin 0 -> 2713 bytes .../assertion/__pycache__/util.cpython-37.pyc | Bin 0 -> 9997 bytes .../_pytest/assertion/rewrite.py | 1033 +++ .../_pytest/assertion/truncate.py | 99 + .../site-packages/_pytest/assertion/util.py | 338 + .../site-packages/_pytest/cacheprovider.py | 362 + venv/Lib/site-packages/_pytest/capture.py | 780 ++ venv/Lib/site-packages/_pytest/compat.py | 411 + .../site-packages/_pytest/config/__init__.py | 1035 +++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 29491 bytes .../__pycache__/argparsing.cpython-37.pyc | Bin 0 -> 13858 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 643 bytes .../__pycache__/findpaths.cpython-37.pyc | Bin 0 -> 4070 bytes .../_pytest/config/argparsing.py | 410 + .../_pytest/config/exceptions.py | 9 + .../site-packages/_pytest/config/findpaths.py | 146 + venv/Lib/site-packages/_pytest/debugging.py | 199 + venv/Lib/site-packages/_pytest/deprecated.py | 116 + venv/Lib/site-packages/_pytest/doctest.py | 512 ++ venv/Lib/site-packages/_pytest/fixtures.py | 1379 +++ .../site-packages/_pytest/freeze_support.py | 45 + venv/Lib/site-packages/_pytest/helpconfig.py | 213 + venv/Lib/site-packages/_pytest/hookspec.py | 611 ++ venv/Lib/site-packages/_pytest/junitxml.py | 563 ++ venv/Lib/site-packages/_pytest/logging.py | 599 ++ venv/Lib/site-packages/_pytest/main.py | 669 ++ .../site-packages/_pytest/mark/__init__.py | 169 + .../mark/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 4769 bytes .../mark/__pycache__/evaluate.cpython-37.pyc | Bin 0 -> 3528 bytes .../mark/__pycache__/legacy.cpython-37.pyc | Bin 0 -> 3438 bytes .../__pycache__/structures.cpython-37.pyc | Bin 0 -> 15494 bytes .../site-packages/_pytest/mark/evaluate.py | 123 + venv/Lib/site-packages/_pytest/mark/legacy.py | 100 + .../site-packages/_pytest/mark/structures.py | 468 + venv/Lib/site-packages/_pytest/monkeypatch.py | 304 + venv/Lib/site-packages/_pytest/nodes.py | 533 ++ venv/Lib/site-packages/_pytest/nose.py | 72 + venv/Lib/site-packages/_pytest/outcomes.py | 179 + venv/Lib/site-packages/_pytest/pastebin.py | 109 + venv/Lib/site-packages/_pytest/pathlib.py | 283 + venv/Lib/site-packages/_pytest/pytester.py | 1381 +++ venv/Lib/site-packages/_pytest/python.py | 1451 +++ venv/Lib/site-packages/_pytest/python_api.py | 721 ++ venv/Lib/site-packages/_pytest/recwarn.py | 221 + venv/Lib/site-packages/_pytest/reports.py | 196 + venv/Lib/site-packages/_pytest/resultlog.py | 120 + venv/Lib/site-packages/_pytest/runner.py | 388 + venv/Lib/site-packages/_pytest/setuponly.py | 85 + venv/Lib/site-packages/_pytest/setupplan.py | 29 + venv/Lib/site-packages/_pytest/skipping.py | 294 + venv/Lib/site-packages/_pytest/terminal.py | 882 ++ venv/Lib/site-packages/_pytest/tmpdir.py | 186 + venv/Lib/site-packages/_pytest/unittest.py | 253 + .../site-packages/_pytest/warning_types.py | 60 + venv/Lib/site-packages/_pytest/warnings.py | 172 + .../aniso8601-3.0.2.dist-info/DESCRIPTION.rst | 384 + .../aniso8601-3.0.2.dist-info/INSTALLER | 1 + .../aniso8601-3.0.2.dist-info/METADATA | 413 + .../aniso8601-3.0.2.dist-info/RECORD | 25 + .../aniso8601-3.0.2.dist-info/WHEEL | 6 + .../aniso8601-3.0.2.dist-info/metadata.json | 1 + .../aniso8601-3.0.2.dist-info/top_level.txt | 1 + venv/Lib/site-packages/aniso8601/__init__.py | 13 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 511 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 267 bytes .../aniso8601/__pycache__/date.cpython-37.pyc | Bin 0 -> 4062 bytes .../__pycache__/duration.cpython-37.pyc | Bin 0 -> 5051 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 2256 bytes .../__pycache__/interval.cpython-37.pyc | Bin 0 -> 2596 bytes .../__pycache__/resolution.cpython-37.pyc | Bin 0 -> 682 bytes .../aniso8601/__pycache__/time.cpython-37.pyc | Bin 0 -> 3773 bytes .../__pycache__/timezone.cpython-37.pyc | Bin 0 -> 2152 bytes venv/Lib/site-packages/aniso8601/compat.py | 16 + venv/Lib/site-packages/aniso8601/date.py | 250 + venv/Lib/site-packages/aniso8601/duration.py | 292 + .../Lib/site-packages/aniso8601/exceptions.py | 37 + venv/Lib/site-packages/aniso8601/interval.py | 161 + .../Lib/site-packages/aniso8601/resolution.py | 15 + venv/Lib/site-packages/aniso8601/time.py | 257 + venv/Lib/site-packages/aniso8601/timezone.py | 93 + .../astroid-2.0.4.dist-info/INSTALLER | 1 + .../astroid-2.0.4.dist-info/METADATA | 94 + .../astroid-2.0.4.dist-info/RECORD | 119 + .../astroid-2.0.4.dist-info/WHEEL | 5 + .../astroid-2.0.4.dist-info/top_level.txt | 1 + venv/Lib/site-packages/astroid/__init__.py | 156 + venv/Lib/site-packages/astroid/__pkginfo__.py | 57 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 4451 bytes .../__pycache__/__pkginfo__.cpython-37.pyc | Bin 0 -> 1443 bytes .../astroid/__pycache__/_ast.cpython-37.pyc | Bin 0 -> 1248 bytes .../__pycache__/arguments.cpython-37.pyc | Bin 0 -> 6990 bytes .../__pycache__/as_string.cpython-37.pyc | Bin 0 -> 25999 bytes .../astroid/__pycache__/bases.cpython-37.pyc | Bin 0 -> 14852 bytes .../__pycache__/builder.cpython-37.pyc | Bin 0 -> 12273 bytes .../__pycache__/context.cpython-37.pyc | Bin 0 -> 4213 bytes .../__pycache__/decorators.cpython-37.pyc | Bin 0 -> 3526 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 9372 bytes .../__pycache__/helpers.cpython-37.pyc | Bin 0 -> 7259 bytes .../__pycache__/inference.cpython-37.pyc | Bin 0 -> 20740 bytes .../__pycache__/manager.cpython-37.pyc | Bin 0 -> 8689 bytes .../astroid/__pycache__/mixins.cpython-37.pyc | Bin 0 -> 5549 bytes .../__pycache__/modutils.cpython-37.pyc | Bin 0 -> 17174 bytes .../__pycache__/node_classes.cpython-37.pyc | Bin 0 -> 118497 bytes .../astroid/__pycache__/nodes.cpython-37.pyc | Bin 0 -> 1937 bytes .../__pycache__/objects.cpython-37.pyc | Bin 0 -> 7111 bytes .../__pycache__/protocols.cpython-37.pyc | Bin 0 -> 16135 bytes .../__pycache__/raw_building.cpython-37.pyc | Bin 0 -> 10846 bytes .../__pycache__/rebuilder.cpython-37.pyc | Bin 0 -> 38060 bytes .../__pycache__/scoped_nodes.cpython-37.pyc | Bin 0 -> 70038 bytes .../__pycache__/test_utils.cpython-37.pyc | Bin 0 -> 2490 bytes .../__pycache__/transforms.cpython-37.pyc | Bin 0 -> 3297 bytes .../astroid/__pycache__/util.cpython-37.pyc | Bin 0 -> 5712 bytes venv/Lib/site-packages/astroid/_ast.py | 43 + venv/Lib/site-packages/astroid/arguments.py | 261 + venv/Lib/site-packages/astroid/as_string.py | 587 ++ venv/Lib/site-packages/astroid/bases.py | 493 + .../__pycache__/brain_attrs.cpython-37.pyc | Bin 0 -> 1415 bytes .../brain_builtin_inference.cpython-37.pyc | Bin 0 -> 19735 bytes .../brain_collections.cpython-37.pyc | Bin 0 -> 2621 bytes .../__pycache__/brain_curses.cpython-37.pyc | Bin 0 -> 3371 bytes .../__pycache__/brain_dateutil.cpython-37.pyc | Bin 0 -> 683 bytes .../__pycache__/brain_fstrings.cpython-37.pyc | Bin 0 -> 1406 bytes .../brain_functools.cpython-37.pyc | Bin 0 -> 5492 bytes .../brain/__pycache__/brain_gi.cpython-37.pyc | Bin 0 -> 3939 bytes .../__pycache__/brain_hashlib.cpython-37.pyc | Bin 0 -> 1340 bytes .../brain/__pycache__/brain_io.cpython-37.pyc | Bin 0 -> 1308 bytes .../brain_mechanize.cpython-37.pyc | Bin 0 -> 721 bytes .../brain_multiprocessing.cpython-37.pyc | Bin 0 -> 2592 bytes .../brain_namedtuple_enum.cpython-37.pyc | Bin 0 -> 10476 bytes .../__pycache__/brain_nose.cpython-37.pyc | Bin 0 -> 2048 bytes .../__pycache__/brain_numpy.cpython-37.pyc | Bin 0 -> 14576 bytes .../brain_pkg_resources.cpython-37.pyc | Bin 0 -> 2192 bytes .../__pycache__/brain_pytest.cpython-37.pyc | Bin 0 -> 2162 bytes .../brain/__pycache__/brain_qt.cpython-37.pyc | Bin 0 -> 2068 bytes .../__pycache__/brain_random.cpython-37.pyc | Bin 0 -> 2218 bytes .../brain/__pycache__/brain_re.cpython-37.pyc | Bin 0 -> 1069 bytes .../__pycache__/brain_six.cpython-37.pyc | Bin 0 -> 5524 bytes .../__pycache__/brain_ssl.cpython-37.pyc | Bin 0 -> 3527 bytes .../brain_subprocess.cpython-37.pyc | Bin 0 -> 3194 bytes .../brain_threading.cpython-37.pyc | Bin 0 -> 677 bytes .../__pycache__/brain_typing.cpython-37.pyc | Bin 0 -> 2289 bytes .../__pycache__/brain_uuid.cpython-37.pyc | Bin 0 -> 636 bytes .../astroid/brain/brain_attrs.py | 60 + .../astroid/brain/brain_builtin_inference.py | 803 ++ .../astroid/brain/brain_collections.py | 78 + .../astroid/brain/brain_curses.py | 177 + .../astroid/brain/brain_dateutil.py | 22 + .../astroid/brain/brain_fstrings.py | 60 + .../astroid/brain/brain_functools.py | 176 + .../site-packages/astroid/brain/brain_gi.py | 208 + .../astroid/brain/brain_hashlib.py | 47 + .../site-packages/astroid/brain/brain_io.py | 43 + .../astroid/brain/brain_mechanize.py | 26 + .../astroid/brain/brain_multiprocessing.py | 104 + .../astroid/brain/brain_namedtuple_enum.py | 397 + .../site-packages/astroid/brain/brain_nose.py | 71 + .../astroid/brain/brain_numpy.py | 472 + .../astroid/brain/brain_pkg_resources.py | 72 + .../astroid/brain/brain_pytest.py | 85 + .../site-packages/astroid/brain/brain_qt.py | 74 + .../astroid/brain/brain_random.py | 97 + .../site-packages/astroid/brain/brain_re.py | 34 + .../site-packages/astroid/brain/brain_six.py | 193 + .../site-packages/astroid/brain/brain_ssl.py | 71 + .../astroid/brain/brain_subprocess.py | 103 + .../astroid/brain/brain_threading.py | 28 + .../astroid/brain/brain_typing.py | 97 + .../site-packages/astroid/brain/brain_uuid.py | 22 + venv/Lib/site-packages/astroid/builder.py | 414 + venv/Lib/site-packages/astroid/context.py | 173 + venv/Lib/site-packages/astroid/decorators.py | 134 + venv/Lib/site-packages/astroid/exceptions.py | 217 + venv/Lib/site-packages/astroid/helpers.py | 264 + venv/Lib/site-packages/astroid/inference.py | 882 ++ .../astroid/interpreter/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 187 bytes .../__pycache__/dunder_lookup.cpython-37.pyc | Bin 0 -> 2164 bytes .../__pycache__/objectmodel.cpython-37.pyc | Bin 0 -> 21999 bytes .../astroid/interpreter/_import/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 195 bytes .../_import/__pycache__/spec.cpython-37.pyc | Bin 0 -> 9337 bytes .../_import/__pycache__/util.cpython-37.pyc | Bin 0 -> 413 bytes .../astroid/interpreter/_import/spec.py | 300 + .../astroid/interpreter/_import/util.py | 11 + .../astroid/interpreter/dunder_lookup.py | 81 + .../astroid/interpreter/objectmodel.py | 650 ++ venv/Lib/site-packages/astroid/manager.py | 284 + venv/Lib/site-packages/astroid/mixins.py | 156 + venv/Lib/site-packages/astroid/modutils.py | 691 ++ .../Lib/site-packages/astroid/node_classes.py | 4537 +++++++++ venv/Lib/site-packages/astroid/nodes.py | 70 + venv/Lib/site-packages/astroid/objects.py | 228 + venv/Lib/site-packages/astroid/protocols.py | 717 ++ .../Lib/site-packages/astroid/raw_building.py | 419 + venv/Lib/site-packages/astroid/rebuilder.py | 986 ++ .../Lib/site-packages/astroid/scoped_nodes.py | 2755 ++++++ venv/Lib/site-packages/astroid/test_utils.py | 64 + venv/Lib/site-packages/astroid/transforms.py | 83 + venv/Lib/site-packages/astroid/util.py | 156 + .../atomicwrites-1.2.1.dist-info/INSTALLER | 1 + .../atomicwrites-1.2.1.dist-info/METADATA | 144 + .../atomicwrites-1.2.1.dist-info/RECORD | 7 + .../atomicwrites-1.2.1.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../site-packages/atomicwrites/__init__.py | 214 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 6313 bytes venv/Lib/site-packages/attr/__init__.py | 65 + venv/Lib/site-packages/attr/__init__.pyi | 252 + .../attr/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1416 bytes .../attr/__pycache__/_compat.cpython-37.pyc | Bin 0 -> 4432 bytes .../attr/__pycache__/_config.cpython-37.pyc | Bin 0 -> 735 bytes .../attr/__pycache__/_funcs.cpython-37.pyc | Bin 0 -> 7542 bytes .../attr/__pycache__/_make.cpython-37.pyc | Bin 0 -> 50346 bytes .../__pycache__/converters.cpython-37.pyc | Bin 0 -> 2329 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 2138 bytes .../attr/__pycache__/filters.cpython-37.pyc | Bin 0 -> 1807 bytes .../__pycache__/validators.cpython-37.pyc | Bin 0 -> 5747 bytes venv/Lib/site-packages/attr/_compat.py | 163 + venv/Lib/site-packages/attr/_config.py | 23 + venv/Lib/site-packages/attr/_funcs.py | 290 + venv/Lib/site-packages/attr/_make.py | 2034 ++++ venv/Lib/site-packages/attr/converters.py | 78 + venv/Lib/site-packages/attr/converters.pyi | 12 + venv/Lib/site-packages/attr/exceptions.py | 57 + venv/Lib/site-packages/attr/exceptions.pyi | 7 + venv/Lib/site-packages/attr/filters.py | 52 + venv/Lib/site-packages/attr/filters.pyi | 5 + venv/Lib/site-packages/attr/py.typed | 0 venv/Lib/site-packages/attr/validators.py | 170 + venv/Lib/site-packages/attr/validators.pyi | 14 + .../attrs-18.2.0.dist-info/INSTALLER | 1 + .../attrs-18.2.0.dist-info/LICENSE.txt | 21 + .../attrs-18.2.0.dist-info/METADATA | 260 + .../attrs-18.2.0.dist-info/RECORD | 30 + .../attrs-18.2.0.dist-info/WHEEL | 6 + .../attrs-18.2.0.dist-info/top_level.txt | 1 + venv/Lib/site-packages/click/__init__.py | 97 + .../click/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2659 bytes .../__pycache__/_bashcomplete.cpython-37.pyc | Bin 0 -> 9115 bytes .../click/__pycache__/_compat.cpython-37.pyc | Bin 0 -> 16786 bytes .../__pycache__/_termui_impl.cpython-37.pyc | Bin 0 -> 13950 bytes .../__pycache__/_textwrap.cpython-37.pyc | Bin 0 -> 1333 bytes .../__pycache__/_unicodefun.cpython-37.pyc | Bin 0 -> 3323 bytes .../__pycache__/_winconsole.cpython-37.pyc | Bin 0 -> 8730 bytes .../click/__pycache__/core.cpython-37.pyc | Bin 0 -> 59830 bytes .../__pycache__/decorators.cpython-37.pyc | Bin 0 -> 11587 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 8613 bytes .../__pycache__/formatting.cpython-37.pyc | Bin 0 -> 8549 bytes .../click/__pycache__/globals.cpython-37.pyc | Bin 0 -> 1880 bytes .../click/__pycache__/parser.cpython-37.pyc | Bin 0 -> 11457 bytes .../click/__pycache__/termui.cpython-37.pyc | Bin 0 -> 20774 bytes .../click/__pycache__/testing.cpython-37.pyc | Bin 0 -> 11622 bytes .../click/__pycache__/types.cpython-37.pyc | Bin 0 -> 21800 bytes .../click/__pycache__/utils.cpython-37.pyc | Bin 0 -> 15245 bytes venv/Lib/site-packages/click/_bashcomplete.py | 293 + venv/Lib/site-packages/click/_compat.py | 703 ++ venv/Lib/site-packages/click/_termui_impl.py | 621 ++ venv/Lib/site-packages/click/_textwrap.py | 38 + venv/Lib/site-packages/click/_unicodefun.py | 125 + venv/Lib/site-packages/click/_winconsole.py | 307 + venv/Lib/site-packages/click/core.py | 1856 ++++ venv/Lib/site-packages/click/decorators.py | 311 + venv/Lib/site-packages/click/exceptions.py | 235 + venv/Lib/site-packages/click/formatting.py | 256 + venv/Lib/site-packages/click/globals.py | 48 + venv/Lib/site-packages/click/parser.py | 427 + venv/Lib/site-packages/click/termui.py | 606 ++ venv/Lib/site-packages/click/testing.py | 374 + venv/Lib/site-packages/click/types.py | 668 ++ venv/Lib/site-packages/click/utils.py | 440 + .../colorama-0.4.0.dist-info/DESCRIPTION.rst | 348 + .../colorama-0.4.0.dist-info/INSTALLER | 1 + .../colorama-0.4.0.dist-info/LICENSE.txt | 27 + .../colorama-0.4.0.dist-info/METADATA | 376 + .../colorama-0.4.0.dist-info/RECORD | 20 + .../colorama-0.4.0.dist-info/WHEEL | 6 + .../colorama-0.4.0.dist-info/metadata.json | 1 + .../colorama-0.4.0.dist-info/top_level.txt | 1 + venv/Lib/site-packages/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 428 bytes .../colorama/__pycache__/ansi.cpython-37.pyc | Bin 0 -> 3326 bytes .../__pycache__/ansitowin32.cpython-37.pyc | Bin 0 -> 7516 bytes .../__pycache__/initialise.cpython-37.pyc | Bin 0 -> 1647 bytes .../colorama/__pycache__/win32.cpython-37.pyc | Bin 0 -> 3841 bytes .../__pycache__/winterm.cpython-37.pyc | Bin 0 -> 4589 bytes venv/Lib/site-packages/colorama/ansi.py | 102 + .../Lib/site-packages/colorama/ansitowin32.py | 249 + venv/Lib/site-packages/colorama/initialise.py | 80 + venv/Lib/site-packages/colorama/win32.py | 152 + venv/Lib/site-packages/colorama/winterm.py | 169 + venv/Lib/site-packages/dotenv/__init__.py | 40 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1081 bytes .../dotenv/__pycache__/cli.cpython-37.pyc | Bin 0 -> 2987 bytes .../dotenv/__pycache__/compat.cpython-37.pyc | Bin 0 -> 270 bytes .../dotenv/__pycache__/ipython.cpython-37.pyc | Bin 0 -> 1512 bytes .../dotenv/__pycache__/main.cpython-37.pyc | Bin 0 -> 7727 bytes .../dotenv/__pycache__/version.cpython-37.pyc | Bin 0 -> 200 bytes venv/Lib/site-packages/dotenv/cli.py | 98 + venv/Lib/site-packages/dotenv/compat.py | 4 + venv/Lib/site-packages/dotenv/ipython.py | 41 + venv/Lib/site-packages/dotenv/main.py | 303 + venv/Lib/site-packages/dotenv/version.py | 1 + venv/Lib/site-packages/easy_install.py | 5 + venv/Lib/site-packages/flask/__init__.py | 49 + venv/Lib/site-packages/flask/__main__.py | 14 + .../flask/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1833 bytes .../flask/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 460 bytes .../flask/__pycache__/_compat.cpython-37.pyc | Bin 0 -> 3237 bytes .../flask/__pycache__/app.cpython-37.pyc | Bin 0 -> 70883 bytes .../__pycache__/blueprints.cpython-37.pyc | Bin 0 -> 20501 bytes .../flask/__pycache__/cli.cpython-37.pyc | Bin 0 -> 24789 bytes .../flask/__pycache__/config.cpython-37.pyc | Bin 0 -> 9999 bytes .../flask/__pycache__/ctx.cpython-37.pyc | Bin 0 -> 13969 bytes .../__pycache__/debughelpers.cpython-37.pyc | Bin 0 -> 6608 bytes .../flask/__pycache__/globals.cpython-37.pyc | Bin 0 -> 1760 bytes .../flask/__pycache__/helpers.cpython-37.pyc | Bin 0 -> 33023 bytes .../flask/__pycache__/logging.cpython-37.pyc | Bin 0 -> 2389 bytes .../flask/__pycache__/sessions.cpython-37.pyc | Bin 0 -> 12234 bytes .../flask/__pycache__/signals.cpython-37.pyc | Bin 0 -> 2421 bytes .../__pycache__/templating.cpython-37.pyc | Bin 0 -> 4970 bytes .../flask/__pycache__/testing.cpython-37.pyc | Bin 0 -> 7869 bytes .../flask/__pycache__/views.cpython-37.pyc | Bin 0 -> 4783 bytes .../flask/__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 6777 bytes venv/Lib/site-packages/flask/_compat.py | 99 + venv/Lib/site-packages/flask/app.py | 2315 +++++ venv/Lib/site-packages/flask/blueprints.py | 448 + venv/Lib/site-packages/flask/cli.py | 898 ++ venv/Lib/site-packages/flask/config.py | 265 + venv/Lib/site-packages/flask/ctx.py | 457 + venv/Lib/site-packages/flask/debughelpers.py | 168 + venv/Lib/site-packages/flask/globals.py | 61 + venv/Lib/site-packages/flask/helpers.py | 1044 +++ venv/Lib/site-packages/flask/json/__init__.py | 327 + .../json/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 10259 bytes .../flask/json/__pycache__/tag.cpython-37.pyc | Bin 0 -> 11089 bytes venv/Lib/site-packages/flask/json/tag.py | 300 + venv/Lib/site-packages/flask/logging.py | 78 + venv/Lib/site-packages/flask/sessions.py | 385 + venv/Lib/site-packages/flask/signals.py | 57 + venv/Lib/site-packages/flask/templating.py | 150 + venv/Lib/site-packages/flask/testing.py | 250 + venv/Lib/site-packages/flask/views.py | 158 + venv/Lib/site-packages/flask/wrappers.py | 216 + .../site-packages/flask_restful/__init__.py | 729 ++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 24665 bytes .../__pycache__/__version__.cpython-37.pyc | Bin 0 -> 211 bytes .../__pycache__/fields.cpython-37.pyc | Bin 0 -> 14301 bytes .../__pycache__/inputs.cpython-37.pyc | Bin 0 -> 8776 bytes .../__pycache__/paging.cpython-37.pyc | Bin 0 -> 1234 bytes .../__pycache__/reqparse.cpython-37.pyc | Bin 0 -> 10729 bytes .../flask_restful/__version__.py | 3 + .../Lib/site-packages/flask_restful/fields.py | 417 + .../Lib/site-packages/flask_restful/inputs.py | 282 + .../Lib/site-packages/flask_restful/paging.py | 29 + .../flask_restful/representations/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 203 bytes .../__pycache__/json.cpython-37.pyc | Bin 0 -> 797 bytes .../flask_restful/representations/json.py | 25 + .../site-packages/flask_restful/reqparse.py | 344 + .../flask_restful/utils/__init__.py | 35 + .../utils/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 929 bytes .../utils/__pycache__/cors.cpython-37.pyc | Bin 0 -> 2317 bytes .../utils/__pycache__/crypto.cpython-37.pyc | Bin 0 -> 1325 bytes .../site-packages/flask_restful/utils/cors.py | 54 + .../flask_restful/utils/crypto.py | 35 + .../isort-4.3.4.dist-info/DESCRIPTION.rst | 618 ++ .../isort-4.3.4.dist-info/INSTALLER | 1 + .../isort-4.3.4.dist-info/LICENSE.txt | 21 + .../isort-4.3.4.dist-info/METADATA | 647 ++ .../isort-4.3.4.dist-info/RECORD | 28 + .../site-packages/isort-4.3.4.dist-info/WHEEL | 5 + .../isort-4.3.4.dist-info/entry_points.txt | 9 + .../isort-4.3.4.dist-info/metadata.json | 1 + .../isort-4.3.4.dist-info/top_level.txt | 1 + venv/Lib/site-packages/isort/__init__.py | 28 + venv/Lib/site-packages/isort/__main__.py | 5 + .../isort/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1599 bytes .../isort/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 268 bytes .../isort/__pycache__/hooks.cpython-37.pyc | Bin 0 -> 2988 bytes .../isort/__pycache__/isort.cpython-37.pyc | Bin 0 -> 30385 bytes .../isort/__pycache__/main.cpython-37.pyc | Bin 0 -> 15382 bytes .../isort/__pycache__/natural.cpython-37.pyc | Bin 0 -> 2311 bytes .../__pycache__/pie_slice.cpython-37.pyc | Bin 0 -> 14958 bytes .../__pycache__/pylama_isort.cpython-37.pyc | Bin 0 -> 1012 bytes .../isort/__pycache__/settings.cpython-37.pyc | Bin 0 -> 10300 bytes venv/Lib/site-packages/isort/hooks.py | 82 + venv/Lib/site-packages/isort/isort.py | 1037 +++ venv/Lib/site-packages/isort/main.py | 364 + venv/Lib/site-packages/isort/natural.py | 47 + venv/Lib/site-packages/isort/pie_slice.py | 422 + venv/Lib/site-packages/isort/pylama_isort.py | 29 + venv/Lib/site-packages/isort/settings.py | 269 + .../itsdangerous-0.24-py3.7.egg-info/PKG-INFO | 13 + .../SOURCES.txt | 27 + .../dependency_links.txt | 1 + .../installed-files.txt | 7 + .../not-zip-safe | 1 + .../top_level.txt | 1 + venv/Lib/site-packages/itsdangerous.py | 872 ++ venv/Lib/site-packages/jinja2/__init__.py | 83 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2537 bytes .../jinja2/__pycache__/_compat.cpython-37.pyc | Bin 0 -> 3352 bytes .../__pycache__/_identifier.cpython-37.pyc | Bin 0 -> 1850 bytes .../__pycache__/asyncfilters.cpython-37.pyc | Bin 0 -> 4782 bytes .../__pycache__/asyncsupport.cpython-37.pyc | Bin 0 -> 8130 bytes .../jinja2/__pycache__/bccache.cpython-37.pyc | Bin 0 -> 12719 bytes .../__pycache__/compiler.cpython-37.pyc | Bin 0 -> 46848 bytes .../__pycache__/constants.cpython-37.pyc | Bin 0 -> 1713 bytes .../jinja2/__pycache__/debug.cpython-37.pyc | Bin 0 -> 9329 bytes .../__pycache__/defaults.cpython-37.pyc | Bin 0 -> 1463 bytes .../__pycache__/environment.cpython-37.pyc | Bin 0 -> 43258 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 5027 bytes .../jinja2/__pycache__/ext.cpython-37.pyc | Bin 0 -> 20048 bytes .../jinja2/__pycache__/filters.cpython-37.pyc | Bin 0 -> 34393 bytes .../__pycache__/idtracking.cpython-37.pyc | Bin 0 -> 9963 bytes .../jinja2/__pycache__/lexer.cpython-37.pyc | Bin 0 -> 18520 bytes .../jinja2/__pycache__/loaders.cpython-37.pyc | Bin 0 -> 16583 bytes .../jinja2/__pycache__/meta.cpython-37.pyc | Bin 0 -> 3676 bytes .../__pycache__/nativetypes.cpython-37.pyc | Bin 0 -> 5132 bytes .../jinja2/__pycache__/nodes.cpython-37.pyc | Bin 0 -> 36092 bytes .../__pycache__/optimizer.cpython-37.pyc | Bin 0 -> 2043 bytes .../jinja2/__pycache__/parser.cpython-37.pyc | Bin 0 -> 25187 bytes .../jinja2/__pycache__/runtime.cpython-37.pyc | Bin 0 -> 24595 bytes .../jinja2/__pycache__/sandbox.cpython-37.pyc | Bin 0 -> 13998 bytes .../jinja2/__pycache__/tests.cpython-37.pyc | Bin 0 -> 4419 bytes .../jinja2/__pycache__/utils.cpython-37.pyc | Bin 0 -> 20796 bytes .../jinja2/__pycache__/visitor.cpython-37.pyc | Bin 0 -> 3359 bytes venv/Lib/site-packages/jinja2/_compat.py | 99 + venv/Lib/site-packages/jinja2/_identifier.py | 2 + venv/Lib/site-packages/jinja2/asyncfilters.py | 146 + venv/Lib/site-packages/jinja2/asyncsupport.py | 256 + venv/Lib/site-packages/jinja2/bccache.py | 362 + venv/Lib/site-packages/jinja2/compiler.py | 1721 ++++ venv/Lib/site-packages/jinja2/constants.py | 32 + venv/Lib/site-packages/jinja2/debug.py | 372 + venv/Lib/site-packages/jinja2/defaults.py | 56 + venv/Lib/site-packages/jinja2/environment.py | 1276 +++ venv/Lib/site-packages/jinja2/exceptions.py | 146 + venv/Lib/site-packages/jinja2/ext.py | 627 ++ venv/Lib/site-packages/jinja2/filters.py | 1190 +++ venv/Lib/site-packages/jinja2/idtracking.py | 286 + venv/Lib/site-packages/jinja2/lexer.py | 739 ++ venv/Lib/site-packages/jinja2/loaders.py | 481 + venv/Lib/site-packages/jinja2/meta.py | 106 + venv/Lib/site-packages/jinja2/nativetypes.py | 220 + venv/Lib/site-packages/jinja2/nodes.py | 999 ++ venv/Lib/site-packages/jinja2/optimizer.py | 49 + venv/Lib/site-packages/jinja2/parser.py | 903 ++ venv/Lib/site-packages/jinja2/runtime.py | 813 ++ venv/Lib/site-packages/jinja2/sandbox.py | 475 + venv/Lib/site-packages/jinja2/tests.py | 175 + venv/Lib/site-packages/jinja2/utils.py | 647 ++ venv/Lib/site-packages/jinja2/visitor.py | 87 + .../AUTHORS.rst | 8 + .../INSTALLER | 1 + .../lazy_object_proxy-1.3.1.dist-info/LICENSE | 19 + .../METADATA | 125 + .../lazy_object_proxy-1.3.1.dist-info/RECORD | 18 + .../lazy_object_proxy-1.3.1.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../lazy_object_proxy/__init__.py | 20 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 497 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 444 bytes .../__pycache__/simple.cpython-37.pyc | Bin 0 -> 7747 bytes .../__pycache__/slots.cpython-37.pyc | Bin 0 -> 15218 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 787 bytes .../site-packages/lazy_object_proxy/cext.c | 1421 +++ .../site-packages/lazy_object_proxy/compat.py | 9 + .../site-packages/lazy_object_proxy/simple.py | 246 + .../site-packages/lazy_object_proxy/slots.py | 414 + .../site-packages/lazy_object_proxy/utils.py | 13 + venv/Lib/site-packages/markupsafe/__init__.py | 305 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 11295 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 780 bytes .../__pycache__/_constants.cpython-37.pyc | Bin 0 -> 4348 bytes .../__pycache__/_native.cpython-37.pyc | Bin 0 -> 1413 bytes venv/Lib/site-packages/markupsafe/_compat.py | 26 + .../site-packages/markupsafe/_constants.py | 267 + venv/Lib/site-packages/markupsafe/_native.py | 46 + venv/Lib/site-packages/markupsafe/_speedups.c | 239 + .../mccabe-0.6.1.dist-info/DESCRIPTION.rst | 152 + .../mccabe-0.6.1.dist-info/INSTALLER | 1 + .../mccabe-0.6.1.dist-info/METADATA | 178 + .../mccabe-0.6.1.dist-info/RECORD | 10 + .../mccabe-0.6.1.dist-info/WHEEL | 6 + .../mccabe-0.6.1.dist-info/entry_points.txt | 3 + .../mccabe-0.6.1.dist-info/metadata.json | 1 + .../mccabe-0.6.1.dist-info/top_level.txt | 1 + venv/Lib/site-packages/mccabe.py | 347 + .../more_itertools-4.3.0.dist-info/INSTALLER | 1 + .../more_itertools-4.3.0.dist-info/METADATA | 433 + .../more_itertools-4.3.0.dist-info/RECORD | 17 + .../more_itertools-4.3.0.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../site-packages/more_itertools/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 259 bytes .../__pycache__/more.cpython-37.pyc | Bin 0 -> 67465 bytes .../__pycache__/recipes.cpython-37.pyc | Bin 0 -> 16083 bytes venv/Lib/site-packages/more_itertools/more.py | 2211 +++++ .../site-packages/more_itertools/recipes.py | 565 ++ .../more_itertools/tests/__init__.py | 0 .../tests/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 195 bytes .../__pycache__/test_more.cpython-37.pyc | Bin 0 -> 96304 bytes .../__pycache__/test_recipes.cpython-37.pyc | Bin 0 -> 32311 bytes .../more_itertools/tests/test_more.py | 2074 +++++ .../more_itertools/tests/test_recipes.py | 616 ++ .../pep8-1.7.1.dist-info/DESCRIPTION.rst | 806 ++ .../pep8-1.7.1.dist-info/INSTALLER | 1 + .../pep8-1.7.1.dist-info/METADATA | 827 ++ .../site-packages/pep8-1.7.1.dist-info/RECORD | 12 + .../site-packages/pep8-1.7.1.dist-info/WHEEL | 6 + .../pep8-1.7.1.dist-info/entry_points.txt | 3 + .../pep8-1.7.1.dist-info/metadata.json | 1 + .../namespace_packages.txt | 1 + .../pep8-1.7.1.dist-info/top_level.txt | 1 + venv/Lib/site-packages/pep8.py | 2165 +++++ .../pip-18.1.dist-info/INSTALLER | 1 + .../pip-18.1.dist-info/LICENSE.txt | 20 + .../site-packages/pip-18.1.dist-info/METADATA | 70 + .../site-packages/pip-18.1.dist-info/RECORD | 614 ++ .../site-packages/pip-18.1.dist-info/WHEEL | 6 + .../pip-18.1.dist-info/entry_points.txt | 5 + .../pip-18.1.dist-info/top_level.txt | 1 + venv/Lib/site-packages/pip/__init__.py | 1 + venv/Lib/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 187 bytes .../pip/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 441 bytes .../site-packages/pip/_internal/__init__.py | 78 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1833 bytes .../__pycache__/build_env.cpython-37.pyc | Bin 0 -> 5042 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 6827 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 9826 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 20894 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 11547 bytes .../__pycache__/index.cpython-37.pyc | Bin 0 -> 23156 bytes .../__pycache__/locations.cpython-37.pyc | Bin 0 -> 4223 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 7282 bytes .../__pycache__/pyproject.cpython-37.pyc | Bin 0 -> 2706 bytes .../__pycache__/resolve.cpython-37.pyc | Bin 0 -> 8473 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 20835 bytes .../site-packages/pip/_internal/build_env.py | 142 + venv/Lib/site-packages/pip/_internal/cache.py | 202 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 264 bytes .../__pycache__/autocompletion.cpython-37.pyc | Bin 0 -> 5077 bytes .../__pycache__/base_command.cpython-37.pyc | Bin 0 -> 6302 bytes .../cli/__pycache__/cmdoptions.cpython-37.pyc | Bin 0 -> 15023 bytes .../__pycache__/main_parser.cpython-37.pyc | Bin 0 -> 2224 bytes .../cli/__pycache__/parser.cpython-37.pyc | Bin 0 -> 8928 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 393 bytes .../pip/_internal/cli/autocompletion.py | 152 + .../pip/_internal/cli/base_command.py | 278 + .../pip/_internal/cli/cmdoptions.py | 714 ++ .../pip/_internal/cli/main_parser.py | 96 + .../site-packages/pip/_internal/cli/parser.py | 261 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 79 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2492 bytes .../commands/__pycache__/check.cpython-37.pyc | Bin 0 -> 1294 bytes .../__pycache__/completion.cpython-37.pyc | Bin 0 -> 3066 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 6418 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 4646 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 2862 bytes .../commands/__pycache__/hash.cpython-37.pyc | Bin 0 -> 2056 bytes .../commands/__pycache__/help.cpython-37.pyc | Bin 0 -> 1232 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 11828 bytes .../commands/__pycache__/list.cpython-37.pyc | Bin 0 -> 8905 bytes .../__pycache__/search.cpython-37.pyc | Bin 0 -> 4298 bytes .../commands/__pycache__/show.cpython-37.pyc | Bin 0 -> 5879 bytes .../__pycache__/uninstall.cpython-37.pyc | Bin 0 -> 2688 bytes .../commands/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 4909 bytes .../pip/_internal/commands/check.py | 41 + .../pip/_internal/commands/completion.py | 94 + .../pip/_internal/commands/configuration.py | 227 + .../pip/_internal/commands/download.py | 174 + .../pip/_internal/commands/freeze.py | 96 + .../pip/_internal/commands/hash.py | 57 + .../pip/_internal/commands/help.py | 37 + .../pip/_internal/commands/install.py | 535 ++ .../pip/_internal/commands/list.py | 306 + .../pip/_internal/commands/search.py | 135 + .../pip/_internal/commands/show.py | 168 + .../pip/_internal/commands/uninstall.py | 78 + .../pip/_internal/commands/wheel.py | 183 + .../pip/_internal/configuration.py | 387 + .../site-packages/pip/_internal/download.py | 921 ++ .../site-packages/pip/_internal/exceptions.py | 268 + venv/Lib/site-packages/pip/_internal/index.py | 899 ++ .../site-packages/pip/_internal/locations.py | 194 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 252 bytes .../__pycache__/candidate.cpython-37.pyc | Bin 0 -> 1087 bytes .../__pycache__/format_control.cpython-37.pyc | Bin 0 -> 2422 bytes .../models/__pycache__/index.cpython-37.pyc | Bin 0 -> 1156 bytes .../models/__pycache__/link.cpython-37.pyc | Bin 0 -> 4754 bytes .../pip/_internal/models/candidate.py | 23 + .../pip/_internal/models/format_control.py | 62 + .../pip/_internal/models/index.py | 29 + .../pip/_internal/models/link.py | 141 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 188 bytes .../__pycache__/check.cpython-37.pyc | Bin 0 -> 3365 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 6320 bytes .../__pycache__/prepare.cpython-37.pyc | Bin 0 -> 9186 bytes .../pip/_internal/operations/check.py | 148 + .../pip/_internal/operations/freeze.py | 264 + .../pip/_internal/operations/prepare.py | 355 + .../site-packages/pip/_internal/pep425tags.py | 317 + .../site-packages/pip/_internal/pyproject.py | 144 + .../pip/_internal/req/__init__.py | 69 + .../req/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1556 bytes .../__pycache__/constructors.cpython-37.pyc | Bin 0 -> 6954 bytes .../req/__pycache__/req_file.cpython-37.pyc | Bin 0 -> 8655 bytes .../__pycache__/req_install.cpython-37.pyc | Bin 0 -> 22805 bytes .../req/__pycache__/req_set.cpython-37.pyc | Bin 0 -> 5769 bytes .../__pycache__/req_tracker.cpython-37.pyc | Bin 0 -> 2880 bytes .../__pycache__/req_uninstall.cpython-37.pyc | Bin 0 -> 12852 bytes .../pip/_internal/req/constructors.py | 298 + .../pip/_internal/req/req_file.py | 340 + .../pip/_internal/req/req_install.py | 860 ++ .../pip/_internal/req/req_set.py | 181 + .../pip/_internal/req/req_tracker.py | 76 + .../pip/_internal/req/req_uninstall.py | 460 + .../site-packages/pip/_internal/resolve.py | 353 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 183 bytes .../utils/__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 7904 bytes .../utils/__pycache__/compat.cpython-37.pyc | Bin 0 -> 5974 bytes .../__pycache__/deprecation.cpython-37.pyc | Bin 0 -> 2557 bytes .../utils/__pycache__/encoding.cpython-37.pyc | Bin 0 -> 1119 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 0 -> 650 bytes .../utils/__pycache__/glibc.cpython-37.pyc | Bin 0 -> 1541 bytes .../utils/__pycache__/hashes.cpython-37.pyc | Bin 0 -> 3318 bytes .../utils/__pycache__/logging.cpython-37.pyc | Bin 0 -> 5351 bytes .../utils/__pycache__/misc.cpython-37.pyc | Bin 0 -> 23897 bytes .../utils/__pycache__/models.cpython-37.pyc | Bin 0 -> 1932 bytes .../utils/__pycache__/outdated.cpython-37.pyc | Bin 0 -> 3904 bytes .../__pycache__/packaging.cpython-37.pyc | Bin 0 -> 2383 bytes .../setuptools_build.cpython-37.pyc | Bin 0 -> 378 bytes .../utils/__pycache__/temp_dir.cpython-37.pyc | Bin 0 -> 2795 bytes .../utils/__pycache__/typing.cpython-37.pyc | Bin 0 -> 1327 bytes .../utils/__pycache__/ui.cpython-37.pyc | Bin 0 -> 11852 bytes .../pip/_internal/utils/appdirs.py | 258 + .../pip/_internal/utils/compat.py | 248 + .../pip/_internal/utils/deprecation.py | 89 + .../pip/_internal/utils/encoding.py | 33 + .../pip/_internal/utils/filesystem.py | 28 + .../pip/_internal/utils/glibc.py | 84 + .../pip/_internal/utils/hashes.py | 94 + .../pip/_internal/utils/logging.py | 225 + .../site-packages/pip/_internal/utils/misc.py | 940 ++ .../pip/_internal/utils/models.py | 40 + .../pip/_internal/utils/outdated.py | 154 + .../pip/_internal/utils/packaging.py | 75 + .../pip/_internal/utils/setuptools_build.py | 8 + .../pip/_internal/utils/temp_dir.py | 82 + .../pip/_internal/utils/typing.py | 29 + .../site-packages/pip/_internal/utils/ui.py | 421 + .../pip/_internal/vcs/__init__.py | 509 + .../vcs/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 15549 bytes .../vcs/__pycache__/bazaar.cpython-37.pyc | Bin 0 -> 3812 bytes .../vcs/__pycache__/git.cpython-37.pyc | Bin 0 -> 9117 bytes .../vcs/__pycache__/mercurial.cpython-37.pyc | Bin 0 -> 3785 bytes .../vcs/__pycache__/subversion.cpython-37.pyc | Bin 0 -> 6387 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 346 + .../pip/_internal/vcs/mercurial.py | 101 + .../pip/_internal/vcs/subversion.py | 213 + venv/Lib/site-packages/pip/_internal/wheel.py | 831 ++ .../Lib/site-packages/pip/_vendor/__init__.py | 110 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2853 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 20600 bytes .../_vendor/__pycache__/distro.cpython-37.pyc | Bin 0 -> 36133 bytes .../__pycache__/ipaddress.cpython-37.pyc | Bin 0 -> 66443 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 203047 bytes .../__pycache__/retrying.cpython-37.pyc | Bin 0 -> 8081 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24986 bytes venv/Lib/site-packages/pip/_vendor/appdirs.py | 604 ++ .../pip/_vendor/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 541 bytes .../__pycache__/_cmd.cpython-37.pyc | Bin 0 -> 1544 bytes .../__pycache__/adapter.cpython-37.pyc | Bin 0 -> 3027 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 1757 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 748 bytes .../__pycache__/controller.cpython-37.pyc | Bin 0 -> 7627 bytes .../__pycache__/filewrapper.cpython-37.pyc | Bin 0 -> 2145 bytes .../__pycache__/heuristics.cpython-37.pyc | Bin 0 -> 4665 bytes .../__pycache__/serialize.cpython-37.pyc | Bin 0 -> 4229 bytes .../__pycache__/wrapper.cpython-37.pyc | Bin 0 -> 649 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 285 bytes .../__pycache__/file_cache.cpython-37.pyc | Bin 0 -> 3219 bytes .../__pycache__/redis_cache.cpython-37.pyc | Bin 0 -> 1541 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/controller.py | 367 + .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/serialize.py | 186 + .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 268 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 251 bytes .../certifi/__pycache__/core.cpython-37.pyc | Bin 0 -> 1203 bytes .../pip/_vendor/certifi/cacert.pem | 4300 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 37 + .../pip/_vendor/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 835 bytes .../__pycache__/big5freq.cpython-37.pyc | Bin 0 -> 27170 bytes .../__pycache__/big5prober.cpython-37.pyc | Bin 0 -> 1111 bytes .../chardistribution.cpython-37.pyc | Bin 0 -> 6297 bytes .../charsetgroupprober.cpython-37.pyc | Bin 0 -> 2218 bytes .../__pycache__/charsetprober.cpython-37.pyc | Bin 0 -> 3428 bytes .../codingstatemachine.cpython-37.pyc | Bin 0 -> 2875 bytes .../chardet/__pycache__/compat.cpython-37.pyc | Bin 0 -> 346 bytes .../__pycache__/cp949prober.cpython-37.pyc | Bin 0 -> 1118 bytes .../chardet/__pycache__/enums.cpython-37.pyc | Bin 0 -> 2609 bytes .../__pycache__/escprober.cpython-37.pyc | Bin 0 -> 2596 bytes .../chardet/__pycache__/escsm.cpython-37.pyc | Bin 0 -> 7057 bytes .../__pycache__/eucjpprober.cpython-37.pyc | Bin 0 -> 2404 bytes .../__pycache__/euckrfreq.cpython-37.pyc | Bin 0 -> 12054 bytes .../__pycache__/euckrprober.cpython-37.pyc | Bin 0 -> 1119 bytes .../__pycache__/euctwfreq.cpython-37.pyc | Bin 0 -> 27174 bytes .../__pycache__/euctwprober.cpython-37.pyc | Bin 0 -> 1119 bytes .../__pycache__/gb2312freq.cpython-37.pyc | Bin 0 -> 19098 bytes .../__pycache__/gb2312prober.cpython-37.pyc | Bin 0 -> 1127 bytes .../__pycache__/hebrewprober.cpython-37.pyc | Bin 0 -> 2961 bytes .../__pycache__/jisfreq.cpython-37.pyc | Bin 0 -> 22126 bytes .../chardet/__pycache__/jpcntx.cpython-37.pyc | Bin 0 -> 38005 bytes .../langbulgarianmodel.cpython-37.pyc | Bin 0 -> 23619 bytes .../langcyrillicmodel.cpython-37.pyc | Bin 0 -> 29075 bytes .../__pycache__/langgreekmodel.cpython-37.pyc | Bin 0 -> 23577 bytes .../langhebrewmodel.cpython-37.pyc | Bin 0 -> 22206 bytes .../langhungarianmodel.cpython-37.pyc | Bin 0 -> 23608 bytes .../__pycache__/langthaimodel.cpython-37.pyc | Bin 0 -> 22185 bytes .../langturkishmodel.cpython-37.pyc | Bin 0 -> 22208 bytes .../__pycache__/latin1prober.cpython-37.pyc | Bin 0 -> 2918 bytes .../mbcharsetprober.cpython-37.pyc | Bin 0 -> 2223 bytes .../mbcsgroupprober.cpython-37.pyc | Bin 0 -> 1114 bytes .../chardet/__pycache__/mbcssm.cpython-37.pyc | Bin 0 -> 15669 bytes .../sbcharsetprober.cpython-37.pyc | Bin 0 -> 2976 bytes .../sbcsgroupprober.cpython-37.pyc | Bin 0 -> 1604 bytes .../__pycache__/sjisprober.cpython-37.pyc | Bin 0 -> 2430 bytes .../universaldetector.cpython-37.pyc | Bin 0 -> 5820 bytes .../__pycache__/utf8prober.cpython-37.pyc | Bin 0 -> 1961 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 430 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 187 bytes .../cli/__pycache__/chardetect.cpython-37.pyc | Bin 0 -> 2676 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 ++ .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 435 bytes .../colorama/__pycache__/ansi.cpython-37.pyc | Bin 0 -> 3333 bytes .../__pycache__/ansitowin32.cpython-37.pyc | Bin 0 -> 7046 bytes .../__pycache__/initialise.cpython-37.pyc | Bin 0 -> 1654 bytes .../colorama/__pycache__/win32.cpython-37.pyc | Bin 0 -> 3869 bytes .../__pycache__/winterm.cpython-37.pyc | Bin 0 -> 4558 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 236 + .../pip/_vendor/colorama/initialise.py | 82 + .../pip/_vendor/colorama/win32.py | 156 + .../pip/_vendor/colorama/winterm.py | 162 + .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1033 bytes .../distlib/__pycache__/compat.cpython-37.pyc | Bin 0 -> 32043 bytes .../__pycache__/database.cpython-37.pyc | Bin 0 -> 42516 bytes .../distlib/__pycache__/index.cpython-37.pyc | Bin 0 -> 17329 bytes .../__pycache__/locators.cpython-37.pyc | Bin 0 -> 38636 bytes .../__pycache__/manifest.cpython-37.pyc | Bin 0 -> 10281 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 4467 bytes .../__pycache__/metadata.cpython-37.pyc | Bin 0 -> 27676 bytes .../__pycache__/resources.cpython-37.pyc | Bin 0 -> 10877 bytes .../__pycache__/scripts.cpython-37.pyc | Bin 0 -> 11053 bytes .../distlib/__pycache__/util.cpython-37.pyc | Bin 0 -> 47874 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 20417 bytes .../distlib/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 25067 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 475 bytes .../_backport/__pycache__/misc.cpython-37.pyc | Bin 0 -> 1072 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 0 -> 21388 bytes .../__pycache__/sysconfig.cpython-37.pyc | Bin 0 -> 15853 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 0 -> 62718 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 761 ++ .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 788 ++ .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ++++++ .../pip/_vendor/distlib/compat.py | 1120 +++ .../pip/_vendor/distlib/database.py | 1336 +++ .../pip/_vendor/distlib/index.py | 516 ++ .../pip/_vendor/distlib/locators.py | 1292 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1091 +++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 415 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 92672 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 102400 bytes .../site-packages/pip/_vendor/distlib/util.py | 1755 ++++ .../pip/_vendor/distlib/version.py | 736 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 89088 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99328 bytes .../pip/_vendor/distlib/wheel.py | 984 ++ venv/Lib/site-packages/pip/_vendor/distro.py | 1197 +++ .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1304 bytes .../__pycache__/_ihatexml.cpython-37.pyc | Bin 0 -> 13751 bytes .../__pycache__/_inputstream.cpython-37.pyc | Bin 0 -> 22642 bytes .../__pycache__/_tokenizer.cpython-37.pyc | Bin 0 -> 41543 bytes .../__pycache__/_utils.cpython-37.pyc | Bin 0 -> 3296 bytes .../__pycache__/constants.cpython-37.pyc | Bin 0 -> 66208 bytes .../__pycache__/html5parser.cpython-37.pyc | Bin 0 -> 97805 bytes .../__pycache__/serializer.cpython-37.pyc | Bin 0 -> 10821 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 + .../pip/_vendor/html5lib/_inputstream.py | 923 ++ .../pip/_vendor/html5lib/_tokenizer.py | 1721 ++++ .../pip/_vendor/html5lib/_trie/__init__.py | 14 + .../_trie/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 417 bytes .../_trie/__pycache__/_base.cpython-37.pyc | Bin 0 -> 1500 bytes .../_trie/__pycache__/datrie.cpython-37.pyc | Bin 0 -> 2019 bytes .../_trie/__pycache__/py.cpython-37.pyc | Bin 0 -> 2222 bytes .../pip/_vendor/html5lib/_trie/_base.py | 37 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/constants.py | 2947 ++++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 192 bytes .../alphabeticalattributes.cpython-37.pyc | Bin 0 -> 1308 bytes .../filters/__pycache__/base.cpython-37.pyc | Bin 0 -> 842 bytes .../inject_meta_charset.cpython-37.pyc | Bin 0 -> 1862 bytes .../filters/__pycache__/lint.cpython-37.pyc | Bin 0 -> 2626 bytes .../__pycache__/optionaltags.cpython-37.pyc | Bin 0 -> 2753 bytes .../__pycache__/sanitizer.cpython-37.pyc | Bin 0 -> 16428 bytes .../__pycache__/whitespace.cpython-37.pyc | Bin 0 -> 1346 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 896 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2791 ++++++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 931 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1528 bytes .../__pycache__/sax.cpython-37.pyc | Bin 0 -> 1478 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3312 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 11235 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 9265 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 11844 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 11784 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 236 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3989 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 6985 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 1714 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 3521 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 6630 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1888 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 249 bytes .../idna/__pycache__/codec.cpython-37.pyc | Bin 0 -> 3056 bytes .../idna/__pycache__/compat.cpython-37.pyc | Bin 0 -> 609 bytes .../idna/__pycache__/core.cpython-37.pyc | Bin 0 -> 9141 bytes .../idna/__pycache__/idnadata.cpython-37.pyc | Bin 0 -> 20573 bytes .../idna/__pycache__/intranges.cpython-37.pyc | Bin 0 -> 1789 bytes .../__pycache__/package_data.cpython-37.pyc | Bin 0 -> 203 bytes .../idna/__pycache__/uts46data.cpython-37.pyc | Bin 0 -> 175645 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/core.py | 399 + .../pip/_vendor/idna/idnadata.py | 1893 ++++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8179 +++++++++++++++++ .../site-packages/pip/_vendor/ipaddress.py | 2419 +++++ .../pip/_vendor/lockfile/__init__.py | 347 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 9899 bytes .../__pycache__/linklockfile.cpython-37.pyc | Bin 0 -> 2280 bytes .../__pycache__/mkdirlockfile.cpython-37.pyc | Bin 0 -> 2642 bytes .../__pycache__/pidlockfile.cpython-37.pyc | Bin 0 -> 4842 bytes .../__pycache__/sqlitelockfile.cpython-37.pyc | Bin 0 -> 3741 bytes .../symlinklockfile.cpython-37.pyc | Bin 0 -> 2165 bytes .../pip/_vendor/lockfile/linklockfile.py | 73 + .../pip/_vendor/lockfile/mkdirlockfile.py | 84 + .../pip/_vendor/lockfile/pidlockfile.py | 190 + .../pip/_vendor/lockfile/sqlitelockfile.py | 156 + .../pip/_vendor/lockfile/symlinklockfile.py | 70 + .../pip/_vendor/msgpack/__init__.py | 66 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2061 bytes .../__pycache__/_version.cpython-37.pyc | Bin 0 -> 210 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 2166 bytes .../__pycache__/fallback.cpython-37.pyc | Bin 0 -> 24538 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 41 + .../pip/_vendor/msgpack/fallback.py | 977 ++ .../pip/_vendor/packaging/__about__.py | 21 + .../pip/_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 711 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 549 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1001 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2853 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8852 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3868 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19779 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 1447 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 11965 bytes .../pip/_vendor/packaging/_compat.py | 30 + .../pip/_vendor/packaging/_structures.py | 70 + .../pip/_vendor/packaging/markers.py | 301 + .../pip/_vendor/packaging/requirements.py | 130 + .../pip/_vendor/packaging/specifiers.py | 774 ++ .../pip/_vendor/packaging/utils.py | 63 + .../pip/_vendor/packaging/version.py | 441 + .../pip/_vendor/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 272 bytes .../__pycache__/_in_process.cpython-37.pyc | Bin 0 -> 5337 bytes .../pep517/__pycache__/check.cpython-37.pyc | Bin 0 -> 4736 bytes .../__pycache__/colorlog.cpython-37.pyc | Bin 0 -> 2901 bytes .../pep517/__pycache__/compat.cpython-37.pyc | Bin 0 -> 1010 bytes .../__pycache__/envbuild.cpython-37.pyc | Bin 0 -> 4167 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 4734 bytes .../pip/_vendor/pep517/_in_process.py | 182 + .../site-packages/pip/_vendor/pep517/check.py | 194 + .../pip/_vendor/pep517/colorlog.py | 110 + .../pip/_vendor/pep517/compat.py | 23 + .../pip/_vendor/pep517/envbuild.py | 150 + .../pip/_vendor/pep517/wrappers.py | 134 + .../pip/_vendor/pkg_resources/__init__.py | 3149 +++++++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 96017 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 634 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 127 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3902 bytes .../progress/__pycache__/bar.cpython-37.pyc | Bin 0 -> 2724 bytes .../__pycache__/counter.cpython-37.pyc | Bin 0 -> 1566 bytes .../__pycache__/helpers.cpython-37.pyc | Bin 0 -> 3008 bytes .../__pycache__/spinner.cpython-37.pyc | Bin 0 -> 1483 bytes .../site-packages/pip/_vendor/progress/bar.py | 94 + .../pip/_vendor/progress/counter.py | 48 + .../pip/_vendor/progress/helpers.py | 91 + .../pip/_vendor/progress/spinner.py | 44 + .../site-packages/pip/_vendor/pyparsing.py | 5742 ++++++++++++ .../pip/_vendor/pytoml/__init__.py | 3 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 322 bytes .../pytoml/__pycache__/core.cpython-37.pyc | Bin 0 -> 931 bytes .../pytoml/__pycache__/parser.cpython-37.pyc | Bin 0 -> 11134 bytes .../pytoml/__pycache__/writer.cpython-37.pyc | Bin 0 -> 3833 bytes .../site-packages/pip/_vendor/pytoml/core.py | 13 + .../pip/_vendor/pytoml/parser.py | 374 + .../pip/_vendor/pytoml/writer.py | 127 + .../pip/_vendor/requests/__init__.py | 138 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3779 bytes .../__pycache__/__version__.cpython-37.pyc | Bin 0 -> 542 bytes .../_internal_utils.cpython-37.pyc | Bin 0 -> 1300 bytes .../__pycache__/adapters.cpython-37.pyc | Bin 0 -> 16765 bytes .../requests/__pycache__/api.cpython-37.pyc | Bin 0 -> 6491 bytes .../requests/__pycache__/auth.cpython-37.pyc | Bin 0 -> 8336 bytes .../requests/__pycache__/certs.cpython-37.pyc | Bin 0 -> 625 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 1635 bytes .../__pycache__/cookies.cpython-37.pyc | Bin 0 -> 18744 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 5497 bytes .../requests/__pycache__/help.cpython-37.pyc | Bin 0 -> 2689 bytes .../requests/__pycache__/hooks.cpython-37.pyc | Bin 0 -> 989 bytes .../__pycache__/models.cpython-37.pyc | Bin 0 -> 23956 bytes .../__pycache__/packages.cpython-37.pyc | Bin 0 -> 502 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 0 -> 18561 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 4158 bytes .../__pycache__/structures.cpython-37.pyc | Bin 0 -> 4371 bytes .../requests/__pycache__/utils.cpython-37.pyc | Bin 0 -> 21941 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 530 ++ .../site-packages/pip/_vendor/requests/api.py | 152 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 75 + .../pip/_vendor/requests/cookies.py | 546 ++ .../pip/_vendor/requests/exceptions.py | 126 + .../pip/_vendor/requests/help.py | 120 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 952 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 741 ++ .../pip/_vendor/requests/status_codes.py | 120 + .../pip/_vendor/requests/structures.py | 103 + .../pip/_vendor/requests/utils.py | 976 ++ .../Lib/site-packages/pip/_vendor/retrying.py | 267 + venv/Lib/site-packages/pip/_vendor/six.py | 891 ++ .../pip/_vendor/urllib3/__init__.py | 97 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2414 bytes .../__pycache__/_collections.cpython-37.pyc | Bin 0 -> 10738 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 10259 bytes .../__pycache__/connectionpool.cpython-37.pyc | Bin 0 -> 23793 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 10392 bytes .../urllib3/__pycache__/fields.cpython-37.pyc | Bin 0 -> 5860 bytes .../__pycache__/filepost.cpython-37.pyc | Bin 0 -> 2752 bytes .../__pycache__/poolmanager.cpython-37.pyc | Bin 0 -> 12691 bytes .../__pycache__/request.cpython-37.pyc | Bin 0 -> 5583 bytes .../__pycache__/response.cpython-37.pyc | Bin 0 -> 17409 bytes .../pip/_vendor/urllib3/_collections.py | 332 + .../pip/_vendor/urllib3/connection.py | 403 + .../pip/_vendor/urllib3/connectionpool.py | 906 ++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 191 bytes .../__pycache__/appengine.cpython-37.pyc | Bin 0 -> 8939 bytes .../__pycache__/ntlmpool.cpython-37.pyc | Bin 0 -> 3239 bytes .../__pycache__/pyopenssl.cpython-37.pyc | Bin 0 -> 14266 bytes .../securetransport.cpython-37.pyc | Bin 0 -> 17888 bytes .../contrib/__pycache__/socks.cpython-37.pyc | Bin 0 -> 4897 bytes .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 208 bytes .../__pycache__/bindings.cpython-37.pyc | Bin 0 -> 10303 bytes .../__pycache__/low_level.cpython-37.pyc | Bin 0 -> 7484 bytes .../contrib/_securetransport/bindings.py | 593 ++ .../contrib/_securetransport/low_level.py | 346 + .../pip/_vendor/urllib3/contrib/appengine.py | 305 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 112 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 457 + .../urllib3/contrib/securetransport.py | 804 ++ .../pip/_vendor/urllib3/contrib/socks.py | 192 + .../pip/_vendor/urllib3/exceptions.py | 246 + .../pip/_vendor/urllib3/fields.py | 178 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 305 bytes .../__pycache__/ordered_dict.cpython-37.pyc | Bin 0 -> 8399 bytes .../packages/__pycache__/six.cpython-37.pyc | Bin 0 -> 24393 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 202 bytes .../__pycache__/makefile.cpython-37.pyc | Bin 0 -> 1300 bytes .../urllib3/packages/backports/makefile.py | 53 + .../_vendor/urllib3/packages/ordered_dict.py | 259 + .../pip/_vendor/urllib3/packages/six.py | 868 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 546 bytes .../_implementation.cpython-37.pyc | Bin 0 -> 3305 bytes .../ssl_match_hostname/_implementation.py | 157 + .../pip/_vendor/urllib3/poolmanager.py | 449 + .../pip/_vendor/urllib3/request.py | 150 + .../pip/_vendor/urllib3/response.py | 676 ++ .../pip/_vendor/urllib3/util/__init__.py | 54 + .../util/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 983 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 3060 bytes .../util/__pycache__/queue.cpython-37.pyc | Bin 0 -> 1032 bytes .../util/__pycache__/request.cpython-37.pyc | Bin 0 -> 3213 bytes .../util/__pycache__/response.cpython-37.pyc | Bin 0 -> 1894 bytes .../util/__pycache__/retry.cpython-37.pyc | Bin 0 -> 12646 bytes .../util/__pycache__/ssl_.cpython-37.pyc | Bin 0 -> 9984 bytes .../util/__pycache__/timeout.cpython-37.pyc | Bin 0 -> 8762 bytes .../util/__pycache__/url.cpython-37.pyc | Bin 0 -> 5172 bytes .../util/__pycache__/wait.cpython-37.pyc | Bin 0 -> 3145 bytes .../pip/_vendor/urllib3/util/connection.py | 126 + .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 118 + .../pip/_vendor/urllib3/util/response.py | 81 + .../pip/_vendor/urllib3/util/retry.py | 411 + .../pip/_vendor/urllib3/util/ssl_.py | 396 + .../pip/_vendor/urllib3/util/timeout.py | 242 + .../pip/_vendor/urllib3/util/url.py | 230 + .../pip/_vendor/urllib3/util/wait.py | 153 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 9667 bytes .../__pycache__/labels.cpython-37.pyc | Bin 0 -> 4081 bytes .../__pycache__/mklabels.cpython-37.pyc | Bin 0 -> 1903 bytes .../__pycache__/tests.cpython-37.pyc | Bin 0 -> 5044 bytes .../__pycache__/x_user_defined.cpython-37.pyc | Bin 0 -> 2656 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../site-packages/pkg_resources/__init__.py | 3149 +++++++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 96066 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 629 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 192 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 20680 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 203035 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24393 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 728 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 566 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1018 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2870 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8878 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3883 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19796 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 497 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 10563 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++++++++++ .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2411 bytes .../site-packages/pkg_resources/py31compat.py | 23 + .../pluggy-0.8.0.dist-info/INSTALLER | 1 + .../pluggy-0.8.0.dist-info/LICENSE | 21 + .../pluggy-0.8.0.dist-info/METADATA | 393 + .../pluggy-0.8.0.dist-info/RECORD | 18 + .../pluggy-0.8.0.dist-info/WHEEL | 6 + .../pluggy-0.8.0.dist-info/top_level.txt | 1 + venv/Lib/site-packages/pluggy/__init__.py | 18 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 533 bytes .../__pycache__/_tracing.cpython-37.pyc | Bin 0 -> 3488 bytes .../__pycache__/_version.cpython-37.pyc | Bin 0 -> 190 bytes .../pluggy/__pycache__/callers.cpython-37.pyc | Bin 0 -> 5915 bytes .../pluggy/__pycache__/hooks.cpython-37.pyc | Bin 0 -> 11492 bytes .../pluggy/__pycache__/manager.cpython-37.pyc | Bin 0 -> 12600 bytes venv/Lib/site-packages/pluggy/_tracing.py | 83 + venv/Lib/site-packages/pluggy/_version.py | 4 + venv/Lib/site-packages/pluggy/callers.py | 208 + venv/Lib/site-packages/pluggy/hooks.py | 357 + venv/Lib/site-packages/pluggy/manager.py | 355 + .../py-1.7.0.dist-info/INSTALLER | 1 + .../site-packages/py-1.7.0.dist-info/LICENSE | 19 + .../site-packages/py-1.7.0.dist-info/METADATA | 70 + .../site-packages/py-1.7.0.dist-info/RECORD | 76 + .../site-packages/py-1.7.0.dist-info/WHEEL | 6 + .../py-1.7.0.dist-info/top_level.txt | 1 + venv/Lib/site-packages/py/__init__.py | 156 + venv/Lib/site-packages/py/__metainfo.py | 2 + .../py/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 4106 bytes .../py/__pycache__/__metainfo.cpython-37.pyc | Bin 0 -> 240 bytes .../py/__pycache__/_builtin.cpython-37.pyc | Bin 0 -> 7028 bytes .../py/__pycache__/_error.cpython-37.pyc | Bin 0 -> 2683 bytes .../py/__pycache__/_std.cpython-37.pyc | Bin 0 -> 1135 bytes .../py/__pycache__/_version.cpython-37.pyc | Bin 0 -> 182 bytes .../py/__pycache__/_xmlgen.cpython-37.pyc | Bin 0 -> 10245 bytes .../py/__pycache__/test.cpython-37.pyc | Bin 0 -> 302 bytes venv/Lib/site-packages/py/_builtin.py | 248 + venv/Lib/site-packages/py/_code/__init__.py | 1 + .../_code/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 222 bytes .../__pycache__/_assertionnew.cpython-37.pyc | Bin 0 -> 9388 bytes .../__pycache__/_assertionold.cpython-37.pyc | Bin 0 -> 16309 bytes .../__pycache__/_py2traceback.cpython-37.pyc | Bin 0 -> 2106 bytes .../__pycache__/assertion.cpython-37.pyc | Bin 0 -> 2550 bytes .../py/_code/__pycache__/code.cpython-37.pyc | Bin 0 -> 26156 bytes .../_code/__pycache__/source.cpython-37.pyc | Bin 0 -> 11865 bytes .../site-packages/py/_code/_assertionnew.py | 322 + .../site-packages/py/_code/_assertionold.py | 556 ++ .../site-packages/py/_code/_py2traceback.py | 79 + venv/Lib/site-packages/py/_code/assertion.py | 90 + venv/Lib/site-packages/py/_code/code.py | 796 ++ venv/Lib/site-packages/py/_code/source.py | 410 + venv/Lib/site-packages/py/_error.py | 91 + venv/Lib/site-packages/py/_io/__init__.py | 1 + .../_io/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 203 bytes .../py/_io/__pycache__/capture.cpython-37.pyc | Bin 0 -> 11588 bytes .../_io/__pycache__/saferepr.cpython-37.pyc | Bin 0 -> 2646 bytes .../__pycache__/terminalwriter.cpython-37.pyc | Bin 0 -> 11067 bytes venv/Lib/site-packages/py/_io/capture.py | 371 + venv/Lib/site-packages/py/_io/saferepr.py | 71 + .../site-packages/py/_io/terminalwriter.py | 421 + venv/Lib/site-packages/py/_log/__init__.py | 2 + .../_log/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 248 bytes .../py/_log/__pycache__/log.cpython-37.pyc | Bin 0 -> 7420 bytes .../_log/__pycache__/warning.cpython-37.pyc | Bin 0 -> 2253 bytes venv/Lib/site-packages/py/_log/log.py | 206 + venv/Lib/site-packages/py/_log/warning.py | 79 + venv/Lib/site-packages/py/_path/__init__.py | 1 + .../_path/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 208 bytes .../__pycache__/cacheutil.cpython-37.pyc | Bin 0 -> 4649 bytes .../_path/__pycache__/common.cpython-37.pyc | Bin 0 -> 14779 bytes .../py/_path/__pycache__/local.cpython-37.pyc | Bin 0 -> 30012 bytes .../_path/__pycache__/svnurl.cpython-37.pyc | Bin 0 -> 13355 bytes .../py/_path/__pycache__/svnwc.cpython-37.pyc | Bin 0 -> 36158 bytes venv/Lib/site-packages/py/_path/cacheutil.py | 114 + venv/Lib/site-packages/py/_path/common.py | 453 + venv/Lib/site-packages/py/_path/local.py | 994 ++ venv/Lib/site-packages/py/_path/svnurl.py | 380 + venv/Lib/site-packages/py/_path/svnwc.py | 1240 +++ .../Lib/site-packages/py/_process/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 219 bytes .../__pycache__/cmdexec.cpython-37.pyc | Bin 0 -> 1879 bytes .../__pycache__/forkedfunc.cpython-37.pyc | Bin 0 -> 3617 bytes .../__pycache__/killproc.cpython-37.pyc | Bin 0 -> 991 bytes venv/Lib/site-packages/py/_process/cmdexec.py | 49 + .../site-packages/py/_process/forkedfunc.py | 120 + .../Lib/site-packages/py/_process/killproc.py | 23 + venv/Lib/site-packages/py/_std.py | 26 + .../py/_vendored_packages/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 184 bytes .../__pycache__/apipkg.cpython-37.pyc | Bin 0 -> 5968 bytes .../__pycache__/iniconfig.cpython-37.pyc | Bin 0 -> 5191 bytes .../py/_vendored_packages/apipkg.py | 205 + .../py/_vendored_packages/iniconfig.py | 165 + venv/Lib/site-packages/py/_version.py | 4 + venv/Lib/site-packages/py/_xmlgen.py | 255 + venv/Lib/site-packages/py/test.py | 10 + .../pylint-2.1.1.dist-info/INSTALLER | 1 + .../pylint-2.1.1.dist-info/METADATA | 117 + .../pylint-2.1.1.dist-info/RECORD | 1565 ++++ .../pylint-2.1.1.dist-info/WHEEL | 5 + .../pylint-2.1.1.dist-info/entry_points.txt | 6 + .../pylint-2.1.1.dist-info/top_level.txt | 1 + venv/Lib/site-packages/pylint/__init__.py | 36 + venv/Lib/site-packages/pylint/__main__.py | 7 + venv/Lib/site-packages/pylint/__pkginfo__.py | 91 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1080 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 213 bytes .../__pycache__/__pkginfo__.cpython-37.pyc | Bin 0 -> 2728 bytes .../pylint/__pycache__/config.cpython-37.pyc | Bin 0 -> 25874 bytes .../pylint/__pycache__/epylint.cpython-37.pyc | Bin 0 -> 4967 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 1132 bytes .../pylint/__pycache__/graph.cpython-37.pyc | Bin 0 -> 5197 bytes .../__pycache__/interfaces.cpython-37.pyc | Bin 0 -> 3670 bytes .../pylint/__pycache__/lint.cpython-37.pyc | Bin 0 -> 41549 bytes .../__pycache__/testutils.cpython-37.pyc | Bin 0 -> 9641 bytes .../pylint/__pycache__/utils.cpython-37.pyc | Bin 0 -> 39917 bytes .../site-packages/pylint/checkers/__init__.py | 124 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3532 bytes .../checkers/__pycache__/async.cpython-37.pyc | Bin 0 -> 2541 bytes .../checkers/__pycache__/base.cpython-37.pyc | Bin 0 -> 59015 bytes .../__pycache__/classes.cpython-37.pyc | Bin 0 -> 41700 bytes .../design_analysis.cpython-37.pyc | Bin 0 -> 10888 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 14022 bytes .../__pycache__/format.cpython-37.pyc | Bin 0 -> 31574 bytes .../__pycache__/imports.cpython-37.pyc | Bin 0 -> 23814 bytes .../__pycache__/logging.cpython-37.pyc | Bin 0 -> 10227 bytes .../checkers/__pycache__/misc.cpython-37.pyc | Bin 0 -> 5051 bytes .../__pycache__/newstyle.cpython-37.pyc | Bin 0 -> 4547 bytes .../__pycache__/python3.cpython-37.pyc | Bin 0 -> 34926 bytes .../__pycache__/raw_metrics.cpython-37.pyc | Bin 0 -> 3363 bytes .../__pycache__/refactoring.cpython-37.pyc | Bin 0 -> 40886 bytes .../__pycache__/similar.cpython-37.pyc | Bin 0 -> 11297 bytes .../__pycache__/spelling.cpython-37.pyc | Bin 0 -> 9552 bytes .../__pycache__/stdlib.cpython-37.pyc | Bin 0 -> 11389 bytes .../__pycache__/strings.cpython-37.pyc | Bin 0 -> 15788 bytes .../__pycache__/typecheck.cpython-37.pyc | Bin 0 -> 36828 bytes .../checkers/__pycache__/utils.cpython-37.pyc | Bin 0 -> 27106 bytes .../__pycache__/variables.cpython-37.pyc | Bin 0 -> 42064 bytes .../site-packages/pylint/checkers/async.py | 76 + .../Lib/site-packages/pylint/checkers/base.py | 1946 ++++ .../site-packages/pylint/checkers/classes.py | 1547 ++++ .../pylint/checkers/design_analysis.py | 368 + .../pylint/checkers/exceptions.py | 454 + .../site-packages/pylint/checkers/format.py | 1148 +++ .../site-packages/pylint/checkers/imports.py | 834 ++ .../site-packages/pylint/checkers/logging.py | 311 + .../Lib/site-packages/pylint/checkers/misc.py | 163 + .../site-packages/pylint/checkers/newstyle.py | 186 + .../site-packages/pylint/checkers/python3.py | 1055 +++ .../pylint/checkers/raw_metrics.py | 120 + .../pylint/checkers/refactoring.py | 1257 +++ .../site-packages/pylint/checkers/similar.py | 370 + .../site-packages/pylint/checkers/spelling.py | 351 + .../site-packages/pylint/checkers/stdlib.py | 403 + .../site-packages/pylint/checkers/strings.py | 636 ++ .../pylint/checkers/typecheck.py | 1458 +++ .../site-packages/pylint/checkers/utils.py | 1011 ++ .../pylint/checkers/variables.py | 1605 ++++ venv/Lib/site-packages/pylint/config.py | 862 ++ venv/Lib/site-packages/pylint/epylint.py | 180 + venv/Lib/site-packages/pylint/exceptions.py | 22 + .../pylint/extensions/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 184 bytes .../_check_docs_utils.cpython-37.pyc | Bin 0 -> 18696 bytes .../__pycache__/bad_builtin.cpython-37.pyc | Bin 0 -> 2046 bytes .../__pycache__/check_docs.cpython-37.pyc | Bin 0 -> 686 bytes .../__pycache__/check_elif.cpython-37.pyc | Bin 0 -> 2595 bytes .../__pycache__/comparetozero.cpython-37.pyc | Bin 0 -> 1990 bytes .../__pycache__/docparams.cpython-37.pyc | Bin 0 -> 14356 bytes .../__pycache__/docstyle.cpython-37.pyc | Bin 0 -> 2494 bytes .../__pycache__/emptystring.cpython-37.pyc | Bin 0 -> 2048 bytes .../__pycache__/mccabe.cpython-37.pyc | Bin 0 -> 5620 bytes .../overlapping_exceptions.cpython-37.pyc | Bin 0 -> 2619 bytes .../redefined_variable_type.cpython-37.pyc | Bin 0 -> 3243 bytes .../pylint/extensions/_check_docs_utils.py | 737 ++ .../pylint/extensions/bad_builtin.py | 67 + .../pylint/extensions/check_docs.py | 21 + .../pylint/extensions/check_elif.py | 71 + .../pylint/extensions/comparetozero.py | 72 + .../pylint/extensions/docparams.py | 469 + .../pylint/extensions/docstyle.py | 77 + .../pylint/extensions/emptystring.py | 72 + .../site-packages/pylint/extensions/mccabe.py | 172 + .../extensions/overlapping_exceptions.py | 81 + .../extensions/redefined_variable_type.py | 106 + venv/Lib/site-packages/pylint/graph.py | 172 + venv/Lib/site-packages/pylint/interfaces.py | 100 + venv/Lib/site-packages/pylint/lint.py | 1464 +++ .../pylint/pyreverse/__init__.py | 9 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 244 bytes .../__pycache__/diadefslib.cpython-37.pyc | Bin 0 -> 7615 bytes .../__pycache__/diagrams.cpython-37.pyc | Bin 0 -> 8709 bytes .../__pycache__/inspector.cpython-37.pyc | Bin 0 -> 10291 bytes .../pyreverse/__pycache__/main.cpython-37.pyc | Bin 0 -> 4466 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 5821 bytes .../__pycache__/vcgutils.cpython-37.pyc | Bin 0 -> 4698 bytes .../__pycache__/writer.cpython-37.pyc | Bin 0 -> 7071 bytes .../pylint/pyreverse/diadefslib.py | 235 + .../pylint/pyreverse/diagrams.py | 253 + .../pylint/pyreverse/inspector.py | 365 + .../site-packages/pylint/pyreverse/main.py | 139 + .../site-packages/pylint/pyreverse/utils.py | 207 + .../pylint/pyreverse/vcgutils.py | 186 + .../site-packages/pylint/pyreverse/writer.py | 194 + .../pylint/reporters/__init__.py | 121 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 4124 bytes .../reporters/__pycache__/json.cpython-37.pyc | Bin 0 -> 2057 bytes .../reporters/__pycache__/text.cpython-37.pyc | Bin 0 -> 7317 bytes .../site-packages/pylint/reporters/json.py | 60 + .../site-packages/pylint/reporters/text.py | 241 + .../pylint/reporters/ureports/__init__.py | 97 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3068 bytes .../ureports/__pycache__/nodes.cpython-37.pyc | Bin 0 -> 6067 bytes .../__pycache__/text_writer.cpython-37.pyc | Bin 0 -> 3725 bytes .../pylint/reporters/ureports/nodes.py | 185 + .../pylint/reporters/ureports/text_writer.py | 95 + .../pylint/test/__pycache__/a.cpython-37.pyc | Bin 0 -> 209 bytes .../test/__pycache__/conftest.cpython-37.pyc | Bin 0 -> 1317 bytes .../test/__pycache__/test_func.cpython-37.pyc | Bin 0 -> 4426 bytes .../test_functional.cpython-37.pyc | Bin 0 -> 12985 bytes .../test_import_graph.cpython-37.pyc | Bin 0 -> 1997 bytes .../test/__pycache__/test_regr.cpython-37.pyc | Bin 0 -> 4209 bytes .../test/__pycache__/test_self.cpython-37.pyc | Bin 0 -> 19303 bytes .../unittest_checker_base.cpython-37.pyc | Bin 0 -> 14541 bytes .../unittest_checker_classes.cpython-37.pyc | Bin 0 -> 2869 bytes ...unittest_checker_exceptions.cpython-37.pyc | Bin 0 -> 1512 bytes .../unittest_checker_format.cpython-37.pyc | Bin 0 -> 12651 bytes .../unittest_checker_imports.cpython-37.pyc | Bin 0 -> 4035 bytes .../unittest_checker_logging.cpython-37.pyc | Bin 0 -> 2409 bytes .../unittest_checker_misc.cpython-37.pyc | Bin 0 -> 2957 bytes .../unittest_checker_python3.cpython-37.pyc | Bin 0 -> 41367 bytes .../unittest_checker_similar.cpython-37.pyc | Bin 0 -> 3120 bytes .../unittest_checker_spelling.cpython-37.pyc | Bin 0 -> 7972 bytes .../unittest_checker_stdlib.cpython-37.pyc | Bin 0 -> 3254 bytes .../unittest_checker_strings.cpython-37.pyc | Bin 0 -> 809 bytes .../unittest_checker_typecheck.cpython-37.pyc | Bin 0 -> 9347 bytes .../unittest_checker_variables.cpython-37.pyc | Bin 0 -> 8825 bytes .../unittest_checkers_utils.cpython-37.pyc | Bin 0 -> 2734 bytes .../unittest_config.cpython-37.pyc | Bin 0 -> 2057 bytes .../__pycache__/unittest_lint.cpython-37.pyc | Bin 0 -> 24229 bytes .../unittest_pyreverse_diadefs.cpython-37.pyc | Bin 0 -> 5665 bytes ...nittest_pyreverse_inspector.cpython-37.pyc | Bin 0 -> 4244 bytes .../unittest_pyreverse_writer.cpython-37.pyc | Bin 0 -> 3861 bytes .../unittest_reporters_json.cpython-37.pyc | Bin 0 -> 1355 bytes .../unittest_reporting.cpython-37.pyc | Bin 0 -> 2659 bytes .../__pycache__/unittest_utils.cpython-37.pyc | Bin 0 -> 14272 bytes venv/Lib/site-packages/pylint/test/a.py | 1 + .../__pycache__/test_stdlib.cpython-37.pyc | Bin 0 -> 1667 bytes .../pylint/test/acceptance/test_stdlib.py | 51 + .../Lib/site-packages/pylint/test/conftest.py | 52 + .../pylint/test/data/__init__.py | 0 .../data/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 183 bytes .../clientmodule_test.cpython-37.pyc | Bin 0 -> 1457 bytes .../suppliermodule_test.cpython-37.pyc | Bin 0 -> 783 bytes .../site-packages/pylint/test/data/ascript | 2 + .../pylint/test/data/classes_No_Name.dot | 12 + .../pylint/test/data/clientmodule_test.py | 29 + .../pylint/test/data/packages_No_Name.dot | 8 + .../pylint/test/data/suppliermodule_test.py | 10 + .../pylint/test/extensions/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 189 bytes .../test_bad_builtin.cpython-37.pyc | Bin 0 -> 1488 bytes .../test_check_docs.cpython-37.pyc | Bin 0 -> 63297 bytes .../test_check_docs_utils.cpython-37.pyc | Bin 0 -> 2590 bytes .../test_check_mccabe.cpython-37.pyc | Bin 0 -> 2243 bytes .../test_check_raise_docs.cpython-37.pyc | Bin 0 -> 16675 bytes .../test_check_return_docs.cpython-37.pyc | Bin 0 -> 20770 bytes .../test_check_yields_docs.cpython-37.pyc | Bin 0 -> 13773 bytes .../test_comparetozero.cpython-37.pyc | Bin 0 -> 2244 bytes .../__pycache__/test_docstyle.cpython-37.pyc | Bin 0 -> 1425 bytes .../test_elseif_used.cpython-37.pyc | Bin 0 -> 1039 bytes .../test_emptystring.cpython-37.pyc | Bin 0 -> 1223 bytes ...test_overlapping_exceptions.cpython-37.pyc | Bin 0 -> 2911 bytes .../__pycache__/test_redefined.cpython-37.pyc | Bin 0 -> 1813 bytes .../__pycache__/bad_builtin.cpython-37.pyc | Bin 0 -> 264 bytes .../compare_to_zero.cpython-37.pyc | Bin 0 -> 321 bytes .../data/__pycache__/docstring.cpython-37.pyc | Bin 0 -> 1754 bytes .../data/__pycache__/elif.cpython-37.pyc | Bin 0 -> 502 bytes .../empty_string_comparison.cpython-37.pyc | Bin 0 -> 272 bytes .../data/__pycache__/mccabe.cpython-37.pyc | Bin 0 -> 3444 bytes .../overlapping_exceptions.cpython-37.pyc | Bin 0 -> 872 bytes ...overlapping_exceptions_py33.cpython-37.pyc | Bin 0 -> 391 bytes .../data/__pycache__/redefined.cpython-37.pyc | Bin 0 -> 2183 bytes .../test/extensions/data/bad_builtin.py | 4 + .../test/extensions/data/compare_to_zero.py | 28 + .../pylint/test/extensions/data/docstring.py | 48 + .../pylint/test/extensions/data/elif.py | 26 + .../data/empty_string_comparison.py | 16 + .../pylint/test/extensions/data/mccabe.py | 205 + .../extensions/data/overlapping_exceptions.py | 45 + .../data/overlapping_exceptions_py33.py | 18 + .../pylint/test/extensions/data/redefined.py | 85 + .../test/extensions/test_bad_builtin.py | 43 + .../pylint/test/extensions/test_check_docs.py | 2192 +++++ .../test/extensions/test_check_docs_utils.py | 112 + .../test/extensions/test_check_mccabe.py | 63 + .../test/extensions/test_check_raise_docs.py | 530 ++ .../test/extensions/test_check_return_docs.py | 600 ++ .../test/extensions/test_check_yields_docs.py | 397 + .../test/extensions/test_comparetozero.py | 59 + .../pylint/test/extensions/test_docstyle.py | 54 + .../test/extensions/test_elseif_used.py | 33 + .../test/extensions/test_emptystring.py | 39 + .../extensions/test_overlapping_exceptions.py | 69 + .../pylint/test/extensions/test_redefined.py | 50 + .../pylint/test/functional/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 189 bytes .../abstract_abc_methods.cpython-37.pyc | Bin 0 -> 970 bytes ...class_instantiated_in_class.cpython-37.pyc | Bin 0 -> 789 bytes ...ract_class_instantiated_py2.cpython-37.pyc | Bin 0 -> 3108 bytes ...ract_class_instantiated_py3.cpython-37.pyc | Bin 0 -> 5213 bytes ...act_class_instantiated_py34.cpython-37.pyc | Bin 0 -> 758 bytes .../abstract_method_py2.cpython-37.pyc | Bin 0 -> 3676 bytes .../abstract_method_py3.cpython-37.pyc | Bin 0 -> 3672 bytes ...ss_member_before_definition.cpython-37.pyc | Bin 0 -> 1452 bytes .../access_to__name__.cpython-37.pyc | Bin 0 -> 1165 bytes ...access_to_protected_members.cpython-37.pyc | Bin 0 -> 2296 bytes ...nomalous_unicode_escape_py3.cpython-37.pyc | Bin 0 -> 510 bytes .../__pycache__/arguments.cpython-37.pyc | Bin 0 -> 6379 bytes .../arguments_differ.cpython-37.pyc | Bin 0 -> 9084 bytes .../arguments_differ_py3.cpython-37.pyc | Bin 0 -> 2113 bytes .../assert_on_tuple.cpython-37.pyc | Bin 0 -> 447 bytes .../assigning_non_slot.cpython-37.pyc | Bin 0 -> 6088 bytes .../assignment_from_no_return.cpython-37.pyc | Bin 0 -> 739 bytes ...ribute_defined_outside_init.cpython-37.pyc | Bin 0 -> 2586 bytes .../bad_continuation.cpython-37.pyc | Bin 0 -> 2187 bytes .../bad_continuation_py36.cpython-37.pyc | Bin 0 -> 421 bytes .../bad_continuation_tabs.cpython-37.pyc | Bin 0 -> 1195 bytes .../bad_exception_context.cpython-37.pyc | Bin 0 -> 804 bytes .../bad_indentation.cpython-37.pyc | Bin 0 -> 748 bytes .../bad_inline_option.cpython-37.pyc | Bin 0 -> 306 bytes .../__pycache__/bad_open_mode.cpython-37.pyc | Bin 0 -> 915 bytes .../bad_open_mode_py3.cpython-37.pyc | Bin 0 -> 618 bytes .../bad_reversed_sequence.cpython-37.pyc | Bin 0 -> 3286 bytes .../bad_staticmethod_argument.cpython-37.pyc | Bin 0 -> 720 bytes .../bad_thread_instantiation.cpython-37.pyc | Bin 0 -> 554 bytes .../__pycache__/bad_whitespace.cpython-37.pyc | Bin 0 -> 372 bytes .../__pycache__/bare_except.cpython-37.pyc | Bin 0 -> 232 bytes .../blacklisted_name.cpython-37.pyc | Bin 0 -> 286 bytes .../boolean_datetime.cpython-37.pyc | Bin 0 -> 897 bytes .../__pycache__/broad_except.cpython-37.pyc | Bin 0 -> 342 bytes ..._local_scope_metaclass_1177.cpython-37.pyc | Bin 0 -> 2525 bytes .../cellvar_escaping_loop.cpython-37.pyc | Bin 0 -> 5403 bytes .../class_members_py30.cpython-37.pyc | Bin 0 -> 2982 bytes .../__pycache__/class_scope.cpython-37.pyc | Bin 0 -> 1286 bytes .../comparison_with_callable.cpython-37.pyc | Bin 0 -> 1317 bytes .../confidence_filter.cpython-37.pyc | Bin 0 -> 870 bytes .../confusing_with_statement.cpython-37.pyc | Bin 0 -> 456 bytes ...nsider_iterating_dictionary.cpython-37.pyc | Bin 0 -> 2471 bytes .../__pycache__/consider_join.cpython-37.pyc | Bin 0 -> 1467 bytes ...consider_merging_isinstance.cpython-37.pyc | Bin 0 -> 1118 bytes .../consider_swap_variables.cpython-37.pyc | Bin 0 -> 361 bytes ...er_using_dict_comprehension.cpython-37.pyc | Bin 0 -> 429 bytes .../consider_using_enumerate.cpython-37.pyc | Bin 0 -> 1325 bytes .../consider_using_get.cpython-37.pyc | Bin 0 -> 975 bytes .../consider_using_in.cpython-37.pyc | Bin 0 -> 1198 bytes ...der_using_set_comprehension.cpython-37.pyc | Bin 0 -> 417 bytes .../crash_missing_module_type.cpython-37.pyc | Bin 0 -> 807 bytes .../__pycache__/ctor_arguments.cpython-37.pyc | Bin 0 -> 4116 bytes .../dangerous_default_value.cpython-37.pyc | Bin 0 -> 2808 bytes ...angerous_default_value_py30.cpython-37.pyc | Bin 0 -> 2813 bytes ...fined_and_used_on_same_line.cpython-37.pyc | Bin 0 -> 1330 bytes .../deprecated_lambda.cpython-37.pyc | Bin 0 -> 1092 bytes ...ecated_method_getmoduleinfo.cpython-37.pyc | Bin 0 -> 313 bytes .../deprecated_methods_py2.cpython-37.pyc | Bin 0 -> 454 bytes .../deprecated_methods_py3.cpython-37.pyc | Bin 0 -> 1366 bytes .../deprecated_methods_py36.cpython-37.pyc | Bin 0 -> 438 bytes .../deprecated_module_py2.cpython-37.pyc | Bin 0 -> 351 bytes .../deprecated_module_py3.cpython-37.pyc | Bin 0 -> 263 bytes .../deprecated_module_py36.cpython-37.pyc | Bin 0 -> 280 bytes .../deprecated_module_py4.cpython-37.pyc | Bin 0 -> 291 bytes ...precated_module_uninstalled.cpython-37.pyc | Bin 0 -> 327 bytes ...sable_msg_github_issue_1389.cpython-37.pyc | Bin 0 -> 742 bytes .../disable_ungrouped_imports.cpython-37.pyc | Bin 0 -> 488 bytes .../disable_wrong_import_order.cpython-37.pyc | Bin 0 -> 598 bytes ...sable_wrong_import_position.cpython-37.pyc | Bin 0 -> 369 bytes .../__pycache__/docstrings.cpython-37.pyc | Bin 0 -> 2476 bytes .../duplicate_bases.cpython-37.pyc | Bin 0 -> 778 bytes .../duplicate_dict_literal_key.cpython-37.pyc | Bin 0 -> 430 bytes .../duplicate_except.cpython-37.pyc | Bin 0 -> 509 bytes .../__pycache__/eval_used.cpython-37.pyc | Bin 0 -> 434 bytes .../exception_is_binary_op.cpython-37.pyc | Bin 0 -> 553 bytes .../exception_message.cpython-37.pyc | Bin 0 -> 1403 bytes .../__pycache__/exec_used_py3.cpython-37.pyc | Bin 0 -> 388 bytes .../fallback_import_disabled.cpython-37.pyc | Bin 0 -> 450 bytes .../fallback_import_enabled.cpython-37.pyc | Bin 0 -> 321 bytes .../__pycache__/fixme.cpython-37.pyc | Bin 0 -> 344 bytes .../fixme_bad_formatting_1139.cpython-37.pyc | Bin 0 -> 378 bytes ...string_literal_with_if_py36.cpython-37.pyc | Bin 0 -> 313 bytes .../function_redefined.cpython-37.pyc | Bin 0 -> 3607 bytes .../__pycache__/future_import.cpython-37.pyc | Bin 0 -> 267 bytes .../future_unicode_literals.cpython-37.pyc | Bin 0 -> 358 bytes .../generated_members.cpython-37.pyc | Bin 0 -> 784 bytes .../genexp_in_class_scope.cpython-37.pyc | Bin 0 -> 594 bytes .../genexpr_variable_scope.cpython-37.pyc | Bin 0 -> 375 bytes .../__pycache__/globals.cpython-37.pyc | Bin 0 -> 1002 bytes .../__pycache__/import_error.cpython-37.pyc | Bin 0 -> 617 bytes .../inconsistent_mro.cpython-37.pyc | Bin 0 -> 527 bytes .../inconsistent_returns.cpython-37.pyc | Bin 0 -> 6970 bytes .../indexing_exception.cpython-37.pyc | Bin 0 -> 601 bytes .../inherit_non_class.cpython-37.pyc | Bin 0 -> 3527 bytes .../init_is_generator.cpython-37.pyc | Bin 0 -> 476 bytes .../init_not_called.cpython-37.pyc | Bin 0 -> 3268 bytes ...t_subclass_classmethod_py36.cpython-37.pyc | Bin 0 -> 872 bytes .../invalid_all_object.cpython-37.pyc | Bin 0 -> 310 bytes .../invalid_encoding_py27.cpython-37.pyc | Bin 0 -> 303 bytes .../invalid_envvar_value.cpython-37.pyc | Bin 0 -> 1720 bytes .../invalid_exceptions_caught.cpython-37.pyc | Bin 0 -> 2918 bytes .../invalid_exceptions_raised.cpython-37.pyc | Bin 0 -> 3257 bytes .../invalid_length_returned.cpython-37.pyc | Bin 0 -> 3068 bytes .../invalid_metaclass.cpython-37.pyc | Bin 0 -> 1192 bytes .../invalid_metaclass_py3.cpython-37.pyc | Bin 0 -> 813 bytes .../__pycache__/invalid_name.cpython-37.pyc | Bin 0 -> 1058 bytes .../invalid_sequence_index.cpython-37.pyc | Bin 0 -> 10046 bytes .../invalid_slice_index.cpython-37.pyc | Bin 0 -> 3226 bytes .../invalid_unary_operand_type.cpython-37.pyc | Bin 0 -> 1966 bytes .../iterable_context.cpython-37.pyc | Bin 0 -> 5158 bytes .../iterable_context_py3.cpython-37.pyc | Bin 0 -> 774 bytes .../iterable_context_py36.cpython-37.pyc | Bin 0 -> 1027 bytes .../keyword_arg_before_vararg.cpython-37.pyc | Bin 0 -> 1393 bytes .../__pycache__/len_checks.cpython-37.pyc | Bin 0 -> 1408 bytes .../__pycache__/line_endings.cpython-37.pyc | Bin 0 -> 258 bytes .../__pycache__/line_too_long.cpython-37.pyc | Bin 0 -> 1659 bytes ...line_too_long_end_of_module.cpython-37.pyc | Bin 0 -> 442 bytes .../literal_comparison.cpython-37.pyc | Bin 0 -> 451 bytes ...ogging_format_interpolation.cpython-37.pyc | Bin 0 -> 793 bytes ...g_format_interpolation_py36.cpython-37.pyc | Bin 0 -> 363 bytes ..._fstring_interpolation_py36.cpython-37.pyc | Bin 0 -> 643 bytes .../logging_not_lazy.cpython-37.pyc | Bin 0 -> 611 bytes .../logical_tautology.cpython-37.pyc | Bin 0 -> 827 bytes .../long_lines_with_utf8.cpython-37.pyc | Bin 0 -> 384 bytes .../long_utf8_lines.cpython-37.pyc | Bin 0 -> 489 bytes .../__pycache__/lost_exception.cpython-37.pyc | Bin 0 -> 844 bytes .../mapping_context.cpython-37.pyc | Bin 0 -> 4225 bytes .../mapping_context_py2.cpython-37.pyc | Bin 0 -> 952 bytes .../mapping_context_py3.cpython-37.pyc | Bin 0 -> 934 bytes .../__pycache__/member_checks.cpython-37.pyc | Bin 0 -> 6868 bytes .../member_checks_hints.cpython-37.pyc | Bin 0 -> 1034 bytes .../member_checks_ignore_none.cpython-37.pyc | Bin 0 -> 332 bytes .../member_checks_no_hints.cpython-37.pyc | Bin 0 -> 1037 bytes .../member_checks_opaque.cpython-37.pyc | Bin 0 -> 396 bytes .../member_checks_py37.cpython-37.pyc | Bin 0 -> 258 bytes .../membership_protocol.cpython-37.pyc | Bin 0 -> 4016 bytes .../membership_protocol_py2.cpython-37.pyc | Bin 0 -> 1751 bytes .../membership_protocol_py3.cpython-37.pyc | Bin 0 -> 1710 bytes .../messages_managed_by_id.cpython-37.pyc | Bin 0 -> 505 bytes .../__pycache__/method_hidden.cpython-37.pyc | Bin 0 -> 1794 bytes .../misplaced_bare_raise.cpython-37.pyc | Bin 0 -> 1832 bytes ...splaced_comparison_constant.cpython-37.pyc | Bin 0 -> 1240 bytes .../misplaced_format_function.cpython-37.pyc | Bin 0 -> 2111 bytes .../missing_docstring.cpython-37.pyc | Bin 0 -> 1909 bytes .../missing_final_newline.cpython-37.pyc | Bin 0 -> 330 bytes .../missing_kwoa_py3.cpython-37.pyc | Bin 0 -> 1147 bytes .../missing_self_argument.cpython-37.pyc | Bin 0 -> 1064 bytes .../mixed_indentation.cpython-37.pyc | Bin 0 -> 522 bytes .../monkeypatch_method.cpython-37.pyc | Bin 0 -> 791 bytes .../multiple_imports.cpython-37.pyc | Bin 0 -> 227 bytes .../namePresetCamelCase.cpython-37.pyc | Bin 0 -> 1208 bytes .../name_preset_snake_case.cpython-37.pyc | Bin 0 -> 1221 bytes .../__pycache__/name_styles.cpython-37.pyc | Bin 0 -> 5415 bytes ...namedtuple_member_inference.cpython-37.pyc | Bin 0 -> 812 bytes .../names_in__all__.cpython-37.pyc | Bin 0 -> 1542 bytes .../nested_blocks_issue1088.cpython-37.pyc | Bin 0 -> 619 bytes .../newstyle__slots__.cpython-37.pyc | Bin 0 -> 773 bytes .../newstyle_properties.cpython-37.pyc | Bin 0 -> 2092 bytes .../no_classmethod_decorator.cpython-37.pyc | Bin 0 -> 1483 bytes .../__pycache__/no_else_return.cpython-37.pyc | Bin 0 -> 1348 bytes .../no_name_in_module.cpython-37.pyc | Bin 0 -> 1383 bytes .../__pycache__/no_self_use.cpython-37.pyc | Bin 0 -> 3398 bytes .../no_self_use_py3.cpython-37.pyc | Bin 0 -> 871 bytes .../no_staticmethod_decorator.cpython-37.pyc | Bin 0 -> 1485 bytes .../non_iterator_returned.cpython-37.pyc | Bin 0 -> 4523 bytes .../none_dunder_protocols_py36.cpython-37.pyc | Bin 0 -> 1336 bytes .../nonexistent_operator.cpython-37.pyc | Bin 0 -> 364 bytes .../not_async_context_manager.cpython-37.pyc | Bin 0 -> 3324 bytes .../__pycache__/not_callable.cpython-37.pyc | Bin 0 -> 4159 bytes .../not_context_manager.cpython-37.pyc | Bin 0 -> 3412 bytes .../old_style_class_py27.cpython-37.pyc | Bin 0 -> 1019 bytes ...tponed_evaluation_activated.cpython-37.pyc | Bin 0 -> 847 bytes ...ed_evaluation_not_activated.cpython-37.pyc | Bin 0 -> 807 bytes ...ess_access_different_scopes.cpython-37.pyc | Bin 0 -> 729 bytes .../raising_format_tuple.cpython-37.pyc | Bin 0 -> 2435 bytes .../raising_non_exception_py3.cpython-37.pyc | Bin 0 -> 653 bytes .../__pycache__/raising_self.cpython-37.pyc | Bin 0 -> 639 bytes .../recursion_error_940.cpython-37.pyc | Bin 0 -> 785 bytes ...defined_argument_from_local.cpython-37.pyc | Bin 0 -> 1780 bytes .../redefined_builtin.cpython-37.pyc | Bin 0 -> 469 bytes .../redundant_unittest_assert.cpython-37.pyc | Bin 0 -> 1407 bytes ...sion_1326_crash_uninferable.cpython-37.pyc | Bin 0 -> 448 bytes ...sion_no_value_for_parameter.cpython-37.pyc | Bin 0 -> 715 bytes .../__pycache__/reimported.cpython-37.pyc | Bin 0 -> 468 bytes .../repeated_keyword.cpython-37.pyc | Bin 0 -> 522 bytes .../__pycache__/return_in_init.cpython-37.pyc | Bin 0 -> 1397 bytes .../reused_outer_loop_variable.cpython-37.pyc | Bin 0 -> 789 bytes ...sed_outer_loop_variable_py3.cpython-37.pyc | Bin 0 -> 375 bytes .../self_cls_assignment.cpython-37.pyc | Bin 0 -> 1850 bytes .../signature_differs.cpython-37.pyc | Bin 0 -> 1103 bytes .../simplifiable_if_statement.cpython-37.pyc | Bin 0 -> 2365 bytes ...simplify_chained_comparison.cpython-37.pyc | Bin 0 -> 1501 bytes .../singledispatch_functions.cpython-37.pyc | Bin 0 -> 2127 bytes ...ingledispatch_functions_py3.cpython-37.pyc | Bin 0 -> 2131 bytes .../singleton_comparison.cpython-37.pyc | Bin 0 -> 385 bytes .../__pycache__/slots_checks.cpython-37.pyc | Bin 0 -> 4100 bytes .../socketerror_import.cpython-37.pyc | Bin 0 -> 430 bytes .../statement_without_effect.cpython-37.pyc | Bin 0 -> 1376 bytes ...atement_without_effect_py36.cpython-37.pyc | Bin 0 -> 723 bytes ..._iteration_inside_generator.cpython-37.pyc | Bin 0 -> 3409 bytes .../string_formatting.cpython-37.pyc | Bin 0 -> 6884 bytes .../string_formatting_disable.cpython-37.pyc | Bin 0 -> 234 bytes ...formatting_failed_inference.cpython-37.pyc | Bin 0 -> 391 bytes .../string_formatting_py27.cpython-37.pyc | Bin 0 -> 703 bytes .../string_formatting_py3.cpython-37.pyc | Bin 0 -> 899 bytes ...subprocess_popen_preexec_fn.cpython-37.pyc | Bin 0 -> 369 bytes .../__pycache__/super_checks.cpython-37.pyc | Bin 0 -> 6208 bytes .../superfluous_parens.cpython-37.pyc | Bin 0 -> 497 bytes .../suspicious_str_strip_call.cpython-37.pyc | Bin 0 -> 371 bytes ...spicious_str_strip_call_py3.cpython-37.pyc | Bin 0 -> 375 bytes .../sys_stream_regression_1004.cpython-37.pyc | Bin 0 -> 388 bytes .../__pycache__/ternary.cpython-37.pyc | Bin 0 -> 1374 bytes .../__pycache__/test_compile.cpython-37.pyc | Bin 0 -> 522 bytes .../__pycache__/tokenize_error.cpython-37.pyc | Bin 0 -> 370 bytes .../tokenize_error_jython.cpython-37.pyc | Bin 0 -> 377 bytes .../too_few_public_methods.cpython-37.pyc | Bin 0 -> 2190 bytes .../too_few_public_methods_37.cpython-37.pyc | Bin 0 -> 623 bytes .../too_many_ancestors.cpython-37.pyc | Bin 0 -> 1517 bytes .../too_many_arguments.cpython-37.pyc | Bin 0 -> 819 bytes ...o_many_arguments_issue_1045.cpython-37.pyc | Bin 0 -> 368 bytes ...oo_many_boolean_expressions.cpython-37.pyc | Bin 0 -> 540 bytes .../too_many_branches.cpython-37.pyc | Bin 0 -> 726 bytes ...oo_many_instance_attributes.cpython-37.pyc | Bin 0 -> 822 bytes .../__pycache__/too_many_lines.cpython-37.pyc | Bin 0 -> 269 bytes .../too_many_lines_disabled.cpython-37.pyc | Bin 0 -> 348 bytes .../too_many_locals.cpython-37.pyc | Bin 0 -> 1827 bytes .../too_many_nested_blocks.cpython-37.pyc | Bin 0 -> 1593 bytes .../too_many_public_methods.cpython-37.pyc | Bin 0 -> 3333 bytes .../too_many_return_statements.cpython-37.pyc | Bin 0 -> 864 bytes .../too_many_statements.cpython-37.pyc | Bin 0 -> 1907 bytes .../trailing_comma_tuple.cpython-37.pyc | Bin 0 -> 834 bytes .../trailing_newlines.cpython-37.pyc | Bin 0 -> 256 bytes .../trailing_whitespaces.cpython-37.pyc | Bin 0 -> 519 bytes .../unbalanced_tuple_unpacking.cpython-37.pyc | Bin 0 -> 3580 bytes ...lanced_tuple_unpacking_py30.cpython-37.pyc | Bin 0 -> 573 bytes .../undefined_loop_variable.cpython-37.pyc | Bin 0 -> 1723 bytes .../undefined_variable.cpython-37.pyc | Bin 0 -> 9097 bytes .../undefined_variable_py30.cpython-37.pyc | Bin 0 -> 4111 bytes ...ed_special_method_signature.cpython-37.pyc | Bin 0 -> 6161 bytes .../ungrouped_imports.cpython-37.pyc | Bin 0 -> 584 bytes .../unhashable_dict_key.cpython-37.pyc | Bin 0 -> 476 bytes .../unidiomatic_typecheck.cpython-37.pyc | Bin 0 -> 2473 bytes .../uninferable_all_object.cpython-37.pyc | Bin 0 -> 384 bytes .../unnecessary_lambda.cpython-37.pyc | Bin 0 -> 3213 bytes .../unnecessary_pass.cpython-37.pyc | Bin 0 -> 261 bytes .../__pycache__/unneeded_not.cpython-37.pyc | Bin 0 -> 1235 bytes .../__pycache__/unpacking.cpython-37.pyc | Bin 0 -> 561 bytes .../unpacking_generalizations.cpython-37.pyc | Bin 0 -> 1102 bytes .../unpacking_non_sequence.cpython-37.pyc | Bin 0 -> 4919 bytes .../__pycache__/unreachable.cpython-37.pyc | Bin 0 -> 766 bytes .../unrecognized_inline_option.cpython-37.pyc | Bin 0 -> 239 bytes .../unsubscriptable_value.cpython-37.pyc | Bin 0 -> 4072 bytes ...ported_assignment_operation.cpython-37.pyc | Bin 0 -> 2682 bytes ...nsupported_binary_operation.cpython-37.pyc | Bin 0 -> 2677 bytes ...nsupported_delete_operation.cpython-37.pyc | Bin 0 -> 2568 bytes .../unused_argument.cpython-37.pyc | Bin 0 -> 2129 bytes .../unused_argument_py3.cpython-37.pyc | Bin 0 -> 302 bytes .../unused_global_variable1.cpython-37.pyc | Bin 0 -> 218 bytes .../unused_global_variable2.cpython-37.pyc | Bin 0 -> 218 bytes .../unused_global_variable3.cpython-37.pyc | Bin 0 -> 326 bytes .../unused_global_variable4.cpython-37.pyc | Bin 0 -> 233 bytes .../__pycache__/unused_import.cpython-37.pyc | Bin 0 -> 956 bytes .../unused_import_assigned_to.cpython-37.pyc | Bin 0 -> 859 bytes .../unused_typing_imports.cpython-37.pyc | Bin 0 -> 1513 bytes .../unused_variable.cpython-37.pyc | Bin 0 -> 1974 bytes .../used_before_assignment_488.cpython-37.pyc | Bin 0 -> 434 bytes ...before_assignment_issue1081.cpython-37.pyc | Bin 0 -> 1251 bytes ..._before_assignment_issue853.cpython-37.pyc | Bin 0 -> 554 bytes ..._before_assignment_nonlocal.cpython-37.pyc | Bin 0 -> 1927 bytes .../useless-import-alias.cpython-37.pyc | Bin 0 -> 650 bytes .../useless_else_on_loop.cpython-37.pyc | Bin 0 -> 1990 bytes .../useless_object_inheritance.cpython-37.pyc | Bin 0 -> 1341 bytes .../__pycache__/useless_return.cpython-37.pyc | Bin 0 -> 794 bytes .../useless_super_delegation.cpython-37.pyc | Bin 0 -> 13589 bytes ...seless_super_delegation_py3.cpython-37.pyc | Bin 0 -> 2698 bytes ...eless_super_delegation_py35.cpython-37.pyc | Bin 0 -> 968 bytes .../using_constant_test.cpython-37.pyc | Bin 0 -> 3699 bytes .../wildcard_import.cpython-37.pyc | Bin 0 -> 249 bytes .../wildcard_import_allowed.cpython-37.pyc | Bin 0 -> 262 bytes .../with_used_before_assign.cpython-37.pyc | Bin 0 -> 539 bytes .../with_using_generator.cpython-37.pyc | Bin 0 -> 769 bytes .../wrong_import_order.cpython-37.pyc | Bin 0 -> 1079 bytes .../wrong_import_order2.cpython-37.pyc | Bin 0 -> 423 bytes .../wrong_import_position.cpython-37.pyc | Bin 0 -> 1042 bytes .../wrong_import_position10.cpython-37.pyc | Bin 0 -> 496 bytes .../wrong_import_position11.cpython-37.pyc | Bin 0 -> 276 bytes .../wrong_import_position12.cpython-37.pyc | Bin 0 -> 262 bytes .../wrong_import_position13.cpython-37.pyc | Bin 0 -> 291 bytes .../wrong_import_position14.cpython-37.pyc | Bin 0 -> 284 bytes .../wrong_import_position15.cpython-37.pyc | Bin 0 -> 386 bytes .../wrong_import_position2.cpython-37.pyc | Bin 0 -> 367 bytes .../wrong_import_position3.cpython-37.pyc | Bin 0 -> 261 bytes .../wrong_import_position4.cpython-37.pyc | Bin 0 -> 365 bytes .../wrong_import_position5.cpython-37.pyc | Bin 0 -> 261 bytes .../wrong_import_position6.cpython-37.pyc | Bin 0 -> 283 bytes .../wrong_import_position7.cpython-37.pyc | Bin 0 -> 328 bytes .../wrong_import_position8.cpython-37.pyc | Bin 0 -> 270 bytes .../wrong_import_position9.cpython-37.pyc | Bin 0 -> 320 bytes ...osition_exclude_dunder_main.cpython-37.pyc | Bin 0 -> 396 bytes .../yield_from_iterable_py33.cpython-37.pyc | Bin 0 -> 383 bytes .../test/functional/abstract_abc_methods.py | 17 + .../abstract_class_instantiated_in_class.py | 20 + .../abstract_class_instantiated_py2.py | 82 + .../abstract_class_instantiated_py2.rc | 2 + .../abstract_class_instantiated_py2.txt | 4 + .../abstract_class_instantiated_py3.py | 128 + .../abstract_class_instantiated_py3.rc | 2 + .../abstract_class_instantiated_py3.txt | 5 + .../abstract_class_instantiated_py34.py | 19 + .../abstract_class_instantiated_py34.rc | 2 + .../abstract_class_instantiated_py34.txt | 1 + .../test/functional/abstract_method_py2.py | 90 + .../test/functional/abstract_method_py2.rc | 2 + .../test/functional/abstract_method_py2.txt | 16 + .../test/functional/abstract_method_py3.py | 88 + .../test/functional/abstract_method_py3.rc | 2 + .../test/functional/abstract_method_py3.txt | 16 + .../access_member_before_definition.py | 40 + .../access_member_before_definition.txt | 2 + .../test/functional/access_to__name__.py | 21 + .../test/functional/access_to__name__.txt | 3 + .../functional/access_to_protected_members.py | 59 + .../access_to_protected_members.txt | 6 + .../anomalous_unicode_escape_py2.py | 20 + .../anomalous_unicode_escape_py2.rc | 2 + .../anomalous_unicode_escape_py2.txt | 3 + .../anomalous_unicode_escape_py3.py | 19 + .../anomalous_unicode_escape_py3.rc | 2 + .../anomalous_unicode_escape_py3.txt | 3 + .../pylint/test/functional/arguments.py | 217 + .../pylint/test/functional/arguments.txt | 39 + .../test/functional/arguments_differ.py | 210 + .../test/functional/arguments_differ.txt | 8 + .../test/functional/arguments_differ_py3.py | 36 + .../test/functional/arguments_differ_py3.rc | 2 + .../test/functional/arguments_differ_py3.txt | 5 + .../pylint/test/functional/assert_on_tuple.py | 11 + .../test/functional/assert_on_tuple.txt | 2 + .../test/functional/assigning_non_slot.py | 150 + .../test/functional/assigning_non_slot.txt | 5 + .../functional/assignment_from_no_return.py | 18 + .../functional/assignment_from_no_return.txt | 2 + .../pylint/test/functional/async_functions.py | 63 + .../pylint/test/functional/async_functions.rc | 2 + .../test/functional/async_functions.txt | 10 + .../attribute_defined_outside_init.py | 62 + .../attribute_defined_outside_init.txt | 2 + .../test/functional/bad_continuation.py | 202 + .../test/functional/bad_continuation.txt | 63 + .../test/functional/bad_continuation_py36.py | 8 + .../test/functional/bad_continuation_py36.rc | 2 + .../test/functional/bad_continuation_tabs.py | 52 + .../test/functional/bad_continuation_tabs.rc | 3 + .../test/functional/bad_continuation_tabs.txt | 6 + .../test/functional/bad_except_order.py | 45 + .../test/functional/bad_except_order.txt | 5 + .../test/functional/bad_exception_context.py | 24 + .../test/functional/bad_exception_context.rc | 2 + .../test/functional/bad_exception_context.txt | 3 + .../pylint/test/functional/bad_indentation.py | 19 + .../test/functional/bad_indentation.txt | 2 + .../test/functional/bad_inline_option.py | 5 + .../test/functional/bad_inline_option.rc | 2 + .../test/functional/bad_inline_option.txt | 1 + .../pylint/test/functional/bad_open_mode.py | 37 + .../pylint/test/functional/bad_open_mode.rc | 2 + .../pylint/test/functional/bad_open_mode.txt | 14 + .../test/functional/bad_open_mode_py3.py | 23 + .../test/functional/bad_open_mode_py3.rc | 3 + .../test/functional/bad_open_mode_py3.txt | 6 + .../test/functional/bad_reversed_sequence.py | 71 + .../test/functional/bad_reversed_sequence.txt | 8 + .../functional/bad_staticmethod_argument.py | 16 + .../functional/bad_staticmethod_argument.txt | 2 + .../functional/bad_thread_instantiation.py | 8 + .../functional/bad_thread_instantiation.txt | 2 + .../pylint/test/functional/bad_whitespace.py | 7 + .../pylint/test/functional/bad_whitespace.txt | 15 + .../pylint/test/functional/bare_except.py | 6 + .../pylint/test/functional/bare_except.txt | 1 + .../test/functional/blacklisted_name.py | 4 + .../test/functional/blacklisted_name.txt | 1 + .../test/functional/boolean_datetime.py | 30 + .../test/functional/boolean_datetime.rc | 2 + .../test/functional/boolean_datetime.txt | 8 + .../pylint/test/functional/broad_except.py | 8 + .../pylint/test/functional/broad_except.txt | 1 + .../bugfix_local_scope_metaclass_1177.py | 56 + .../bugfix_local_scope_metaclass_1177.rc | 2 + .../test/functional/cellvar_escaping_loop.py | 130 + .../test/functional/cellvar_escaping_loop.txt | 7 + .../test/functional/class_members_py27.py | 70 + .../test/functional/class_members_py27.rc | 3 + .../test/functional/class_members_py27.txt | 7 + .../test/functional/class_members_py30.py | 68 + .../test/functional/class_members_py30.rc | 2 + .../test/functional/class_members_py30.txt | 7 + .../pylint/test/functional/class_scope.py | 22 + .../pylint/test/functional/class_scope.txt | 4 + .../functional/comparison_with_callable.py | 60 + .../functional/comparison_with_callable.txt | 5 + .../test/functional/confidence_filter.py | 16 + .../test/functional/confidence_filter.rc | 3 + .../test/functional/confidence_filter.txt | 1 + .../functional/confusing_with_statement.py | 27 + .../functional/confusing_with_statement.txt | 1 + .../consider_iterating_dictionary.py | 38 + .../consider_iterating_dictionary.txt | 15 + .../pylint/test/functional/consider_join.py | 126 + .../pylint/test/functional/consider_join.txt | 11 + .../functional/consider_merging_isinstance.py | 37 + .../consider_merging_isinstance.txt | 7 + .../functional/consider_swap_variables.py | 25 + .../functional/consider_swap_variables.txt | 2 + .../consider_using_dict_comprehension.py | 9 + .../consider_using_dict_comprehension.txt | 1 + .../functional/consider_using_enumerate.py | 47 + .../functional/consider_using_enumerate.txt | 2 + .../test/functional/consider_using_get.py | 90 + .../test/functional/consider_using_get.txt | 4 + .../test/functional/consider_using_in.py | 46 + .../test/functional/consider_using_in.txt | 13 + .../consider_using_set_comprehension.py | 9 + .../consider_using_set_comprehension.txt | 1 + .../test/functional/continue_in_finally.py | 24 + .../test/functional/continue_in_finally.txt | 1 + .../functional/crash_missing_module_type.py | 18 + .../functional/crash_missing_module_type.txt | 0 .../pylint/test/functional/ctor_arguments.py | 104 + .../pylint/test/functional/ctor_arguments.txt | 24 + .../functional/dangerous_default_value.py | 79 + .../functional/dangerous_default_value.rc | 2 + .../functional/dangerous_default_value.txt | 14 + .../dangerous_default_value_py30.py | 79 + .../dangerous_default_value_py30.rc | 2 + .../dangerous_default_value_py30.txt | 14 + .../defined_and_used_on_same_line.py | 29 + .../test/functional/deprecated_lambda.py | 23 + .../test/functional/deprecated_lambda.rc | 2 + .../test/functional/deprecated_lambda.txt | 2 + .../deprecated_method_getmoduleinfo.py | 4 + .../deprecated_method_getmoduleinfo.rc | 3 + .../deprecated_method_getmoduleinfo.txt | 1 + .../test/functional/deprecated_methods_py2.py | 9 + .../test/functional/deprecated_methods_py2.rc | 2 + .../functional/deprecated_methods_py2.txt | 4 + .../test/functional/deprecated_methods_py3.py | 37 + .../test/functional/deprecated_methods_py3.rc | 2 + .../functional/deprecated_methods_py3.txt | 11 + .../functional/deprecated_methods_py36.py | 7 + .../functional/deprecated_methods_py36.rc | 2 + .../functional/deprecated_methods_py36.txt | 2 + .../test/functional/deprecated_module_py2.py | 8 + .../test/functional/deprecated_module_py2.rc | 2 + .../test/functional/deprecated_module_py2.txt | 4 + .../test/functional/deprecated_module_py3.py | 4 + .../test/functional/deprecated_module_py3.rc | 3 + .../test/functional/deprecated_module_py3.txt | 1 + .../test/functional/deprecated_module_py36.py | 4 + .../test/functional/deprecated_module_py36.rc | 2 + .../functional/deprecated_module_py36.txt | 1 + .../test/functional/deprecated_module_py4.py | 4 + .../test/functional/deprecated_module_py4.rc | 4 + .../test/functional/deprecated_module_py4.txt | 2 + .../deprecated_module_uninstalled.py | 5 + .../deprecated_module_uninstalled.rc | 2 + .../deprecated_module_uninstalled.txt | 2 + .../disable_msg_github_issue_1389.py | 15 + .../disable_msg_github_issue_1389.rc | 2 + .../functional/disable_ungrouped_imports.py | 10 + .../functional/disable_ungrouped_imports.txt | 2 + .../functional/disable_wrong_import_order.py | 11 + .../functional/disable_wrong_import_order.txt | 1 + .../disable_wrong_import_position.py | 7 + .../pylint/test/functional/docstrings.py | 90 + .../pylint/test/functional/docstrings.txt | 8 + .../functional/duplicate_argument_name.py | 11 + .../functional/duplicate_argument_name.txt | 3 + .../pylint/test/functional/duplicate_bases.py | 15 + .../test/functional/duplicate_bases.txt | 1 + .../functional/duplicate_dict_literal_key.py | 17 + .../functional/duplicate_dict_literal_key.txt | 3 + .../test/functional/duplicate_except.py | 12 + .../test/functional/duplicate_except.txt | 1 + .../pylint/test/functional/eval_used.py | 10 + .../pylint/test/functional/eval_used.txt | 4 + .../test/functional/exception_is_binary_op.py | 12 + .../functional/exception_is_binary_op.txt | 4 + .../test/functional/exception_message.py | 41 + .../test/functional/exception_message.rc | 5 + .../test/functional/exception_message.txt | 6 + .../pylint/test/functional/exec_used_py2.py | 10 + .../pylint/test/functional/exec_used_py2.rc | 2 + .../pylint/test/functional/exec_used_py2.txt | 4 + .../pylint/test/functional/exec_used_py3.py | 9 + .../pylint/test/functional/exec_used_py3.rc | 2 + .../pylint/test/functional/exec_used_py3.txt | 4 + .../functional/fallback_import_disabled.py | 10 + .../functional/fallback_import_disabled.txt | 0 .../functional/fallback_import_enabled.py | 5 + .../functional/fallback_import_enabled.rc | 2 + .../functional/fallback_import_enabled.txt | 2 + .../pylint/test/functional/fixme.py | 24 + .../pylint/test/functional/fixme.txt | 6 + .../functional/fixme_bad_formatting_1139.py | 6 + .../functional/fixme_bad_formatting_1139.rc | 2 + .../functional/fixme_bad_formatting_1139.txt | 1 + .../formatted_string_literal_with_if_py36.py | 8 + .../formatted_string_literal_with_if_py36.rc | 2 + .../pylint/test/functional/formatting.txt | 0 .../test/functional/function_redefined.py | 95 + .../test/functional/function_redefined.txt | 7 + .../pylint/test/functional/future_import.py | 3 + .../functional/future_unicode_literals.py | 6 + .../functional/future_unicode_literals.rc | 1 + .../functional/future_unicode_literals.txt | 1 + .../test/functional/generated_members.py | 18 + .../test/functional/generated_members.rc | 5 + .../test/functional/genexp_in_class_scope.py | 6 + .../test/functional/genexp_in_class_scope.txt | 0 .../test/functional/genexpr_variable_scope.py | 5 + .../functional/genexpr_variable_scope.txt | 1 + .../pylint/test/functional/globals.py | 32 + .../pylint/test/functional/globals.txt | 7 + .../pylint/test/functional/import_error.py | 27 + .../pylint/test/functional/import_error.rc | 2 + .../pylint/test/functional/import_error.txt | 3 + .../test/functional/inconsistent_mro.py | 9 + .../test/functional/inconsistent_mro.txt | 1 + .../test/functional/inconsistent_returns.py | 264 + .../test/functional/inconsistent_returns.rc | 2 + .../test/functional/inconsistent_returns.txt | 13 + .../test/functional/indexing_exception.py | 15 + .../test/functional/indexing_exception.rc | 5 + .../test/functional/indexing_exception.txt | 3 + .../test/functional/inherit_non_class.py | 81 + .../test/functional/inherit_non_class.txt | 9 + .../test/functional/init_is_generator.py | 5 + .../test/functional/init_is_generator.txt | 1 + .../pylint/test/functional/init_not_called.py | 64 + .../test/functional/init_not_called.txt | 6 + .../init_subclass_classmethod_py36.py | 16 + .../init_subclass_classmethod_py36.rc | 2 + .../test/functional/invalid_all_object.py | 6 + .../test/functional/invalid_all_object.txt | 3 + .../test/functional/invalid_encoding_py27.py | 3 + .../test/functional/invalid_encoding_py27.rc | 3 + .../test/functional/invalid_encoding_py27.txt | 1 + .../test/functional/invalid_envvar_value.py | 84 + .../test/functional/invalid_envvar_value.txt | 31 + .../functional/invalid_exceptions_caught.py | 135 + .../functional/invalid_exceptions_caught.txt | 12 + .../functional/invalid_exceptions_raised.py | 91 + .../functional/invalid_exceptions_raised.txt | 12 + .../functional/invalid_length_returned.py | 64 + .../functional/invalid_length_returned.txt | 3 + .../test/functional/invalid_metaclass.py | 34 + .../test/functional/invalid_metaclass.txt | 0 .../test/functional/invalid_metaclass_py3.py | 19 + .../test/functional/invalid_metaclass_py3.rc | 2 + .../test/functional/invalid_metaclass_py3.txt | 0 .../pylint/test/functional/invalid_name.py | 39 + .../pylint/test/functional/invalid_name.txt | 3 + .../test/functional/invalid_sequence_index.py | 242 + .../functional/invalid_sequence_index.txt | 20 + .../test/functional/invalid_slice_index.py | 71 + .../test/functional/invalid_slice_index.txt | 5 + .../invalid_star_assignment_target.py | 4 + .../invalid_star_assignment_target.rc | 2 + .../invalid_star_assignment_target.txt | 1 + .../functional/invalid_unary_operand_type.py | 51 + .../functional/invalid_unary_operand_type.txt | 14 + .../test/functional/iterable_context.py | 192 + .../test/functional/iterable_context.txt | 10 + .../test/functional/iterable_context_py2.py | 18 + .../test/functional/iterable_context_py2.rc | 2 + .../test/functional/iterable_context_py2.txt | 1 + .../test/functional/iterable_context_py3.py | 18 + .../test/functional/iterable_context_py3.rc | 3 + .../test/functional/iterable_context_py3.txt | 1 + .../test/functional/iterable_context_py36.py | 15 + .../test/functional/iterable_context_py36.rc | 2 + .../test/functional/iterable_context_py36.txt | 2 + .../functional/keyword_arg_before_vararg.py | 35 + .../functional/keyword_arg_before_vararg.txt | 4 + .../pylint/test/functional/len_checks.py | 77 + .../pylint/test/functional/len_checks.txt | 16 + .../pylint/test/functional/line_endings.py | 3 + .../pylint/test/functional/line_endings.rc | 2 + .../pylint/test/functional/line_endings.txt | 2 + .../pylint/test/functional/line_too_long.py | 50 + .../pylint/test/functional/line_too_long.txt | 7 + .../functional/line_too_long_end_of_module.py | 7 + .../test/functional/literal_comparison.py | 39 + .../test/functional/literal_comparison.txt | 10 + .../logging_format_interpolation.py | 29 + .../logging_format_interpolation.txt | 5 + .../logging_format_interpolation_py36.py | 5 + .../logging_format_interpolation_py36.rc | 2 + .../logging_format_interpolation_py36.txt | 1 + .../logging_fstring_interpolation_py36.py | 21 + .../logging_fstring_interpolation_py36.rc | 2 + .../logging_fstring_interpolation_py36.txt | 5 + .../test/functional/logging_not_lazy.py | 23 + .../test/functional/logging_not_lazy.txt | 6 + .../test/functional/logical_tautology.py | 40 + .../test/functional/logical_tautology.txt | 12 + .../test/functional/long_lines_with_utf8.py | 7 + .../test/functional/long_lines_with_utf8.txt | 1 + .../pylint/test/functional/long_utf8_lines.py | 8 + .../test/functional/long_utf8_lines.txt | 0 .../pylint/test/functional/lost_exception.py | 41 + .../pylint/test/functional/lost_exception.txt | 2 + .../pylint/test/functional/mapping_context.py | 109 + .../test/functional/mapping_context.txt | 2 + .../test/functional/mapping_context_py2.py | 19 + .../test/functional/mapping_context_py2.rc | 2 + .../test/functional/mapping_context_py2.txt | 1 + .../test/functional/mapping_context_py3.py | 19 + .../test/functional/mapping_context_py3.rc | 3 + .../test/functional/mapping_context_py3.txt | 1 + .../pylint/test/functional/member_checks.py | 199 + .../pylint/test/functional/member_checks.txt | 18 + .../test/functional/member_checks_hints.py | 27 + .../test/functional/member_checks_hints.rc | 3 + .../test/functional/member_checks_hints.txt | 5 + .../functional/member_checks_ignore_none.py | 7 + .../functional/member_checks_ignore_none.rc | 2 + .../functional/member_checks_ignore_none.txt | 1 + .../test/functional/member_checks_no_hints.py | 27 + .../test/functional/member_checks_no_hints.rc | 2 + .../functional/member_checks_no_hints.txt | 5 + .../test/functional/member_checks_opaque.py | 12 + .../test/functional/member_checks_opaque.rc | 2 + .../test/functional/member_checks_opaque.txt | 1 + .../test/functional/member_checks_py37.py | 3 + .../test/functional/member_checks_py37.rc | 2 + .../test/functional/member_checks_py37.txt | 0 .../test/functional/membership_protocol.py | 123 + .../test/functional/membership_protocol.txt | 7 + .../functional/membership_protocol_py2.py | 36 + .../functional/membership_protocol_py2.rc | 3 + .../functional/membership_protocol_py2.txt | 3 + .../functional/membership_protocol_py3.py | 36 + .../functional/membership_protocol_py3.rc | 3 + .../functional/membership_protocol_py3.txt | 3 + .../test/functional/messages_managed_by_id.py | 11 + .../functional/messages_managed_by_id.txt | 6 + .../pylint/test/functional/method_hidden.py | 39 + .../pylint/test/functional/method_hidden.txt | 1 + .../test/functional/misplaced_bare_raise.py | 85 + .../test/functional/misplaced_bare_raise.txt | 7 + .../misplaced_comparison_constant.py | 36 + .../misplaced_comparison_constant.txt | 6 + .../functional/misplaced_format_function.py | 58 + .../functional/misplaced_format_function.txt | 4 + .../test/functional/misplaced_future.py | 6 + .../test/functional/misplaced_future.txt | 1 + .../test/functional/missing_docstring.py | 54 + .../test/functional/missing_docstring.txt | 3 + .../test/functional/missing_final_newline.py | 4 + .../test/functional/missing_final_newline.txt | 1 + .../test/functional/missing_kwoa_py3.py | 36 + .../test/functional/missing_kwoa_py3.rc | 2 + .../test/functional/missing_kwoa_py3.txt | 3 + .../test/functional/missing_self_argument.py | 21 + .../test/functional/missing_self_argument.txt | 6 + .../test/functional/mixed_indentation.py | 10 + .../test/functional/mixed_indentation.txt | 2 + .../test/functional/monkeypatch_method.py | 16 + .../test/functional/monkeypatch_method.txt | 0 .../test/functional/multiple_imports.py | 2 + .../test/functional/multiple_imports.txt | 1 + .../test/functional/namePresetCamelCase.py | 23 + .../test/functional/namePresetCamelCase.rc | 13 + .../test/functional/namePresetCamelCase.txt | 3 + .../test/functional/name_preset_snake_case.py | 23 + .../test/functional/name_preset_snake_case.rc | 13 + .../functional/name_preset_snake_case.txt | 3 + .../pylint/test/functional/name_styles.py | 140 + .../pylint/test/functional/name_styles.rc | 5 + .../pylint/test/functional/name_styles.txt | 16 + .../functional/namedtuple_member_inference.py | 22 + .../namedtuple_member_inference.txt | 2 + .../pylint/test/functional/names_in__all__.py | 49 + .../test/functional/names_in__all__.txt | 6 + .../functional/nested_blocks_issue1088.py | 23 + .../functional/nested_blocks_issue1088.txt | 2 + .../test/functional/newstyle__slots__.py | 17 + .../test/functional/newstyle__slots__.txt | 2 + .../test/functional/newstyle_properties.py | 53 + .../test/functional/newstyle_properties.txt | 2 + .../functional/no_classmethod_decorator.py | 35 + .../functional/no_classmethod_decorator.txt | 3 + .../pylint/test/functional/no_else_return.py | 72 + .../pylint/test/functional/no_else_return.txt | 5 + .../test/functional/no_name_in_module.py | 66 + .../test/functional/no_name_in_module.txt | 15 + .../pylint/test/functional/no_self_use.py | 78 + .../pylint/test/functional/no_self_use.txt | 1 + .../pylint/test/functional/no_self_use_py3.py | 12 + .../pylint/test/functional/no_self_use_py3.rc | 2 + .../test/functional/no_self_use_py3.txt | 1 + .../functional/no_staticmethod_decorator.py | 35 + .../functional/no_staticmethod_decorator.txt | 3 + .../test/functional/non_iterator_returned.py | 95 + .../test/functional/non_iterator_returned.txt | 4 + .../functional/none_dunder_protocols_py36.py | 34 + .../functional/none_dunder_protocols_py36.rc | 2 + .../functional/none_dunder_protocols_py36.txt | 6 + .../test/functional/nonexistent_operator.py | 15 + .../test/functional/nonexistent_operator.txt | 6 + .../test/functional/nonlocal_and_global.py | 12 + .../test/functional/nonlocal_and_global.rc | 2 + .../test/functional/nonlocal_and_global.txt | 1 + .../functional/nonlocal_without_binding.py | 42 + .../functional/nonlocal_without_binding.rc | 2 + .../functional/nonlocal_without_binding.txt | 3 + .../functional/not_async_context_manager.py | 71 + .../functional/not_async_context_manager.rc | 2 + .../functional/not_async_context_manager.txt | 5 + .../pylint/test/functional/not_callable.py | 125 + .../pylint/test/functional/not_callable.txt | 8 + .../test/functional/not_context_manager.py | 135 + .../test/functional/not_context_manager.txt | 5 + .../pylint/test/functional/not_in_loop.py | 54 + .../pylint/test/functional/not_in_loop.txt | 8 + .../test/functional/old_division_manually.py | 2 + .../test/functional/old_division_manually.rc | 6 + .../test/functional/old_style_class_py27.py | 18 + .../test/functional/old_style_class_py27.rc | 2 + .../test/functional/old_style_class_py27.txt | 2 + .../postponed_evaluation_activated.py | 15 + .../postponed_evaluation_activated.rc | 2 + .../postponed_evaluation_activated.txt | 0 .../postponed_evaluation_not_activated.py | 14 + .../postponed_evaluation_not_activated.rc | 2 + .../postponed_evaluation_not_activated.txt | 2 + .../test/functional/print_always_warns.py | 8 + .../test/functional/print_always_warns.rc | 5 + .../test/functional/print_always_warns.txt | 1 + ...rotected_access_access_different_scopes.py | 13 + ...rotected_access_access_different_scopes.rc | 2 + ...otected_access_access_different_scopes.txt | 2 + .../test/functional/raising_format_tuple.py | 51 + .../test/functional/raising_format_tuple.txt | 7 + .../functional/raising_non_exception_py3.py | 13 + .../functional/raising_non_exception_py3.rc | 2 + .../functional/raising_non_exception_py3.txt | 1 + .../pylint/test/functional/raising_self.py | 10 + .../pylint/test/functional/raising_self.txt | 0 .../test/functional/recursion_error_940.py | 13 + .../test/functional/redefine_in_handler.py | 68 + .../test/functional/redefine_in_handler.rc | 2 + .../test/functional/redefine_in_handler.txt | 7 + .../redefined_argument_from_local.py | 67 + .../redefined_argument_from_local.txt | 7 + .../test/functional/redefined_builtin.py | 11 + .../test/functional/redefined_builtin.txt | 2 + .../functional/redundant_unittest_assert.py | 38 + .../functional/redundant_unittest_assert.txt | 6 + .../regression_1326_crash_uninferable.py | 12 + .../regression_no_value_for_parameter.py | 15 + .../regression_no_value_for_parameter.txt | 0 .../pylint/test/functional/reimported.py | 16 + .../pylint/test/functional/reimported.txt | 4 + .../test/functional/repeated_keyword.py | 13 + .../test/functional/repeated_keyword.txt | 1 + .../pylint/test/functional/return_in_init.py | 25 + .../pylint/test/functional/return_in_init.txt | 1 + .../functional/return_outside_function.py | 2 + .../functional/return_outside_function.txt | 1 + .../functional/reused_outer_loop_variable.py | 37 + .../functional/reused_outer_loop_variable.txt | 4 + .../reused_outer_loop_variable_py3.py | 5 + .../reused_outer_loop_variable_py3.rc | 2 + .../reused_outer_loop_variable_py3.txt | 1 + .../test/functional/self_cls_assignment.py | 47 + .../test/functional/self_cls_assignment.txt | 4 + .../test/functional/signature_differs.py | 22 + .../test/functional/signature_differs.txt | 1 + .../functional/simplifiable_if_statement.py | 135 + .../functional/simplifiable_if_statement.txt | 4 + .../functional/simplify_chained_comparison.py | 69 + .../simplify_chained_comparison.txt | 13 + .../functional/singledispatch_functions.py | 76 + .../functional/singledispatch_functions.rc | 3 + .../functional/singledispatch_functions.txt | 5 + .../singledispatch_functions_py3.py | 76 + .../singledispatch_functions_py3.rc | 3 + .../singledispatch_functions_py3.txt | 5 + .../test/functional/singleton_comparison.py | 15 + .../test/functional/singleton_comparison.txt | 8 + .../pylint/test/functional/slots_checks.py | 85 + .../pylint/test/functional/slots_checks.txt | 8 + .../test/functional/socketerror_import.py | 6 + .../star_needs_assignment_target.py | 4 + .../star_needs_assignment_target.rc | 2 + .../star_needs_assignment_target.txt | 1 + .../star_needs_assignment_target_py35.py | 15 + .../star_needs_assignment_target_py35.rc | 2 + .../star_needs_assignment_target_py35.txt | 1 + .../functional/statement_without_effect.py | 65 + .../functional/statement_without_effect.txt | 60 + .../statement_without_effect_py36.py | 18 + .../statement_without_effect_py36.rc | 2 + .../statement_without_effect_py36.txt | 1 + .../stop_iteration_inside_generator.py | 129 + .../stop_iteration_inside_generator.rc | 2 + .../stop_iteration_inside_generator.txt | 7 + .../test/functional/string_formatting.py | 188 + .../test/functional/string_formatting.txt | 41 + .../functional/string_formatting_disable.py | 1 + .../functional/string_formatting_disable.rc | 3 + .../functional/string_formatting_disable.txt | 1 + .../string_formatting_failed_inference.py | 4 + .../test/functional/string_formatting_py27.py | 22 + .../test/functional/string_formatting_py27.rc | 3 + .../functional/string_formatting_py27.txt | 15 + .../test/functional/string_formatting_py3.py | 21 + .../test/functional/string_formatting_py3.rc | 2 + .../test/functional/string_formatting_py3.txt | 2 + .../functional/subprocess_popen_preexec_fn.py | 11 + .../subprocess_popen_preexec_fn.txt | 1 + .../pylint/test/functional/super_checks.py | 125 + .../pylint/test/functional/super_checks.txt | 21 + .../test/functional/superfluous_parens.py | 19 + .../test/functional/superfluous_parens.txt | 5 + .../functional/suspicious_str_strip_call.py | 9 + .../functional/suspicious_str_strip_call.rc | 2 + .../functional/suspicious_str_strip_call.txt | 3 + .../suspicious_str_strip_call_py3.py | 9 + .../suspicious_str_strip_call_py3.rc | 2 + .../suspicious_str_strip_call_py3.txt | 3 + .../pylint/test/functional/syntax_error.py | 1 + .../pylint/test/functional/syntax_error.rc | 1 + .../pylint/test/functional/syntax_error.txt | 1 + .../test/functional/syntax_error_jython.py | 1 + .../test/functional/syntax_error_jython.rc | 2 + .../test/functional/syntax_error_jython.txt | 1 + .../functional/sys_stream_regression_1004.py | 7 + .../functional/sys_stream_regression_1004.rc | 3 + .../functional/sys_stream_regression_1004.txt | 2 + .../pylint/test/functional/ternary.py | 39 + .../pylint/test/functional/ternary.txt | 9 + .../pylint/test/functional/test_compile.py | 6 + .../pylint/test/functional/tokenize_error.py | 6 + .../pylint/test/functional/tokenize_error.rc | 1 + .../pylint/test/functional/tokenize_error.txt | 1 + .../test/functional/tokenize_error_jython.py | 7 + .../test/functional/tokenize_error_jython.rc | 2 + .../test/functional/tokenize_error_jython.txt | 1 + .../test/functional/too_few_public_methods.py | 50 + .../functional/too_few_public_methods.txt | 1 + .../functional/too_few_public_methods_37.py | 14 + .../functional/too_few_public_methods_37.rc | 2 + .../functional/too_few_public_methods_37.txt | 0 .../test/functional/too_many_ancestors.py | 24 + .../test/functional/too_many_ancestors.txt | 2 + .../test/functional/too_many_arguments.py | 17 + .../test/functional/too_many_arguments.txt | 1 + .../too_many_arguments_issue_1045.py | 13 + .../too_many_arguments_issue_1045.rc | 2 + .../too_many_arguments_issue_1045.txt | 0 .../too_many_boolean_expressions.py | 20 + .../too_many_boolean_expressions.txt | 4 + .../test/functional/too_many_branches.py | 69 + .../test/functional/too_many_branches.txt | 1 + .../too_many_instance_attributes.py | 26 + .../too_many_instance_attributes.txt | 1 + .../pylint/test/functional/too_many_lines.py | 1015 ++ .../pylint/test/functional/too_many_lines.txt | 1 + .../functional/too_many_lines_disabled.py | 1018 ++ .../pylint/test/functional/too_many_locals.py | 60 + .../test/functional/too_many_locals.txt | 3 + .../test/functional/too_many_nested_blocks.py | 97 + .../functional/too_many_nested_blocks.txt | 2 + .../functional/too_many_public_methods.py | 79 + .../functional/too_many_public_methods.txt | 1 + .../functional/too_many_return_statements.py | 40 + .../functional/too_many_return_statements.txt | 1 + .../functional/too_many_star_expressions.py | 4 + .../functional/too_many_star_expressions.rc | 2 + .../functional/too_many_star_expressions.txt | 1 + .../test/functional/too_many_statements.py | 125 + .../test/functional/too_many_statements.txt | 2 + .../test/functional/trailing_comma_tuple.py | 38 + .../test/functional/trailing_comma_tuple.rc | 2 + .../test/functional/trailing_comma_tuple.txt | 7 + .../test/functional/trailing_newlines.py | 3 + .../test/functional/trailing_newlines.txt | 1 + .../test/functional/trailing_whitespaces.py | 11 + .../test/functional/trailing_whitespaces.txt | 3 + .../test/functional/try_except_raise.py | 75 + .../test/functional/try_except_raise.txt | 5 + .../functional/unbalanced_tuple_unpacking.py | 108 + .../functional/unbalanced_tuple_unpacking.txt | 6 + .../unbalanced_tuple_unpacking_py30.py | 11 + .../unbalanced_tuple_unpacking_py30.rc | 2 + .../functional/undefined_loop_variable.py | 61 + .../functional/undefined_loop_variable.txt | 2 + .../test/functional/undefined_variable.py | 234 + .../test/functional/undefined_variable.txt | 27 + .../functional/undefined_variable_py30.py | 82 + .../functional/undefined_variable_py30.rc | 2 + .../functional/undefined_variable_py30.txt | 8 + .../unexpected_special_method_signature.py | 120 + .../unexpected_special_method_signature.txt | 16 + .../test/functional/ungrouped_imports.py | 20 + .../test/functional/ungrouped_imports.txt | 5 + .../test/functional/unhashable_dict_key.py | 11 + .../test/functional/unhashable_dict_key.txt | 3 + .../test/functional/unidiomatic_typecheck.py | 76 + .../test/functional/unidiomatic_typecheck.txt | 18 + .../test/functional/uninferable_all_object.py | 9 + .../test/functional/unnecessary_lambda.py | 51 + .../test/functional/unnecessary_lambda.txt | 7 + .../test/functional/unnecessary_pass.py | 7 + .../test/functional/unnecessary_pass.txt | 1 + .../pylint/test/functional/unneeded_not.py | 63 + .../pylint/test/functional/unneeded_not.txt | 14 + .../test/functional/unpacked_exceptions.py | 11 + .../test/functional/unpacked_exceptions.rc | 5 + .../test/functional/unpacked_exceptions.txt | 4 + .../pylint/test/functional/unpacking.py | 11 + .../functional/unpacking_generalizations.py | 29 + .../functional/unpacking_generalizations.rc | 2 + .../functional/unpacking_generalizations.txt | 6 + .../test/functional/unpacking_non_sequence.py | 140 + .../functional/unpacking_non_sequence.txt | 10 + .../pylint/test/functional/unreachable.py | 22 + .../pylint/test/functional/unreachable.txt | 4 + .../functional/unrecognized_inline_option.py | 3 + .../functional/unrecognized_inline_option.txt | 1 + .../test/functional/unsubscriptable_value.py | 114 + .../test/functional/unsubscriptable_value.txt | 14 + .../unsupported_assignment_operation.py | 94 + .../unsupported_assignment_operation.txt | 17 + .../unsupported_binary_operation.py | 66 + .../unsupported_binary_operation.rc | 2 + .../unsupported_binary_operation.txt | 21 + .../unsupported_delete_operation.py | 94 + .../unsupported_delete_operation.txt | 17 + .../pylint/test/functional/unused_argument.py | 48 + .../test/functional/unused_argument.txt | 3 + .../test/functional/unused_argument_py3.py | 4 + .../test/functional/unused_argument_py3.rc | 2 + .../test/functional/unused_argument_py3.txt | 2 + .../functional/unused_global_variable1.py | 2 + .../functional/unused_global_variable2.py | 2 + .../functional/unused_global_variable2.rc | 2 + .../functional/unused_global_variable2.txt | 1 + .../functional/unused_global_variable3.py | 6 + .../functional/unused_global_variable4.py | 3 + .../functional/unused_global_variable4.rc | 2 + .../functional/unused_global_variable4.txt | 2 + .../pylint/test/functional/unused_import.py | 28 + .../pylint/test/functional/unused_import.txt | 8 + .../functional/unused_import_assigned_to.py | 25 + .../test/functional/unused_typing_imports.py | 39 + .../test/functional/unused_typing_imports.rc | 3 + .../pylint/test/functional/unused_variable.py | 50 + .../test/functional/unused_variable.txt | 10 + .../functional/used_before_assignment_488.py | 9 + .../used_before_assignment_issue1081.py | 40 + .../used_before_assignment_issue1081.txt | 7 + .../used_before_assignment_issue853.py | 23 + .../used_before_assignment_nonlocal.py | 47 + .../used_before_assignment_nonlocal.rc | 2 + .../used_before_assignment_nonlocal.txt | 6 + .../used_prior_global_declaration.py | 39 + .../used_prior_global_declaration.rc | 2 + .../used_prior_global_declaration.txt | 1 + .../test/functional/useless-import-alias.py | 18 + .../test/functional/useless-import-alias.txt | 8 + .../test/functional/useless_else_on_loop.py | 89 + .../test/functional/useless_else_on_loop.txt | 6 + .../functional/useless_object_inheritance.py | 27 + .../functional/useless_object_inheritance.txt | 4 + .../pylint/test/functional/useless_return.py | 15 + .../pylint/test/functional/useless_return.txt | 2 + .../functional/useless_super_delegation.py | 252 + .../functional/useless_super_delegation.txt | 17 + .../useless_super_delegation_py3.py | 43 + .../useless_super_delegation_py3.rc | 2 + .../useless_super_delegation_py3.txt | 2 + .../useless_super_delegation_py35.py | 12 + .../useless_super_delegation_py35.rc | 2 + .../useless_super_delegation_py35.txt | 1 + .../test/functional/using_constant_test.py | 141 + .../test/functional/using_constant_test.txt | 22 + .../pylint/test/functional/wildcard_import.py | 5 + .../test/functional/wildcard_import.txt | 2 + .../functional/wildcard_import_allowed.py | 4 + .../functional/wildcard_import_allowed.rc | 2 + .../functional/wildcard_import_allowed.txt | 2 + .../functional/with_used_before_assign.py | 11 + .../functional/with_used_before_assign.txt | 2 + .../test/functional/with_using_generator.py | 15 + .../test/functional/with_using_generator.txt | 1 + .../test/functional/wrong_import_order.py | 43 + .../test/functional/wrong_import_order.txt | 6 + .../test/functional/wrong_import_order2.py | 16 + .../test/functional/wrong_import_position.py | 33 + .../test/functional/wrong_import_position.txt | 4 + .../functional/wrong_import_position10.py | 15 + .../functional/wrong_import_position11.py | 4 + .../functional/wrong_import_position11.txt | 1 + .../functional/wrong_import_position12.py | 5 + .../functional/wrong_import_position12.txt | 1 + .../functional/wrong_import_position13.py | 4 + .../functional/wrong_import_position13.txt | 1 + .../functional/wrong_import_position14.py | 5 + .../functional/wrong_import_position14.txt | 1 + .../functional/wrong_import_position15.py | 9 + .../test/functional/wrong_import_position2.py | 10 + .../test/functional/wrong_import_position3.py | 3 + .../test/functional/wrong_import_position4.py | 5 + .../test/functional/wrong_import_position5.py | 4 + .../test/functional/wrong_import_position6.py | 7 + .../test/functional/wrong_import_position7.py | 9 + .../test/functional/wrong_import_position8.py | 4 + .../test/functional/wrong_import_position9.py | 9 + ...ong_import_position_exclude_dunder_main.py | 12 + ...ng_import_position_exclude_dunder_main.txt | 0 .../functional/yield_from_iterable_py33.py | 7 + .../functional/yield_from_iterable_py33.rc | 2 + .../functional/yield_from_iterable_py33.txt | 1 + .../functional/yield_from_outside_func.py | 4 + .../functional/yield_from_outside_func.rc | 2 + .../functional/yield_from_outside_func.txt | 1 + .../functional/yield_inside_async_function.py | 12 + .../functional/yield_inside_async_function.rc | 3 + .../yield_inside_async_function.txt | 2 + .../yield_inside_async_function_py36.py | 12 + .../yield_inside_async_function_py36.rc | 2 + .../yield_inside_async_function_py36.txt | 1 + .../test/functional/yield_outside_func.py | 4 + .../test/functional/yield_outside_func.txt | 1 + .../pylint/test/input/__init__.py | 1 + .../input/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 200 bytes ...func_3k_removed_stuff_py_30.cpython-37.pyc | Bin 0 -> 546 bytes ...func_bad_cont_dictcomp_py27.cpython-37.pyc | Bin 0 -> 1784 bytes .../func_block_disable_msg.cpython-37.pyc | Bin 0 -> 3499 bytes .../__pycache__/func_bug113231.cpython-37.pyc | Bin 0 -> 690 bytes .../func_disable_linebased.cpython-37.pyc | Bin 0 -> 743 bytes .../func_dotted_ancestor.cpython-37.pyc | Bin 0 -> 613 bytes .../__pycache__/func_e0012.cpython-37.pyc | Bin 0 -> 244 bytes .../__pycache__/func_e0204.cpython-37.pyc | Bin 0 -> 923 bytes .../__pycache__/func_e12xx.cpython-37.pyc | Bin 0 -> 656 bytes .../__pycache__/func_e13xx.cpython-37.pyc | Bin 0 -> 807 bytes .../func_excess_escapes.cpython-37.pyc | Bin 0 -> 648 bytes .../__pycache__/func_first_arg.cpython-37.pyc | Bin 0 -> 1482 bytes .../__pycache__/func_i0011.cpython-37.pyc | Bin 0 -> 256 bytes .../__pycache__/func_i0012.cpython-37.pyc | Bin 0 -> 255 bytes .../__pycache__/func_i0013.cpython-37.pyc | Bin 0 -> 284 bytes .../__pycache__/func_i0014.cpython-37.pyc | Bin 0 -> 284 bytes .../__pycache__/func_i0020.cpython-37.pyc | Bin 0 -> 414 bytes .../__pycache__/func_i0022.cpython-37.pyc | Bin 0 -> 306 bytes ...ogging_not_lazy_with_logger.cpython-37.pyc | Bin 0 -> 506 bytes ...c_loopvar_in_dict_comp_py27.cpython-37.pyc | Bin 0 -> 684 bytes .../func_module___dict__.cpython-37.pyc | Bin 0 -> 368 bytes ...rror_on_string_substitution.cpython-37.pyc | Bin 0 -> 335 bytes .../func_no_dummy_redefined.cpython-37.pyc | Bin 0 -> 612 bytes ..._return_from_inner_function.cpython-37.pyc | Bin 0 -> 728 bytes ...r_before_def_false_positive.cpython-37.pyc | Bin 0 -> 3380 bytes ...func_noerror_base_init_vars.cpython-37.pyc | Bin 0 -> 1437 bytes ...noerror_builtin_module_test.cpython-37.pyc | Bin 0 -> 483 bytes ...nc_noerror_class_attributes.cpython-37.pyc | Bin 0 -> 936 bytes ...es_meth_could_be_a_function.cpython-37.pyc | Bin 0 -> 1497 bytes ...ses_protected_member_access.cpython-37.pyc | Bin 0 -> 1082 bytes ...unc_noerror_decorator_scope.cpython-37.pyc | Bin 0 -> 992 bytes ...1_9588_base_attr_aug_assign.cpython-37.pyc | Bin 0 -> 1924 bytes ..._external_classmethod_crash.cpython-37.pyc | Bin 0 -> 872 bytes .../func_noerror_inner_classes.cpython-37.pyc | Bin 0 -> 1429 bytes ...or_lambda_use_before_assign.cpython-37.pyc | Bin 0 -> 598 bytes ...unc_noerror_mcs_attr_access.cpython-37.pyc | Bin 0 -> 1082 bytes ...error_new_style_class_py_30.cpython-37.pyc | Bin 0 -> 1653 bytes ...oerror_no_warning_docstring.cpython-37.pyc | Bin 0 -> 1786 bytes ...r_object_as_class_attribute.cpython-37.pyc | Bin 0 -> 879 bytes ...noerror_overloaded_operator.cpython-37.pyc | Bin 0 -> 1012 bytes ...r_property_affectation_py26.cpython-37.pyc | Bin 0 -> 935 bytes ...c_noerror_yield_assign_py25.cpython-37.pyc | Bin 0 -> 786 bytes ...nc_noerror_yield_return_mix.cpython-37.pyc | Bin 0 -> 384 bytes ...unc_nonregr___file___global.cpython-37.pyc | Bin 0 -> 405 bytes ...func_return_yield_mix_py_33.cpython-37.pyc | Bin 0 -> 542 bytes ...ypecheck_callfunc_assigment.cpython-37.pyc | Bin 0 -> 2165 bytes .../func_unused_import_py30.cpython-37.pyc | Bin 0 -> 1004 bytes ...ed_name_from_wilcard_import.cpython-37.pyc | Bin 0 -> 314 bytes .../__pycache__/func_w0233.cpython-37.pyc | Bin 0 -> 2521 bytes .../__pycache__/func_w0401.cpython-37.pyc | Bin 0 -> 335 bytes .../func_w0401_disabled.cpython-37.pyc | Bin 0 -> 344 bytes ...func_w0401_disabled_in_func.cpython-37.pyc | Bin 0 -> 538 bytes .../__pycache__/func_w0404.cpython-37.pyc | Bin 0 -> 827 bytes .../__pycache__/func_w0405.cpython-37.pyc | Bin 0 -> 742 bytes .../__pycache__/func_w0406.cpython-37.pyc | Bin 0 -> 363 bytes .../__pycache__/func_w0611.cpython-37.pyc | Bin 0 -> 1020 bytes .../__pycache__/func_w0612.cpython-37.pyc | Bin 0 -> 1143 bytes .../__pycache__/func_w0613.cpython-37.pyc | Bin 0 -> 1941 bytes .../func_w0623_py30.cpython-37.pyc | Bin 0 -> 664 bytes .../__pycache__/func_w0801.cpython-37.pyc | Bin 0 -> 345 bytes ...nore_except_pass_by_default.cpython-37.pyc | Bin 0 -> 344 bytes .../__pycache__/not__init__.cpython-37.pyc | Bin 0 -> 203 bytes .../__pycache__/w0401_cycle.cpython-37.pyc | Bin 0 -> 340 bytes .../__pycache__/w0801_same.cpython-37.pyc | Bin 0 -> 345 bytes .../test/input/func_3k_removed_stuff_py_30.py | 13 + .../test/input/func_bad_cont_dictcomp_py27.py | 38 + .../test/input/func_block_disable_msg.py | 1026 +++ .../pylint/test/input/func_bug113231.py | 24 + .../test/input/func_disable_linebased.py | 14 + .../pylint/test/input/func_dotted_ancestor.py | 11 + .../pylint/test/input/func_e0012.py | 4 + .../pylint/test/input/func_e0204.py | 20 + .../pylint/test/input/func_e12xx.py | 28 + .../pylint/test/input/func_e13xx.py | 21 + .../pylint/test/input/func_excess_escapes.py | 30 + .../pylint/test/input/func_first_arg.py | 42 + .../pylint/test/input/func_i0011.py | 4 + .../pylint/test/input/func_i0012.py | 4 + .../pylint/test/input/func_i0013.py | 8 + .../pylint/test/input/func_i0014.py | 8 + .../pylint/test/input/func_i0020.py | 8 + .../pylint/test/input/func_i0022.py | 22 + .../func_logging_not_lazy_with_logger.py | 13 + .../input/func_loopvar_in_dict_comp_py27.py | 8 + .../pylint/test/input/func_module___dict__.py | 9 + .../func_nameerror_on_string_substitution.py | 8 + .../test/input/func_no_dummy_redefined.py | 14 + ...ror___init___return_from_inner_function.py | 12 + ...r_access_attr_before_def_false_positive.py | 98 + .../test/input/func_noerror_base_init_vars.py | 35 + .../input/func_noerror_builtin_module_test.py | 11 + .../input/func_noerror_class_attributes.py | 18 + ...oerror_classes_meth_could_be_a_function.py | 33 + ...noerror_classes_protected_member_access.py | 26 + .../input/func_noerror_decorator_scope.py | 19 + ...noerror_e1101_9588_base_attr_aug_assign.py | 38 + ...func_noerror_external_classmethod_crash.py | 21 + .../test/input/func_noerror_inner_classes.py | 33 + .../func_noerror_lambda_use_before_assign.py | 8 + .../input/func_noerror_mcs_attr_access.py | 20 + .../func_noerror_new_style_class_py_30.py | 45 + .../func_noerror_no_warning_docstring.py | 42 + .../func_noerror_object_as_class_attribute.py | 18 + .../input/func_noerror_overloaded_operator.py | 21 + .../func_noerror_property_affectation_py26.py | 24 + .../input/func_noerror_yield_assign_py25.py | 21 + .../input/func_noerror_yield_return_mix.py | 8 + .../input/func_nonregr___file___global.py | 8 + .../test/input/func_return_yield_mix_py_33.py | 15 + .../func_typecheck_callfunc_assigment.py | 61 + .../test/input/func_unused_import_py30.py | 20 + ...riables_unused_name_from_wilcard_import.py | 3 + .../pylint/test/input/func_w0122_py_30.py | 12 + .../pylint/test/input/func_w0233.py | 50 + .../pylint/test/input/func_w0332_py_30.py | 4 + .../pylint/test/input/func_w0401.py | 9 + .../pylint/test/input/func_w0401_disabled.py | 9 + .../test/input/func_w0401_disabled_in_func.py | 11 + .../test/input/func_w0401_package/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 251 bytes .../__pycache__/all_the_things.cpython-37.pyc | Bin 0 -> 395 bytes .../__pycache__/thing1.cpython-37.pyc | Bin 0 -> 276 bytes .../__pycache__/thing2.cpython-37.pyc | Bin 0 -> 374 bytes .../func_w0401_package/all_the_things.py | 9 + .../test/input/func_w0401_package/thing1.py | 3 + .../test/input/func_w0401_package/thing2.py | 7 + .../pylint/test/input/func_w0404.py | 27 + .../pylint/test/input/func_w0405.py | 31 + .../pylint/test/input/func_w0406.py | 10 + .../pylint/test/input/func_w0611.py | 25 + .../pylint/test/input/func_w0612.py | 37 + .../pylint/test/input/func_w0613.py | 42 + .../pylint/test/input/func_w0623_py30.py | 16 + .../pylint/test/input/func_w0801.py | 11 + .../input/ignore_except_pass_by_default.py | 6 + .../Lib/site-packages/pylint/test/input/noext | 4 + .../pylint/test/input/not__init__.py | 1 + .../site-packages/pylint/test/input/similar1 | 22 + .../site-packages/pylint/test/input/similar2 | 22 + .../pylint/test/input/w0401_cycle.py | 9 + .../pylint/test/input/w0801_same.py | 11 + .../pylint/test/messages/builtin_module.txt | 1 + .../messages/func_3k_removed_stuff_py_30.txt | 2 + .../messages/func_bad_cont_dictcomp_py27.txt | 6 + .../test/messages/func_block_disable_msg.txt | 13 + .../pylint/test/messages/func_bug113231.txt | 2 + .../test/messages/func_disable_linebased.txt | 2 + .../messages/func_disable_linebased_py30.txt | 2 + .../test/messages/func_dotted_ancestor.txt | 1 + .../pylint/test/messages/func_e0012.txt | 1 + .../pylint/test/messages/func_e0204.txt | 3 + .../pylint/test/messages/func_e12xx.txt | 6 + .../pylint/test/messages/func_e13xx.txt | 13 + .../pylint/test/messages/func_e13xx_py30.txt | 11 + .../test/messages/func_excess_escapes.txt | 9 + .../pylint/test/messages/func_first_arg.txt | 9 + .../pylint/test/messages/func_i0011.txt | 3 + .../pylint/test/messages/func_i0012.txt | 2 + .../pylint/test/messages/func_i0013.txt | 1 + .../pylint/test/messages/func_i0014.txt | 2 + .../pylint/test/messages/func_i0020.txt | 3 + .../pylint/test/messages/func_i0022.txt | 25 + .../func_logging_not_lazy_with_logger.txt | 4 + .../func_loopvar_in_dict_comp_py27.txt | 1 + .../test/messages/func_module___dict__.txt | 1 + .../func_nameerror_on_string_substitution.txt | 2 + .../test/messages/func_no_dummy_redefined.txt | 2 + .../messages/func_nonregr___file___global.txt | 2 + .../pylint/test/messages/func_raw_escapes.txt | 3 + .../messages/func_return_yield_mix_py_33.txt | 2 + .../test/messages/func_toolonglines_py30.txt | 4 + .../func_typecheck_callfunc_assigment.txt | 3 + .../messages/func_typecheck_getattr_py30.txt | 9 + .../func_typecheck_non_callable_call.txt | 8 + .../messages/func_unicode_literal_py26.txt | 0 .../messages/func_unicode_literal_py274.txt | 1 + .../test/messages/func_unused_import_py30.txt | 1 + .../func_use_for_or_listcomp_var_py29.txt | 3 + .../func_use_for_or_listcomp_var_py30.txt | 3 + ...iables_unused_name_from_wilcard_import.txt | 4 + .../pylint/test/messages/func_w0122_py_30.txt | 5 + .../pylint/test/messages/func_w0233.txt | 6 + .../pylint/test/messages/func_w0312.txt | 2 + .../pylint/test/messages/func_w0332_py_30.txt | 1 + .../pylint/test/messages/func_w0401.txt | 3 + .../test/messages/func_w0401_disabled.txt | 2 + .../messages/func_w0401_disabled_in_func.txt | 2 + .../test/messages/func_w0401_package.txt | 2 + .../pylint/test/messages/func_w0404.txt | 5 + .../pylint/test/messages/func_w0405.txt | 4 + .../pylint/test/messages/func_w0406.txt | 1 + .../pylint/test/messages/func_w0611.txt | 1 + .../pylint/test/messages/func_w0612.txt | 6 + .../pylint/test/messages/func_w0613.txt | 5 + .../pylint/test/messages/func_w0622.txt | 2 + .../pylint/test/messages/func_w0623.txt | 11 + .../pylint/test/messages/func_w0623_py30.txt | 2 + .../pylint/test/messages/func_w0623_py_30.txt | 12 + .../pylint/test/messages/func_w0801.txt | 11 + .../messages/func_with_without_as_py25.txt | 3 + .../pylint/test/regrtest_data/.pylintrc | 4 + .../application_crash.cpython-37.pyc | Bin 0 -> 228 bytes .../__pycache__/awesome_module.cpython-37.pyc | Bin 0 -> 235 bytes .../__pycache__/classdoc_usage.cpython-37.pyc | Bin 0 -> 831 bytes .../decimal_inference.cpython-37.pyc | Bin 0 -> 509 bytes .../__pycache__/import_assign.cpython-37.pyc | Bin 0 -> 311 bytes ...t_package_subpackage_module.cpython-37.pyc | Bin 0 -> 2448 bytes .../import_something.cpython-37.pyc | Bin 0 -> 229 bytes .../__pycache__/meta.cpython-37.pyc | Bin 0 -> 197 bytes .../__pycache__/module_global.cpython-37.pyc | Bin 0 -> 290 bytes .../no_stdout_encoding.cpython-37.pyc | Bin 0 -> 504 bytes .../numarray_import.cpython-37.pyc | Bin 0 -> 318 bytes .../__pycache__/numarray_inf.cpython-37.pyc | Bin 0 -> 362 bytes .../precedence_test.cpython-37.pyc | Bin 0 -> 621 bytes ...ial_attr_scope_lookup_crash.cpython-37.pyc | Bin 0 -> 397 bytes .../test_pylintrc_comments.cpython-37.pyc | Bin 0 -> 293 bytes ...y_finally_disable_msg_crash.cpython-37.pyc | Bin 0 -> 225 bytes .../wrong_import_position.cpython-37.pyc | Bin 0 -> 516 bytes .../test/regrtest_data/absimp/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 307 bytes .../absimp/__pycache__/string.cpython-37.pyc | Bin 0 -> 397 bytes .../test/regrtest_data/absimp/string.py | 7 + .../test/regrtest_data/application_crash.py | 1 + .../test/regrtest_data/awesome_module.py | 1 + .../regrtest_data/bad_package/__init__.py | 2 + .../__pycache__/wrong.cpython-37.pyc | Bin 0 -> 377 bytes .../test/regrtest_data/bad_package/wrong.py | 5 + .../test/regrtest_data/beyond_top/__init__.py | 6 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 341 bytes .../__pycache__/data.cpython-37.pyc | Bin 0 -> 215 bytes .../test/regrtest_data/beyond_top/data.py | 1 + .../test/regrtest_data/classdoc_usage.py | 17 + .../test/regrtest_data/comments_pylintrc | 7 + .../test/regrtest_data/decimal_inference.py | 10 + .../test/regrtest_data/descriptor_crash.py | 20 + .../test/regrtest_data/dummy/__init__.py | 3 + .../dummy/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 272 bytes .../dummy/__pycache__/another.cpython-37.pyc | Bin 0 -> 212 bytes .../dummy/__pycache__/dummy.cpython-37.pyc | Bin 0 -> 208 bytes .../test/regrtest_data/dummy/another.py | 3 + .../pylint/test/regrtest_data/dummy/dummy.py | 2 + .../pylint/test/regrtest_data/dummy_plugin.rc | 6 + .../__pycache__/dummy_plugin.cpython-37.pyc | Bin 0 -> 1114 bytes .../dummy_plugin/dummy_plugin.py | 30 + .../test/regrtest_data/import_assign.py | 5 + .../import_package_subpackage_module.py | 49 + .../test/regrtest_data/import_something.py | 4 + .../regrtest_data/init_wildcard/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 237 bytes .../pylint/test/regrtest_data/meta.py | 3 + .../test/regrtest_data/module_global.py | 7 + .../test/regrtest_data/no_stdout_encoding.py | 4 + .../test/regrtest_data/numarray_import.py | 7 + .../pylint/test/regrtest_data/numarray_inf.py | 5 + .../test/regrtest_data/package/AudioTime.py | 3 + .../test/regrtest_data/package/__init__.py | 14 + .../__pycache__/AudioTime.cpython-37.pyc | Bin 0 -> 289 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 565 bytes .../package/subpackage/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 241 bytes .../__pycache__/module.cpython-37.pyc | Bin 0 -> 246 bytes .../package/subpackage/module.py | 1 + .../regrtest_data/package_all/__init__.py | 3 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 337 bytes .../__pycache__/notmissing.cpython-37.pyc | Bin 0 -> 250 bytes .../regrtest_data/package_all/notmissing.py | 2 + .../test/regrtest_data/precedence_test.py | 21 + .../test/regrtest_data/py3k-disabled.rc | 2 + .../test/regrtest_data/py3k_error_flag.py | 11 + .../regrtest_data/py3k_errors_and_warnings.py | 19 + .../special_attr_scope_lookup_crash.py | 3 + .../pylint/test/regrtest_data/syntax_error.py | 1 + .../regrtest_data/test_pylintrc_comments.py | 2 + .../try_finally_disable_msg_crash.py | 5 + .../regrtest_data/wrong_import_position.py | 11 + .../site-packages/pylint/test/test_func.py | 154 + .../pylint/test/test_functional.py | 385 + .../pylint/test/test_import_graph.py | 82 + .../site-packages/pylint/test/test_regr.py | 128 + .../site-packages/pylint/test/test_self.py | 495 + .../pylint/test/unittest_checker_base.py | 452 + .../pylint/test/unittest_checker_classes.py | 84 + .../test/unittest_checker_exceptions.py | 47 + .../pylint/test/unittest_checker_format.py | 414 + .../pylint/test/unittest_checker_imports.py | 129 + .../pylint/test/unittest_checker_logging.py | 56 + .../pylint/test/unittest_checker_misc.py | 89 + .../pylint/test/unittest_checker_python3.py | 1044 +++ .../pylint/test/unittest_checker_similar.py | 134 + .../pylint/test/unittest_checker_spelling.py | 227 + .../pylint/test/unittest_checker_stdlib.py | 107 + .../pylint/test/unittest_checker_strings.py | 20 + .../pylint/test/unittest_checker_typecheck.py | 265 + .../pylint/test/unittest_checker_variables.py | 243 + .../pylint/test/unittest_checkers_utils.py | 104 + .../pylint/test/unittest_config.py | 57 + .../pylint/test/unittest_lint.py | 781 ++ .../pylint/test/unittest_pyreverse_diadefs.py | 163 + .../test/unittest_pyreverse_inspector.py | 123 + .../pylint/test/unittest_pyreverse_writer.py | 111 + .../pylint/test/unittest_reporters_json.py | 52 + .../pylint/test/unittest_reporting.py | 81 + .../pylint/test/unittest_utils.py | 376 + venv/Lib/site-packages/pylint/testutils.py | 297 + venv/Lib/site-packages/pylint/utils.py | 1358 +++ .../pytest-3.9.1.dist-info/INSTALLER | 1 + .../pytest-3.9.1.dist-info/LICENSE | 21 + .../pytest-3.9.1.dist-info/METADATA | 163 + .../pytest-3.9.1.dist-info/RECORD | 117 + .../pytest-3.9.1.dist-info/WHEEL | 6 + .../pytest-3.9.1.dist-info/entry_points.txt | 4 + .../pytest-3.9.1.dist-info/top_level.txt | 2 + venv/Lib/site-packages/pytest.py | 82 + .../DESCRIPTION.rst | 407 + .../python_dotenv-0.9.1.dist-info/INSTALLER | 1 + .../python_dotenv-0.9.1.dist-info/METADATA | 441 + .../python_dotenv-0.9.1.dist-info/RECORD | 21 + .../python_dotenv-0.9.1.dist-info/WHEEL | 6 + .../entry_points.txt | 4 + .../metadata.json | 1 + .../top_level.txt | 1 + .../pytz-2018.5.dist-info/DESCRIPTION.rst | 589 ++ .../pytz-2018.5.dist-info/INSTALLER | 1 + .../pytz-2018.5.dist-info/LICENSE.txt | 19 + .../pytz-2018.5.dist-info/METADATA | 623 ++ .../pytz-2018.5.dist-info/RECORD | 619 ++ .../site-packages/pytz-2018.5.dist-info/WHEEL | 6 + .../pytz-2018.5.dist-info/metadata.json | 1 + .../pytz-2018.5.dist-info/top_level.txt | 1 + .../pytz-2018.5.dist-info/zip-safe | 1 + venv/Lib/site-packages/pytz/__init__.py | 1526 +++ .../pytz/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 29011 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 1857 bytes .../pytz/__pycache__/lazy.cpython-37.pyc | Bin 0 -> 5011 bytes .../pytz/__pycache__/reference.cpython-37.pyc | Bin 0 -> 3869 bytes .../pytz/__pycache__/tzfile.cpython-37.pyc | Bin 0 -> 3110 bytes .../pytz/__pycache__/tzinfo.cpython-37.pyc | Bin 0 -> 14952 bytes venv/Lib/site-packages/pytz/exceptions.py | 48 + venv/Lib/site-packages/pytz/lazy.py | 172 + venv/Lib/site-packages/pytz/reference.py | 140 + venv/Lib/site-packages/pytz/tzfile.py | 134 + venv/Lib/site-packages/pytz/tzinfo.py | 577 ++ .../pytz/zoneinfo/Africa/Abidjan | Bin 0 -> 170 bytes .../site-packages/pytz/zoneinfo/Africa/Accra | Bin 0 -> 842 bytes .../pytz/zoneinfo/Africa/Addis_Ababa | Bin 0 -> 285 bytes .../pytz/zoneinfo/Africa/Algiers | Bin 0 -> 760 bytes .../site-packages/pytz/zoneinfo/Africa/Asmara | Bin 0 -> 285 bytes .../site-packages/pytz/zoneinfo/Africa/Asmera | Bin 0 -> 285 bytes .../site-packages/pytz/zoneinfo/Africa/Bamako | Bin 0 -> 170 bytes .../site-packages/pytz/zoneinfo/Africa/Bangui | Bin 0 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Banjul | Bin 0 -> 170 bytes .../site-packages/pytz/zoneinfo/Africa/Bissau | Bin 0 -> 208 bytes .../pytz/zoneinfo/Africa/Blantyre | Bin 0 -> 171 bytes .../pytz/zoneinfo/Africa/Brazzaville | Bin 0 -> 171 bytes .../pytz/zoneinfo/Africa/Bujumbura | Bin 0 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Cairo | Bin 0 -> 1972 bytes .../pytz/zoneinfo/Africa/Casablanca | Bin 0 -> 1643 bytes .../site-packages/pytz/zoneinfo/Africa/Ceuta | Bin 0 -> 2059 bytes .../pytz/zoneinfo/Africa/Conakry | Bin 0 -> 170 bytes .../site-packages/pytz/zoneinfo/Africa/Dakar | Bin 0 -> 170 bytes .../pytz/zoneinfo/Africa/Dar_es_Salaam | Bin 0 -> 285 bytes .../pytz/zoneinfo/Africa/Djibouti | Bin 0 -> 285 bytes .../site-packages/pytz/zoneinfo/Africa/Douala | Bin 0 -> 171 bytes .../pytz/zoneinfo/Africa/El_Aaiun | Bin 0 -> 1473 bytes .../pytz/zoneinfo/Africa/Freetown | Bin 0 -> 170 bytes .../pytz/zoneinfo/Africa/Gaborone | Bin 0 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Harare | Bin 0 -> 171 bytes .../pytz/zoneinfo/Africa/Johannesburg | Bin 0 -> 271 bytes .../site-packages/pytz/zoneinfo/Africa/Juba | Bin 0 -> 683 bytes .../pytz/zoneinfo/Africa/Kampala | Bin 0 -> 285 bytes .../pytz/zoneinfo/Africa/Khartoum | Bin 0 -> 713 bytes .../site-packages/pytz/zoneinfo/Africa/Kigali | Bin 0 -> 171 bytes .../pytz/zoneinfo/Africa/Kinshasa | Bin 0 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Lagos | Bin 0 -> 171 bytes .../pytz/zoneinfo/Africa/Libreville | Bin 0 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Lome | Bin 0 -> 170 bytes .../site-packages/pytz/zoneinfo/Africa/Luanda | Bin 0 -> 171 bytes .../pytz/zoneinfo/Africa/Lubumbashi | Bin 0 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Lusaka | Bin 0 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Malabo | Bin 0 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Maputo | Bin 0 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Maseru | Bin 0 -> 271 bytes .../pytz/zoneinfo/Africa/Mbabane | Bin 0 -> 271 bytes .../pytz/zoneinfo/Africa/Mogadishu | Bin 0 -> 285 bytes .../pytz/zoneinfo/Africa/Monrovia | Bin 0 -> 233 bytes .../pytz/zoneinfo/Africa/Nairobi | Bin 0 -> 285 bytes .../pytz/zoneinfo/Africa/Ndjamena | Bin 0 -> 225 bytes .../site-packages/pytz/zoneinfo/Africa/Niamey | Bin 0 -> 171 bytes .../pytz/zoneinfo/Africa/Nouakchott | Bin 0 -> 170 bytes .../pytz/zoneinfo/Africa/Ouagadougou | Bin 0 -> 170 bytes .../pytz/zoneinfo/Africa/Porto-Novo | Bin 0 -> 171 bytes .../pytz/zoneinfo/Africa/Sao_Tome | Bin 0 -> 234 bytes .../pytz/zoneinfo/Africa/Timbuktu | Bin 0 -> 170 bytes .../pytz/zoneinfo/Africa/Tripoli | Bin 0 -> 655 bytes .../site-packages/pytz/zoneinfo/Africa/Tunis | Bin 0 -> 710 bytes .../pytz/zoneinfo/Africa/Windhoek | Bin 0 -> 988 bytes .../site-packages/pytz/zoneinfo/America/Adak | Bin 0 -> 2365 bytes .../pytz/zoneinfo/America/Anchorage | Bin 0 -> 2380 bytes .../pytz/zoneinfo/America/Anguilla | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/Antigua | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/Araguaina | Bin 0 -> 910 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 0 -> 1109 bytes .../pytz/zoneinfo/America/Argentina/Catamarca | Bin 0 -> 1109 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 0 -> 1109 bytes .../pytz/zoneinfo/America/Argentina/Cordoba | Bin 0 -> 1109 bytes .../pytz/zoneinfo/America/Argentina/Jujuy | Bin 0 -> 1081 bytes .../pytz/zoneinfo/America/Argentina/La_Rioja | Bin 0 -> 1123 bytes .../pytz/zoneinfo/America/Argentina/Mendoza | Bin 0 -> 1109 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 0 -> 1109 bytes .../pytz/zoneinfo/America/Argentina/Salta | Bin 0 -> 1081 bytes .../pytz/zoneinfo/America/Argentina/San_Juan | Bin 0 -> 1123 bytes .../pytz/zoneinfo/America/Argentina/San_Luis | Bin 0 -> 1139 bytes .../pytz/zoneinfo/America/Argentina/Tucuman | Bin 0 -> 1137 bytes .../pytz/zoneinfo/America/Argentina/Ushuaia | Bin 0 -> 1109 bytes .../site-packages/pytz/zoneinfo/America/Aruba | Bin 0 -> 212 bytes .../pytz/zoneinfo/America/Asuncion | Bin 0 -> 2077 bytes .../pytz/zoneinfo/America/Atikokan | Bin 0 -> 345 bytes .../site-packages/pytz/zoneinfo/America/Atka | Bin 0 -> 2365 bytes .../site-packages/pytz/zoneinfo/America/Bahia | Bin 0 -> 1050 bytes .../pytz/zoneinfo/America/Bahia_Banderas | Bin 0 -> 1588 bytes .../pytz/zoneinfo/America/Barbados | Bin 0 -> 344 bytes .../site-packages/pytz/zoneinfo/America/Belem | Bin 0 -> 602 bytes .../pytz/zoneinfo/America/Belize | Bin 0 -> 978 bytes .../pytz/zoneinfo/America/Blanc-Sablon | Bin 0 -> 307 bytes .../pytz/zoneinfo/America/Boa_Vista | Bin 0 -> 658 bytes .../pytz/zoneinfo/America/Bogota | Bin 0 -> 271 bytes .../site-packages/pytz/zoneinfo/America/Boise | Bin 0 -> 2403 bytes .../pytz/zoneinfo/America/Buenos_Aires | Bin 0 -> 1109 bytes .../pytz/zoneinfo/America/Cambridge_Bay | Bin 0 -> 2098 bytes .../pytz/zoneinfo/America/Campo_Grande | Bin 0 -> 2016 bytes .../pytz/zoneinfo/America/Cancun | Bin 0 -> 816 bytes .../pytz/zoneinfo/America/Caracas | Bin 0 -> 289 bytes .../pytz/zoneinfo/America/Catamarca | Bin 0 -> 1109 bytes .../pytz/zoneinfo/America/Cayenne | Bin 0 -> 224 bytes .../pytz/zoneinfo/America/Cayman | Bin 0 -> 203 bytes .../pytz/zoneinfo/America/Chicago | Bin 0 -> 3585 bytes .../pytz/zoneinfo/America/Chihuahua | Bin 0 -> 1522 bytes .../pytz/zoneinfo/America/Coral_Harbour | Bin 0 -> 345 bytes .../pytz/zoneinfo/America/Cordoba | Bin 0 -> 1109 bytes .../pytz/zoneinfo/America/Costa_Rica | Bin 0 -> 341 bytes .../pytz/zoneinfo/America/Creston | Bin 0 -> 233 bytes .../pytz/zoneinfo/America/Cuiaba | Bin 0 -> 1988 bytes .../pytz/zoneinfo/America/Curacao | Bin 0 -> 212 bytes .../pytz/zoneinfo/America/Danmarkshavn | Bin 0 -> 712 bytes .../pytz/zoneinfo/America/Dawson | Bin 0 -> 2093 bytes .../pytz/zoneinfo/America/Dawson_Creek | Bin 0 -> 1059 bytes .../pytz/zoneinfo/America/Denver | Bin 0 -> 2453 bytes .../pytz/zoneinfo/America/Detroit | Bin 0 -> 2188 bytes .../pytz/zoneinfo/America/Dominica | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/Edmonton | Bin 0 -> 2402 bytes .../pytz/zoneinfo/America/Eirunepe | Bin 0 -> 690 bytes .../pytz/zoneinfo/America/El_Salvador | Bin 0 -> 250 bytes .../pytz/zoneinfo/America/Ensenada | Bin 0 -> 2356 bytes .../pytz/zoneinfo/America/Fort_Nelson | Bin 0 -> 2249 bytes .../pytz/zoneinfo/America/Fort_Wayne | Bin 0 -> 1675 bytes .../pytz/zoneinfo/America/Fortaleza | Bin 0 -> 742 bytes .../pytz/zoneinfo/America/Glace_Bay | Bin 0 -> 2206 bytes .../pytz/zoneinfo/America/Godthab | Bin 0 -> 1892 bytes .../pytz/zoneinfo/America/Goose_Bay | Bin 0 -> 3219 bytes .../pytz/zoneinfo/America/Grand_Turk | Bin 0 -> 1881 bytes .../pytz/zoneinfo/America/Grenada | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/Guadeloupe | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/Guatemala | Bin 0 -> 306 bytes .../pytz/zoneinfo/America/Guayaquil | Bin 0 -> 271 bytes .../pytz/zoneinfo/America/Guyana | Bin 0 -> 266 bytes .../pytz/zoneinfo/America/Halifax | Bin 0 -> 3438 bytes .../pytz/zoneinfo/America/Havana | Bin 0 -> 2437 bytes .../pytz/zoneinfo/America/Hermosillo | Bin 0 -> 454 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 0 -> 1675 bytes .../pytz/zoneinfo/America/Indiana/Knox | Bin 0 -> 2437 bytes .../pytz/zoneinfo/America/Indiana/Marengo | Bin 0 -> 1731 bytes .../pytz/zoneinfo/America/Indiana/Petersburg | Bin 0 -> 1913 bytes .../pytz/zoneinfo/America/Indiana/Tell_City | Bin 0 -> 1735 bytes .../pytz/zoneinfo/America/Indiana/Vevay | Bin 0 -> 1423 bytes .../pytz/zoneinfo/America/Indiana/Vincennes | Bin 0 -> 1703 bytes .../pytz/zoneinfo/America/Indiana/Winamac | Bin 0 -> 1787 bytes .../pytz/zoneinfo/America/Indianapolis | Bin 0 -> 1675 bytes .../pytz/zoneinfo/America/Inuvik | Bin 0 -> 1928 bytes .../pytz/zoneinfo/America/Iqaluit | Bin 0 -> 2046 bytes .../pytz/zoneinfo/America/Jamaica | Bin 0 -> 507 bytes .../site-packages/pytz/zoneinfo/America/Jujuy | Bin 0 -> 1081 bytes .../pytz/zoneinfo/America/Juneau | Bin 0 -> 2362 bytes .../pytz/zoneinfo/America/Kentucky/Louisville | Bin 0 -> 2781 bytes .../pytz/zoneinfo/America/Kentucky/Monticello | Bin 0 -> 2361 bytes .../pytz/zoneinfo/America/Knox_IN | Bin 0 -> 2437 bytes .../pytz/zoneinfo/America/Kralendijk | Bin 0 -> 212 bytes .../pytz/zoneinfo/America/La_Paz | Bin 0 -> 257 bytes .../site-packages/pytz/zoneinfo/America/Lima | Bin 0 -> 431 bytes .../pytz/zoneinfo/America/Los_Angeles | Bin 0 -> 2845 bytes .../pytz/zoneinfo/America/Louisville | Bin 0 -> 2781 bytes .../pytz/zoneinfo/America/Lower_Princes | Bin 0 -> 212 bytes .../pytz/zoneinfo/America/Maceio | Bin 0 -> 770 bytes .../pytz/zoneinfo/America/Managua | Bin 0 -> 463 bytes .../pytz/zoneinfo/America/Manaus | Bin 0 -> 630 bytes .../pytz/zoneinfo/America/Marigot | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/Martinique | Bin 0 -> 257 bytes .../pytz/zoneinfo/America/Matamoros | Bin 0 -> 1416 bytes .../pytz/zoneinfo/America/Mazatlan | Bin 0 -> 1564 bytes .../pytz/zoneinfo/America/Mendoza | Bin 0 -> 1109 bytes .../pytz/zoneinfo/America/Menominee | Bin 0 -> 2283 bytes .../pytz/zoneinfo/America/Merida | Bin 0 -> 1456 bytes .../pytz/zoneinfo/America/Metlakatla | Bin 0 -> 1418 bytes .../pytz/zoneinfo/America/Mexico_City | Bin 0 -> 1618 bytes .../pytz/zoneinfo/America/Miquelon | Bin 0 -> 1696 bytes .../pytz/zoneinfo/America/Moncton | Bin 0 -> 3163 bytes .../pytz/zoneinfo/America/Monterrey | Bin 0 -> 1416 bytes .../pytz/zoneinfo/America/Montevideo | Bin 0 -> 1564 bytes .../pytz/zoneinfo/America/Montreal | Bin 0 -> 3503 bytes .../pytz/zoneinfo/America/Montserrat | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/Nassau | Bin 0 -> 2284 bytes .../pytz/zoneinfo/America/New_York | Bin 0 -> 3545 bytes .../pytz/zoneinfo/America/Nipigon | Bin 0 -> 2131 bytes .../site-packages/pytz/zoneinfo/America/Nome | Bin 0 -> 2376 bytes .../pytz/zoneinfo/America/Noronha | Bin 0 -> 742 bytes .../pytz/zoneinfo/America/North_Dakota/Beulah | Bin 0 -> 2389 bytes .../pytz/zoneinfo/America/North_Dakota/Center | Bin 0 -> 2389 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 0 -> 2389 bytes .../pytz/zoneinfo/America/Ojinaga | Bin 0 -> 1522 bytes .../pytz/zoneinfo/America/Panama | Bin 0 -> 203 bytes .../pytz/zoneinfo/America/Pangnirtung | Bin 0 -> 2108 bytes .../pytz/zoneinfo/America/Paramaribo | Bin 0 -> 296 bytes .../pytz/zoneinfo/America/Phoenix | Bin 0 -> 353 bytes .../pytz/zoneinfo/America/Port-au-Prince | Bin 0 -> 1455 bytes .../pytz/zoneinfo/America/Port_of_Spain | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/Porto_Acre | Bin 0 -> 662 bytes .../pytz/zoneinfo/America/Porto_Velho | Bin 0 -> 602 bytes .../pytz/zoneinfo/America/Puerto_Rico | Bin 0 -> 255 bytes .../pytz/zoneinfo/America/Punta_Arenas | Bin 0 -> 1911 bytes .../pytz/zoneinfo/America/Rainy_River | Bin 0 -> 2131 bytes .../pytz/zoneinfo/America/Rankin_Inlet | Bin 0 -> 1930 bytes .../pytz/zoneinfo/America/Recife | Bin 0 -> 742 bytes .../pytz/zoneinfo/America/Regina | Bin 0 -> 994 bytes .../pytz/zoneinfo/America/Resolute | Bin 0 -> 1930 bytes .../pytz/zoneinfo/America/Rio_Branco | Bin 0 -> 662 bytes .../pytz/zoneinfo/America/Rosario | Bin 0 -> 1109 bytes .../pytz/zoneinfo/America/Santa_Isabel | Bin 0 -> 2356 bytes .../pytz/zoneinfo/America/Santarem | Bin 0 -> 632 bytes .../pytz/zoneinfo/America/Santiago | Bin 0 -> 2538 bytes .../pytz/zoneinfo/America/Santo_Domingo | Bin 0 -> 491 bytes .../pytz/zoneinfo/America/Sao_Paulo | Bin 0 -> 2016 bytes .../pytz/zoneinfo/America/Scoresbysund | Bin 0 -> 1930 bytes .../pytz/zoneinfo/America/Shiprock | Bin 0 -> 2453 bytes .../site-packages/pytz/zoneinfo/America/Sitka | Bin 0 -> 2350 bytes .../pytz/zoneinfo/America/St_Barthelemy | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/St_Johns | Bin 0 -> 3664 bytes .../pytz/zoneinfo/America/St_Kitts | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/St_Lucia | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/St_Thomas | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/St_Vincent | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/Swift_Current | Bin 0 -> 574 bytes .../pytz/zoneinfo/America/Tegucigalpa | Bin 0 -> 278 bytes .../site-packages/pytz/zoneinfo/America/Thule | Bin 0 -> 1528 bytes .../pytz/zoneinfo/America/Thunder_Bay | Bin 0 -> 2211 bytes .../pytz/zoneinfo/America/Tijuana | Bin 0 -> 2356 bytes .../pytz/zoneinfo/America/Toronto | Bin 0 -> 3503 bytes .../pytz/zoneinfo/America/Tortola | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/Vancouver | Bin 0 -> 2901 bytes .../pytz/zoneinfo/America/Virgin | Bin 0 -> 170 bytes .../pytz/zoneinfo/America/Whitehorse | Bin 0 -> 2093 bytes .../pytz/zoneinfo/America/Winnipeg | Bin 0 -> 2891 bytes .../pytz/zoneinfo/America/Yakutat | Bin 0 -> 2314 bytes .../pytz/zoneinfo/America/Yellowknife | Bin 0 -> 1980 bytes .../pytz/zoneinfo/Antarctica/Casey | Bin 0 -> 311 bytes .../pytz/zoneinfo/Antarctica/Davis | Bin 0 -> 311 bytes .../pytz/zoneinfo/Antarctica/DumontDUrville | Bin 0 -> 216 bytes .../pytz/zoneinfo/Antarctica/Macquarie | Bin 0 -> 1543 bytes .../pytz/zoneinfo/Antarctica/Mawson | Bin 0 -> 225 bytes .../pytz/zoneinfo/Antarctica/McMurdo | Bin 0 -> 2460 bytes .../pytz/zoneinfo/Antarctica/Palmer | Bin 0 -> 1432 bytes .../pytz/zoneinfo/Antarctica/Rothera | Bin 0 -> 186 bytes .../pytz/zoneinfo/Antarctica/South_Pole | Bin 0 -> 2460 bytes .../pytz/zoneinfo/Antarctica/Syowa | Bin 0 -> 187 bytes .../pytz/zoneinfo/Antarctica/Troll | Bin 0 -> 1176 bytes .../pytz/zoneinfo/Antarctica/Vostok | Bin 0 -> 187 bytes .../pytz/zoneinfo/Arctic/Longyearbyen | Bin 0 -> 2251 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Aden | Bin 0 -> 187 bytes .../site-packages/pytz/zoneinfo/Asia/Almaty | Bin 0 -> 1031 bytes .../site-packages/pytz/zoneinfo/Asia/Amman | Bin 0 -> 1877 bytes .../site-packages/pytz/zoneinfo/Asia/Anadyr | Bin 0 -> 1222 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtau | Bin 0 -> 1017 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtobe | Bin 0 -> 1047 bytes .../site-packages/pytz/zoneinfo/Asia/Ashgabat | Bin 0 -> 651 bytes .../pytz/zoneinfo/Asia/Ashkhabad | Bin 0 -> 651 bytes .../site-packages/pytz/zoneinfo/Asia/Atyrau | Bin 0 -> 1025 bytes .../site-packages/pytz/zoneinfo/Asia/Baghdad | Bin 0 -> 1004 bytes .../site-packages/pytz/zoneinfo/Asia/Bahrain | Bin 0 -> 225 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Baku | Bin 0 -> 1269 bytes .../site-packages/pytz/zoneinfo/Asia/Bangkok | Bin 0 -> 220 bytes .../site-packages/pytz/zoneinfo/Asia/Barnaul | Bin 0 -> 1255 bytes .../site-packages/pytz/zoneinfo/Asia/Beirut | Bin 0 -> 2175 bytes .../site-packages/pytz/zoneinfo/Asia/Bishkek | Bin 0 -> 1045 bytes .../site-packages/pytz/zoneinfo/Asia/Brunei | Bin 0 -> 229 bytes .../site-packages/pytz/zoneinfo/Asia/Calcutta | Bin 0 -> 312 bytes .../site-packages/pytz/zoneinfo/Asia/Chita | Bin 0 -> 1257 bytes .../pytz/zoneinfo/Asia/Choibalsan | Bin 0 -> 991 bytes .../pytz/zoneinfo/Asia/Chongqing | Bin 0 -> 414 bytes .../pytz/zoneinfo/Asia/Chungking | Bin 0 -> 414 bytes .../site-packages/pytz/zoneinfo/Asia/Colombo | Bin 0 -> 413 bytes .../site-packages/pytz/zoneinfo/Asia/Dacca | Bin 0 -> 370 bytes .../site-packages/pytz/zoneinfo/Asia/Damascus | Bin 0 -> 2320 bytes .../site-packages/pytz/zoneinfo/Asia/Dhaka | Bin 0 -> 370 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Dili | Bin 0 -> 253 bytes .../site-packages/pytz/zoneinfo/Asia/Dubai | Bin 0 -> 187 bytes .../site-packages/pytz/zoneinfo/Asia/Dushanbe | Bin 0 -> 621 bytes .../pytz/zoneinfo/Asia/Famagusta | Bin 0 -> 2042 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Gaza | Bin 0 -> 2295 bytes .../site-packages/pytz/zoneinfo/Asia/Harbin | Bin 0 -> 414 bytes .../site-packages/pytz/zoneinfo/Asia/Hebron | Bin 0 -> 2323 bytes .../pytz/zoneinfo/Asia/Ho_Chi_Minh | Bin 0 -> 389 bytes .../pytz/zoneinfo/Asia/Hong_Kong | Bin 0 -> 1189 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Hovd | Bin 0 -> 921 bytes .../site-packages/pytz/zoneinfo/Asia/Irkutsk | Bin 0 -> 1276 bytes .../site-packages/pytz/zoneinfo/Asia/Istanbul | Bin 0 -> 2166 bytes .../site-packages/pytz/zoneinfo/Asia/Jakarta | Bin 0 -> 392 bytes .../site-packages/pytz/zoneinfo/Asia/Jayapura | Bin 0 -> 251 bytes .../pytz/zoneinfo/Asia/Jerusalem | Bin 0 -> 2265 bytes .../site-packages/pytz/zoneinfo/Asia/Kabul | Bin 0 -> 229 bytes .../pytz/zoneinfo/Asia/Kamchatka | Bin 0 -> 1198 bytes .../site-packages/pytz/zoneinfo/Asia/Karachi | Bin 0 -> 417 bytes .../site-packages/pytz/zoneinfo/Asia/Kashgar | Bin 0 -> 187 bytes .../pytz/zoneinfo/Asia/Kathmandu | Bin 0 -> 238 bytes .../site-packages/pytz/zoneinfo/Asia/Katmandu | Bin 0 -> 238 bytes .../site-packages/pytz/zoneinfo/Asia/Khandyga | Bin 0 -> 1311 bytes .../site-packages/pytz/zoneinfo/Asia/Kolkata | Bin 0 -> 312 bytes .../pytz/zoneinfo/Asia/Krasnoyarsk | Bin 0 -> 1243 bytes .../pytz/zoneinfo/Asia/Kuala_Lumpur | Bin 0 -> 424 bytes .../site-packages/pytz/zoneinfo/Asia/Kuching | Bin 0 -> 521 bytes .../site-packages/pytz/zoneinfo/Asia/Kuwait | Bin 0 -> 187 bytes .../site-packages/pytz/zoneinfo/Asia/Macao | Bin 0 -> 771 bytes .../site-packages/pytz/zoneinfo/Asia/Macau | Bin 0 -> 771 bytes .../site-packages/pytz/zoneinfo/Asia/Magadan | Bin 0 -> 1258 bytes .../site-packages/pytz/zoneinfo/Asia/Makassar | Bin 0 -> 288 bytes .../site-packages/pytz/zoneinfo/Asia/Manila | Bin 0 -> 367 bytes .../site-packages/pytz/zoneinfo/Asia/Muscat | Bin 0 -> 187 bytes .../site-packages/pytz/zoneinfo/Asia/Nicosia | Bin 0 -> 2016 bytes .../pytz/zoneinfo/Asia/Novokuznetsk | Bin 0 -> 1197 bytes .../pytz/zoneinfo/Asia/Novosibirsk | Bin 0 -> 1255 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Omsk | Bin 0 -> 1243 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Oral | Bin 0 -> 1039 bytes .../pytz/zoneinfo/Asia/Phnom_Penh | Bin 0 -> 220 bytes .../pytz/zoneinfo/Asia/Pontianak | Bin 0 -> 395 bytes .../pytz/zoneinfo/Asia/Pyongyang | Bin 0 -> 267 bytes .../site-packages/pytz/zoneinfo/Asia/Qatar | Bin 0 -> 225 bytes .../pytz/zoneinfo/Asia/Qyzylorda | Bin 0 -> 1047 bytes .../site-packages/pytz/zoneinfo/Asia/Rangoon | Bin 0 -> 297 bytes .../site-packages/pytz/zoneinfo/Asia/Riyadh | Bin 0 -> 187 bytes .../site-packages/pytz/zoneinfo/Asia/Saigon | Bin 0 -> 389 bytes .../site-packages/pytz/zoneinfo/Asia/Sakhalin | Bin 0 -> 1234 bytes .../pytz/zoneinfo/Asia/Samarkand | Bin 0 -> 619 bytes .../site-packages/pytz/zoneinfo/Asia/Seoul | Bin 0 -> 531 bytes .../site-packages/pytz/zoneinfo/Asia/Shanghai | Bin 0 -> 414 bytes .../pytz/zoneinfo/Asia/Singapore | Bin 0 -> 424 bytes .../pytz/zoneinfo/Asia/Srednekolymsk | Bin 0 -> 1244 bytes .../site-packages/pytz/zoneinfo/Asia/Taipei | Bin 0 -> 790 bytes .../site-packages/pytz/zoneinfo/Asia/Tashkent | Bin 0 -> 635 bytes .../site-packages/pytz/zoneinfo/Asia/Tbilisi | Bin 0 -> 1080 bytes .../site-packages/pytz/zoneinfo/Asia/Tehran | Bin 0 -> 1718 bytes .../site-packages/pytz/zoneinfo/Asia/Tel_Aviv | Bin 0 -> 2265 bytes .../site-packages/pytz/zoneinfo/Asia/Thimbu | Bin 0 -> 229 bytes .../site-packages/pytz/zoneinfo/Asia/Thimphu | Bin 0 -> 229 bytes .../site-packages/pytz/zoneinfo/Asia/Tokyo | Bin 0 -> 318 bytes .../site-packages/pytz/zoneinfo/Asia/Tomsk | Bin 0 -> 1255 bytes .../pytz/zoneinfo/Asia/Ujung_Pandang | Bin 0 -> 288 bytes .../pytz/zoneinfo/Asia/Ulaanbaatar | Bin 0 -> 921 bytes .../pytz/zoneinfo/Asia/Ulan_Bator | Bin 0 -> 921 bytes .../site-packages/pytz/zoneinfo/Asia/Urumqi | Bin 0 -> 187 bytes .../site-packages/pytz/zoneinfo/Asia/Ust-Nera | Bin 0 -> 1290 bytes .../pytz/zoneinfo/Asia/Vientiane | Bin 0 -> 220 bytes .../pytz/zoneinfo/Asia/Vladivostok | Bin 0 -> 1244 bytes .../site-packages/pytz/zoneinfo/Asia/Yakutsk | Bin 0 -> 1243 bytes .../site-packages/pytz/zoneinfo/Asia/Yangon | Bin 0 -> 297 bytes .../pytz/zoneinfo/Asia/Yekaterinburg | Bin 0 -> 1281 bytes .../site-packages/pytz/zoneinfo/Asia/Yerevan | Bin 0 -> 1213 bytes .../pytz/zoneinfo/Atlantic/Azores | Bin 0 -> 3493 bytes .../pytz/zoneinfo/Atlantic/Bermuda | Bin 0 -> 2004 bytes .../pytz/zoneinfo/Atlantic/Canary | Bin 0 -> 1911 bytes .../pytz/zoneinfo/Atlantic/Cape_Verde | Bin 0 -> 284 bytes .../pytz/zoneinfo/Atlantic/Faeroe | Bin 0 -> 1829 bytes .../pytz/zoneinfo/Atlantic/Faroe | Bin 0 -> 1829 bytes .../pytz/zoneinfo/Atlantic/Jan_Mayen | Bin 0 -> 2251 bytes .../pytz/zoneinfo/Atlantic/Madeira | Bin 0 -> 3484 bytes .../pytz/zoneinfo/Atlantic/Reykjavik | Bin 0 -> 1188 bytes .../pytz/zoneinfo/Atlantic/South_Georgia | Bin 0 -> 181 bytes .../pytz/zoneinfo/Atlantic/St_Helena | Bin 0 -> 170 bytes .../pytz/zoneinfo/Atlantic/Stanley | Bin 0 -> 1251 bytes .../site-packages/pytz/zoneinfo/Australia/ACT | Bin 0 -> 2223 bytes .../pytz/zoneinfo/Australia/Adelaide | Bin 0 -> 2238 bytes .../pytz/zoneinfo/Australia/Brisbane | Bin 0 -> 452 bytes .../pytz/zoneinfo/Australia/Broken_Hill | Bin 0 -> 2274 bytes .../pytz/zoneinfo/Australia/Canberra | Bin 0 -> 2223 bytes .../pytz/zoneinfo/Australia/Currie | Bin 0 -> 2223 bytes .../pytz/zoneinfo/Australia/Darwin | Bin 0 -> 323 bytes .../pytz/zoneinfo/Australia/Eucla | Bin 0 -> 503 bytes .../pytz/zoneinfo/Australia/Hobart | Bin 0 -> 2335 bytes .../site-packages/pytz/zoneinfo/Australia/LHI | Bin 0 -> 1889 bytes .../pytz/zoneinfo/Australia/Lindeman | Bin 0 -> 522 bytes .../pytz/zoneinfo/Australia/Lord_Howe | Bin 0 -> 1889 bytes .../pytz/zoneinfo/Australia/Melbourne | Bin 0 -> 2223 bytes .../site-packages/pytz/zoneinfo/Australia/NSW | Bin 0 -> 2223 bytes .../pytz/zoneinfo/Australia/North | Bin 0 -> 323 bytes .../pytz/zoneinfo/Australia/Perth | Bin 0 -> 479 bytes .../pytz/zoneinfo/Australia/Queensland | Bin 0 -> 452 bytes .../pytz/zoneinfo/Australia/South | Bin 0 -> 2238 bytes .../pytz/zoneinfo/Australia/Sydney | Bin 0 -> 2223 bytes .../pytz/zoneinfo/Australia/Tasmania | Bin 0 -> 2335 bytes .../pytz/zoneinfo/Australia/Victoria | Bin 0 -> 2223 bytes .../pytz/zoneinfo/Australia/West | Bin 0 -> 479 bytes .../pytz/zoneinfo/Australia/Yancowinna | Bin 0 -> 2274 bytes .../site-packages/pytz/zoneinfo/Brazil/Acre | Bin 0 -> 662 bytes .../pytz/zoneinfo/Brazil/DeNoronha | Bin 0 -> 742 bytes .../site-packages/pytz/zoneinfo/Brazil/East | Bin 0 -> 2016 bytes .../site-packages/pytz/zoneinfo/Brazil/West | Bin 0 -> 630 bytes venv/Lib/site-packages/pytz/zoneinfo/CET | Bin 0 -> 2102 bytes venv/Lib/site-packages/pytz/zoneinfo/CST6CDT | Bin 0 -> 2294 bytes .../pytz/zoneinfo/Canada/Atlantic | Bin 0 -> 3438 bytes .../pytz/zoneinfo/Canada/Central | Bin 0 -> 2891 bytes .../pytz/zoneinfo/Canada/Eastern | Bin 0 -> 3503 bytes .../pytz/zoneinfo/Canada/Mountain | Bin 0 -> 2402 bytes .../pytz/zoneinfo/Canada/Newfoundland | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Canada/Pacific | Bin 0 -> 2901 bytes .../pytz/zoneinfo/Canada/Saskatchewan | Bin 0 -> 994 bytes .../site-packages/pytz/zoneinfo/Canada/Yukon | Bin 0 -> 2093 bytes .../pytz/zoneinfo/Chile/Continental | Bin 0 -> 2538 bytes .../pytz/zoneinfo/Chile/EasterIsland | Bin 0 -> 2242 bytes venv/Lib/site-packages/pytz/zoneinfo/Cuba | Bin 0 -> 2437 bytes venv/Lib/site-packages/pytz/zoneinfo/EET | Bin 0 -> 1876 bytes venv/Lib/site-packages/pytz/zoneinfo/EST | Bin 0 -> 127 bytes venv/Lib/site-packages/pytz/zoneinfo/EST5EDT | Bin 0 -> 2294 bytes venv/Lib/site-packages/pytz/zoneinfo/Egypt | Bin 0 -> 1972 bytes venv/Lib/site-packages/pytz/zoneinfo/Eire | Bin 0 -> 3531 bytes venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT | Bin 0 -> 127 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+0 | Bin 0 -> 127 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+1 | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+10 | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+11 | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+12 | Bin 0 -> 149 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+2 | Bin 0 -> 148 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+3 | Bin 0 -> 148 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+4 | Bin 0 -> 148 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+5 | Bin 0 -> 148 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+6 | Bin 0 -> 148 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+7 | Bin 0 -> 148 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+8 | Bin 0 -> 148 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+9 | Bin 0 -> 148 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-0 | Bin 0 -> 127 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-1 | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-10 | Bin 0 -> 150 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-11 | Bin 0 -> 150 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-12 | Bin 0 -> 150 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-13 | Bin 0 -> 150 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-14 | Bin 0 -> 150 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-2 | Bin 0 -> 149 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-3 | Bin 0 -> 149 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-4 | Bin 0 -> 149 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-5 | Bin 0 -> 149 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-6 | Bin 0 -> 149 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-7 | Bin 0 -> 149 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-8 | Bin 0 -> 149 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-9 | Bin 0 -> 149 bytes venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT0 | Bin 0 -> 127 bytes .../site-packages/pytz/zoneinfo/Etc/Greenwich | Bin 0 -> 127 bytes venv/Lib/site-packages/pytz/zoneinfo/Etc/UCT | Bin 0 -> 127 bytes venv/Lib/site-packages/pytz/zoneinfo/Etc/UTC | Bin 0 -> 127 bytes .../site-packages/pytz/zoneinfo/Etc/Universal | Bin 0 -> 127 bytes venv/Lib/site-packages/pytz/zoneinfo/Etc/Zulu | Bin 0 -> 127 bytes .../pytz/zoneinfo/Europe/Amsterdam | Bin 0 -> 2949 bytes .../pytz/zoneinfo/Europe/Andorra | Bin 0 -> 1751 bytes .../pytz/zoneinfo/Europe/Astrakhan | Bin 0 -> 1197 bytes .../site-packages/pytz/zoneinfo/Europe/Athens | Bin 0 -> 2271 bytes .../pytz/zoneinfo/Europe/Belfast | Bin 0 -> 3687 bytes .../pytz/zoneinfo/Europe/Belgrade | Bin 0 -> 1957 bytes .../site-packages/pytz/zoneinfo/Europe/Berlin | Bin 0 -> 2335 bytes .../pytz/zoneinfo/Europe/Bratislava | Bin 0 -> 2338 bytes .../pytz/zoneinfo/Europe/Brussels | Bin 0 -> 2970 bytes .../pytz/zoneinfo/Europe/Bucharest | Bin 0 -> 2221 bytes .../pytz/zoneinfo/Europe/Budapest | Bin 0 -> 2405 bytes .../pytz/zoneinfo/Europe/Busingen | Bin 0 -> 1918 bytes .../pytz/zoneinfo/Europe/Chisinau | Bin 0 -> 2445 bytes .../pytz/zoneinfo/Europe/Copenhagen | Bin 0 -> 2160 bytes .../site-packages/pytz/zoneinfo/Europe/Dublin | Bin 0 -> 3531 bytes .../pytz/zoneinfo/Europe/Gibraltar | Bin 0 -> 3061 bytes .../pytz/zoneinfo/Europe/Guernsey | Bin 0 -> 3687 bytes .../pytz/zoneinfo/Europe/Helsinki | Bin 0 -> 1909 bytes .../pytz/zoneinfo/Europe/Isle_of_Man | Bin 0 -> 3687 bytes .../pytz/zoneinfo/Europe/Istanbul | Bin 0 -> 2166 bytes .../site-packages/pytz/zoneinfo/Europe/Jersey | Bin 0 -> 3687 bytes .../pytz/zoneinfo/Europe/Kaliningrad | Bin 0 -> 1518 bytes .../site-packages/pytz/zoneinfo/Europe/Kiev | Bin 0 -> 2097 bytes .../site-packages/pytz/zoneinfo/Europe/Kirov | Bin 0 -> 1167 bytes .../site-packages/pytz/zoneinfo/Europe/Lisbon | Bin 0 -> 3469 bytes .../pytz/zoneinfo/Europe/Ljubljana | Bin 0 -> 1957 bytes .../site-packages/pytz/zoneinfo/Europe/London | Bin 0 -> 3687 bytes .../pytz/zoneinfo/Europe/Luxembourg | Bin 0 -> 2974 bytes .../site-packages/pytz/zoneinfo/Europe/Madrid | Bin 0 -> 2637 bytes .../site-packages/pytz/zoneinfo/Europe/Malta | Bin 0 -> 2629 bytes .../pytz/zoneinfo/Europe/Mariehamn | Bin 0 -> 1909 bytes .../site-packages/pytz/zoneinfo/Europe/Minsk | Bin 0 -> 1370 bytes .../site-packages/pytz/zoneinfo/Europe/Monaco | Bin 0 -> 2953 bytes .../site-packages/pytz/zoneinfo/Europe/Moscow | Bin 0 -> 1544 bytes .../pytz/zoneinfo/Europe/Nicosia | Bin 0 -> 2016 bytes .../site-packages/pytz/zoneinfo/Europe/Oslo | Bin 0 -> 2251 bytes .../site-packages/pytz/zoneinfo/Europe/Paris | Bin 0 -> 2971 bytes .../pytz/zoneinfo/Europe/Podgorica | Bin 0 -> 1957 bytes .../site-packages/pytz/zoneinfo/Europe/Prague | Bin 0 -> 2338 bytes .../site-packages/pytz/zoneinfo/Europe/Riga | Bin 0 -> 2235 bytes .../site-packages/pytz/zoneinfo/Europe/Rome | Bin 0 -> 2692 bytes .../site-packages/pytz/zoneinfo/Europe/Samara | Bin 0 -> 1253 bytes .../pytz/zoneinfo/Europe/San_Marino | Bin 0 -> 2692 bytes .../pytz/zoneinfo/Europe/Sarajevo | Bin 0 -> 1957 bytes .../pytz/zoneinfo/Europe/Saratov | Bin 0 -> 1197 bytes .../pytz/zoneinfo/Europe/Simferopol | Bin 0 -> 1490 bytes .../site-packages/pytz/zoneinfo/Europe/Skopje | Bin 0 -> 1957 bytes .../site-packages/pytz/zoneinfo/Europe/Sofia | Bin 0 -> 2130 bytes .../pytz/zoneinfo/Europe/Stockholm | Bin 0 -> 1918 bytes .../pytz/zoneinfo/Europe/Tallinn | Bin 0 -> 2187 bytes .../site-packages/pytz/zoneinfo/Europe/Tirane | Bin 0 -> 2098 bytes .../pytz/zoneinfo/Europe/Tiraspol | Bin 0 -> 2445 bytes .../pytz/zoneinfo/Europe/Ulyanovsk | Bin 0 -> 1281 bytes .../pytz/zoneinfo/Europe/Uzhgorod | Bin 0 -> 2103 bytes .../site-packages/pytz/zoneinfo/Europe/Vaduz | Bin 0 -> 1918 bytes .../pytz/zoneinfo/Europe/Vatican | Bin 0 -> 2692 bytes .../site-packages/pytz/zoneinfo/Europe/Vienna | Bin 0 -> 2237 bytes .../pytz/zoneinfo/Europe/Vilnius | Bin 0 -> 2199 bytes .../pytz/zoneinfo/Europe/Volgograd | Bin 0 -> 1167 bytes .../site-packages/pytz/zoneinfo/Europe/Warsaw | Bin 0 -> 2705 bytes .../site-packages/pytz/zoneinfo/Europe/Zagreb | Bin 0 -> 1957 bytes .../pytz/zoneinfo/Europe/Zaporozhye | Bin 0 -> 2115 bytes .../site-packages/pytz/zoneinfo/Europe/Zurich | Bin 0 -> 1918 bytes venv/Lib/site-packages/pytz/zoneinfo/Factory | Bin 0 -> 148 bytes venv/Lib/site-packages/pytz/zoneinfo/GB | Bin 0 -> 3687 bytes venv/Lib/site-packages/pytz/zoneinfo/GB-Eire | Bin 0 -> 3687 bytes venv/Lib/site-packages/pytz/zoneinfo/GMT | Bin 0 -> 127 bytes venv/Lib/site-packages/pytz/zoneinfo/GMT+0 | Bin 0 -> 127 bytes venv/Lib/site-packages/pytz/zoneinfo/GMT-0 | Bin 0 -> 127 bytes venv/Lib/site-packages/pytz/zoneinfo/GMT0 | Bin 0 -> 127 bytes .../Lib/site-packages/pytz/zoneinfo/Greenwich | Bin 0 -> 127 bytes venv/Lib/site-packages/pytz/zoneinfo/HST | Bin 0 -> 128 bytes venv/Lib/site-packages/pytz/zoneinfo/Hongkong | Bin 0 -> 1189 bytes venv/Lib/site-packages/pytz/zoneinfo/Iceland | Bin 0 -> 1188 bytes .../pytz/zoneinfo/Indian/Antananarivo | Bin 0 -> 285 bytes .../site-packages/pytz/zoneinfo/Indian/Chagos | Bin 0 -> 225 bytes .../pytz/zoneinfo/Indian/Christmas | Bin 0 -> 182 bytes .../site-packages/pytz/zoneinfo/Indian/Cocos | Bin 0 -> 191 bytes .../site-packages/pytz/zoneinfo/Indian/Comoro | Bin 0 -> 285 bytes .../pytz/zoneinfo/Indian/Kerguelen | Bin 0 -> 187 bytes .../site-packages/pytz/zoneinfo/Indian/Mahe | Bin 0 -> 187 bytes .../pytz/zoneinfo/Indian/Maldives | Bin 0 -> 220 bytes .../pytz/zoneinfo/Indian/Mauritius | Bin 0 -> 267 bytes .../pytz/zoneinfo/Indian/Mayotte | Bin 0 -> 285 bytes .../pytz/zoneinfo/Indian/Reunion | Bin 0 -> 187 bytes venv/Lib/site-packages/pytz/zoneinfo/Iran | Bin 0 -> 1718 bytes venv/Lib/site-packages/pytz/zoneinfo/Israel | Bin 0 -> 2265 bytes venv/Lib/site-packages/pytz/zoneinfo/Jamaica | Bin 0 -> 507 bytes venv/Lib/site-packages/pytz/zoneinfo/Japan | Bin 0 -> 318 bytes .../Lib/site-packages/pytz/zoneinfo/Kwajalein | Bin 0 -> 259 bytes venv/Lib/site-packages/pytz/zoneinfo/Libya | Bin 0 -> 655 bytes venv/Lib/site-packages/pytz/zoneinfo/MET | Bin 0 -> 2102 bytes venv/Lib/site-packages/pytz/zoneinfo/MST | Bin 0 -> 127 bytes venv/Lib/site-packages/pytz/zoneinfo/MST7MDT | Bin 0 -> 2294 bytes .../pytz/zoneinfo/Mexico/BajaNorte | Bin 0 -> 2356 bytes .../pytz/zoneinfo/Mexico/BajaSur | Bin 0 -> 1564 bytes .../pytz/zoneinfo/Mexico/General | Bin 0 -> 1618 bytes venv/Lib/site-packages/pytz/zoneinfo/NZ | Bin 0 -> 2460 bytes venv/Lib/site-packages/pytz/zoneinfo/NZ-CHAT | Bin 0 -> 2087 bytes venv/Lib/site-packages/pytz/zoneinfo/Navajo | Bin 0 -> 2453 bytes venv/Lib/site-packages/pytz/zoneinfo/PRC | Bin 0 -> 414 bytes venv/Lib/site-packages/pytz/zoneinfo/PST8PDT | Bin 0 -> 2294 bytes .../site-packages/pytz/zoneinfo/Pacific/Apia | Bin 0 -> 1134 bytes .../pytz/zoneinfo/Pacific/Auckland | Bin 0 -> 2460 bytes .../pytz/zoneinfo/Pacific/Bougainville | Bin 0 -> 296 bytes .../pytz/zoneinfo/Pacific/Chatham | Bin 0 -> 2087 bytes .../site-packages/pytz/zoneinfo/Pacific/Chuuk | Bin 0 -> 183 bytes .../pytz/zoneinfo/Pacific/Easter | Bin 0 -> 2242 bytes .../site-packages/pytz/zoneinfo/Pacific/Efate | Bin 0 -> 492 bytes .../pytz/zoneinfo/Pacific/Enderbury | Bin 0 -> 259 bytes .../pytz/zoneinfo/Pacific/Fakaofo | Bin 0 -> 221 bytes .../site-packages/pytz/zoneinfo/Pacific/Fiji | Bin 0 -> 1104 bytes .../pytz/zoneinfo/Pacific/Funafuti | Bin 0 -> 183 bytes .../pytz/zoneinfo/Pacific/Galapagos | Bin 0 -> 268 bytes .../pytz/zoneinfo/Pacific/Gambier | Bin 0 -> 186 bytes .../pytz/zoneinfo/Pacific/Guadalcanal | Bin 0 -> 188 bytes .../site-packages/pytz/zoneinfo/Pacific/Guam | Bin 0 -> 225 bytes .../pytz/zoneinfo/Pacific/Honolulu | Bin 0 -> 276 bytes .../pytz/zoneinfo/Pacific/Johnston | Bin 0 -> 276 bytes .../pytz/zoneinfo/Pacific/Kiritimati | Bin 0 -> 263 bytes .../pytz/zoneinfo/Pacific/Kosrae | Bin 0 -> 251 bytes .../pytz/zoneinfo/Pacific/Kwajalein | Bin 0 -> 259 bytes .../pytz/zoneinfo/Pacific/Majuro | Bin 0 -> 221 bytes .../pytz/zoneinfo/Pacific/Marquesas | Bin 0 -> 195 bytes .../pytz/zoneinfo/Pacific/Midway | Bin 0 -> 196 bytes .../site-packages/pytz/zoneinfo/Pacific/Nauru | Bin 0 -> 282 bytes .../site-packages/pytz/zoneinfo/Pacific/Niue | Bin 0 -> 266 bytes .../pytz/zoneinfo/Pacific/Norfolk | Bin 0 -> 323 bytes .../pytz/zoneinfo/Pacific/Noumea | Bin 0 -> 328 bytes .../pytz/zoneinfo/Pacific/Pago_Pago | Bin 0 -> 196 bytes .../site-packages/pytz/zoneinfo/Pacific/Palau | Bin 0 -> 182 bytes .../pytz/zoneinfo/Pacific/Pitcairn | Bin 0 -> 223 bytes .../pytz/zoneinfo/Pacific/Pohnpei | Bin 0 -> 183 bytes .../pytz/zoneinfo/Pacific/Ponape | Bin 0 -> 183 bytes .../pytz/zoneinfo/Pacific/Port_Moresby | Bin 0 -> 206 bytes .../pytz/zoneinfo/Pacific/Rarotonga | Bin 0 -> 602 bytes .../pytz/zoneinfo/Pacific/Saipan | Bin 0 -> 225 bytes .../site-packages/pytz/zoneinfo/Pacific/Samoa | Bin 0 -> 196 bytes .../pytz/zoneinfo/Pacific/Tahiti | Bin 0 -> 187 bytes .../pytz/zoneinfo/Pacific/Tarawa | Bin 0 -> 183 bytes .../pytz/zoneinfo/Pacific/Tongatapu | Bin 0 -> 393 bytes .../site-packages/pytz/zoneinfo/Pacific/Truk | Bin 0 -> 183 bytes .../site-packages/pytz/zoneinfo/Pacific/Wake | Bin 0 -> 183 bytes .../pytz/zoneinfo/Pacific/Wallis | Bin 0 -> 183 bytes .../site-packages/pytz/zoneinfo/Pacific/Yap | Bin 0 -> 183 bytes venv/Lib/site-packages/pytz/zoneinfo/Poland | Bin 0 -> 2705 bytes venv/Lib/site-packages/pytz/zoneinfo/Portugal | Bin 0 -> 3469 bytes venv/Lib/site-packages/pytz/zoneinfo/ROC | Bin 0 -> 790 bytes venv/Lib/site-packages/pytz/zoneinfo/ROK | Bin 0 -> 531 bytes .../Lib/site-packages/pytz/zoneinfo/Singapore | Bin 0 -> 424 bytes venv/Lib/site-packages/pytz/zoneinfo/Turkey | Bin 0 -> 2166 bytes venv/Lib/site-packages/pytz/zoneinfo/UCT | Bin 0 -> 127 bytes .../Lib/site-packages/pytz/zoneinfo/US/Alaska | Bin 0 -> 2380 bytes .../site-packages/pytz/zoneinfo/US/Aleutian | Bin 0 -> 2365 bytes .../site-packages/pytz/zoneinfo/US/Arizona | Bin 0 -> 353 bytes .../site-packages/pytz/zoneinfo/US/Central | Bin 0 -> 3585 bytes .../pytz/zoneinfo/US/East-Indiana | Bin 0 -> 1675 bytes .../site-packages/pytz/zoneinfo/US/Eastern | Bin 0 -> 3545 bytes .../Lib/site-packages/pytz/zoneinfo/US/Hawaii | Bin 0 -> 276 bytes .../pytz/zoneinfo/US/Indiana-Starke | Bin 0 -> 2437 bytes .../site-packages/pytz/zoneinfo/US/Michigan | Bin 0 -> 2188 bytes .../site-packages/pytz/zoneinfo/US/Mountain | Bin 0 -> 2453 bytes .../site-packages/pytz/zoneinfo/US/Pacific | Bin 0 -> 2845 bytes venv/Lib/site-packages/pytz/zoneinfo/US/Samoa | Bin 0 -> 196 bytes venv/Lib/site-packages/pytz/zoneinfo/UTC | Bin 0 -> 127 bytes .../Lib/site-packages/pytz/zoneinfo/Universal | Bin 0 -> 127 bytes venv/Lib/site-packages/pytz/zoneinfo/W-SU | Bin 0 -> 1544 bytes venv/Lib/site-packages/pytz/zoneinfo/WET | Bin 0 -> 1873 bytes venv/Lib/site-packages/pytz/zoneinfo/Zulu | Bin 0 -> 127 bytes .../site-packages/pytz/zoneinfo/iso3166.tab | 274 + .../site-packages/pytz/zoneinfo/leapseconds | 61 + .../site-packages/pytz/zoneinfo/posixrules | Bin 0 -> 3545 bytes .../Lib/site-packages/pytz/zoneinfo/tzdata.zi | 4162 +++++++++ venv/Lib/site-packages/pytz/zoneinfo/zone.tab | 448 + .../site-packages/pytz/zoneinfo/zone1970.tab | 382 + .../setuptools-40.4.3.dist-info/INSTALLER | 1 + .../setuptools-40.4.3.dist-info/LICENSE.txt | 19 + .../setuptools-40.4.3.dist-info/METADATA | 78 + .../setuptools-40.4.3.dist-info/RECORD | 186 + .../setuptools-40.4.3.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 65 + .../setuptools-40.4.3.dist-info/top_level.txt | 3 + .../setuptools-40.4.3.dist-info/zip-safe | 1 + venv/Lib/site-packages/setuptools/__init__.py | 191 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 6434 bytes .../__pycache__/archive_util.cpython-37.pyc | Bin 0 -> 5128 bytes .../__pycache__/build_meta.cpython-37.pyc | Bin 0 -> 6264 bytes .../__pycache__/config.cpython-37.pyc | Bin 0 -> 15285 bytes .../__pycache__/dep_util.cpython-37.pyc | Bin 0 -> 854 bytes .../__pycache__/depends.cpython-37.pyc | Bin 0 -> 5263 bytes .../__pycache__/dist.cpython-37.pyc | Bin 0 -> 36773 bytes .../__pycache__/extension.cpython-37.pyc | Bin 0 -> 1974 bytes .../__pycache__/glibc.cpython-37.pyc | Bin 0 -> 1539 bytes .../__pycache__/glob.cpython-37.pyc | Bin 0 -> 3749 bytes .../__pycache__/launch.cpython-37.pyc | Bin 0 -> 853 bytes .../__pycache__/lib2to3_ex.cpython-37.pyc | Bin 0 -> 2432 bytes .../__pycache__/monkey.cpython-37.pyc | Bin 0 -> 4555 bytes .../__pycache__/msvc.cpython-37.pyc | Bin 0 -> 34430 bytes .../__pycache__/namespaces.cpython-37.pyc | Bin 0 -> 3611 bytes .../__pycache__/package_index.cpython-37.pyc | Bin 0 -> 32375 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 7202 bytes .../__pycache__/py27compat.cpython-37.pyc | Bin 0 -> 810 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 1196 bytes .../__pycache__/py33compat.cpython-37.pyc | Bin 0 -> 1419 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 0 -> 2191 bytes .../__pycache__/sandbox.cpython-37.pyc | Bin 0 -> 15535 bytes .../__pycache__/site-patch.cpython-37.pyc | Bin 0 -> 1501 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 0 -> 6790 bytes .../__pycache__/unicode_utils.cpython-37.pyc | Bin 0 -> 1168 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 327 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 7015 bytes .../windows_support.cpython-37.pyc | Bin 0 -> 1010 bytes .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 189 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 203032 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24390 bytes .../setuptools/_vendor/packaging/__about__.py | 21 + .../setuptools/_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 725 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 563 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1015 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2867 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8872 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3874 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19793 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 494 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 10560 bytes .../setuptools/_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../setuptools/_vendor/packaging/utils.py | 14 + .../setuptools/_vendor/packaging/version.py | 393 + .../setuptools/_vendor/pyparsing.py | 5742 ++++++++++++ .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/build_meta.py | 182 + venv/Lib/site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes venv/Lib/site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes venv/Lib/site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 18 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 735 bytes .../command/__pycache__/alias.cpython-37.pyc | Bin 0 -> 2403 bytes .../__pycache__/bdist_egg.cpython-37.pyc | Bin 0 -> 14191 bytes .../__pycache__/bdist_rpm.cpython-37.pyc | Bin 0 -> 1782 bytes .../__pycache__/bdist_wininst.cpython-37.pyc | Bin 0 -> 973 bytes .../__pycache__/build_clib.cpython-37.pyc | Bin 0 -> 2452 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 0 -> 9706 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 0 -> 8582 bytes .../__pycache__/develop.cpython-37.pyc | Bin 0 -> 6423 bytes .../__pycache__/dist_info.cpython-37.pyc | Bin 0 -> 1378 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 64559 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 0 -> 21308 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 4010 bytes .../install_egg_info.cpython-37.pyc | Bin 0 -> 2411 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 0 -> 4087 bytes .../install_scripts.cpython-37.pyc | Bin 0 -> 2290 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 0 -> 4623 bytes .../__pycache__/register.cpython-37.pyc | Bin 0 -> 780 bytes .../command/__pycache__/rotate.cpython-37.pyc | Bin 0 -> 2529 bytes .../__pycache__/saveopts.cpython-37.pyc | Bin 0 -> 924 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 0 -> 6220 bytes .../command/__pycache__/setopt.cpython-37.pyc | Bin 0 -> 4522 bytes .../command/__pycache__/test.cpython-37.pyc | Bin 0 -> 8117 bytes .../command/__pycache__/upload.cpython-37.pyc | Bin 0 -> 1714 bytes .../__pycache__/upload_docs.cpython-37.pyc | Bin 0 -> 6133 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 321 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 218 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2337 +++++ .../setuptools/command/egg_info.py | 706 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 121 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 200 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 270 + .../setuptools/command/upload.py | 53 + .../setuptools/command/upload_docs.py | 206 + venv/Lib/site-packages/setuptools/config.py | 600 ++ venv/Lib/site-packages/setuptools/dep_util.py | 23 + venv/Lib/site-packages/setuptools/depends.py | 186 + venv/Lib/site-packages/setuptools/dist.py | 1071 +++ .../Lib/site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2412 bytes venv/Lib/site-packages/setuptools/glibc.py | 86 + venv/Lib/site-packages/setuptools/glob.py | 174 + venv/Lib/site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes venv/Lib/site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes venv/Lib/site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes venv/Lib/site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + venv/Lib/site-packages/setuptools/monkey.py | 179 + venv/Lib/site-packages/setuptools/msvc.py | 1301 +++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1127 +++ .../site-packages/setuptools/pep425tags.py | 319 + .../site-packages/setuptools/py27compat.py | 28 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 55 + .../site-packages/setuptools/py36compat.py | 82 + venv/Lib/site-packages/setuptools/sandbox.py | 491 + .../setuptools/script (dev).tmpl | 6 + venv/Lib/site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/unicode_utils.py | 44 + venv/Lib/site-packages/setuptools/version.py | 6 + venv/Lib/site-packages/setuptools/wheel.py | 210 + .../setuptools/windows_support.py | 29 + .../six-1.11.0.dist-info/DESCRIPTION.rst | 27 + .../six-1.11.0.dist-info/INSTALLER | 1 + .../six-1.11.0.dist-info/METADATA | 43 + .../site-packages/six-1.11.0.dist-info/RECORD | 9 + .../site-packages/six-1.11.0.dist-info/WHEEL | 6 + .../six-1.11.0.dist-info/metadata.json | 1 + .../six-1.11.0.dist-info/top_level.txt | 1 + venv/Lib/site-packages/six.py | 891 ++ venv/Lib/site-packages/werkzeug/__init__.py | 151 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 4693 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 7140 bytes .../__pycache__/_internal.cpython-37.pyc | Bin 0 -> 12561 bytes .../__pycache__/_reloader.cpython-37.pyc | Bin 0 -> 8868 bytes .../__pycache__/datastructures.cpython-37.pyc | Bin 0 -> 100037 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 22953 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 0 -> 2246 bytes .../__pycache__/formparser.cpython-37.pyc | Bin 0 -> 16086 bytes .../werkzeug/__pycache__/http.cpython-37.pyc | Bin 0 -> 33321 bytes .../werkzeug/__pycache__/local.cpython-37.pyc | Bin 0 -> 18680 bytes .../__pycache__/posixemulation.cpython-37.pyc | Bin 0 -> 2805 bytes .../__pycache__/routing.cpython-37.pyc | Bin 0 -> 60167 bytes .../__pycache__/script.cpython-37.pyc | Bin 0 -> 10078 bytes .../__pycache__/security.cpython-37.pyc | Bin 0 -> 8512 bytes .../__pycache__/serving.cpython-37.pyc | Bin 0 -> 26467 bytes .../werkzeug/__pycache__/test.cpython-37.pyc | Bin 0 -> 31027 bytes .../__pycache__/testapp.cpython-37.pyc | Bin 0 -> 9471 bytes .../werkzeug/__pycache__/urls.cpython-37.pyc | Bin 0 -> 33284 bytes .../__pycache__/useragents.cpython-37.pyc | Bin 0 -> 5454 bytes .../werkzeug/__pycache__/utils.cpython-37.pyc | Bin 0 -> 21111 bytes .../__pycache__/websocket.cpython-37.pyc | Bin 0 -> 8178 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 76379 bytes .../werkzeug/__pycache__/wsgi.cpython-37.pyc | Bin 0 -> 44547 bytes venv/Lib/site-packages/werkzeug/_compat.py | 206 + venv/Lib/site-packages/werkzeug/_internal.py | 419 + venv/Lib/site-packages/werkzeug/_reloader.py | 277 + .../werkzeug/contrib/__init__.py | 16 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 792 bytes .../contrib/__pycache__/atom.cpython-37.pyc | Bin 0 -> 14096 bytes .../contrib/__pycache__/cache.cpython-37.pyc | Bin 0 -> 32388 bytes .../contrib/__pycache__/fixers.cpython-37.pyc | Bin 0 -> 10084 bytes .../contrib/__pycache__/iterio.cpython-37.pyc | Bin 0 -> 10977 bytes .../__pycache__/jsrouting.cpython-37.pyc | Bin 0 -> 8300 bytes .../__pycache__/limiter.cpython-37.pyc | Bin 0 -> 1748 bytes .../contrib/__pycache__/lint.cpython-37.pyc | Bin 0 -> 11868 bytes .../__pycache__/profiler.cpython-37.pyc | Bin 0 -> 5442 bytes .../__pycache__/securecookie.cpython-37.pyc | Bin 0 -> 10346 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 0 -> 12916 bytes .../__pycache__/testtools.cpython-37.pyc | Bin 0 -> 2658 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 10423 bytes .../site-packages/werkzeug/contrib/atom.py | 355 + .../site-packages/werkzeug/contrib/cache.py | 913 ++ .../site-packages/werkzeug/contrib/fixers.py | 254 + .../site-packages/werkzeug/contrib/iterio.py | 352 + .../werkzeug/contrib/jsrouting.py | 264 + .../site-packages/werkzeug/contrib/limiter.py | 41 + .../site-packages/werkzeug/contrib/lint.py | 343 + .../werkzeug/contrib/profiler.py | 147 + .../werkzeug/contrib/securecookie.py | 323 + .../werkzeug/contrib/sessions.py | 352 + .../werkzeug/contrib/testtools.py | 73 + .../werkzeug/contrib/wrappers.py | 284 + .../site-packages/werkzeug/datastructures.py | 2762 ++++++ .../site-packages/werkzeug/debug/__init__.py | 470 + .../debug/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 12678 bytes .../debug/__pycache__/console.cpython-37.pyc | Bin 0 -> 7366 bytes .../debug/__pycache__/repr.cpython-37.pyc | Bin 0 -> 8660 bytes .../debug/__pycache__/tbtools.cpython-37.pyc | Bin 0 -> 15614 bytes .../site-packages/werkzeug/debug/console.py | 215 + venv/Lib/site-packages/werkzeug/debug/repr.py | 280 + .../werkzeug/debug/shared/FONT_LICENSE | 96 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 205 + .../werkzeug/debug/shared/jquery.js | 5 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/source.png | Bin 0 -> 818 bytes .../werkzeug/debug/shared/style.css | 143 + .../werkzeug/debug/shared/ubuntu.ttf | Bin 0 -> 70220 bytes .../site-packages/werkzeug/debug/tbtools.py | 556 ++ venv/Lib/site-packages/werkzeug/exceptions.py | 719 ++ venv/Lib/site-packages/werkzeug/filesystem.py | 66 + venv/Lib/site-packages/werkzeug/formparser.py | 534 ++ venv/Lib/site-packages/werkzeug/http.py | 1158 +++ venv/Lib/site-packages/werkzeug/local.py | 420 + .../site-packages/werkzeug/posixemulation.py | 106 + venv/Lib/site-packages/werkzeug/routing.py | 1792 ++++ venv/Lib/site-packages/werkzeug/script.py | 318 + venv/Lib/site-packages/werkzeug/security.py | 270 + venv/Lib/site-packages/werkzeug/serving.py | 862 ++ venv/Lib/site-packages/werkzeug/test.py | 948 ++ venv/Lib/site-packages/werkzeug/testapp.py | 230 + venv/Lib/site-packages/werkzeug/urls.py | 1007 ++ venv/Lib/site-packages/werkzeug/useragents.py | 212 + venv/Lib/site-packages/werkzeug/utils.py | 628 ++ venv/Lib/site-packages/werkzeug/websocket.py | 337 + venv/Lib/site-packages/werkzeug/wrappers.py | 2028 ++++ venv/Lib/site-packages/werkzeug/wsgi.py | 1364 +++ .../wheel-0.32.1.dist-info/INSTALLER | 1 + .../wheel-0.32.1.dist-info/LICENSE.txt | 22 + .../wheel-0.32.1.dist-info/METADATA | 60 + .../wheel-0.32.1.dist-info/RECORD | 34 + .../wheel-0.32.1.dist-info/WHEEL | 6 + .../wheel-0.32.1.dist-info/entry_points.txt | 6 + .../wheel-0.32.1.dist-info/top_level.txt | 1 + venv/Lib/site-packages/wheel/__init__.py | 2 + venv/Lib/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 193 bytes .../wheel/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 586 bytes .../__pycache__/bdist_wheel.cpython-37.pyc | Bin 0 -> 9944 bytes .../wheel/__pycache__/metadata.cpython-37.pyc | Bin 0 -> 3759 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 4704 bytes .../wheel/__pycache__/pkginfo.cpython-37.pyc | Bin 0 -> 1564 bytes .../wheel/__pycache__/util.cpython-37.pyc | Bin 0 -> 1260 bytes .../__pycache__/wheelfile.cpython-37.pyc | Bin 0 -> 5366 bytes venv/Lib/site-packages/wheel/bdist_wheel.py | 365 + venv/Lib/site-packages/wheel/cli/__init__.py | 87 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2949 bytes .../cli/__pycache__/convert.cpython-37.pyc | Bin 0 -> 6196 bytes .../cli/__pycache__/install.cpython-37.pyc | Bin 0 -> 174 bytes .../wheel/cli/__pycache__/pack.cpython-37.pyc | Bin 0 -> 2459 bytes .../cli/__pycache__/unpack.cpython-37.pyc | Bin 0 -> 938 bytes venv/Lib/site-packages/wheel/cli/convert.py | 269 + venv/Lib/site-packages/wheel/cli/install.py | 0 venv/Lib/site-packages/wheel/cli/pack.py | 54 + venv/Lib/site-packages/wheel/cli/unpack.py | 25 + venv/Lib/site-packages/wheel/metadata.py | 141 + venv/Lib/site-packages/wheel/pep425tags.py | 185 + venv/Lib/site-packages/wheel/pkginfo.py | 43 + venv/Lib/site-packages/wheel/util.py | 41 + venv/Lib/site-packages/wheel/wheelfile.py | 160 + .../wrapt-1.10.11.dist-info/INSTALLER | 1 + .../wrapt-1.10.11.dist-info/LICENSE | 24 + .../wrapt-1.10.11.dist-info/METADATA | 165 + .../wrapt-1.10.11.dist-info/RECORD | 16 + .../wrapt-1.10.11.dist-info/WHEEL | 5 + .../wrapt-1.10.11.dist-info/top_level.txt | 1 + venv/Lib/site-packages/wrapt/__init__.py | 19 + .../wrapt/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1013 bytes .../__pycache__/arguments.cpython-37.pyc | Bin 0 -> 2753 bytes .../__pycache__/decorators.cpython-37.pyc | Bin 0 -> 8938 bytes .../wrapt/__pycache__/importer.cpython-37.pyc | Bin 0 -> 4115 bytes .../wrapt/__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 22381 bytes venv/Lib/site-packages/wrapt/arguments.py | 96 + venv/Lib/site-packages/wrapt/decorators.py | 512 ++ venv/Lib/site-packages/wrapt/importer.py | 228 + venv/Lib/site-packages/wrapt/wrappers.py | 901 ++ venv/Lib/site.py | 758 ++ venv/Lib/sre_compile.py | 784 ++ venv/Lib/sre_constants.py | 261 + venv/Lib/sre_parse.py | 1046 +++ venv/Lib/stat.py | 178 + venv/Lib/struct.py | 15 + venv/Lib/tarfile.py | 2537 +++++ venv/Lib/tempfile.py | 809 ++ venv/Lib/token.py | 160 + venv/Lib/tokenize.py | 726 ++ venv/Lib/types.py | 295 + venv/Lib/warnings.py | 554 ++ venv/Lib/weakref.py | 632 ++ venv/Scripts/activate | 78 + venv/Scripts/activate.bat | 30 + venv/Scripts/activate.ps1 | 150 + venv/Scripts/activate_this.py | 34 + venv/Scripts/deactivate.bat | 19 + venv/Scripts/dotenv.exe | Bin 0 -> 93037 bytes venv/Scripts/easy_install-3.7.exe | Bin 0 -> 93060 bytes venv/Scripts/easy_install.exe | Bin 0 -> 93060 bytes venv/Scripts/epylint.exe | Bin 0 -> 93049 bytes venv/Scripts/flask.exe | Bin 0 -> 93038 bytes venv/Scripts/isort.exe | Bin 0 -> 93039 bytes venv/Scripts/pep8.exe | Bin 0 -> 93035 bytes venv/Scripts/pip.exe | Bin 0 -> 93042 bytes venv/Scripts/pip3.7.exe | Bin 0 -> 93042 bytes venv/Scripts/pip3.exe | Bin 0 -> 93042 bytes venv/Scripts/py.test.exe | Bin 0 -> 93035 bytes venv/Scripts/pylint.exe | Bin 0 -> 93047 bytes venv/Scripts/pyreverse.exe | Bin 0 -> 93053 bytes venv/Scripts/pytest.exe | Bin 0 -> 93035 bytes venv/Scripts/python.exe | Bin 0 -> 97432 bytes venv/Scripts/python3.dll | Bin 0 -> 59032 bytes venv/Scripts/python37.dll | Bin 0 -> 3667096 bytes venv/Scripts/pythonw.exe | Bin 0 -> 95896 bytes venv/Scripts/symilar.exe | Bin 0 -> 93049 bytes venv/Scripts/wheel.exe | Bin 0 -> 93038 bytes venv/pip-selfcheck.json | 1 + venv/tcl/tcl8.6/auto.tcl | 646 ++ venv/tcl/tcl8.6/clock.tcl | 4547 +++++++++ venv/tcl/tcl8.6/encoding/ascii.enc | 20 + venv/tcl/tcl8.6/encoding/big5.enc | 1516 +++ venv/tcl/tcl8.6/encoding/cp1250.enc | 20 + venv/tcl/tcl8.6/encoding/cp1251.enc | 20 + venv/tcl/tcl8.6/encoding/cp1252.enc | 20 + venv/tcl/tcl8.6/encoding/cp1253.enc | 20 + venv/tcl/tcl8.6/encoding/cp1254.enc | 20 + venv/tcl/tcl8.6/encoding/cp1255.enc | 20 + venv/tcl/tcl8.6/encoding/cp1256.enc | 20 + venv/tcl/tcl8.6/encoding/cp1257.enc | 20 + venv/tcl/tcl8.6/encoding/cp1258.enc | 20 + venv/tcl/tcl8.6/encoding/cp437.enc | 20 + venv/tcl/tcl8.6/encoding/cp737.enc | 20 + venv/tcl/tcl8.6/encoding/cp775.enc | 20 + venv/tcl/tcl8.6/encoding/cp850.enc | 20 + venv/tcl/tcl8.6/encoding/cp852.enc | 20 + venv/tcl/tcl8.6/encoding/cp855.enc | 20 + venv/tcl/tcl8.6/encoding/cp857.enc | 20 + venv/tcl/tcl8.6/encoding/cp860.enc | 20 + venv/tcl/tcl8.6/encoding/cp861.enc | 20 + venv/tcl/tcl8.6/encoding/cp862.enc | 20 + venv/tcl/tcl8.6/encoding/cp863.enc | 20 + venv/tcl/tcl8.6/encoding/cp864.enc | 20 + venv/tcl/tcl8.6/encoding/cp865.enc | 20 + venv/tcl/tcl8.6/encoding/cp866.enc | 20 + venv/tcl/tcl8.6/encoding/cp869.enc | 20 + venv/tcl/tcl8.6/encoding/cp874.enc | 20 + venv/tcl/tcl8.6/encoding/cp932.enc | 801 ++ venv/tcl/tcl8.6/encoding/cp936.enc | 2162 +++++ venv/tcl/tcl8.6/encoding/cp949.enc | 2128 +++++ venv/tcl/tcl8.6/encoding/cp950.enc | 1499 +++ venv/tcl/tcl8.6/encoding/dingbats.enc | 20 + venv/tcl/tcl8.6/encoding/ebcdic.enc | 19 + venv/tcl/tcl8.6/encoding/euc-cn.enc | 1397 +++ venv/tcl/tcl8.6/encoding/euc-jp.enc | 1353 +++ venv/tcl/tcl8.6/encoding/euc-kr.enc | 1533 +++ venv/tcl/tcl8.6/encoding/gb12345.enc | 1414 +++ venv/tcl/tcl8.6/encoding/gb1988.enc | 20 + venv/tcl/tcl8.6/encoding/gb2312-raw.enc | 1380 +++ venv/tcl/tcl8.6/encoding/gb2312.enc | 1397 +++ venv/tcl/tcl8.6/encoding/iso2022-jp.enc | 12 + venv/tcl/tcl8.6/encoding/iso2022-kr.enc | 7 + venv/tcl/tcl8.6/encoding/iso2022.enc | 14 + venv/tcl/tcl8.6/encoding/iso8859-1.enc | 20 + venv/tcl/tcl8.6/encoding/iso8859-10.enc | 20 + venv/tcl/tcl8.6/encoding/iso8859-13.enc | 20 + venv/tcl/tcl8.6/encoding/iso8859-14.enc | 20 + venv/tcl/tcl8.6/encoding/iso8859-15.enc | 20 + venv/tcl/tcl8.6/encoding/iso8859-16.enc | 20 + venv/tcl/tcl8.6/encoding/iso8859-2.enc | 20 + venv/tcl/tcl8.6/encoding/iso8859-3.enc | 20 + venv/tcl/tcl8.6/encoding/iso8859-4.enc | 20 + venv/tcl/tcl8.6/encoding/iso8859-5.enc | 20 + venv/tcl/tcl8.6/encoding/iso8859-6.enc | 20 + venv/tcl/tcl8.6/encoding/iso8859-7.enc | 20 + venv/tcl/tcl8.6/encoding/iso8859-8.enc | 20 + venv/tcl/tcl8.6/encoding/iso8859-9.enc | 20 + venv/tcl/tcl8.6/encoding/jis0201.enc | 20 + venv/tcl/tcl8.6/encoding/jis0208.enc | 1319 +++ venv/tcl/tcl8.6/encoding/jis0212.enc | 1159 +++ venv/tcl/tcl8.6/encoding/koi8-r.enc | 20 + venv/tcl/tcl8.6/encoding/koi8-u.enc | 20 + venv/tcl/tcl8.6/encoding/ksc5601.enc | 1516 +++ venv/tcl/tcl8.6/encoding/macCentEuro.enc | 20 + venv/tcl/tcl8.6/encoding/macCroatian.enc | 20 + venv/tcl/tcl8.6/encoding/macCyrillic.enc | 20 + venv/tcl/tcl8.6/encoding/macDingbats.enc | 20 + venv/tcl/tcl8.6/encoding/macGreek.enc | 20 + venv/tcl/tcl8.6/encoding/macIceland.enc | 20 + venv/tcl/tcl8.6/encoding/macJapan.enc | 785 ++ venv/tcl/tcl8.6/encoding/macRoman.enc | 20 + venv/tcl/tcl8.6/encoding/macRomania.enc | 20 + venv/tcl/tcl8.6/encoding/macThai.enc | 20 + venv/tcl/tcl8.6/encoding/macTurkish.enc | 20 + venv/tcl/tcl8.6/encoding/macUkraine.enc | 20 + venv/tcl/tcl8.6/encoding/shiftjis.enc | 690 ++ venv/tcl/tcl8.6/encoding/symbol.enc | 20 + venv/tcl/tcl8.6/encoding/tis-620.enc | 20 + venv/tcl/tcl8.6/history.tcl | 335 + venv/tcl/tcl8.6/http1.0/http.tcl | 377 + venv/tcl/tcl8.6/http1.0/pkgIndex.tcl | 11 + venv/tcl/tcl8.6/init.tcl | 819 ++ venv/tcl/tcl8.6/msgs/af.msg | 49 + venv/tcl/tcl8.6/msgs/af_za.msg | 6 + venv/tcl/tcl8.6/msgs/ar.msg | 54 + venv/tcl/tcl8.6/msgs/ar_in.msg | 6 + venv/tcl/tcl8.6/msgs/ar_jo.msg | 39 + venv/tcl/tcl8.6/msgs/ar_lb.msg | 39 + venv/tcl/tcl8.6/msgs/ar_sy.msg | 39 + venv/tcl/tcl8.6/msgs/be.msg | 52 + venv/tcl/tcl8.6/msgs/bg.msg | 52 + venv/tcl/tcl8.6/msgs/bn.msg | 49 + venv/tcl/tcl8.6/msgs/bn_in.msg | 6 + venv/tcl/tcl8.6/msgs/ca.msg | 50 + venv/tcl/tcl8.6/msgs/cs.msg | 54 + venv/tcl/tcl8.6/msgs/da.msg | 52 + venv/tcl/tcl8.6/msgs/de.msg | 54 + venv/tcl/tcl8.6/msgs/de_at.msg | 35 + venv/tcl/tcl8.6/msgs/de_be.msg | 53 + venv/tcl/tcl8.6/msgs/el.msg | 52 + venv/tcl/tcl8.6/msgs/en_au.msg | 7 + venv/tcl/tcl8.6/msgs/en_be.msg | 7 + venv/tcl/tcl8.6/msgs/en_bw.msg | 6 + venv/tcl/tcl8.6/msgs/en_ca.msg | 7 + venv/tcl/tcl8.6/msgs/en_gb.msg | 7 + venv/tcl/tcl8.6/msgs/en_hk.msg | 8 + venv/tcl/tcl8.6/msgs/en_ie.msg | 7 + venv/tcl/tcl8.6/msgs/en_in.msg | 8 + venv/tcl/tcl8.6/msgs/en_nz.msg | 7 + venv/tcl/tcl8.6/msgs/en_ph.msg | 8 + venv/tcl/tcl8.6/msgs/en_sg.msg | 6 + venv/tcl/tcl8.6/msgs/en_za.msg | 6 + venv/tcl/tcl8.6/msgs/en_zw.msg | 6 + venv/tcl/tcl8.6/msgs/eo.msg | 54 + venv/tcl/tcl8.6/msgs/es.msg | 52 + venv/tcl/tcl8.6/msgs/es_ar.msg | 6 + venv/tcl/tcl8.6/msgs/es_bo.msg | 6 + venv/tcl/tcl8.6/msgs/es_cl.msg | 6 + venv/tcl/tcl8.6/msgs/es_co.msg | 6 + venv/tcl/tcl8.6/msgs/es_cr.msg | 6 + venv/tcl/tcl8.6/msgs/es_do.msg | 6 + venv/tcl/tcl8.6/msgs/es_ec.msg | 6 + venv/tcl/tcl8.6/msgs/es_gt.msg | 6 + venv/tcl/tcl8.6/msgs/es_hn.msg | 6 + venv/tcl/tcl8.6/msgs/es_mx.msg | 6 + venv/tcl/tcl8.6/msgs/es_ni.msg | 6 + venv/tcl/tcl8.6/msgs/es_pa.msg | 6 + venv/tcl/tcl8.6/msgs/es_pe.msg | 6 + venv/tcl/tcl8.6/msgs/es_pr.msg | 6 + venv/tcl/tcl8.6/msgs/es_py.msg | 6 + venv/tcl/tcl8.6/msgs/es_sv.msg | 6 + venv/tcl/tcl8.6/msgs/es_uy.msg | 6 + venv/tcl/tcl8.6/msgs/es_ve.msg | 6 + venv/tcl/tcl8.6/msgs/et.msg | 52 + venv/tcl/tcl8.6/msgs/eu.msg | 47 + venv/tcl/tcl8.6/msgs/eu_es.msg | 7 + venv/tcl/tcl8.6/msgs/fa.msg | 47 + venv/tcl/tcl8.6/msgs/fa_in.msg | 52 + venv/tcl/tcl8.6/msgs/fa_ir.msg | 9 + venv/tcl/tcl8.6/msgs/fi.msg | 50 + venv/tcl/tcl8.6/msgs/fo.msg | 47 + venv/tcl/tcl8.6/msgs/fo_fo.msg | 7 + venv/tcl/tcl8.6/msgs/fr.msg | 52 + venv/tcl/tcl8.6/msgs/fr_be.msg | 7 + venv/tcl/tcl8.6/msgs/fr_ca.msg | 7 + venv/tcl/tcl8.6/msgs/fr_ch.msg | 7 + venv/tcl/tcl8.6/msgs/ga.msg | 47 + venv/tcl/tcl8.6/msgs/ga_ie.msg | 7 + venv/tcl/tcl8.6/msgs/gl.msg | 47 + venv/tcl/tcl8.6/msgs/gl_es.msg | 6 + venv/tcl/tcl8.6/msgs/gv.msg | 47 + venv/tcl/tcl8.6/msgs/gv_gb.msg | 6 + venv/tcl/tcl8.6/msgs/he.msg | 52 + venv/tcl/tcl8.6/msgs/hi.msg | 39 + venv/tcl/tcl8.6/msgs/hi_in.msg | 6 + venv/tcl/tcl8.6/msgs/hr.msg | 50 + venv/tcl/tcl8.6/msgs/hu.msg | 54 + venv/tcl/tcl8.6/msgs/id.msg | 47 + venv/tcl/tcl8.6/msgs/id_id.msg | 6 + venv/tcl/tcl8.6/msgs/is.msg | 50 + venv/tcl/tcl8.6/msgs/it.msg | 54 + venv/tcl/tcl8.6/msgs/it_ch.msg | 6 + venv/tcl/tcl8.6/msgs/ja.msg | 44 + venv/tcl/tcl8.6/msgs/kl.msg | 47 + venv/tcl/tcl8.6/msgs/kl_gl.msg | 7 + venv/tcl/tcl8.6/msgs/ko.msg | 55 + venv/tcl/tcl8.6/msgs/ko_kr.msg | 8 + venv/tcl/tcl8.6/msgs/kok.msg | 39 + venv/tcl/tcl8.6/msgs/kok_in.msg | 6 + venv/tcl/tcl8.6/msgs/kw.msg | 47 + venv/tcl/tcl8.6/msgs/kw_gb.msg | 6 + venv/tcl/tcl8.6/msgs/lt.msg | 52 + venv/tcl/tcl8.6/msgs/lv.msg | 52 + venv/tcl/tcl8.6/msgs/mk.msg | 52 + venv/tcl/tcl8.6/msgs/mr.msg | 39 + venv/tcl/tcl8.6/msgs/mr_in.msg | 6 + venv/tcl/tcl8.6/msgs/ms.msg | 47 + venv/tcl/tcl8.6/msgs/ms_my.msg | 6 + venv/tcl/tcl8.6/msgs/mt.msg | 27 + venv/tcl/tcl8.6/msgs/nb.msg | 52 + venv/tcl/tcl8.6/msgs/nl.msg | 50 + venv/tcl/tcl8.6/msgs/nl_be.msg | 7 + venv/tcl/tcl8.6/msgs/nn.msg | 52 + venv/tcl/tcl8.6/msgs/pl.msg | 52 + venv/tcl/tcl8.6/msgs/pt.msg | 50 + venv/tcl/tcl8.6/msgs/pt_br.msg | 7 + venv/tcl/tcl8.6/msgs/ro.msg | 52 + venv/tcl/tcl8.6/msgs/ru.msg | 52 + venv/tcl/tcl8.6/msgs/ru_ua.msg | 6 + venv/tcl/tcl8.6/msgs/sh.msg | 52 + venv/tcl/tcl8.6/msgs/sk.msg | 52 + venv/tcl/tcl8.6/msgs/sl.msg | 52 + venv/tcl/tcl8.6/msgs/sq.msg | 54 + venv/tcl/tcl8.6/msgs/sr.msg | 52 + venv/tcl/tcl8.6/msgs/sv.msg | 52 + venv/tcl/tcl8.6/msgs/sw.msg | 49 + venv/tcl/tcl8.6/msgs/ta.msg | 39 + venv/tcl/tcl8.6/msgs/ta_in.msg | 6 + venv/tcl/tcl8.6/msgs/te.msg | 47 + venv/tcl/tcl8.6/msgs/te_in.msg | 8 + venv/tcl/tcl8.6/msgs/th.msg | 54 + venv/tcl/tcl8.6/msgs/tr.msg | 50 + venv/tcl/tcl8.6/msgs/uk.msg | 52 + venv/tcl/tcl8.6/msgs/vi.msg | 50 + venv/tcl/tcl8.6/msgs/zh.msg | 55 + venv/tcl/tcl8.6/msgs/zh_cn.msg | 7 + venv/tcl/tcl8.6/msgs/zh_hk.msg | 28 + venv/tcl/tcl8.6/msgs/zh_sg.msg | 8 + venv/tcl/tcl8.6/msgs/zh_tw.msg | 8 + venv/tcl/tcl8.6/opt0.4/optparse.tcl | 1072 +++ venv/tcl/tcl8.6/opt0.4/pkgIndex.tcl | 12 + venv/tcl/tcl8.6/package.tcl | 747 ++ venv/tcl/tcl8.6/parray.tcl | 28 + venv/tcl/tcl8.6/safe.tcl | 1133 +++ venv/tcl/tcl8.6/tclIndex | 75 + venv/tcl/tcl8.6/tm.tcl | 375 + venv/tcl/tcl8.6/tzdata/Africa/Abidjan | 6 + venv/tcl/tcl8.6/tzdata/Africa/Accra | 52 + venv/tcl/tcl8.6/tzdata/Africa/Addis_Ababa | 5 + venv/tcl/tcl8.6/tzdata/Africa/Algiers | 39 + venv/tcl/tcl8.6/tzdata/Africa/Asmara | 5 + venv/tcl/tcl8.6/tzdata/Africa/Asmera | 5 + venv/tcl/tcl8.6/tzdata/Africa/Bamako | 5 + venv/tcl/tcl8.6/tzdata/Africa/Bangui | 5 + venv/tcl/tcl8.6/tzdata/Africa/Banjul | 5 + venv/tcl/tcl8.6/tzdata/Africa/Bissau | 7 + venv/tcl/tcl8.6/tzdata/Africa/Blantyre | 5 + venv/tcl/tcl8.6/tzdata/Africa/Brazzaville | 5 + venv/tcl/tcl8.6/tzdata/Africa/Bujumbura | 5 + venv/tcl/tcl8.6/tzdata/Africa/Cairo | 132 + venv/tcl/tcl8.6/tzdata/Africa/Casablanca | 230 + venv/tcl/tcl8.6/tzdata/Africa/Ceuta | 258 + venv/tcl/tcl8.6/tzdata/Africa/Conakry | 5 + venv/tcl/tcl8.6/tzdata/Africa/Dakar | 5 + venv/tcl/tcl8.6/tzdata/Africa/Dar_es_Salaam | 5 + venv/tcl/tcl8.6/tzdata/Africa/Djibouti | 5 + venv/tcl/tcl8.6/tzdata/Africa/Douala | 5 + venv/tcl/tcl8.6/tzdata/Africa/El_Aaiun | 219 + venv/tcl/tcl8.6/tzdata/Africa/Freetown | 5 + venv/tcl/tcl8.6/tzdata/Africa/Gaborone | 5 + venv/tcl/tcl8.6/tzdata/Africa/Harare | 5 + venv/tcl/tcl8.6/tzdata/Africa/Johannesburg | 11 + venv/tcl/tcl8.6/tzdata/Africa/Juba | 39 + venv/tcl/tcl8.6/tzdata/Africa/Kampala | 5 + venv/tcl/tcl8.6/tzdata/Africa/Khartoum | 40 + venv/tcl/tcl8.6/tzdata/Africa/Kigali | 5 + venv/tcl/tcl8.6/tzdata/Africa/Kinshasa | 5 + venv/tcl/tcl8.6/tzdata/Africa/Lagos | 6 + venv/tcl/tcl8.6/tzdata/Africa/Libreville | 5 + venv/tcl/tcl8.6/tzdata/Africa/Lome | 5 + venv/tcl/tcl8.6/tzdata/Africa/Luanda | 5 + venv/tcl/tcl8.6/tzdata/Africa/Lubumbashi | 5 + venv/tcl/tcl8.6/tzdata/Africa/Lusaka | 5 + venv/tcl/tcl8.6/tzdata/Africa/Malabo | 5 + venv/tcl/tcl8.6/tzdata/Africa/Maputo | 6 + venv/tcl/tcl8.6/tzdata/Africa/Maseru | 5 + venv/tcl/tcl8.6/tzdata/Africa/Mbabane | 5 + venv/tcl/tcl8.6/tzdata/Africa/Mogadishu | 5 + venv/tcl/tcl8.6/tzdata/Africa/Monrovia | 8 + venv/tcl/tcl8.6/tzdata/Africa/Nairobi | 9 + venv/tcl/tcl8.6/tzdata/Africa/Ndjamena | 8 + venv/tcl/tcl8.6/tzdata/Africa/Niamey | 5 + venv/tcl/tcl8.6/tzdata/Africa/Nouakchott | 5 + venv/tcl/tcl8.6/tzdata/Africa/Ouagadougou | 5 + venv/tcl/tcl8.6/tzdata/Africa/Porto-Novo | 5 + venv/tcl/tcl8.6/tzdata/Africa/Sao_Tome | 5 + venv/tcl/tcl8.6/tzdata/Africa/Timbuktu | 5 + venv/tcl/tcl8.6/tzdata/Africa/Tripoli | 34 + venv/tcl/tcl8.6/tzdata/Africa/Tunis | 39 + venv/tcl/tcl8.6/tzdata/Africa/Windhoek | 59 + venv/tcl/tcl8.6/tzdata/America/Adak | 276 + venv/tcl/tcl8.6/tzdata/America/Anchorage | 275 + venv/tcl/tcl8.6/tzdata/America/Anguilla | 5 + venv/tcl/tcl8.6/tzdata/America/Antigua | 5 + venv/tcl/tcl8.6/tzdata/America/Araguaina | 60 + .../tzdata/America/Argentina/Buenos_Aires | 67 + .../tcl8.6/tzdata/America/Argentina/Catamarca | 68 + .../tzdata/America/Argentina/ComodRivadavia | 5 + .../tcl8.6/tzdata/America/Argentina/Cordoba | 67 + .../tcl/tcl8.6/tzdata/America/Argentina/Jujuy | 67 + .../tcl8.6/tzdata/America/Argentina/La_Rioja | 69 + .../tcl8.6/tzdata/America/Argentina/Mendoza | 68 + .../tzdata/America/Argentina/Rio_Gallegos | 68 + .../tcl/tcl8.6/tzdata/America/Argentina/Salta | 66 + .../tcl8.6/tzdata/America/Argentina/San_Juan | 69 + .../tcl8.6/tzdata/America/Argentina/San_Luis | 68 + .../tcl8.6/tzdata/America/Argentina/Tucuman | 69 + .../tcl8.6/tzdata/America/Argentina/Ushuaia | 68 + venv/tcl/tcl8.6/tzdata/America/Aruba | 5 + venv/tcl/tcl8.6/tzdata/America/Asuncion | 259 + venv/tcl/tcl8.6/tzdata/America/Atikokan | 12 + venv/tcl/tcl8.6/tzdata/America/Atka | 5 + venv/tcl/tcl8.6/tzdata/America/Bahia | 68 + venv/tcl/tcl8.6/tzdata/America/Bahia_Banderas | 222 + venv/tcl/tcl8.6/tzdata/America/Barbados | 15 + venv/tcl/tcl8.6/tzdata/America/Belem | 35 + venv/tcl/tcl8.6/tzdata/America/Belize | 60 + venv/tcl/tcl8.6/tzdata/America/Blanc-Sablon | 12 + venv/tcl/tcl8.6/tzdata/America/Boa_Vista | 40 + venv/tcl/tcl8.6/tzdata/America/Bogota | 9 + venv/tcl/tcl8.6/tzdata/America/Boise | 281 + venv/tcl/tcl8.6/tzdata/America/Buenos_Aires | 5 + venv/tcl/tcl8.6/tzdata/America/Cambridge_Bay | 252 + venv/tcl/tcl8.6/tzdata/America/Campo_Grande | 257 + venv/tcl/tcl8.6/tzdata/America/Cancun | 47 + venv/tcl/tcl8.6/tzdata/America/Caracas | 10 + venv/tcl/tcl8.6/tzdata/America/Catamarca | 5 + venv/tcl/tcl8.6/tzdata/America/Cayenne | 7 + venv/tcl/tcl8.6/tzdata/America/Cayman | 5 + venv/tcl/tcl8.6/tzdata/America/Chicago | 369 + venv/tcl/tcl8.6/tzdata/America/Chihuahua | 221 + venv/tcl/tcl8.6/tzdata/America/Coral_Harbour | 5 + venv/tcl/tcl8.6/tzdata/America/Cordoba | 5 + venv/tcl/tcl8.6/tzdata/America/Costa_Rica | 15 + venv/tcl/tcl8.6/tzdata/America/Creston | 8 + venv/tcl/tcl8.6/tzdata/America/Cuiaba | 257 + venv/tcl/tcl8.6/tzdata/America/Curacao | 7 + venv/tcl/tcl8.6/tzdata/America/Danmarkshavn | 39 + venv/tcl/tcl8.6/tzdata/America/Dawson | 256 + venv/tcl/tcl8.6/tzdata/America/Dawson_Creek | 64 + venv/tcl/tcl8.6/tzdata/America/Denver | 291 + venv/tcl/tcl8.6/tzdata/America/Detroit | 270 + venv/tcl/tcl8.6/tzdata/America/Dominica | 5 + venv/tcl/tcl8.6/tzdata/America/Edmonton | 284 + venv/tcl/tcl8.6/tzdata/America/Eirunepe | 41 + venv/tcl/tcl8.6/tzdata/America/El_Salvador | 10 + venv/tcl/tcl8.6/tzdata/America/Ensenada | 5 + venv/tcl/tcl8.6/tzdata/America/Fort_Nelson | 151 + venv/tcl/tcl8.6/tzdata/America/Fort_Wayne | 5 + venv/tcl/tcl8.6/tzdata/America/Fortaleza | 48 + venv/tcl/tcl8.6/tzdata/America/Glace_Bay | 273 + venv/tcl/tcl8.6/tzdata/America/Godthab | 246 + venv/tcl/tcl8.6/tzdata/America/Goose_Bay | 338 + venv/tcl/tcl8.6/tzdata/America/Grand_Turk | 246 + venv/tcl/tcl8.6/tzdata/America/Grenada | 5 + venv/tcl/tcl8.6/tzdata/America/Guadeloupe | 5 + venv/tcl/tcl8.6/tzdata/America/Guatemala | 14 + venv/tcl/tcl8.6/tzdata/America/Guayaquil | 9 + venv/tcl/tcl8.6/tzdata/America/Guyana | 8 + venv/tcl/tcl8.6/tzdata/America/Halifax | 361 + venv/tcl/tcl8.6/tzdata/America/Havana | 285 + venv/tcl/tcl8.6/tzdata/America/Hermosillo | 21 + .../tzdata/America/Indiana/Indianapolis | 234 + venv/tcl/tcl8.6/tzdata/America/Indiana/Knox | 285 + .../tcl/tcl8.6/tzdata/America/Indiana/Marengo | 236 + .../tcl8.6/tzdata/America/Indiana/Petersburg | 247 + .../tcl8.6/tzdata/America/Indiana/Tell_City | 234 + venv/tcl/tcl8.6/tzdata/America/Indiana/Vevay | 213 + .../tcl8.6/tzdata/America/Indiana/Vincennes | 234 + .../tcl/tcl8.6/tzdata/America/Indiana/Winamac | 240 + venv/tcl/tcl8.6/tzdata/America/Indianapolis | 5 + venv/tcl/tcl8.6/tzdata/America/Inuvik | 249 + venv/tcl/tcl8.6/tzdata/America/Iqaluit | 250 + venv/tcl/tcl8.6/tzdata/America/Jamaica | 29 + venv/tcl/tcl8.6/tzdata/America/Jujuy | 5 + venv/tcl/tcl8.6/tzdata/America/Juneau | 276 + .../tcl8.6/tzdata/America/Kentucky/Louisville | 314 + .../tcl8.6/tzdata/America/Kentucky/Monticello | 279 + venv/tcl/tcl8.6/tzdata/America/Knox_IN | 5 + venv/tcl/tcl8.6/tzdata/America/Kralendijk | 5 + venv/tcl/tcl8.6/tzdata/America/La_Paz | 8 + venv/tcl/tcl8.6/tzdata/America/Lima | 16 + venv/tcl/tcl8.6/tzdata/America/Los_Angeles | 317 + venv/tcl/tcl8.6/tzdata/America/Louisville | 5 + venv/tcl/tcl8.6/tzdata/America/Lower_Princes | 5 + venv/tcl/tcl8.6/tzdata/America/Maceio | 52 + venv/tcl/tcl8.6/tzdata/America/Managua | 21 + venv/tcl/tcl8.6/tzdata/America/Manaus | 39 + venv/tcl/tcl8.6/tzdata/America/Marigot | 5 + venv/tcl/tcl8.6/tzdata/America/Martinique | 9 + venv/tcl/tcl8.6/tzdata/America/Matamoros | 219 + venv/tcl/tcl8.6/tzdata/America/Mazatlan | 222 + venv/tcl/tcl8.6/tzdata/America/Mendoza | 5 + venv/tcl/tcl8.6/tzdata/America/Menominee | 274 + venv/tcl/tcl8.6/tzdata/America/Merida | 216 + venv/tcl/tcl8.6/tzdata/America/Metlakatla | 212 + venv/tcl/tcl8.6/tzdata/America/Mexico_City | 228 + venv/tcl/tcl8.6/tzdata/America/Miquelon | 234 + venv/tcl/tcl8.6/tzdata/America/Moncton | 342 + venv/tcl/tcl8.6/tzdata/America/Monterrey | 218 + venv/tcl/tcl8.6/tzdata/America/Montevideo | 96 + venv/tcl/tcl8.6/tzdata/America/Montreal | 5 + venv/tcl/tcl8.6/tzdata/America/Montserrat | 5 + venv/tcl/tcl8.6/tzdata/America/Nassau | 279 + venv/tcl/tcl8.6/tzdata/America/New_York | 369 + venv/tcl/tcl8.6/tzdata/America/Nipigon | 264 + venv/tcl/tcl8.6/tzdata/America/Nome | 276 + venv/tcl/tcl8.6/tzdata/America/Noronha | 48 + .../tcl8.6/tzdata/America/North_Dakota/Beulah | 279 + .../tcl8.6/tzdata/America/North_Dakota/Center | 279 + .../tzdata/America/North_Dakota/New_Salem | 279 + venv/tcl/tcl8.6/tzdata/America/Ojinaga | 222 + venv/tcl/tcl8.6/tzdata/America/Panama | 7 + venv/tcl/tcl8.6/tzdata/America/Pangnirtung | 252 + venv/tcl/tcl8.6/tzdata/America/Paramaribo | 9 + venv/tcl/tcl8.6/tzdata/America/Phoenix | 17 + venv/tcl/tcl8.6/tzdata/America/Port-au-Prince | 215 + venv/tcl/tcl8.6/tzdata/America/Port_of_Spain | 6 + venv/tcl/tcl8.6/tzdata/America/Porto_Acre | 5 + venv/tcl/tcl8.6/tzdata/America/Porto_Velho | 35 + venv/tcl/tcl8.6/tzdata/America/Puerto_Rico | 10 + venv/tcl/tcl8.6/tzdata/America/Punta_Arenas | 122 + venv/tcl/tcl8.6/tzdata/America/Rainy_River | 264 + venv/tcl/tcl8.6/tzdata/America/Rankin_Inlet | 248 + venv/tcl/tcl8.6/tzdata/America/Recife | 48 + venv/tcl/tcl8.6/tzdata/America/Regina | 58 + venv/tcl/tcl8.6/tzdata/America/Resolute | 248 + venv/tcl/tcl8.6/tzdata/America/Rio_Branco | 37 + venv/tcl/tcl8.6/tzdata/America/Rosario | 5 + venv/tcl/tcl8.6/tzdata/America/Santa_Isabel | 5 + venv/tcl/tcl8.6/tzdata/America/Santarem | 36 + venv/tcl/tcl8.6/tzdata/America/Santiago | 289 + venv/tcl/tcl8.6/tzdata/America/Santo_Domingo | 21 + venv/tcl/tcl8.6/tzdata/America/Sao_Paulo | 258 + venv/tcl/tcl8.6/tzdata/America/Scoresbysund | 246 + venv/tcl/tcl8.6/tzdata/America/Shiprock | 5 + venv/tcl/tcl8.6/tzdata/America/Sitka | 275 + venv/tcl/tcl8.6/tzdata/America/St_Barthelemy | 5 + venv/tcl/tcl8.6/tzdata/America/St_Johns | 372 + venv/tcl/tcl8.6/tzdata/America/St_Kitts | 5 + venv/tcl/tcl8.6/tzdata/America/St_Lucia | 5 + venv/tcl/tcl8.6/tzdata/America/St_Thomas | 5 + venv/tcl/tcl8.6/tzdata/America/St_Vincent | 5 + venv/tcl/tcl8.6/tzdata/America/Swift_Current | 29 + venv/tcl/tcl8.6/tzdata/America/Tegucigalpa | 12 + venv/tcl/tcl8.6/tzdata/America/Thule | 224 + venv/tcl/tcl8.6/tzdata/America/Thunder_Bay | 272 + venv/tcl/tcl8.6/tzdata/America/Tijuana | 285 + venv/tcl/tcl8.6/tzdata/America/Toronto | 365 + venv/tcl/tcl8.6/tzdata/America/Tortola | 5 + venv/tcl/tcl8.6/tzdata/America/Vancouver | 320 + venv/tcl/tcl8.6/tzdata/America/Virgin | 5 + venv/tcl/tcl8.6/tzdata/America/Whitehorse | 256 + venv/tcl/tcl8.6/tzdata/America/Winnipeg | 316 + venv/tcl/tcl8.6/tzdata/America/Yakutat | 276 + venv/tcl/tcl8.6/tzdata/America/Yellowknife | 252 + venv/tcl/tcl8.6/tzdata/Antarctica/Casey | 11 + venv/tcl/tcl8.6/tzdata/Antarctica/Davis | 12 + .../tcl8.6/tzdata/Antarctica/DumontDUrville | 8 + venv/tcl/tcl8.6/tzdata/Antarctica/Macquarie | 97 + venv/tcl/tcl8.6/tzdata/Antarctica/Mawson | 7 + venv/tcl/tcl8.6/tzdata/Antarctica/McMurdo | 5 + venv/tcl/tcl8.6/tzdata/Antarctica/Palmer | 87 + venv/tcl/tcl8.6/tzdata/Antarctica/Rothera | 6 + venv/tcl/tcl8.6/tzdata/Antarctica/South_Pole | 5 + venv/tcl/tcl8.6/tzdata/Antarctica/Syowa | 6 + venv/tcl/tcl8.6/tzdata/Antarctica/Troll | 196 + venv/tcl/tcl8.6/tzdata/Antarctica/Vostok | 6 + venv/tcl/tcl8.6/tzdata/Arctic/Longyearbyen | 5 + venv/tcl/tcl8.6/tzdata/Asia/Aden | 5 + venv/tcl/tcl8.6/tzdata/Asia/Almaty | 57 + venv/tcl/tcl8.6/tzdata/Asia/Amman | 246 + venv/tcl/tcl8.6/tzdata/Asia/Anadyr | 72 + venv/tcl/tcl8.6/tzdata/Asia/Aqtau | 58 + venv/tcl/tcl8.6/tzdata/Asia/Aqtobe | 58 + venv/tcl/tcl8.6/tzdata/Asia/Ashgabat | 31 + venv/tcl/tcl8.6/tzdata/Asia/Ashkhabad | 5 + venv/tcl/tcl8.6/tzdata/Asia/Atyrau | 58 + venv/tcl/tcl8.6/tzdata/Asia/Baghdad | 59 + venv/tcl/tcl8.6/tzdata/Asia/Bahrain | 5 + venv/tcl/tcl8.6/tzdata/Asia/Baku | 74 + venv/tcl/tcl8.6/tzdata/Asia/Bangkok | 7 + venv/tcl/tcl8.6/tzdata/Asia/Barnaul | 73 + venv/tcl/tcl8.6/tzdata/Asia/Beirut | 270 + venv/tcl/tcl8.6/tzdata/Asia/Bishkek | 58 + venv/tcl/tcl8.6/tzdata/Asia/Brunei | 7 + venv/tcl/tcl8.6/tzdata/Asia/Calcutta | 5 + venv/tcl/tcl8.6/tzdata/Asia/Chita | 72 + venv/tcl/tcl8.6/tzdata/Asia/Choibalsan | 56 + venv/tcl/tcl8.6/tzdata/Asia/Chongqing | 5 + venv/tcl/tcl8.6/tzdata/Asia/Chungking | 5 + venv/tcl/tcl8.6/tzdata/Asia/Colombo | 13 + venv/tcl/tcl8.6/tzdata/Asia/Dacca | 5 + venv/tcl/tcl8.6/tzdata/Asia/Damascus | 280 + venv/tcl/tcl8.6/tzdata/Asia/Dhaka | 13 + venv/tcl/tcl8.6/tzdata/Asia/Dili | 9 + venv/tcl/tcl8.6/tzdata/Asia/Dubai | 6 + venv/tcl/tcl8.6/tzdata/Asia/Dushanbe | 29 + venv/tcl/tcl8.6/tzdata/Asia/Famagusta | 256 + venv/tcl/tcl8.6/tzdata/Asia/Gaza | 278 + venv/tcl/tcl8.6/tzdata/Asia/Harbin | 5 + venv/tcl/tcl8.6/tzdata/Asia/Hebron | 277 + venv/tcl/tcl8.6/tzdata/Asia/Ho_Chi_Minh | 14 + venv/tcl/tcl8.6/tzdata/Asia/Hong_Kong | 75 + venv/tcl/tcl8.6/tzdata/Asia/Hovd | 55 + venv/tcl/tcl8.6/tzdata/Asia/Irkutsk | 72 + venv/tcl/tcl8.6/tzdata/Asia/Istanbul | 5 + venv/tcl/tcl8.6/tzdata/Asia/Jakarta | 13 + venv/tcl/tcl8.6/tzdata/Asia/Jayapura | 8 + venv/tcl/tcl8.6/tzdata/Asia/Jerusalem | 272 + venv/tcl/tcl8.6/tzdata/Asia/Kabul | 7 + venv/tcl/tcl8.6/tzdata/Asia/Kamchatka | 71 + venv/tcl/tcl8.6/tzdata/Asia/Karachi | 16 + venv/tcl/tcl8.6/tzdata/Asia/Kashgar | 5 + venv/tcl/tcl8.6/tzdata/Asia/Kathmandu | 7 + venv/tcl/tcl8.6/tzdata/Asia/Katmandu | 5 + venv/tcl/tcl8.6/tzdata/Asia/Khandyga | 73 + venv/tcl/tcl8.6/tzdata/Asia/Kolkata | 12 + venv/tcl/tcl8.6/tzdata/Asia/Krasnoyarsk | 71 + venv/tcl/tcl8.6/tzdata/Asia/Kuala_Lumpur | 13 + venv/tcl/tcl8.6/tzdata/Asia/Kuching | 23 + venv/tcl/tcl8.6/tzdata/Asia/Kuwait | 5 + venv/tcl/tcl8.6/tzdata/Asia/Macao | 5 + venv/tcl/tcl8.6/tzdata/Asia/Macau | 46 + venv/tcl/tcl8.6/tzdata/Asia/Magadan | 72 + venv/tcl/tcl8.6/tzdata/Asia/Makassar | 9 + venv/tcl/tcl8.6/tzdata/Asia/Manila | 15 + venv/tcl/tcl8.6/tzdata/Asia/Muscat | 5 + venv/tcl/tcl8.6/tzdata/Asia/Nicosia | 257 + venv/tcl/tcl8.6/tzdata/Asia/Novokuznetsk | 71 + venv/tcl/tcl8.6/tzdata/Asia/Novosibirsk | 73 + venv/tcl/tcl8.6/tzdata/Asia/Omsk | 71 + venv/tcl/tcl8.6/tzdata/Asia/Oral | 58 + venv/tcl/tcl8.6/tzdata/Asia/Phnom_Penh | 5 + venv/tcl/tcl8.6/tzdata/Asia/Pontianak | 13 + venv/tcl/tcl8.6/tzdata/Asia/Pyongyang | 9 + venv/tcl/tcl8.6/tzdata/Asia/Qatar | 7 + venv/tcl/tcl8.6/tzdata/Asia/Qyzylorda | 57 + venv/tcl/tcl8.6/tzdata/Asia/Rangoon | 5 + venv/tcl/tcl8.6/tzdata/Asia/Riyadh | 6 + venv/tcl/tcl8.6/tzdata/Asia/Saigon | 5 + venv/tcl/tcl8.6/tzdata/Asia/Sakhalin | 73 + venv/tcl/tcl8.6/tzdata/Asia/Samarkand | 31 + venv/tcl/tcl8.6/tzdata/Asia/Seoul | 26 + venv/tcl/tcl8.6/tzdata/Asia/Shanghai | 23 + venv/tcl/tcl8.6/tzdata/Asia/Singapore | 13 + venv/tcl/tcl8.6/tzdata/Asia/Srednekolymsk | 71 + venv/tcl/tcl8.6/tzdata/Asia/Taipei | 46 + venv/tcl/tcl8.6/tzdata/Asia/Tashkent | 31 + venv/tcl/tcl8.6/tzdata/Asia/Tbilisi | 60 + venv/tcl/tcl8.6/tzdata/Asia/Tehran | 229 + venv/tcl/tcl8.6/tzdata/Asia/Tel_Aviv | 5 + venv/tcl/tcl8.6/tzdata/Asia/Thimbu | 5 + venv/tcl/tcl8.6/tzdata/Asia/Thimphu | 7 + venv/tcl/tcl8.6/tzdata/Asia/Tokyo | 14 + venv/tcl/tcl8.6/tzdata/Asia/Tomsk | 73 + venv/tcl/tcl8.6/tzdata/Asia/Ujung_Pandang | 5 + venv/tcl/tcl8.6/tzdata/Asia/Ulaanbaatar | 55 + venv/tcl/tcl8.6/tzdata/Asia/Ulan_Bator | 5 + venv/tcl/tcl8.6/tzdata/Asia/Urumqi | 6 + venv/tcl/tcl8.6/tzdata/Asia/Ust-Nera | 71 + venv/tcl/tcl8.6/tzdata/Asia/Vientiane | 5 + venv/tcl/tcl8.6/tzdata/Asia/Vladivostok | 71 + venv/tcl/tcl8.6/tzdata/Asia/Yakutsk | 71 + venv/tcl/tcl8.6/tzdata/Asia/Yangon | 9 + venv/tcl/tcl8.6/tzdata/Asia/Yekaterinburg | 72 + venv/tcl/tcl8.6/tzdata/Asia/Yerevan | 70 + venv/tcl/tcl8.6/tzdata/Atlantic/Azores | 345 + venv/tcl/tcl8.6/tzdata/Atlantic/Bermuda | 259 + venv/tcl/tcl8.6/tzdata/Atlantic/Canary | 247 + venv/tcl/tcl8.6/tzdata/Atlantic/Cape_Verde | 9 + venv/tcl/tcl8.6/tzdata/Atlantic/Faeroe | 5 + venv/tcl/tcl8.6/tzdata/Atlantic/Faroe | 245 + venv/tcl/tcl8.6/tzdata/Atlantic/Jan_Mayen | 5 + venv/tcl/tcl8.6/tzdata/Atlantic/Madeira | 346 + venv/tcl/tcl8.6/tzdata/Atlantic/Reykjavik | 73 + venv/tcl/tcl8.6/tzdata/Atlantic/South_Georgia | 6 + venv/tcl/tcl8.6/tzdata/Atlantic/St_Helena | 5 + venv/tcl/tcl8.6/tzdata/Atlantic/Stanley | 75 + venv/tcl/tcl8.6/tzdata/Australia/ACT | 5 + venv/tcl/tcl8.6/tzdata/Australia/Adelaide | 273 + venv/tcl/tcl8.6/tzdata/Australia/Brisbane | 23 + venv/tcl/tcl8.6/tzdata/Australia/Broken_Hill | 275 + venv/tcl/tcl8.6/tzdata/Australia/Canberra | 5 + venv/tcl/tcl8.6/tzdata/Australia/Currie | 273 + venv/tcl/tcl8.6/tzdata/Australia/Darwin | 15 + venv/tcl/tcl8.6/tzdata/Australia/Eucla | 25 + venv/tcl/tcl8.6/tzdata/Australia/Hobart | 281 + venv/tcl/tcl8.6/tzdata/Australia/LHI | 5 + venv/tcl/tcl8.6/tzdata/Australia/Lindeman | 28 + venv/tcl/tcl8.6/tzdata/Australia/Lord_Howe | 245 + venv/tcl/tcl8.6/tzdata/Australia/Melbourne | 272 + venv/tcl/tcl8.6/tzdata/Australia/NSW | 5 + venv/tcl/tcl8.6/tzdata/Australia/North | 5 + venv/tcl/tcl8.6/tzdata/Australia/Perth | 25 + venv/tcl/tcl8.6/tzdata/Australia/Queensland | 5 + venv/tcl/tcl8.6/tzdata/Australia/South | 5 + venv/tcl/tcl8.6/tzdata/Australia/Sydney | 272 + venv/tcl/tcl8.6/tzdata/Australia/Tasmania | 5 + venv/tcl/tcl8.6/tzdata/Australia/Victoria | 5 + venv/tcl/tcl8.6/tzdata/Australia/West | 5 + venv/tcl/tcl8.6/tzdata/Australia/Yancowinna | 5 + venv/tcl/tcl8.6/tzdata/Brazil/Acre | 5 + venv/tcl/tcl8.6/tzdata/Brazil/DeNoronha | 5 + venv/tcl/tcl8.6/tzdata/Brazil/East | 5 + venv/tcl/tcl8.6/tzdata/Brazil/West | 5 + venv/tcl/tcl8.6/tzdata/CET | 265 + venv/tcl/tcl8.6/tzdata/CST6CDT | 278 + venv/tcl/tcl8.6/tzdata/Canada/Atlantic | 5 + venv/tcl/tcl8.6/tzdata/Canada/Central | 5 + .../tcl8.6/tzdata/Canada/East-Saskatchewan | 5 + venv/tcl/tcl8.6/tzdata/Canada/Eastern | 5 + venv/tcl/tcl8.6/tzdata/Canada/Mountain | 5 + venv/tcl/tcl8.6/tzdata/Canada/Newfoundland | 5 + venv/tcl/tcl8.6/tzdata/Canada/Pacific | 5 + venv/tcl/tcl8.6/tzdata/Canada/Saskatchewan | 5 + venv/tcl/tcl8.6/tzdata/Canada/Yukon | 5 + venv/tcl/tcl8.6/tzdata/Chile/Continental | 5 + venv/tcl/tcl8.6/tzdata/Chile/EasterIsland | 5 + venv/tcl/tcl8.6/tzdata/Cuba | 5 + venv/tcl/tcl8.6/tzdata/EET | 251 + venv/tcl/tcl8.6/tzdata/EST | 5 + venv/tcl/tcl8.6/tzdata/EST5EDT | 278 + venv/tcl/tcl8.6/tzdata/Egypt | 5 + venv/tcl/tcl8.6/tzdata/Eire | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT+0 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT+1 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT+10 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT+11 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT+12 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT+2 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT+3 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT+4 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT+5 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT+6 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT+7 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT+8 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT+9 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-0 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-1 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-10 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-11 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-12 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-13 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-14 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-2 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-3 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-4 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-5 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-6 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-7 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-8 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT-9 | 5 + venv/tcl/tcl8.6/tzdata/Etc/GMT0 | 5 + venv/tcl/tcl8.6/tzdata/Etc/Greenwich | 5 + venv/tcl/tcl8.6/tzdata/Etc/UCT | 5 + venv/tcl/tcl8.6/tzdata/Etc/UTC | 5 + venv/tcl/tcl8.6/tzdata/Etc/Universal | 5 + venv/tcl/tcl8.6/tzdata/Etc/Zulu | 5 + venv/tcl/tcl8.6/tzdata/Europe/Amsterdam | 310 + venv/tcl/tcl8.6/tzdata/Europe/Andorra | 237 + venv/tcl/tcl8.6/tzdata/Europe/Astrakhan | 71 + venv/tcl/tcl8.6/tzdata/Europe/Athens | 268 + venv/tcl/tcl8.6/tzdata/Europe/Belfast | 5 + venv/tcl/tcl8.6/tzdata/Europe/Belgrade | 250 + venv/tcl/tcl8.6/tzdata/Europe/Berlin | 274 + venv/tcl/tcl8.6/tzdata/Europe/Bratislava | 5 + venv/tcl/tcl8.6/tzdata/Europe/Brussels | 316 + venv/tcl/tcl8.6/tzdata/Europe/Bucharest | 268 + venv/tcl/tcl8.6/tzdata/Europe/Budapest | 282 + venv/tcl/tcl8.6/tzdata/Europe/Busingen | 5 + venv/tcl/tcl8.6/tzdata/Europe/Chisinau | 272 + venv/tcl/tcl8.6/tzdata/Europe/Copenhagen | 264 + venv/tcl/tcl8.6/tzdata/Europe/Dublin | 359 + venv/tcl/tcl8.6/tzdata/Europe/Gibraltar | 328 + venv/tcl/tcl8.6/tzdata/Europe/Guernsey | 5 + venv/tcl/tcl8.6/tzdata/Europe/Helsinki | 248 + venv/tcl/tcl8.6/tzdata/Europe/Isle_of_Man | 5 + venv/tcl/tcl8.6/tzdata/Europe/Istanbul | 140 + venv/tcl/tcl8.6/tzdata/Europe/Jersey | 5 + venv/tcl/tcl8.6/tzdata/Europe/Kaliningrad | 85 + venv/tcl/tcl8.6/tzdata/Europe/Kiev | 251 + venv/tcl/tcl8.6/tzdata/Europe/Kirov | 70 + venv/tcl/tcl8.6/tzdata/Europe/Lisbon | 351 + venv/tcl/tcl8.6/tzdata/Europe/Ljubljana | 5 + venv/tcl/tcl8.6/tzdata/Europe/London | 372 + venv/tcl/tcl8.6/tzdata/Europe/Luxembourg | 313 + venv/tcl/tcl8.6/tzdata/Europe/Madrid | 292 + venv/tcl/tcl8.6/tzdata/Europe/Malta | 299 + venv/tcl/tcl8.6/tzdata/Europe/Mariehamn | 5 + venv/tcl/tcl8.6/tzdata/Europe/Minsk | 75 + venv/tcl/tcl8.6/tzdata/Europe/Monaco | 315 + venv/tcl/tcl8.6/tzdata/Europe/Moscow | 83 + venv/tcl/tcl8.6/tzdata/Europe/Nicosia | 5 + venv/tcl/tcl8.6/tzdata/Europe/Oslo | 271 + venv/tcl/tcl8.6/tzdata/Europe/Paris | 314 + venv/tcl/tcl8.6/tzdata/Europe/Podgorica | 5 + venv/tcl/tcl8.6/tzdata/Europe/Prague | 272 + venv/tcl/tcl8.6/tzdata/Europe/Riga | 258 + venv/tcl/tcl8.6/tzdata/Europe/Rome | 302 + venv/tcl/tcl8.6/tzdata/Europe/Samara | 73 + venv/tcl/tcl8.6/tzdata/Europe/San_Marino | 5 + venv/tcl/tcl8.6/tzdata/Europe/Sarajevo | 5 + venv/tcl/tcl8.6/tzdata/Europe/Saratov | 71 + venv/tcl/tcl8.6/tzdata/Europe/Simferopol | 82 + venv/tcl/tcl8.6/tzdata/Europe/Skopje | 5 + venv/tcl/tcl8.6/tzdata/Europe/Sofia | 258 + venv/tcl/tcl8.6/tzdata/Europe/Stockholm | 250 + venv/tcl/tcl8.6/tzdata/Europe/Tallinn | 254 + venv/tcl/tcl8.6/tzdata/Europe/Tirane | 263 + venv/tcl/tcl8.6/tzdata/Europe/Tiraspol | 5 + venv/tcl/tcl8.6/tzdata/Europe/Ulyanovsk | 73 + venv/tcl/tcl8.6/tzdata/Europe/Uzhgorod | 254 + venv/tcl/tcl8.6/tzdata/Europe/Vaduz | 5 + venv/tcl/tcl8.6/tzdata/Europe/Vatican | 5 + venv/tcl/tcl8.6/tzdata/Europe/Vienna | 271 + venv/tcl/tcl8.6/tzdata/Europe/Vilnius | 252 + venv/tcl/tcl8.6/tzdata/Europe/Volgograd | 71 + venv/tcl/tcl8.6/tzdata/Europe/Warsaw | 296 + venv/tcl/tcl8.6/tzdata/Europe/Zagreb | 5 + venv/tcl/tcl8.6/tzdata/Europe/Zaporozhye | 252 + venv/tcl/tcl8.6/tzdata/Europe/Zurich | 250 + venv/tcl/tcl8.6/tzdata/GB | 5 + venv/tcl/tcl8.6/tzdata/GB-Eire | 5 + venv/tcl/tcl8.6/tzdata/GMT | 5 + venv/tcl/tcl8.6/tzdata/GMT+0 | 5 + venv/tcl/tcl8.6/tzdata/GMT-0 | 5 + venv/tcl/tcl8.6/tzdata/GMT0 | 5 + venv/tcl/tcl8.6/tzdata/Greenwich | 5 + venv/tcl/tcl8.6/tzdata/HST | 5 + venv/tcl/tcl8.6/tzdata/Hongkong | 5 + venv/tcl/tcl8.6/tzdata/Iceland | 5 + venv/tcl/tcl8.6/tzdata/Indian/Antananarivo | 5 + venv/tcl/tcl8.6/tzdata/Indian/Chagos | 7 + venv/tcl/tcl8.6/tzdata/Indian/Christmas | 6 + venv/tcl/tcl8.6/tzdata/Indian/Cocos | 6 + venv/tcl/tcl8.6/tzdata/Indian/Comoro | 5 + venv/tcl/tcl8.6/tzdata/Indian/Kerguelen | 6 + venv/tcl/tcl8.6/tzdata/Indian/Mahe | 6 + venv/tcl/tcl8.6/tzdata/Indian/Maldives | 7 + venv/tcl/tcl8.6/tzdata/Indian/Mauritius | 10 + venv/tcl/tcl8.6/tzdata/Indian/Mayotte | 5 + venv/tcl/tcl8.6/tzdata/Indian/Reunion | 6 + venv/tcl/tcl8.6/tzdata/Iran | 5 + venv/tcl/tcl8.6/tzdata/Israel | 5 + venv/tcl/tcl8.6/tzdata/Jamaica | 5 + venv/tcl/tcl8.6/tzdata/Japan | 5 + venv/tcl/tcl8.6/tzdata/Kwajalein | 5 + venv/tcl/tcl8.6/tzdata/Libya | 5 + venv/tcl/tcl8.6/tzdata/MET | 265 + venv/tcl/tcl8.6/tzdata/MST | 5 + venv/tcl/tcl8.6/tzdata/MST7MDT | 278 + venv/tcl/tcl8.6/tzdata/Mexico/BajaNorte | 5 + venv/tcl/tcl8.6/tzdata/Mexico/BajaSur | 5 + venv/tcl/tcl8.6/tzdata/Mexico/General | 5 + venv/tcl/tcl8.6/tzdata/NZ | 5 + venv/tcl/tcl8.6/tzdata/NZ-CHAT | 5 + venv/tcl/tcl8.6/tzdata/Navajo | 5 + venv/tcl/tcl8.6/tzdata/PRC | 5 + venv/tcl/tcl8.6/tzdata/PST8PDT | 278 + venv/tcl/tcl8.6/tzdata/Pacific/Apia | 188 + venv/tcl/tcl8.6/tzdata/Pacific/Auckland | 285 + venv/tcl/tcl8.6/tzdata/Pacific/Bougainville | 10 + venv/tcl/tcl8.6/tzdata/Pacific/Chatham | 258 + venv/tcl/tcl8.6/tzdata/Pacific/Chuuk | 6 + venv/tcl/tcl8.6/tzdata/Pacific/Easter | 268 + venv/tcl/tcl8.6/tzdata/Pacific/Efate | 26 + venv/tcl/tcl8.6/tzdata/Pacific/Enderbury | 8 + venv/tcl/tcl8.6/tzdata/Pacific/Fakaofo | 7 + venv/tcl/tcl8.6/tzdata/Pacific/Fiji | 191 + venv/tcl/tcl8.6/tzdata/Pacific/Funafuti | 6 + venv/tcl/tcl8.6/tzdata/Pacific/Galapagos | 9 + venv/tcl/tcl8.6/tzdata/Pacific/Gambier | 6 + venv/tcl/tcl8.6/tzdata/Pacific/Guadalcanal | 6 + venv/tcl/tcl8.6/tzdata/Pacific/Guam | 8 + venv/tcl/tcl8.6/tzdata/Pacific/Honolulu | 11 + venv/tcl/tcl8.6/tzdata/Pacific/Johnston | 5 + venv/tcl/tcl8.6/tzdata/Pacific/Kiritimati | 8 + venv/tcl/tcl8.6/tzdata/Pacific/Kosrae | 8 + venv/tcl/tcl8.6/tzdata/Pacific/Kwajalein | 8 + venv/tcl/tcl8.6/tzdata/Pacific/Majuro | 7 + venv/tcl/tcl8.6/tzdata/Pacific/Marquesas | 6 + venv/tcl/tcl8.6/tzdata/Pacific/Midway | 5 + venv/tcl/tcl8.6/tzdata/Pacific/Nauru | 9 + venv/tcl/tcl8.6/tzdata/Pacific/Niue | 8 + venv/tcl/tcl8.6/tzdata/Pacific/Norfolk | 10 + venv/tcl/tcl8.6/tzdata/Pacific/Noumea | 12 + venv/tcl/tcl8.6/tzdata/Pacific/Pago_Pago | 7 + venv/tcl/tcl8.6/tzdata/Pacific/Palau | 6 + venv/tcl/tcl8.6/tzdata/Pacific/Pitcairn | 7 + venv/tcl/tcl8.6/tzdata/Pacific/Pohnpei | 6 + venv/tcl/tcl8.6/tzdata/Pacific/Ponape | 5 + venv/tcl/tcl8.6/tzdata/Pacific/Port_Moresby | 7 + venv/tcl/tcl8.6/tzdata/Pacific/Rarotonga | 32 + venv/tcl/tcl8.6/tzdata/Pacific/Saipan | 5 + venv/tcl/tcl8.6/tzdata/Pacific/Samoa | 5 + venv/tcl/tcl8.6/tzdata/Pacific/Tahiti | 6 + venv/tcl/tcl8.6/tzdata/Pacific/Tarawa | 6 + venv/tcl/tcl8.6/tzdata/Pacific/Tongatapu | 16 + venv/tcl/tcl8.6/tzdata/Pacific/Truk | 5 + venv/tcl/tcl8.6/tzdata/Pacific/Wake | 6 + venv/tcl/tcl8.6/tzdata/Pacific/Wallis | 6 + venv/tcl/tcl8.6/tzdata/Pacific/Yap | 5 + venv/tcl/tcl8.6/tzdata/Poland | 5 + venv/tcl/tcl8.6/tzdata/Portugal | 5 + venv/tcl/tcl8.6/tzdata/ROC | 5 + venv/tcl/tcl8.6/tzdata/ROK | 5 + venv/tcl/tcl8.6/tzdata/Singapore | 5 + venv/tcl/tcl8.6/tzdata/SystemV/AST4 | 5 + venv/tcl/tcl8.6/tzdata/SystemV/AST4ADT | 5 + venv/tcl/tcl8.6/tzdata/SystemV/CST6 | 5 + venv/tcl/tcl8.6/tzdata/SystemV/CST6CDT | 5 + venv/tcl/tcl8.6/tzdata/SystemV/EST5 | 5 + venv/tcl/tcl8.6/tzdata/SystemV/EST5EDT | 5 + venv/tcl/tcl8.6/tzdata/SystemV/HST10 | 5 + venv/tcl/tcl8.6/tzdata/SystemV/MST7 | 5 + venv/tcl/tcl8.6/tzdata/SystemV/MST7MDT | 5 + venv/tcl/tcl8.6/tzdata/SystemV/PST8 | 5 + venv/tcl/tcl8.6/tzdata/SystemV/PST8PDT | 5 + venv/tcl/tcl8.6/tzdata/SystemV/YST9 | 5 + venv/tcl/tcl8.6/tzdata/SystemV/YST9YDT | 5 + venv/tcl/tcl8.6/tzdata/Turkey | 5 + venv/tcl/tcl8.6/tzdata/UCT | 5 + venv/tcl/tcl8.6/tzdata/US/Alaska | 5 + venv/tcl/tcl8.6/tzdata/US/Aleutian | 5 + venv/tcl/tcl8.6/tzdata/US/Arizona | 5 + venv/tcl/tcl8.6/tzdata/US/Central | 5 + venv/tcl/tcl8.6/tzdata/US/East-Indiana | 5 + venv/tcl/tcl8.6/tzdata/US/Eastern | 5 + venv/tcl/tcl8.6/tzdata/US/Hawaii | 5 + venv/tcl/tcl8.6/tzdata/US/Indiana-Starke | 5 + venv/tcl/tcl8.6/tzdata/US/Michigan | 5 + venv/tcl/tcl8.6/tzdata/US/Mountain | 5 + venv/tcl/tcl8.6/tzdata/US/Pacific | 5 + venv/tcl/tcl8.6/tzdata/US/Pacific-New | 5 + venv/tcl/tcl8.6/tzdata/US/Samoa | 5 + venv/tcl/tcl8.6/tzdata/UTC | 5 + venv/tcl/tcl8.6/tzdata/Universal | 5 + venv/tcl/tcl8.6/tzdata/W-SU | 5 + venv/tcl/tcl8.6/tzdata/WET | 251 + venv/tcl/tcl8.6/tzdata/Zulu | 5 + venv/tcl/tcl8.6/word.tcl | 152 + venv/tcl/tk8.6/bgerror.tcl | 265 + venv/tcl/tk8.6/button.tcl | 778 ++ venv/tcl/tk8.6/choosedir.tcl | 308 + venv/tcl/tk8.6/clrpick.tcl | 695 ++ venv/tcl/tk8.6/comdlg.tcl | 319 + venv/tcl/tk8.6/console.tcl | 1150 +++ venv/tcl/tk8.6/demos/README | 44 + venv/tcl/tk8.6/demos/anilabel.tcl | 160 + venv/tcl/tk8.6/demos/aniwave.tcl | 104 + venv/tcl/tk8.6/demos/arrow.tcl | 237 + venv/tcl/tk8.6/demos/bind.tcl | 78 + venv/tcl/tk8.6/demos/bitmap.tcl | 52 + venv/tcl/tk8.6/demos/browse | 66 + venv/tcl/tk8.6/demos/button.tcl | 47 + venv/tcl/tk8.6/demos/check.tcl | 71 + venv/tcl/tk8.6/demos/clrpick.tcl | 54 + venv/tcl/tk8.6/demos/colors.tcl | 99 + venv/tcl/tk8.6/demos/combo.tcl | 61 + venv/tcl/tk8.6/demos/cscroll.tcl | 108 + venv/tcl/tk8.6/demos/ctext.tcl | 172 + venv/tcl/tk8.6/demos/dialog1.tcl | 13 + venv/tcl/tk8.6/demos/dialog2.tcl | 17 + venv/tcl/tk8.6/demos/en.msg | 97 + venv/tcl/tk8.6/demos/entry1.tcl | 34 + venv/tcl/tk8.6/demos/entry2.tcl | 46 + venv/tcl/tk8.6/demos/entry3.tcl | 185 + venv/tcl/tk8.6/demos/filebox.tcl | 81 + venv/tcl/tk8.6/demos/floor.tcl | 1366 +++ venv/tcl/tk8.6/demos/fontchoose.tcl | 69 + venv/tcl/tk8.6/demos/form.tcl | 38 + venv/tcl/tk8.6/demos/goldberg.tcl | 1833 ++++ venv/tcl/tk8.6/demos/hello | 22 + venv/tcl/tk8.6/demos/hscale.tcl | 45 + venv/tcl/tk8.6/demos/icon.tcl | 51 + venv/tcl/tk8.6/demos/image1.tcl | 35 + venv/tcl/tk8.6/demos/image2.tcl | 108 + venv/tcl/tk8.6/demos/images/earth.gif | Bin 0 -> 51712 bytes venv/tcl/tk8.6/demos/images/earthmenu.png | Bin 0 -> 8157 bytes venv/tcl/tk8.6/demos/images/earthris.gif | Bin 0 -> 6343 bytes venv/tcl/tk8.6/demos/images/flagdown.xbm | 27 + venv/tcl/tk8.6/demos/images/flagup.xbm | 27 + venv/tcl/tk8.6/demos/images/gray25.xbm | 6 + venv/tcl/tk8.6/demos/images/letters.xbm | 27 + venv/tcl/tk8.6/demos/images/noletter.xbm | 27 + venv/tcl/tk8.6/demos/images/ouster.png | Bin 0 -> 54257 bytes venv/tcl/tk8.6/demos/images/pattern.xbm | 6 + venv/tcl/tk8.6/demos/images/tcllogo.gif | Bin 0 -> 2341 bytes venv/tcl/tk8.6/demos/images/teapot.ppm | 31 + venv/tcl/tk8.6/demos/items.tcl | 291 + venv/tcl/tk8.6/demos/ixset | 328 + venv/tcl/tk8.6/demos/knightstour.tcl | 268 + venv/tcl/tk8.6/demos/label.tcl | 40 + venv/tcl/tk8.6/demos/labelframe.tcl | 76 + venv/tcl/tk8.6/demos/license.terms | 40 + venv/tcl/tk8.6/demos/mclist.tcl | 119 + venv/tcl/tk8.6/demos/menu.tcl | 163 + venv/tcl/tk8.6/demos/menubu.tcl | 90 + venv/tcl/tk8.6/demos/msgbox.tcl | 62 + venv/tcl/tk8.6/demos/nl.msg | 125 + venv/tcl/tk8.6/demos/paned1.tcl | 32 + venv/tcl/tk8.6/demos/paned2.tcl | 74 + venv/tcl/tk8.6/demos/pendulum.tcl | 197 + venv/tcl/tk8.6/demos/plot.tcl | 97 + venv/tcl/tk8.6/demos/puzzle.tcl | 82 + venv/tcl/tk8.6/demos/radio.tcl | 66 + venv/tcl/tk8.6/demos/rmt | 210 + venv/tcl/tk8.6/demos/rolodex | 204 + venv/tcl/tk8.6/demos/ruler.tcl | 171 + venv/tcl/tk8.6/demos/sayings.tcl | 44 + venv/tcl/tk8.6/demos/search.tcl | 139 + venv/tcl/tk8.6/demos/spin.tcl | 53 + venv/tcl/tk8.6/demos/square | 60 + venv/tcl/tk8.6/demos/states.tcl | 54 + venv/tcl/tk8.6/demos/style.tcl | 155 + venv/tcl/tk8.6/demos/tclIndex | 67 + venv/tcl/tk8.6/demos/tcolor | 358 + venv/tcl/tk8.6/demos/text.tcl | 111 + venv/tcl/tk8.6/demos/textpeer.tcl | 62 + venv/tcl/tk8.6/demos/timer | 47 + venv/tcl/tk8.6/demos/toolbar.tcl | 92 + venv/tcl/tk8.6/demos/tree.tcl | 88 + venv/tcl/tk8.6/demos/ttkbut.tcl | 84 + venv/tcl/tk8.6/demos/ttkmenu.tcl | 53 + venv/tcl/tk8.6/demos/ttknote.tcl | 57 + venv/tcl/tk8.6/demos/ttkpane.tcl | 112 + venv/tcl/tk8.6/demos/ttkprogress.tcl | 46 + venv/tcl/tk8.6/demos/ttkscale.tcl | 39 + venv/tcl/tk8.6/demos/twind.tcl | 327 + venv/tcl/tk8.6/demos/unicodeout.tcl | 137 + venv/tcl/tk8.6/demos/vscale.tcl | 46 + venv/tcl/tk8.6/demos/widget | 721 ++ venv/tcl/tk8.6/dialog.tcl | 180 + venv/tcl/tk8.6/entry.tcl | 654 ++ venv/tcl/tk8.6/focus.tcl | 178 + venv/tcl/tk8.6/fontchooser.tcl | 452 + venv/tcl/tk8.6/iconlist.tcl | 696 ++ venv/tcl/tk8.6/icons.tcl | 153 + venv/tcl/tk8.6/images/README | 7 + venv/tcl/tk8.6/images/logo.eps | 2091 +++++ venv/tcl/tk8.6/images/logo100.gif | Bin 0 -> 2341 bytes venv/tcl/tk8.6/images/logo64.gif | Bin 0 -> 1670 bytes venv/tcl/tk8.6/images/logoLarge.gif | Bin 0 -> 11000 bytes venv/tcl/tk8.6/images/logoMed.gif | Bin 0 -> 3889 bytes venv/tcl/tk8.6/images/pwrdLogo.eps | 1897 ++++ venv/tcl/tk8.6/images/pwrdLogo100.gif | Bin 0 -> 1615 bytes venv/tcl/tk8.6/images/pwrdLogo150.gif | Bin 0 -> 2489 bytes venv/tcl/tk8.6/images/pwrdLogo175.gif | Bin 0 -> 2981 bytes venv/tcl/tk8.6/images/pwrdLogo200.gif | Bin 0 -> 3491 bytes venv/tcl/tk8.6/images/pwrdLogo75.gif | Bin 0 -> 1171 bytes venv/tcl/tk8.6/images/tai-ku.gif | Bin 0 -> 5473 bytes venv/tcl/tk8.6/license.terms | 40 + venv/tcl/tk8.6/listbox.tcl | 552 ++ venv/tcl/tk8.6/megawidget.tcl | 297 + venv/tcl/tk8.6/menu.tcl | 1354 +++ venv/tcl/tk8.6/mkpsenc.tcl | 1488 +++ venv/tcl/tk8.6/msgbox.tcl | 429 + venv/tcl/tk8.6/msgs/cs.msg | 77 + venv/tcl/tk8.6/msgs/da.msg | 78 + venv/tcl/tk8.6/msgs/de.msg | 91 + venv/tcl/tk8.6/msgs/el.msg | 86 + venv/tcl/tk8.6/msgs/en.msg | 91 + venv/tcl/tk8.6/msgs/en_gb.msg | 3 + venv/tcl/tk8.6/msgs/eo.msg | 75 + venv/tcl/tk8.6/msgs/es.msg | 76 + venv/tcl/tk8.6/msgs/fr.msg | 72 + venv/tcl/tk8.6/msgs/hu.msg | 78 + venv/tcl/tk8.6/msgs/it.msg | 73 + venv/tcl/tk8.6/msgs/nl.msg | 91 + venv/tcl/tk8.6/msgs/pl.msg | 91 + venv/tcl/tk8.6/msgs/pt.msg | 74 + venv/tcl/tk8.6/msgs/ru.msg | 75 + venv/tcl/tk8.6/msgs/sv.msg | 76 + venv/tcl/tk8.6/obsolete.tcl | 178 + venv/tcl/tk8.6/optMenu.tcl | 43 + venv/tcl/tk8.6/palette.tcl | 244 + venv/tcl/tk8.6/panedwindow.tcl | 194 + venv/tcl/tk8.6/pkgIndex.tcl | 7 + venv/tcl/tk8.6/safetk.tcl | 262 + venv/tcl/tk8.6/scale.tcl | 290 + venv/tcl/tk8.6/scrlbar.tcl | 454 + venv/tcl/tk8.6/spinbox.tcl | 580 ++ venv/tcl/tk8.6/tclIndex | 253 + venv/tcl/tk8.6/tearoff.tcl | 180 + venv/tcl/tk8.6/text.tcl | 1207 +++ venv/tcl/tk8.6/tk.tcl | 695 ++ venv/tcl/tk8.6/tkfbox.tcl | 1240 +++ venv/tcl/tk8.6/ttk/altTheme.tcl | 107 + venv/tcl/tk8.6/ttk/aquaTheme.tcl | 59 + venv/tcl/tk8.6/ttk/button.tcl | 83 + venv/tcl/tk8.6/ttk/clamTheme.tcl | 145 + venv/tcl/tk8.6/ttk/classicTheme.tcl | 113 + venv/tcl/tk8.6/ttk/combobox.tcl | 457 + venv/tcl/tk8.6/ttk/cursors.tcl | 186 + venv/tcl/tk8.6/ttk/defaults.tcl | 141 + venv/tcl/tk8.6/ttk/entry.tcl | 607 ++ venv/tcl/tk8.6/ttk/fonts.tcl | 157 + venv/tcl/tk8.6/ttk/menubutton.tcl | 169 + venv/tcl/tk8.6/ttk/notebook.tcl | 197 + venv/tcl/tk8.6/ttk/panedwindow.tcl | 82 + venv/tcl/tk8.6/ttk/progress.tcl | 49 + venv/tcl/tk8.6/ttk/scale.tcl | 94 + venv/tcl/tk8.6/ttk/scrollbar.tcl | 123 + venv/tcl/tk8.6/ttk/sizegrip.tcl | 102 + venv/tcl/tk8.6/ttk/spinbox.tcl | 173 + venv/tcl/tk8.6/ttk/treeview.tcl | 363 + venv/tcl/tk8.6/ttk/ttk.tcl | 176 + venv/tcl/tk8.6/ttk/utils.tcl | 350 + venv/tcl/tk8.6/ttk/vistaTheme.tcl | 224 + venv/tcl/tk8.6/ttk/winTheme.tcl | 80 + venv/tcl/tk8.6/ttk/xpTheme.tcl | 65 + venv/tcl/tk8.6/unsupported.tcl | 269 + venv/tcl/tk8.6/xmfbox.tcl | 989 ++ 5232 files changed, 540947 insertions(+) create mode 100644 .env create mode 100644 .gitgnore create mode 100644 __init__.py create mode 100644 __pycache__/__init__.cpython-37.pyc create mode 100644 __pycache__/run.cpython-37.pyc create mode 100644 app/__init__.py create mode 100644 app/__pycache__/__init__.cpython-37.pyc create mode 100644 app/api/__init__.py create mode 100644 app/api/__pycache__/__init__.cpython-37.pyc create mode 100644 app/api/v1/__init__.py create mode 100644 app/api/v1/__pycache__/__init__.cpython-37.pyc create mode 100644 app/api/v1/__pycache__/models.cpython-37.pyc create mode 100644 app/api/v1/__pycache__/views.cpython-37.pyc create mode 100644 app/api/v1/models.py create mode 100644 app/api/v1/views.py create mode 100644 app/tests/__init__.py create mode 100644 app/tests/__pycache__/__init__.cpython-37.pyc create mode 100644 app/tests/__pycache__/test_products.cpython-37-PYTEST.pyc create mode 100644 app/tests/test_products.py create mode 100644 instance/__init__.py create mode 100644 instance/__pycache__/__init__.cpython-37.pyc create mode 100644 instance/__pycache__/config.cpython-37.pyc create mode 100644 instance/config.py create mode 100644 run.py create mode 100644 venv/Include/Python-ast.h create mode 100644 venv/Include/Python.h create mode 100644 venv/Include/abstract.h create mode 100644 venv/Include/accu.h create mode 100644 venv/Include/asdl.h create mode 100644 venv/Include/ast.h create mode 100644 venv/Include/bitset.h create mode 100644 venv/Include/bltinmodule.h create mode 100644 venv/Include/boolobject.h create mode 100644 venv/Include/bytearrayobject.h create mode 100644 venv/Include/bytes_methods.h create mode 100644 venv/Include/bytesobject.h create mode 100644 venv/Include/cellobject.h create mode 100644 venv/Include/ceval.h create mode 100644 venv/Include/classobject.h create mode 100644 venv/Include/code.h create mode 100644 venv/Include/codecs.h create mode 100644 venv/Include/compile.h create mode 100644 venv/Include/complexobject.h create mode 100644 venv/Include/context.h create mode 100644 venv/Include/datetime.h create mode 100644 venv/Include/descrobject.h create mode 100644 venv/Include/dictobject.h create mode 100644 venv/Include/dtoa.h create mode 100644 venv/Include/dynamic_annotations.h create mode 100644 venv/Include/enumobject.h create mode 100644 venv/Include/errcode.h create mode 100644 venv/Include/eval.h create mode 100644 venv/Include/fileobject.h create mode 100644 venv/Include/fileutils.h create mode 100644 venv/Include/floatobject.h create mode 100644 venv/Include/frameobject.h create mode 100644 venv/Include/funcobject.h create mode 100644 venv/Include/genobject.h create mode 100644 venv/Include/graminit.h create mode 100644 venv/Include/grammar.h create mode 100644 venv/Include/import.h create mode 100644 venv/Include/intrcheck.h create mode 100644 venv/Include/iterobject.h create mode 100644 venv/Include/listobject.h create mode 100644 venv/Include/longintrepr.h create mode 100644 venv/Include/longobject.h create mode 100644 venv/Include/marshal.h create mode 100644 venv/Include/memoryobject.h create mode 100644 venv/Include/metagrammar.h create mode 100644 venv/Include/methodobject.h create mode 100644 venv/Include/modsupport.h create mode 100644 venv/Include/moduleobject.h create mode 100644 venv/Include/namespaceobject.h create mode 100644 venv/Include/node.h create mode 100644 venv/Include/object.h create mode 100644 venv/Include/objimpl.h create mode 100644 venv/Include/odictobject.h create mode 100644 venv/Include/opcode.h create mode 100644 venv/Include/osdefs.h create mode 100644 venv/Include/osmodule.h create mode 100644 venv/Include/parsetok.h create mode 100644 venv/Include/patchlevel.h create mode 100644 venv/Include/pgen.h create mode 100644 venv/Include/pgenheaders.h create mode 100644 venv/Include/py_curses.h create mode 100644 venv/Include/pyarena.h create mode 100644 venv/Include/pyatomic.h create mode 100644 venv/Include/pycapsule.h create mode 100644 venv/Include/pyconfig.h create mode 100644 venv/Include/pyctype.h create mode 100644 venv/Include/pydebug.h create mode 100644 venv/Include/pydtrace.h create mode 100644 venv/Include/pyerrors.h create mode 100644 venv/Include/pyexpat.h create mode 100644 venv/Include/pyfpe.h create mode 100644 venv/Include/pyhash.h create mode 100644 venv/Include/pylifecycle.h create mode 100644 venv/Include/pymacconfig.h create mode 100644 venv/Include/pymacro.h create mode 100644 venv/Include/pymath.h create mode 100644 venv/Include/pymem.h create mode 100644 venv/Include/pyport.h create mode 100644 venv/Include/pystate.h create mode 100644 venv/Include/pystrcmp.h create mode 100644 venv/Include/pystrhex.h create mode 100644 venv/Include/pystrtod.h create mode 100644 venv/Include/pythonrun.h create mode 100644 venv/Include/pythread.h create mode 100644 venv/Include/pytime.h create mode 100644 venv/Include/rangeobject.h create mode 100644 venv/Include/setobject.h create mode 100644 venv/Include/sliceobject.h create mode 100644 venv/Include/structmember.h create mode 100644 venv/Include/structseq.h create mode 100644 venv/Include/symtable.h create mode 100644 venv/Include/sysmodule.h create mode 100644 venv/Include/token.h create mode 100644 venv/Include/traceback.h create mode 100644 venv/Include/tupleobject.h create mode 100644 venv/Include/typeslots.h create mode 100644 venv/Include/ucnhash.h create mode 100644 venv/Include/unicodeobject.h create mode 100644 venv/Include/warnings.h create mode 100644 venv/Include/weakrefobject.h create mode 100644 venv/Lib/__future__.py create mode 100644 venv/Lib/__pycache__/__future__.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/_bootlocale.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/_collections_abc.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/_weakrefset.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/abc.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/base64.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/bisect.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/codecs.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/copy.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/copyreg.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/enum.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/fnmatch.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/functools.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/genericpath.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/hashlib.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/heapq.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/hmac.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/imp.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/io.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/keyword.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/linecache.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/locale.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/ntpath.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/operator.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/os.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/posixpath.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/random.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/re.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/reprlib.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/shutil.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/site.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/sre_compile.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/sre_constants.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/sre_parse.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/stat.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/struct.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/tarfile.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/tempfile.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/token.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/tokenize.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/types.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/warnings.cpython-37.pyc create mode 100644 venv/Lib/__pycache__/weakref.cpython-37.pyc create mode 100644 venv/Lib/_bootlocale.py create mode 100644 venv/Lib/_collections_abc.py create mode 100644 venv/Lib/_dummy_thread.py create mode 100644 venv/Lib/_weakrefset.py create mode 100644 venv/Lib/abc.py create mode 100644 venv/Lib/base64.py create mode 100644 venv/Lib/bisect.py create mode 100644 venv/Lib/codecs.py create mode 100644 venv/Lib/collections/__init__.py create mode 100644 venv/Lib/collections/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/collections/__pycache__/abc.cpython-37.pyc create mode 100644 venv/Lib/collections/abc.py create mode 100644 venv/Lib/copy.py create mode 100644 venv/Lib/copyreg.py create mode 100644 venv/Lib/distutils/__init__.py create mode 100644 venv/Lib/distutils/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/distutils/distutils.cfg create mode 100644 venv/Lib/encodings/__init__.py create mode 100644 venv/Lib/encodings/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/encodings/__pycache__/aliases.cpython-37.pyc create mode 100644 venv/Lib/encodings/__pycache__/ascii.cpython-37.pyc create mode 100644 venv/Lib/encodings/__pycache__/cp1252.cpython-37.pyc create mode 100644 venv/Lib/encodings/__pycache__/cp437.cpython-37.pyc create mode 100644 venv/Lib/encodings/__pycache__/idna.cpython-37.pyc create mode 100644 venv/Lib/encodings/__pycache__/latin_1.cpython-37.pyc create mode 100644 venv/Lib/encodings/__pycache__/unicode_escape.cpython-37.pyc create mode 100644 venv/Lib/encodings/__pycache__/utf_16_be.cpython-37.pyc create mode 100644 venv/Lib/encodings/__pycache__/utf_16_le.cpython-37.pyc create mode 100644 venv/Lib/encodings/__pycache__/utf_8.cpython-37.pyc create mode 100644 venv/Lib/encodings/aliases.py create mode 100644 venv/Lib/encodings/ascii.py create mode 100644 venv/Lib/encodings/base64_codec.py create mode 100644 venv/Lib/encodings/big5.py create mode 100644 venv/Lib/encodings/big5hkscs.py create mode 100644 venv/Lib/encodings/bz2_codec.py create mode 100644 venv/Lib/encodings/charmap.py create mode 100644 venv/Lib/encodings/cp037.py create mode 100644 venv/Lib/encodings/cp1006.py create mode 100644 venv/Lib/encodings/cp1026.py create mode 100644 venv/Lib/encodings/cp1125.py create mode 100644 venv/Lib/encodings/cp1140.py create mode 100644 venv/Lib/encodings/cp1250.py create mode 100644 venv/Lib/encodings/cp1251.py create mode 100644 venv/Lib/encodings/cp1252.py create mode 100644 venv/Lib/encodings/cp1253.py create mode 100644 venv/Lib/encodings/cp1254.py create mode 100644 venv/Lib/encodings/cp1255.py create mode 100644 venv/Lib/encodings/cp1256.py create mode 100644 venv/Lib/encodings/cp1257.py create mode 100644 venv/Lib/encodings/cp1258.py create mode 100644 venv/Lib/encodings/cp273.py create mode 100644 venv/Lib/encodings/cp424.py create mode 100644 venv/Lib/encodings/cp437.py create mode 100644 venv/Lib/encodings/cp500.py create mode 100644 venv/Lib/encodings/cp65001.py create mode 100644 venv/Lib/encodings/cp720.py create mode 100644 venv/Lib/encodings/cp737.py create mode 100644 venv/Lib/encodings/cp775.py create mode 100644 venv/Lib/encodings/cp850.py create mode 100644 venv/Lib/encodings/cp852.py create mode 100644 venv/Lib/encodings/cp855.py create mode 100644 venv/Lib/encodings/cp856.py create mode 100644 venv/Lib/encodings/cp857.py create mode 100644 venv/Lib/encodings/cp858.py create mode 100644 venv/Lib/encodings/cp860.py create mode 100644 venv/Lib/encodings/cp861.py create mode 100644 venv/Lib/encodings/cp862.py create mode 100644 venv/Lib/encodings/cp863.py create mode 100644 venv/Lib/encodings/cp864.py create mode 100644 venv/Lib/encodings/cp865.py create mode 100644 venv/Lib/encodings/cp866.py create mode 100644 venv/Lib/encodings/cp869.py create mode 100644 venv/Lib/encodings/cp874.py create mode 100644 venv/Lib/encodings/cp875.py create mode 100644 venv/Lib/encodings/cp932.py create mode 100644 venv/Lib/encodings/cp949.py create mode 100644 venv/Lib/encodings/cp950.py create mode 100644 venv/Lib/encodings/euc_jis_2004.py create mode 100644 venv/Lib/encodings/euc_jisx0213.py create mode 100644 venv/Lib/encodings/euc_jp.py create mode 100644 venv/Lib/encodings/euc_kr.py create mode 100644 venv/Lib/encodings/gb18030.py create mode 100644 venv/Lib/encodings/gb2312.py create mode 100644 venv/Lib/encodings/gbk.py create mode 100644 venv/Lib/encodings/hex_codec.py create mode 100644 venv/Lib/encodings/hp_roman8.py create mode 100644 venv/Lib/encodings/hz.py create mode 100644 venv/Lib/encodings/idna.py create mode 100644 venv/Lib/encodings/iso2022_jp.py create mode 100644 venv/Lib/encodings/iso2022_jp_1.py create mode 100644 venv/Lib/encodings/iso2022_jp_2.py create mode 100644 venv/Lib/encodings/iso2022_jp_2004.py create mode 100644 venv/Lib/encodings/iso2022_jp_3.py create mode 100644 venv/Lib/encodings/iso2022_jp_ext.py create mode 100644 venv/Lib/encodings/iso2022_kr.py create mode 100644 venv/Lib/encodings/iso8859_1.py create mode 100644 venv/Lib/encodings/iso8859_10.py create mode 100644 venv/Lib/encodings/iso8859_11.py create mode 100644 venv/Lib/encodings/iso8859_13.py create mode 100644 venv/Lib/encodings/iso8859_14.py create mode 100644 venv/Lib/encodings/iso8859_15.py create mode 100644 venv/Lib/encodings/iso8859_16.py create mode 100644 venv/Lib/encodings/iso8859_2.py create mode 100644 venv/Lib/encodings/iso8859_3.py create mode 100644 venv/Lib/encodings/iso8859_4.py create mode 100644 venv/Lib/encodings/iso8859_5.py create mode 100644 venv/Lib/encodings/iso8859_6.py create mode 100644 venv/Lib/encodings/iso8859_7.py create mode 100644 venv/Lib/encodings/iso8859_8.py create mode 100644 venv/Lib/encodings/iso8859_9.py create mode 100644 venv/Lib/encodings/johab.py create mode 100644 venv/Lib/encodings/koi8_r.py create mode 100644 venv/Lib/encodings/koi8_t.py create mode 100644 venv/Lib/encodings/koi8_u.py create mode 100644 venv/Lib/encodings/kz1048.py create mode 100644 venv/Lib/encodings/latin_1.py create mode 100644 venv/Lib/encodings/mac_arabic.py create mode 100644 venv/Lib/encodings/mac_centeuro.py create mode 100644 venv/Lib/encodings/mac_croatian.py create mode 100644 venv/Lib/encodings/mac_cyrillic.py create mode 100644 venv/Lib/encodings/mac_farsi.py create mode 100644 venv/Lib/encodings/mac_greek.py create mode 100644 venv/Lib/encodings/mac_iceland.py create mode 100644 venv/Lib/encodings/mac_latin2.py create mode 100644 venv/Lib/encodings/mac_roman.py create mode 100644 venv/Lib/encodings/mac_romanian.py create mode 100644 venv/Lib/encodings/mac_turkish.py create mode 100644 venv/Lib/encodings/mbcs.py create mode 100644 venv/Lib/encodings/oem.py create mode 100644 venv/Lib/encodings/palmos.py create mode 100644 venv/Lib/encodings/ptcp154.py create mode 100644 venv/Lib/encodings/punycode.py create mode 100644 venv/Lib/encodings/quopri_codec.py create mode 100644 venv/Lib/encodings/raw_unicode_escape.py create mode 100644 venv/Lib/encodings/rot_13.py create mode 100644 venv/Lib/encodings/shift_jis.py create mode 100644 venv/Lib/encodings/shift_jis_2004.py create mode 100644 venv/Lib/encodings/shift_jisx0213.py create mode 100644 venv/Lib/encodings/tis_620.py create mode 100644 venv/Lib/encodings/undefined.py create mode 100644 venv/Lib/encodings/unicode_escape.py create mode 100644 venv/Lib/encodings/unicode_internal.py create mode 100644 venv/Lib/encodings/utf_16.py create mode 100644 venv/Lib/encodings/utf_16_be.py create mode 100644 venv/Lib/encodings/utf_16_le.py create mode 100644 venv/Lib/encodings/utf_32.py create mode 100644 venv/Lib/encodings/utf_32_be.py create mode 100644 venv/Lib/encodings/utf_32_le.py create mode 100644 venv/Lib/encodings/utf_7.py create mode 100644 venv/Lib/encodings/utf_8.py create mode 100644 venv/Lib/encodings/utf_8_sig.py create mode 100644 venv/Lib/encodings/uu_codec.py create mode 100644 venv/Lib/encodings/zlib_codec.py create mode 100644 venv/Lib/enum.py create mode 100644 venv/Lib/fnmatch.py create mode 100644 venv/Lib/functools.py create mode 100644 venv/Lib/genericpath.py create mode 100644 venv/Lib/hashlib.py create mode 100644 venv/Lib/heapq.py create mode 100644 venv/Lib/hmac.py create mode 100644 venv/Lib/imp.py create mode 100644 venv/Lib/importlib/__init__.py create mode 100644 venv/Lib/importlib/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/importlib/__pycache__/abc.cpython-37.pyc create mode 100644 venv/Lib/importlib/__pycache__/machinery.cpython-37.pyc create mode 100644 venv/Lib/importlib/__pycache__/util.cpython-37.pyc create mode 100644 venv/Lib/importlib/_bootstrap.py create mode 100644 venv/Lib/importlib/_bootstrap_external.py create mode 100644 venv/Lib/importlib/abc.py create mode 100644 venv/Lib/importlib/machinery.py create mode 100644 venv/Lib/importlib/resources.py create mode 100644 venv/Lib/importlib/util.py create mode 100644 venv/Lib/io.py create mode 100644 venv/Lib/keyword.py create mode 100644 venv/Lib/linecache.py create mode 100644 venv/Lib/locale.py create mode 100644 venv/Lib/no-global-site-packages.txt create mode 100644 venv/Lib/ntpath.py create mode 100644 venv/Lib/operator.py create mode 100644 venv/Lib/orig-prefix.txt create mode 100644 venv/Lib/os.py create mode 100644 venv/Lib/posixpath.py create mode 100644 venv/Lib/random.py create mode 100644 venv/Lib/re.py create mode 100644 venv/Lib/reprlib.py create mode 100644 venv/Lib/rlcompleter.py create mode 100644 venv/Lib/shutil.py create mode 100644 venv/Lib/site-packages/Click-7.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/Click-7.0.dist-info/LICENSE.txt create mode 100644 venv/Lib/site-packages/Click-7.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/Click-7.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/Click-7.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/Click-7.0.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/Flask-1.0.2.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/Flask-1.0.2.dist-info/LICENSE.txt create mode 100644 venv/Lib/site-packages/Flask-1.0.2.dist-info/METADATA create mode 100644 venv/Lib/site-packages/Flask-1.0.2.dist-info/RECORD create mode 100644 venv/Lib/site-packages/Flask-1.0.2.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/Flask-1.0.2.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/Flask-1.0.2.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/DESCRIPTION.rst create mode 100644 venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/METADATA create mode 100644 venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/RECORD create mode 100644 venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/metadata.json create mode 100644 venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst create mode 100644 venv/Lib/site-packages/Jinja2-2.10.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/Jinja2-2.10.dist-info/LICENSE.txt create mode 100644 venv/Lib/site-packages/Jinja2-2.10.dist-info/METADATA create mode 100644 venv/Lib/site-packages/Jinja2-2.10.dist-info/RECORD create mode 100644 venv/Lib/site-packages/Jinja2-2.10.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/Jinja2-2.10.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/Jinja2-2.10.dist-info/metadata.json create mode 100644 venv/Lib/site-packages/Jinja2-2.10.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/PKG-INFO create mode 100644 venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/SOURCES.txt create mode 100644 venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/dependency_links.txt create mode 100644 venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/installed-files.txt create mode 100644 venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/not-zip-safe create mode 100644 venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/top_level.txt create mode 100644 venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst create mode 100644 venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt create mode 100644 venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/METADATA create mode 100644 venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/RECORD create mode 100644 venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/metadata.json create mode 100644 venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/__pycache__/easy_install.cpython-37.pyc create mode 100644 venv/Lib/site-packages/__pycache__/itsdangerous.cpython-37.pyc create mode 100644 venv/Lib/site-packages/__pycache__/mccabe.cpython-37.pyc create mode 100644 venv/Lib/site-packages/__pycache__/pep8.cpython-37.pyc create mode 100644 venv/Lib/site-packages/__pycache__/pytest.cpython-37.pyc create mode 100644 venv/Lib/site-packages/__pycache__/six.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__init__.py create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/_argcomplete.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/_version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/cacheprovider.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/capture.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/debugging.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/deprecated.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/doctest.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/fixtures.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/freeze_support.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/helpconfig.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/hookspec.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/junitxml.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/logging.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/main.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/monkeypatch.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/nodes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/nose.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/outcomes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/pastebin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/pathlib.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/pytester.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/python.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/python_api.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/recwarn.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/reports.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/resultlog.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/runner.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/setuponly.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/setupplan.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/skipping.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/terminal.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/tmpdir.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/unittest.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/warning_types.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/__pycache__/warnings.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/_argcomplete.py create mode 100644 venv/Lib/site-packages/_pytest/_code/__init__.py create mode 100644 venv/Lib/site-packages/_pytest/_code/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/_code/__pycache__/_py2traceback.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/_code/__pycache__/code.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/_code/__pycache__/source.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/_code/_py2traceback.py create mode 100644 venv/Lib/site-packages/_pytest/_code/code.py create mode 100644 venv/Lib/site-packages/_pytest/_code/source.py create mode 100644 venv/Lib/site-packages/_pytest/_version.py create mode 100644 venv/Lib/site-packages/_pytest/assertion/__init__.py create mode 100644 venv/Lib/site-packages/_pytest/assertion/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/assertion/__pycache__/rewrite.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/assertion/__pycache__/truncate.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/assertion/__pycache__/util.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/assertion/rewrite.py create mode 100644 venv/Lib/site-packages/_pytest/assertion/truncate.py create mode 100644 venv/Lib/site-packages/_pytest/assertion/util.py create mode 100644 venv/Lib/site-packages/_pytest/cacheprovider.py create mode 100644 venv/Lib/site-packages/_pytest/capture.py create mode 100644 venv/Lib/site-packages/_pytest/compat.py create mode 100644 venv/Lib/site-packages/_pytest/config/__init__.py create mode 100644 venv/Lib/site-packages/_pytest/config/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/config/__pycache__/argparsing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/config/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/config/__pycache__/findpaths.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/config/argparsing.py create mode 100644 venv/Lib/site-packages/_pytest/config/exceptions.py create mode 100644 venv/Lib/site-packages/_pytest/config/findpaths.py create mode 100644 venv/Lib/site-packages/_pytest/debugging.py create mode 100644 venv/Lib/site-packages/_pytest/deprecated.py create mode 100644 venv/Lib/site-packages/_pytest/doctest.py create mode 100644 venv/Lib/site-packages/_pytest/fixtures.py create mode 100644 venv/Lib/site-packages/_pytest/freeze_support.py create mode 100644 venv/Lib/site-packages/_pytest/helpconfig.py create mode 100644 venv/Lib/site-packages/_pytest/hookspec.py create mode 100644 venv/Lib/site-packages/_pytest/junitxml.py create mode 100644 venv/Lib/site-packages/_pytest/logging.py create mode 100644 venv/Lib/site-packages/_pytest/main.py create mode 100644 venv/Lib/site-packages/_pytest/mark/__init__.py create mode 100644 venv/Lib/site-packages/_pytest/mark/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/mark/__pycache__/evaluate.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/mark/__pycache__/legacy.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/mark/__pycache__/structures.cpython-37.pyc create mode 100644 venv/Lib/site-packages/_pytest/mark/evaluate.py create mode 100644 venv/Lib/site-packages/_pytest/mark/legacy.py create mode 100644 venv/Lib/site-packages/_pytest/mark/structures.py create mode 100644 venv/Lib/site-packages/_pytest/monkeypatch.py create mode 100644 venv/Lib/site-packages/_pytest/nodes.py create mode 100644 venv/Lib/site-packages/_pytest/nose.py create mode 100644 venv/Lib/site-packages/_pytest/outcomes.py create mode 100644 venv/Lib/site-packages/_pytest/pastebin.py create mode 100644 venv/Lib/site-packages/_pytest/pathlib.py create mode 100644 venv/Lib/site-packages/_pytest/pytester.py create mode 100644 venv/Lib/site-packages/_pytest/python.py create mode 100644 venv/Lib/site-packages/_pytest/python_api.py create mode 100644 venv/Lib/site-packages/_pytest/recwarn.py create mode 100644 venv/Lib/site-packages/_pytest/reports.py create mode 100644 venv/Lib/site-packages/_pytest/resultlog.py create mode 100644 venv/Lib/site-packages/_pytest/runner.py create mode 100644 venv/Lib/site-packages/_pytest/setuponly.py create mode 100644 venv/Lib/site-packages/_pytest/setupplan.py create mode 100644 venv/Lib/site-packages/_pytest/skipping.py create mode 100644 venv/Lib/site-packages/_pytest/terminal.py create mode 100644 venv/Lib/site-packages/_pytest/tmpdir.py create mode 100644 venv/Lib/site-packages/_pytest/unittest.py create mode 100644 venv/Lib/site-packages/_pytest/warning_types.py create mode 100644 venv/Lib/site-packages/_pytest/warnings.py create mode 100644 venv/Lib/site-packages/aniso8601-3.0.2.dist-info/DESCRIPTION.rst create mode 100644 venv/Lib/site-packages/aniso8601-3.0.2.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/aniso8601-3.0.2.dist-info/METADATA create mode 100644 venv/Lib/site-packages/aniso8601-3.0.2.dist-info/RECORD create mode 100644 venv/Lib/site-packages/aniso8601-3.0.2.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/aniso8601-3.0.2.dist-info/metadata.json create mode 100644 venv/Lib/site-packages/aniso8601-3.0.2.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/aniso8601/__init__.py create mode 100644 venv/Lib/site-packages/aniso8601/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/aniso8601/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/aniso8601/__pycache__/date.cpython-37.pyc create mode 100644 venv/Lib/site-packages/aniso8601/__pycache__/duration.cpython-37.pyc create mode 100644 venv/Lib/site-packages/aniso8601/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/aniso8601/__pycache__/interval.cpython-37.pyc create mode 100644 venv/Lib/site-packages/aniso8601/__pycache__/resolution.cpython-37.pyc create mode 100644 venv/Lib/site-packages/aniso8601/__pycache__/time.cpython-37.pyc create mode 100644 venv/Lib/site-packages/aniso8601/__pycache__/timezone.cpython-37.pyc create mode 100644 venv/Lib/site-packages/aniso8601/compat.py create mode 100644 venv/Lib/site-packages/aniso8601/date.py create mode 100644 venv/Lib/site-packages/aniso8601/duration.py create mode 100644 venv/Lib/site-packages/aniso8601/exceptions.py create mode 100644 venv/Lib/site-packages/aniso8601/interval.py create mode 100644 venv/Lib/site-packages/aniso8601/resolution.py create mode 100644 venv/Lib/site-packages/aniso8601/time.py create mode 100644 venv/Lib/site-packages/aniso8601/timezone.py create mode 100644 venv/Lib/site-packages/astroid-2.0.4.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/astroid-2.0.4.dist-info/METADATA create mode 100644 venv/Lib/site-packages/astroid-2.0.4.dist-info/RECORD create mode 100644 venv/Lib/site-packages/astroid-2.0.4.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/astroid-2.0.4.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/astroid/__init__.py create mode 100644 venv/Lib/site-packages/astroid/__pkginfo__.py create mode 100644 venv/Lib/site-packages/astroid/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/__pkginfo__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/_ast.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/arguments.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/as_string.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/bases.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/builder.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/context.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/decorators.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/helpers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/inference.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/manager.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/mixins.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/modutils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/node_classes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/nodes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/objects.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/protocols.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/raw_building.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/rebuilder.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/scoped_nodes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/test_utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/transforms.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/__pycache__/util.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/_ast.py create mode 100644 venv/Lib/site-packages/astroid/arguments.py create mode 100644 venv/Lib/site-packages/astroid/as_string.py create mode 100644 venv/Lib/site-packages/astroid/bases.py create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_attrs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_builtin_inference.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_collections.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_curses.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_dateutil.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_fstrings.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_functools.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_gi.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_hashlib.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_io.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_mechanize.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_multiprocessing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_namedtuple_enum.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_nose.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_numpy.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_pkg_resources.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_pytest.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_qt.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_random.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_re.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_six.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_ssl.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_subprocess.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_threading.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_typing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/__pycache__/brain_uuid.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/brain/brain_attrs.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_builtin_inference.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_collections.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_curses.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_dateutil.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_fstrings.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_functools.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_gi.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_hashlib.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_io.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_mechanize.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_multiprocessing.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_namedtuple_enum.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_nose.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_numpy.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_pkg_resources.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_pytest.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_qt.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_random.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_re.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_six.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_ssl.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_subprocess.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_threading.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_typing.py create mode 100644 venv/Lib/site-packages/astroid/brain/brain_uuid.py create mode 100644 venv/Lib/site-packages/astroid/builder.py create mode 100644 venv/Lib/site-packages/astroid/context.py create mode 100644 venv/Lib/site-packages/astroid/decorators.py create mode 100644 venv/Lib/site-packages/astroid/exceptions.py create mode 100644 venv/Lib/site-packages/astroid/helpers.py create mode 100644 venv/Lib/site-packages/astroid/inference.py create mode 100644 venv/Lib/site-packages/astroid/interpreter/__init__.py create mode 100644 venv/Lib/site-packages/astroid/interpreter/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/interpreter/__pycache__/dunder_lookup.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/interpreter/__pycache__/objectmodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/interpreter/_import/__init__.py create mode 100644 venv/Lib/site-packages/astroid/interpreter/_import/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/interpreter/_import/__pycache__/spec.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/interpreter/_import/__pycache__/util.cpython-37.pyc create mode 100644 venv/Lib/site-packages/astroid/interpreter/_import/spec.py create mode 100644 venv/Lib/site-packages/astroid/interpreter/_import/util.py create mode 100644 venv/Lib/site-packages/astroid/interpreter/dunder_lookup.py create mode 100644 venv/Lib/site-packages/astroid/interpreter/objectmodel.py create mode 100644 venv/Lib/site-packages/astroid/manager.py create mode 100644 venv/Lib/site-packages/astroid/mixins.py create mode 100644 venv/Lib/site-packages/astroid/modutils.py create mode 100644 venv/Lib/site-packages/astroid/node_classes.py create mode 100644 venv/Lib/site-packages/astroid/nodes.py create mode 100644 venv/Lib/site-packages/astroid/objects.py create mode 100644 venv/Lib/site-packages/astroid/protocols.py create mode 100644 venv/Lib/site-packages/astroid/raw_building.py create mode 100644 venv/Lib/site-packages/astroid/rebuilder.py create mode 100644 venv/Lib/site-packages/astroid/scoped_nodes.py create mode 100644 venv/Lib/site-packages/astroid/test_utils.py create mode 100644 venv/Lib/site-packages/astroid/transforms.py create mode 100644 venv/Lib/site-packages/astroid/util.py create mode 100644 venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/METADATA create mode 100644 venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/RECORD create mode 100644 venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/atomicwrites/__init__.py create mode 100644 venv/Lib/site-packages/atomicwrites/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/attr/__init__.py create mode 100644 venv/Lib/site-packages/attr/__init__.pyi create mode 100644 venv/Lib/site-packages/attr/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/attr/__pycache__/_compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/attr/__pycache__/_config.cpython-37.pyc create mode 100644 venv/Lib/site-packages/attr/__pycache__/_funcs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/attr/__pycache__/_make.cpython-37.pyc create mode 100644 venv/Lib/site-packages/attr/__pycache__/converters.cpython-37.pyc create mode 100644 venv/Lib/site-packages/attr/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/attr/__pycache__/filters.cpython-37.pyc create mode 100644 venv/Lib/site-packages/attr/__pycache__/validators.cpython-37.pyc create mode 100644 venv/Lib/site-packages/attr/_compat.py create mode 100644 venv/Lib/site-packages/attr/_config.py create mode 100644 venv/Lib/site-packages/attr/_funcs.py create mode 100644 venv/Lib/site-packages/attr/_make.py create mode 100644 venv/Lib/site-packages/attr/converters.py create mode 100644 venv/Lib/site-packages/attr/converters.pyi create mode 100644 venv/Lib/site-packages/attr/exceptions.py create mode 100644 venv/Lib/site-packages/attr/exceptions.pyi create mode 100644 venv/Lib/site-packages/attr/filters.py create mode 100644 venv/Lib/site-packages/attr/filters.pyi create mode 100644 venv/Lib/site-packages/attr/py.typed create mode 100644 venv/Lib/site-packages/attr/validators.py create mode 100644 venv/Lib/site-packages/attr/validators.pyi create mode 100644 venv/Lib/site-packages/attrs-18.2.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/attrs-18.2.0.dist-info/LICENSE.txt create mode 100644 venv/Lib/site-packages/attrs-18.2.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/attrs-18.2.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/attrs-18.2.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/attrs-18.2.0.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/click/__init__.py create mode 100644 venv/Lib/site-packages/click/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/_bashcomplete.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/_compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/_unicodefun.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/core.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/decorators.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/formatting.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/globals.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/parser.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/termui.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/testing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/types.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/click/_bashcomplete.py create mode 100644 venv/Lib/site-packages/click/_compat.py create mode 100644 venv/Lib/site-packages/click/_termui_impl.py create mode 100644 venv/Lib/site-packages/click/_textwrap.py create mode 100644 venv/Lib/site-packages/click/_unicodefun.py create mode 100644 venv/Lib/site-packages/click/_winconsole.py create mode 100644 venv/Lib/site-packages/click/core.py create mode 100644 venv/Lib/site-packages/click/decorators.py create mode 100644 venv/Lib/site-packages/click/exceptions.py create mode 100644 venv/Lib/site-packages/click/formatting.py create mode 100644 venv/Lib/site-packages/click/globals.py create mode 100644 venv/Lib/site-packages/click/parser.py create mode 100644 venv/Lib/site-packages/click/termui.py create mode 100644 venv/Lib/site-packages/click/testing.py create mode 100644 venv/Lib/site-packages/click/types.py create mode 100644 venv/Lib/site-packages/click/utils.py create mode 100644 venv/Lib/site-packages/colorama-0.4.0.dist-info/DESCRIPTION.rst create mode 100644 venv/Lib/site-packages/colorama-0.4.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/colorama-0.4.0.dist-info/LICENSE.txt create mode 100644 venv/Lib/site-packages/colorama-0.4.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/colorama-0.4.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/colorama-0.4.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/colorama-0.4.0.dist-info/metadata.json create mode 100644 venv/Lib/site-packages/colorama-0.4.0.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/colorama/__init__.py create mode 100644 venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-37.pyc create mode 100644 venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-37.pyc create mode 100644 venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-37.pyc create mode 100644 venv/Lib/site-packages/colorama/__pycache__/win32.cpython-37.pyc create mode 100644 venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-37.pyc create mode 100644 venv/Lib/site-packages/colorama/ansi.py create mode 100644 venv/Lib/site-packages/colorama/ansitowin32.py create mode 100644 venv/Lib/site-packages/colorama/initialise.py create mode 100644 venv/Lib/site-packages/colorama/win32.py create mode 100644 venv/Lib/site-packages/colorama/winterm.py create mode 100644 venv/Lib/site-packages/dotenv/__init__.py create mode 100644 venv/Lib/site-packages/dotenv/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/dotenv/__pycache__/cli.cpython-37.pyc create mode 100644 venv/Lib/site-packages/dotenv/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/dotenv/__pycache__/ipython.cpython-37.pyc create mode 100644 venv/Lib/site-packages/dotenv/__pycache__/main.cpython-37.pyc create mode 100644 venv/Lib/site-packages/dotenv/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/dotenv/cli.py create mode 100644 venv/Lib/site-packages/dotenv/compat.py create mode 100644 venv/Lib/site-packages/dotenv/ipython.py create mode 100644 venv/Lib/site-packages/dotenv/main.py create mode 100644 venv/Lib/site-packages/dotenv/version.py create mode 100644 venv/Lib/site-packages/easy_install.py create mode 100644 venv/Lib/site-packages/flask/__init__.py create mode 100644 venv/Lib/site-packages/flask/__main__.py create mode 100644 venv/Lib/site-packages/flask/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/__main__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/_compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/app.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/blueprints.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/cli.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/config.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/ctx.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/debughelpers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/globals.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/helpers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/logging.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/sessions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/signals.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/templating.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/testing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/views.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/__pycache__/wrappers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/_compat.py create mode 100644 venv/Lib/site-packages/flask/app.py create mode 100644 venv/Lib/site-packages/flask/blueprints.py create mode 100644 venv/Lib/site-packages/flask/cli.py create mode 100644 venv/Lib/site-packages/flask/config.py create mode 100644 venv/Lib/site-packages/flask/ctx.py create mode 100644 venv/Lib/site-packages/flask/debughelpers.py create mode 100644 venv/Lib/site-packages/flask/globals.py create mode 100644 venv/Lib/site-packages/flask/helpers.py create mode 100644 venv/Lib/site-packages/flask/json/__init__.py create mode 100644 venv/Lib/site-packages/flask/json/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/json/__pycache__/tag.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask/json/tag.py create mode 100644 venv/Lib/site-packages/flask/logging.py create mode 100644 venv/Lib/site-packages/flask/sessions.py create mode 100644 venv/Lib/site-packages/flask/signals.py create mode 100644 venv/Lib/site-packages/flask/templating.py create mode 100644 venv/Lib/site-packages/flask/testing.py create mode 100644 venv/Lib/site-packages/flask/views.py create mode 100644 venv/Lib/site-packages/flask/wrappers.py create mode 100644 venv/Lib/site-packages/flask_restful/__init__.py create mode 100644 venv/Lib/site-packages/flask_restful/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask_restful/__pycache__/__version__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask_restful/__pycache__/fields.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask_restful/__pycache__/inputs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask_restful/__pycache__/paging.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask_restful/__pycache__/reqparse.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask_restful/__version__.py create mode 100644 venv/Lib/site-packages/flask_restful/fields.py create mode 100644 venv/Lib/site-packages/flask_restful/inputs.py create mode 100644 venv/Lib/site-packages/flask_restful/paging.py create mode 100644 venv/Lib/site-packages/flask_restful/representations/__init__.py create mode 100644 venv/Lib/site-packages/flask_restful/representations/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask_restful/representations/__pycache__/json.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask_restful/representations/json.py create mode 100644 venv/Lib/site-packages/flask_restful/reqparse.py create mode 100644 venv/Lib/site-packages/flask_restful/utils/__init__.py create mode 100644 venv/Lib/site-packages/flask_restful/utils/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask_restful/utils/__pycache__/cors.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask_restful/utils/__pycache__/crypto.cpython-37.pyc create mode 100644 venv/Lib/site-packages/flask_restful/utils/cors.py create mode 100644 venv/Lib/site-packages/flask_restful/utils/crypto.py create mode 100644 venv/Lib/site-packages/isort-4.3.4.dist-info/DESCRIPTION.rst create mode 100644 venv/Lib/site-packages/isort-4.3.4.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/isort-4.3.4.dist-info/LICENSE.txt create mode 100644 venv/Lib/site-packages/isort-4.3.4.dist-info/METADATA create mode 100644 venv/Lib/site-packages/isort-4.3.4.dist-info/RECORD create mode 100644 venv/Lib/site-packages/isort-4.3.4.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/isort-4.3.4.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/isort-4.3.4.dist-info/metadata.json create mode 100644 venv/Lib/site-packages/isort-4.3.4.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/isort/__init__.py create mode 100644 venv/Lib/site-packages/isort/__main__.py create mode 100644 venv/Lib/site-packages/isort/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/isort/__pycache__/__main__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/isort/__pycache__/hooks.cpython-37.pyc create mode 100644 venv/Lib/site-packages/isort/__pycache__/isort.cpython-37.pyc create mode 100644 venv/Lib/site-packages/isort/__pycache__/main.cpython-37.pyc create mode 100644 venv/Lib/site-packages/isort/__pycache__/natural.cpython-37.pyc create mode 100644 venv/Lib/site-packages/isort/__pycache__/pie_slice.cpython-37.pyc create mode 100644 venv/Lib/site-packages/isort/__pycache__/pylama_isort.cpython-37.pyc create mode 100644 venv/Lib/site-packages/isort/__pycache__/settings.cpython-37.pyc create mode 100644 venv/Lib/site-packages/isort/hooks.py create mode 100644 venv/Lib/site-packages/isort/isort.py create mode 100644 venv/Lib/site-packages/isort/main.py create mode 100644 venv/Lib/site-packages/isort/natural.py create mode 100644 venv/Lib/site-packages/isort/pie_slice.py create mode 100644 venv/Lib/site-packages/isort/pylama_isort.py create mode 100644 venv/Lib/site-packages/isort/settings.py create mode 100644 venv/Lib/site-packages/itsdangerous-0.24-py3.7.egg-info/PKG-INFO create mode 100644 venv/Lib/site-packages/itsdangerous-0.24-py3.7.egg-info/SOURCES.txt create mode 100644 venv/Lib/site-packages/itsdangerous-0.24-py3.7.egg-info/dependency_links.txt create mode 100644 venv/Lib/site-packages/itsdangerous-0.24-py3.7.egg-info/installed-files.txt create mode 100644 venv/Lib/site-packages/itsdangerous-0.24-py3.7.egg-info/not-zip-safe create mode 100644 venv/Lib/site-packages/itsdangerous-0.24-py3.7.egg-info/top_level.txt create mode 100644 venv/Lib/site-packages/itsdangerous.py create mode 100644 venv/Lib/site-packages/jinja2/__init__.py create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/_compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/_identifier.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/asyncfilters.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/asyncsupport.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/bccache.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/compiler.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/constants.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/debug.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/defaults.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/environment.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/ext.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/filters.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/idtracking.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/lexer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/loaders.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/meta.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/nativetypes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/nodes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/optimizer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/parser.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/runtime.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/sandbox.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/tests.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/__pycache__/visitor.cpython-37.pyc create mode 100644 venv/Lib/site-packages/jinja2/_compat.py create mode 100644 venv/Lib/site-packages/jinja2/_identifier.py create mode 100644 venv/Lib/site-packages/jinja2/asyncfilters.py create mode 100644 venv/Lib/site-packages/jinja2/asyncsupport.py create mode 100644 venv/Lib/site-packages/jinja2/bccache.py create mode 100644 venv/Lib/site-packages/jinja2/compiler.py create mode 100644 venv/Lib/site-packages/jinja2/constants.py create mode 100644 venv/Lib/site-packages/jinja2/debug.py create mode 100644 venv/Lib/site-packages/jinja2/defaults.py create mode 100644 venv/Lib/site-packages/jinja2/environment.py create mode 100644 venv/Lib/site-packages/jinja2/exceptions.py create mode 100644 venv/Lib/site-packages/jinja2/ext.py create mode 100644 venv/Lib/site-packages/jinja2/filters.py create mode 100644 venv/Lib/site-packages/jinja2/idtracking.py create mode 100644 venv/Lib/site-packages/jinja2/lexer.py create mode 100644 venv/Lib/site-packages/jinja2/loaders.py create mode 100644 venv/Lib/site-packages/jinja2/meta.py create mode 100644 venv/Lib/site-packages/jinja2/nativetypes.py create mode 100644 venv/Lib/site-packages/jinja2/nodes.py create mode 100644 venv/Lib/site-packages/jinja2/optimizer.py create mode 100644 venv/Lib/site-packages/jinja2/parser.py create mode 100644 venv/Lib/site-packages/jinja2/runtime.py create mode 100644 venv/Lib/site-packages/jinja2/sandbox.py create mode 100644 venv/Lib/site-packages/jinja2/tests.py create mode 100644 venv/Lib/site-packages/jinja2/utils.py create mode 100644 venv/Lib/site-packages/jinja2/visitor.py create mode 100644 venv/Lib/site-packages/lazy_object_proxy-1.3.1.dist-info/AUTHORS.rst create mode 100644 venv/Lib/site-packages/lazy_object_proxy-1.3.1.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/lazy_object_proxy-1.3.1.dist-info/LICENSE create mode 100644 venv/Lib/site-packages/lazy_object_proxy-1.3.1.dist-info/METADATA create mode 100644 venv/Lib/site-packages/lazy_object_proxy-1.3.1.dist-info/RECORD create mode 100644 venv/Lib/site-packages/lazy_object_proxy-1.3.1.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/lazy_object_proxy-1.3.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/lazy_object_proxy/__init__.py create mode 100644 venv/Lib/site-packages/lazy_object_proxy/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/lazy_object_proxy/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/lazy_object_proxy/__pycache__/simple.cpython-37.pyc create mode 100644 venv/Lib/site-packages/lazy_object_proxy/__pycache__/slots.cpython-37.pyc create mode 100644 venv/Lib/site-packages/lazy_object_proxy/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/lazy_object_proxy/cext.c create mode 100644 venv/Lib/site-packages/lazy_object_proxy/compat.py create mode 100644 venv/Lib/site-packages/lazy_object_proxy/simple.py create mode 100644 venv/Lib/site-packages/lazy_object_proxy/slots.py create mode 100644 venv/Lib/site-packages/lazy_object_proxy/utils.py create mode 100644 venv/Lib/site-packages/markupsafe/__init__.py create mode 100644 venv/Lib/site-packages/markupsafe/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/markupsafe/__pycache__/_compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/markupsafe/__pycache__/_constants.cpython-37.pyc create mode 100644 venv/Lib/site-packages/markupsafe/__pycache__/_native.cpython-37.pyc create mode 100644 venv/Lib/site-packages/markupsafe/_compat.py create mode 100644 venv/Lib/site-packages/markupsafe/_constants.py create mode 100644 venv/Lib/site-packages/markupsafe/_native.py create mode 100644 venv/Lib/site-packages/markupsafe/_speedups.c create mode 100644 venv/Lib/site-packages/mccabe-0.6.1.dist-info/DESCRIPTION.rst create mode 100644 venv/Lib/site-packages/mccabe-0.6.1.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/mccabe-0.6.1.dist-info/METADATA create mode 100644 venv/Lib/site-packages/mccabe-0.6.1.dist-info/RECORD create mode 100644 venv/Lib/site-packages/mccabe-0.6.1.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/mccabe-0.6.1.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/mccabe-0.6.1.dist-info/metadata.json create mode 100644 venv/Lib/site-packages/mccabe-0.6.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/mccabe.py create mode 100644 venv/Lib/site-packages/more_itertools-4.3.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/more_itertools-4.3.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/more_itertools-4.3.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/more_itertools-4.3.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/more_itertools-4.3.0.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/more_itertools/__init__.py create mode 100644 venv/Lib/site-packages/more_itertools/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/more_itertools/__pycache__/more.cpython-37.pyc create mode 100644 venv/Lib/site-packages/more_itertools/__pycache__/recipes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/more_itertools/more.py create mode 100644 venv/Lib/site-packages/more_itertools/recipes.py create mode 100644 venv/Lib/site-packages/more_itertools/tests/__init__.py create mode 100644 venv/Lib/site-packages/more_itertools/tests/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/more_itertools/tests/__pycache__/test_more.cpython-37.pyc create mode 100644 venv/Lib/site-packages/more_itertools/tests/__pycache__/test_recipes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/more_itertools/tests/test_more.py create mode 100644 venv/Lib/site-packages/more_itertools/tests/test_recipes.py create mode 100644 venv/Lib/site-packages/pep8-1.7.1.dist-info/DESCRIPTION.rst create mode 100644 venv/Lib/site-packages/pep8-1.7.1.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pep8-1.7.1.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pep8-1.7.1.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pep8-1.7.1.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pep8-1.7.1.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/pep8-1.7.1.dist-info/metadata.json create mode 100644 venv/Lib/site-packages/pep8-1.7.1.dist-info/namespace_packages.txt create mode 100644 venv/Lib/site-packages/pep8-1.7.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pep8.py create mode 100644 venv/Lib/site-packages/pip-18.1.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pip-18.1.dist-info/LICENSE.txt create mode 100644 venv/Lib/site-packages/pip-18.1.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pip-18.1.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pip-18.1.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pip-18.1.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/pip-18.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pip/__init__.py create mode 100644 venv/Lib/site-packages/pip/__main__.py create mode 100644 venv/Lib/site-packages/pip/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/__pycache__/__main__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/build_env.py create mode 100644 venv/Lib/site-packages/pip/_internal/cache.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/base_command.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/main_parser.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/parser.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/status_codes.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/check.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/completion.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/configuration.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/download.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/freeze.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/hash.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/help.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/install.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/list.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/search.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/show.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/uninstall.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/wheel.py create mode 100644 venv/Lib/site-packages/pip/_internal/configuration.py create mode 100644 venv/Lib/site-packages/pip/_internal/download.py create mode 100644 venv/Lib/site-packages/pip/_internal/exceptions.py create mode 100644 venv/Lib/site-packages/pip/_internal/index.py create mode 100644 venv/Lib/site-packages/pip/_internal/locations.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/candidate.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/format_control.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/index.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/link.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/check.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/freeze.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/prepare.py create mode 100644 venv/Lib/site-packages/pip/_internal/pep425tags.py create mode 100644 venv/Lib/site-packages/pip/_internal/pyproject.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/constructors.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/req_file.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/req_install.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/req_set.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/req_tracker.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 venv/Lib/site-packages/pip/_internal/resolve.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/appdirs.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/compat.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/deprecation.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/encoding.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/filesystem.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/glibc.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/hashes.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/logging.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/misc.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/models.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/outdated.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/packaging.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/typing.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/ui.py create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/git.py create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/subversion.py create mode 100644 venv/Lib/site-packages/pip/_internal/wheel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/appdirs.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/core.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/enums.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/version.py create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/win32.py create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/database.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/index.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/locators.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/markers.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/resources.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/util.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/version.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distro.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/codec.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/core.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/intranges.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/package_data.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 venv/Lib/site-packages/pip/_vendor/ipaddress.py create mode 100644 venv/Lib/site-packages/pip/_vendor/lockfile/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/lockfile/linklockfile.py create mode 100644 venv/Lib/site-packages/pip/_vendor/lockfile/mkdirlockfile.py create mode 100644 venv/Lib/site-packages/pip/_vendor/lockfile/pidlockfile.py create mode 100644 venv/Lib/site-packages/pip/_vendor/lockfile/sqlitelockfile.py create mode 100644 venv/Lib/site-packages/pip/_vendor/lockfile/symlinklockfile.py create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/markers.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/utils.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/version.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/check.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__pycache__/helpers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/bar.py create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/counter.py create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/helpers.py create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/spinner.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pyparsing.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pytoml/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pytoml/core.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pytoml/parser.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pytoml/writer.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__version__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/adapters.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/api.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/auth.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/certs.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/cookies.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/help.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/hooks.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/models.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/packages.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/sessions.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/structures.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/utils.py create mode 100644 venv/Lib/site-packages/pip/_vendor/retrying.py create mode 100644 venv/Lib/site-packages/pip/_vendor/six.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/ordered_dict.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/request.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/response.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 venv/Lib/site-packages/pkg_resources/__init__.py create mode 100644 venv/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/six.py create mode 100644 venv/Lib/site-packages/pkg_resources/extern/__init__.py create mode 100644 venv/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/py31compat.py create mode 100644 venv/Lib/site-packages/pluggy-0.8.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pluggy-0.8.0.dist-info/LICENSE create mode 100644 venv/Lib/site-packages/pluggy-0.8.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pluggy-0.8.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pluggy-0.8.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pluggy-0.8.0.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pluggy/__init__.py create mode 100644 venv/Lib/site-packages/pluggy/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pluggy/__pycache__/_tracing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pluggy/__pycache__/_version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pluggy/__pycache__/callers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pluggy/__pycache__/hooks.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pluggy/__pycache__/manager.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pluggy/_tracing.py create mode 100644 venv/Lib/site-packages/pluggy/_version.py create mode 100644 venv/Lib/site-packages/pluggy/callers.py create mode 100644 venv/Lib/site-packages/pluggy/hooks.py create mode 100644 venv/Lib/site-packages/pluggy/manager.py create mode 100644 venv/Lib/site-packages/py-1.7.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/py-1.7.0.dist-info/LICENSE create mode 100644 venv/Lib/site-packages/py-1.7.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/py-1.7.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/py-1.7.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/py-1.7.0.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/py/__init__.py create mode 100644 venv/Lib/site-packages/py/__metainfo.py create mode 100644 venv/Lib/site-packages/py/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/__pycache__/__metainfo.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/__pycache__/_builtin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/__pycache__/_error.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/__pycache__/_std.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/__pycache__/_version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/__pycache__/_xmlgen.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/__pycache__/test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_builtin.py create mode 100644 venv/Lib/site-packages/py/_code/__init__.py create mode 100644 venv/Lib/site-packages/py/_code/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_code/__pycache__/_assertionnew.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_code/__pycache__/_assertionold.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_code/__pycache__/_py2traceback.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_code/__pycache__/assertion.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_code/__pycache__/code.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_code/__pycache__/source.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_code/_assertionnew.py create mode 100644 venv/Lib/site-packages/py/_code/_assertionold.py create mode 100644 venv/Lib/site-packages/py/_code/_py2traceback.py create mode 100644 venv/Lib/site-packages/py/_code/assertion.py create mode 100644 venv/Lib/site-packages/py/_code/code.py create mode 100644 venv/Lib/site-packages/py/_code/source.py create mode 100644 venv/Lib/site-packages/py/_error.py create mode 100644 venv/Lib/site-packages/py/_io/__init__.py create mode 100644 venv/Lib/site-packages/py/_io/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_io/__pycache__/capture.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_io/__pycache__/saferepr.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_io/__pycache__/terminalwriter.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_io/capture.py create mode 100644 venv/Lib/site-packages/py/_io/saferepr.py create mode 100644 venv/Lib/site-packages/py/_io/terminalwriter.py create mode 100644 venv/Lib/site-packages/py/_log/__init__.py create mode 100644 venv/Lib/site-packages/py/_log/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_log/__pycache__/log.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_log/__pycache__/warning.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_log/log.py create mode 100644 venv/Lib/site-packages/py/_log/warning.py create mode 100644 venv/Lib/site-packages/py/_path/__init__.py create mode 100644 venv/Lib/site-packages/py/_path/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_path/__pycache__/cacheutil.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_path/__pycache__/common.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_path/__pycache__/local.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_path/__pycache__/svnurl.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_path/__pycache__/svnwc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_path/cacheutil.py create mode 100644 venv/Lib/site-packages/py/_path/common.py create mode 100644 venv/Lib/site-packages/py/_path/local.py create mode 100644 venv/Lib/site-packages/py/_path/svnurl.py create mode 100644 venv/Lib/site-packages/py/_path/svnwc.py create mode 100644 venv/Lib/site-packages/py/_process/__init__.py create mode 100644 venv/Lib/site-packages/py/_process/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_process/__pycache__/cmdexec.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_process/__pycache__/forkedfunc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_process/__pycache__/killproc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_process/cmdexec.py create mode 100644 venv/Lib/site-packages/py/_process/forkedfunc.py create mode 100644 venv/Lib/site-packages/py/_process/killproc.py create mode 100644 venv/Lib/site-packages/py/_std.py create mode 100644 venv/Lib/site-packages/py/_vendored_packages/__init__.py create mode 100644 venv/Lib/site-packages/py/_vendored_packages/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_vendored_packages/__pycache__/apipkg.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_vendored_packages/__pycache__/iniconfig.cpython-37.pyc create mode 100644 venv/Lib/site-packages/py/_vendored_packages/apipkg.py create mode 100644 venv/Lib/site-packages/py/_vendored_packages/iniconfig.py create mode 100644 venv/Lib/site-packages/py/_version.py create mode 100644 venv/Lib/site-packages/py/_xmlgen.py create mode 100644 venv/Lib/site-packages/py/test.py create mode 100644 venv/Lib/site-packages/pylint-2.1.1.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pylint-2.1.1.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pylint-2.1.1.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pylint-2.1.1.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pylint-2.1.1.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/pylint-2.1.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pylint/__init__.py create mode 100644 venv/Lib/site-packages/pylint/__main__.py create mode 100644 venv/Lib/site-packages/pylint/__pkginfo__.py create mode 100644 venv/Lib/site-packages/pylint/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/__pycache__/__main__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/__pycache__/__pkginfo__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/__pycache__/config.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/__pycache__/epylint.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/__pycache__/graph.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/__pycache__/interfaces.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/__pycache__/lint.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/__pycache__/testutils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__init__.py create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/async.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/base.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/classes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/design_analysis.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/format.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/imports.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/logging.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/misc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/newstyle.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/python3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/raw_metrics.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/refactoring.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/similar.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/spelling.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/stdlib.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/strings.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/typecheck.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/__pycache__/variables.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/checkers/async.py create mode 100644 venv/Lib/site-packages/pylint/checkers/base.py create mode 100644 venv/Lib/site-packages/pylint/checkers/classes.py create mode 100644 venv/Lib/site-packages/pylint/checkers/design_analysis.py create mode 100644 venv/Lib/site-packages/pylint/checkers/exceptions.py create mode 100644 venv/Lib/site-packages/pylint/checkers/format.py create mode 100644 venv/Lib/site-packages/pylint/checkers/imports.py create mode 100644 venv/Lib/site-packages/pylint/checkers/logging.py create mode 100644 venv/Lib/site-packages/pylint/checkers/misc.py create mode 100644 venv/Lib/site-packages/pylint/checkers/newstyle.py create mode 100644 venv/Lib/site-packages/pylint/checkers/python3.py create mode 100644 venv/Lib/site-packages/pylint/checkers/raw_metrics.py create mode 100644 venv/Lib/site-packages/pylint/checkers/refactoring.py create mode 100644 venv/Lib/site-packages/pylint/checkers/similar.py create mode 100644 venv/Lib/site-packages/pylint/checkers/spelling.py create mode 100644 venv/Lib/site-packages/pylint/checkers/stdlib.py create mode 100644 venv/Lib/site-packages/pylint/checkers/strings.py create mode 100644 venv/Lib/site-packages/pylint/checkers/typecheck.py create mode 100644 venv/Lib/site-packages/pylint/checkers/utils.py create mode 100644 venv/Lib/site-packages/pylint/checkers/variables.py create mode 100644 venv/Lib/site-packages/pylint/config.py create mode 100644 venv/Lib/site-packages/pylint/epylint.py create mode 100644 venv/Lib/site-packages/pylint/exceptions.py create mode 100644 venv/Lib/site-packages/pylint/extensions/__init__.py create mode 100644 venv/Lib/site-packages/pylint/extensions/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/extensions/__pycache__/_check_docs_utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/extensions/__pycache__/bad_builtin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/extensions/__pycache__/check_docs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/extensions/__pycache__/check_elif.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/extensions/__pycache__/comparetozero.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/extensions/__pycache__/docparams.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/extensions/__pycache__/docstyle.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/extensions/__pycache__/emptystring.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/extensions/__pycache__/mccabe.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/extensions/__pycache__/overlapping_exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/extensions/__pycache__/redefined_variable_type.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/extensions/_check_docs_utils.py create mode 100644 venv/Lib/site-packages/pylint/extensions/bad_builtin.py create mode 100644 venv/Lib/site-packages/pylint/extensions/check_docs.py create mode 100644 venv/Lib/site-packages/pylint/extensions/check_elif.py create mode 100644 venv/Lib/site-packages/pylint/extensions/comparetozero.py create mode 100644 venv/Lib/site-packages/pylint/extensions/docparams.py create mode 100644 venv/Lib/site-packages/pylint/extensions/docstyle.py create mode 100644 venv/Lib/site-packages/pylint/extensions/emptystring.py create mode 100644 venv/Lib/site-packages/pylint/extensions/mccabe.py create mode 100644 venv/Lib/site-packages/pylint/extensions/overlapping_exceptions.py create mode 100644 venv/Lib/site-packages/pylint/extensions/redefined_variable_type.py create mode 100644 venv/Lib/site-packages/pylint/graph.py create mode 100644 venv/Lib/site-packages/pylint/interfaces.py create mode 100644 venv/Lib/site-packages/pylint/lint.py create mode 100644 venv/Lib/site-packages/pylint/pyreverse/__init__.py create mode 100644 venv/Lib/site-packages/pylint/pyreverse/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/pyreverse/__pycache__/diadefslib.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/pyreverse/__pycache__/diagrams.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/pyreverse/__pycache__/inspector.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/pyreverse/__pycache__/main.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/pyreverse/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/pyreverse/__pycache__/vcgutils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/pyreverse/__pycache__/writer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/pyreverse/diadefslib.py create mode 100644 venv/Lib/site-packages/pylint/pyreverse/diagrams.py create mode 100644 venv/Lib/site-packages/pylint/pyreverse/inspector.py create mode 100644 venv/Lib/site-packages/pylint/pyreverse/main.py create mode 100644 venv/Lib/site-packages/pylint/pyreverse/utils.py create mode 100644 venv/Lib/site-packages/pylint/pyreverse/vcgutils.py create mode 100644 venv/Lib/site-packages/pylint/pyreverse/writer.py create mode 100644 venv/Lib/site-packages/pylint/reporters/__init__.py create mode 100644 venv/Lib/site-packages/pylint/reporters/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/reporters/__pycache__/json.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/reporters/__pycache__/text.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/reporters/json.py create mode 100644 venv/Lib/site-packages/pylint/reporters/text.py create mode 100644 venv/Lib/site-packages/pylint/reporters/ureports/__init__.py create mode 100644 venv/Lib/site-packages/pylint/reporters/ureports/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/reporters/ureports/__pycache__/nodes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/reporters/ureports/__pycache__/text_writer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/reporters/ureports/nodes.py create mode 100644 venv/Lib/site-packages/pylint/reporters/ureports/text_writer.py create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/a.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/conftest.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/test_func.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/test_functional.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/test_import_graph.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/test_regr.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/test_self.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_base.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_classes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_format.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_imports.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_logging.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_misc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_python3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_similar.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_spelling.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_stdlib.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_strings.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_typecheck.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checker_variables.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_checkers_utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_config.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_lint.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_pyreverse_diadefs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_pyreverse_inspector.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_pyreverse_writer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_reporters_json.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_reporting.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/__pycache__/unittest_utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/a.py create mode 100644 venv/Lib/site-packages/pylint/test/acceptance/__pycache__/test_stdlib.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/acceptance/test_stdlib.py create mode 100644 venv/Lib/site-packages/pylint/test/conftest.py create mode 100644 venv/Lib/site-packages/pylint/test/data/__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/data/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/data/__pycache__/clientmodule_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/data/__pycache__/suppliermodule_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/data/ascript create mode 100644 venv/Lib/site-packages/pylint/test/data/classes_No_Name.dot create mode 100644 venv/Lib/site-packages/pylint/test/data/clientmodule_test.py create mode 100644 venv/Lib/site-packages/pylint/test/data/packages_No_Name.dot create mode 100644 venv/Lib/site-packages/pylint/test/data/suppliermodule_test.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/test_bad_builtin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/test_check_docs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/test_check_docs_utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/test_check_mccabe.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/test_check_raise_docs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/test_check_return_docs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/test_check_yields_docs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/test_comparetozero.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/test_docstyle.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/test_elseif_used.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/test_emptystring.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/test_overlapping_exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/__pycache__/test_redefined.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/__pycache__/bad_builtin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/__pycache__/compare_to_zero.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/__pycache__/docstring.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/__pycache__/elif.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/__pycache__/empty_string_comparison.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/__pycache__/mccabe.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/__pycache__/overlapping_exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/__pycache__/overlapping_exceptions_py33.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/__pycache__/redefined.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/bad_builtin.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/compare_to_zero.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/docstring.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/elif.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/empty_string_comparison.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/mccabe.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/overlapping_exceptions.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/overlapping_exceptions_py33.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/data/redefined.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/test_bad_builtin.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/test_check_docs.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/test_check_docs_utils.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/test_check_mccabe.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/test_check_raise_docs.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/test_check_return_docs.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/test_check_yields_docs.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/test_comparetozero.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/test_docstyle.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/test_elseif_used.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/test_emptystring.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/test_overlapping_exceptions.py create mode 100644 venv/Lib/site-packages/pylint/test/extensions/test_redefined.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/abstract_abc_methods.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/abstract_class_instantiated_in_class.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/abstract_class_instantiated_py2.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/abstract_class_instantiated_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/abstract_class_instantiated_py34.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/abstract_method_py2.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/abstract_method_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/access_member_before_definition.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/access_to__name__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/access_to_protected_members.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/anomalous_unicode_escape_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/arguments.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/arguments_differ.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/arguments_differ_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/assert_on_tuple.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/assigning_non_slot.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/assignment_from_no_return.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/attribute_defined_outside_init.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bad_continuation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bad_continuation_py36.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bad_continuation_tabs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bad_exception_context.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bad_indentation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bad_inline_option.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bad_open_mode.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bad_open_mode_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bad_reversed_sequence.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bad_staticmethod_argument.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bad_thread_instantiation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bad_whitespace.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bare_except.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/blacklisted_name.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/boolean_datetime.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/broad_except.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/bugfix_local_scope_metaclass_1177.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/cellvar_escaping_loop.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/class_members_py30.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/class_scope.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/comparison_with_callable.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/confidence_filter.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/confusing_with_statement.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/consider_iterating_dictionary.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/consider_join.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/consider_merging_isinstance.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/consider_swap_variables.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/consider_using_dict_comprehension.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/consider_using_enumerate.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/consider_using_get.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/consider_using_in.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/consider_using_set_comprehension.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/crash_missing_module_type.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/ctor_arguments.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/dangerous_default_value.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/dangerous_default_value_py30.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/defined_and_used_on_same_line.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/deprecated_lambda.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/deprecated_method_getmoduleinfo.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/deprecated_methods_py2.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/deprecated_methods_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/deprecated_methods_py36.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/deprecated_module_py2.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/deprecated_module_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/deprecated_module_py36.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/deprecated_module_py4.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/deprecated_module_uninstalled.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/disable_msg_github_issue_1389.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/disable_ungrouped_imports.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/disable_wrong_import_order.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/disable_wrong_import_position.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/docstrings.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/duplicate_bases.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/duplicate_dict_literal_key.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/duplicate_except.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/eval_used.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/exception_is_binary_op.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/exception_message.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/exec_used_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/fallback_import_disabled.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/fallback_import_enabled.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/fixme.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/fixme_bad_formatting_1139.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/formatted_string_literal_with_if_py36.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/function_redefined.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/future_import.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/future_unicode_literals.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/generated_members.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/genexp_in_class_scope.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/genexpr_variable_scope.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/globals.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/import_error.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/inconsistent_mro.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/inconsistent_returns.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/indexing_exception.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/inherit_non_class.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/init_is_generator.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/init_not_called.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/init_subclass_classmethod_py36.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/invalid_all_object.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/invalid_encoding_py27.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/invalid_envvar_value.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/invalid_exceptions_caught.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/invalid_exceptions_raised.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/invalid_length_returned.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/invalid_metaclass.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/invalid_metaclass_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/invalid_name.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/invalid_sequence_index.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/invalid_slice_index.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/invalid_unary_operand_type.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/iterable_context.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/iterable_context_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/iterable_context_py36.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/keyword_arg_before_vararg.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/len_checks.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/line_endings.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/line_too_long.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/line_too_long_end_of_module.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/literal_comparison.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/logging_format_interpolation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/logging_format_interpolation_py36.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/logging_fstring_interpolation_py36.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/logging_not_lazy.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/logical_tautology.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/long_lines_with_utf8.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/long_utf8_lines.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/lost_exception.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/mapping_context.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/mapping_context_py2.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/mapping_context_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/member_checks.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/member_checks_hints.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/member_checks_ignore_none.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/member_checks_no_hints.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/member_checks_opaque.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/member_checks_py37.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/membership_protocol.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/membership_protocol_py2.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/membership_protocol_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/messages_managed_by_id.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/method_hidden.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/misplaced_bare_raise.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/misplaced_comparison_constant.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/misplaced_format_function.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/missing_docstring.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/missing_final_newline.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/missing_kwoa_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/missing_self_argument.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/mixed_indentation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/monkeypatch_method.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/multiple_imports.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/namePresetCamelCase.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/name_preset_snake_case.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/name_styles.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/namedtuple_member_inference.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/names_in__all__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/nested_blocks_issue1088.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/newstyle__slots__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/newstyle_properties.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/no_classmethod_decorator.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/no_else_return.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/no_name_in_module.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/no_self_use.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/no_self_use_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/no_staticmethod_decorator.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/non_iterator_returned.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/none_dunder_protocols_py36.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/nonexistent_operator.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/not_async_context_manager.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/not_callable.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/not_context_manager.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/old_style_class_py27.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/postponed_evaluation_activated.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/postponed_evaluation_not_activated.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/protected_access_access_different_scopes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/raising_format_tuple.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/raising_non_exception_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/raising_self.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/recursion_error_940.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/redefined_argument_from_local.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/redefined_builtin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/redundant_unittest_assert.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/regression_1326_crash_uninferable.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/regression_no_value_for_parameter.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/reimported.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/repeated_keyword.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/return_in_init.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/reused_outer_loop_variable.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/reused_outer_loop_variable_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/self_cls_assignment.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/signature_differs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/simplifiable_if_statement.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/simplify_chained_comparison.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/singledispatch_functions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/singledispatch_functions_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/singleton_comparison.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/slots_checks.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/socketerror_import.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/statement_without_effect.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/statement_without_effect_py36.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/stop_iteration_inside_generator.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/string_formatting.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/string_formatting_disable.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/string_formatting_failed_inference.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/string_formatting_py27.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/string_formatting_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/subprocess_popen_preexec_fn.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/super_checks.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/superfluous_parens.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/suspicious_str_strip_call.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/suspicious_str_strip_call_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/sys_stream_regression_1004.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/ternary.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/test_compile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/tokenize_error.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/tokenize_error_jython.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_few_public_methods.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_few_public_methods_37.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_many_ancestors.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_many_arguments.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_many_arguments_issue_1045.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_many_boolean_expressions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_many_branches.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_many_instance_attributes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_many_lines.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_many_lines_disabled.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_many_locals.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_many_nested_blocks.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_many_public_methods.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_many_return_statements.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/too_many_statements.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/trailing_comma_tuple.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/trailing_newlines.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/trailing_whitespaces.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unbalanced_tuple_unpacking.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unbalanced_tuple_unpacking_py30.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/undefined_loop_variable.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/undefined_variable.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/undefined_variable_py30.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unexpected_special_method_signature.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/ungrouped_imports.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unhashable_dict_key.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unidiomatic_typecheck.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/uninferable_all_object.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unnecessary_lambda.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unnecessary_pass.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unneeded_not.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unpacking.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unpacking_generalizations.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unpacking_non_sequence.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unreachable.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unrecognized_inline_option.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unsubscriptable_value.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unsupported_assignment_operation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unsupported_binary_operation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unsupported_delete_operation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unused_argument.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unused_argument_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unused_global_variable1.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unused_global_variable2.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unused_global_variable3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unused_global_variable4.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unused_import.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unused_import_assigned_to.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unused_typing_imports.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/unused_variable.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/used_before_assignment_488.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/used_before_assignment_issue1081.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/used_before_assignment_issue853.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/used_before_assignment_nonlocal.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/useless-import-alias.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/useless_else_on_loop.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/useless_object_inheritance.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/useless_return.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/useless_super_delegation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/useless_super_delegation_py3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/useless_super_delegation_py35.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/using_constant_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wildcard_import.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wildcard_import_allowed.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/with_used_before_assign.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/with_using_generator.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_order.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_order2.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position10.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position11.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position12.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position13.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position14.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position15.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position2.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position3.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position4.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position5.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position6.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position7.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position8.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position9.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/wrong_import_position_exclude_dunder_main.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/__pycache__/yield_from_iterable_py33.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_abc_methods.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_class_instantiated_in_class.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_class_instantiated_py2.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_class_instantiated_py2.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_class_instantiated_py2.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_class_instantiated_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_class_instantiated_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_class_instantiated_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_class_instantiated_py34.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_class_instantiated_py34.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_class_instantiated_py34.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_method_py2.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_method_py2.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_method_py2.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_method_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_method_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/abstract_method_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/access_member_before_definition.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/access_member_before_definition.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/access_to__name__.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/access_to__name__.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/access_to_protected_members.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/access_to_protected_members.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/anomalous_unicode_escape_py2.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/anomalous_unicode_escape_py2.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/anomalous_unicode_escape_py2.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/anomalous_unicode_escape_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/anomalous_unicode_escape_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/anomalous_unicode_escape_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/arguments.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/arguments.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/arguments_differ.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/arguments_differ.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/arguments_differ_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/arguments_differ_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/arguments_differ_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/assert_on_tuple.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/assert_on_tuple.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/assigning_non_slot.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/assigning_non_slot.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/assignment_from_no_return.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/assignment_from_no_return.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/async_functions.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/async_functions.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/async_functions.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/attribute_defined_outside_init.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/attribute_defined_outside_init.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_continuation.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_continuation.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_continuation_py36.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_continuation_py36.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_continuation_tabs.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_continuation_tabs.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_continuation_tabs.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_except_order.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_except_order.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_exception_context.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_exception_context.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_exception_context.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_indentation.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_indentation.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_inline_option.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_inline_option.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_inline_option.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_open_mode.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_open_mode.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_open_mode.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_open_mode_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_open_mode_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_open_mode_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_reversed_sequence.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_reversed_sequence.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_staticmethod_argument.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_staticmethod_argument.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_thread_instantiation.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_thread_instantiation.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_whitespace.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bad_whitespace.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bare_except.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bare_except.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/blacklisted_name.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/blacklisted_name.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/boolean_datetime.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/boolean_datetime.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/boolean_datetime.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/broad_except.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/broad_except.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/bugfix_local_scope_metaclass_1177.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/bugfix_local_scope_metaclass_1177.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/cellvar_escaping_loop.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/cellvar_escaping_loop.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/class_members_py27.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/class_members_py27.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/class_members_py27.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/class_members_py30.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/class_members_py30.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/class_members_py30.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/class_scope.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/class_scope.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/comparison_with_callable.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/comparison_with_callable.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/confidence_filter.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/confidence_filter.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/confidence_filter.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/confusing_with_statement.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/confusing_with_statement.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_iterating_dictionary.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_iterating_dictionary.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_join.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_join.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_merging_isinstance.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_merging_isinstance.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_swap_variables.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_swap_variables.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_using_dict_comprehension.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_using_dict_comprehension.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_using_enumerate.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_using_enumerate.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_using_get.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_using_get.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_using_in.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_using_in.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_using_set_comprehension.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/consider_using_set_comprehension.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/continue_in_finally.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/continue_in_finally.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/crash_missing_module_type.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/crash_missing_module_type.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/ctor_arguments.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/ctor_arguments.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/dangerous_default_value.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/dangerous_default_value.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/dangerous_default_value.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/dangerous_default_value_py30.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/dangerous_default_value_py30.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/dangerous_default_value_py30.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/defined_and_used_on_same_line.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_lambda.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_lambda.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_lambda.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_method_getmoduleinfo.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_method_getmoduleinfo.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_method_getmoduleinfo.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_methods_py2.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_methods_py2.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_methods_py2.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_methods_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_methods_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_methods_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_methods_py36.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_methods_py36.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_methods_py36.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_py2.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_py2.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_py2.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_py36.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_py36.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_py36.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_py4.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_py4.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_py4.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_uninstalled.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_uninstalled.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/deprecated_module_uninstalled.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/disable_msg_github_issue_1389.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/disable_msg_github_issue_1389.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/disable_ungrouped_imports.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/disable_ungrouped_imports.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/disable_wrong_import_order.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/disable_wrong_import_order.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/disable_wrong_import_position.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/docstrings.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/docstrings.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/duplicate_argument_name.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/duplicate_argument_name.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/duplicate_bases.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/duplicate_bases.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/duplicate_dict_literal_key.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/duplicate_dict_literal_key.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/duplicate_except.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/duplicate_except.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/eval_used.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/eval_used.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/exception_is_binary_op.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/exception_is_binary_op.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/exception_message.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/exception_message.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/exception_message.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/exec_used_py2.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/exec_used_py2.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/exec_used_py2.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/exec_used_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/exec_used_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/exec_used_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/fallback_import_disabled.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/fallback_import_disabled.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/fallback_import_enabled.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/fallback_import_enabled.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/fallback_import_enabled.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/fixme.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/fixme.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/fixme_bad_formatting_1139.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/fixme_bad_formatting_1139.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/fixme_bad_formatting_1139.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/formatted_string_literal_with_if_py36.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/formatted_string_literal_with_if_py36.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/formatting.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/function_redefined.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/function_redefined.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/future_import.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/future_unicode_literals.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/future_unicode_literals.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/future_unicode_literals.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/generated_members.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/generated_members.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/genexp_in_class_scope.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/genexp_in_class_scope.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/genexpr_variable_scope.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/genexpr_variable_scope.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/globals.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/globals.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/import_error.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/import_error.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/import_error.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/inconsistent_mro.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/inconsistent_mro.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/inconsistent_returns.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/inconsistent_returns.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/inconsistent_returns.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/indexing_exception.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/indexing_exception.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/indexing_exception.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/inherit_non_class.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/inherit_non_class.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/init_is_generator.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/init_is_generator.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/init_not_called.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/init_not_called.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/init_subclass_classmethod_py36.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/init_subclass_classmethod_py36.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_all_object.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_all_object.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_encoding_py27.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_encoding_py27.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_encoding_py27.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_envvar_value.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_envvar_value.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_exceptions_caught.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_exceptions_caught.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_exceptions_raised.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_exceptions_raised.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_length_returned.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_length_returned.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_metaclass.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_metaclass.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_metaclass_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_metaclass_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_metaclass_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_name.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_name.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_sequence_index.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_sequence_index.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_slice_index.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_slice_index.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_star_assignment_target.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_star_assignment_target.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_star_assignment_target.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_unary_operand_type.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/invalid_unary_operand_type.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/iterable_context.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/iterable_context.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/iterable_context_py2.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/iterable_context_py2.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/iterable_context_py2.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/iterable_context_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/iterable_context_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/iterable_context_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/iterable_context_py36.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/iterable_context_py36.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/iterable_context_py36.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/keyword_arg_before_vararg.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/keyword_arg_before_vararg.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/len_checks.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/len_checks.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/line_endings.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/line_endings.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/line_endings.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/line_too_long.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/line_too_long.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/line_too_long_end_of_module.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/literal_comparison.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/literal_comparison.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/logging_format_interpolation.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/logging_format_interpolation.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/logging_format_interpolation_py36.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/logging_format_interpolation_py36.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/logging_format_interpolation_py36.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/logging_fstring_interpolation_py36.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/logging_fstring_interpolation_py36.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/logging_fstring_interpolation_py36.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/logging_not_lazy.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/logging_not_lazy.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/logical_tautology.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/logical_tautology.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/long_lines_with_utf8.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/long_lines_with_utf8.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/long_utf8_lines.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/long_utf8_lines.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/lost_exception.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/lost_exception.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/mapping_context.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/mapping_context.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/mapping_context_py2.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/mapping_context_py2.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/mapping_context_py2.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/mapping_context_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/mapping_context_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/mapping_context_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_hints.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_hints.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_hints.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_ignore_none.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_ignore_none.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_ignore_none.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_no_hints.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_no_hints.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_no_hints.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_opaque.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_opaque.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_opaque.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_py37.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_py37.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/member_checks_py37.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/membership_protocol.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/membership_protocol.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/membership_protocol_py2.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/membership_protocol_py2.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/membership_protocol_py2.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/membership_protocol_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/membership_protocol_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/membership_protocol_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/messages_managed_by_id.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/messages_managed_by_id.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/method_hidden.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/method_hidden.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/misplaced_bare_raise.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/misplaced_bare_raise.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/misplaced_comparison_constant.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/misplaced_comparison_constant.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/misplaced_format_function.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/misplaced_format_function.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/misplaced_future.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/misplaced_future.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/missing_docstring.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/missing_docstring.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/missing_final_newline.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/missing_final_newline.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/missing_kwoa_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/missing_kwoa_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/missing_kwoa_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/missing_self_argument.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/missing_self_argument.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/mixed_indentation.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/mixed_indentation.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/monkeypatch_method.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/monkeypatch_method.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/multiple_imports.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/multiple_imports.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/namePresetCamelCase.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/namePresetCamelCase.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/namePresetCamelCase.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/name_preset_snake_case.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/name_preset_snake_case.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/name_preset_snake_case.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/name_styles.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/name_styles.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/name_styles.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/namedtuple_member_inference.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/namedtuple_member_inference.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/names_in__all__.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/names_in__all__.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/nested_blocks_issue1088.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/nested_blocks_issue1088.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/newstyle__slots__.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/newstyle__slots__.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/newstyle_properties.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/newstyle_properties.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/no_classmethod_decorator.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/no_classmethod_decorator.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/no_else_return.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/no_else_return.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/no_name_in_module.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/no_name_in_module.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/no_self_use.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/no_self_use.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/no_self_use_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/no_self_use_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/no_self_use_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/no_staticmethod_decorator.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/no_staticmethod_decorator.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/non_iterator_returned.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/non_iterator_returned.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/none_dunder_protocols_py36.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/none_dunder_protocols_py36.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/none_dunder_protocols_py36.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/nonexistent_operator.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/nonexistent_operator.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/nonlocal_and_global.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/nonlocal_and_global.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/nonlocal_and_global.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/nonlocal_without_binding.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/nonlocal_without_binding.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/nonlocal_without_binding.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/not_async_context_manager.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/not_async_context_manager.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/not_async_context_manager.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/not_callable.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/not_callable.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/not_context_manager.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/not_context_manager.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/not_in_loop.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/not_in_loop.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/old_division_manually.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/old_division_manually.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/old_style_class_py27.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/old_style_class_py27.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/old_style_class_py27.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/postponed_evaluation_activated.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/postponed_evaluation_activated.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/postponed_evaluation_activated.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/postponed_evaluation_not_activated.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/postponed_evaluation_not_activated.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/postponed_evaluation_not_activated.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/print_always_warns.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/print_always_warns.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/print_always_warns.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/protected_access_access_different_scopes.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/protected_access_access_different_scopes.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/protected_access_access_different_scopes.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/raising_format_tuple.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/raising_format_tuple.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/raising_non_exception_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/raising_non_exception_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/raising_non_exception_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/raising_self.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/raising_self.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/recursion_error_940.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/redefine_in_handler.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/redefine_in_handler.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/redefine_in_handler.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/redefined_argument_from_local.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/redefined_argument_from_local.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/redefined_builtin.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/redefined_builtin.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/redundant_unittest_assert.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/redundant_unittest_assert.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/regression_1326_crash_uninferable.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/regression_no_value_for_parameter.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/regression_no_value_for_parameter.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/reimported.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/reimported.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/repeated_keyword.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/repeated_keyword.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/return_in_init.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/return_in_init.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/return_outside_function.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/return_outside_function.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/reused_outer_loop_variable.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/reused_outer_loop_variable.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/reused_outer_loop_variable_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/reused_outer_loop_variable_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/reused_outer_loop_variable_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/self_cls_assignment.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/self_cls_assignment.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/signature_differs.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/signature_differs.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/simplifiable_if_statement.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/simplifiable_if_statement.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/simplify_chained_comparison.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/simplify_chained_comparison.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/singledispatch_functions.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/singledispatch_functions.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/singledispatch_functions.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/singledispatch_functions_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/singledispatch_functions_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/singledispatch_functions_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/singleton_comparison.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/singleton_comparison.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/slots_checks.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/slots_checks.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/socketerror_import.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/star_needs_assignment_target.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/star_needs_assignment_target.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/star_needs_assignment_target.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/star_needs_assignment_target_py35.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/star_needs_assignment_target_py35.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/star_needs_assignment_target_py35.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/statement_without_effect.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/statement_without_effect.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/statement_without_effect_py36.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/statement_without_effect_py36.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/statement_without_effect_py36.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/stop_iteration_inside_generator.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/stop_iteration_inside_generator.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/stop_iteration_inside_generator.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/string_formatting.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/string_formatting.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/string_formatting_disable.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/string_formatting_disable.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/string_formatting_disable.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/string_formatting_failed_inference.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/string_formatting_py27.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/string_formatting_py27.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/string_formatting_py27.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/string_formatting_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/string_formatting_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/string_formatting_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/subprocess_popen_preexec_fn.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/subprocess_popen_preexec_fn.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/super_checks.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/super_checks.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/superfluous_parens.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/superfluous_parens.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/suspicious_str_strip_call.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/suspicious_str_strip_call.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/suspicious_str_strip_call.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/suspicious_str_strip_call_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/suspicious_str_strip_call_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/suspicious_str_strip_call_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/syntax_error.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/syntax_error.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/syntax_error.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/syntax_error_jython.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/syntax_error_jython.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/syntax_error_jython.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/sys_stream_regression_1004.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/sys_stream_regression_1004.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/sys_stream_regression_1004.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/ternary.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/ternary.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/test_compile.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/tokenize_error.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/tokenize_error.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/tokenize_error.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/tokenize_error_jython.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/tokenize_error_jython.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/tokenize_error_jython.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_few_public_methods.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_few_public_methods.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_few_public_methods_37.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_few_public_methods_37.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_few_public_methods_37.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_ancestors.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_ancestors.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_arguments.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_arguments.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_arguments_issue_1045.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_arguments_issue_1045.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_arguments_issue_1045.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_boolean_expressions.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_boolean_expressions.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_branches.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_branches.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_instance_attributes.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_instance_attributes.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_lines.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_lines.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_lines_disabled.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_locals.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_locals.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_nested_blocks.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_nested_blocks.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_public_methods.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_public_methods.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_return_statements.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_return_statements.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_star_expressions.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_star_expressions.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_star_expressions.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_statements.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/too_many_statements.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/trailing_comma_tuple.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/trailing_comma_tuple.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/trailing_comma_tuple.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/trailing_newlines.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/trailing_newlines.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/trailing_whitespaces.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/trailing_whitespaces.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/try_except_raise.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/try_except_raise.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unbalanced_tuple_unpacking.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unbalanced_tuple_unpacking.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unbalanced_tuple_unpacking_py30.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unbalanced_tuple_unpacking_py30.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/undefined_loop_variable.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/undefined_loop_variable.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/undefined_variable.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/undefined_variable.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/undefined_variable_py30.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/undefined_variable_py30.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/undefined_variable_py30.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unexpected_special_method_signature.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unexpected_special_method_signature.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/ungrouped_imports.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/ungrouped_imports.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unhashable_dict_key.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unhashable_dict_key.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unidiomatic_typecheck.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unidiomatic_typecheck.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/uninferable_all_object.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unnecessary_lambda.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unnecessary_lambda.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unnecessary_pass.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unnecessary_pass.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unneeded_not.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unneeded_not.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unpacked_exceptions.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unpacked_exceptions.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/unpacked_exceptions.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unpacking.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unpacking_generalizations.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unpacking_generalizations.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/unpacking_generalizations.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unpacking_non_sequence.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unpacking_non_sequence.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unreachable.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unreachable.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unrecognized_inline_option.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unrecognized_inline_option.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unsubscriptable_value.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unsubscriptable_value.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unsupported_assignment_operation.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unsupported_assignment_operation.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unsupported_binary_operation.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unsupported_binary_operation.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/unsupported_binary_operation.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unsupported_delete_operation.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unsupported_delete_operation.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_argument.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_argument.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_argument_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_argument_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_argument_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_global_variable1.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_global_variable2.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_global_variable2.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_global_variable2.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_global_variable3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_global_variable4.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_global_variable4.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_global_variable4.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_import.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_import.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_import_assigned_to.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_typing_imports.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_typing_imports.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_variable.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/unused_variable.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/used_before_assignment_488.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/used_before_assignment_issue1081.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/used_before_assignment_issue1081.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/used_before_assignment_issue853.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/used_before_assignment_nonlocal.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/used_before_assignment_nonlocal.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/used_before_assignment_nonlocal.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/used_prior_global_declaration.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/used_prior_global_declaration.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/used_prior_global_declaration.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless-import-alias.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless-import-alias.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_else_on_loop.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_else_on_loop.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_object_inheritance.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_object_inheritance.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_return.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_return.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_super_delegation.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_super_delegation.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_super_delegation_py3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_super_delegation_py3.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_super_delegation_py3.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_super_delegation_py35.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_super_delegation_py35.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/useless_super_delegation_py35.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/using_constant_test.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/using_constant_test.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/wildcard_import.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wildcard_import.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/wildcard_import_allowed.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wildcard_import_allowed.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/wildcard_import_allowed.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/with_used_before_assign.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/with_used_before_assign.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/with_using_generator.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/with_using_generator.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_order.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_order.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_order2.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position10.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position11.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position11.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position12.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position12.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position13.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position13.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position14.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position14.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position15.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position2.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position3.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position4.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position5.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position6.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position7.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position8.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position9.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position_exclude_dunder_main.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/wrong_import_position_exclude_dunder_main.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_from_iterable_py33.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_from_iterable_py33.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_from_iterable_py33.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_from_outside_func.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_from_outside_func.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_from_outside_func.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_inside_async_function.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_inside_async_function.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_inside_async_function.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_inside_async_function_py36.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_inside_async_function_py36.rc create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_inside_async_function_py36.txt create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_outside_func.py create mode 100644 venv/Lib/site-packages/pylint/test/functional/yield_outside_func.txt create mode 100644 venv/Lib/site-packages/pylint/test/input/__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_3k_removed_stuff_py_30.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_bad_cont_dictcomp_py27.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_block_disable_msg.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_bug113231.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_disable_linebased.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_dotted_ancestor.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_e0012.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_e0204.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_e12xx.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_e13xx.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_excess_escapes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_first_arg.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_i0011.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_i0012.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_i0013.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_i0014.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_i0020.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_i0022.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_logging_not_lazy_with_logger.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_loopvar_in_dict_comp_py27.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_module___dict__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_nameerror_on_string_substitution.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_no_dummy_redefined.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror___init___return_from_inner_function.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_access_attr_before_def_false_positive.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_base_init_vars.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_builtin_module_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_class_attributes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_classes_meth_could_be_a_function.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_classes_protected_member_access.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_decorator_scope.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_e1101_9588_base_attr_aug_assign.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_external_classmethod_crash.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_inner_classes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_lambda_use_before_assign.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_mcs_attr_access.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_new_style_class_py_30.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_no_warning_docstring.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_object_as_class_attribute.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_overloaded_operator.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_property_affectation_py26.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_yield_assign_py25.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_noerror_yield_return_mix.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_nonregr___file___global.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_return_yield_mix_py_33.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_typecheck_callfunc_assigment.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_unused_import_py30.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_variables_unused_name_from_wilcard_import.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_w0233.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_w0401.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_w0401_disabled.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_w0401_disabled_in_func.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_w0404.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_w0405.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_w0406.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_w0611.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_w0612.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_w0613.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_w0623_py30.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/func_w0801.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/ignore_except_pass_by_default.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/not__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/w0401_cycle.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/__pycache__/w0801_same.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/func_3k_removed_stuff_py_30.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_bad_cont_dictcomp_py27.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_block_disable_msg.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_bug113231.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_disable_linebased.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_dotted_ancestor.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_e0012.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_e0204.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_e12xx.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_e13xx.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_excess_escapes.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_first_arg.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_i0011.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_i0012.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_i0013.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_i0014.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_i0020.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_i0022.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_logging_not_lazy_with_logger.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_loopvar_in_dict_comp_py27.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_module___dict__.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_nameerror_on_string_substitution.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_no_dummy_redefined.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror___init___return_from_inner_function.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_access_attr_before_def_false_positive.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_base_init_vars.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_builtin_module_test.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_class_attributes.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_classes_meth_could_be_a_function.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_classes_protected_member_access.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_decorator_scope.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_e1101_9588_base_attr_aug_assign.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_external_classmethod_crash.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_inner_classes.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_lambda_use_before_assign.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_mcs_attr_access.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_new_style_class_py_30.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_no_warning_docstring.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_object_as_class_attribute.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_overloaded_operator.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_property_affectation_py26.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_yield_assign_py25.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_noerror_yield_return_mix.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_nonregr___file___global.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_return_yield_mix_py_33.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_typecheck_callfunc_assigment.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_unused_import_py30.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_variables_unused_name_from_wilcard_import.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0122_py_30.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0233.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0332_py_30.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0401.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0401_disabled.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0401_disabled_in_func.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0401_package/__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0401_package/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0401_package/__pycache__/all_the_things.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0401_package/__pycache__/thing1.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0401_package/__pycache__/thing2.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0401_package/all_the_things.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0401_package/thing1.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0401_package/thing2.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0404.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0405.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0406.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0611.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0612.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0613.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0623_py30.py create mode 100644 venv/Lib/site-packages/pylint/test/input/func_w0801.py create mode 100644 venv/Lib/site-packages/pylint/test/input/ignore_except_pass_by_default.py create mode 100644 venv/Lib/site-packages/pylint/test/input/noext create mode 100644 venv/Lib/site-packages/pylint/test/input/not__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/input/similar1 create mode 100644 venv/Lib/site-packages/pylint/test/input/similar2 create mode 100644 venv/Lib/site-packages/pylint/test/input/w0401_cycle.py create mode 100644 venv/Lib/site-packages/pylint/test/input/w0801_same.py create mode 100644 venv/Lib/site-packages/pylint/test/messages/builtin_module.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_3k_removed_stuff_py_30.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_bad_cont_dictcomp_py27.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_block_disable_msg.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_bug113231.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_disable_linebased.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_disable_linebased_py30.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_dotted_ancestor.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_e0012.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_e0204.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_e12xx.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_e13xx.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_e13xx_py30.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_excess_escapes.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_first_arg.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_i0011.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_i0012.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_i0013.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_i0014.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_i0020.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_i0022.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_logging_not_lazy_with_logger.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_loopvar_in_dict_comp_py27.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_module___dict__.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_nameerror_on_string_substitution.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_no_dummy_redefined.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_nonregr___file___global.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_raw_escapes.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_return_yield_mix_py_33.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_toolonglines_py30.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_typecheck_callfunc_assigment.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_typecheck_getattr_py30.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_typecheck_non_callable_call.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_unicode_literal_py26.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_unicode_literal_py274.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_unused_import_py30.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_use_for_or_listcomp_var_py29.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_use_for_or_listcomp_var_py30.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_variables_unused_name_from_wilcard_import.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0122_py_30.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0233.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0312.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0332_py_30.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0401.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0401_disabled.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0401_disabled_in_func.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0401_package.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0404.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0405.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0406.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0611.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0612.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0613.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0622.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0623.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0623_py30.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0623_py_30.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_w0801.txt create mode 100644 venv/Lib/site-packages/pylint/test/messages/func_with_without_as_py25.txt create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/.pylintrc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/application_crash.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/awesome_module.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/classdoc_usage.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/decimal_inference.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/import_assign.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/import_package_subpackage_module.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/import_something.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/meta.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/module_global.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/no_stdout_encoding.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/numarray_import.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/numarray_inf.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/precedence_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/special_attr_scope_lookup_crash.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/test_pylintrc_comments.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/try_finally_disable_msg_crash.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/__pycache__/wrong_import_position.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/absimp/__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/absimp/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/absimp/__pycache__/string.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/absimp/string.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/application_crash.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/awesome_module.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/bad_package/__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/bad_package/__pycache__/wrong.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/bad_package/wrong.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/beyond_top/__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/beyond_top/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/beyond_top/__pycache__/data.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/beyond_top/data.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/classdoc_usage.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/comments_pylintrc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/decimal_inference.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/descriptor_crash.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/dummy/__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/dummy/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/dummy/__pycache__/another.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/dummy/__pycache__/dummy.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/dummy/another.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/dummy/dummy.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/dummy_plugin.rc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/dummy_plugin/__pycache__/dummy_plugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/dummy_plugin/dummy_plugin.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/import_assign.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/import_package_subpackage_module.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/import_something.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/init_wildcard/__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/init_wildcard/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/meta.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/module_global.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/no_stdout_encoding.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/numarray_import.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/numarray_inf.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/package/AudioTime.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/package/__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/package/__pycache__/AudioTime.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/package/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/package/subpackage/__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/package/subpackage/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/package/subpackage/__pycache__/module.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/package/subpackage/module.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/package_all/__init__.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/package_all/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/package_all/__pycache__/notmissing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/package_all/notmissing.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/precedence_test.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/py3k-disabled.rc create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/py3k_error_flag.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/py3k_errors_and_warnings.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/special_attr_scope_lookup_crash.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/syntax_error.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/test_pylintrc_comments.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/try_finally_disable_msg_crash.py create mode 100644 venv/Lib/site-packages/pylint/test/regrtest_data/wrong_import_position.py create mode 100644 venv/Lib/site-packages/pylint/test/test_func.py create mode 100644 venv/Lib/site-packages/pylint/test/test_functional.py create mode 100644 venv/Lib/site-packages/pylint/test/test_import_graph.py create mode 100644 venv/Lib/site-packages/pylint/test/test_regr.py create mode 100644 venv/Lib/site-packages/pylint/test/test_self.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_base.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_classes.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_exceptions.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_format.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_imports.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_logging.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_misc.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_python3.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_similar.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_spelling.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_stdlib.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_strings.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_typecheck.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checker_variables.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_checkers_utils.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_config.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_lint.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_pyreverse_diadefs.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_pyreverse_inspector.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_pyreverse_writer.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_reporters_json.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_reporting.py create mode 100644 venv/Lib/site-packages/pylint/test/unittest_utils.py create mode 100644 venv/Lib/site-packages/pylint/testutils.py create mode 100644 venv/Lib/site-packages/pylint/utils.py create mode 100644 venv/Lib/site-packages/pytest-3.9.1.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pytest-3.9.1.dist-info/LICENSE create mode 100644 venv/Lib/site-packages/pytest-3.9.1.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pytest-3.9.1.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pytest-3.9.1.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pytest-3.9.1.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/pytest-3.9.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pytest.py create mode 100644 venv/Lib/site-packages/python_dotenv-0.9.1.dist-info/DESCRIPTION.rst create mode 100644 venv/Lib/site-packages/python_dotenv-0.9.1.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/python_dotenv-0.9.1.dist-info/METADATA create mode 100644 venv/Lib/site-packages/python_dotenv-0.9.1.dist-info/RECORD create mode 100644 venv/Lib/site-packages/python_dotenv-0.9.1.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/python_dotenv-0.9.1.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/python_dotenv-0.9.1.dist-info/metadata.json create mode 100644 venv/Lib/site-packages/python_dotenv-0.9.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pytz-2018.5.dist-info/DESCRIPTION.rst create mode 100644 venv/Lib/site-packages/pytz-2018.5.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pytz-2018.5.dist-info/LICENSE.txt create mode 100644 venv/Lib/site-packages/pytz-2018.5.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pytz-2018.5.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pytz-2018.5.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pytz-2018.5.dist-info/metadata.json create mode 100644 venv/Lib/site-packages/pytz-2018.5.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pytz-2018.5.dist-info/zip-safe create mode 100644 venv/Lib/site-packages/pytz/__init__.py create mode 100644 venv/Lib/site-packages/pytz/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pytz/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pytz/__pycache__/lazy.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pytz/__pycache__/reference.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pytz/__pycache__/tzfile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pytz/__pycache__/tzinfo.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pytz/exceptions.py create mode 100644 venv/Lib/site-packages/pytz/lazy.py create mode 100644 venv/Lib/site-packages/pytz/reference.py create mode 100644 venv/Lib/site-packages/pytz/tzfile.py create mode 100644 venv/Lib/site-packages/pytz/tzinfo.py create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Abidjan create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Accra create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Addis_Ababa create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Algiers create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Asmara create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Asmera create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Bamako create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Bangui create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Banjul create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Bissau create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Blantyre create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Brazzaville create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Bujumbura create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Cairo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Casablanca create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Ceuta create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Conakry create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Dakar create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Dar_es_Salaam create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Djibouti create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Douala create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/El_Aaiun create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Freetown create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Gaborone create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Harare create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Johannesburg create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Juba create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Kampala create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Khartoum create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Kigali create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Kinshasa create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Lagos create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Libreville create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Lome create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Luanda create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Lubumbashi create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Lusaka create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Malabo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Maputo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Maseru create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Mbabane create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Mogadishu create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Monrovia create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Nairobi create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Ndjamena create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Niamey create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Nouakchott create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Ouagadougou create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Porto-Novo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Sao_Tome create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Timbuktu create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Tripoli create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Tunis create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Windhoek create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Adak create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Anchorage create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Anguilla create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Antigua create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Araguaina create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Buenos_Aires create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Catamarca create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/ComodRivadavia create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Cordoba create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Jujuy create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/La_Rioja create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Mendoza create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Rio_Gallegos create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Salta create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/San_Juan create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/San_Luis create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Tucuman create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Ushuaia create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Aruba create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Asuncion create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Atikokan create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Atka create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Bahia create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Bahia_Banderas create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Barbados create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Belem create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Belize create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Blanc-Sablon create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Boa_Vista create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Bogota create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Boise create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Buenos_Aires create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Cambridge_Bay create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Campo_Grande create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Cancun create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Caracas create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Catamarca create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Cayenne create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Cayman create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Chicago create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Chihuahua create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Coral_Harbour create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Cordoba create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Costa_Rica create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Creston create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Cuiaba create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Curacao create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Danmarkshavn create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Dawson create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Dawson_Creek create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Denver create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Detroit create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Dominica create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Edmonton create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Eirunepe create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/El_Salvador create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Ensenada create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Fort_Nelson create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Fort_Wayne create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Fortaleza create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Glace_Bay create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Godthab create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Goose_Bay create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Grand_Turk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Grenada create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Guadeloupe create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Guatemala create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Guayaquil create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Guyana create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Halifax create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Havana create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Hermosillo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Indianapolis create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Knox create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Marengo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Petersburg create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Tell_City create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Vevay create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Vincennes create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Winamac create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indianapolis create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Inuvik create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Iqaluit create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Jamaica create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Jujuy create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Juneau create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Kentucky/Louisville create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Kentucky/Monticello create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Knox_IN create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Kralendijk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/La_Paz create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Lima create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Los_Angeles create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Louisville create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Lower_Princes create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Maceio create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Managua create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Manaus create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Marigot create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Martinique create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Matamoros create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Mazatlan create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Mendoza create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Menominee create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Merida create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Metlakatla create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Mexico_City create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Miquelon create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Moncton create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Monterrey create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Montevideo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Montreal create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Montserrat create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Nassau create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/New_York create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Nipigon create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Nome create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Noronha create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/North_Dakota/Beulah create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/North_Dakota/Center create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/North_Dakota/New_Salem create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Ojinaga create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Panama create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Pangnirtung create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Paramaribo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Phoenix create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Port-au-Prince create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Port_of_Spain create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Porto_Acre create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Porto_Velho create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Puerto_Rico create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Punta_Arenas create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Rainy_River create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Rankin_Inlet create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Recife create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Regina create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Resolute create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Rio_Branco create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Rosario create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Santa_Isabel create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Santarem create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Santiago create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Santo_Domingo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Sao_Paulo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Scoresbysund create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Shiprock create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Sitka create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/St_Barthelemy create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/St_Johns create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/St_Kitts create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/St_Lucia create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/St_Thomas create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/St_Vincent create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Swift_Current create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Tegucigalpa create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Thule create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Thunder_Bay create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Tijuana create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Toronto create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Tortola create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Vancouver create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Virgin create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Whitehorse create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Winnipeg create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Yakutat create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Yellowknife create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Casey create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Davis create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/DumontDUrville create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Macquarie create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Mawson create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/McMurdo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Palmer create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Rothera create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/South_Pole create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Syowa create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Troll create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Vostok create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Arctic/Longyearbyen create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Aden create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Almaty create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Amman create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Anadyr create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Aqtau create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Aqtobe create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ashgabat create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ashkhabad create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Atyrau create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Baghdad create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Bahrain create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Baku create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Bangkok create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Barnaul create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Beirut create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Bishkek create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Brunei create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Calcutta create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Chita create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Choibalsan create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Chongqing create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Chungking create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Colombo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Dacca create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Damascus create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Dhaka create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Dili create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Dubai create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Dushanbe create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Famagusta create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Gaza create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Harbin create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Hebron create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ho_Chi_Minh create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Hong_Kong create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Hovd create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Irkutsk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Istanbul create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Jakarta create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Jayapura create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Jerusalem create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kabul create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kamchatka create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Karachi create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kashgar create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kathmandu create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Katmandu create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Khandyga create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kolkata create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Krasnoyarsk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kuala_Lumpur create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kuching create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kuwait create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Macao create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Macau create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Magadan create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Makassar create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Manila create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Muscat create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Nicosia create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Novokuznetsk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Novosibirsk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Omsk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Oral create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Phnom_Penh create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Pontianak create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Pyongyang create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Qatar create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Qyzylorda create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Rangoon create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Riyadh create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Saigon create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Sakhalin create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Samarkand create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Seoul create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Shanghai create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Singapore create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Srednekolymsk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Taipei create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Tashkent create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Tbilisi create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Tehran create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Tel_Aviv create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Thimbu create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Thimphu create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Tokyo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Tomsk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ujung_Pandang create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ulaanbaatar create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ulan_Bator create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Urumqi create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ust-Nera create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Vientiane create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Vladivostok create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Yakutsk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Yangon create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Yekaterinburg create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Yerevan create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Azores create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Bermuda create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Canary create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Cape_Verde create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Faeroe create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Faroe create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Jan_Mayen create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Madeira create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Reykjavik create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/South_Georgia create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/St_Helena create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Stanley create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/ACT create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Adelaide create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Brisbane create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Broken_Hill create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Canberra create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Currie create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Darwin create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Eucla create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Hobart create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/LHI create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Lindeman create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Lord_Howe create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Melbourne create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/NSW create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/North create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Perth create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Queensland create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/South create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Sydney create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Tasmania create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Victoria create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/West create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Yancowinna create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Brazil/Acre create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Brazil/DeNoronha create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Brazil/East create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Brazil/West create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/CET create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/CST6CDT create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Atlantic create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Central create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Eastern create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Mountain create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Newfoundland create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Pacific create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Saskatchewan create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Yukon create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Chile/Continental create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Chile/EasterIsland create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Cuba create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/EET create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/EST create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/EST5EDT create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Egypt create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Eire create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+0 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+1 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+10 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+11 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+12 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+2 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+3 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+4 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+5 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+6 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+7 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+8 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+9 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-0 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-1 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-10 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-11 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-12 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-13 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-14 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-2 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-3 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-4 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-5 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-6 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-7 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-8 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-9 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT0 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/Greenwich create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/UCT create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/UTC create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/Universal create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/Zulu create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Amsterdam create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Andorra create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Astrakhan create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Athens create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Belfast create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Belgrade create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Berlin create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Bratislava create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Brussels create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Bucharest create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Budapest create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Busingen create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Chisinau create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Copenhagen create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Dublin create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Gibraltar create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Guernsey create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Helsinki create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Isle_of_Man create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Istanbul create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Jersey create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Kaliningrad create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Kiev create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Kirov create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Lisbon create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Ljubljana create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/London create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Luxembourg create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Madrid create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Malta create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Mariehamn create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Minsk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Monaco create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Moscow create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Nicosia create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Oslo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Paris create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Podgorica create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Prague create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Riga create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Rome create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Samara create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/San_Marino create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Sarajevo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Saratov create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Simferopol create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Skopje create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Sofia create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Stockholm create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Tallinn create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Tirane create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Tiraspol create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Ulyanovsk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Uzhgorod create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Vaduz create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Vatican create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Vienna create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Vilnius create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Volgograd create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Warsaw create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Zagreb create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Zaporozhye create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Zurich create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Factory create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/GB create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/GB-Eire create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/GMT create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/GMT+0 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/GMT-0 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/GMT0 create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Greenwich create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/HST create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Hongkong create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Iceland create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Antananarivo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Chagos create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Christmas create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Cocos create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Comoro create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Kerguelen create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Mahe create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Maldives create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Mauritius create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Mayotte create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Reunion create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Iran create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Israel create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Jamaica create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Japan create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Kwajalein create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Libya create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/MET create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/MST create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/MST7MDT create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Mexico/BajaNorte create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Mexico/BajaSur create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Mexico/General create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/NZ create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/NZ-CHAT create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Navajo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/PRC create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/PST8PDT create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Apia create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Auckland create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Bougainville create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Chatham create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Chuuk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Easter create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Efate create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Enderbury create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Fakaofo create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Fiji create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Funafuti create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Galapagos create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Gambier create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Guadalcanal create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Guam create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Honolulu create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Johnston create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Kiritimati create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Kosrae create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Kwajalein create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Majuro create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Marquesas create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Midway create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Nauru create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Niue create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Norfolk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Noumea create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Pago_Pago create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Palau create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Pitcairn create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Pohnpei create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Ponape create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Port_Moresby create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Rarotonga create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Saipan create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Samoa create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Tahiti create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Tarawa create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Tongatapu create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Truk create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Wake create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Wallis create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Yap create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Poland create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Portugal create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/ROC create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/ROK create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Singapore create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Turkey create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/UCT create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Alaska create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Aleutian create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Arizona create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Central create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/East-Indiana create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Eastern create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Hawaii create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Indiana-Starke create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Michigan create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Mountain create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Pacific create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Samoa create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/UTC create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Universal create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/W-SU create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/WET create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Zulu create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/iso3166.tab create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/leapseconds create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/posixrules create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/tzdata.zi create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/zone.tab create mode 100644 venv/Lib/site-packages/pytz/zoneinfo/zone1970.tab create mode 100644 venv/Lib/site-packages/setuptools-40.4.3.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/setuptools-40.4.3.dist-info/LICENSE.txt create mode 100644 venv/Lib/site-packages/setuptools-40.4.3.dist-info/METADATA create mode 100644 venv/Lib/site-packages/setuptools-40.4.3.dist-info/RECORD create mode 100644 venv/Lib/site-packages/setuptools-40.4.3.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/setuptools-40.4.3.dist-info/dependency_links.txt create mode 100644 venv/Lib/site-packages/setuptools-40.4.3.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/setuptools-40.4.3.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/setuptools-40.4.3.dist-info/zip-safe create mode 100644 venv/Lib/site-packages/setuptools/__init__.py create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/config.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/depends.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/dist.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/extension.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/glob.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/launch.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/py36compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/__init__.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/six.py create mode 100644 venv/Lib/site-packages/setuptools/archive_util.py create mode 100644 venv/Lib/site-packages/setuptools/build_meta.py create mode 100644 venv/Lib/site-packages/setuptools/cli-32.exe create mode 100644 venv/Lib/site-packages/setuptools/cli-64.exe create mode 100644 venv/Lib/site-packages/setuptools/cli.exe create mode 100644 venv/Lib/site-packages/setuptools/command/__init__.py create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/alias.py create mode 100644 venv/Lib/site-packages/setuptools/command/bdist_egg.py create mode 100644 venv/Lib/site-packages/setuptools/command/bdist_rpm.py create mode 100644 venv/Lib/site-packages/setuptools/command/bdist_wininst.py create mode 100644 venv/Lib/site-packages/setuptools/command/build_clib.py create mode 100644 venv/Lib/site-packages/setuptools/command/build_ext.py create mode 100644 venv/Lib/site-packages/setuptools/command/build_py.py create mode 100644 venv/Lib/site-packages/setuptools/command/develop.py create mode 100644 venv/Lib/site-packages/setuptools/command/dist_info.py create mode 100644 venv/Lib/site-packages/setuptools/command/easy_install.py create mode 100644 venv/Lib/site-packages/setuptools/command/egg_info.py create mode 100644 venv/Lib/site-packages/setuptools/command/install.py create mode 100644 venv/Lib/site-packages/setuptools/command/install_egg_info.py create mode 100644 venv/Lib/site-packages/setuptools/command/install_lib.py create mode 100644 venv/Lib/site-packages/setuptools/command/install_scripts.py create mode 100644 venv/Lib/site-packages/setuptools/command/launcher manifest.xml create mode 100644 venv/Lib/site-packages/setuptools/command/py36compat.py create mode 100644 venv/Lib/site-packages/setuptools/command/register.py create mode 100644 venv/Lib/site-packages/setuptools/command/rotate.py create mode 100644 venv/Lib/site-packages/setuptools/command/saveopts.py create mode 100644 venv/Lib/site-packages/setuptools/command/sdist.py create mode 100644 venv/Lib/site-packages/setuptools/command/setopt.py create mode 100644 venv/Lib/site-packages/setuptools/command/test.py create mode 100644 venv/Lib/site-packages/setuptools/command/upload.py create mode 100644 venv/Lib/site-packages/setuptools/command/upload_docs.py create mode 100644 venv/Lib/site-packages/setuptools/config.py create mode 100644 venv/Lib/site-packages/setuptools/dep_util.py create mode 100644 venv/Lib/site-packages/setuptools/depends.py create mode 100644 venv/Lib/site-packages/setuptools/dist.py create mode 100644 venv/Lib/site-packages/setuptools/extension.py create mode 100644 venv/Lib/site-packages/setuptools/extern/__init__.py create mode 100644 venv/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/glibc.py create mode 100644 venv/Lib/site-packages/setuptools/glob.py create mode 100644 venv/Lib/site-packages/setuptools/gui-32.exe create mode 100644 venv/Lib/site-packages/setuptools/gui-64.exe create mode 100644 venv/Lib/site-packages/setuptools/gui.exe create mode 100644 venv/Lib/site-packages/setuptools/launch.py create mode 100644 venv/Lib/site-packages/setuptools/lib2to3_ex.py create mode 100644 venv/Lib/site-packages/setuptools/monkey.py create mode 100644 venv/Lib/site-packages/setuptools/msvc.py create mode 100644 venv/Lib/site-packages/setuptools/namespaces.py create mode 100644 venv/Lib/site-packages/setuptools/package_index.py create mode 100644 venv/Lib/site-packages/setuptools/pep425tags.py create mode 100644 venv/Lib/site-packages/setuptools/py27compat.py create mode 100644 venv/Lib/site-packages/setuptools/py31compat.py create mode 100644 venv/Lib/site-packages/setuptools/py33compat.py create mode 100644 venv/Lib/site-packages/setuptools/py36compat.py create mode 100644 venv/Lib/site-packages/setuptools/sandbox.py create mode 100644 venv/Lib/site-packages/setuptools/script (dev).tmpl create mode 100644 venv/Lib/site-packages/setuptools/script.tmpl create mode 100644 venv/Lib/site-packages/setuptools/site-patch.py create mode 100644 venv/Lib/site-packages/setuptools/ssl_support.py create mode 100644 venv/Lib/site-packages/setuptools/unicode_utils.py create mode 100644 venv/Lib/site-packages/setuptools/version.py create mode 100644 venv/Lib/site-packages/setuptools/wheel.py create mode 100644 venv/Lib/site-packages/setuptools/windows_support.py create mode 100644 venv/Lib/site-packages/six-1.11.0.dist-info/DESCRIPTION.rst create mode 100644 venv/Lib/site-packages/six-1.11.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/six-1.11.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/six-1.11.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/six-1.11.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/six-1.11.0.dist-info/metadata.json create mode 100644 venv/Lib/site-packages/six-1.11.0.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/six.py create mode 100644 venv/Lib/site-packages/werkzeug/__init__.py create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/_compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/_internal.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/_reloader.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/datastructures.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/filesystem.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/formparser.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/http.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/local.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/posixemulation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/routing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/script.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/security.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/serving.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/testapp.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/urls.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/useragents.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/websocket.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/wrappers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/__pycache__/wsgi.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/_compat.py create mode 100644 venv/Lib/site-packages/werkzeug/_internal.py create mode 100644 venv/Lib/site-packages/werkzeug/_reloader.py create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__init__.py create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__pycache__/atom.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__pycache__/cache.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__pycache__/fixers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__pycache__/iterio.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__pycache__/jsrouting.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__pycache__/limiter.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__pycache__/lint.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__pycache__/profiler.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__pycache__/securecookie.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__pycache__/sessions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__pycache__/testtools.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/contrib/__pycache__/wrappers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/contrib/atom.py create mode 100644 venv/Lib/site-packages/werkzeug/contrib/cache.py create mode 100644 venv/Lib/site-packages/werkzeug/contrib/fixers.py create mode 100644 venv/Lib/site-packages/werkzeug/contrib/iterio.py create mode 100644 venv/Lib/site-packages/werkzeug/contrib/jsrouting.py create mode 100644 venv/Lib/site-packages/werkzeug/contrib/limiter.py create mode 100644 venv/Lib/site-packages/werkzeug/contrib/lint.py create mode 100644 venv/Lib/site-packages/werkzeug/contrib/profiler.py create mode 100644 venv/Lib/site-packages/werkzeug/contrib/securecookie.py create mode 100644 venv/Lib/site-packages/werkzeug/contrib/sessions.py create mode 100644 venv/Lib/site-packages/werkzeug/contrib/testtools.py create mode 100644 venv/Lib/site-packages/werkzeug/contrib/wrappers.py create mode 100644 venv/Lib/site-packages/werkzeug/datastructures.py create mode 100644 venv/Lib/site-packages/werkzeug/debug/__init__.py create mode 100644 venv/Lib/site-packages/werkzeug/debug/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/debug/__pycache__/console.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/debug/__pycache__/repr.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-37.pyc create mode 100644 venv/Lib/site-packages/werkzeug/debug/console.py create mode 100644 venv/Lib/site-packages/werkzeug/debug/repr.py create mode 100644 venv/Lib/site-packages/werkzeug/debug/shared/FONT_LICENSE create mode 100644 venv/Lib/site-packages/werkzeug/debug/shared/console.png create mode 100644 venv/Lib/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 venv/Lib/site-packages/werkzeug/debug/shared/jquery.js create mode 100644 venv/Lib/site-packages/werkzeug/debug/shared/less.png create mode 100644 venv/Lib/site-packages/werkzeug/debug/shared/more.png create mode 100644 venv/Lib/site-packages/werkzeug/debug/shared/source.png create mode 100644 venv/Lib/site-packages/werkzeug/debug/shared/style.css create mode 100644 venv/Lib/site-packages/werkzeug/debug/shared/ubuntu.ttf create mode 100644 venv/Lib/site-packages/werkzeug/debug/tbtools.py create mode 100644 venv/Lib/site-packages/werkzeug/exceptions.py create mode 100644 venv/Lib/site-packages/werkzeug/filesystem.py create mode 100644 venv/Lib/site-packages/werkzeug/formparser.py create mode 100644 venv/Lib/site-packages/werkzeug/http.py create mode 100644 venv/Lib/site-packages/werkzeug/local.py create mode 100644 venv/Lib/site-packages/werkzeug/posixemulation.py create mode 100644 venv/Lib/site-packages/werkzeug/routing.py create mode 100644 venv/Lib/site-packages/werkzeug/script.py create mode 100644 venv/Lib/site-packages/werkzeug/security.py create mode 100644 venv/Lib/site-packages/werkzeug/serving.py create mode 100644 venv/Lib/site-packages/werkzeug/test.py create mode 100644 venv/Lib/site-packages/werkzeug/testapp.py create mode 100644 venv/Lib/site-packages/werkzeug/urls.py create mode 100644 venv/Lib/site-packages/werkzeug/useragents.py create mode 100644 venv/Lib/site-packages/werkzeug/utils.py create mode 100644 venv/Lib/site-packages/werkzeug/websocket.py create mode 100644 venv/Lib/site-packages/werkzeug/wrappers.py create mode 100644 venv/Lib/site-packages/werkzeug/wsgi.py create mode 100644 venv/Lib/site-packages/wheel-0.32.1.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/wheel-0.32.1.dist-info/LICENSE.txt create mode 100644 venv/Lib/site-packages/wheel-0.32.1.dist-info/METADATA create mode 100644 venv/Lib/site-packages/wheel-0.32.1.dist-info/RECORD create mode 100644 venv/Lib/site-packages/wheel-0.32.1.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/wheel-0.32.1.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/wheel-0.32.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/wheel/__init__.py create mode 100644 venv/Lib/site-packages/wheel/__main__.py create mode 100644 venv/Lib/site-packages/wheel/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wheel/__pycache__/__main__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wheel/__pycache__/metadata.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wheel/__pycache__/pep425tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wheel/__pycache__/util.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wheel/__pycache__/wheelfile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wheel/bdist_wheel.py create mode 100644 venv/Lib/site-packages/wheel/cli/__init__.py create mode 100644 venv/Lib/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wheel/cli/__pycache__/convert.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wheel/cli/__pycache__/install.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wheel/cli/__pycache__/pack.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wheel/cli/__pycache__/unpack.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wheel/cli/convert.py create mode 100644 venv/Lib/site-packages/wheel/cli/install.py create mode 100644 venv/Lib/site-packages/wheel/cli/pack.py create mode 100644 venv/Lib/site-packages/wheel/cli/unpack.py create mode 100644 venv/Lib/site-packages/wheel/metadata.py create mode 100644 venv/Lib/site-packages/wheel/pep425tags.py create mode 100644 venv/Lib/site-packages/wheel/pkginfo.py create mode 100644 venv/Lib/site-packages/wheel/util.py create mode 100644 venv/Lib/site-packages/wheel/wheelfile.py create mode 100644 venv/Lib/site-packages/wrapt-1.10.11.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/wrapt-1.10.11.dist-info/LICENSE create mode 100644 venv/Lib/site-packages/wrapt-1.10.11.dist-info/METADATA create mode 100644 venv/Lib/site-packages/wrapt-1.10.11.dist-info/RECORD create mode 100644 venv/Lib/site-packages/wrapt-1.10.11.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/wrapt-1.10.11.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/wrapt/__init__.py create mode 100644 venv/Lib/site-packages/wrapt/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wrapt/__pycache__/arguments.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wrapt/__pycache__/decorators.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wrapt/__pycache__/importer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wrapt/__pycache__/wrappers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/wrapt/arguments.py create mode 100644 venv/Lib/site-packages/wrapt/decorators.py create mode 100644 venv/Lib/site-packages/wrapt/importer.py create mode 100644 venv/Lib/site-packages/wrapt/wrappers.py create mode 100644 venv/Lib/site.py create mode 100644 venv/Lib/sre_compile.py create mode 100644 venv/Lib/sre_constants.py create mode 100644 venv/Lib/sre_parse.py create mode 100644 venv/Lib/stat.py create mode 100644 venv/Lib/struct.py create mode 100644 venv/Lib/tarfile.py create mode 100644 venv/Lib/tempfile.py create mode 100644 venv/Lib/token.py create mode 100644 venv/Lib/tokenize.py create mode 100644 venv/Lib/types.py create mode 100644 venv/Lib/warnings.py create mode 100644 venv/Lib/weakref.py create mode 100644 venv/Scripts/activate create mode 100644 venv/Scripts/activate.bat create mode 100644 venv/Scripts/activate.ps1 create mode 100644 venv/Scripts/activate_this.py create mode 100644 venv/Scripts/deactivate.bat create mode 100644 venv/Scripts/dotenv.exe create mode 100644 venv/Scripts/easy_install-3.7.exe create mode 100644 venv/Scripts/easy_install.exe create mode 100644 venv/Scripts/epylint.exe create mode 100644 venv/Scripts/flask.exe create mode 100644 venv/Scripts/isort.exe create mode 100644 venv/Scripts/pep8.exe create mode 100644 venv/Scripts/pip.exe create mode 100644 venv/Scripts/pip3.7.exe create mode 100644 venv/Scripts/pip3.exe create mode 100644 venv/Scripts/py.test.exe create mode 100644 venv/Scripts/pylint.exe create mode 100644 venv/Scripts/pyreverse.exe create mode 100644 venv/Scripts/pytest.exe create mode 100644 venv/Scripts/python.exe create mode 100644 venv/Scripts/python3.dll create mode 100644 venv/Scripts/python37.dll create mode 100644 venv/Scripts/pythonw.exe create mode 100644 venv/Scripts/symilar.exe create mode 100644 venv/Scripts/wheel.exe create mode 100644 venv/pip-selfcheck.json create mode 100644 venv/tcl/tcl8.6/auto.tcl create mode 100644 venv/tcl/tcl8.6/clock.tcl create mode 100644 venv/tcl/tcl8.6/encoding/ascii.enc create mode 100644 venv/tcl/tcl8.6/encoding/big5.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp1250.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp1251.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp1252.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp1253.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp1254.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp1255.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp1256.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp1257.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp1258.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp437.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp737.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp775.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp850.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp852.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp855.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp857.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp860.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp861.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp862.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp863.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp864.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp865.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp866.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp869.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp874.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp932.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp936.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp949.enc create mode 100644 venv/tcl/tcl8.6/encoding/cp950.enc create mode 100644 venv/tcl/tcl8.6/encoding/dingbats.enc create mode 100644 venv/tcl/tcl8.6/encoding/ebcdic.enc create mode 100644 venv/tcl/tcl8.6/encoding/euc-cn.enc create mode 100644 venv/tcl/tcl8.6/encoding/euc-jp.enc create mode 100644 venv/tcl/tcl8.6/encoding/euc-kr.enc create mode 100644 venv/tcl/tcl8.6/encoding/gb12345.enc create mode 100644 venv/tcl/tcl8.6/encoding/gb1988.enc create mode 100644 venv/tcl/tcl8.6/encoding/gb2312-raw.enc create mode 100644 venv/tcl/tcl8.6/encoding/gb2312.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso2022-jp.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso2022-kr.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso2022.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-1.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-10.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-13.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-14.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-15.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-16.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-2.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-3.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-4.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-5.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-6.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-7.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-8.enc create mode 100644 venv/tcl/tcl8.6/encoding/iso8859-9.enc create mode 100644 venv/tcl/tcl8.6/encoding/jis0201.enc create mode 100644 venv/tcl/tcl8.6/encoding/jis0208.enc create mode 100644 venv/tcl/tcl8.6/encoding/jis0212.enc create mode 100644 venv/tcl/tcl8.6/encoding/koi8-r.enc create mode 100644 venv/tcl/tcl8.6/encoding/koi8-u.enc create mode 100644 venv/tcl/tcl8.6/encoding/ksc5601.enc create mode 100644 venv/tcl/tcl8.6/encoding/macCentEuro.enc create mode 100644 venv/tcl/tcl8.6/encoding/macCroatian.enc create mode 100644 venv/tcl/tcl8.6/encoding/macCyrillic.enc create mode 100644 venv/tcl/tcl8.6/encoding/macDingbats.enc create mode 100644 venv/tcl/tcl8.6/encoding/macGreek.enc create mode 100644 venv/tcl/tcl8.6/encoding/macIceland.enc create mode 100644 venv/tcl/tcl8.6/encoding/macJapan.enc create mode 100644 venv/tcl/tcl8.6/encoding/macRoman.enc create mode 100644 venv/tcl/tcl8.6/encoding/macRomania.enc create mode 100644 venv/tcl/tcl8.6/encoding/macThai.enc create mode 100644 venv/tcl/tcl8.6/encoding/macTurkish.enc create mode 100644 venv/tcl/tcl8.6/encoding/macUkraine.enc create mode 100644 venv/tcl/tcl8.6/encoding/shiftjis.enc create mode 100644 venv/tcl/tcl8.6/encoding/symbol.enc create mode 100644 venv/tcl/tcl8.6/encoding/tis-620.enc create mode 100644 venv/tcl/tcl8.6/history.tcl create mode 100644 venv/tcl/tcl8.6/http1.0/http.tcl create mode 100644 venv/tcl/tcl8.6/http1.0/pkgIndex.tcl create mode 100644 venv/tcl/tcl8.6/init.tcl create mode 100644 venv/tcl/tcl8.6/msgs/af.msg create mode 100644 venv/tcl/tcl8.6/msgs/af_za.msg create mode 100644 venv/tcl/tcl8.6/msgs/ar.msg create mode 100644 venv/tcl/tcl8.6/msgs/ar_in.msg create mode 100644 venv/tcl/tcl8.6/msgs/ar_jo.msg create mode 100644 venv/tcl/tcl8.6/msgs/ar_lb.msg create mode 100644 venv/tcl/tcl8.6/msgs/ar_sy.msg create mode 100644 venv/tcl/tcl8.6/msgs/be.msg create mode 100644 venv/tcl/tcl8.6/msgs/bg.msg create mode 100644 venv/tcl/tcl8.6/msgs/bn.msg create mode 100644 venv/tcl/tcl8.6/msgs/bn_in.msg create mode 100644 venv/tcl/tcl8.6/msgs/ca.msg create mode 100644 venv/tcl/tcl8.6/msgs/cs.msg create mode 100644 venv/tcl/tcl8.6/msgs/da.msg create mode 100644 venv/tcl/tcl8.6/msgs/de.msg create mode 100644 venv/tcl/tcl8.6/msgs/de_at.msg create mode 100644 venv/tcl/tcl8.6/msgs/de_be.msg create mode 100644 venv/tcl/tcl8.6/msgs/el.msg create mode 100644 venv/tcl/tcl8.6/msgs/en_au.msg create mode 100644 venv/tcl/tcl8.6/msgs/en_be.msg create mode 100644 venv/tcl/tcl8.6/msgs/en_bw.msg create mode 100644 venv/tcl/tcl8.6/msgs/en_ca.msg create mode 100644 venv/tcl/tcl8.6/msgs/en_gb.msg create mode 100644 venv/tcl/tcl8.6/msgs/en_hk.msg create mode 100644 venv/tcl/tcl8.6/msgs/en_ie.msg create mode 100644 venv/tcl/tcl8.6/msgs/en_in.msg create mode 100644 venv/tcl/tcl8.6/msgs/en_nz.msg create mode 100644 venv/tcl/tcl8.6/msgs/en_ph.msg create mode 100644 venv/tcl/tcl8.6/msgs/en_sg.msg create mode 100644 venv/tcl/tcl8.6/msgs/en_za.msg create mode 100644 venv/tcl/tcl8.6/msgs/en_zw.msg create mode 100644 venv/tcl/tcl8.6/msgs/eo.msg create mode 100644 venv/tcl/tcl8.6/msgs/es.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_ar.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_bo.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_cl.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_co.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_cr.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_do.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_ec.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_gt.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_hn.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_mx.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_ni.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_pa.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_pe.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_pr.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_py.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_sv.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_uy.msg create mode 100644 venv/tcl/tcl8.6/msgs/es_ve.msg create mode 100644 venv/tcl/tcl8.6/msgs/et.msg create mode 100644 venv/tcl/tcl8.6/msgs/eu.msg create mode 100644 venv/tcl/tcl8.6/msgs/eu_es.msg create mode 100644 venv/tcl/tcl8.6/msgs/fa.msg create mode 100644 venv/tcl/tcl8.6/msgs/fa_in.msg create mode 100644 venv/tcl/tcl8.6/msgs/fa_ir.msg create mode 100644 venv/tcl/tcl8.6/msgs/fi.msg create mode 100644 venv/tcl/tcl8.6/msgs/fo.msg create mode 100644 venv/tcl/tcl8.6/msgs/fo_fo.msg create mode 100644 venv/tcl/tcl8.6/msgs/fr.msg create mode 100644 venv/tcl/tcl8.6/msgs/fr_be.msg create mode 100644 venv/tcl/tcl8.6/msgs/fr_ca.msg create mode 100644 venv/tcl/tcl8.6/msgs/fr_ch.msg create mode 100644 venv/tcl/tcl8.6/msgs/ga.msg create mode 100644 venv/tcl/tcl8.6/msgs/ga_ie.msg create mode 100644 venv/tcl/tcl8.6/msgs/gl.msg create mode 100644 venv/tcl/tcl8.6/msgs/gl_es.msg create mode 100644 venv/tcl/tcl8.6/msgs/gv.msg create mode 100644 venv/tcl/tcl8.6/msgs/gv_gb.msg create mode 100644 venv/tcl/tcl8.6/msgs/he.msg create mode 100644 venv/tcl/tcl8.6/msgs/hi.msg create mode 100644 venv/tcl/tcl8.6/msgs/hi_in.msg create mode 100644 venv/tcl/tcl8.6/msgs/hr.msg create mode 100644 venv/tcl/tcl8.6/msgs/hu.msg create mode 100644 venv/tcl/tcl8.6/msgs/id.msg create mode 100644 venv/tcl/tcl8.6/msgs/id_id.msg create mode 100644 venv/tcl/tcl8.6/msgs/is.msg create mode 100644 venv/tcl/tcl8.6/msgs/it.msg create mode 100644 venv/tcl/tcl8.6/msgs/it_ch.msg create mode 100644 venv/tcl/tcl8.6/msgs/ja.msg create mode 100644 venv/tcl/tcl8.6/msgs/kl.msg create mode 100644 venv/tcl/tcl8.6/msgs/kl_gl.msg create mode 100644 venv/tcl/tcl8.6/msgs/ko.msg create mode 100644 venv/tcl/tcl8.6/msgs/ko_kr.msg create mode 100644 venv/tcl/tcl8.6/msgs/kok.msg create mode 100644 venv/tcl/tcl8.6/msgs/kok_in.msg create mode 100644 venv/tcl/tcl8.6/msgs/kw.msg create mode 100644 venv/tcl/tcl8.6/msgs/kw_gb.msg create mode 100644 venv/tcl/tcl8.6/msgs/lt.msg create mode 100644 venv/tcl/tcl8.6/msgs/lv.msg create mode 100644 venv/tcl/tcl8.6/msgs/mk.msg create mode 100644 venv/tcl/tcl8.6/msgs/mr.msg create mode 100644 venv/tcl/tcl8.6/msgs/mr_in.msg create mode 100644 venv/tcl/tcl8.6/msgs/ms.msg create mode 100644 venv/tcl/tcl8.6/msgs/ms_my.msg create mode 100644 venv/tcl/tcl8.6/msgs/mt.msg create mode 100644 venv/tcl/tcl8.6/msgs/nb.msg create mode 100644 venv/tcl/tcl8.6/msgs/nl.msg create mode 100644 venv/tcl/tcl8.6/msgs/nl_be.msg create mode 100644 venv/tcl/tcl8.6/msgs/nn.msg create mode 100644 venv/tcl/tcl8.6/msgs/pl.msg create mode 100644 venv/tcl/tcl8.6/msgs/pt.msg create mode 100644 venv/tcl/tcl8.6/msgs/pt_br.msg create mode 100644 venv/tcl/tcl8.6/msgs/ro.msg create mode 100644 venv/tcl/tcl8.6/msgs/ru.msg create mode 100644 venv/tcl/tcl8.6/msgs/ru_ua.msg create mode 100644 venv/tcl/tcl8.6/msgs/sh.msg create mode 100644 venv/tcl/tcl8.6/msgs/sk.msg create mode 100644 venv/tcl/tcl8.6/msgs/sl.msg create mode 100644 venv/tcl/tcl8.6/msgs/sq.msg create mode 100644 venv/tcl/tcl8.6/msgs/sr.msg create mode 100644 venv/tcl/tcl8.6/msgs/sv.msg create mode 100644 venv/tcl/tcl8.6/msgs/sw.msg create mode 100644 venv/tcl/tcl8.6/msgs/ta.msg create mode 100644 venv/tcl/tcl8.6/msgs/ta_in.msg create mode 100644 venv/tcl/tcl8.6/msgs/te.msg create mode 100644 venv/tcl/tcl8.6/msgs/te_in.msg create mode 100644 venv/tcl/tcl8.6/msgs/th.msg create mode 100644 venv/tcl/tcl8.6/msgs/tr.msg create mode 100644 venv/tcl/tcl8.6/msgs/uk.msg create mode 100644 venv/tcl/tcl8.6/msgs/vi.msg create mode 100644 venv/tcl/tcl8.6/msgs/zh.msg create mode 100644 venv/tcl/tcl8.6/msgs/zh_cn.msg create mode 100644 venv/tcl/tcl8.6/msgs/zh_hk.msg create mode 100644 venv/tcl/tcl8.6/msgs/zh_sg.msg create mode 100644 venv/tcl/tcl8.6/msgs/zh_tw.msg create mode 100644 venv/tcl/tcl8.6/opt0.4/optparse.tcl create mode 100644 venv/tcl/tcl8.6/opt0.4/pkgIndex.tcl create mode 100644 venv/tcl/tcl8.6/package.tcl create mode 100644 venv/tcl/tcl8.6/parray.tcl create mode 100644 venv/tcl/tcl8.6/safe.tcl create mode 100644 venv/tcl/tcl8.6/tclIndex create mode 100644 venv/tcl/tcl8.6/tm.tcl create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Abidjan create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Accra create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Addis_Ababa create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Algiers create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Asmara create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Asmera create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Bamako create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Bangui create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Banjul create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Bissau create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Blantyre create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Brazzaville create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Bujumbura create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Cairo create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Casablanca create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Ceuta create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Conakry create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Dakar create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Dar_es_Salaam create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Djibouti create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Douala create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/El_Aaiun create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Freetown create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Gaborone create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Harare create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Johannesburg create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Juba create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Kampala create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Khartoum create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Kigali create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Kinshasa create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Lagos create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Libreville create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Lome create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Luanda create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Lubumbashi create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Lusaka create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Malabo create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Maputo create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Maseru create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Mbabane create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Mogadishu create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Monrovia create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Nairobi create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Ndjamena create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Niamey create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Nouakchott create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Ouagadougou create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Porto-Novo create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Sao_Tome create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Timbuktu create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Tripoli create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Tunis create mode 100644 venv/tcl/tcl8.6/tzdata/Africa/Windhoek create mode 100644 venv/tcl/tcl8.6/tzdata/America/Adak create mode 100644 venv/tcl/tcl8.6/tzdata/America/Anchorage create mode 100644 venv/tcl/tcl8.6/tzdata/America/Anguilla create mode 100644 venv/tcl/tcl8.6/tzdata/America/Antigua create mode 100644 venv/tcl/tcl8.6/tzdata/America/Araguaina create mode 100644 venv/tcl/tcl8.6/tzdata/America/Argentina/Buenos_Aires create mode 100644 venv/tcl/tcl8.6/tzdata/America/Argentina/Catamarca create mode 100644 venv/tcl/tcl8.6/tzdata/America/Argentina/ComodRivadavia create mode 100644 venv/tcl/tcl8.6/tzdata/America/Argentina/Cordoba create mode 100644 venv/tcl/tcl8.6/tzdata/America/Argentina/Jujuy create mode 100644 venv/tcl/tcl8.6/tzdata/America/Argentina/La_Rioja create mode 100644 venv/tcl/tcl8.6/tzdata/America/Argentina/Mendoza create mode 100644 venv/tcl/tcl8.6/tzdata/America/Argentina/Rio_Gallegos create mode 100644 venv/tcl/tcl8.6/tzdata/America/Argentina/Salta create mode 100644 venv/tcl/tcl8.6/tzdata/America/Argentina/San_Juan create mode 100644 venv/tcl/tcl8.6/tzdata/America/Argentina/San_Luis create mode 100644 venv/tcl/tcl8.6/tzdata/America/Argentina/Tucuman create mode 100644 venv/tcl/tcl8.6/tzdata/America/Argentina/Ushuaia create mode 100644 venv/tcl/tcl8.6/tzdata/America/Aruba create mode 100644 venv/tcl/tcl8.6/tzdata/America/Asuncion create mode 100644 venv/tcl/tcl8.6/tzdata/America/Atikokan create mode 100644 venv/tcl/tcl8.6/tzdata/America/Atka create mode 100644 venv/tcl/tcl8.6/tzdata/America/Bahia create mode 100644 venv/tcl/tcl8.6/tzdata/America/Bahia_Banderas create mode 100644 venv/tcl/tcl8.6/tzdata/America/Barbados create mode 100644 venv/tcl/tcl8.6/tzdata/America/Belem create mode 100644 venv/tcl/tcl8.6/tzdata/America/Belize create mode 100644 venv/tcl/tcl8.6/tzdata/America/Blanc-Sablon create mode 100644 venv/tcl/tcl8.6/tzdata/America/Boa_Vista create mode 100644 venv/tcl/tcl8.6/tzdata/America/Bogota create mode 100644 venv/tcl/tcl8.6/tzdata/America/Boise create mode 100644 venv/tcl/tcl8.6/tzdata/America/Buenos_Aires create mode 100644 venv/tcl/tcl8.6/tzdata/America/Cambridge_Bay create mode 100644 venv/tcl/tcl8.6/tzdata/America/Campo_Grande create mode 100644 venv/tcl/tcl8.6/tzdata/America/Cancun create mode 100644 venv/tcl/tcl8.6/tzdata/America/Caracas create mode 100644 venv/tcl/tcl8.6/tzdata/America/Catamarca create mode 100644 venv/tcl/tcl8.6/tzdata/America/Cayenne create mode 100644 venv/tcl/tcl8.6/tzdata/America/Cayman create mode 100644 venv/tcl/tcl8.6/tzdata/America/Chicago create mode 100644 venv/tcl/tcl8.6/tzdata/America/Chihuahua create mode 100644 venv/tcl/tcl8.6/tzdata/America/Coral_Harbour create mode 100644 venv/tcl/tcl8.6/tzdata/America/Cordoba create mode 100644 venv/tcl/tcl8.6/tzdata/America/Costa_Rica create mode 100644 venv/tcl/tcl8.6/tzdata/America/Creston create mode 100644 venv/tcl/tcl8.6/tzdata/America/Cuiaba create mode 100644 venv/tcl/tcl8.6/tzdata/America/Curacao create mode 100644 venv/tcl/tcl8.6/tzdata/America/Danmarkshavn create mode 100644 venv/tcl/tcl8.6/tzdata/America/Dawson create mode 100644 venv/tcl/tcl8.6/tzdata/America/Dawson_Creek create mode 100644 venv/tcl/tcl8.6/tzdata/America/Denver create mode 100644 venv/tcl/tcl8.6/tzdata/America/Detroit create mode 100644 venv/tcl/tcl8.6/tzdata/America/Dominica create mode 100644 venv/tcl/tcl8.6/tzdata/America/Edmonton create mode 100644 venv/tcl/tcl8.6/tzdata/America/Eirunepe create mode 100644 venv/tcl/tcl8.6/tzdata/America/El_Salvador create mode 100644 venv/tcl/tcl8.6/tzdata/America/Ensenada create mode 100644 venv/tcl/tcl8.6/tzdata/America/Fort_Nelson create mode 100644 venv/tcl/tcl8.6/tzdata/America/Fort_Wayne create mode 100644 venv/tcl/tcl8.6/tzdata/America/Fortaleza create mode 100644 venv/tcl/tcl8.6/tzdata/America/Glace_Bay create mode 100644 venv/tcl/tcl8.6/tzdata/America/Godthab create mode 100644 venv/tcl/tcl8.6/tzdata/America/Goose_Bay create mode 100644 venv/tcl/tcl8.6/tzdata/America/Grand_Turk create mode 100644 venv/tcl/tcl8.6/tzdata/America/Grenada create mode 100644 venv/tcl/tcl8.6/tzdata/America/Guadeloupe create mode 100644 venv/tcl/tcl8.6/tzdata/America/Guatemala create mode 100644 venv/tcl/tcl8.6/tzdata/America/Guayaquil create mode 100644 venv/tcl/tcl8.6/tzdata/America/Guyana create mode 100644 venv/tcl/tcl8.6/tzdata/America/Halifax create mode 100644 venv/tcl/tcl8.6/tzdata/America/Havana create mode 100644 venv/tcl/tcl8.6/tzdata/America/Hermosillo create mode 100644 venv/tcl/tcl8.6/tzdata/America/Indiana/Indianapolis create mode 100644 venv/tcl/tcl8.6/tzdata/America/Indiana/Knox create mode 100644 venv/tcl/tcl8.6/tzdata/America/Indiana/Marengo create mode 100644 venv/tcl/tcl8.6/tzdata/America/Indiana/Petersburg create mode 100644 venv/tcl/tcl8.6/tzdata/America/Indiana/Tell_City create mode 100644 venv/tcl/tcl8.6/tzdata/America/Indiana/Vevay create mode 100644 venv/tcl/tcl8.6/tzdata/America/Indiana/Vincennes create mode 100644 venv/tcl/tcl8.6/tzdata/America/Indiana/Winamac create mode 100644 venv/tcl/tcl8.6/tzdata/America/Indianapolis create mode 100644 venv/tcl/tcl8.6/tzdata/America/Inuvik create mode 100644 venv/tcl/tcl8.6/tzdata/America/Iqaluit create mode 100644 venv/tcl/tcl8.6/tzdata/America/Jamaica create mode 100644 venv/tcl/tcl8.6/tzdata/America/Jujuy create mode 100644 venv/tcl/tcl8.6/tzdata/America/Juneau create mode 100644 venv/tcl/tcl8.6/tzdata/America/Kentucky/Louisville create mode 100644 venv/tcl/tcl8.6/tzdata/America/Kentucky/Monticello create mode 100644 venv/tcl/tcl8.6/tzdata/America/Knox_IN create mode 100644 venv/tcl/tcl8.6/tzdata/America/Kralendijk create mode 100644 venv/tcl/tcl8.6/tzdata/America/La_Paz create mode 100644 venv/tcl/tcl8.6/tzdata/America/Lima create mode 100644 venv/tcl/tcl8.6/tzdata/America/Los_Angeles create mode 100644 venv/tcl/tcl8.6/tzdata/America/Louisville create mode 100644 venv/tcl/tcl8.6/tzdata/America/Lower_Princes create mode 100644 venv/tcl/tcl8.6/tzdata/America/Maceio create mode 100644 venv/tcl/tcl8.6/tzdata/America/Managua create mode 100644 venv/tcl/tcl8.6/tzdata/America/Manaus create mode 100644 venv/tcl/tcl8.6/tzdata/America/Marigot create mode 100644 venv/tcl/tcl8.6/tzdata/America/Martinique create mode 100644 venv/tcl/tcl8.6/tzdata/America/Matamoros create mode 100644 venv/tcl/tcl8.6/tzdata/America/Mazatlan create mode 100644 venv/tcl/tcl8.6/tzdata/America/Mendoza create mode 100644 venv/tcl/tcl8.6/tzdata/America/Menominee create mode 100644 venv/tcl/tcl8.6/tzdata/America/Merida create mode 100644 venv/tcl/tcl8.6/tzdata/America/Metlakatla create mode 100644 venv/tcl/tcl8.6/tzdata/America/Mexico_City create mode 100644 venv/tcl/tcl8.6/tzdata/America/Miquelon create mode 100644 venv/tcl/tcl8.6/tzdata/America/Moncton create mode 100644 venv/tcl/tcl8.6/tzdata/America/Monterrey create mode 100644 venv/tcl/tcl8.6/tzdata/America/Montevideo create mode 100644 venv/tcl/tcl8.6/tzdata/America/Montreal create mode 100644 venv/tcl/tcl8.6/tzdata/America/Montserrat create mode 100644 venv/tcl/tcl8.6/tzdata/America/Nassau create mode 100644 venv/tcl/tcl8.6/tzdata/America/New_York create mode 100644 venv/tcl/tcl8.6/tzdata/America/Nipigon create mode 100644 venv/tcl/tcl8.6/tzdata/America/Nome create mode 100644 venv/tcl/tcl8.6/tzdata/America/Noronha create mode 100644 venv/tcl/tcl8.6/tzdata/America/North_Dakota/Beulah create mode 100644 venv/tcl/tcl8.6/tzdata/America/North_Dakota/Center create mode 100644 venv/tcl/tcl8.6/tzdata/America/North_Dakota/New_Salem create mode 100644 venv/tcl/tcl8.6/tzdata/America/Ojinaga create mode 100644 venv/tcl/tcl8.6/tzdata/America/Panama create mode 100644 venv/tcl/tcl8.6/tzdata/America/Pangnirtung create mode 100644 venv/tcl/tcl8.6/tzdata/America/Paramaribo create mode 100644 venv/tcl/tcl8.6/tzdata/America/Phoenix create mode 100644 venv/tcl/tcl8.6/tzdata/America/Port-au-Prince create mode 100644 venv/tcl/tcl8.6/tzdata/America/Port_of_Spain create mode 100644 venv/tcl/tcl8.6/tzdata/America/Porto_Acre create mode 100644 venv/tcl/tcl8.6/tzdata/America/Porto_Velho create mode 100644 venv/tcl/tcl8.6/tzdata/America/Puerto_Rico create mode 100644 venv/tcl/tcl8.6/tzdata/America/Punta_Arenas create mode 100644 venv/tcl/tcl8.6/tzdata/America/Rainy_River create mode 100644 venv/tcl/tcl8.6/tzdata/America/Rankin_Inlet create mode 100644 venv/tcl/tcl8.6/tzdata/America/Recife create mode 100644 venv/tcl/tcl8.6/tzdata/America/Regina create mode 100644 venv/tcl/tcl8.6/tzdata/America/Resolute create mode 100644 venv/tcl/tcl8.6/tzdata/America/Rio_Branco create mode 100644 venv/tcl/tcl8.6/tzdata/America/Rosario create mode 100644 venv/tcl/tcl8.6/tzdata/America/Santa_Isabel create mode 100644 venv/tcl/tcl8.6/tzdata/America/Santarem create mode 100644 venv/tcl/tcl8.6/tzdata/America/Santiago create mode 100644 venv/tcl/tcl8.6/tzdata/America/Santo_Domingo create mode 100644 venv/tcl/tcl8.6/tzdata/America/Sao_Paulo create mode 100644 venv/tcl/tcl8.6/tzdata/America/Scoresbysund create mode 100644 venv/tcl/tcl8.6/tzdata/America/Shiprock create mode 100644 venv/tcl/tcl8.6/tzdata/America/Sitka create mode 100644 venv/tcl/tcl8.6/tzdata/America/St_Barthelemy create mode 100644 venv/tcl/tcl8.6/tzdata/America/St_Johns create mode 100644 venv/tcl/tcl8.6/tzdata/America/St_Kitts create mode 100644 venv/tcl/tcl8.6/tzdata/America/St_Lucia create mode 100644 venv/tcl/tcl8.6/tzdata/America/St_Thomas create mode 100644 venv/tcl/tcl8.6/tzdata/America/St_Vincent create mode 100644 venv/tcl/tcl8.6/tzdata/America/Swift_Current create mode 100644 venv/tcl/tcl8.6/tzdata/America/Tegucigalpa create mode 100644 venv/tcl/tcl8.6/tzdata/America/Thule create mode 100644 venv/tcl/tcl8.6/tzdata/America/Thunder_Bay create mode 100644 venv/tcl/tcl8.6/tzdata/America/Tijuana create mode 100644 venv/tcl/tcl8.6/tzdata/America/Toronto create mode 100644 venv/tcl/tcl8.6/tzdata/America/Tortola create mode 100644 venv/tcl/tcl8.6/tzdata/America/Vancouver create mode 100644 venv/tcl/tcl8.6/tzdata/America/Virgin create mode 100644 venv/tcl/tcl8.6/tzdata/America/Whitehorse create mode 100644 venv/tcl/tcl8.6/tzdata/America/Winnipeg create mode 100644 venv/tcl/tcl8.6/tzdata/America/Yakutat create mode 100644 venv/tcl/tcl8.6/tzdata/America/Yellowknife create mode 100644 venv/tcl/tcl8.6/tzdata/Antarctica/Casey create mode 100644 venv/tcl/tcl8.6/tzdata/Antarctica/Davis create mode 100644 venv/tcl/tcl8.6/tzdata/Antarctica/DumontDUrville create mode 100644 venv/tcl/tcl8.6/tzdata/Antarctica/Macquarie create mode 100644 venv/tcl/tcl8.6/tzdata/Antarctica/Mawson create mode 100644 venv/tcl/tcl8.6/tzdata/Antarctica/McMurdo create mode 100644 venv/tcl/tcl8.6/tzdata/Antarctica/Palmer create mode 100644 venv/tcl/tcl8.6/tzdata/Antarctica/Rothera create mode 100644 venv/tcl/tcl8.6/tzdata/Antarctica/South_Pole create mode 100644 venv/tcl/tcl8.6/tzdata/Antarctica/Syowa create mode 100644 venv/tcl/tcl8.6/tzdata/Antarctica/Troll create mode 100644 venv/tcl/tcl8.6/tzdata/Antarctica/Vostok create mode 100644 venv/tcl/tcl8.6/tzdata/Arctic/Longyearbyen create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Aden create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Almaty create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Amman create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Anadyr create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Aqtau create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Aqtobe create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Ashgabat create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Ashkhabad create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Atyrau create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Baghdad create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Bahrain create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Baku create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Bangkok create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Barnaul create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Beirut create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Bishkek create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Brunei create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Calcutta create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Chita create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Choibalsan create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Chongqing create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Chungking create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Colombo create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Dacca create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Damascus create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Dhaka create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Dili create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Dubai create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Dushanbe create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Famagusta create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Gaza create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Harbin create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Hebron create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Ho_Chi_Minh create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Hong_Kong create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Hovd create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Irkutsk create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Istanbul create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Jakarta create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Jayapura create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Jerusalem create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Kabul create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Kamchatka create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Karachi create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Kashgar create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Kathmandu create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Katmandu create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Khandyga create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Kolkata create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Krasnoyarsk create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Kuala_Lumpur create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Kuching create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Kuwait create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Macao create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Macau create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Magadan create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Makassar create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Manila create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Muscat create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Nicosia create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Novokuznetsk create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Novosibirsk create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Omsk create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Oral create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Phnom_Penh create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Pontianak create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Pyongyang create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Qatar create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Qyzylorda create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Rangoon create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Riyadh create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Saigon create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Sakhalin create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Samarkand create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Seoul create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Shanghai create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Singapore create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Srednekolymsk create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Taipei create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Tashkent create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Tbilisi create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Tehran create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Tel_Aviv create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Thimbu create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Thimphu create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Tokyo create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Tomsk create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Ujung_Pandang create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Ulaanbaatar create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Ulan_Bator create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Urumqi create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Ust-Nera create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Vientiane create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Vladivostok create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Yakutsk create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Yangon create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Yekaterinburg create mode 100644 venv/tcl/tcl8.6/tzdata/Asia/Yerevan create mode 100644 venv/tcl/tcl8.6/tzdata/Atlantic/Azores create mode 100644 venv/tcl/tcl8.6/tzdata/Atlantic/Bermuda create mode 100644 venv/tcl/tcl8.6/tzdata/Atlantic/Canary create mode 100644 venv/tcl/tcl8.6/tzdata/Atlantic/Cape_Verde create mode 100644 venv/tcl/tcl8.6/tzdata/Atlantic/Faeroe create mode 100644 venv/tcl/tcl8.6/tzdata/Atlantic/Faroe create mode 100644 venv/tcl/tcl8.6/tzdata/Atlantic/Jan_Mayen create mode 100644 venv/tcl/tcl8.6/tzdata/Atlantic/Madeira create mode 100644 venv/tcl/tcl8.6/tzdata/Atlantic/Reykjavik create mode 100644 venv/tcl/tcl8.6/tzdata/Atlantic/South_Georgia create mode 100644 venv/tcl/tcl8.6/tzdata/Atlantic/St_Helena create mode 100644 venv/tcl/tcl8.6/tzdata/Atlantic/Stanley create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/ACT create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Adelaide create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Brisbane create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Broken_Hill create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Canberra create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Currie create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Darwin create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Eucla create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Hobart create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/LHI create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Lindeman create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Lord_Howe create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Melbourne create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/NSW create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/North create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Perth create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Queensland create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/South create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Sydney create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Tasmania create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Victoria create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/West create mode 100644 venv/tcl/tcl8.6/tzdata/Australia/Yancowinna create mode 100644 venv/tcl/tcl8.6/tzdata/Brazil/Acre create mode 100644 venv/tcl/tcl8.6/tzdata/Brazil/DeNoronha create mode 100644 venv/tcl/tcl8.6/tzdata/Brazil/East create mode 100644 venv/tcl/tcl8.6/tzdata/Brazil/West create mode 100644 venv/tcl/tcl8.6/tzdata/CET create mode 100644 venv/tcl/tcl8.6/tzdata/CST6CDT create mode 100644 venv/tcl/tcl8.6/tzdata/Canada/Atlantic create mode 100644 venv/tcl/tcl8.6/tzdata/Canada/Central create mode 100644 venv/tcl/tcl8.6/tzdata/Canada/East-Saskatchewan create mode 100644 venv/tcl/tcl8.6/tzdata/Canada/Eastern create mode 100644 venv/tcl/tcl8.6/tzdata/Canada/Mountain create mode 100644 venv/tcl/tcl8.6/tzdata/Canada/Newfoundland create mode 100644 venv/tcl/tcl8.6/tzdata/Canada/Pacific create mode 100644 venv/tcl/tcl8.6/tzdata/Canada/Saskatchewan create mode 100644 venv/tcl/tcl8.6/tzdata/Canada/Yukon create mode 100644 venv/tcl/tcl8.6/tzdata/Chile/Continental create mode 100644 venv/tcl/tcl8.6/tzdata/Chile/EasterIsland create mode 100644 venv/tcl/tcl8.6/tzdata/Cuba create mode 100644 venv/tcl/tcl8.6/tzdata/EET create mode 100644 venv/tcl/tcl8.6/tzdata/EST create mode 100644 venv/tcl/tcl8.6/tzdata/EST5EDT create mode 100644 venv/tcl/tcl8.6/tzdata/Egypt create mode 100644 venv/tcl/tcl8.6/tzdata/Eire create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT+0 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT+1 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT+10 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT+11 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT+12 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT+2 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT+3 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT+4 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT+5 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT+6 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT+7 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT+8 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT+9 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-0 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-1 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-10 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-11 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-12 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-13 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-14 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-2 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-3 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-4 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-5 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-6 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-7 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-8 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT-9 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/GMT0 create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/Greenwich create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/UCT create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/UTC create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/Universal create mode 100644 venv/tcl/tcl8.6/tzdata/Etc/Zulu create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Amsterdam create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Andorra create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Astrakhan create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Athens create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Belfast create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Belgrade create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Berlin create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Bratislava create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Brussels create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Bucharest create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Budapest create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Busingen create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Chisinau create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Copenhagen create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Dublin create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Gibraltar create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Guernsey create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Helsinki create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Isle_of_Man create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Istanbul create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Jersey create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Kaliningrad create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Kiev create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Kirov create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Lisbon create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Ljubljana create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/London create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Luxembourg create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Madrid create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Malta create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Mariehamn create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Minsk create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Monaco create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Moscow create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Nicosia create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Oslo create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Paris create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Podgorica create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Prague create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Riga create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Rome create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Samara create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/San_Marino create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Sarajevo create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Saratov create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Simferopol create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Skopje create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Sofia create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Stockholm create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Tallinn create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Tirane create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Tiraspol create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Ulyanovsk create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Uzhgorod create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Vaduz create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Vatican create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Vienna create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Vilnius create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Volgograd create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Warsaw create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Zagreb create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Zaporozhye create mode 100644 venv/tcl/tcl8.6/tzdata/Europe/Zurich create mode 100644 venv/tcl/tcl8.6/tzdata/GB create mode 100644 venv/tcl/tcl8.6/tzdata/GB-Eire create mode 100644 venv/tcl/tcl8.6/tzdata/GMT create mode 100644 venv/tcl/tcl8.6/tzdata/GMT+0 create mode 100644 venv/tcl/tcl8.6/tzdata/GMT-0 create mode 100644 venv/tcl/tcl8.6/tzdata/GMT0 create mode 100644 venv/tcl/tcl8.6/tzdata/Greenwich create mode 100644 venv/tcl/tcl8.6/tzdata/HST create mode 100644 venv/tcl/tcl8.6/tzdata/Hongkong create mode 100644 venv/tcl/tcl8.6/tzdata/Iceland create mode 100644 venv/tcl/tcl8.6/tzdata/Indian/Antananarivo create mode 100644 venv/tcl/tcl8.6/tzdata/Indian/Chagos create mode 100644 venv/tcl/tcl8.6/tzdata/Indian/Christmas create mode 100644 venv/tcl/tcl8.6/tzdata/Indian/Cocos create mode 100644 venv/tcl/tcl8.6/tzdata/Indian/Comoro create mode 100644 venv/tcl/tcl8.6/tzdata/Indian/Kerguelen create mode 100644 venv/tcl/tcl8.6/tzdata/Indian/Mahe create mode 100644 venv/tcl/tcl8.6/tzdata/Indian/Maldives create mode 100644 venv/tcl/tcl8.6/tzdata/Indian/Mauritius create mode 100644 venv/tcl/tcl8.6/tzdata/Indian/Mayotte create mode 100644 venv/tcl/tcl8.6/tzdata/Indian/Reunion create mode 100644 venv/tcl/tcl8.6/tzdata/Iran create mode 100644 venv/tcl/tcl8.6/tzdata/Israel create mode 100644 venv/tcl/tcl8.6/tzdata/Jamaica create mode 100644 venv/tcl/tcl8.6/tzdata/Japan create mode 100644 venv/tcl/tcl8.6/tzdata/Kwajalein create mode 100644 venv/tcl/tcl8.6/tzdata/Libya create mode 100644 venv/tcl/tcl8.6/tzdata/MET create mode 100644 venv/tcl/tcl8.6/tzdata/MST create mode 100644 venv/tcl/tcl8.6/tzdata/MST7MDT create mode 100644 venv/tcl/tcl8.6/tzdata/Mexico/BajaNorte create mode 100644 venv/tcl/tcl8.6/tzdata/Mexico/BajaSur create mode 100644 venv/tcl/tcl8.6/tzdata/Mexico/General create mode 100644 venv/tcl/tcl8.6/tzdata/NZ create mode 100644 venv/tcl/tcl8.6/tzdata/NZ-CHAT create mode 100644 venv/tcl/tcl8.6/tzdata/Navajo create mode 100644 venv/tcl/tcl8.6/tzdata/PRC create mode 100644 venv/tcl/tcl8.6/tzdata/PST8PDT create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Apia create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Auckland create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Bougainville create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Chatham create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Chuuk create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Easter create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Efate create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Enderbury create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Fakaofo create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Fiji create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Funafuti create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Galapagos create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Gambier create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Guadalcanal create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Guam create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Honolulu create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Johnston create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Kiritimati create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Kosrae create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Kwajalein create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Majuro create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Marquesas create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Midway create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Nauru create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Niue create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Norfolk create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Noumea create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Pago_Pago create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Palau create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Pitcairn create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Pohnpei create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Ponape create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Port_Moresby create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Rarotonga create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Saipan create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Samoa create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Tahiti create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Tarawa create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Tongatapu create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Truk create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Wake create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Wallis create mode 100644 venv/tcl/tcl8.6/tzdata/Pacific/Yap create mode 100644 venv/tcl/tcl8.6/tzdata/Poland create mode 100644 venv/tcl/tcl8.6/tzdata/Portugal create mode 100644 venv/tcl/tcl8.6/tzdata/ROC create mode 100644 venv/tcl/tcl8.6/tzdata/ROK create mode 100644 venv/tcl/tcl8.6/tzdata/Singapore create mode 100644 venv/tcl/tcl8.6/tzdata/SystemV/AST4 create mode 100644 venv/tcl/tcl8.6/tzdata/SystemV/AST4ADT create mode 100644 venv/tcl/tcl8.6/tzdata/SystemV/CST6 create mode 100644 venv/tcl/tcl8.6/tzdata/SystemV/CST6CDT create mode 100644 venv/tcl/tcl8.6/tzdata/SystemV/EST5 create mode 100644 venv/tcl/tcl8.6/tzdata/SystemV/EST5EDT create mode 100644 venv/tcl/tcl8.6/tzdata/SystemV/HST10 create mode 100644 venv/tcl/tcl8.6/tzdata/SystemV/MST7 create mode 100644 venv/tcl/tcl8.6/tzdata/SystemV/MST7MDT create mode 100644 venv/tcl/tcl8.6/tzdata/SystemV/PST8 create mode 100644 venv/tcl/tcl8.6/tzdata/SystemV/PST8PDT create mode 100644 venv/tcl/tcl8.6/tzdata/SystemV/YST9 create mode 100644 venv/tcl/tcl8.6/tzdata/SystemV/YST9YDT create mode 100644 venv/tcl/tcl8.6/tzdata/Turkey create mode 100644 venv/tcl/tcl8.6/tzdata/UCT create mode 100644 venv/tcl/tcl8.6/tzdata/US/Alaska create mode 100644 venv/tcl/tcl8.6/tzdata/US/Aleutian create mode 100644 venv/tcl/tcl8.6/tzdata/US/Arizona create mode 100644 venv/tcl/tcl8.6/tzdata/US/Central create mode 100644 venv/tcl/tcl8.6/tzdata/US/East-Indiana create mode 100644 venv/tcl/tcl8.6/tzdata/US/Eastern create mode 100644 venv/tcl/tcl8.6/tzdata/US/Hawaii create mode 100644 venv/tcl/tcl8.6/tzdata/US/Indiana-Starke create mode 100644 venv/tcl/tcl8.6/tzdata/US/Michigan create mode 100644 venv/tcl/tcl8.6/tzdata/US/Mountain create mode 100644 venv/tcl/tcl8.6/tzdata/US/Pacific create mode 100644 venv/tcl/tcl8.6/tzdata/US/Pacific-New create mode 100644 venv/tcl/tcl8.6/tzdata/US/Samoa create mode 100644 venv/tcl/tcl8.6/tzdata/UTC create mode 100644 venv/tcl/tcl8.6/tzdata/Universal create mode 100644 venv/tcl/tcl8.6/tzdata/W-SU create mode 100644 venv/tcl/tcl8.6/tzdata/WET create mode 100644 venv/tcl/tcl8.6/tzdata/Zulu create mode 100644 venv/tcl/tcl8.6/word.tcl create mode 100644 venv/tcl/tk8.6/bgerror.tcl create mode 100644 venv/tcl/tk8.6/button.tcl create mode 100644 venv/tcl/tk8.6/choosedir.tcl create mode 100644 venv/tcl/tk8.6/clrpick.tcl create mode 100644 venv/tcl/tk8.6/comdlg.tcl create mode 100644 venv/tcl/tk8.6/console.tcl create mode 100644 venv/tcl/tk8.6/demos/README create mode 100644 venv/tcl/tk8.6/demos/anilabel.tcl create mode 100644 venv/tcl/tk8.6/demos/aniwave.tcl create mode 100644 venv/tcl/tk8.6/demos/arrow.tcl create mode 100644 venv/tcl/tk8.6/demos/bind.tcl create mode 100644 venv/tcl/tk8.6/demos/bitmap.tcl create mode 100644 venv/tcl/tk8.6/demos/browse create mode 100644 venv/tcl/tk8.6/demos/button.tcl create mode 100644 venv/tcl/tk8.6/demos/check.tcl create mode 100644 venv/tcl/tk8.6/demos/clrpick.tcl create mode 100644 venv/tcl/tk8.6/demos/colors.tcl create mode 100644 venv/tcl/tk8.6/demos/combo.tcl create mode 100644 venv/tcl/tk8.6/demos/cscroll.tcl create mode 100644 venv/tcl/tk8.6/demos/ctext.tcl create mode 100644 venv/tcl/tk8.6/demos/dialog1.tcl create mode 100644 venv/tcl/tk8.6/demos/dialog2.tcl create mode 100644 venv/tcl/tk8.6/demos/en.msg create mode 100644 venv/tcl/tk8.6/demos/entry1.tcl create mode 100644 venv/tcl/tk8.6/demos/entry2.tcl create mode 100644 venv/tcl/tk8.6/demos/entry3.tcl create mode 100644 venv/tcl/tk8.6/demos/filebox.tcl create mode 100644 venv/tcl/tk8.6/demos/floor.tcl create mode 100644 venv/tcl/tk8.6/demos/fontchoose.tcl create mode 100644 venv/tcl/tk8.6/demos/form.tcl create mode 100644 venv/tcl/tk8.6/demos/goldberg.tcl create mode 100644 venv/tcl/tk8.6/demos/hello create mode 100644 venv/tcl/tk8.6/demos/hscale.tcl create mode 100644 venv/tcl/tk8.6/demos/icon.tcl create mode 100644 venv/tcl/tk8.6/demos/image1.tcl create mode 100644 venv/tcl/tk8.6/demos/image2.tcl create mode 100644 venv/tcl/tk8.6/demos/images/earth.gif create mode 100644 venv/tcl/tk8.6/demos/images/earthmenu.png create mode 100644 venv/tcl/tk8.6/demos/images/earthris.gif create mode 100644 venv/tcl/tk8.6/demos/images/flagdown.xbm create mode 100644 venv/tcl/tk8.6/demos/images/flagup.xbm create mode 100644 venv/tcl/tk8.6/demos/images/gray25.xbm create mode 100644 venv/tcl/tk8.6/demos/images/letters.xbm create mode 100644 venv/tcl/tk8.6/demos/images/noletter.xbm create mode 100644 venv/tcl/tk8.6/demos/images/ouster.png create mode 100644 venv/tcl/tk8.6/demos/images/pattern.xbm create mode 100644 venv/tcl/tk8.6/demos/images/tcllogo.gif create mode 100644 venv/tcl/tk8.6/demos/images/teapot.ppm create mode 100644 venv/tcl/tk8.6/demos/items.tcl create mode 100644 venv/tcl/tk8.6/demos/ixset create mode 100644 venv/tcl/tk8.6/demos/knightstour.tcl create mode 100644 venv/tcl/tk8.6/demos/label.tcl create mode 100644 venv/tcl/tk8.6/demos/labelframe.tcl create mode 100644 venv/tcl/tk8.6/demos/license.terms create mode 100644 venv/tcl/tk8.6/demos/mclist.tcl create mode 100644 venv/tcl/tk8.6/demos/menu.tcl create mode 100644 venv/tcl/tk8.6/demos/menubu.tcl create mode 100644 venv/tcl/tk8.6/demos/msgbox.tcl create mode 100644 venv/tcl/tk8.6/demos/nl.msg create mode 100644 venv/tcl/tk8.6/demos/paned1.tcl create mode 100644 venv/tcl/tk8.6/demos/paned2.tcl create mode 100644 venv/tcl/tk8.6/demos/pendulum.tcl create mode 100644 venv/tcl/tk8.6/demos/plot.tcl create mode 100644 venv/tcl/tk8.6/demos/puzzle.tcl create mode 100644 venv/tcl/tk8.6/demos/radio.tcl create mode 100644 venv/tcl/tk8.6/demos/rmt create mode 100644 venv/tcl/tk8.6/demos/rolodex create mode 100644 venv/tcl/tk8.6/demos/ruler.tcl create mode 100644 venv/tcl/tk8.6/demos/sayings.tcl create mode 100644 venv/tcl/tk8.6/demos/search.tcl create mode 100644 venv/tcl/tk8.6/demos/spin.tcl create mode 100644 venv/tcl/tk8.6/demos/square create mode 100644 venv/tcl/tk8.6/demos/states.tcl create mode 100644 venv/tcl/tk8.6/demos/style.tcl create mode 100644 venv/tcl/tk8.6/demos/tclIndex create mode 100644 venv/tcl/tk8.6/demos/tcolor create mode 100644 venv/tcl/tk8.6/demos/text.tcl create mode 100644 venv/tcl/tk8.6/demos/textpeer.tcl create mode 100644 venv/tcl/tk8.6/demos/timer create mode 100644 venv/tcl/tk8.6/demos/toolbar.tcl create mode 100644 venv/tcl/tk8.6/demos/tree.tcl create mode 100644 venv/tcl/tk8.6/demos/ttkbut.tcl create mode 100644 venv/tcl/tk8.6/demos/ttkmenu.tcl create mode 100644 venv/tcl/tk8.6/demos/ttknote.tcl create mode 100644 venv/tcl/tk8.6/demos/ttkpane.tcl create mode 100644 venv/tcl/tk8.6/demos/ttkprogress.tcl create mode 100644 venv/tcl/tk8.6/demos/ttkscale.tcl create mode 100644 venv/tcl/tk8.6/demos/twind.tcl create mode 100644 venv/tcl/tk8.6/demos/unicodeout.tcl create mode 100644 venv/tcl/tk8.6/demos/vscale.tcl create mode 100644 venv/tcl/tk8.6/demos/widget create mode 100644 venv/tcl/tk8.6/dialog.tcl create mode 100644 venv/tcl/tk8.6/entry.tcl create mode 100644 venv/tcl/tk8.6/focus.tcl create mode 100644 venv/tcl/tk8.6/fontchooser.tcl create mode 100644 venv/tcl/tk8.6/iconlist.tcl create mode 100644 venv/tcl/tk8.6/icons.tcl create mode 100644 venv/tcl/tk8.6/images/README create mode 100644 venv/tcl/tk8.6/images/logo.eps create mode 100644 venv/tcl/tk8.6/images/logo100.gif create mode 100644 venv/tcl/tk8.6/images/logo64.gif create mode 100644 venv/tcl/tk8.6/images/logoLarge.gif create mode 100644 venv/tcl/tk8.6/images/logoMed.gif create mode 100644 venv/tcl/tk8.6/images/pwrdLogo.eps create mode 100644 venv/tcl/tk8.6/images/pwrdLogo100.gif create mode 100644 venv/tcl/tk8.6/images/pwrdLogo150.gif create mode 100644 venv/tcl/tk8.6/images/pwrdLogo175.gif create mode 100644 venv/tcl/tk8.6/images/pwrdLogo200.gif create mode 100644 venv/tcl/tk8.6/images/pwrdLogo75.gif create mode 100644 venv/tcl/tk8.6/images/tai-ku.gif create mode 100644 venv/tcl/tk8.6/license.terms create mode 100644 venv/tcl/tk8.6/listbox.tcl create mode 100644 venv/tcl/tk8.6/megawidget.tcl create mode 100644 venv/tcl/tk8.6/menu.tcl create mode 100644 venv/tcl/tk8.6/mkpsenc.tcl create mode 100644 venv/tcl/tk8.6/msgbox.tcl create mode 100644 venv/tcl/tk8.6/msgs/cs.msg create mode 100644 venv/tcl/tk8.6/msgs/da.msg create mode 100644 venv/tcl/tk8.6/msgs/de.msg create mode 100644 venv/tcl/tk8.6/msgs/el.msg create mode 100644 venv/tcl/tk8.6/msgs/en.msg create mode 100644 venv/tcl/tk8.6/msgs/en_gb.msg create mode 100644 venv/tcl/tk8.6/msgs/eo.msg create mode 100644 venv/tcl/tk8.6/msgs/es.msg create mode 100644 venv/tcl/tk8.6/msgs/fr.msg create mode 100644 venv/tcl/tk8.6/msgs/hu.msg create mode 100644 venv/tcl/tk8.6/msgs/it.msg create mode 100644 venv/tcl/tk8.6/msgs/nl.msg create mode 100644 venv/tcl/tk8.6/msgs/pl.msg create mode 100644 venv/tcl/tk8.6/msgs/pt.msg create mode 100644 venv/tcl/tk8.6/msgs/ru.msg create mode 100644 venv/tcl/tk8.6/msgs/sv.msg create mode 100644 venv/tcl/tk8.6/obsolete.tcl create mode 100644 venv/tcl/tk8.6/optMenu.tcl create mode 100644 venv/tcl/tk8.6/palette.tcl create mode 100644 venv/tcl/tk8.6/panedwindow.tcl create mode 100644 venv/tcl/tk8.6/pkgIndex.tcl create mode 100644 venv/tcl/tk8.6/safetk.tcl create mode 100644 venv/tcl/tk8.6/scale.tcl create mode 100644 venv/tcl/tk8.6/scrlbar.tcl create mode 100644 venv/tcl/tk8.6/spinbox.tcl create mode 100644 venv/tcl/tk8.6/tclIndex create mode 100644 venv/tcl/tk8.6/tearoff.tcl create mode 100644 venv/tcl/tk8.6/text.tcl create mode 100644 venv/tcl/tk8.6/tk.tcl create mode 100644 venv/tcl/tk8.6/tkfbox.tcl create mode 100644 venv/tcl/tk8.6/ttk/altTheme.tcl create mode 100644 venv/tcl/tk8.6/ttk/aquaTheme.tcl create mode 100644 venv/tcl/tk8.6/ttk/button.tcl create mode 100644 venv/tcl/tk8.6/ttk/clamTheme.tcl create mode 100644 venv/tcl/tk8.6/ttk/classicTheme.tcl create mode 100644 venv/tcl/tk8.6/ttk/combobox.tcl create mode 100644 venv/tcl/tk8.6/ttk/cursors.tcl create mode 100644 venv/tcl/tk8.6/ttk/defaults.tcl create mode 100644 venv/tcl/tk8.6/ttk/entry.tcl create mode 100644 venv/tcl/tk8.6/ttk/fonts.tcl create mode 100644 venv/tcl/tk8.6/ttk/menubutton.tcl create mode 100644 venv/tcl/tk8.6/ttk/notebook.tcl create mode 100644 venv/tcl/tk8.6/ttk/panedwindow.tcl create mode 100644 venv/tcl/tk8.6/ttk/progress.tcl create mode 100644 venv/tcl/tk8.6/ttk/scale.tcl create mode 100644 venv/tcl/tk8.6/ttk/scrollbar.tcl create mode 100644 venv/tcl/tk8.6/ttk/sizegrip.tcl create mode 100644 venv/tcl/tk8.6/ttk/spinbox.tcl create mode 100644 venv/tcl/tk8.6/ttk/treeview.tcl create mode 100644 venv/tcl/tk8.6/ttk/ttk.tcl create mode 100644 venv/tcl/tk8.6/ttk/utils.tcl create mode 100644 venv/tcl/tk8.6/ttk/vistaTheme.tcl create mode 100644 venv/tcl/tk8.6/ttk/winTheme.tcl create mode 100644 venv/tcl/tk8.6/ttk/xpTheme.tcl create mode 100644 venv/tcl/tk8.6/unsupported.tcl create mode 100644 venv/tcl/tk8.6/xmfbox.tcl diff --git a/.env b/.env new file mode 100644 index 00000000..59c1f89e --- /dev/null +++ b/.env @@ -0,0 +1,6 @@ +source venv/scripts/activate +export FLASK_APP="run.py" +export FLASK_ENV="development" +export APP_SETTINGS="development" + + diff --git a/.gitgnore b/.gitgnore new file mode 100644 index 00000000..5ceb3864 --- /dev/null +++ b/.gitgnore @@ -0,0 +1 @@ +venv diff --git a/__init__.py b/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/__pycache__/__init__.cpython-37.pyc b/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49039fbfb4703522ae7316dd3a636d4e1cebb003 GIT binary patch literal 124 zcmZ?b<>g`kf}=Xeqe1jz5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o2DN#VW?p#n~t( xIK)55RoBPO2S9dod6*007O#7)k&D literal 0 HcmV?d00001 diff --git a/__pycache__/run.cpython-37.pyc b/__pycache__/run.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..719469f9de276fb7691af16c23098721206788c3 GIT binary patch literal 319 zcmXwz&q~8U5XSdU+JvTk01v|6B!_ws4sgzVG?lWf>*3-#)Y=+QUP zSJE3ae~ zPdFv2mw3Rzd!-43p6Wj{a}4aQ|4wkm79{dt4(zIE#j+?tpxYG)sIA$GMi;deRtvp0 zB5Rr*o*}axzCj}D2DyREg2aIf6>Ol?O@)gtkh02(TFS_GzLZMmQaYwv#}PFgx05i} z^|E-9byh*gca9J@>-vM35RpIm5tGw2o?IQJi-)`UbbK4n;_K;r9N*uhh#odu7o1gE VtxGuXzG{ak9t-G@c{K0>`U_x?Q;`4w literal 0 HcmV?d00001 diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 00000000..67a37cad --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,17 @@ +from flask import Flask, Blueprint +from flask_restful import Api, Resource +from instance.config import app_config + + + +def create_app(config_name): + app = Flask(__name__, instance_relative_config=True) + '''loads the right configurations from config.py given a config name''' + + app.config.from_object(app_config[config_name]) + + from .api.v1 import api_v1 as v1 + app.register_blueprint(v1) + + return app + \ No newline at end of file diff --git a/app/__pycache__/__init__.cpython-37.pyc b/app/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd560cdb0feafcf8d17d15bd1cdaabc398f4159f GIT binary patch literal 586 zcmYjOy^a$x5cbdhT`qx$3LasLixdik5JK$zfG7wkca@1`?d>{|kM-`#b|QiHI$GZ0 zC~0^PUcoKZy#f_uheM1sBhPro^L?L>CzBBZ`@H%2;RiN?xf6f)-THk1At`&wck?{cUI3SI z-j+&m?vgz&cDUA^;@#zysH{$)hxw7&Zmu(*JkVkzjTM?-{$onn;eI&0jf>#kp*y<$TtEa-&L%(h3gs6h=+> zK0KyVGR7mK??G*mAFz1s#SRR#*N;s?0XQ4G-Zt9nsbha}|4xtD9${b<-U-ly^+eWg`k0?xJ*(YA~X439w^7y$Aa9Dul(1xTbY1T$zd`mJOr0tq9CU%D<di_ literal 0 HcmV?d00001 diff --git a/app/api/v1/__init__.py b/app/api/v1/__init__.py new file mode 100644 index 00000000..f978a8fc --- /dev/null +++ b/app/api/v1/__init__.py @@ -0,0 +1,14 @@ +from flask import Blueprint +from flask_restful import Api, Resource +from .views import All_Products_Endpoint, One_Product_Endpoint, All_Sales_Endpoint,One_Sale_Endpoint + + +api_v1 = Blueprint('api_v1',__name__,url_prefix='/api/v1') +api = Api(api_v1) + +api.add_resource(All_Products_Endpoint,'/products') +api.add_resource(One_Product_Endpoint,'/products/') +api.add_resource(All_Sales_Endpoint,'/sales') +api.add_resource(One_Sale_Endpoint,'/sales/') + + diff --git a/app/api/v1/__pycache__/__init__.cpython-37.pyc b/app/api/v1/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c563153144bf5c7d3465b04e8781e00e5e72a14 GIT binary patch literal 594 zcmYjO%Wl*#6t&|#XOgN^MMC^R79|YJs;Wro2z5bQ&9F)%SyAngBJ51$Oa{n;4H7&4 z0hatpzrkA;s0)6875DZrtt}rPpL^tceSMT9BLd^kx2uc4l#t(exE~&n*RZ-T0D=gr zh^7Ul$Q|WqRxs@rE}WTgm8bo}*Fh2Jun2WjM3hJ>JUJ4+2)?soESVgCr9~{`ABpru z_|pLg@<2oz9*WV1M`Daz#B-7+*H8mVsf~_QFI!VLtJJY9Z)+RQWVh_irM!j*kkqwL zbEWvXS&II0)$wT~+9lZS?pY)6QRMmYj4m`vrH=G;U ztrop93^e0nz+2byV`qF60)!AD!cfS0Q)$V$!Edz;inVbi1m1GfqhG}Apc~=e%j5kr zKYsJ7oWDPtP50jAr}^9IY%f1QDXX@HRhR2Y$$8z>E6!iEpKW-cp{+_DVynAtfS7L6 MXKagxPE2wB2h;Ya4*&oF literal 0 HcmV?d00001 diff --git a/app/api/v1/__pycache__/models.cpython-37.pyc b/app/api/v1/__pycache__/models.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcc69b89ed0e8bd80bde316216fdb8f42bfc14df GIT binary patch literal 1856 zcmb7E&2Ah;5bpWi$!47xn;47(8X$lMDV9K-kcDi#QN)2IiX%k|i(12U+Zi<8S-N{k zcD0y8gPp`Fdlc&oKUa|IhD#j~M%#7VQWz zIRxo1z)JRv$OHMH;2{%Cc&|V*{4IDEVeN|m>%gsJ5uUItDsXc>e9R6(`W~2sEdg7? z6aFjM6M+aJLlKD>G7>%9Pi*o?)nZl{U3j=egCx;0NK=T0LDL&$o*m>>#oG&5hgw#r ze=tQ_|LhOH93KsjKOdhw`R?(9``;dojvhXEeE;atH{*Od1(oApJ{zCcLRNZzI=7o= z((taq8|093VBTW4^|F6it8f}n3RdLeyo<%lEyITFhyJhr(qDSJi25n2C;ZYw{K3ff z&ZXA*nOxji8Bawm_2d(i%9o`!nWxBf7AUf8`_rZ{ycD*#n!7|BhPPz)HU(EtBww8m zu&HA(=JoL{-d;J8JYw_`u=Q3Tzmd@*0DknxNDbl=BG8gkEacu`H9X`p=rH!VlETm0- zp5+r$nz>Di+{m+9%@^rJzE~S9V8g(eo)rZudpfJCdFHz!+U?fjQ0hXJQ&ZNHEOwPu zHxZgjh*7=N2C-YjsEs<+-D(_g_-qUO1~l|081qqJKk?iLx!7Bm`s%Gw7Tbiok(}8hC12 zY=>G*Blas`x&u2cn0ll^ND66kIp9GHBRc$u+;=dvb%MTY0@CM4w-(U{|7xl zOYG3nTcPE{bt?Y>m0P(naw33?1}ryCZSso0sFitcV|4v#X%>3~6N)s=g}90ks*Fvj zttq!GYF_aj?5ekj?Gd9FxLl~6PH&TWu4GXw@hMa_VX1=(e{q+L>;2bX0VEWGNo^6^ zCbmOtm)Lv6F2H!v{cqwR1$Dch_C{IH!Cp~j>Nc@=!E9Xr_>(M*Lx>{9*IBj6L4(Jy PsQESFFZA3OZ0`OGE8wKh literal 0 HcmV?d00001 diff --git a/app/api/v1/__pycache__/views.cpython-37.pyc b/app/api/v1/__pycache__/views.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2884a5b3e020238a41132bb392f79e81f9f1aa90 GIT binary patch literal 2542 zcmbtWOK;mo5auqQk|;%XY{yAo=(}p`w9Tm~iXw`W1_fHhuzT7HAXx3%RZEJ>?ka{0 z`sDnK9;{>kN%I%>+LQl6Pn}s(e!vRQpcHmEvm|GBznS?~58Caf1J~z2zxe6<&~g4o zV{v()+=rn~L2!qY%*hEOIb}3=nVWmeBREepKMz=thb#o!7}{dYv;^rPK3_|8174-%R5{HWO1ho@f(F@pL8>D8H&=GTuMxQRDWfV-xKP zRm|i_oRR9=IL)$TM;3fG(#kZ@+DkK`Omsf!+ldhdTU->B`!Lk&AcVsRcNpb_)8`Iz z5fHe0+=oR5X1#wYLh@+Brv)r=gz@o0SBU#I4C_uinw-)(pwH8Z(hdIoo2jc86aMSao4>uFmk6HIX=;X>qTS}*Trjk*?1z_VTk?osE z3NCg*?qM2Lx0eJ{AhQpzw_NNolaqlhtIwkJ{yZe zb$5DXTnN*_Z3G}3vPuH-`|YK>zYA}kBM`yMI4lA~P_%PO=FTzERJ$jHlUvR)Ey=0J z>6{z`4xqW9c~^#@+RDj$5Wk}<|6u-%T1haFDC3lbk8U99cb21$pACAxi4wc(Br(k-$)WZ$0eYMyu>B12NRnz>Z-e(s!R<0| z1+onyhM^Fah(^AhS>7YKgX=wl#cbA|OvIx5E?NUy0xuWFd21j_Rcn-FP9Uk!ZzYAc zpx}uPWEY;-gXHlXdEUM+uyrdViKl%&x@5!T%#TTr*Xj5*DQvK115H%Q7w;qA13eup}a9Y1DFq m#NxN{ml3duzOH!t8*G1tkZqDK*>oc~3<46+?s_-uhW`R8$sX4L literal 0 HcmV?d00001 diff --git a/app/api/v1/models.py b/app/api/v1/models.py new file mode 100644 index 00000000..e69de29b diff --git a/app/api/v1/views.py b/app/api/v1/views.py new file mode 100644 index 00000000..e69de29b diff --git a/app/tests/__init__.py b/app/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/tests/__pycache__/__init__.cpython-37.pyc b/app/tests/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7676ca33086b722a694cd64bb82427ea8720f403 GIT binary patch literal 134 zcmZ?b<>g`kf@q8IxF05L1#`Tv8kpAD@|*SrQ+wS5SG2!zMRBr8Fni4rEX< H5HkP(-A5cZ literal 0 HcmV?d00001 diff --git a/app/tests/__pycache__/test_products.cpython-37-PYTEST.pyc b/app/tests/__pycache__/test_products.cpython-37-PYTEST.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f11e44fced971c4a989edfd68d09fbb57052c9d8 GIT binary patch literal 1690 zcmbVM&2Aev5GMCe)Jn1)yAApq6h%;UfktYIo`RyV>lj84RgJ{GYz(j)kug?X?QTgb zg#_i49D4B^^k5(RCe17G+LK?Qr_OL?IdF6+x&Vjd4mq6f`-c3k*NYG9*G~>YLjERi zd;yGip=kj|5J3x)QrCME-y@Vvf;6O!CrTsdX{9aby@E~JX?y95)A*1GUj(m+2xK(w zy!6wq?1}IfPyH;T^NkCLCFo<4M3-<9879=mBPBBq5sC=rp=b#PeI(itJGNU#suI(Y(Z^Do{Y=Xdg&_E0??c;%rtg9=kdN@r z=z?&Hj43LoLlub&RP;V2IbH8+3mACfL4Pwt|fLp}-FEr!ZKMF&R^YE&Ma@1wcRd z7IX} zX?*3#g=IjoJgwAhzB9O?!QlRvYh>_L8%|amn8Rx@Nz_OX)Ri_iK&fmfrjuH$TeuKe zOnfImvl9?3xpyi!0d|^NZtmtXyW6m?sXU|B`p@2H{ zY7>z)1*o|BG~^@Yj18ECN0aj6Pt4zb3TE0sE{!3a*nqE z-we)G50iTb%|~cHMss}wRw^hg*%ma7cZ&Ipv4Dl{FCH_=@{;pp)3T@2ynxq9+wN{X zGyq=*X{pKD*N%oceP31<~_Ue~yUHyw;vr{lrmQBmt;6#0Z$>F_OzI1w~EjtDe nKCCVmbqBmQz;xE3ug`kf_~lO(IEOUh=2h`Aj1KOi&=m~3PUi1CZpdq8Ize;T#}fVoEj4!pP83g5+AQuPs=8#wj`y2gyx)BD?P(DB1jg6nyZ1j#LVhCnGbk)hU=~*p zCWI4ie1|E>H!Cs#o7@6y2?MYR*ya>4)z|{;a2K$vu?^VcEx;{}sW62lY(cqyV@D2e z&q%+Mz&+bx!0H5M@fd<2k-2NZ>JQ`k{&zEUY#%Utv)!l>qvqa`N3mbxG*oMwLxVT3n@ky+* zd<~V=bw00t>jI13btZfFPK8jbgf0?kVZiGpHc>hlw&heS4|6RDxVfW>nP#d7u=7_R z%!t;#2trYm%XCpwebzv=K5+;d89%Fnk9r+rsB+0_S;l-l#!U%EdM1(5iM%8&D$CHkc{F;U*j S>V>}2ZwO`V()x2v1Ha$3+x6}M literal 0 HcmV?d00001 diff --git a/instance/config.py b/instance/config.py new file mode 100644 index 00000000..8e841f9c --- /dev/null +++ b/instance/config.py @@ -0,0 +1,32 @@ +class Config(object): + "parent configuration class" + DEBUG= False + + +class DevelopmentConfig(Config): + "Configurations for Development" + DEBUG = True + + +class TestingConfig(Config): + """Configurations for Testing,""" + TESTING = True + DEBUG = True + +class StagingConfig(Config): + """Configurations for Staging.""" + DEBUG = True + + +class ProductionConfig(Config): + """Configurations for Production.""" + DEBUG = False + TESTING = False + + +app_config = { + 'development': DevelopmentConfig, + 'testing': TestingConfig, + 'staging': StagingConfig, + 'production': ProductionConfig, +} \ No newline at end of file diff --git a/run.py b/run.py new file mode 100644 index 00000000..92d9339c --- /dev/null +++ b/run.py @@ -0,0 +1,12 @@ +'''this file is the entry point to our app''' + +import os +from .app import create_app + +config_name = "development" +app = create_app(config_name) +'''we create the app by running create_app function and passing in the config_name''' + + +if __name__ == "__main__": + app.run() diff --git a/venv/Include/Python-ast.h b/venv/Include/Python-ast.h new file mode 100644 index 00000000..8e0f750a --- /dev/null +++ b/venv/Include/Python-ast.h @@ -0,0 +1,637 @@ +/* File automatically generated by Parser/asdl_c.py. */ + +#include "asdl.h" + +typedef struct _mod *mod_ty; + +typedef struct _stmt *stmt_ty; + +typedef struct _expr *expr_ty; + +typedef enum _expr_context { Load=1, Store=2, Del=3, AugLoad=4, AugStore=5, + Param=6 } expr_context_ty; + +typedef struct _slice *slice_ty; + +typedef enum _boolop { And=1, Or=2 } boolop_ty; + +typedef enum _operator { Add=1, Sub=2, Mult=3, MatMult=4, Div=5, Mod=6, Pow=7, + LShift=8, RShift=9, BitOr=10, BitXor=11, BitAnd=12, + FloorDiv=13 } operator_ty; + +typedef enum _unaryop { Invert=1, Not=2, UAdd=3, USub=4 } unaryop_ty; + +typedef enum _cmpop { Eq=1, NotEq=2, Lt=3, LtE=4, Gt=5, GtE=6, Is=7, IsNot=8, + In=9, NotIn=10 } cmpop_ty; + +typedef struct _comprehension *comprehension_ty; + +typedef struct _excepthandler *excepthandler_ty; + +typedef struct _arguments *arguments_ty; + +typedef struct _arg *arg_ty; + +typedef struct _keyword *keyword_ty; + +typedef struct _alias *alias_ty; + +typedef struct _withitem *withitem_ty; + + +enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3, + Suite_kind=4}; +struct _mod { + enum _mod_kind kind; + union { + struct { + asdl_seq *body; + } Module; + + struct { + asdl_seq *body; + } Interactive; + + struct { + expr_ty body; + } Expression; + + struct { + asdl_seq *body; + } Suite; + + } v; +}; + +enum _stmt_kind {FunctionDef_kind=1, AsyncFunctionDef_kind=2, ClassDef_kind=3, + Return_kind=4, Delete_kind=5, Assign_kind=6, + AugAssign_kind=7, AnnAssign_kind=8, For_kind=9, + AsyncFor_kind=10, While_kind=11, If_kind=12, With_kind=13, + AsyncWith_kind=14, Raise_kind=15, Try_kind=16, + Assert_kind=17, Import_kind=18, ImportFrom_kind=19, + Global_kind=20, Nonlocal_kind=21, Expr_kind=22, Pass_kind=23, + Break_kind=24, Continue_kind=25}; +struct _stmt { + enum _stmt_kind kind; + union { + struct { + identifier name; + arguments_ty args; + asdl_seq *body; + asdl_seq *decorator_list; + expr_ty returns; + } FunctionDef; + + struct { + identifier name; + arguments_ty args; + asdl_seq *body; + asdl_seq *decorator_list; + expr_ty returns; + } AsyncFunctionDef; + + struct { + identifier name; + asdl_seq *bases; + asdl_seq *keywords; + asdl_seq *body; + asdl_seq *decorator_list; + } ClassDef; + + struct { + expr_ty value; + } Return; + + struct { + asdl_seq *targets; + } Delete; + + struct { + asdl_seq *targets; + expr_ty value; + } Assign; + + struct { + expr_ty target; + operator_ty op; + expr_ty value; + } AugAssign; + + struct { + expr_ty target; + expr_ty annotation; + expr_ty value; + int simple; + } AnnAssign; + + struct { + expr_ty target; + expr_ty iter; + asdl_seq *body; + asdl_seq *orelse; + } For; + + struct { + expr_ty target; + expr_ty iter; + asdl_seq *body; + asdl_seq *orelse; + } AsyncFor; + + struct { + expr_ty test; + asdl_seq *body; + asdl_seq *orelse; + } While; + + struct { + expr_ty test; + asdl_seq *body; + asdl_seq *orelse; + } If; + + struct { + asdl_seq *items; + asdl_seq *body; + } With; + + struct { + asdl_seq *items; + asdl_seq *body; + } AsyncWith; + + struct { + expr_ty exc; + expr_ty cause; + } Raise; + + struct { + asdl_seq *body; + asdl_seq *handlers; + asdl_seq *orelse; + asdl_seq *finalbody; + } Try; + + struct { + expr_ty test; + expr_ty msg; + } Assert; + + struct { + asdl_seq *names; + } Import; + + struct { + identifier module; + asdl_seq *names; + int level; + } ImportFrom; + + struct { + asdl_seq *names; + } Global; + + struct { + asdl_seq *names; + } Nonlocal; + + struct { + expr_ty value; + } Expr; + + } v; + int lineno; + int col_offset; +}; + +enum _expr_kind {BoolOp_kind=1, BinOp_kind=2, UnaryOp_kind=3, Lambda_kind=4, + IfExp_kind=5, Dict_kind=6, Set_kind=7, ListComp_kind=8, + SetComp_kind=9, DictComp_kind=10, GeneratorExp_kind=11, + Await_kind=12, Yield_kind=13, YieldFrom_kind=14, + Compare_kind=15, Call_kind=16, Num_kind=17, Str_kind=18, + FormattedValue_kind=19, JoinedStr_kind=20, Bytes_kind=21, + NameConstant_kind=22, Ellipsis_kind=23, Constant_kind=24, + Attribute_kind=25, Subscript_kind=26, Starred_kind=27, + Name_kind=28, List_kind=29, Tuple_kind=30}; +struct _expr { + enum _expr_kind kind; + union { + struct { + boolop_ty op; + asdl_seq *values; + } BoolOp; + + struct { + expr_ty left; + operator_ty op; + expr_ty right; + } BinOp; + + struct { + unaryop_ty op; + expr_ty operand; + } UnaryOp; + + struct { + arguments_ty args; + expr_ty body; + } Lambda; + + struct { + expr_ty test; + expr_ty body; + expr_ty orelse; + } IfExp; + + struct { + asdl_seq *keys; + asdl_seq *values; + } Dict; + + struct { + asdl_seq *elts; + } Set; + + struct { + expr_ty elt; + asdl_seq *generators; + } ListComp; + + struct { + expr_ty elt; + asdl_seq *generators; + } SetComp; + + struct { + expr_ty key; + expr_ty value; + asdl_seq *generators; + } DictComp; + + struct { + expr_ty elt; + asdl_seq *generators; + } GeneratorExp; + + struct { + expr_ty value; + } Await; + + struct { + expr_ty value; + } Yield; + + struct { + expr_ty value; + } YieldFrom; + + struct { + expr_ty left; + asdl_int_seq *ops; + asdl_seq *comparators; + } Compare; + + struct { + expr_ty func; + asdl_seq *args; + asdl_seq *keywords; + } Call; + + struct { + object n; + } Num; + + struct { + string s; + } Str; + + struct { + expr_ty value; + int conversion; + expr_ty format_spec; + } FormattedValue; + + struct { + asdl_seq *values; + } JoinedStr; + + struct { + bytes s; + } Bytes; + + struct { + singleton value; + } NameConstant; + + struct { + constant value; + } Constant; + + struct { + expr_ty value; + identifier attr; + expr_context_ty ctx; + } Attribute; + + struct { + expr_ty value; + slice_ty slice; + expr_context_ty ctx; + } Subscript; + + struct { + expr_ty value; + expr_context_ty ctx; + } Starred; + + struct { + identifier id; + expr_context_ty ctx; + } Name; + + struct { + asdl_seq *elts; + expr_context_ty ctx; + } List; + + struct { + asdl_seq *elts; + expr_context_ty ctx; + } Tuple; + + } v; + int lineno; + int col_offset; +}; + +enum _slice_kind {Slice_kind=1, ExtSlice_kind=2, Index_kind=3}; +struct _slice { + enum _slice_kind kind; + union { + struct { + expr_ty lower; + expr_ty upper; + expr_ty step; + } Slice; + + struct { + asdl_seq *dims; + } ExtSlice; + + struct { + expr_ty value; + } Index; + + } v; +}; + +struct _comprehension { + expr_ty target; + expr_ty iter; + asdl_seq *ifs; + int is_async; +}; + +enum _excepthandler_kind {ExceptHandler_kind=1}; +struct _excepthandler { + enum _excepthandler_kind kind; + union { + struct { + expr_ty type; + identifier name; + asdl_seq *body; + } ExceptHandler; + + } v; + int lineno; + int col_offset; +}; + +struct _arguments { + asdl_seq *args; + arg_ty vararg; + asdl_seq *kwonlyargs; + asdl_seq *kw_defaults; + arg_ty kwarg; + asdl_seq *defaults; +}; + +struct _arg { + identifier arg; + expr_ty annotation; + int lineno; + int col_offset; +}; + +struct _keyword { + identifier arg; + expr_ty value; +}; + +struct _alias { + identifier name; + identifier asname; +}; + +struct _withitem { + expr_ty context_expr; + expr_ty optional_vars; +}; + + +#define Module(a0, a1) _Py_Module(a0, a1) +mod_ty _Py_Module(asdl_seq * body, PyArena *arena); +#define Interactive(a0, a1) _Py_Interactive(a0, a1) +mod_ty _Py_Interactive(asdl_seq * body, PyArena *arena); +#define Expression(a0, a1) _Py_Expression(a0, a1) +mod_ty _Py_Expression(expr_ty body, PyArena *arena); +#define Suite(a0, a1) _Py_Suite(a0, a1) +mod_ty _Py_Suite(asdl_seq * body, PyArena *arena); +#define FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7) _Py_FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7) +stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_seq * body, + asdl_seq * decorator_list, expr_ty returns, int lineno, + int col_offset, PyArena *arena); +#define AsyncFunctionDef(a0, a1, a2, a3, a4, a5, a6, a7) _Py_AsyncFunctionDef(a0, a1, a2, a3, a4, a5, a6, a7) +stmt_ty _Py_AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * + body, asdl_seq * decorator_list, expr_ty returns, + int lineno, int col_offset, PyArena *arena); +#define ClassDef(a0, a1, a2, a3, a4, a5, a6, a7) _Py_ClassDef(a0, a1, a2, a3, a4, a5, a6, a7) +stmt_ty _Py_ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, + asdl_seq * body, asdl_seq * decorator_list, int lineno, + int col_offset, PyArena *arena); +#define Return(a0, a1, a2, a3) _Py_Return(a0, a1, a2, a3) +stmt_ty _Py_Return(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Delete(a0, a1, a2, a3) _Py_Delete(a0, a1, a2, a3) +stmt_ty _Py_Delete(asdl_seq * targets, int lineno, int col_offset, PyArena + *arena); +#define Assign(a0, a1, a2, a3, a4) _Py_Assign(a0, a1, a2, a3, a4) +stmt_ty _Py_Assign(asdl_seq * targets, expr_ty value, int lineno, int + col_offset, PyArena *arena); +#define AugAssign(a0, a1, a2, a3, a4, a5) _Py_AugAssign(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_AugAssign(expr_ty target, operator_ty op, expr_ty value, int + lineno, int col_offset, PyArena *arena); +#define AnnAssign(a0, a1, a2, a3, a4, a5, a6) _Py_AnnAssign(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int + simple, int lineno, int col_offset, PyArena *arena); +#define For(a0, a1, a2, a3, a4, a5, a6) _Py_For(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * + orelse, int lineno, int col_offset, PyArena *arena); +#define AsyncFor(a0, a1, a2, a3, a4, a5, a6) _Py_AsyncFor(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * + orelse, int lineno, int col_offset, PyArena *arena); +#define While(a0, a1, a2, a3, a4, a5) _Py_While(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, + int col_offset, PyArena *arena); +#define If(a0, a1, a2, a3, a4, a5) _Py_If(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, + int col_offset, PyArena *arena); +#define With(a0, a1, a2, a3, a4) _Py_With(a0, a1, a2, a3, a4) +stmt_ty _Py_With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, + PyArena *arena); +#define AsyncWith(a0, a1, a2, a3, a4) _Py_AsyncWith(a0, a1, a2, a3, a4) +stmt_ty _Py_AsyncWith(asdl_seq * items, asdl_seq * body, int lineno, int + col_offset, PyArena *arena); +#define Raise(a0, a1, a2, a3, a4) _Py_Raise(a0, a1, a2, a3, a4) +stmt_ty _Py_Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, + PyArena *arena); +#define Try(a0, a1, a2, a3, a4, a5, a6) _Py_Try(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, + asdl_seq * finalbody, int lineno, int col_offset, PyArena + *arena); +#define Assert(a0, a1, a2, a3, a4) _Py_Assert(a0, a1, a2, a3, a4) +stmt_ty _Py_Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, + PyArena *arena); +#define Import(a0, a1, a2, a3) _Py_Import(a0, a1, a2, a3) +stmt_ty _Py_Import(asdl_seq * names, int lineno, int col_offset, PyArena + *arena); +#define ImportFrom(a0, a1, a2, a3, a4, a5) _Py_ImportFrom(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_ImportFrom(identifier module, asdl_seq * names, int level, int + lineno, int col_offset, PyArena *arena); +#define Global(a0, a1, a2, a3) _Py_Global(a0, a1, a2, a3) +stmt_ty _Py_Global(asdl_seq * names, int lineno, int col_offset, PyArena + *arena); +#define Nonlocal(a0, a1, a2, a3) _Py_Nonlocal(a0, a1, a2, a3) +stmt_ty _Py_Nonlocal(asdl_seq * names, int lineno, int col_offset, PyArena + *arena); +#define Expr(a0, a1, a2, a3) _Py_Expr(a0, a1, a2, a3) +stmt_ty _Py_Expr(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Pass(a0, a1, a2) _Py_Pass(a0, a1, a2) +stmt_ty _Py_Pass(int lineno, int col_offset, PyArena *arena); +#define Break(a0, a1, a2) _Py_Break(a0, a1, a2) +stmt_ty _Py_Break(int lineno, int col_offset, PyArena *arena); +#define Continue(a0, a1, a2) _Py_Continue(a0, a1, a2) +stmt_ty _Py_Continue(int lineno, int col_offset, PyArena *arena); +#define BoolOp(a0, a1, a2, a3, a4) _Py_BoolOp(a0, a1, a2, a3, a4) +expr_ty _Py_BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, + PyArena *arena); +#define BinOp(a0, a1, a2, a3, a4, a5) _Py_BinOp(a0, a1, a2, a3, a4, a5) +expr_ty _Py_BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int + col_offset, PyArena *arena); +#define UnaryOp(a0, a1, a2, a3, a4) _Py_UnaryOp(a0, a1, a2, a3, a4) +expr_ty _Py_UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, + PyArena *arena); +#define Lambda(a0, a1, a2, a3, a4) _Py_Lambda(a0, a1, a2, a3, a4) +expr_ty _Py_Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, + PyArena *arena); +#define IfExp(a0, a1, a2, a3, a4, a5) _Py_IfExp(a0, a1, a2, a3, a4, a5) +expr_ty _Py_IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int + col_offset, PyArena *arena); +#define Dict(a0, a1, a2, a3, a4) _Py_Dict(a0, a1, a2, a3, a4) +expr_ty _Py_Dict(asdl_seq * keys, asdl_seq * values, int lineno, int + col_offset, PyArena *arena); +#define Set(a0, a1, a2, a3) _Py_Set(a0, a1, a2, a3) +expr_ty _Py_Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena); +#define ListComp(a0, a1, a2, a3, a4) _Py_ListComp(a0, a1, a2, a3, a4) +expr_ty _Py_ListComp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +#define SetComp(a0, a1, a2, a3, a4) _Py_SetComp(a0, a1, a2, a3, a4) +expr_ty _Py_SetComp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +#define DictComp(a0, a1, a2, a3, a4, a5) _Py_DictComp(a0, a1, a2, a3, a4, a5) +expr_ty _Py_DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int + lineno, int col_offset, PyArena *arena); +#define GeneratorExp(a0, a1, a2, a3, a4) _Py_GeneratorExp(a0, a1, a2, a3, a4) +expr_ty _Py_GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +#define Await(a0, a1, a2, a3) _Py_Await(a0, a1, a2, a3) +expr_ty _Py_Await(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Yield(a0, a1, a2, a3) _Py_Yield(a0, a1, a2, a3) +expr_ty _Py_Yield(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define YieldFrom(a0, a1, a2, a3) _Py_YieldFrom(a0, a1, a2, a3) +expr_ty _Py_YieldFrom(expr_ty value, int lineno, int col_offset, PyArena + *arena); +#define Compare(a0, a1, a2, a3, a4, a5) _Py_Compare(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, + int lineno, int col_offset, PyArena *arena); +#define Call(a0, a1, a2, a3, a4, a5) _Py_Call(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int + lineno, int col_offset, PyArena *arena); +#define Num(a0, a1, a2, a3) _Py_Num(a0, a1, a2, a3) +expr_ty _Py_Num(object n, int lineno, int col_offset, PyArena *arena); +#define Str(a0, a1, a2, a3) _Py_Str(a0, a1, a2, a3) +expr_ty _Py_Str(string s, int lineno, int col_offset, PyArena *arena); +#define FormattedValue(a0, a1, a2, a3, a4, a5) _Py_FormattedValue(a0, a1, a2, a3, a4, a5) +expr_ty _Py_FormattedValue(expr_ty value, int conversion, expr_ty format_spec, + int lineno, int col_offset, PyArena *arena); +#define JoinedStr(a0, a1, a2, a3) _Py_JoinedStr(a0, a1, a2, a3) +expr_ty _Py_JoinedStr(asdl_seq * values, int lineno, int col_offset, PyArena + *arena); +#define Bytes(a0, a1, a2, a3) _Py_Bytes(a0, a1, a2, a3) +expr_ty _Py_Bytes(bytes s, int lineno, int col_offset, PyArena *arena); +#define NameConstant(a0, a1, a2, a3) _Py_NameConstant(a0, a1, a2, a3) +expr_ty _Py_NameConstant(singleton value, int lineno, int col_offset, PyArena + *arena); +#define Ellipsis(a0, a1, a2) _Py_Ellipsis(a0, a1, a2) +expr_ty _Py_Ellipsis(int lineno, int col_offset, PyArena *arena); +#define Constant(a0, a1, a2, a3) _Py_Constant(a0, a1, a2, a3) +expr_ty _Py_Constant(constant value, int lineno, int col_offset, PyArena + *arena); +#define Attribute(a0, a1, a2, a3, a4, a5) _Py_Attribute(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int + lineno, int col_offset, PyArena *arena); +#define Subscript(a0, a1, a2, a3, a4, a5) _Py_Subscript(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int + lineno, int col_offset, PyArena *arena); +#define Starred(a0, a1, a2, a3, a4) _Py_Starred(a0, a1, a2, a3, a4) +expr_ty _Py_Starred(expr_ty value, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define Name(a0, a1, a2, a3, a4) _Py_Name(a0, a1, a2, a3, a4) +expr_ty _Py_Name(identifier id, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define List(a0, a1, a2, a3, a4) _Py_List(a0, a1, a2, a3, a4) +expr_ty _Py_List(asdl_seq * elts, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define Tuple(a0, a1, a2, a3, a4) _Py_Tuple(a0, a1, a2, a3, a4) +expr_ty _Py_Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define Slice(a0, a1, a2, a3) _Py_Slice(a0, a1, a2, a3) +slice_ty _Py_Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena); +#define ExtSlice(a0, a1) _Py_ExtSlice(a0, a1) +slice_ty _Py_ExtSlice(asdl_seq * dims, PyArena *arena); +#define Index(a0, a1) _Py_Index(a0, a1) +slice_ty _Py_Index(expr_ty value, PyArena *arena); +#define comprehension(a0, a1, a2, a3, a4) _Py_comprehension(a0, a1, a2, a3, a4) +comprehension_ty _Py_comprehension(expr_ty target, expr_ty iter, asdl_seq * + ifs, int is_async, PyArena *arena); +#define ExceptHandler(a0, a1, a2, a3, a4, a5) _Py_ExceptHandler(a0, a1, a2, a3, a4, a5) +excepthandler_ty _Py_ExceptHandler(expr_ty type, identifier name, asdl_seq * + body, int lineno, int col_offset, PyArena + *arena); +#define arguments(a0, a1, a2, a3, a4, a5, a6) _Py_arguments(a0, a1, a2, a3, a4, a5, a6) +arguments_ty _Py_arguments(asdl_seq * args, arg_ty vararg, asdl_seq * + kwonlyargs, asdl_seq * kw_defaults, arg_ty kwarg, + asdl_seq * defaults, PyArena *arena); +#define arg(a0, a1, a2, a3, a4) _Py_arg(a0, a1, a2, a3, a4) +arg_ty _Py_arg(identifier arg, expr_ty annotation, int lineno, int col_offset, + PyArena *arena); +#define keyword(a0, a1, a2) _Py_keyword(a0, a1, a2) +keyword_ty _Py_keyword(identifier arg, expr_ty value, PyArena *arena); +#define alias(a0, a1, a2) _Py_alias(a0, a1, a2) +alias_ty _Py_alias(identifier name, identifier asname, PyArena *arena); +#define withitem(a0, a1, a2) _Py_withitem(a0, a1, a2) +withitem_ty _Py_withitem(expr_ty context_expr, expr_ty optional_vars, PyArena + *arena); + +PyObject* PyAST_mod2obj(mod_ty t); +mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); +int PyAST_Check(PyObject* obj); diff --git a/venv/Include/Python.h b/venv/Include/Python.h new file mode 100644 index 00000000..1feb1531 --- /dev/null +++ b/venv/Include/Python.h @@ -0,0 +1,140 @@ +#ifndef Py_PYTHON_H +#define Py_PYTHON_H +/* Since this is a "meta-include" file, no #ifdef __cplusplus / extern "C" { */ + +/* Include nearly all Python header files */ + +#include "patchlevel.h" +#include "pyconfig.h" +#include "pymacconfig.h" + +#include + +#ifndef UCHAR_MAX +#error "Something's broken. UCHAR_MAX should be defined in limits.h." +#endif + +#if UCHAR_MAX != 255 +#error "Python's source code assumes C's unsigned char is an 8-bit type." +#endif + +#if defined(__sgi) && !defined(_SGI_MP_SOURCE) +#define _SGI_MP_SOURCE +#endif + +#include +#ifndef NULL +# error "Python.h requires that stdio.h define NULL." +#endif + +#include +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_CRYPT_H +#include +#endif + +/* For size_t? */ +#ifdef HAVE_STDDEF_H +#include +#endif + +/* CAUTION: Build setups should ensure that NDEBUG is defined on the + * compiler command line when building Python in release mode; else + * assert() calls won't be removed. + */ +#include + +#include "pyport.h" +#include "pymacro.h" + +#include "pyatomic.h" + +/* Debug-mode build with pymalloc implies PYMALLOC_DEBUG. + * PYMALLOC_DEBUG is in error if pymalloc is not in use. + */ +#if defined(Py_DEBUG) && defined(WITH_PYMALLOC) && !defined(PYMALLOC_DEBUG) +#define PYMALLOC_DEBUG +#endif +#if defined(PYMALLOC_DEBUG) && !defined(WITH_PYMALLOC) +#error "PYMALLOC_DEBUG requires WITH_PYMALLOC" +#endif +#include "pymath.h" +#include "pytime.h" +#include "pymem.h" + +#include "object.h" +#include "objimpl.h" +#include "typeslots.h" +#include "pyhash.h" + +#include "pydebug.h" + +#include "bytearrayobject.h" +#include "bytesobject.h" +#include "unicodeobject.h" +#include "longobject.h" +#include "longintrepr.h" +#include "boolobject.h" +#include "floatobject.h" +#include "complexobject.h" +#include "rangeobject.h" +#include "memoryobject.h" +#include "tupleobject.h" +#include "listobject.h" +#include "dictobject.h" +#include "odictobject.h" +#include "enumobject.h" +#include "setobject.h" +#include "methodobject.h" +#include "moduleobject.h" +#include "funcobject.h" +#include "classobject.h" +#include "fileobject.h" +#include "pycapsule.h" +#include "traceback.h" +#include "sliceobject.h" +#include "cellobject.h" +#include "iterobject.h" +#include "genobject.h" +#include "descrobject.h" +#include "warnings.h" +#include "weakrefobject.h" +#include "structseq.h" +#include "namespaceobject.h" + +#include "codecs.h" +#include "pyerrors.h" + +#include "pystate.h" +#include "context.h" + +#include "pyarena.h" +#include "modsupport.h" +#include "compile.h" +#include "pythonrun.h" +#include "pylifecycle.h" +#include "ceval.h" +#include "sysmodule.h" +#include "osmodule.h" +#include "intrcheck.h" +#include "import.h" + +#include "abstract.h" +#include "bltinmodule.h" + +#include "eval.h" + +#include "pyctype.h" +#include "pystrtod.h" +#include "pystrcmp.h" +#include "dtoa.h" +#include "fileutils.h" +#include "pyfpe.h" + +#endif /* !Py_PYTHON_H */ diff --git a/venv/Include/abstract.h b/venv/Include/abstract.h new file mode 100644 index 00000000..4088f75f --- /dev/null +++ b/venv/Include/abstract.h @@ -0,0 +1,1109 @@ +/* Abstract Object Interface (many thanks to Jim Fulton) */ + +#ifndef Py_ABSTRACTOBJECT_H +#define Py_ABSTRACTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* === Object Protocol ================================================== */ + +/* Implemented elsewhere: + + int PyObject_Print(PyObject *o, FILE *fp, int flags); + + Print an object 'o' on file 'fp'. Returns -1 on error. The flags argument + is used to enable certain printing options. The only option currently + supported is Py_Print_RAW. + + (What should be said about Py_Print_RAW?). */ + + +/* Implemented elsewhere: + + int PyObject_HasAttrString(PyObject *o, const char *attr_name); + + Returns 1 if object 'o' has the attribute attr_name, and 0 otherwise. + + This is equivalent to the Python expression: hasattr(o,attr_name). + + This function always succeeds. */ + + +/* Implemented elsewhere: + + PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name); + + Retrieve an attributed named attr_name form object o. + Returns the attribute value on success, or NULL on failure. + + This is the equivalent of the Python expression: o.attr_name. */ + + +/* Implemented elsewhere: + + int PyObject_HasAttr(PyObject *o, PyObject *attr_name); + + Returns 1 if o has the attribute attr_name, and 0 otherwise. + + This is equivalent to the Python expression: hasattr(o,attr_name). + + This function always succeeds. */ + +/* Implemented elsewhere: + + PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name); + + Retrieve an attributed named 'attr_name' form object 'o'. + Returns the attribute value on success, or NULL on failure. + + This is the equivalent of the Python expression: o.attr_name. */ + + +/* Implemented elsewhere: + + int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v); + + Set the value of the attribute named attr_name, for object 'o', + to the value 'v'. Raise an exception and return -1 on failure; return 0 on + success. + + This is the equivalent of the Python statement o.attr_name=v. */ + + +/* Implemented elsewhere: + + int PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v); + + Set the value of the attribute named attr_name, for object 'o', to the value + 'v'. an exception and return -1 on failure; return 0 on success. + + This is the equivalent of the Python statement o.attr_name=v. */ + +/* Implemented as a macro: + + int PyObject_DelAttrString(PyObject *o, const char *attr_name); + + Delete attribute named attr_name, for object o. Returns + -1 on failure. + + This is the equivalent of the Python statement: del o.attr_name. */ +#define PyObject_DelAttrString(O,A) PyObject_SetAttrString((O),(A), NULL) + + +/* Implemented as a macro: + + int PyObject_DelAttr(PyObject *o, PyObject *attr_name); + + Delete attribute named attr_name, for object o. Returns -1 + on failure. This is the equivalent of the Python + statement: del o.attr_name. */ +#define PyObject_DelAttr(O,A) PyObject_SetAttr((O),(A), NULL) + + +/* Implemented elsewhere: + + PyObject *PyObject_Repr(PyObject *o); + + Compute the string representation of object 'o'. Returns the + string representation on success, NULL on failure. + + This is the equivalent of the Python expression: repr(o). + + Called by the repr() built-in function. */ + + +/* Implemented elsewhere: + + PyObject *PyObject_Str(PyObject *o); + + Compute the string representation of object, o. Returns the + string representation on success, NULL on failure. + + This is the equivalent of the Python expression: str(o). + + Called by the str() and print() built-in functions. */ + + +/* Declared elsewhere + + PyAPI_FUNC(int) PyCallable_Check(PyObject *o); + + Determine if the object, o, is callable. Return 1 if the object is callable + and 0 otherwise. + + This function always succeeds. */ + + +#ifdef PY_SSIZE_T_CLEAN +# define PyObject_CallFunction _PyObject_CallFunction_SizeT +# define PyObject_CallMethod _PyObject_CallMethod_SizeT +# ifndef Py_LIMITED_API +# define _PyObject_CallMethodId _PyObject_CallMethodId_SizeT +# endif /* !Py_LIMITED_API */ +#endif + + +/* Call a callable Python object 'callable' with arguments given by the + tuple 'args' and keywords arguments given by the dictionary 'kwargs'. + + 'args' must not be *NULL*, use an empty tuple if no arguments are + needed. If no named arguments are needed, 'kwargs' can be NULL. + + This is the equivalent of the Python expression: + callable(*args, **kwargs). */ +PyAPI_FUNC(PyObject *) PyObject_Call(PyObject *callable, + PyObject *args, PyObject *kwargs); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyStack_AsTuple( + PyObject *const *stack, + Py_ssize_t nargs); + +PyAPI_FUNC(PyObject*) _PyStack_AsTupleSlice( + PyObject *const *stack, + Py_ssize_t nargs, + Py_ssize_t start, + Py_ssize_t end); + +/* Convert keyword arguments from the FASTCALL (stack: C array, kwnames: tuple) + format to a Python dictionary ("kwargs" dict). + + The type of kwnames keys is not checked. The final function getting + arguments is responsible to check if all keys are strings, for example using + PyArg_ParseTupleAndKeywords() or PyArg_ValidateKeywordArguments(). + + Duplicate keys are merged using the last value. If duplicate keys must raise + an exception, the caller is responsible to implement an explicit keys on + kwnames. */ +PyAPI_FUNC(PyObject *) _PyStack_AsDict( + PyObject *const *values, + PyObject *kwnames); + +/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple). + + Return 0 on success, raise an exception and return -1 on error. + + Write the new stack into *p_stack. If *p_stack is differen than args, it + must be released by PyMem_Free(). + + The stack uses borrowed references. + + The type of keyword keys is not checked, these checks should be done + later (ex: _PyArg_ParseStackAndKeywords). */ +PyAPI_FUNC(int) _PyStack_UnpackDict( + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwargs, + PyObject *const **p_stack, + PyObject **p_kwnames); + +/* Suggested size (number of positional arguments) for arrays of PyObject* + allocated on a C stack to avoid allocating memory on the heap memory. Such + array is used to pass positional arguments to call functions of the + _PyObject_FastCall() family. + + The size is chosen to not abuse the C stack and so limit the risk of stack + overflow. The size is also chosen to allow using the small stack for most + function calls of the Python standard library. On 64-bit CPU, it allocates + 40 bytes on the stack. */ +#define _PY_FASTCALL_SMALL_STACK 5 + +/* Return 1 if callable supports FASTCALL calling convention for positional + arguments: see _PyObject_FastCallDict() and _PyObject_FastCallKeywords() */ +PyAPI_FUNC(int) _PyObject_HasFastCall(PyObject *callable); + +/* Call the callable object 'callable' with the "fast call" calling convention: + args is a C array for positional arguments (nargs is the number of + positional arguments), kwargs is a dictionary for keyword arguments. + + If nargs is equal to zero, args can be NULL. kwargs can be NULL. + nargs must be greater or equal to zero. + + Return the result on success. Raise an exception on return NULL on + error. */ +PyAPI_FUNC(PyObject *) _PyObject_FastCallDict( + PyObject *callable, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwargs); + +/* Call the callable object 'callable' with the "fast call" calling convention: + args is a C array for positional arguments followed by values of + keyword arguments. Keys of keyword arguments are stored as a tuple + of strings in kwnames. nargs is the number of positional parameters at + the beginning of stack. The size of kwnames gives the number of keyword + values in the stack after positional arguments. + + kwnames must only contains str strings, no subclass, and all keys must + be unique. + + If nargs is equal to zero and there is no keyword argument (kwnames is + NULL or its size is zero), args can be NULL. + + Return the result on success. Raise an exception and return NULL on + error. */ +PyAPI_FUNC(PyObject *) _PyObject_FastCallKeywords( + PyObject *callable, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames); + +#define _PyObject_FastCall(func, args, nargs) \ + _PyObject_FastCallDict((func), (args), (nargs), NULL) + +#define _PyObject_CallNoArg(func) \ + _PyObject_FastCallDict((func), NULL, 0, NULL) + +PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend( + PyObject *callable, + PyObject *obj, + PyObject *args, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyObject_FastCall_Prepend( + PyObject *callable, + PyObject *obj, + PyObject *const *args, + Py_ssize_t nargs); + +PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult(PyObject *callable, + PyObject *result, + const char *where); +#endif /* Py_LIMITED_API */ + + +/* Call a callable Python object 'callable', with arguments given by the + tuple 'args'. If no arguments are needed, then 'args' can be *NULL*. + + Returns the result of the call on success, or *NULL* on failure. + + This is the equivalent of the Python expression: + callable(*args). */ +PyAPI_FUNC(PyObject *) PyObject_CallObject(PyObject *callable, + PyObject *args); + +/* Call a callable Python object, callable, with a variable number of C + arguments. The C arguments are described using a mkvalue-style format + string. + + The format may be NULL, indicating that no arguments are provided. + + Returns the result of the call on success, or NULL on failure. + + This is the equivalent of the Python expression: + callable(arg1, arg2, ...). */ +PyAPI_FUNC(PyObject *) PyObject_CallFunction(PyObject *callable, + const char *format, ...); + +/* Call the method named 'name' of object 'obj' with a variable number of + C arguments. The C arguments are described by a mkvalue format string. + + The format can be NULL, indicating that no arguments are provided. + + Returns the result of the call on success, or NULL on failure. + + This is the equivalent of the Python expression: + obj.name(arg1, arg2, ...). */ +PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *obj, + const char *name, + const char *format, ...); + +#ifndef Py_LIMITED_API +/* Like PyObject_CallMethod(), but expect a _Py_Identifier* + as the method name. */ +PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *obj, + _Py_Identifier *name, + const char *format, ...); +#endif /* !Py_LIMITED_API */ + +PyAPI_FUNC(PyObject *) _PyObject_CallFunction_SizeT(PyObject *callable, + const char *format, + ...); + +PyAPI_FUNC(PyObject *) _PyObject_CallMethod_SizeT(PyObject *obj, + const char *name, + const char *format, + ...); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *obj, + _Py_Identifier *name, + const char *format, + ...); +#endif /* !Py_LIMITED_API */ + +/* Call a callable Python object 'callable' with a variable number of C + arguments. The C arguments are provided as PyObject* values, terminated + by a NULL. + + Returns the result of the call on success, or NULL on failure. + + This is the equivalent of the Python expression: + callable(arg1, arg2, ...). */ +PyAPI_FUNC(PyObject *) PyObject_CallFunctionObjArgs(PyObject *callable, + ...); + +/* Call the method named 'name' of object 'obj' with a variable number of + C arguments. The C arguments are provided as PyObject* values, terminated + by NULL. + + Returns the result of the call on success, or NULL on failure. + + This is the equivalent of the Python expression: obj.name(*args). */ + +PyAPI_FUNC(PyObject *) PyObject_CallMethodObjArgs( + PyObject *obj, + PyObject *name, + ...); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyObject_CallMethodIdObjArgs( + PyObject *obj, + struct _Py_Identifier *name, + ...); +#endif /* !Py_LIMITED_API */ + + +/* Implemented elsewhere: + + Py_hash_t PyObject_Hash(PyObject *o); + + Compute and return the hash, hash_value, of an object, o. On + failure, return -1. + + This is the equivalent of the Python expression: hash(o). */ + + +/* Implemented elsewhere: + + int PyObject_IsTrue(PyObject *o); + + Returns 1 if the object, o, is considered to be true, 0 if o is + considered to be false and -1 on failure. + + This is equivalent to the Python expression: not not o. */ + + +/* Implemented elsewhere: + + int PyObject_Not(PyObject *o); + + Returns 0 if the object, o, is considered to be true, 1 if o is + considered to be false and -1 on failure. + + This is equivalent to the Python expression: not o. */ + + +/* Get the type of an object. + + On success, returns a type object corresponding to the object type of object + 'o'. On failure, returns NULL. + + This is equivalent to the Python expression: type(o) */ +PyAPI_FUNC(PyObject *) PyObject_Type(PyObject *o); + + +/* Return the size of object 'o'. If the object 'o' provides both sequence and + mapping protocols, the sequence size is returned. + + On error, -1 is returned. + + This is the equivalent to the Python expression: len(o) */ +PyAPI_FUNC(Py_ssize_t) PyObject_Size(PyObject *o); + + +/* For DLL compatibility */ +#undef PyObject_Length +PyAPI_FUNC(Py_ssize_t) PyObject_Length(PyObject *o); +#define PyObject_Length PyObject_Size + + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o); + +/* Guess the size of object 'o' using len(o) or o.__length_hint__(). + If neither of those return a non-negative value, then return the default + value. If one of the calls fails, this function returns -1. */ +PyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t); +#endif + +/* Return element of 'o' corresponding to the object 'key'. Return NULL + on failure. + + This is the equivalent of the Python expression: o[key] */ +PyAPI_FUNC(PyObject *) PyObject_GetItem(PyObject *o, PyObject *key); + + +/* Map the object 'key' to the value 'v' into 'o'. + + Raise an exception and return -1 on failure; return 0 on success. + + This is the equivalent of the Python statement: o[key]=v. */ +PyAPI_FUNC(int) PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v); + +/* Remove the mapping for the string 'key' from the object 'o'. + Returns -1 on failure. + + This is equivalent to the Python statement: del o[key]. */ +PyAPI_FUNC(int) PyObject_DelItemString(PyObject *o, const char *key); + +/* Delete the mapping for the object 'key' from the object 'o'. + Returns -1 on failure. + + This is the equivalent of the Python statement: del o[key]. */ +PyAPI_FUNC(int) PyObject_DelItem(PyObject *o, PyObject *key); + + +/* === Old Buffer API ============================================ */ + +/* FIXME: usage of these should all be replaced in Python itself + but for backwards compatibility we will implement them. + Their usage without a corresponding "unlock" mechanism + may create issues (but they would already be there). */ + +/* Takes an arbitrary object which must support the (character, single segment) + buffer interface and returns a pointer to a read-only memory location + useable as character based input for subsequent processing. + + Return 0 on success. buffer and buffer_len are only set in case no error + occurs. Otherwise, -1 is returned and an exception set. */ +PyAPI_FUNC(int) PyObject_AsCharBuffer(PyObject *obj, + const char **buffer, + Py_ssize_t *buffer_len) + Py_DEPRECATED(3.0); + +/* Checks whether an arbitrary object supports the (character, single segment) + buffer interface. + + Returns 1 on success, 0 on failure. */ +PyAPI_FUNC(int) PyObject_CheckReadBuffer(PyObject *obj) + Py_DEPRECATED(3.0); + +/* Same as PyObject_AsCharBuffer() except that this API expects (readable, + single segment) buffer interface and returns a pointer to a read-only memory + location which can contain arbitrary data. + + 0 is returned on success. buffer and buffer_len are only set in case no + error occurs. Otherwise, -1 is returned and an exception set. */ +PyAPI_FUNC(int) PyObject_AsReadBuffer(PyObject *obj, + const void **buffer, + Py_ssize_t *buffer_len) + Py_DEPRECATED(3.0); + +/* Takes an arbitrary object which must support the (writable, single segment) + buffer interface and returns a pointer to a writable memory location in + buffer of size 'buffer_len'. + + Return 0 on success. buffer and buffer_len are only set in case no error + occurs. Otherwise, -1 is returned and an exception set. */ +PyAPI_FUNC(int) PyObject_AsWriteBuffer(PyObject *obj, + void **buffer, + Py_ssize_t *buffer_len) + Py_DEPRECATED(3.0); + + +/* === New Buffer API ============================================ */ + +#ifndef Py_LIMITED_API + +/* Return 1 if the getbuffer function is available, otherwise return 0. */ +#define PyObject_CheckBuffer(obj) \ + (((obj)->ob_type->tp_as_buffer != NULL) && \ + ((obj)->ob_type->tp_as_buffer->bf_getbuffer != NULL)) + +/* This is a C-API version of the getbuffer function call. It checks + to make sure object has the required function pointer and issues the + call. + + Returns -1 and raises an error on failure and returns 0 on success. */ +PyAPI_FUNC(int) PyObject_GetBuffer(PyObject *obj, Py_buffer *view, + int flags); + +/* Get the memory area pointed to by the indices for the buffer given. + Note that view->ndim is the assumed size of indices. */ +PyAPI_FUNC(void *) PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices); + +/* Return the implied itemsize of the data-format area from a + struct-style description. */ +PyAPI_FUNC(int) PyBuffer_SizeFromFormat(const char *); + +/* Implementation in memoryobject.c */ +PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, Py_buffer *view, + Py_ssize_t len, char order); + +PyAPI_FUNC(int) PyBuffer_FromContiguous(Py_buffer *view, void *buf, + Py_ssize_t len, char order); + +/* Copy len bytes of data from the contiguous chunk of memory + pointed to by buf into the buffer exported by obj. Return + 0 on success and return -1 and raise a PyBuffer_Error on + error (i.e. the object does not have a buffer interface or + it is not working). + + If fort is 'F', then if the object is multi-dimensional, + then the data will be copied into the array in + Fortran-style (first dimension varies the fastest). If + fort is 'C', then the data will be copied into the array + in C-style (last dimension varies the fastest). If fort + is 'A', then it does not matter and the copy will be made + in whatever way is more efficient. */ +PyAPI_FUNC(int) PyObject_CopyData(PyObject *dest, PyObject *src); + +/* Copy the data from the src buffer to the buffer of destination. */ +PyAPI_FUNC(int) PyBuffer_IsContiguous(const Py_buffer *view, char fort); + +/*Fill the strides array with byte-strides of a contiguous + (Fortran-style if fort is 'F' or C-style otherwise) + array of the given shape with the given number of bytes + per element. */ +PyAPI_FUNC(void) PyBuffer_FillContiguousStrides(int ndims, + Py_ssize_t *shape, + Py_ssize_t *strides, + int itemsize, + char fort); + +/* Fills in a buffer-info structure correctly for an exporter + that can only share a contiguous chunk of memory of + "unsigned bytes" of the given length. + + Returns 0 on success and -1 (with raising an error) on error. */ +PyAPI_FUNC(int) PyBuffer_FillInfo(Py_buffer *view, PyObject *o, void *buf, + Py_ssize_t len, int readonly, + int flags); + +/* Releases a Py_buffer obtained from getbuffer ParseTuple's "s*". */ +PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view); + +#endif /* Py_LIMITED_API */ + +/* Takes an arbitrary object and returns the result of calling + obj.__format__(format_spec). */ +PyAPI_FUNC(PyObject *) PyObject_Format(PyObject *obj, + PyObject *format_spec); + + +/* ==== Iterators ================================================ */ + +/* Takes an object and returns an iterator for it. + This is typically a new iterator but if the argument is an iterator, this + returns itself. */ +PyAPI_FUNC(PyObject *) PyObject_GetIter(PyObject *); + +#define PyIter_Check(obj) \ + ((obj)->ob_type->tp_iternext != NULL && \ + (obj)->ob_type->tp_iternext != &_PyObject_NextNotImplemented) + +/* Takes an iterator object and calls its tp_iternext slot, + returning the next value. + + If the iterator is exhausted, this returns NULL without setting an + exception. + + NULL with an exception means an error occurred. */ +PyAPI_FUNC(PyObject *) PyIter_Next(PyObject *); + + +/* === Number Protocol ================================================== */ + +/* Returns 1 if the object 'o' provides numeric protocols, and 0 otherwise. + + This function always succeeds. */ +PyAPI_FUNC(int) PyNumber_Check(PyObject *o); + +/* Returns the result of adding o1 and o2, or NULL on failure. + + This is the equivalent of the Python expression: o1 + o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Add(PyObject *o1, PyObject *o2); + +/* Returns the result of subtracting o2 from o1, or NULL on failure. + + This is the equivalent of the Python expression: o1 - o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Subtract(PyObject *o1, PyObject *o2); + +/* Returns the result of multiplying o1 and o2, or NULL on failure. + + This is the equivalent of the Python expression: o1 * o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Multiply(PyObject *o1, PyObject *o2); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* This is the equivalent of the Python expression: o1 @ o2. */ +PyAPI_FUNC(PyObject *) PyNumber_MatrixMultiply(PyObject *o1, PyObject *o2); +#endif + +/* Returns the result of dividing o1 by o2 giving an integral result, + or NULL on failure. + + This is the equivalent of the Python expression: o1 // o2. */ +PyAPI_FUNC(PyObject *) PyNumber_FloorDivide(PyObject *o1, PyObject *o2); + +/* Returns the result of dividing o1 by o2 giving a float result, or NULL on + failure. + + This is the equivalent of the Python expression: o1 / o2. */ +PyAPI_FUNC(PyObject *) PyNumber_TrueDivide(PyObject *o1, PyObject *o2); + +/* Returns the remainder of dividing o1 by o2, or NULL on failure. + + This is the equivalent of the Python expression: o1 % o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Remainder(PyObject *o1, PyObject *o2); + +/* See the built-in function divmod. + + Returns NULL on failure. + + This is the equivalent of the Python expression: divmod(o1, o2). */ +PyAPI_FUNC(PyObject *) PyNumber_Divmod(PyObject *o1, PyObject *o2); + +/* See the built-in function pow. Returns NULL on failure. + + This is the equivalent of the Python expression: pow(o1, o2, o3), + where o3 is optional. */ +PyAPI_FUNC(PyObject *) PyNumber_Power(PyObject *o1, PyObject *o2, + PyObject *o3); + +/* Returns the negation of o on success, or NULL on failure. + + This is the equivalent of the Python expression: -o. */ +PyAPI_FUNC(PyObject *) PyNumber_Negative(PyObject *o); + +/* Returns the positive of o on success, or NULL on failure. + + This is the equivalent of the Python expression: +o. */ +PyAPI_FUNC(PyObject *) PyNumber_Positive(PyObject *o); + +/* Returns the absolute value of 'o', or NULL on failure. + + This is the equivalent of the Python expression: abs(o). */ +PyAPI_FUNC(PyObject *) PyNumber_Absolute(PyObject *o); + +/* Returns the bitwise negation of 'o' on success, or NULL on failure. + + This is the equivalent of the Python expression: ~o. */ +PyAPI_FUNC(PyObject *) PyNumber_Invert(PyObject *o); + +/* Returns the result of left shifting o1 by o2 on success, or NULL on failure. + + This is the equivalent of the Python expression: o1 << o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Lshift(PyObject *o1, PyObject *o2); + +/* Returns the result of right shifting o1 by o2 on success, or NULL on + failure. + + This is the equivalent of the Python expression: o1 >> o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Rshift(PyObject *o1, PyObject *o2); + +/* Returns the result of bitwise and of o1 and o2 on success, or NULL on + failure. + + This is the equivalent of the Python expression: o1 & o2. */ +PyAPI_FUNC(PyObject *) PyNumber_And(PyObject *o1, PyObject *o2); + +/* Returns the bitwise exclusive or of o1 by o2 on success, or NULL on failure. + + This is the equivalent of the Python expression: o1 ^ o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Xor(PyObject *o1, PyObject *o2); + +/* Returns the result of bitwise or on o1 and o2 on success, or NULL on + failure. + + This is the equivalent of the Python expression: o1 | o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Or(PyObject *o1, PyObject *o2); + +#define PyIndex_Check(obj) \ + ((obj)->ob_type->tp_as_number != NULL && \ + (obj)->ob_type->tp_as_number->nb_index != NULL) + +/* Returns the object 'o' converted to a Python int, or NULL with an exception + raised on failure. */ +PyAPI_FUNC(PyObject *) PyNumber_Index(PyObject *o); + +/* Returns the object 'o' converted to Py_ssize_t by going through + PyNumber_Index() first. + + If an overflow error occurs while converting the int to Py_ssize_t, then the + second argument 'exc' is the error-type to return. If it is NULL, then the + overflow error is cleared and the value is clipped. */ +PyAPI_FUNC(Py_ssize_t) PyNumber_AsSsize_t(PyObject *o, PyObject *exc); + +/* Returns the object 'o' converted to an integer object on success, or NULL + on failure. + + This is the equivalent of the Python expression: int(o). */ +PyAPI_FUNC(PyObject *) PyNumber_Long(PyObject *o); + +/* Returns the object 'o' converted to a float object on success, or NULL + on failure. + + This is the equivalent of the Python expression: float(o). */ +PyAPI_FUNC(PyObject *) PyNumber_Float(PyObject *o); + + +/* --- In-place variants of (some of) the above number protocol functions -- */ + +/* Returns the result of adding o2 to o1, possibly in-place, or NULL + on failure. + + This is the equivalent of the Python expression: o1 += o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceAdd(PyObject *o1, PyObject *o2); + +/* Returns the result of subtracting o2 from o1, possibly in-place or + NULL on failure. + + This is the equivalent of the Python expression: o1 -= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceSubtract(PyObject *o1, PyObject *o2); + +/* Returns the result of multiplying o1 by o2, possibly in-place, or NULL on + failure. + + This is the equivalent of the Python expression: o1 *= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceMultiply(PyObject *o1, PyObject *o2); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* This is the equivalent of the Python expression: o1 @= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceMatrixMultiply(PyObject *o1, PyObject *o2); +#endif + +/* Returns the result of dividing o1 by o2 giving an integral result, possibly + in-place, or NULL on failure. + + This is the equivalent of the Python expression: o1 /= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceFloorDivide(PyObject *o1, + PyObject *o2); + +/* Returns the result of dividing o1 by o2 giving a float result, possibly + in-place, or null on failure. + + This is the equivalent of the Python expression: o1 /= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceTrueDivide(PyObject *o1, + PyObject *o2); + +/* Returns the remainder of dividing o1 by o2, possibly in-place, or NULL on + failure. + + This is the equivalent of the Python expression: o1 %= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2); + +/* Returns the result of raising o1 to the power of o2, possibly in-place, + or NULL on failure. + + This is the equivalent of the Python expression: o1 **= o2, + or o1 = pow(o1, o2, o3) if o3 is present. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlacePower(PyObject *o1, PyObject *o2, + PyObject *o3); + +/* Returns the result of left shifting o1 by o2, possibly in-place, or NULL + on failure. + + This is the equivalent of the Python expression: o1 <<= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceLshift(PyObject *o1, PyObject *o2); + +/* Returns the result of right shifting o1 by o2, possibly in-place or NULL + on failure. + + This is the equivalent of the Python expression: o1 >>= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceRshift(PyObject *o1, PyObject *o2); + +/* Returns the result of bitwise and of o1 and o2, possibly in-place, or NULL + on failure. + + This is the equivalent of the Python expression: o1 &= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceAnd(PyObject *o1, PyObject *o2); + +/* Returns the bitwise exclusive or of o1 by o2, possibly in-place, or NULL + on failure. + + This is the equivalent of the Python expression: o1 ^= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceXor(PyObject *o1, PyObject *o2); + +/* Returns the result of bitwise or of o1 and o2, possibly in-place, + or NULL on failure. + + This is the equivalent of the Python expression: o1 |= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceOr(PyObject *o1, PyObject *o2); + +/* Returns the integer n converted to a string with a base, with a base + marker of 0b, 0o or 0x prefixed if applicable. + + If n is not an int object, it is converted with PyNumber_Index first. */ +PyAPI_FUNC(PyObject *) PyNumber_ToBase(PyObject *n, int base); + + +/* === Sequence protocol ================================================ */ + +/* Return 1 if the object provides sequence protocol, and zero + otherwise. + + This function always succeeds. */ +PyAPI_FUNC(int) PySequence_Check(PyObject *o); + +/* Return the size of sequence object o, or -1 on failure. */ +PyAPI_FUNC(Py_ssize_t) PySequence_Size(PyObject *o); + +/* For DLL compatibility */ +#undef PySequence_Length +PyAPI_FUNC(Py_ssize_t) PySequence_Length(PyObject *o); +#define PySequence_Length PySequence_Size + + +/* Return the concatenation of o1 and o2 on success, and NULL on failure. + + This is the equivalent of the Python expression: o1 + o2. */ +PyAPI_FUNC(PyObject *) PySequence_Concat(PyObject *o1, PyObject *o2); + +/* Return the result of repeating sequence object 'o' 'count' times, + or NULL on failure. + + This is the equivalent of the Python expression: o * count. */ +PyAPI_FUNC(PyObject *) PySequence_Repeat(PyObject *o, Py_ssize_t count); + +/* Return the ith element of o, or NULL on failure. + + This is the equivalent of the Python expression: o[i]. */ +PyAPI_FUNC(PyObject *) PySequence_GetItem(PyObject *o, Py_ssize_t i); + +/* Return the slice of sequence object o between i1 and i2, or NULL on failure. + + This is the equivalent of the Python expression: o[i1:i2]. */ +PyAPI_FUNC(PyObject *) PySequence_GetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2); + +/* Assign object 'v' to the ith element of the sequence 'o'. Raise an exception + and return -1 on failure; return 0 on success. + + This is the equivalent of the Python statement o[i] = v. */ +PyAPI_FUNC(int) PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v); + +/* Delete the 'i'-th element of the sequence 'v'. Returns -1 on failure. + + This is the equivalent of the Python statement: del o[i]. */ +PyAPI_FUNC(int) PySequence_DelItem(PyObject *o, Py_ssize_t i); + +/* Assign the sequence object 'v' to the slice in sequence object 'o', + from 'i1' to 'i2'. Returns -1 on failure. + + This is the equivalent of the Python statement: o[i1:i2] = v. */ +PyAPI_FUNC(int) PySequence_SetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2, + PyObject *v); + +/* Delete the slice in sequence object 'o' from 'i1' to 'i2'. + Returns -1 on failure. + + This is the equivalent of the Python statement: del o[i1:i2]. */ +PyAPI_FUNC(int) PySequence_DelSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2); + +/* Returns the sequence 'o' as a tuple on success, and NULL on failure. + + This is equivalent to the Python expression: tuple(o). */ +PyAPI_FUNC(PyObject *) PySequence_Tuple(PyObject *o); + +/* Returns the sequence 'o' as a list on success, and NULL on failure. + This is equivalent to the Python expression: list(o) */ +PyAPI_FUNC(PyObject *) PySequence_List(PyObject *o); + +/* Return the sequence 'o' as a list, unless it's already a tuple or list. + + Use PySequence_Fast_GET_ITEM to access the members of this list, and + PySequence_Fast_GET_SIZE to get its length. + + Returns NULL on failure. If the object does not support iteration, raises a + TypeError exception with 'm' as the message text. */ +PyAPI_FUNC(PyObject *) PySequence_Fast(PyObject *o, const char* m); + +/* Return the size of the sequence 'o', assuming that 'o' was returned by + PySequence_Fast and is not NULL. */ +#define PySequence_Fast_GET_SIZE(o) \ + (PyList_Check(o) ? PyList_GET_SIZE(o) : PyTuple_GET_SIZE(o)) + +/* Return the 'i'-th element of the sequence 'o', assuming that o was returned + by PySequence_Fast, and that i is within bounds. */ +#define PySequence_Fast_GET_ITEM(o, i)\ + (PyList_Check(o) ? PyList_GET_ITEM(o, i) : PyTuple_GET_ITEM(o, i)) + +/* Assume tp_as_sequence and sq_item exist and that 'i' does not + need to be corrected for a negative index. */ +#define PySequence_ITEM(o, i)\ + ( Py_TYPE(o)->tp_as_sequence->sq_item(o, i) ) + +/* Return a pointer to the underlying item array for + an object retured by PySequence_Fast */ +#define PySequence_Fast_ITEMS(sf) \ + (PyList_Check(sf) ? ((PyListObject *)(sf))->ob_item \ + : ((PyTupleObject *)(sf))->ob_item) + +/* Return the number of occurrences on value on 'o', that is, return + the number of keys for which o[key] == value. + + On failure, return -1. This is equivalent to the Python expression: + o.count(value). */ +PyAPI_FUNC(Py_ssize_t) PySequence_Count(PyObject *o, PyObject *value); + +/* Return 1 if 'ob' is in the sequence 'seq'; 0 if 'ob' is not in the sequence + 'seq'; -1 on error. + + Use __contains__ if possible, else _PySequence_IterSearch(). */ +PyAPI_FUNC(int) PySequence_Contains(PyObject *seq, PyObject *ob); + +#ifndef Py_LIMITED_API +#define PY_ITERSEARCH_COUNT 1 +#define PY_ITERSEARCH_INDEX 2 +#define PY_ITERSEARCH_CONTAINS 3 + +/* Iterate over seq. + + Result depends on the operation: + + PY_ITERSEARCH_COUNT: return # of times obj appears in seq; -1 if + error. + PY_ITERSEARCH_INDEX: return 0-based index of first occurrence of + obj in seq; set ValueError and return -1 if none found; + also return -1 on error. + PY_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on + error. */ +PyAPI_FUNC(Py_ssize_t) _PySequence_IterSearch(PyObject *seq, + PyObject *obj, int operation); +#endif + + +/* For DLL-level backwards compatibility */ +#undef PySequence_In +/* Determine if the sequence 'o' contains 'value'. If an item in 'o' is equal + to 'value', return 1, otherwise return 0. On error, return -1. + + This is equivalent to the Python expression: value in o. */ +PyAPI_FUNC(int) PySequence_In(PyObject *o, PyObject *value); + +/* For source-level backwards compatibility */ +#define PySequence_In PySequence_Contains + + +/* Return the first index for which o[i] == value. + On error, return -1. + + This is equivalent to the Python expression: o.index(value). */ +PyAPI_FUNC(Py_ssize_t) PySequence_Index(PyObject *o, PyObject *value); + + +/* --- In-place versions of some of the above Sequence functions --- */ + +/* Append sequence 'o2' to sequence 'o1', in-place when possible. Return the + resulting object, which could be 'o1', or NULL on failure. + + This is the equivalent of the Python expression: o1 += o2. */ +PyAPI_FUNC(PyObject *) PySequence_InPlaceConcat(PyObject *o1, PyObject *o2); + +/* Repeat sequence 'o' by 'count', in-place when possible. Return the resulting + object, which could be 'o', or NULL on failure. + + This is the equivalent of the Python expression: o1 *= count. */ +PyAPI_FUNC(PyObject *) PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count); + + +/* === Mapping protocol ================================================= */ + +/* Return 1 if the object provides mapping protocol, and 0 otherwise. + + This function always succeeds. */ +PyAPI_FUNC(int) PyMapping_Check(PyObject *o); + +/* Returns the number of keys in mapping object 'o' on success, and -1 on + failure. This is equivalent to the Python expression: len(o). */ +PyAPI_FUNC(Py_ssize_t) PyMapping_Size(PyObject *o); + +/* For DLL compatibility */ +#undef PyMapping_Length +PyAPI_FUNC(Py_ssize_t) PyMapping_Length(PyObject *o); +#define PyMapping_Length PyMapping_Size + + +/* Implemented as a macro: + + int PyMapping_DelItemString(PyObject *o, const char *key); + + Remove the mapping for the string 'key' from the mapping 'o'. Returns -1 on + failure. + + This is equivalent to the Python statement: del o[key]. */ +#define PyMapping_DelItemString(O,K) PyObject_DelItemString((O),(K)) + +/* Implemented as a macro: + + int PyMapping_DelItem(PyObject *o, PyObject *key); + + Remove the mapping for the object 'key' from the mapping object 'o'. + Returns -1 on failure. + + This is equivalent to the Python statement: del o[key]. */ +#define PyMapping_DelItem(O,K) PyObject_DelItem((O),(K)) + +/* On success, return 1 if the mapping object 'o' has the key 'key', + and 0 otherwise. + + This is equivalent to the Python expression: key in o. + + This function always succeeds. */ +PyAPI_FUNC(int) PyMapping_HasKeyString(PyObject *o, const char *key); + +/* Return 1 if the mapping object has the key 'key', and 0 otherwise. + + This is equivalent to the Python expression: key in o. + + This function always succeeds. */ +PyAPI_FUNC(int) PyMapping_HasKey(PyObject *o, PyObject *key); + +/* On success, return a list or tuple of the keys in mapping object 'o'. + On failure, return NULL. */ +PyAPI_FUNC(PyObject *) PyMapping_Keys(PyObject *o); + +/* On success, return a list or tuple of the values in mapping object 'o'. + On failure, return NULL. */ +PyAPI_FUNC(PyObject *) PyMapping_Values(PyObject *o); + +/* On success, return a list or tuple of the items in mapping object 'o', + where each item is a tuple containing a key-value pair. On failure, return + NULL. */ +PyAPI_FUNC(PyObject *) PyMapping_Items(PyObject *o); + +/* Return element of 'o' corresponding to the string 'key' or NULL on failure. + + This is the equivalent of the Python expression: o[key]. */ +PyAPI_FUNC(PyObject *) PyMapping_GetItemString(PyObject *o, + const char *key); + +/* Map the string 'key' to the value 'v' in the mapping 'o'. + Returns -1 on failure. + + This is the equivalent of the Python statement: o[key]=v. */ +PyAPI_FUNC(int) PyMapping_SetItemString(PyObject *o, const char *key, + PyObject *value); + +/* isinstance(object, typeorclass) */ +PyAPI_FUNC(int) PyObject_IsInstance(PyObject *object, PyObject *typeorclass); + +/* issubclass(object, typeorclass) */ +PyAPI_FUNC(int) PyObject_IsSubclass(PyObject *object, PyObject *typeorclass); + + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyObject_RealIsInstance(PyObject *inst, PyObject *cls); + +PyAPI_FUNC(int) _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls); + +PyAPI_FUNC(char *const *) _PySequence_BytesToCharpArray(PyObject* self); + +PyAPI_FUNC(void) _Py_FreeCharPArray(char *const array[]); + +/* For internal use by buffer API functions */ +PyAPI_FUNC(void) _Py_add_one_to_index_F(int nd, Py_ssize_t *index, + const Py_ssize_t *shape); +PyAPI_FUNC(void) _Py_add_one_to_index_C(int nd, Py_ssize_t *index, + const Py_ssize_t *shape); + +/* Convert Python int to Py_ssize_t. Do nothing if the argument is None. */ +PyAPI_FUNC(int) _Py_convert_optional_to_ssize_t(PyObject *, void *); +#endif /* !Py_LIMITED_API */ + + +#ifdef __cplusplus +} +#endif +#endif /* Py_ABSTRACTOBJECT_H */ diff --git a/venv/Include/accu.h b/venv/Include/accu.h new file mode 100644 index 00000000..3636ea6c --- /dev/null +++ b/venv/Include/accu.h @@ -0,0 +1,37 @@ +#ifndef Py_LIMITED_API +#ifndef Py_ACCU_H +#define Py_ACCU_H + +/*** This is a private API for use by the interpreter and the stdlib. + *** Its definition may be changed or removed at any moment. + ***/ + +/* + * A two-level accumulator of unicode objects that avoids both the overhead + * of keeping a huge number of small separate objects, and the quadratic + * behaviour of using a naive repeated concatenation scheme. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#undef small /* defined by some Windows headers */ + +typedef struct { + PyObject *large; /* A list of previously accumulated large strings */ + PyObject *small; /* Pending small strings */ +} _PyAccu; + +PyAPI_FUNC(int) _PyAccu_Init(_PyAccu *acc); +PyAPI_FUNC(int) _PyAccu_Accumulate(_PyAccu *acc, PyObject *unicode); +PyAPI_FUNC(PyObject *) _PyAccu_FinishAsList(_PyAccu *acc); +PyAPI_FUNC(PyObject *) _PyAccu_Finish(_PyAccu *acc); +PyAPI_FUNC(void) _PyAccu_Destroy(_PyAccu *acc); + +#ifdef __cplusplus +} +#endif + +#endif /* Py_ACCU_H */ +#endif /* Py_LIMITED_API */ diff --git a/venv/Include/asdl.h b/venv/Include/asdl.h new file mode 100644 index 00000000..35e9fa18 --- /dev/null +++ b/venv/Include/asdl.h @@ -0,0 +1,46 @@ +#ifndef Py_ASDL_H +#define Py_ASDL_H + +typedef PyObject * identifier; +typedef PyObject * string; +typedef PyObject * bytes; +typedef PyObject * object; +typedef PyObject * singleton; +typedef PyObject * constant; + +/* It would be nice if the code generated by asdl_c.py was completely + independent of Python, but it is a goal the requires too much work + at this stage. So, for example, I'll represent identifiers as + interned Python strings. +*/ + +/* XXX A sequence should be typed so that its use can be typechecked. */ + +typedef struct { + Py_ssize_t size; + void *elements[1]; +} asdl_seq; + +typedef struct { + Py_ssize_t size; + int elements[1]; +} asdl_int_seq; + +asdl_seq *_Py_asdl_seq_new(Py_ssize_t size, PyArena *arena); +asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena); + +#define asdl_seq_GET(S, I) (S)->elements[(I)] +#define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size) +#ifdef Py_DEBUG +#define asdl_seq_SET(S, I, V) \ + do { \ + Py_ssize_t _asdl_i = (I); \ + assert((S) != NULL); \ + assert(_asdl_i < (S)->size); \ + (S)->elements[_asdl_i] = (V); \ + } while (0) +#else +#define asdl_seq_SET(S, I, V) (S)->elements[I] = (V) +#endif + +#endif /* !Py_ASDL_H */ diff --git a/venv/Include/ast.h b/venv/Include/ast.h new file mode 100644 index 00000000..5bc2b05b --- /dev/null +++ b/venv/Include/ast.h @@ -0,0 +1,29 @@ +#ifndef Py_AST_H +#define Py_AST_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(int) PyAST_Validate(mod_ty); +PyAPI_FUNC(mod_ty) PyAST_FromNode( + const node *n, + PyCompilerFlags *flags, + const char *filename, /* decoded from the filesystem encoding */ + PyArena *arena); +PyAPI_FUNC(mod_ty) PyAST_FromNodeObject( + const node *n, + PyCompilerFlags *flags, + PyObject *filename, + PyArena *arena); + +#ifndef Py_LIMITED_API + +/* _PyAST_ExprAsUnicode is defined in ast_unparse.c */ +PyAPI_FUNC(PyObject *) _PyAST_ExprAsUnicode(expr_ty); + +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_AST_H */ diff --git a/venv/Include/bitset.h b/venv/Include/bitset.h new file mode 100644 index 00000000..b22fa778 --- /dev/null +++ b/venv/Include/bitset.h @@ -0,0 +1,32 @@ + +#ifndef Py_BITSET_H +#define Py_BITSET_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Bitset interface */ + +#define BYTE char + +typedef BYTE *bitset; + +bitset newbitset(int nbits); +void delbitset(bitset bs); +#define testbit(ss, ibit) (((ss)[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0) +int addbit(bitset bs, int ibit); /* Returns 0 if already set */ +int samebitset(bitset bs1, bitset bs2, int nbits); +void mergebitset(bitset bs1, bitset bs2, int nbits); + +#define BITSPERBYTE (8*sizeof(BYTE)) +#define NBYTES(nbits) (((nbits) + BITSPERBYTE - 1) / BITSPERBYTE) + +#define BIT2BYTE(ibit) ((ibit) / BITSPERBYTE) +#define BIT2SHIFT(ibit) ((ibit) % BITSPERBYTE) +#define BIT2MASK(ibit) (1 << BIT2SHIFT(ibit)) +#define BYTE2BIT(ibyte) ((ibyte) * BITSPERBYTE) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BITSET_H */ diff --git a/venv/Include/bltinmodule.h b/venv/Include/bltinmodule.h new file mode 100644 index 00000000..868c9e64 --- /dev/null +++ b/venv/Include/bltinmodule.h @@ -0,0 +1,14 @@ +#ifndef Py_BLTINMODULE_H +#define Py_BLTINMODULE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyFilter_Type; +PyAPI_DATA(PyTypeObject) PyMap_Type; +PyAPI_DATA(PyTypeObject) PyZip_Type; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BLTINMODULE_H */ diff --git a/venv/Include/boolobject.h b/venv/Include/boolobject.h new file mode 100644 index 00000000..7cc2f1fe --- /dev/null +++ b/venv/Include/boolobject.h @@ -0,0 +1,34 @@ +/* Boolean object interface */ + +#ifndef Py_BOOLOBJECT_H +#define Py_BOOLOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +PyAPI_DATA(PyTypeObject) PyBool_Type; + +#define PyBool_Check(x) (Py_TYPE(x) == &PyBool_Type) + +/* Py_False and Py_True are the only two bools in existence. +Don't forget to apply Py_INCREF() when returning either!!! */ + +/* Don't use these directly */ +PyAPI_DATA(struct _longobject) _Py_FalseStruct, _Py_TrueStruct; + +/* Use these macros */ +#define Py_False ((PyObject *) &_Py_FalseStruct) +#define Py_True ((PyObject *) &_Py_TrueStruct) + +/* Macros for returning Py_True or Py_False, respectively */ +#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True +#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False + +/* Function to return a bool from a C long */ +PyAPI_FUNC(PyObject *) PyBool_FromLong(long); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BOOLOBJECT_H */ diff --git a/venv/Include/bytearrayobject.h b/venv/Include/bytearrayobject.h new file mode 100644 index 00000000..a757b880 --- /dev/null +++ b/venv/Include/bytearrayobject.h @@ -0,0 +1,62 @@ +/* ByteArray object interface */ + +#ifndef Py_BYTEARRAYOBJECT_H +#define Py_BYTEARRAYOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* Type PyByteArrayObject represents a mutable array of bytes. + * The Python API is that of a sequence; + * the bytes are mapped to ints in [0, 256). + * Bytes are not characters; they may be used to encode characters. + * The only way to go between bytes and str/unicode is via encoding + * and decoding. + * For the convenience of C programmers, the bytes type is considered + * to contain a char pointer, not an unsigned char pointer. + */ + +/* Object layout */ +#ifndef Py_LIMITED_API +typedef struct { + PyObject_VAR_HEAD + Py_ssize_t ob_alloc; /* How many bytes allocated in ob_bytes */ + char *ob_bytes; /* Physical backing buffer */ + char *ob_start; /* Logical start inside ob_bytes */ + /* XXX(nnorwitz): should ob_exports be Py_ssize_t? */ + int ob_exports; /* How many buffer exports */ +} PyByteArrayObject; +#endif + +/* Type object */ +PyAPI_DATA(PyTypeObject) PyByteArray_Type; +PyAPI_DATA(PyTypeObject) PyByteArrayIter_Type; + +/* Type check macros */ +#define PyByteArray_Check(self) PyObject_TypeCheck(self, &PyByteArray_Type) +#define PyByteArray_CheckExact(self) (Py_TYPE(self) == &PyByteArray_Type) + +/* Direct API functions */ +PyAPI_FUNC(PyObject *) PyByteArray_FromObject(PyObject *); +PyAPI_FUNC(PyObject *) PyByteArray_Concat(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyByteArray_FromStringAndSize(const char *, Py_ssize_t); +PyAPI_FUNC(Py_ssize_t) PyByteArray_Size(PyObject *); +PyAPI_FUNC(char *) PyByteArray_AsString(PyObject *); +PyAPI_FUNC(int) PyByteArray_Resize(PyObject *, Py_ssize_t); + +/* Macros, trading safety for speed */ +#ifndef Py_LIMITED_API +#define PyByteArray_AS_STRING(self) \ + (assert(PyByteArray_Check(self)), \ + Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_start : _PyByteArray_empty_string) +#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)), Py_SIZE(self)) + +PyAPI_DATA(char) _PyByteArray_empty_string[]; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BYTEARRAYOBJECT_H */ diff --git a/venv/Include/bytes_methods.h b/venv/Include/bytes_methods.h new file mode 100644 index 00000000..8434a50a --- /dev/null +++ b/venv/Include/bytes_methods.h @@ -0,0 +1,69 @@ +#ifndef Py_LIMITED_API +#ifndef Py_BYTES_CTYPE_H +#define Py_BYTES_CTYPE_H + +/* + * The internal implementation behind PyBytes (bytes) and PyByteArray (bytearray) + * methods of the given names, they operate on ASCII byte strings. + */ +extern PyObject* _Py_bytes_isspace(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isalpha(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isalnum(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isascii(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isdigit(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_islower(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isupper(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_istitle(const char *cptr, Py_ssize_t len); + +/* These store their len sized answer in the given preallocated *result arg. */ +extern void _Py_bytes_lower(char *result, const char *cptr, Py_ssize_t len); +extern void _Py_bytes_upper(char *result, const char *cptr, Py_ssize_t len); +extern void _Py_bytes_title(char *result, const char *s, Py_ssize_t len); +extern void _Py_bytes_capitalize(char *result, const char *s, Py_ssize_t len); +extern void _Py_bytes_swapcase(char *result, const char *s, Py_ssize_t len); + +extern PyObject *_Py_bytes_find(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_index(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_rfind(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_rindex(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_count(const char *str, Py_ssize_t len, PyObject *args); +extern int _Py_bytes_contains(const char *str, Py_ssize_t len, PyObject *arg); +extern PyObject *_Py_bytes_startswith(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_endswith(const char *str, Py_ssize_t len, PyObject *args); + +/* The maketrans() static method. */ +extern PyObject* _Py_bytes_maketrans(Py_buffer *frm, Py_buffer *to); + +/* Shared __doc__ strings. */ +extern const char _Py_isspace__doc__[]; +extern const char _Py_isalpha__doc__[]; +extern const char _Py_isalnum__doc__[]; +extern const char _Py_isascii__doc__[]; +extern const char _Py_isdigit__doc__[]; +extern const char _Py_islower__doc__[]; +extern const char _Py_isupper__doc__[]; +extern const char _Py_istitle__doc__[]; +extern const char _Py_lower__doc__[]; +extern const char _Py_upper__doc__[]; +extern const char _Py_title__doc__[]; +extern const char _Py_capitalize__doc__[]; +extern const char _Py_swapcase__doc__[]; +extern const char _Py_count__doc__[]; +extern const char _Py_find__doc__[]; +extern const char _Py_index__doc__[]; +extern const char _Py_rfind__doc__[]; +extern const char _Py_rindex__doc__[]; +extern const char _Py_startswith__doc__[]; +extern const char _Py_endswith__doc__[]; +extern const char _Py_maketrans__doc__[]; +extern const char _Py_expandtabs__doc__[]; +extern const char _Py_ljust__doc__[]; +extern const char _Py_rjust__doc__[]; +extern const char _Py_center__doc__[]; +extern const char _Py_zfill__doc__[]; + +/* this is needed because some docs are shared from the .o, not static */ +#define PyDoc_STRVAR_shared(name,str) const char name[] = PyDoc_STR(str) + +#endif /* !Py_BYTES_CTYPE_H */ +#endif /* !Py_LIMITED_API */ diff --git a/venv/Include/bytesobject.h b/venv/Include/bytesobject.h new file mode 100644 index 00000000..3fde4a22 --- /dev/null +++ b/venv/Include/bytesobject.h @@ -0,0 +1,224 @@ + +/* Bytes (String) object interface */ + +#ifndef Py_BYTESOBJECT_H +#define Py_BYTESOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* +Type PyBytesObject represents a character string. An extra zero byte is +reserved at the end to ensure it is zero-terminated, but a size is +present so strings with null bytes in them can be represented. This +is an immutable object type. + +There are functions to create new string objects, to test +an object for string-ness, and to get the +string value. The latter function returns a null pointer +if the object is not of the proper type. +There is a variant that takes an explicit size as well as a +variant that assumes a zero-terminated string. Note that none of the +functions should be applied to nil objects. +*/ + +/* Caching the hash (ob_shash) saves recalculation of a string's hash value. + This significantly speeds up dict lookups. */ + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_VAR_HEAD + Py_hash_t ob_shash; + char ob_sval[1]; + + /* Invariants: + * ob_sval contains space for 'ob_size+1' elements. + * ob_sval[ob_size] == 0. + * ob_shash is the hash of the string or -1 if not computed yet. + */ +} PyBytesObject; +#endif + +PyAPI_DATA(PyTypeObject) PyBytes_Type; +PyAPI_DATA(PyTypeObject) PyBytesIter_Type; + +#define PyBytes_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_BYTES_SUBCLASS) +#define PyBytes_CheckExact(op) (Py_TYPE(op) == &PyBytes_Type) + +PyAPI_FUNC(PyObject *) PyBytes_FromStringAndSize(const char *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyBytes_FromString(const char *); +PyAPI_FUNC(PyObject *) PyBytes_FromObject(PyObject *); +PyAPI_FUNC(PyObject *) PyBytes_FromFormatV(const char*, va_list) + Py_GCC_ATTRIBUTE((format(printf, 1, 0))); +PyAPI_FUNC(PyObject *) PyBytes_FromFormat(const char*, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(Py_ssize_t) PyBytes_Size(PyObject *); +PyAPI_FUNC(char *) PyBytes_AsString(PyObject *); +PyAPI_FUNC(PyObject *) PyBytes_Repr(PyObject *, int); +PyAPI_FUNC(void) PyBytes_Concat(PyObject **, PyObject *); +PyAPI_FUNC(void) PyBytes_ConcatAndDel(PyObject **, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t); +PyAPI_FUNC(PyObject*) _PyBytes_FormatEx( + const char *format, + Py_ssize_t format_len, + PyObject *args, + int use_bytearray); +PyAPI_FUNC(PyObject*) _PyBytes_FromHex( + PyObject *string, + int use_bytearray); +#endif +PyAPI_FUNC(PyObject *) PyBytes_DecodeEscape(const char *, Py_ssize_t, + const char *, Py_ssize_t, + const char *); +#ifndef Py_LIMITED_API +/* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */ +PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t, + const char *, Py_ssize_t, + const char *, + const char **); +#endif + +/* Macro, trading safety for speed */ +#ifndef Py_LIMITED_API +#define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \ + (((PyBytesObject *)(op))->ob_sval)) +#define PyBytes_GET_SIZE(op) (assert(PyBytes_Check(op)),Py_SIZE(op)) +#endif + +/* _PyBytes_Join(sep, x) is like sep.join(x). sep must be PyBytesObject*, + x must be an iterable object. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x); +#endif + +/* Provides access to the internal data buffer and size of a string + object or the default encoded version of a Unicode object. Passing + NULL as *len parameter will force the string buffer to be + 0-terminated (passing a string with embedded NULL characters will + cause an exception). */ +PyAPI_FUNC(int) PyBytes_AsStringAndSize( + PyObject *obj, /* string or Unicode object */ + char **s, /* pointer to buffer variable */ + Py_ssize_t *len /* pointer to length variable or NULL + (only possible for 0-terminated + strings) */ + ); + +/* Using the current locale, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGroupingLocale(char *buffer, + Py_ssize_t n_buffer, + char *digits, + Py_ssize_t n_digits, + Py_ssize_t min_width); + +/* Using explicit passed-in values, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGrouping(char *buffer, + Py_ssize_t n_buffer, + char *digits, + Py_ssize_t n_digits, + Py_ssize_t min_width, + const char *grouping, + const char *thousands_sep); +#endif + +/* Flags used by string formatting */ +#define F_LJUST (1<<0) +#define F_SIGN (1<<1) +#define F_BLANK (1<<2) +#define F_ALT (1<<3) +#define F_ZERO (1<<4) + +#ifndef Py_LIMITED_API +/* The _PyBytesWriter structure is big: it contains an embedded "stack buffer". + A _PyBytesWriter variable must be declared at the end of variables in a + function to optimize the memory allocation on the stack. */ +typedef struct { + /* bytes, bytearray or NULL (when the small buffer is used) */ + PyObject *buffer; + + /* Number of allocated size. */ + Py_ssize_t allocated; + + /* Minimum number of allocated bytes, + incremented by _PyBytesWriter_Prepare() */ + Py_ssize_t min_size; + + /* If non-zero, use a bytearray instead of a bytes object for buffer. */ + int use_bytearray; + + /* If non-zero, overallocate the buffer (default: 0). + This flag must be zero if use_bytearray is non-zero. */ + int overallocate; + + /* Stack buffer */ + int use_small_buffer; + char small_buffer[512]; +} _PyBytesWriter; + +/* Initialize a bytes writer + + By default, the overallocation is disabled. Set the overallocate attribute + to control the allocation of the buffer. */ +PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer); + +/* Get the buffer content and reset the writer. + Return a bytes object, or a bytearray object if use_bytearray is non-zero. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer, + void *str); + +/* Deallocate memory of a writer (clear its internal buffer). */ +PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer); + +/* Allocate the buffer to write size bytes. + Return the pointer to the beginning of buffer data. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer, + Py_ssize_t size); + +/* Ensure that the buffer is large enough to write *size* bytes. + Add size to the writer minimum size (min_size attribute). + + str is the current pointer inside the buffer. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Resize the buffer to make it larger. + The new buffer may be larger than size bytes because of overallocation. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. + + Note: size must be greater than the number of allocated bytes in the writer. + + This function doesn't use the writer minimum size (min_size attribute). + + See also _PyBytesWriter_Prepare(). + */ +PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Write bytes. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer, + void *str, + const void *bytes, + Py_ssize_t size); +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BYTESOBJECT_H */ diff --git a/venv/Include/cellobject.h b/venv/Include/cellobject.h new file mode 100644 index 00000000..2f9b5b75 --- /dev/null +++ b/venv/Include/cellobject.h @@ -0,0 +1,29 @@ +/* Cell object interface */ +#ifndef Py_LIMITED_API +#ifndef Py_CELLOBJECT_H +#define Py_CELLOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + PyObject *ob_ref; /* Content of the cell or NULL when empty */ +} PyCellObject; + +PyAPI_DATA(PyTypeObject) PyCell_Type; + +#define PyCell_Check(op) (Py_TYPE(op) == &PyCell_Type) + +PyAPI_FUNC(PyObject *) PyCell_New(PyObject *); +PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *); +PyAPI_FUNC(int) PyCell_Set(PyObject *, PyObject *); + +#define PyCell_GET(op) (((PyCellObject *)(op))->ob_ref) +#define PyCell_SET(op, v) (((PyCellObject *)(op))->ob_ref = v) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TUPLEOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/venv/Include/ceval.h b/venv/Include/ceval.h new file mode 100644 index 00000000..bce8a0be --- /dev/null +++ b/venv/Include/ceval.h @@ -0,0 +1,237 @@ +#ifndef Py_CEVAL_H +#define Py_CEVAL_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Interface to random parts in ceval.c */ + +/* PyEval_CallObjectWithKeywords(), PyEval_CallObject(), PyEval_CallFunction + * and PyEval_CallMethod are kept for backward compatibility: PyObject_Call(), + * PyObject_CallFunction() and PyObject_CallMethod() are recommended to call + * a callable object. + */ + +PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords( + PyObject *callable, + PyObject *args, + PyObject *kwargs); + +/* Inline this */ +#define PyEval_CallObject(callable, arg) \ + PyEval_CallObjectWithKeywords(callable, arg, (PyObject *)NULL) + +PyAPI_FUNC(PyObject *) PyEval_CallFunction(PyObject *callable, + const char *format, ...); +PyAPI_FUNC(PyObject *) PyEval_CallMethod(PyObject *obj, + const char *name, + const char *format, ...); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); +PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); +PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth(int new_depth); +PyAPI_FUNC(int) _PyEval_GetCoroutineOriginTrackingDepth(void); +PyAPI_FUNC(void) _PyEval_SetCoroutineWrapper(PyObject *); +PyAPI_FUNC(PyObject *) _PyEval_GetCoroutineWrapper(void); +PyAPI_FUNC(void) _PyEval_SetAsyncGenFirstiter(PyObject *); +PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFirstiter(void); +PyAPI_FUNC(void) _PyEval_SetAsyncGenFinalizer(PyObject *); +PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFinalizer(void); +#endif + +struct _frame; /* Avoid including frameobject.h */ + +PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void); +PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void); +PyAPI_FUNC(PyObject *) PyEval_GetLocals(void); +PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void); + +/* Look at the current frame's (if any) code's co_flags, and turn on + the corresponding compiler flags in cf->cf_flags. Return 1 if any + flag was set, else return 0. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf); +#endif + +PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg); +PyAPI_FUNC(void) _PyEval_SignalReceived(void); +PyAPI_FUNC(int) Py_MakePendingCalls(void); + +/* Protection against deeply nested recursive calls + + In Python 3.0, this protection has two levels: + * normal anti-recursion protection is triggered when the recursion level + exceeds the current recursion limit. It raises a RecursionError, and sets + the "overflowed" flag in the thread state structure. This flag + temporarily *disables* the normal protection; this allows cleanup code + to potentially outgrow the recursion limit while processing the + RecursionError. + * "last chance" anti-recursion protection is triggered when the recursion + level exceeds "current recursion limit + 50". By construction, this + protection can only be triggered when the "overflowed" flag is set. It + means the cleanup code has itself gone into an infinite loop, or the + RecursionError has been mistakingly ignored. When this protection is + triggered, the interpreter aborts with a Fatal Error. + + In addition, the "overflowed" flag is automatically reset when the + recursion level drops below "current recursion limit - 50". This heuristic + is meant to ensure that the normal anti-recursion protection doesn't get + disabled too long. + + Please note: this scheme has its own limitations. See: + http://mail.python.org/pipermail/python-dev/2008-August/082106.html + for some observations. +*/ +PyAPI_FUNC(void) Py_SetRecursionLimit(int); +PyAPI_FUNC(int) Py_GetRecursionLimit(void); + +#define Py_EnterRecursiveCall(where) \ + (_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) && \ + _Py_CheckRecursiveCall(where)) +#define Py_LeaveRecursiveCall() \ + do{ if(_Py_MakeEndRecCheck(PyThreadState_GET()->recursion_depth)) \ + PyThreadState_GET()->overflowed = 0; \ + } while(0) +PyAPI_FUNC(int) _Py_CheckRecursiveCall(const char *where); + +/* Due to the macros in which it's used, _Py_CheckRecursionLimit is in + the stable ABI. It should be removed therefrom when possible. +*/ +PyAPI_DATA(int) _Py_CheckRecursionLimit; + +#ifdef USE_STACKCHECK +/* With USE_STACKCHECK, trigger stack checks in _Py_CheckRecursiveCall() + on every 64th call to Py_EnterRecursiveCall. +*/ +# define _Py_MakeRecCheck(x) \ + (++(x) > _Py_CheckRecursionLimit || \ + ++(PyThreadState_GET()->stackcheck_counter) > 64) +#else +# define _Py_MakeRecCheck(x) (++(x) > _Py_CheckRecursionLimit) +#endif + +/* Compute the "lower-water mark" for a recursion limit. When + * Py_LeaveRecursiveCall() is called with a recursion depth below this mark, + * the overflowed flag is reset to 0. */ +#define _Py_RecursionLimitLowerWaterMark(limit) \ + (((limit) > 200) \ + ? ((limit) - 50) \ + : (3 * ((limit) >> 2))) + +#define _Py_MakeEndRecCheck(x) \ + (--(x) < _Py_RecursionLimitLowerWaterMark(_Py_CheckRecursionLimit)) + +#define Py_ALLOW_RECURSION \ + do { unsigned char _old = PyThreadState_GET()->recursion_critical;\ + PyThreadState_GET()->recursion_critical = 1; + +#define Py_END_ALLOW_RECURSION \ + PyThreadState_GET()->recursion_critical = _old; \ + } while(0); + +PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *); +PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *); + +PyAPI_FUNC(PyObject *) PyEval_EvalFrame(struct _frame *); +PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(struct _frame *f, int exc); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyEval_EvalFrameDefault(struct _frame *f, int exc); +#endif + +/* Interface for threads. + + A module that plans to do a blocking system call (or something else + that lasts a long time and doesn't touch Python data) can allow other + threads to run as follows: + + ...preparations here... + Py_BEGIN_ALLOW_THREADS + ...blocking system call here... + Py_END_ALLOW_THREADS + ...interpret result here... + + The Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS pair expands to a + {}-surrounded block. + To leave the block in the middle (e.g., with return), you must insert + a line containing Py_BLOCK_THREADS before the return, e.g. + + if (...premature_exit...) { + Py_BLOCK_THREADS + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } + + An alternative is: + + Py_BLOCK_THREADS + if (...premature_exit...) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } + Py_UNBLOCK_THREADS + + For convenience, that the value of 'errno' is restored across + Py_END_ALLOW_THREADS and Py_BLOCK_THREADS. + + WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND + Py_END_ALLOW_THREADS!!! + + The function PyEval_InitThreads() should be called only from + init_thread() in "_threadmodule.c". + + Note that not yet all candidates have been converted to use this + mechanism! +*/ + +PyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void); +PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *); + +PyAPI_FUNC(int) PyEval_ThreadsInitialized(void); +PyAPI_FUNC(void) PyEval_InitThreads(void); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyEval_FiniThreads(void); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(void) PyEval_AcquireLock(void) Py_DEPRECATED(3.2); +PyAPI_FUNC(void) PyEval_ReleaseLock(void) /* Py_DEPRECATED(3.2) */; +PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate); +PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate); +PyAPI_FUNC(void) PyEval_ReInitThreads(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyEval_SetSwitchInterval(unsigned long microseconds); +PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void); +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); +#endif + +#define Py_BEGIN_ALLOW_THREADS { \ + PyThreadState *_save; \ + _save = PyEval_SaveThread(); +#define Py_BLOCK_THREADS PyEval_RestoreThread(_save); +#define Py_UNBLOCK_THREADS _save = PyEval_SaveThread(); +#define Py_END_ALLOW_THREADS PyEval_RestoreThread(_save); \ + } + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); +PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void); +#endif + +/* Masks and values used by FORMAT_VALUE opcode. */ +#define FVC_MASK 0x3 +#define FVC_NONE 0x0 +#define FVC_STR 0x1 +#define FVC_REPR 0x2 +#define FVC_ASCII 0x3 +#define FVS_MASK 0x4 +#define FVS_HAVE_SPEC 0x4 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CEVAL_H */ diff --git a/venv/Include/classobject.h b/venv/Include/classobject.h new file mode 100644 index 00000000..209f0f4a --- /dev/null +++ b/venv/Include/classobject.h @@ -0,0 +1,58 @@ +/* Former class object interface -- now only bound methods are here */ + +/* Revealing some structures (not for general use) */ + +#ifndef Py_LIMITED_API +#ifndef Py_CLASSOBJECT_H +#define Py_CLASSOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + PyObject *im_func; /* The callable object implementing the method */ + PyObject *im_self; /* The instance it is bound to */ + PyObject *im_weakreflist; /* List of weak references */ +} PyMethodObject; + +PyAPI_DATA(PyTypeObject) PyMethod_Type; + +#define PyMethod_Check(op) ((op)->ob_type == &PyMethod_Type) + +PyAPI_FUNC(PyObject *) PyMethod_New(PyObject *, PyObject *); + +PyAPI_FUNC(PyObject *) PyMethod_Function(PyObject *); +PyAPI_FUNC(PyObject *) PyMethod_Self(PyObject *); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyMethod_GET_FUNCTION(meth) \ + (((PyMethodObject *)meth) -> im_func) +#define PyMethod_GET_SELF(meth) \ + (((PyMethodObject *)meth) -> im_self) + +PyAPI_FUNC(int) PyMethod_ClearFreeList(void); + +typedef struct { + PyObject_HEAD + PyObject *func; +} PyInstanceMethodObject; + +PyAPI_DATA(PyTypeObject) PyInstanceMethod_Type; + +#define PyInstanceMethod_Check(op) ((op)->ob_type == &PyInstanceMethod_Type) + +PyAPI_FUNC(PyObject *) PyInstanceMethod_New(PyObject *); +PyAPI_FUNC(PyObject *) PyInstanceMethod_Function(PyObject *); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyInstanceMethod_GET_FUNCTION(meth) \ + (((PyInstanceMethodObject *)meth) -> func) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CLASSOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/venv/Include/code.h b/venv/Include/code.h new file mode 100644 index 00000000..2e661e8b --- /dev/null +++ b/venv/Include/code.h @@ -0,0 +1,157 @@ +/* Definitions for bytecode */ + +#ifndef Py_LIMITED_API +#ifndef Py_CODE_H +#define Py_CODE_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef uint16_t _Py_CODEUNIT; + +#ifdef WORDS_BIGENDIAN +# define _Py_OPCODE(word) ((word) >> 8) +# define _Py_OPARG(word) ((word) & 255) +#else +# define _Py_OPCODE(word) ((word) & 255) +# define _Py_OPARG(word) ((word) >> 8) +#endif + +/* Bytecode object */ +typedef struct { + PyObject_HEAD + int co_argcount; /* #arguments, except *args */ + int co_kwonlyargcount; /* #keyword only arguments */ + int co_nlocals; /* #local variables */ + int co_stacksize; /* #entries needed for evaluation stack */ + int co_flags; /* CO_..., see below */ + int co_firstlineno; /* first source line number */ + PyObject *co_code; /* instruction opcodes */ + PyObject *co_consts; /* list (constants used) */ + PyObject *co_names; /* list of strings (names used) */ + PyObject *co_varnames; /* tuple of strings (local variable names) */ + PyObject *co_freevars; /* tuple of strings (free variable names) */ + PyObject *co_cellvars; /* tuple of strings (cell variable names) */ + /* The rest aren't used in either hash or comparisons, except for co_name, + used in both. This is done to preserve the name and line number + for tracebacks and debuggers; otherwise, constant de-duplication + would collapse identical functions/lambdas defined on different lines. + */ + Py_ssize_t *co_cell2arg; /* Maps cell vars which are arguments. */ + PyObject *co_filename; /* unicode (where it was loaded from) */ + PyObject *co_name; /* unicode (name, for reference) */ + PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See + Objects/lnotab_notes.txt for details. */ + void *co_zombieframe; /* for optimization only (see frameobject.c) */ + PyObject *co_weakreflist; /* to support weakrefs to code objects */ + /* Scratch space for extra data relating to the code object. + Type is a void* to keep the format private in codeobject.c to force + people to go through the proper APIs. */ + void *co_extra; +} PyCodeObject; + +/* Masks for co_flags above */ +#define CO_OPTIMIZED 0x0001 +#define CO_NEWLOCALS 0x0002 +#define CO_VARARGS 0x0004 +#define CO_VARKEYWORDS 0x0008 +#define CO_NESTED 0x0010 +#define CO_GENERATOR 0x0020 +/* The CO_NOFREE flag is set if there are no free or cell variables. + This information is redundant, but it allows a single flag test + to determine whether there is any extra work to be done when the + call frame it setup. +*/ +#define CO_NOFREE 0x0040 + +/* The CO_COROUTINE flag is set for coroutine functions (defined with + ``async def`` keywords) */ +#define CO_COROUTINE 0x0080 +#define CO_ITERABLE_COROUTINE 0x0100 +#define CO_ASYNC_GENERATOR 0x0200 + +/* These are no longer used. */ +#if 0 +#define CO_GENERATOR_ALLOWED 0x1000 +#endif +#define CO_FUTURE_DIVISION 0x2000 +#define CO_FUTURE_ABSOLUTE_IMPORT 0x4000 /* do absolute imports by default */ +#define CO_FUTURE_WITH_STATEMENT 0x8000 +#define CO_FUTURE_PRINT_FUNCTION 0x10000 +#define CO_FUTURE_UNICODE_LITERALS 0x20000 + +#define CO_FUTURE_BARRY_AS_BDFL 0x40000 +#define CO_FUTURE_GENERATOR_STOP 0x80000 +#define CO_FUTURE_ANNOTATIONS 0x100000 + +/* This value is found in the co_cell2arg array when the associated cell + variable does not correspond to an argument. */ +#define CO_CELL_NOT_AN_ARG (-1) + +/* This should be defined if a future statement modifies the syntax. + For example, when a keyword is added. +*/ +#define PY_PARSER_REQUIRES_FUTURE_KEYWORD + +#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */ + +PyAPI_DATA(PyTypeObject) PyCode_Type; + +#define PyCode_Check(op) (Py_TYPE(op) == &PyCode_Type) +#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars)) + +/* Public interface */ +PyAPI_FUNC(PyCodeObject *) PyCode_New( + int, int, int, int, int, PyObject *, PyObject *, + PyObject *, PyObject *, PyObject *, PyObject *, + PyObject *, PyObject *, int, PyObject *); + /* same as struct above */ + +/* Creates a new empty code object with the specified source location. */ +PyAPI_FUNC(PyCodeObject *) +PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno); + +/* Return the line number associated with the specified bytecode index + in this code object. If you just need the line number of a frame, + use PyFrame_GetLineNumber() instead. */ +PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int); + +/* for internal use only */ +typedef struct _addr_pair { + int ap_lower; + int ap_upper; +} PyAddrPair; + +#ifndef Py_LIMITED_API +/* Update *bounds to describe the first and one-past-the-last instructions in the + same line as lasti. Return the number of that line. +*/ +PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co, + int lasti, PyAddrPair *bounds); + +/* Create a comparable key used to compare constants taking in account the + * object type. It is used to make sure types are not coerced (e.g., float and + * complex) _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms + * + * Return (type(obj), obj, ...): a tuple with variable size (at least 2 items) + * depending on the type and the value. The type is the first item to not + * compare bytes and str which can raise a BytesWarning exception. */ +PyAPI_FUNC(PyObject*) _PyCode_ConstantKey(PyObject *obj); +#endif + +PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts, + PyObject *names, PyObject *lnotab); + + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index, + void **extra); +PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index, + void *extra); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CODE_H */ +#endif /* Py_LIMITED_API */ diff --git a/venv/Include/codecs.h b/venv/Include/codecs.h new file mode 100644 index 00000000..3ad0f2b5 --- /dev/null +++ b/venv/Include/codecs.h @@ -0,0 +1,240 @@ +#ifndef Py_CODECREGISTRY_H +#define Py_CODECREGISTRY_H +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------ + + Python Codec Registry and support functions + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +Copyright (c) Corporation for National Research Initiatives. + + ------------------------------------------------------------------------ */ + +/* Register a new codec search function. + + As side effect, this tries to load the encodings package, if not + yet done, to make sure that it is always first in the list of + search functions. + + The search_function's refcount is incremented by this function. */ + +PyAPI_FUNC(int) PyCodec_Register( + PyObject *search_function + ); + +/* Codec registry lookup API. + + Looks up the given encoding and returns a CodecInfo object with + function attributes which implement the different aspects of + processing the encoding. + + The encoding string is looked up converted to all lower-case + characters. This makes encodings looked up through this mechanism + effectively case-insensitive. + + If no codec is found, a KeyError is set and NULL returned. + + As side effect, this tries to load the encodings package, if not + yet done. This is part of the lazy load strategy for the encodings + package. + + */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyCodec_Lookup( + const char *encoding + ); + +PyAPI_FUNC(int) _PyCodec_Forget( + const char *encoding + ); +#endif + +/* Codec registry encoding check API. + + Returns 1/0 depending on whether there is a registered codec for + the given encoding. + +*/ + +PyAPI_FUNC(int) PyCodec_KnownEncoding( + const char *encoding + ); + +/* Generic codec based encoding API. + + object is passed through the encoder function found for the given + encoding using the error handling method defined by errors. errors + may be NULL to use the default method defined for the codec. + + Raises a LookupError in case no encoder can be found. + + */ + +PyAPI_FUNC(PyObject *) PyCodec_Encode( + PyObject *object, + const char *encoding, + const char *errors + ); + +/* Generic codec based decoding API. + + object is passed through the decoder function found for the given + encoding using the error handling method defined by errors. errors + may be NULL to use the default method defined for the codec. + + Raises a LookupError in case no encoder can be found. + + */ + +PyAPI_FUNC(PyObject *) PyCodec_Decode( + PyObject *object, + const char *encoding, + const char *errors + ); + +#ifndef Py_LIMITED_API +/* Text codec specific encoding and decoding API. + + Checks the encoding against a list of codecs which do not + implement a str<->bytes encoding before attempting the + operation. + + Please note that these APIs are internal and should not + be used in Python C extensions. + + XXX (ncoghlan): should we make these, or something like them, public + in Python 3.5+? + + */ +PyAPI_FUNC(PyObject *) _PyCodec_LookupTextEncoding( + const char *encoding, + const char *alternate_command + ); + +PyAPI_FUNC(PyObject *) _PyCodec_EncodeText( + PyObject *object, + const char *encoding, + const char *errors + ); + +PyAPI_FUNC(PyObject *) _PyCodec_DecodeText( + PyObject *object, + const char *encoding, + const char *errors + ); + +/* These two aren't actually text encoding specific, but _io.TextIOWrapper + * is the only current API consumer. + */ +PyAPI_FUNC(PyObject *) _PyCodecInfo_GetIncrementalDecoder( + PyObject *codec_info, + const char *errors + ); + +PyAPI_FUNC(PyObject *) _PyCodecInfo_GetIncrementalEncoder( + PyObject *codec_info, + const char *errors + ); +#endif + + + +/* --- Codec Lookup APIs -------------------------------------------------- + + All APIs return a codec object with incremented refcount and are + based on _PyCodec_Lookup(). The same comments w/r to the encoding + name also apply to these APIs. + +*/ + +/* Get an encoder function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_Encoder( + const char *encoding + ); + +/* Get a decoder function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_Decoder( + const char *encoding + ); + +/* Get an IncrementalEncoder object for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_IncrementalEncoder( + const char *encoding, + const char *errors + ); + +/* Get an IncrementalDecoder object function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_IncrementalDecoder( + const char *encoding, + const char *errors + ); + +/* Get a StreamReader factory function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_StreamReader( + const char *encoding, + PyObject *stream, + const char *errors + ); + +/* Get a StreamWriter factory function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_StreamWriter( + const char *encoding, + PyObject *stream, + const char *errors + ); + +/* Unicode encoding error handling callback registry API */ + +/* Register the error handling callback function error under the given + name. This function will be called by the codec when it encounters + unencodable characters/undecodable bytes and doesn't know the + callback name, when name is specified as the error parameter + in the call to the encode/decode function. + Return 0 on success, -1 on error */ +PyAPI_FUNC(int) PyCodec_RegisterError(const char *name, PyObject *error); + +/* Lookup the error handling callback function registered under the given + name. As a special case NULL can be passed, in which case + the error handling callback for "strict" will be returned. */ +PyAPI_FUNC(PyObject *) PyCodec_LookupError(const char *name); + +/* raise exc as an exception */ +PyAPI_FUNC(PyObject *) PyCodec_StrictErrors(PyObject *exc); + +/* ignore the unicode error, skipping the faulty input */ +PyAPI_FUNC(PyObject *) PyCodec_IgnoreErrors(PyObject *exc); + +/* replace the unicode encode error with ? or U+FFFD */ +PyAPI_FUNC(PyObject *) PyCodec_ReplaceErrors(PyObject *exc); + +/* replace the unicode encode error with XML character references */ +PyAPI_FUNC(PyObject *) PyCodec_XMLCharRefReplaceErrors(PyObject *exc); + +/* replace the unicode encode error with backslash escapes (\x, \u and \U) */ +PyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* replace the unicode encode error with backslash escapes (\N, \x, \u and \U) */ +PyAPI_FUNC(PyObject *) PyCodec_NameReplaceErrors(PyObject *exc); +#endif + +#ifndef Py_LIMITED_API +PyAPI_DATA(const char *) Py_hexdigits; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CODECREGISTRY_H */ diff --git a/venv/Include/compile.h b/venv/Include/compile.h new file mode 100644 index 00000000..edb961f4 --- /dev/null +++ b/venv/Include/compile.h @@ -0,0 +1,93 @@ +#ifndef Py_COMPILE_H +#define Py_COMPILE_H + +#ifndef Py_LIMITED_API +#include "code.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Public interface */ +struct _node; /* Declare the existence of this type */ +PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); +/* XXX (ncoghlan): Unprefixed type name in a public API! */ + +#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | \ + CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | \ + CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | \ + CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS) +#define PyCF_MASK_OBSOLETE (CO_NESTED) +#define PyCF_SOURCE_IS_UTF8 0x0100 +#define PyCF_DONT_IMPLY_DEDENT 0x0200 +#define PyCF_ONLY_AST 0x0400 +#define PyCF_IGNORE_COOKIE 0x0800 + +#ifndef Py_LIMITED_API +typedef struct { + int cf_flags; /* bitmask of CO_xxx flags relevant to future */ +} PyCompilerFlags; +#endif + +/* Future feature support */ + +typedef struct { + int ff_features; /* flags set by future statements */ + int ff_lineno; /* line number of last future statement */ +} PyFutureFeatures; + +#define FUTURE_NESTED_SCOPES "nested_scopes" +#define FUTURE_GENERATORS "generators" +#define FUTURE_DIVISION "division" +#define FUTURE_ABSOLUTE_IMPORT "absolute_import" +#define FUTURE_WITH_STATEMENT "with_statement" +#define FUTURE_PRINT_FUNCTION "print_function" +#define FUTURE_UNICODE_LITERALS "unicode_literals" +#define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL" +#define FUTURE_GENERATOR_STOP "generator_stop" +#define FUTURE_ANNOTATIONS "annotations" + +struct _mod; /* Declare the existence of this type */ +#define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar) +PyAPI_FUNC(PyCodeObject *) PyAST_CompileEx( + struct _mod *mod, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags, + int optimize, + PyArena *arena); +PyAPI_FUNC(PyCodeObject *) PyAST_CompileObject( + struct _mod *mod, + PyObject *filename, + PyCompilerFlags *flags, + int optimize, + PyArena *arena); +PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST( + struct _mod * mod, + const char *filename /* decoded from the filesystem encoding */ + ); +PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromASTObject( + struct _mod * mod, + PyObject *filename + ); + +/* _Py_Mangle is defined in compile.c */ +PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); + +#define PY_INVALID_STACK_EFFECT INT_MAX +PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg); + +PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, int optimize); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_LIMITED_API */ + +/* These definitions must match corresponding definitions in graminit.h. + There's code in compile.c that checks that they are the same. */ +#define Py_single_input 256 +#define Py_file_input 257 +#define Py_eval_input 258 + +#endif /* !Py_COMPILE_H */ diff --git a/venv/Include/complexobject.h b/venv/Include/complexobject.h new file mode 100644 index 00000000..cb8c52c5 --- /dev/null +++ b/venv/Include/complexobject.h @@ -0,0 +1,69 @@ +/* Complex number structure */ + +#ifndef Py_COMPLEXOBJECT_H +#define Py_COMPLEXOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +typedef struct { + double real; + double imag; +} Py_complex; + +/* Operations on complex numbers from complexmodule.c */ + +PyAPI_FUNC(Py_complex) _Py_c_sum(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_diff(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_neg(Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_prod(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_quot(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_pow(Py_complex, Py_complex); +PyAPI_FUNC(double) _Py_c_abs(Py_complex); +#endif + +/* Complex object interface */ + +/* +PyComplexObject represents a complex number with double-precision +real and imaginary parts. +*/ +#ifndef Py_LIMITED_API +typedef struct { + PyObject_HEAD + Py_complex cval; +} PyComplexObject; +#endif + +PyAPI_DATA(PyTypeObject) PyComplex_Type; + +#define PyComplex_Check(op) PyObject_TypeCheck(op, &PyComplex_Type) +#define PyComplex_CheckExact(op) (Py_TYPE(op) == &PyComplex_Type) + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyComplex_FromCComplex(Py_complex); +#endif +PyAPI_FUNC(PyObject *) PyComplex_FromDoubles(double real, double imag); + +PyAPI_FUNC(double) PyComplex_RealAsDouble(PyObject *op); +PyAPI_FUNC(double) PyComplex_ImagAsDouble(PyObject *op); +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_complex) PyComplex_AsCComplex(PyObject *op); +#endif + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyComplex_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_COMPLEXOBJECT_H */ diff --git a/venv/Include/context.h b/venv/Include/context.h new file mode 100644 index 00000000..8b9f1292 --- /dev/null +++ b/venv/Include/context.h @@ -0,0 +1,86 @@ +#ifndef Py_CONTEXT_H +#define Py_CONTEXT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API + + +PyAPI_DATA(PyTypeObject) PyContext_Type; +typedef struct _pycontextobject PyContext; + +PyAPI_DATA(PyTypeObject) PyContextVar_Type; +typedef struct _pycontextvarobject PyContextVar; + +PyAPI_DATA(PyTypeObject) PyContextToken_Type; +typedef struct _pycontexttokenobject PyContextToken; + + +#define PyContext_CheckExact(o) (Py_TYPE(o) == &PyContext_Type) +#define PyContextVar_CheckExact(o) (Py_TYPE(o) == &PyContextVar_Type) +#define PyContextToken_CheckExact(o) (Py_TYPE(o) == &PyContextToken_Type) + + +PyAPI_FUNC(PyContext *) PyContext_New(void); +PyAPI_FUNC(PyContext *) PyContext_Copy(PyContext *); +PyAPI_FUNC(PyContext *) PyContext_CopyCurrent(void); + +PyAPI_FUNC(int) PyContext_Enter(PyContext *); +PyAPI_FUNC(int) PyContext_Exit(PyContext *); + + +/* Create a new context variable. + + default_value can be NULL. +*/ +PyAPI_FUNC(PyContextVar *) PyContextVar_New( + const char *name, PyObject *default_value); + + +/* Get a value for the variable. + + Returns -1 if an error occurred during lookup. + + Returns 0 if value either was or was not found. + + If value was found, *value will point to it. + If not, it will point to: + + - default_value, if not NULL; + - the default value of "var", if not NULL; + - NULL. + + '*value' will be a new ref, if not NULL. +*/ +PyAPI_FUNC(int) PyContextVar_Get( + PyContextVar *var, PyObject *default_value, PyObject **value); + + +/* Set a new value for the variable. + Returns NULL if an error occurs. +*/ +PyAPI_FUNC(PyContextToken *) PyContextVar_Set( + PyContextVar *var, PyObject *value); + + +/* Reset a variable to its previous value. + Returns 0 on success, -1 on error. +*/ +PyAPI_FUNC(int) PyContextVar_Reset( + PyContextVar *var, PyContextToken *token); + + +/* This method is exposed only for CPython tests. Don not use it. */ +PyAPI_FUNC(PyObject *) _PyContext_NewHamtForTests(void); + + +PyAPI_FUNC(int) PyContext_ClearFreeList(void); + + +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CONTEXT_H */ diff --git a/venv/Include/datetime.h b/venv/Include/datetime.h new file mode 100644 index 00000000..059d5ecf --- /dev/null +++ b/venv/Include/datetime.h @@ -0,0 +1,273 @@ +/* datetime.h + */ +#ifndef Py_LIMITED_API +#ifndef DATETIME_H +#define DATETIME_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Fields are packed into successive bytes, each viewed as unsigned and + * big-endian, unless otherwise noted: + * + * byte offset + * 0 year 2 bytes, 1-9999 + * 2 month 1 byte, 1-12 + * 3 day 1 byte, 1-31 + * 4 hour 1 byte, 0-23 + * 5 minute 1 byte, 0-59 + * 6 second 1 byte, 0-59 + * 7 usecond 3 bytes, 0-999999 + * 10 + */ + +/* # of bytes for year, month, and day. */ +#define _PyDateTime_DATE_DATASIZE 4 + +/* # of bytes for hour, minute, second, and usecond. */ +#define _PyDateTime_TIME_DATASIZE 6 + +/* # of bytes for year, month, day, hour, minute, second, and usecond. */ +#define _PyDateTime_DATETIME_DATASIZE 10 + + +typedef struct +{ + PyObject_HEAD + Py_hash_t hashcode; /* -1 when unknown */ + int days; /* -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS */ + int seconds; /* 0 <= seconds < 24*3600 is invariant */ + int microseconds; /* 0 <= microseconds < 1000000 is invariant */ +} PyDateTime_Delta; + +typedef struct +{ + PyObject_HEAD /* a pure abstract base class */ +} PyDateTime_TZInfo; + + +/* The datetime and time types have hashcodes, and an optional tzinfo member, + * present if and only if hastzinfo is true. + */ +#define _PyTZINFO_HEAD \ + PyObject_HEAD \ + Py_hash_t hashcode; \ + char hastzinfo; /* boolean flag */ + +/* No _PyDateTime_BaseTZInfo is allocated; it's just to have something + * convenient to cast to, when getting at the hastzinfo member of objects + * starting with _PyTZINFO_HEAD. + */ +typedef struct +{ + _PyTZINFO_HEAD +} _PyDateTime_BaseTZInfo; + +/* All time objects are of PyDateTime_TimeType, but that can be allocated + * in two ways, with or without a tzinfo member. Without is the same as + * tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an + * internal struct used to allocate the right amount of space for the + * "without" case. + */ +#define _PyDateTime_TIMEHEAD \ + _PyTZINFO_HEAD \ + unsigned char data[_PyDateTime_TIME_DATASIZE]; + +typedef struct +{ + _PyDateTime_TIMEHEAD +} _PyDateTime_BaseTime; /* hastzinfo false */ + +typedef struct +{ + _PyDateTime_TIMEHEAD + unsigned char fold; + PyObject *tzinfo; +} PyDateTime_Time; /* hastzinfo true */ + + +/* All datetime objects are of PyDateTime_DateTimeType, but that can be + * allocated in two ways too, just like for time objects above. In addition, + * the plain date type is a base class for datetime, so it must also have + * a hastzinfo member (although it's unused there). + */ +typedef struct +{ + _PyTZINFO_HEAD + unsigned char data[_PyDateTime_DATE_DATASIZE]; +} PyDateTime_Date; + +#define _PyDateTime_DATETIMEHEAD \ + _PyTZINFO_HEAD \ + unsigned char data[_PyDateTime_DATETIME_DATASIZE]; + +typedef struct +{ + _PyDateTime_DATETIMEHEAD +} _PyDateTime_BaseDateTime; /* hastzinfo false */ + +typedef struct +{ + _PyDateTime_DATETIMEHEAD + unsigned char fold; + PyObject *tzinfo; +} PyDateTime_DateTime; /* hastzinfo true */ + + +/* Apply for date and datetime instances. */ +#define PyDateTime_GET_YEAR(o) ((((PyDateTime_Date*)o)->data[0] << 8) | \ + ((PyDateTime_Date*)o)->data[1]) +#define PyDateTime_GET_MONTH(o) (((PyDateTime_Date*)o)->data[2]) +#define PyDateTime_GET_DAY(o) (((PyDateTime_Date*)o)->data[3]) + +#define PyDateTime_DATE_GET_HOUR(o) (((PyDateTime_DateTime*)o)->data[4]) +#define PyDateTime_DATE_GET_MINUTE(o) (((PyDateTime_DateTime*)o)->data[5]) +#define PyDateTime_DATE_GET_SECOND(o) (((PyDateTime_DateTime*)o)->data[6]) +#define PyDateTime_DATE_GET_MICROSECOND(o) \ + ((((PyDateTime_DateTime*)o)->data[7] << 16) | \ + (((PyDateTime_DateTime*)o)->data[8] << 8) | \ + ((PyDateTime_DateTime*)o)->data[9]) +#define PyDateTime_DATE_GET_FOLD(o) (((PyDateTime_DateTime*)o)->fold) + +/* Apply for time instances. */ +#define PyDateTime_TIME_GET_HOUR(o) (((PyDateTime_Time*)o)->data[0]) +#define PyDateTime_TIME_GET_MINUTE(o) (((PyDateTime_Time*)o)->data[1]) +#define PyDateTime_TIME_GET_SECOND(o) (((PyDateTime_Time*)o)->data[2]) +#define PyDateTime_TIME_GET_MICROSECOND(o) \ + ((((PyDateTime_Time*)o)->data[3] << 16) | \ + (((PyDateTime_Time*)o)->data[4] << 8) | \ + ((PyDateTime_Time*)o)->data[5]) +#define PyDateTime_TIME_GET_FOLD(o) (((PyDateTime_Time*)o)->fold) + +/* Apply for time delta instances */ +#define PyDateTime_DELTA_GET_DAYS(o) (((PyDateTime_Delta*)o)->days) +#define PyDateTime_DELTA_GET_SECONDS(o) (((PyDateTime_Delta*)o)->seconds) +#define PyDateTime_DELTA_GET_MICROSECONDS(o) \ + (((PyDateTime_Delta*)o)->microseconds) + + +/* Define structure for C API. */ +typedef struct { + /* type objects */ + PyTypeObject *DateType; + PyTypeObject *DateTimeType; + PyTypeObject *TimeType; + PyTypeObject *DeltaType; + PyTypeObject *TZInfoType; + + /* singletons */ + PyObject *TimeZone_UTC; + + /* constructors */ + PyObject *(*Date_FromDate)(int, int, int, PyTypeObject*); + PyObject *(*DateTime_FromDateAndTime)(int, int, int, int, int, int, int, + PyObject*, PyTypeObject*); + PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*); + PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*); + PyObject *(*TimeZone_FromTimeZone)(PyObject *offset, PyObject *name); + + /* constructors for the DB API */ + PyObject *(*DateTime_FromTimestamp)(PyObject*, PyObject*, PyObject*); + PyObject *(*Date_FromTimestamp)(PyObject*, PyObject*); + + /* PEP 495 constructors */ + PyObject *(*DateTime_FromDateAndTimeAndFold)(int, int, int, int, int, int, int, + PyObject*, int, PyTypeObject*); + PyObject *(*Time_FromTimeAndFold)(int, int, int, int, PyObject*, int, PyTypeObject*); + +} PyDateTime_CAPI; + +#define PyDateTime_CAPSULE_NAME "datetime.datetime_CAPI" + + +#ifdef Py_BUILD_CORE + +/* Macros for type checking when building the Python core. */ +#define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType) +#define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType) + +#define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType) +#define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType) + +#define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType) +#define PyTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TimeType) + +#define PyDelta_Check(op) PyObject_TypeCheck(op, &PyDateTime_DeltaType) +#define PyDelta_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DeltaType) + +#define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType) +#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType) + +#else + +/* Define global variable for the C API and a macro for setting it. */ +static PyDateTime_CAPI *PyDateTimeAPI = NULL; + +#define PyDateTime_IMPORT \ + PyDateTimeAPI = (PyDateTime_CAPI *)PyCapsule_Import(PyDateTime_CAPSULE_NAME, 0) + +/* Macro for access to the UTC singleton */ +#define PyDateTime_TimeZone_UTC PyDateTimeAPI->TimeZone_UTC + +/* Macros for type checking when not building the Python core. */ +#define PyDate_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateType) +#define PyDate_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateType) + +#define PyDateTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateTimeType) +#define PyDateTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateTimeType) + +#define PyTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TimeType) +#define PyTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TimeType) + +#define PyDelta_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DeltaType) +#define PyDelta_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DeltaType) + +#define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType) +#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType) + +/* Macros for accessing constructors in a simplified fashion. */ +#define PyDate_FromDate(year, month, day) \ + PyDateTimeAPI->Date_FromDate(year, month, day, PyDateTimeAPI->DateType) + +#define PyDateTime_FromDateAndTime(year, month, day, hour, min, sec, usec) \ + PyDateTimeAPI->DateTime_FromDateAndTime(year, month, day, hour, \ + min, sec, usec, Py_None, PyDateTimeAPI->DateTimeType) + +#define PyDateTime_FromDateAndTimeAndFold(year, month, day, hour, min, sec, usec, fold) \ + PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(year, month, day, hour, \ + min, sec, usec, Py_None, fold, PyDateTimeAPI->DateTimeType) + +#define PyTime_FromTime(hour, minute, second, usecond) \ + PyDateTimeAPI->Time_FromTime(hour, minute, second, usecond, \ + Py_None, PyDateTimeAPI->TimeType) + +#define PyTime_FromTimeAndFold(hour, minute, second, usecond, fold) \ + PyDateTimeAPI->Time_FromTimeAndFold(hour, minute, second, usecond, \ + Py_None, fold, PyDateTimeAPI->TimeType) + +#define PyDelta_FromDSU(days, seconds, useconds) \ + PyDateTimeAPI->Delta_FromDelta(days, seconds, useconds, 1, \ + PyDateTimeAPI->DeltaType) + +#define PyTimeZone_FromOffset(offset) \ + PyDateTimeAPI->TimeZone_FromTimeZone(offset, NULL) + +#define PyTimeZone_FromOffsetAndName(offset, name) \ + PyDateTimeAPI->TimeZone_FromTimeZone(offset, name) + +/* Macros supporting the DB API. */ +#define PyDateTime_FromTimestamp(args) \ + PyDateTimeAPI->DateTime_FromTimestamp( \ + (PyObject*) (PyDateTimeAPI->DateTimeType), args, NULL) + +#define PyDate_FromTimestamp(args) \ + PyDateTimeAPI->Date_FromTimestamp( \ + (PyObject*) (PyDateTimeAPI->DateType), args) + +#endif /* Py_BUILD_CORE */ + +#ifdef __cplusplus +} +#endif +#endif +#endif /* !Py_LIMITED_API */ diff --git a/venv/Include/descrobject.h b/venv/Include/descrobject.h new file mode 100644 index 00000000..73bbb3fe --- /dev/null +++ b/venv/Include/descrobject.h @@ -0,0 +1,110 @@ +/* Descriptors */ +#ifndef Py_DESCROBJECT_H +#define Py_DESCROBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef PyObject *(*getter)(PyObject *, void *); +typedef int (*setter)(PyObject *, PyObject *, void *); + +typedef struct PyGetSetDef { + const char *name; + getter get; + setter set; + const char *doc; + void *closure; +} PyGetSetDef; + +#ifndef Py_LIMITED_API +typedef PyObject *(*wrapperfunc)(PyObject *self, PyObject *args, + void *wrapped); + +typedef PyObject *(*wrapperfunc_kwds)(PyObject *self, PyObject *args, + void *wrapped, PyObject *kwds); + +struct wrapperbase { + const char *name; + int offset; + void *function; + wrapperfunc wrapper; + const char *doc; + int flags; + PyObject *name_strobj; +}; + +/* Flags for above struct */ +#define PyWrapperFlag_KEYWORDS 1 /* wrapper function takes keyword args */ + +/* Various kinds of descriptor objects */ + +typedef struct { + PyObject_HEAD + PyTypeObject *d_type; + PyObject *d_name; + PyObject *d_qualname; +} PyDescrObject; + +#define PyDescr_COMMON PyDescrObject d_common + +#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) +#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) + +typedef struct { + PyDescr_COMMON; + PyMethodDef *d_method; +} PyMethodDescrObject; + +typedef struct { + PyDescr_COMMON; + struct PyMemberDef *d_member; +} PyMemberDescrObject; + +typedef struct { + PyDescr_COMMON; + PyGetSetDef *d_getset; +} PyGetSetDescrObject; + +typedef struct { + PyDescr_COMMON; + struct wrapperbase *d_base; + void *d_wrapped; /* This can be any function pointer */ +} PyWrapperDescrObject; +#endif /* Py_LIMITED_API */ + +PyAPI_DATA(PyTypeObject) PyClassMethodDescr_Type; +PyAPI_DATA(PyTypeObject) PyGetSetDescr_Type; +PyAPI_DATA(PyTypeObject) PyMemberDescr_Type; +PyAPI_DATA(PyTypeObject) PyMethodDescr_Type; +PyAPI_DATA(PyTypeObject) PyWrapperDescr_Type; +PyAPI_DATA(PyTypeObject) PyDictProxy_Type; +#ifndef Py_LIMITED_API +PyAPI_DATA(PyTypeObject) _PyMethodWrapper_Type; +#endif /* Py_LIMITED_API */ + +PyAPI_FUNC(PyObject *) PyDescr_NewMethod(PyTypeObject *, PyMethodDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewClassMethod(PyTypeObject *, PyMethodDef *); +struct PyMemberDef; /* forward declaration for following prototype */ +PyAPI_FUNC(PyObject *) PyDescr_NewMember(PyTypeObject *, + struct PyMemberDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *, + struct PyGetSetDef *); +#ifndef Py_LIMITED_API + +PyAPI_FUNC(PyObject *) _PyMethodDescr_FastCallKeywords( + PyObject *descrobj, PyObject *const *stack, Py_ssize_t nargs, PyObject *kwnames); +PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *, + struct wrapperbase *, void *); +#define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL) +#endif + +PyAPI_FUNC(PyObject *) PyDictProxy_New(PyObject *); +PyAPI_FUNC(PyObject *) PyWrapper_New(PyObject *, PyObject *); + + +PyAPI_DATA(PyTypeObject) PyProperty_Type; +#ifdef __cplusplus +} +#endif +#endif /* !Py_DESCROBJECT_H */ + diff --git a/venv/Include/dictobject.h b/venv/Include/dictobject.h new file mode 100644 index 00000000..28930f43 --- /dev/null +++ b/venv/Include/dictobject.h @@ -0,0 +1,179 @@ +#ifndef Py_DICTOBJECT_H +#define Py_DICTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Dictionary object type -- mapping from hashable object to object */ + +/* The distribution includes a separate file, Objects/dictnotes.txt, + describing explorations into dictionary design and optimization. + It covers typical dictionary use patterns, the parameters for + tuning dictionaries, and several ideas for possible optimizations. +*/ + +#ifndef Py_LIMITED_API + +typedef struct _dictkeysobject PyDictKeysObject; + +/* The ma_values pointer is NULL for a combined table + * or points to an array of PyObject* for a split table + */ +typedef struct { + PyObject_HEAD + + /* Number of items in the dictionary */ + Py_ssize_t ma_used; + + /* Dictionary version: globally unique, value change each time + the dictionary is modified */ + uint64_t ma_version_tag; + + PyDictKeysObject *ma_keys; + + /* If ma_values is NULL, the table is "combined": keys and values + are stored in ma_keys. + + If ma_values is not NULL, the table is splitted: + keys are stored in ma_keys and values are stored in ma_values */ + PyObject **ma_values; +} PyDictObject; + +typedef struct { + PyObject_HEAD + PyDictObject *dv_dict; +} _PyDictViewObject; + +#endif /* Py_LIMITED_API */ + +PyAPI_DATA(PyTypeObject) PyDict_Type; +PyAPI_DATA(PyTypeObject) PyDictIterKey_Type; +PyAPI_DATA(PyTypeObject) PyDictIterValue_Type; +PyAPI_DATA(PyTypeObject) PyDictIterItem_Type; +PyAPI_DATA(PyTypeObject) PyDictKeys_Type; +PyAPI_DATA(PyTypeObject) PyDictItems_Type; +PyAPI_DATA(PyTypeObject) PyDictValues_Type; + +#define PyDict_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_DICT_SUBCLASS) +#define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) +#define PyDictKeys_Check(op) PyObject_TypeCheck(op, &PyDictKeys_Type) +#define PyDictItems_Check(op) PyObject_TypeCheck(op, &PyDictItems_Type) +#define PyDictValues_Check(op) PyObject_TypeCheck(op, &PyDictValues_Type) +/* This excludes Values, since they are not sets. */ +# define PyDictViewSet_Check(op) \ + (PyDictKeys_Check(op) || PyDictItems_Check(op)) + + +PyAPI_FUNC(PyObject *) PyDict_New(void); +PyAPI_FUNC(PyObject *) PyDict_GetItem(PyObject *mp, PyObject *key); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyDict_GetItem_KnownHash(PyObject *mp, PyObject *key, + Py_hash_t hash); +#endif +PyAPI_FUNC(PyObject *) PyDict_GetItemWithError(PyObject *mp, PyObject *key); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyDict_GetItemIdWithError(PyObject *dp, + struct _Py_Identifier *key); +PyAPI_FUNC(PyObject *) PyDict_SetDefault( + PyObject *mp, PyObject *key, PyObject *defaultobj); +#endif +PyAPI_FUNC(int) PyDict_SetItem(PyObject *mp, PyObject *key, PyObject *item); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyDict_SetItem_KnownHash(PyObject *mp, PyObject *key, + PyObject *item, Py_hash_t hash); +#endif +PyAPI_FUNC(int) PyDict_DelItem(PyObject *mp, PyObject *key); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyDict_DelItem_KnownHash(PyObject *mp, PyObject *key, + Py_hash_t hash); +PyAPI_FUNC(int) _PyDict_DelItemIf(PyObject *mp, PyObject *key, + int (*predicate)(PyObject *value)); +#endif +PyAPI_FUNC(void) PyDict_Clear(PyObject *mp); +PyAPI_FUNC(int) PyDict_Next( + PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value); +#ifndef Py_LIMITED_API +PyDictKeysObject *_PyDict_NewKeysForClass(void); +PyAPI_FUNC(PyObject *) PyObject_GenericGetDict(PyObject *, void *); +PyAPI_FUNC(int) _PyDict_Next( + PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, Py_hash_t *hash); +PyObject *_PyDictView_New(PyObject *, PyTypeObject *); +#endif +PyAPI_FUNC(PyObject *) PyDict_Keys(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Values(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Items(PyObject *mp); +PyAPI_FUNC(Py_ssize_t) PyDict_Size(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Copy(PyObject *mp); +PyAPI_FUNC(int) PyDict_Contains(PyObject *mp, PyObject *key); +#ifndef Py_LIMITED_API +/* Get the number of items of a dictionary. */ +#define PyDict_GET_SIZE(mp) (assert(PyDict_Check(mp)),((PyDictObject *)mp)->ma_used) +PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, Py_hash_t hash); +PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused); +PyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp); +PyAPI_FUNC(int) _PyDict_HasOnlyStringKeys(PyObject *mp); +Py_ssize_t _PyDict_KeysSize(PyDictKeysObject *keys); +PyAPI_FUNC(Py_ssize_t) _PyDict_SizeOf(PyDictObject *); +PyAPI_FUNC(PyObject *) _PyDict_Pop(PyObject *, PyObject *, PyObject *); +PyObject *_PyDict_Pop_KnownHash(PyObject *, PyObject *, Py_hash_t, PyObject *); +PyObject *_PyDict_FromKeys(PyObject *, PyObject *, PyObject *); +#define _PyDict_HasSplitTable(d) ((d)->ma_values != NULL) + +PyAPI_FUNC(int) PyDict_ClearFreeList(void); +#endif + +/* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */ +PyAPI_FUNC(int) PyDict_Update(PyObject *mp, PyObject *other); + +/* PyDict_Merge updates/merges from a mapping object (an object that + supports PyMapping_Keys() and PyObject_GetItem()). If override is true, + the last occurrence of a key wins, else the first. The Python + dict.update(other) is equivalent to PyDict_Merge(dict, other, 1). +*/ +PyAPI_FUNC(int) PyDict_Merge(PyObject *mp, + PyObject *other, + int override); + +#ifndef Py_LIMITED_API +/* Like PyDict_Merge, but override can be 0, 1 or 2. If override is 0, + the first occurrence of a key wins, if override is 1, the last occurrence + of a key wins, if override is 2, a KeyError with conflicting key as + argument is raised. +*/ +PyAPI_FUNC(int) _PyDict_MergeEx(PyObject *mp, PyObject *other, int override); +PyAPI_FUNC(PyObject *) _PyDictView_Intersect(PyObject* self, PyObject *other); +#endif + +/* PyDict_MergeFromSeq2 updates/merges from an iterable object producing + iterable objects of length 2. If override is true, the last occurrence + of a key wins, else the first. The Python dict constructor dict(seq2) + is equivalent to dict={}; PyDict_MergeFromSeq(dict, seq2, 1). +*/ +PyAPI_FUNC(int) PyDict_MergeFromSeq2(PyObject *d, + PyObject *seq2, + int override); + +PyAPI_FUNC(PyObject *) PyDict_GetItemString(PyObject *dp, const char *key); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(int) PyDict_SetItemString(PyObject *dp, const char *key, PyObject *item); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyDict_SetItemId(PyObject *dp, struct _Py_Identifier *key, PyObject *item); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(int) PyDict_DelItemString(PyObject *dp, const char *key); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyDict_DelItemId(PyObject *mp, struct _Py_Identifier *key); +PyAPI_FUNC(void) _PyDict_DebugMallocStats(FILE *out); + +int _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr, PyObject *name, PyObject *value); +PyObject *_PyDict_LoadGlobal(PyDictObject *, PyDictObject *, PyObject *); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_DICTOBJECT_H */ diff --git a/venv/Include/dtoa.h b/venv/Include/dtoa.h new file mode 100644 index 00000000..9bfb6251 --- /dev/null +++ b/venv/Include/dtoa.h @@ -0,0 +1,19 @@ +#ifndef Py_LIMITED_API +#ifndef PY_NO_SHORT_FLOAT_REPR +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(double) _Py_dg_strtod(const char *str, char **ptr); +PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits, + int *decpt, int *sign, char **rve); +PyAPI_FUNC(void) _Py_dg_freedtoa(char *s); +PyAPI_FUNC(double) _Py_dg_stdnan(int sign); +PyAPI_FUNC(double) _Py_dg_infinity(int sign); + + +#ifdef __cplusplus +} +#endif +#endif +#endif diff --git a/venv/Include/dynamic_annotations.h b/venv/Include/dynamic_annotations.h new file mode 100644 index 00000000..0bd1a833 --- /dev/null +++ b/venv/Include/dynamic_annotations.h @@ -0,0 +1,499 @@ +/* Copyright (c) 2008-2009, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * --- + * Author: Kostya Serebryany + * Copied to CPython by Jeffrey Yasskin, with all macros renamed to + * start with _Py_ to avoid colliding with users embedding Python, and + * with deprecated macros removed. + */ + +/* This file defines dynamic annotations for use with dynamic analysis + tool such as valgrind, PIN, etc. + + Dynamic annotation is a source code annotation that affects + the generated code (that is, the annotation is not a comment). + Each such annotation is attached to a particular + instruction and/or to a particular object (address) in the program. + + The annotations that should be used by users are macros in all upper-case + (e.g., _Py_ANNOTATE_NEW_MEMORY). + + Actual implementation of these macros may differ depending on the + dynamic analysis tool being used. + + See http://code.google.com/p/data-race-test/ for more information. + + This file supports the following dynamic analysis tools: + - None (DYNAMIC_ANNOTATIONS_ENABLED is not defined or zero). + Macros are defined empty. + - ThreadSanitizer, Helgrind, DRD (DYNAMIC_ANNOTATIONS_ENABLED is 1). + Macros are defined as calls to non-inlinable empty functions + that are intercepted by Valgrind. */ + +#ifndef __DYNAMIC_ANNOTATIONS_H__ +#define __DYNAMIC_ANNOTATIONS_H__ + +#ifndef DYNAMIC_ANNOTATIONS_ENABLED +# define DYNAMIC_ANNOTATIONS_ENABLED 0 +#endif + +#if DYNAMIC_ANNOTATIONS_ENABLED != 0 + + /* ------------------------------------------------------------- + Annotations useful when implementing condition variables such as CondVar, + using conditional critical sections (Await/LockWhen) and when constructing + user-defined synchronization mechanisms. + + The annotations _Py_ANNOTATE_HAPPENS_BEFORE() and + _Py_ANNOTATE_HAPPENS_AFTER() can be used to define happens-before arcs in + user-defined synchronization mechanisms: the race detector will infer an + arc from the former to the latter when they share the same argument + pointer. + + Example 1 (reference counting): + + void Unref() { + _Py_ANNOTATE_HAPPENS_BEFORE(&refcount_); + if (AtomicDecrementByOne(&refcount_) == 0) { + _Py_ANNOTATE_HAPPENS_AFTER(&refcount_); + delete this; + } + } + + Example 2 (message queue): + + void MyQueue::Put(Type *e) { + MutexLock lock(&mu_); + _Py_ANNOTATE_HAPPENS_BEFORE(e); + PutElementIntoMyQueue(e); + } + + Type *MyQueue::Get() { + MutexLock lock(&mu_); + Type *e = GetElementFromMyQueue(); + _Py_ANNOTATE_HAPPENS_AFTER(e); + return e; + } + + Note: when possible, please use the existing reference counting and message + queue implementations instead of inventing new ones. */ + + /* Report that wait on the condition variable at address "cv" has succeeded + and the lock at address "lock" is held. */ +#define _Py_ANNOTATE_CONDVAR_LOCK_WAIT(cv, lock) \ + AnnotateCondVarWait(__FILE__, __LINE__, cv, lock) + + /* Report that wait on the condition variable at "cv" has succeeded. Variant + w/o lock. */ +#define _Py_ANNOTATE_CONDVAR_WAIT(cv) \ + AnnotateCondVarWait(__FILE__, __LINE__, cv, NULL) + + /* Report that we are about to signal on the condition variable at address + "cv". */ +#define _Py_ANNOTATE_CONDVAR_SIGNAL(cv) \ + AnnotateCondVarSignal(__FILE__, __LINE__, cv) + + /* Report that we are about to signal_all on the condition variable at "cv". */ +#define _Py_ANNOTATE_CONDVAR_SIGNAL_ALL(cv) \ + AnnotateCondVarSignalAll(__FILE__, __LINE__, cv) + + /* Annotations for user-defined synchronization mechanisms. */ +#define _Py_ANNOTATE_HAPPENS_BEFORE(obj) _Py_ANNOTATE_CONDVAR_SIGNAL(obj) +#define _Py_ANNOTATE_HAPPENS_AFTER(obj) _Py_ANNOTATE_CONDVAR_WAIT(obj) + + /* Report that the bytes in the range [pointer, pointer+size) are about + to be published safely. The race checker will create a happens-before + arc from the call _Py_ANNOTATE_PUBLISH_MEMORY_RANGE(pointer, size) to + subsequent accesses to this memory. + Note: this annotation may not work properly if the race detector uses + sampling, i.e. does not observe all memory accesses. + */ +#define _Py_ANNOTATE_PUBLISH_MEMORY_RANGE(pointer, size) \ + AnnotatePublishMemoryRange(__FILE__, __LINE__, pointer, size) + + /* Instruct the tool to create a happens-before arc between mu->Unlock() and + mu->Lock(). This annotation may slow down the race detector and hide real + races. Normally it is used only when it would be difficult to annotate each + of the mutex's critical sections individually using the annotations above. + This annotation makes sense only for hybrid race detectors. For pure + happens-before detectors this is a no-op. For more details see + http://code.google.com/p/data-race-test/wiki/PureHappensBeforeVsHybrid . */ +#define _Py_ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mu) \ + AnnotateMutexIsUsedAsCondVar(__FILE__, __LINE__, mu) + + /* ------------------------------------------------------------- + Annotations useful when defining memory allocators, or when memory that + was protected in one way starts to be protected in another. */ + + /* Report that a new memory at "address" of size "size" has been allocated. + This might be used when the memory has been retrieved from a free list and + is about to be reused, or when the locking discipline for a variable + changes. */ +#define _Py_ANNOTATE_NEW_MEMORY(address, size) \ + AnnotateNewMemory(__FILE__, __LINE__, address, size) + + /* ------------------------------------------------------------- + Annotations useful when defining FIFO queues that transfer data between + threads. */ + + /* Report that the producer-consumer queue (such as ProducerConsumerQueue) at + address "pcq" has been created. The _Py_ANNOTATE_PCQ_* annotations should + be used only for FIFO queues. For non-FIFO queues use + _Py_ANNOTATE_HAPPENS_BEFORE (for put) and _Py_ANNOTATE_HAPPENS_AFTER (for + get). */ +#define _Py_ANNOTATE_PCQ_CREATE(pcq) \ + AnnotatePCQCreate(__FILE__, __LINE__, pcq) + + /* Report that the queue at address "pcq" is about to be destroyed. */ +#define _Py_ANNOTATE_PCQ_DESTROY(pcq) \ + AnnotatePCQDestroy(__FILE__, __LINE__, pcq) + + /* Report that we are about to put an element into a FIFO queue at address + "pcq". */ +#define _Py_ANNOTATE_PCQ_PUT(pcq) \ + AnnotatePCQPut(__FILE__, __LINE__, pcq) + + /* Report that we've just got an element from a FIFO queue at address "pcq". */ +#define _Py_ANNOTATE_PCQ_GET(pcq) \ + AnnotatePCQGet(__FILE__, __LINE__, pcq) + + /* ------------------------------------------------------------- + Annotations that suppress errors. It is usually better to express the + program's synchronization using the other annotations, but these can + be used when all else fails. */ + + /* Report that we may have a benign race at "pointer", with size + "sizeof(*(pointer))". "pointer" must be a non-void* pointer. Insert at the + point where "pointer" has been allocated, preferably close to the point + where the race happens. See also _Py_ANNOTATE_BENIGN_RACE_STATIC. */ +#define _Py_ANNOTATE_BENIGN_RACE(pointer, description) \ + AnnotateBenignRaceSized(__FILE__, __LINE__, pointer, \ + sizeof(*(pointer)), description) + + /* Same as _Py_ANNOTATE_BENIGN_RACE(address, description), but applies to + the memory range [address, address+size). */ +#define _Py_ANNOTATE_BENIGN_RACE_SIZED(address, size, description) \ + AnnotateBenignRaceSized(__FILE__, __LINE__, address, size, description) + + /* Request the analysis tool to ignore all reads in the current thread + until _Py_ANNOTATE_IGNORE_READS_END is called. + Useful to ignore intentional racey reads, while still checking + other reads and all writes. + See also _Py_ANNOTATE_UNPROTECTED_READ. */ +#define _Py_ANNOTATE_IGNORE_READS_BEGIN() \ + AnnotateIgnoreReadsBegin(__FILE__, __LINE__) + + /* Stop ignoring reads. */ +#define _Py_ANNOTATE_IGNORE_READS_END() \ + AnnotateIgnoreReadsEnd(__FILE__, __LINE__) + + /* Similar to _Py_ANNOTATE_IGNORE_READS_BEGIN, but ignore writes. */ +#define _Py_ANNOTATE_IGNORE_WRITES_BEGIN() \ + AnnotateIgnoreWritesBegin(__FILE__, __LINE__) + + /* Stop ignoring writes. */ +#define _Py_ANNOTATE_IGNORE_WRITES_END() \ + AnnotateIgnoreWritesEnd(__FILE__, __LINE__) + + /* Start ignoring all memory accesses (reads and writes). */ +#define _Py_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() \ + do {\ + _Py_ANNOTATE_IGNORE_READS_BEGIN();\ + _Py_ANNOTATE_IGNORE_WRITES_BEGIN();\ + }while(0)\ + + /* Stop ignoring all memory accesses. */ +#define _Py_ANNOTATE_IGNORE_READS_AND_WRITES_END() \ + do {\ + _Py_ANNOTATE_IGNORE_WRITES_END();\ + _Py_ANNOTATE_IGNORE_READS_END();\ + }while(0)\ + + /* Similar to _Py_ANNOTATE_IGNORE_READS_BEGIN, but ignore synchronization events: + RWLOCK* and CONDVAR*. */ +#define _Py_ANNOTATE_IGNORE_SYNC_BEGIN() \ + AnnotateIgnoreSyncBegin(__FILE__, __LINE__) + + /* Stop ignoring sync events. */ +#define _Py_ANNOTATE_IGNORE_SYNC_END() \ + AnnotateIgnoreSyncEnd(__FILE__, __LINE__) + + + /* Enable (enable!=0) or disable (enable==0) race detection for all threads. + This annotation could be useful if you want to skip expensive race analysis + during some period of program execution, e.g. during initialization. */ +#define _Py_ANNOTATE_ENABLE_RACE_DETECTION(enable) \ + AnnotateEnableRaceDetection(__FILE__, __LINE__, enable) + + /* ------------------------------------------------------------- + Annotations useful for debugging. */ + + /* Request to trace every access to "address". */ +#define _Py_ANNOTATE_TRACE_MEMORY(address) \ + AnnotateTraceMemory(__FILE__, __LINE__, address) + + /* Report the current thread name to a race detector. */ +#define _Py_ANNOTATE_THREAD_NAME(name) \ + AnnotateThreadName(__FILE__, __LINE__, name) + + /* ------------------------------------------------------------- + Annotations useful when implementing locks. They are not + normally needed by modules that merely use locks. + The "lock" argument is a pointer to the lock object. */ + + /* Report that a lock has been created at address "lock". */ +#define _Py_ANNOTATE_RWLOCK_CREATE(lock) \ + AnnotateRWLockCreate(__FILE__, __LINE__, lock) + + /* Report that the lock at address "lock" is about to be destroyed. */ +#define _Py_ANNOTATE_RWLOCK_DESTROY(lock) \ + AnnotateRWLockDestroy(__FILE__, __LINE__, lock) + + /* Report that the lock at address "lock" has been acquired. + is_w=1 for writer lock, is_w=0 for reader lock. */ +#define _Py_ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) \ + AnnotateRWLockAcquired(__FILE__, __LINE__, lock, is_w) + + /* Report that the lock at address "lock" is about to be released. */ +#define _Py_ANNOTATE_RWLOCK_RELEASED(lock, is_w) \ + AnnotateRWLockReleased(__FILE__, __LINE__, lock, is_w) + + /* ------------------------------------------------------------- + Annotations useful when implementing barriers. They are not + normally needed by modules that merely use barriers. + The "barrier" argument is a pointer to the barrier object. */ + + /* Report that the "barrier" has been initialized with initial "count". + If 'reinitialization_allowed' is true, initialization is allowed to happen + multiple times w/o calling barrier_destroy() */ +#define _Py_ANNOTATE_BARRIER_INIT(barrier, count, reinitialization_allowed) \ + AnnotateBarrierInit(__FILE__, __LINE__, barrier, count, \ + reinitialization_allowed) + + /* Report that we are about to enter barrier_wait("barrier"). */ +#define _Py_ANNOTATE_BARRIER_WAIT_BEFORE(barrier) \ + AnnotateBarrierWaitBefore(__FILE__, __LINE__, barrier) + + /* Report that we just exited barrier_wait("barrier"). */ +#define _Py_ANNOTATE_BARRIER_WAIT_AFTER(barrier) \ + AnnotateBarrierWaitAfter(__FILE__, __LINE__, barrier) + + /* Report that the "barrier" has been destroyed. */ +#define _Py_ANNOTATE_BARRIER_DESTROY(barrier) \ + AnnotateBarrierDestroy(__FILE__, __LINE__, barrier) + + /* ------------------------------------------------------------- + Annotations useful for testing race detectors. */ + + /* Report that we expect a race on the variable at "address". + Use only in unit tests for a race detector. */ +#define _Py_ANNOTATE_EXPECT_RACE(address, description) \ + AnnotateExpectRace(__FILE__, __LINE__, address, description) + + /* A no-op. Insert where you like to test the interceptors. */ +#define _Py_ANNOTATE_NO_OP(arg) \ + AnnotateNoOp(__FILE__, __LINE__, arg) + + /* Force the race detector to flush its state. The actual effect depends on + * the implementation of the detector. */ +#define _Py_ANNOTATE_FLUSH_STATE() \ + AnnotateFlushState(__FILE__, __LINE__) + + +#else /* DYNAMIC_ANNOTATIONS_ENABLED == 0 */ + +#define _Py_ANNOTATE_RWLOCK_CREATE(lock) /* empty */ +#define _Py_ANNOTATE_RWLOCK_DESTROY(lock) /* empty */ +#define _Py_ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) /* empty */ +#define _Py_ANNOTATE_RWLOCK_RELEASED(lock, is_w) /* empty */ +#define _Py_ANNOTATE_BARRIER_INIT(barrier, count, reinitialization_allowed) /* */ +#define _Py_ANNOTATE_BARRIER_WAIT_BEFORE(barrier) /* empty */ +#define _Py_ANNOTATE_BARRIER_WAIT_AFTER(barrier) /* empty */ +#define _Py_ANNOTATE_BARRIER_DESTROY(barrier) /* empty */ +#define _Py_ANNOTATE_CONDVAR_LOCK_WAIT(cv, lock) /* empty */ +#define _Py_ANNOTATE_CONDVAR_WAIT(cv) /* empty */ +#define _Py_ANNOTATE_CONDVAR_SIGNAL(cv) /* empty */ +#define _Py_ANNOTATE_CONDVAR_SIGNAL_ALL(cv) /* empty */ +#define _Py_ANNOTATE_HAPPENS_BEFORE(obj) /* empty */ +#define _Py_ANNOTATE_HAPPENS_AFTER(obj) /* empty */ +#define _Py_ANNOTATE_PUBLISH_MEMORY_RANGE(address, size) /* empty */ +#define _Py_ANNOTATE_UNPUBLISH_MEMORY_RANGE(address, size) /* empty */ +#define _Py_ANNOTATE_SWAP_MEMORY_RANGE(address, size) /* empty */ +#define _Py_ANNOTATE_PCQ_CREATE(pcq) /* empty */ +#define _Py_ANNOTATE_PCQ_DESTROY(pcq) /* empty */ +#define _Py_ANNOTATE_PCQ_PUT(pcq) /* empty */ +#define _Py_ANNOTATE_PCQ_GET(pcq) /* empty */ +#define _Py_ANNOTATE_NEW_MEMORY(address, size) /* empty */ +#define _Py_ANNOTATE_EXPECT_RACE(address, description) /* empty */ +#define _Py_ANNOTATE_BENIGN_RACE(address, description) /* empty */ +#define _Py_ANNOTATE_BENIGN_RACE_SIZED(address, size, description) /* empty */ +#define _Py_ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mu) /* empty */ +#define _Py_ANNOTATE_MUTEX_IS_USED_AS_CONDVAR(mu) /* empty */ +#define _Py_ANNOTATE_TRACE_MEMORY(arg) /* empty */ +#define _Py_ANNOTATE_THREAD_NAME(name) /* empty */ +#define _Py_ANNOTATE_IGNORE_READS_BEGIN() /* empty */ +#define _Py_ANNOTATE_IGNORE_READS_END() /* empty */ +#define _Py_ANNOTATE_IGNORE_WRITES_BEGIN() /* empty */ +#define _Py_ANNOTATE_IGNORE_WRITES_END() /* empty */ +#define _Py_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() /* empty */ +#define _Py_ANNOTATE_IGNORE_READS_AND_WRITES_END() /* empty */ +#define _Py_ANNOTATE_IGNORE_SYNC_BEGIN() /* empty */ +#define _Py_ANNOTATE_IGNORE_SYNC_END() /* empty */ +#define _Py_ANNOTATE_ENABLE_RACE_DETECTION(enable) /* empty */ +#define _Py_ANNOTATE_NO_OP(arg) /* empty */ +#define _Py_ANNOTATE_FLUSH_STATE() /* empty */ + +#endif /* DYNAMIC_ANNOTATIONS_ENABLED */ + +/* Use the macros above rather than using these functions directly. */ +#ifdef __cplusplus +extern "C" { +#endif +void AnnotateRWLockCreate(const char *file, int line, + const volatile void *lock); +void AnnotateRWLockDestroy(const char *file, int line, + const volatile void *lock); +void AnnotateRWLockAcquired(const char *file, int line, + const volatile void *lock, long is_w); +void AnnotateRWLockReleased(const char *file, int line, + const volatile void *lock, long is_w); +void AnnotateBarrierInit(const char *file, int line, + const volatile void *barrier, long count, + long reinitialization_allowed); +void AnnotateBarrierWaitBefore(const char *file, int line, + const volatile void *barrier); +void AnnotateBarrierWaitAfter(const char *file, int line, + const volatile void *barrier); +void AnnotateBarrierDestroy(const char *file, int line, + const volatile void *barrier); +void AnnotateCondVarWait(const char *file, int line, + const volatile void *cv, + const volatile void *lock); +void AnnotateCondVarSignal(const char *file, int line, + const volatile void *cv); +void AnnotateCondVarSignalAll(const char *file, int line, + const volatile void *cv); +void AnnotatePublishMemoryRange(const char *file, int line, + const volatile void *address, + long size); +void AnnotateUnpublishMemoryRange(const char *file, int line, + const volatile void *address, + long size); +void AnnotatePCQCreate(const char *file, int line, + const volatile void *pcq); +void AnnotatePCQDestroy(const char *file, int line, + const volatile void *pcq); +void AnnotatePCQPut(const char *file, int line, + const volatile void *pcq); +void AnnotatePCQGet(const char *file, int line, + const volatile void *pcq); +void AnnotateNewMemory(const char *file, int line, + const volatile void *address, + long size); +void AnnotateExpectRace(const char *file, int line, + const volatile void *address, + const char *description); +void AnnotateBenignRace(const char *file, int line, + const volatile void *address, + const char *description); +void AnnotateBenignRaceSized(const char *file, int line, + const volatile void *address, + long size, + const char *description); +void AnnotateMutexIsUsedAsCondVar(const char *file, int line, + const volatile void *mu); +void AnnotateTraceMemory(const char *file, int line, + const volatile void *arg); +void AnnotateThreadName(const char *file, int line, + const char *name); +void AnnotateIgnoreReadsBegin(const char *file, int line); +void AnnotateIgnoreReadsEnd(const char *file, int line); +void AnnotateIgnoreWritesBegin(const char *file, int line); +void AnnotateIgnoreWritesEnd(const char *file, int line); +void AnnotateEnableRaceDetection(const char *file, int line, int enable); +void AnnotateNoOp(const char *file, int line, + const volatile void *arg); +void AnnotateFlushState(const char *file, int line); + +/* Return non-zero value if running under valgrind. + + If "valgrind.h" is included into dynamic_annotations.c, + the regular valgrind mechanism will be used. + See http://valgrind.org/docs/manual/manual-core-adv.html about + RUNNING_ON_VALGRIND and other valgrind "client requests". + The file "valgrind.h" may be obtained by doing + svn co svn://svn.valgrind.org/valgrind/trunk/include + + If for some reason you can't use "valgrind.h" or want to fake valgrind, + there are two ways to make this function return non-zero: + - Use environment variable: export RUNNING_ON_VALGRIND=1 + - Make your tool intercept the function RunningOnValgrind() and + change its return value. + */ +int RunningOnValgrind(void); + +#ifdef __cplusplus +} +#endif + +#if DYNAMIC_ANNOTATIONS_ENABLED != 0 && defined(__cplusplus) + + /* _Py_ANNOTATE_UNPROTECTED_READ is the preferred way to annotate racey reads. + + Instead of doing + _Py_ANNOTATE_IGNORE_READS_BEGIN(); + ... = x; + _Py_ANNOTATE_IGNORE_READS_END(); + one can use + ... = _Py_ANNOTATE_UNPROTECTED_READ(x); */ + template + inline T _Py_ANNOTATE_UNPROTECTED_READ(const volatile T &x) { + _Py_ANNOTATE_IGNORE_READS_BEGIN(); + T res = x; + _Py_ANNOTATE_IGNORE_READS_END(); + return res; + } + /* Apply _Py_ANNOTATE_BENIGN_RACE_SIZED to a static variable. */ +#define _Py_ANNOTATE_BENIGN_RACE_STATIC(static_var, description) \ + namespace { \ + class static_var ## _annotator { \ + public: \ + static_var ## _annotator() { \ + _Py_ANNOTATE_BENIGN_RACE_SIZED(&static_var, \ + sizeof(static_var), \ + # static_var ": " description); \ + } \ + }; \ + static static_var ## _annotator the ## static_var ## _annotator;\ + } +#else /* DYNAMIC_ANNOTATIONS_ENABLED == 0 */ + +#define _Py_ANNOTATE_UNPROTECTED_READ(x) (x) +#define _Py_ANNOTATE_BENIGN_RACE_STATIC(static_var, description) /* empty */ + +#endif /* DYNAMIC_ANNOTATIONS_ENABLED */ + +#endif /* __DYNAMIC_ANNOTATIONS_H__ */ diff --git a/venv/Include/enumobject.h b/venv/Include/enumobject.h new file mode 100644 index 00000000..c14dbfc8 --- /dev/null +++ b/venv/Include/enumobject.h @@ -0,0 +1,17 @@ +#ifndef Py_ENUMOBJECT_H +#define Py_ENUMOBJECT_H + +/* Enumerate Object */ + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyEnum_Type; +PyAPI_DATA(PyTypeObject) PyReversed_Type; + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_ENUMOBJECT_H */ diff --git a/venv/Include/errcode.h b/venv/Include/errcode.h new file mode 100644 index 00000000..b37cd261 --- /dev/null +++ b/venv/Include/errcode.h @@ -0,0 +1,38 @@ +#ifndef Py_ERRCODE_H +#define Py_ERRCODE_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Error codes passed around between file input, tokenizer, parser and + interpreter. This is necessary so we can turn them into Python + exceptions at a higher level. Note that some errors have a + slightly different meaning when passed from the tokenizer to the + parser than when passed from the parser to the interpreter; e.g. + the parser only returns E_EOF when it hits EOF immediately, and it + never returns E_OK. */ + +#define E_OK 10 /* No error */ +#define E_EOF 11 /* End Of File */ +#define E_INTR 12 /* Interrupted */ +#define E_TOKEN 13 /* Bad token */ +#define E_SYNTAX 14 /* Syntax error */ +#define E_NOMEM 15 /* Ran out of memory */ +#define E_DONE 16 /* Parsing complete */ +#define E_ERROR 17 /* Execution error */ +#define E_TABSPACE 18 /* Inconsistent mixing of tabs and spaces */ +#define E_OVERFLOW 19 /* Node had too many children */ +#define E_TOODEEP 20 /* Too many indentation levels */ +#define E_DEDENT 21 /* No matching outer block for dedent */ +#define E_DECODE 22 /* Error in decoding into Unicode */ +#define E_EOFS 23 /* EOF in triple-quoted string */ +#define E_EOLS 24 /* EOL in single-quoted string */ +#define E_LINECONT 25 /* Unexpected characters after a line continuation */ +#define E_IDENTIFIER 26 /* Invalid characters in identifier */ +#define E_BADSINGLE 27 /* Ill-formed single statement input */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ERRCODE_H */ diff --git a/venv/Include/eval.h b/venv/Include/eval.h new file mode 100644 index 00000000..2c1c2d05 --- /dev/null +++ b/venv/Include/eval.h @@ -0,0 +1,37 @@ + +/* Interface to execute compiled code */ + +#ifndef Py_EVAL_H +#define Py_EVAL_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) PyEval_EvalCode(PyObject *, PyObject *, PyObject *); + +PyAPI_FUNC(PyObject *) PyEval_EvalCodeEx(PyObject *co, + PyObject *globals, + PyObject *locals, + PyObject *const *args, int argc, + PyObject *const *kwds, int kwdc, + PyObject *const *defs, int defc, + PyObject *kwdefs, PyObject *closure); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyEval_EvalCodeWithName( + PyObject *co, + PyObject *globals, PyObject *locals, + PyObject *const *args, Py_ssize_t argcount, + PyObject *const *kwnames, PyObject *const *kwargs, + Py_ssize_t kwcount, int kwstep, + PyObject *const *defs, Py_ssize_t defcount, + PyObject *kwdefs, PyObject *closure, + PyObject *name, PyObject *qualname); + +PyAPI_FUNC(PyObject *) _PyEval_CallTracing(PyObject *func, PyObject *args); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_EVAL_H */ diff --git a/venv/Include/fileobject.h b/venv/Include/fileobject.h new file mode 100644 index 00000000..89e8dd6a --- /dev/null +++ b/venv/Include/fileobject.h @@ -0,0 +1,55 @@ +/* File object interface (what's left of it -- see io.py) */ + +#ifndef Py_FILEOBJECT_H +#define Py_FILEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#define PY_STDIOTEXTMODE "b" + +PyAPI_FUNC(PyObject *) PyFile_FromFd(int, const char *, const char *, int, + const char *, const char *, + const char *, int); +PyAPI_FUNC(PyObject *) PyFile_GetLine(PyObject *, int); +PyAPI_FUNC(int) PyFile_WriteObject(PyObject *, PyObject *, int); +PyAPI_FUNC(int) PyFile_WriteString(const char *, PyObject *); +PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *); +#endif + +/* The default encoding used by the platform file system APIs + If non-NULL, this is different than the default encoding for strings +*/ +PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors; +#endif +PyAPI_DATA(int) Py_HasFileSystemDefaultEncoding; + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 +PyAPI_DATA(int) Py_UTF8Mode; +#endif + +/* Internal API + + The std printer acts as a preliminary sys.stderr until the new io + infrastructure is in place. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyFile_NewStdPrinter(int); +PyAPI_DATA(PyTypeObject) PyStdPrinter_Type; +#endif /* Py_LIMITED_API */ + +/* A routine to check if a file descriptor can be select()-ed. */ +#ifdef _MSC_VER + /* On Windows, any socket fd can be select()-ed, no matter how high */ + #define _PyIsSelectable_fd(FD) (1) +#else + #define _PyIsSelectable_fd(FD) ((unsigned int)(FD) < (unsigned int)FD_SETSIZE) +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FILEOBJECT_H */ diff --git a/venv/Include/fileutils.h b/venv/Include/fileutils.h new file mode 100644 index 00000000..e4bf6d4d --- /dev/null +++ b/venv/Include/fileutils.h @@ -0,0 +1,177 @@ +#ifndef Py_FILEUTILS_H +#define Py_FILEUTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(wchar_t *) Py_DecodeLocale( + const char *arg, + size_t *size); + +PyAPI_FUNC(char*) Py_EncodeLocale( + const wchar_t *text, + size_t *error_pos); + +PyAPI_FUNC(char*) _Py_EncodeLocaleRaw( + const wchar_t *text, + size_t *error_pos); +#endif + +#ifdef Py_BUILD_CORE +PyAPI_FUNC(int) _Py_DecodeUTF8Ex( + const char *arg, + Py_ssize_t arglen, + wchar_t **wstr, + size_t *wlen, + const char **reason, + int surrogateescape); + +PyAPI_FUNC(int) _Py_EncodeUTF8Ex( + const wchar_t *text, + char **str, + size_t *error_pos, + const char **reason, + int raw_malloc, + int surrogateescape); + +PyAPI_FUNC(wchar_t*) _Py_DecodeUTF8_surrogateescape( + const char *arg, + Py_ssize_t arglen); + +PyAPI_FUNC(int) _Py_DecodeLocaleEx( + const char *arg, + wchar_t **wstr, + size_t *wlen, + const char **reason, + int current_locale, + int surrogateescape); + +PyAPI_FUNC(int) _Py_EncodeLocaleEx( + const wchar_t *text, + char **str, + size_t *error_pos, + const char **reason, + int current_locale, + int surrogateescape); +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _Py_device_encoding(int); + +#ifdef MS_WINDOWS +struct _Py_stat_struct { + unsigned long st_dev; + uint64_t st_ino; + unsigned short st_mode; + int st_nlink; + int st_uid; + int st_gid; + unsigned long st_rdev; + __int64 st_size; + time_t st_atime; + int st_atime_nsec; + time_t st_mtime; + int st_mtime_nsec; + time_t st_ctime; + int st_ctime_nsec; + unsigned long st_file_attributes; +}; +#else +# define _Py_stat_struct stat +#endif + +PyAPI_FUNC(int) _Py_fstat( + int fd, + struct _Py_stat_struct *status); + +PyAPI_FUNC(int) _Py_fstat_noraise( + int fd, + struct _Py_stat_struct *status); + +PyAPI_FUNC(int) _Py_stat( + PyObject *path, + struct stat *status); + +PyAPI_FUNC(int) _Py_open( + const char *pathname, + int flags); + +PyAPI_FUNC(int) _Py_open_noraise( + const char *pathname, + int flags); + +PyAPI_FUNC(FILE *) _Py_wfopen( + const wchar_t *path, + const wchar_t *mode); + +PyAPI_FUNC(FILE*) _Py_fopen( + const char *pathname, + const char *mode); + +PyAPI_FUNC(FILE*) _Py_fopen_obj( + PyObject *path, + const char *mode); + +PyAPI_FUNC(Py_ssize_t) _Py_read( + int fd, + void *buf, + size_t count); + +PyAPI_FUNC(Py_ssize_t) _Py_write( + int fd, + const void *buf, + size_t count); + +PyAPI_FUNC(Py_ssize_t) _Py_write_noraise( + int fd, + const void *buf, + size_t count); + +#ifdef HAVE_READLINK +PyAPI_FUNC(int) _Py_wreadlink( + const wchar_t *path, + wchar_t *buf, + size_t bufsiz); +#endif + +#ifdef HAVE_REALPATH +PyAPI_FUNC(wchar_t*) _Py_wrealpath( + const wchar_t *path, + wchar_t *resolved_path, + size_t resolved_path_size); +#endif + +PyAPI_FUNC(wchar_t*) _Py_wgetcwd( + wchar_t *buf, + size_t size); + +PyAPI_FUNC(int) _Py_get_inheritable(int fd); + +PyAPI_FUNC(int) _Py_set_inheritable(int fd, int inheritable, + int *atomic_flag_works); + +PyAPI_FUNC(int) _Py_set_inheritable_async_safe(int fd, int inheritable, + int *atomic_flag_works); + +PyAPI_FUNC(int) _Py_dup(int fd); + +#ifndef MS_WINDOWS +PyAPI_FUNC(int) _Py_get_blocking(int fd); + +PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); +#endif /* !MS_WINDOWS */ + +PyAPI_FUNC(int) _Py_GetLocaleconvNumeric( + PyObject **decimal_point, + PyObject **thousands_sep, + const char **grouping); + +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_FILEUTILS_H */ diff --git a/venv/Include/floatobject.h b/venv/Include/floatobject.h new file mode 100644 index 00000000..f1044d64 --- /dev/null +++ b/venv/Include/floatobject.h @@ -0,0 +1,130 @@ + +/* Float object interface */ + +/* +PyFloatObject represents a (double precision) floating point number. +*/ + +#ifndef Py_FLOATOBJECT_H +#define Py_FLOATOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_HEAD + double ob_fval; +} PyFloatObject; +#endif + +PyAPI_DATA(PyTypeObject) PyFloat_Type; + +#define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type) +#define PyFloat_CheckExact(op) (Py_TYPE(op) == &PyFloat_Type) + +#ifdef Py_NAN +#define Py_RETURN_NAN return PyFloat_FromDouble(Py_NAN) +#endif + +#define Py_RETURN_INF(sign) do \ + if (copysign(1., sign) == 1.) { \ + return PyFloat_FromDouble(Py_HUGE_VAL); \ + } else { \ + return PyFloat_FromDouble(-Py_HUGE_VAL); \ + } while(0) + +PyAPI_FUNC(double) PyFloat_GetMax(void); +PyAPI_FUNC(double) PyFloat_GetMin(void); +PyAPI_FUNC(PyObject *) PyFloat_GetInfo(void); + +/* Return Python float from string PyObject. */ +PyAPI_FUNC(PyObject *) PyFloat_FromString(PyObject*); + +/* Return Python float from C double. */ +PyAPI_FUNC(PyObject *) PyFloat_FromDouble(double); + +/* Extract C double from Python float. The macro version trades safety for + speed. */ +PyAPI_FUNC(double) PyFloat_AsDouble(PyObject *); +#ifndef Py_LIMITED_API +#define PyFloat_AS_DOUBLE(op) (((PyFloatObject *)(op))->ob_fval) +#endif + +#ifndef Py_LIMITED_API +/* _PyFloat_{Pack,Unpack}{4,8} + * + * The struct and pickle (at least) modules need an efficient platform- + * independent way to store floating-point values as byte strings. + * The Pack routines produce a string from a C double, and the Unpack + * routines produce a C double from such a string. The suffix (4 or 8) + * specifies the number of bytes in the string. + * + * On platforms that appear to use (see _PyFloat_Init()) IEEE-754 formats + * these functions work by copying bits. On other platforms, the formats the + * 4- byte format is identical to the IEEE-754 single precision format, and + * the 8-byte format to the IEEE-754 double precision format, although the + * packing of INFs and NaNs (if such things exist on the platform) isn't + * handled correctly, and attempting to unpack a string containing an IEEE + * INF or NaN will raise an exception. + * + * On non-IEEE platforms with more precision, or larger dynamic range, than + * 754 supports, not all values can be packed; on non-IEEE platforms with less + * precision, or smaller dynamic range, not all values can be unpacked. What + * happens in such cases is partly accidental (alas). + */ + +/* The pack routines write 2, 4 or 8 bytes, starting at p. le is a bool + * argument, true if you want the string in little-endian format (exponent + * last, at p+1, p+3 or p+7), false if you want big-endian format (exponent + * first, at p). + * Return value: 0 if all is OK, -1 if error (and an exception is + * set, most likely OverflowError). + * There are two problems on non-IEEE platforms: + * 1): What this does is undefined if x is a NaN or infinity. + * 2): -0.0 and +0.0 produce the same string. + */ +PyAPI_FUNC(int) _PyFloat_Pack2(double x, unsigned char *p, int le); +PyAPI_FUNC(int) _PyFloat_Pack4(double x, unsigned char *p, int le); +PyAPI_FUNC(int) _PyFloat_Pack8(double x, unsigned char *p, int le); + +/* Needed for the old way for marshal to store a floating point number. + Returns the string length copied into p, -1 on error. + */ +PyAPI_FUNC(int) _PyFloat_Repr(double x, char *p, size_t len); + +/* Used to get the important decimal digits of a double */ +PyAPI_FUNC(int) _PyFloat_Digits(char *buf, double v, int *signum); +PyAPI_FUNC(void) _PyFloat_DigitsInit(void); + +/* The unpack routines read 2, 4 or 8 bytes, starting at p. le is a bool + * argument, true if the string is in little-endian format (exponent + * last, at p+1, p+3 or p+7), false if big-endian (exponent first, at p). + * Return value: The unpacked double. On error, this is -1.0 and + * PyErr_Occurred() is true (and an exception is set, most likely + * OverflowError). Note that on a non-IEEE platform this will refuse + * to unpack a string that represents a NaN or infinity. + */ +PyAPI_FUNC(double) _PyFloat_Unpack2(const unsigned char *p, int le); +PyAPI_FUNC(double) _PyFloat_Unpack4(const unsigned char *p, int le); +PyAPI_FUNC(double) _PyFloat_Unpack8(const unsigned char *p, int le); + +/* free list api */ +PyAPI_FUNC(int) PyFloat_ClearFreeList(void); + +PyAPI_FUNC(void) _PyFloat_DebugMallocStats(FILE* out); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(int) _PyFloat_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FLOATOBJECT_H */ diff --git a/venv/Include/frameobject.h b/venv/Include/frameobject.h new file mode 100644 index 00000000..a95baf88 --- /dev/null +++ b/venv/Include/frameobject.h @@ -0,0 +1,93 @@ + +/* Frame object interface */ + +#ifndef Py_LIMITED_API +#ifndef Py_FRAMEOBJECT_H +#define Py_FRAMEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int b_type; /* what kind of block this is */ + int b_handler; /* where to jump to find handler */ + int b_level; /* value stack level to pop to */ +} PyTryBlock; + +typedef struct _frame { + PyObject_VAR_HEAD + struct _frame *f_back; /* previous frame, or NULL */ + PyCodeObject *f_code; /* code segment */ + PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ + PyObject *f_globals; /* global symbol table (PyDictObject) */ + PyObject *f_locals; /* local symbol table (any mapping) */ + PyObject **f_valuestack; /* points after the last local */ + /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. + Frame evaluation usually NULLs it, but a frame that yields sets it + to the current stack top. */ + PyObject **f_stacktop; + PyObject *f_trace; /* Trace function */ + char f_trace_lines; /* Emit per-line trace events? */ + char f_trace_opcodes; /* Emit per-opcode trace events? */ + + /* Borrowed reference to a generator, or NULL */ + PyObject *f_gen; + + int f_lasti; /* Last instruction if called */ + /* Call PyFrame_GetLineNumber() instead of reading this field + directly. As of 2.3 f_lineno is only valid when tracing is + active (i.e. when f_trace is set). At other times we use + PyCode_Addr2Line to calculate the line from the current + bytecode index. */ + int f_lineno; /* Current line number */ + int f_iblock; /* index in f_blockstack */ + char f_executing; /* whether the frame is still executing */ + PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ + PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ +} PyFrameObject; + + +/* Standard object interface */ + +PyAPI_DATA(PyTypeObject) PyFrame_Type; + +#define PyFrame_Check(op) (Py_TYPE(op) == &PyFrame_Type) + +PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + +/* only internal use */ +PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + + +/* The rest of the interface is specific for frame objects */ + +/* Block management functions */ + +PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); +PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); + +/* Extend the value stack */ + +PyAPI_FUNC(PyObject **) PyFrame_ExtendStack(PyFrameObject *, int, int); + +/* Conversions between "fast locals" and locals in dictionary */ + +PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); + +PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); +PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); + +PyAPI_FUNC(int) PyFrame_ClearFreeList(void); + +PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); + +/* Return the line of code the frame is currently executing. */ +PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FRAMEOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/venv/Include/funcobject.h b/venv/Include/funcobject.h new file mode 100644 index 00000000..86674ac9 --- /dev/null +++ b/venv/Include/funcobject.h @@ -0,0 +1,103 @@ + +/* Function object interface */ +#ifndef Py_LIMITED_API +#ifndef Py_FUNCOBJECT_H +#define Py_FUNCOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Function objects and code objects should not be confused with each other: + * + * Function objects are created by the execution of the 'def' statement. + * They reference a code object in their __code__ attribute, which is a + * purely syntactic object, i.e. nothing more than a compiled version of some + * source code lines. There is one code object per source code "fragment", + * but each code object can be referenced by zero or many function objects + * depending only on how many times the 'def' statement in the source was + * executed so far. + */ + +typedef struct { + PyObject_HEAD + PyObject *func_code; /* A code object, the __code__ attribute */ + PyObject *func_globals; /* A dictionary (other mappings won't do) */ + PyObject *func_defaults; /* NULL or a tuple */ + PyObject *func_kwdefaults; /* NULL or a dict */ + PyObject *func_closure; /* NULL or a tuple of cell objects */ + PyObject *func_doc; /* The __doc__ attribute, can be anything */ + PyObject *func_name; /* The __name__ attribute, a string object */ + PyObject *func_dict; /* The __dict__ attribute, a dict or NULL */ + PyObject *func_weakreflist; /* List of weak references */ + PyObject *func_module; /* The __module__ attribute, can be anything */ + PyObject *func_annotations; /* Annotations, a dict or NULL */ + PyObject *func_qualname; /* The qualified name */ + + /* Invariant: + * func_closure contains the bindings for func_code->co_freevars, so + * PyTuple_Size(func_closure) == PyCode_GetNumFree(func_code) + * (func_closure may be NULL if PyCode_GetNumFree(func_code) == 0). + */ +} PyFunctionObject; + +PyAPI_DATA(PyTypeObject) PyFunction_Type; + +#define PyFunction_Check(op) (Py_TYPE(op) == &PyFunction_Type) + +PyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_NewWithQualName(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetCode(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetGlobals(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetModule(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetDefaults(PyObject *); +PyAPI_FUNC(int) PyFunction_SetDefaults(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetKwDefaults(PyObject *); +PyAPI_FUNC(int) PyFunction_SetKwDefaults(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetClosure(PyObject *); +PyAPI_FUNC(int) PyFunction_SetClosure(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetAnnotations(PyObject *); +PyAPI_FUNC(int) PyFunction_SetAnnotations(PyObject *, PyObject *); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyFunction_FastCallDict( + PyObject *func, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyFunction_FastCallKeywords( + PyObject *func, + PyObject *const *stack, + Py_ssize_t nargs, + PyObject *kwnames); +#endif + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyFunction_GET_CODE(func) \ + (((PyFunctionObject *)func) -> func_code) +#define PyFunction_GET_GLOBALS(func) \ + (((PyFunctionObject *)func) -> func_globals) +#define PyFunction_GET_MODULE(func) \ + (((PyFunctionObject *)func) -> func_module) +#define PyFunction_GET_DEFAULTS(func) \ + (((PyFunctionObject *)func) -> func_defaults) +#define PyFunction_GET_KW_DEFAULTS(func) \ + (((PyFunctionObject *)func) -> func_kwdefaults) +#define PyFunction_GET_CLOSURE(func) \ + (((PyFunctionObject *)func) -> func_closure) +#define PyFunction_GET_ANNOTATIONS(func) \ + (((PyFunctionObject *)func) -> func_annotations) + +/* The classmethod and staticmethod types lives here, too */ +PyAPI_DATA(PyTypeObject) PyClassMethod_Type; +PyAPI_DATA(PyTypeObject) PyStaticMethod_Type; + +PyAPI_FUNC(PyObject *) PyClassMethod_New(PyObject *); +PyAPI_FUNC(PyObject *) PyStaticMethod_New(PyObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FUNCOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/venv/Include/genobject.h b/venv/Include/genobject.h new file mode 100644 index 00000000..16b98333 --- /dev/null +++ b/venv/Include/genobject.h @@ -0,0 +1,105 @@ + +/* Generator object interface */ + +#ifndef Py_LIMITED_API +#ifndef Py_GENOBJECT_H +#define Py_GENOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +struct _frame; /* Avoid including frameobject.h */ + +/* _PyGenObject_HEAD defines the initial segment of generator + and coroutine objects. */ +#define _PyGenObject_HEAD(prefix) \ + PyObject_HEAD \ + /* Note: gi_frame can be NULL if the generator is "finished" */ \ + struct _frame *prefix##_frame; \ + /* True if generator is being executed. */ \ + char prefix##_running; \ + /* The code object backing the generator */ \ + PyObject *prefix##_code; \ + /* List of weak reference. */ \ + PyObject *prefix##_weakreflist; \ + /* Name of the generator. */ \ + PyObject *prefix##_name; \ + /* Qualified name of the generator. */ \ + PyObject *prefix##_qualname; \ + _PyErr_StackItem prefix##_exc_state; + +typedef struct { + /* The gi_ prefix is intended to remind of generator-iterator. */ + _PyGenObject_HEAD(gi) +} PyGenObject; + +PyAPI_DATA(PyTypeObject) PyGen_Type; + +#define PyGen_Check(op) PyObject_TypeCheck(op, &PyGen_Type) +#define PyGen_CheckExact(op) (Py_TYPE(op) == &PyGen_Type) + +PyAPI_FUNC(PyObject *) PyGen_New(struct _frame *); +PyAPI_FUNC(PyObject *) PyGen_NewWithQualName(struct _frame *, + PyObject *name, PyObject *qualname); +PyAPI_FUNC(int) PyGen_NeedsFinalizing(PyGenObject *); +PyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *); +PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **); +PyAPI_FUNC(PyObject *) _PyGen_Send(PyGenObject *, PyObject *); +PyObject *_PyGen_yf(PyGenObject *); +PyAPI_FUNC(void) _PyGen_Finalize(PyObject *self); + +#ifndef Py_LIMITED_API +typedef struct { + _PyGenObject_HEAD(cr) + PyObject *cr_origin; +} PyCoroObject; + +PyAPI_DATA(PyTypeObject) PyCoro_Type; +PyAPI_DATA(PyTypeObject) _PyCoroWrapper_Type; + +PyAPI_DATA(PyTypeObject) _PyAIterWrapper_Type; + +#define PyCoro_CheckExact(op) (Py_TYPE(op) == &PyCoro_Type) +PyObject *_PyCoro_GetAwaitableIter(PyObject *o); +PyAPI_FUNC(PyObject *) PyCoro_New(struct _frame *, + PyObject *name, PyObject *qualname); + +/* Asynchronous Generators */ + +typedef struct { + _PyGenObject_HEAD(ag) + PyObject *ag_finalizer; + + /* Flag is set to 1 when hooks set up by sys.set_asyncgen_hooks + were called on the generator, to avoid calling them more + than once. */ + int ag_hooks_inited; + + /* Flag is set to 1 when aclose() is called for the first time, or + when a StopAsyncIteration exception is raised. */ + int ag_closed; +} PyAsyncGenObject; + +PyAPI_DATA(PyTypeObject) PyAsyncGen_Type; +PyAPI_DATA(PyTypeObject) _PyAsyncGenASend_Type; +PyAPI_DATA(PyTypeObject) _PyAsyncGenWrappedValue_Type; +PyAPI_DATA(PyTypeObject) _PyAsyncGenAThrow_Type; + +PyAPI_FUNC(PyObject *) PyAsyncGen_New(struct _frame *, + PyObject *name, PyObject *qualname); + +#define PyAsyncGen_CheckExact(op) (Py_TYPE(op) == &PyAsyncGen_Type) + +PyObject *_PyAsyncGenValueWrapperNew(PyObject *); + +int PyAsyncGen_ClearFreeLists(void); + +#endif + +#undef _PyGenObject_HEAD + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GENOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/venv/Include/graminit.h b/venv/Include/graminit.h new file mode 100644 index 00000000..bdfe821a --- /dev/null +++ b/venv/Include/graminit.h @@ -0,0 +1,89 @@ +/* Generated by Parser/pgen */ + +#define single_input 256 +#define file_input 257 +#define eval_input 258 +#define decorator 259 +#define decorators 260 +#define decorated 261 +#define async_funcdef 262 +#define funcdef 263 +#define parameters 264 +#define typedargslist 265 +#define tfpdef 266 +#define varargslist 267 +#define vfpdef 268 +#define stmt 269 +#define simple_stmt 270 +#define small_stmt 271 +#define expr_stmt 272 +#define annassign 273 +#define testlist_star_expr 274 +#define augassign 275 +#define del_stmt 276 +#define pass_stmt 277 +#define flow_stmt 278 +#define break_stmt 279 +#define continue_stmt 280 +#define return_stmt 281 +#define yield_stmt 282 +#define raise_stmt 283 +#define import_stmt 284 +#define import_name 285 +#define import_from 286 +#define import_as_name 287 +#define dotted_as_name 288 +#define import_as_names 289 +#define dotted_as_names 290 +#define dotted_name 291 +#define global_stmt 292 +#define nonlocal_stmt 293 +#define assert_stmt 294 +#define compound_stmt 295 +#define async_stmt 296 +#define if_stmt 297 +#define while_stmt 298 +#define for_stmt 299 +#define try_stmt 300 +#define with_stmt 301 +#define with_item 302 +#define except_clause 303 +#define suite 304 +#define test 305 +#define test_nocond 306 +#define lambdef 307 +#define lambdef_nocond 308 +#define or_test 309 +#define and_test 310 +#define not_test 311 +#define comparison 312 +#define comp_op 313 +#define star_expr 314 +#define expr 315 +#define xor_expr 316 +#define and_expr 317 +#define shift_expr 318 +#define arith_expr 319 +#define term 320 +#define factor 321 +#define power 322 +#define atom_expr 323 +#define atom 324 +#define testlist_comp 325 +#define trailer 326 +#define subscriptlist 327 +#define subscript 328 +#define sliceop 329 +#define exprlist 330 +#define testlist 331 +#define dictorsetmaker 332 +#define classdef 333 +#define arglist 334 +#define argument 335 +#define comp_iter 336 +#define sync_comp_for 337 +#define comp_for 338 +#define comp_if 339 +#define encoding_decl 340 +#define yield_expr 341 +#define yield_arg 342 diff --git a/venv/Include/grammar.h b/venv/Include/grammar.h new file mode 100644 index 00000000..e1703f4b --- /dev/null +++ b/venv/Include/grammar.h @@ -0,0 +1,94 @@ + +/* Grammar interface */ + +#ifndef Py_GRAMMAR_H +#define Py_GRAMMAR_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "bitset.h" /* Sigh... */ + +/* A label of an arc */ + +typedef struct { + int lb_type; + char *lb_str; +} label; + +#define EMPTY 0 /* Label number 0 is by definition the empty label */ + +/* A list of labels */ + +typedef struct { + int ll_nlabels; + label *ll_label; +} labellist; + +/* An arc from one state to another */ + +typedef struct { + short a_lbl; /* Label of this arc */ + short a_arrow; /* State where this arc goes to */ +} arc; + +/* A state in a DFA */ + +typedef struct { + int s_narcs; + arc *s_arc; /* Array of arcs */ + + /* Optional accelerators */ + int s_lower; /* Lowest label index */ + int s_upper; /* Highest label index */ + int *s_accel; /* Accelerator */ + int s_accept; /* Nonzero for accepting state */ +} state; + +/* A DFA */ + +typedef struct { + int d_type; /* Non-terminal this represents */ + char *d_name; /* For printing */ + int d_initial; /* Initial state */ + int d_nstates; + state *d_state; /* Array of states */ + bitset d_first; +} dfa; + +/* A grammar */ + +typedef struct { + int g_ndfas; + dfa *g_dfa; /* Array of DFAs */ + labellist g_ll; + int g_start; /* Start symbol of the grammar */ + int g_accel; /* Set if accelerators present */ +} grammar; + +/* FUNCTIONS */ + +grammar *newgrammar(int start); +void freegrammar(grammar *g); +dfa *adddfa(grammar *g, int type, const char *name); +int addstate(dfa *d); +void addarc(dfa *d, int from, int to, int lbl); +dfa *PyGrammar_FindDFA(grammar *g, int type); + +int addlabel(labellist *ll, int type, const char *str); +int findlabel(labellist *ll, int type, const char *str); +const char *PyGrammar_LabelRepr(label *lb); +void translatelabels(grammar *g); + +void addfirstsets(grammar *g); + +void PyGrammar_AddAccelerators(grammar *g); +void PyGrammar_RemoveAccelerators(grammar *); + +void printgrammar(grammar *g, FILE *fp); +void printnonterminals(grammar *g, FILE *fp); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GRAMMAR_H */ diff --git a/venv/Include/import.h b/venv/Include/import.h new file mode 100644 index 00000000..13f32a10 --- /dev/null +++ b/venv/Include/import.h @@ -0,0 +1,154 @@ + +/* Module definition and import interface */ + +#ifndef Py_IMPORT_H +#define Py_IMPORT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(_PyInitError) _PyImportZip_Init(void); + +PyMODINIT_FUNC PyInit__imp(void); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(long) PyImport_GetMagicNumber(void); +PyAPI_FUNC(const char *) PyImport_GetMagicTag(void); +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModule( + const char *name, /* UTF-8 encoded string */ + PyObject *co + ); +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleEx( + const char *name, /* UTF-8 encoded string */ + PyObject *co, + const char *pathname /* decoded from the filesystem encoding */ + ); +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleWithPathnames( + const char *name, /* UTF-8 encoded string */ + PyObject *co, + const char *pathname, /* decoded from the filesystem encoding */ + const char *cpathname /* decoded from the filesystem encoding */ + ); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleObject( + PyObject *name, + PyObject *co, + PyObject *pathname, + PyObject *cpathname + ); +#endif +PyAPI_FUNC(PyObject *) PyImport_GetModuleDict(void); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 +PyAPI_FUNC(PyObject *) PyImport_GetModule(PyObject *name); +#endif +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyImport_IsInitialized(PyInterpreterState *); +PyAPI_FUNC(PyObject *) _PyImport_GetModuleId(struct _Py_Identifier *name); +PyAPI_FUNC(PyObject *) _PyImport_AddModuleObject(PyObject *name, + PyObject *modules); +PyAPI_FUNC(int) _PyImport_SetModule(PyObject *name, PyObject *module); +PyAPI_FUNC(int) _PyImport_SetModuleString(const char *name, PyObject* module); +#endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyImport_AddModuleObject( + PyObject *name + ); +#endif +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyImport_AddModuleObject(PyObject *, PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyImport_AddModule( + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) PyImport_ImportModule( + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) PyImport_ImportModuleNoBlock( + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevel( + const char *name, /* UTF-8 encoded string */ + PyObject *globals, + PyObject *locals, + PyObject *fromlist, + int level + ); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevelObject( + PyObject *name, + PyObject *globals, + PyObject *locals, + PyObject *fromlist, + int level + ); +#endif + +#define PyImport_ImportModuleEx(n, g, l, f) \ + PyImport_ImportModuleLevel(n, g, l, f, 0) + +PyAPI_FUNC(PyObject *) PyImport_GetImporter(PyObject *path); +PyAPI_FUNC(PyObject *) PyImport_Import(PyObject *name); +PyAPI_FUNC(PyObject *) PyImport_ReloadModule(PyObject *m); +PyAPI_FUNC(void) PyImport_Cleanup(void); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(int) PyImport_ImportFrozenModuleObject( + PyObject *name + ); +#endif +PyAPI_FUNC(int) PyImport_ImportFrozenModule( + const char *name /* UTF-8 encoded string */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyImport_AcquireLock(void); +PyAPI_FUNC(int) _PyImport_ReleaseLock(void); + +PyAPI_FUNC(void) _PyImport_ReInitLock(void); + +PyAPI_FUNC(PyObject *) _PyImport_FindBuiltin( + const char *name, /* UTF-8 encoded string */ + PyObject *modules + ); +PyAPI_FUNC(PyObject *) _PyImport_FindExtensionObject(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyImport_FindExtensionObjectEx(PyObject *, PyObject *, + PyObject *); +PyAPI_FUNC(int) _PyImport_FixupBuiltin( + PyObject *mod, + const char *name, /* UTF-8 encoded string */ + PyObject *modules + ); +PyAPI_FUNC(int) _PyImport_FixupExtensionObject(PyObject*, PyObject *, + PyObject *, PyObject *); + +struct _inittab { + const char *name; /* ASCII encoded string */ + PyObject* (*initfunc)(void); +}; +PyAPI_DATA(struct _inittab *) PyImport_Inittab; +PyAPI_FUNC(int) PyImport_ExtendInittab(struct _inittab *newtab); +#endif /* Py_LIMITED_API */ + +PyAPI_DATA(PyTypeObject) PyNullImporter_Type; + +PyAPI_FUNC(int) PyImport_AppendInittab( + const char *name, /* ASCII encoded string */ + PyObject* (*initfunc)(void) + ); + +#ifndef Py_LIMITED_API +struct _frozen { + const char *name; /* ASCII encoded string */ + const unsigned char *code; + int size; +}; + +/* Embedding apps may change this pointer to point to their favorite + collection of frozen modules: */ + +PyAPI_DATA(const struct _frozen *) PyImport_FrozenModules; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_IMPORT_H */ diff --git a/venv/Include/intrcheck.h b/venv/Include/intrcheck.h new file mode 100644 index 00000000..2e17336c --- /dev/null +++ b/venv/Include/intrcheck.h @@ -0,0 +1,33 @@ + +#ifndef Py_INTRCHECK_H +#define Py_INTRCHECK_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(int) PyOS_InterruptOccurred(void); +PyAPI_FUNC(void) PyOS_InitInterrupts(void); +#ifdef HAVE_FORK +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 +PyAPI_FUNC(void) PyOS_BeforeFork(void); +PyAPI_FUNC(void) PyOS_AfterFork_Parent(void); +PyAPI_FUNC(void) PyOS_AfterFork_Child(void); +#endif +#endif +/* Deprecated, please use PyOS_AfterFork_Child() instead */ +PyAPI_FUNC(void) PyOS_AfterFork(void) Py_DEPRECATED(3.7); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyOS_IsMainThread(void); +PyAPI_FUNC(void) _PySignal_AfterFork(void); + +#ifdef MS_WINDOWS +/* windows.h is not included by Python.h so use void* instead of HANDLE */ +PyAPI_FUNC(void*) _PyOS_SigintEvent(void); +#endif +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTRCHECK_H */ diff --git a/venv/Include/iterobject.h b/venv/Include/iterobject.h new file mode 100644 index 00000000..f61726f1 --- /dev/null +++ b/venv/Include/iterobject.h @@ -0,0 +1,25 @@ +#ifndef Py_ITEROBJECT_H +#define Py_ITEROBJECT_H +/* Iterators (the basic kind, over a sequence) */ +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PySeqIter_Type; +PyAPI_DATA(PyTypeObject) PyCallIter_Type; +PyAPI_DATA(PyTypeObject) PyCmpWrapper_Type; + +#define PySeqIter_Check(op) (Py_TYPE(op) == &PySeqIter_Type) + +PyAPI_FUNC(PyObject *) PySeqIter_New(PyObject *); + + +#define PyCallIter_Check(op) (Py_TYPE(op) == &PyCallIter_Type) + +PyAPI_FUNC(PyObject *) PyCallIter_New(PyObject *, PyObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ITEROBJECT_H */ + diff --git a/venv/Include/listobject.h b/venv/Include/listobject.h new file mode 100644 index 00000000..6057279d --- /dev/null +++ b/venv/Include/listobject.h @@ -0,0 +1,81 @@ + +/* List object interface */ + +/* +Another generally useful object type is a list of object pointers. +This is a mutable type: the list items can be changed, and items can be +added or removed. Out-of-range indices or non-list objects are ignored. + +*** WARNING *** PyList_SetItem does not increment the new item's reference +count, but does decrement the reference count of the item it replaces, +if not nil. It does *decrement* the reference count if it is *not* +inserted in the list. Similarly, PyList_GetItem does not increment the +returned item's reference count. +*/ + +#ifndef Py_LISTOBJECT_H +#define Py_LISTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_VAR_HEAD + /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ + PyObject **ob_item; + + /* ob_item contains space for 'allocated' elements. The number + * currently in use is ob_size. + * Invariants: + * 0 <= ob_size <= allocated + * len(list) == ob_size + * ob_item == NULL implies ob_size == allocated == 0 + * list.sort() temporarily sets allocated to -1 to detect mutations. + * + * Items must normally not be NULL, except during construction when + * the list is not yet visible outside the function that builds it. + */ + Py_ssize_t allocated; +} PyListObject; +#endif + +PyAPI_DATA(PyTypeObject) PyList_Type; +PyAPI_DATA(PyTypeObject) PyListIter_Type; +PyAPI_DATA(PyTypeObject) PyListRevIter_Type; +PyAPI_DATA(PyTypeObject) PySortWrapper_Type; + +#define PyList_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS) +#define PyList_CheckExact(op) (Py_TYPE(op) == &PyList_Type) + +PyAPI_FUNC(PyObject *) PyList_New(Py_ssize_t size); +PyAPI_FUNC(Py_ssize_t) PyList_Size(PyObject *); +PyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyList_SetItem(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Insert(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Append(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyList_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); +PyAPI_FUNC(int) PyList_SetSlice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Sort(PyObject *); +PyAPI_FUNC(int) PyList_Reverse(PyObject *); +PyAPI_FUNC(PyObject *) PyList_AsTuple(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *); + +PyAPI_FUNC(int) PyList_ClearFreeList(void); +PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); +#endif + +/* Macro, trading safety for speed */ +#ifndef Py_LIMITED_API +#define PyList_GET_ITEM(op, i) (((PyListObject *)(op))->ob_item[i]) +#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v)) +#define PyList_GET_SIZE(op) (assert(PyList_Check(op)),Py_SIZE(op)) +#define _PyList_ITEMS(op) (((PyListObject *)(op))->ob_item) +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LISTOBJECT_H */ diff --git a/venv/Include/longintrepr.h b/venv/Include/longintrepr.h new file mode 100644 index 00000000..ff4155f9 --- /dev/null +++ b/venv/Include/longintrepr.h @@ -0,0 +1,99 @@ +#ifndef Py_LIMITED_API +#ifndef Py_LONGINTREPR_H +#define Py_LONGINTREPR_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* This is published for the benefit of "friends" marshal.c and _decimal.c. */ + +/* Parameters of the integer representation. There are two different + sets of parameters: one set for 30-bit digits, stored in an unsigned 32-bit + integer type, and one set for 15-bit digits with each digit stored in an + unsigned short. The value of PYLONG_BITS_IN_DIGIT, defined either at + configure time or in pyport.h, is used to decide which digit size to use. + + Type 'digit' should be able to hold 2*PyLong_BASE-1, and type 'twodigits' + should be an unsigned integer type able to hold all integers up to + PyLong_BASE*PyLong_BASE-1. x_sub assumes that 'digit' is an unsigned type, + and that overflow is handled by taking the result modulo 2**N for some N > + PyLong_SHIFT. The majority of the code doesn't care about the precise + value of PyLong_SHIFT, but there are some notable exceptions: + + - long_pow() requires that PyLong_SHIFT be divisible by 5 + + - PyLong_{As,From}ByteArray require that PyLong_SHIFT be at least 8 + + - long_hash() requires that PyLong_SHIFT is *strictly* less than the number + of bits in an unsigned long, as do the PyLong <-> long (or unsigned long) + conversion functions + + - the Python int <-> size_t/Py_ssize_t conversion functions expect that + PyLong_SHIFT is strictly less than the number of bits in a size_t + + - the marshal code currently expects that PyLong_SHIFT is a multiple of 15 + + - NSMALLNEGINTS and NSMALLPOSINTS should be small enough to fit in a single + digit; with the current values this forces PyLong_SHIFT >= 9 + + The values 15 and 30 should fit all of the above requirements, on any + platform. +*/ + +#if PYLONG_BITS_IN_DIGIT == 30 +typedef uint32_t digit; +typedef int32_t sdigit; /* signed variant of digit */ +typedef uint64_t twodigits; +typedef int64_t stwodigits; /* signed variant of twodigits */ +#define PyLong_SHIFT 30 +#define _PyLong_DECIMAL_SHIFT 9 /* max(e such that 10**e fits in a digit) */ +#define _PyLong_DECIMAL_BASE ((digit)1000000000) /* 10 ** DECIMAL_SHIFT */ +#elif PYLONG_BITS_IN_DIGIT == 15 +typedef unsigned short digit; +typedef short sdigit; /* signed variant of digit */ +typedef unsigned long twodigits; +typedef long stwodigits; /* signed variant of twodigits */ +#define PyLong_SHIFT 15 +#define _PyLong_DECIMAL_SHIFT 4 /* max(e such that 10**e fits in a digit) */ +#define _PyLong_DECIMAL_BASE ((digit)10000) /* 10 ** DECIMAL_SHIFT */ +#else +#error "PYLONG_BITS_IN_DIGIT should be 15 or 30" +#endif +#define PyLong_BASE ((digit)1 << PyLong_SHIFT) +#define PyLong_MASK ((digit)(PyLong_BASE - 1)) + +#if PyLong_SHIFT % 5 != 0 +#error "longobject.c requires that PyLong_SHIFT be divisible by 5" +#endif + +/* Long integer representation. + The absolute value of a number is equal to + SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i) + Negative numbers are represented with ob_size < 0; + zero is represented by ob_size == 0. + In a normalized number, ob_digit[abs(ob_size)-1] (the most significant + digit) is never zero. Also, in all cases, for all valid i, + 0 <= ob_digit[i] <= MASK. + The allocation function takes care of allocating extra memory + so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available. + + CAUTION: Generic code manipulating subtypes of PyVarObject has to + aware that ints abuse ob_size's sign bit. +*/ + +struct _longobject { + PyObject_VAR_HEAD + digit ob_digit[1]; +}; + +PyAPI_FUNC(PyLongObject *) _PyLong_New(Py_ssize_t); + +/* Return a copy of src. */ +PyAPI_FUNC(PyObject *) _PyLong_Copy(PyLongObject *src); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LONGINTREPR_H */ +#endif /* Py_LIMITED_API */ diff --git a/venv/Include/longobject.h b/venv/Include/longobject.h new file mode 100644 index 00000000..7bdd0472 --- /dev/null +++ b/venv/Include/longobject.h @@ -0,0 +1,220 @@ +#ifndef Py_LONGOBJECT_H +#define Py_LONGOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Long (arbitrary precision) integer object interface */ + +typedef struct _longobject PyLongObject; /* Revealed in longintrepr.h */ + +PyAPI_DATA(PyTypeObject) PyLong_Type; + +#define PyLong_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LONG_SUBCLASS) +#define PyLong_CheckExact(op) (Py_TYPE(op) == &PyLong_Type) + +PyAPI_FUNC(PyObject *) PyLong_FromLong(long); +PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLong(unsigned long); +PyAPI_FUNC(PyObject *) PyLong_FromSize_t(size_t); +PyAPI_FUNC(PyObject *) PyLong_FromSsize_t(Py_ssize_t); +PyAPI_FUNC(PyObject *) PyLong_FromDouble(double); +PyAPI_FUNC(long) PyLong_AsLong(PyObject *); +PyAPI_FUNC(long) PyLong_AsLongAndOverflow(PyObject *, int *); +PyAPI_FUNC(Py_ssize_t) PyLong_AsSsize_t(PyObject *); +PyAPI_FUNC(size_t) PyLong_AsSize_t(PyObject *); +PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLong(PyObject *); +PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLongMask(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyLong_AsInt(PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyLong_GetInfo(void); + +/* It may be useful in the future. I've added it in the PyInt -> PyLong + cleanup to keep the extra information. [CH] */ +#define PyLong_AS_LONG(op) PyLong_AsLong(op) + +/* Issue #1983: pid_t can be longer than a C long on some systems */ +#if !defined(SIZEOF_PID_T) || SIZEOF_PID_T == SIZEOF_INT +#define _Py_PARSE_PID "i" +#define PyLong_FromPid PyLong_FromLong +#define PyLong_AsPid PyLong_AsLong +#elif SIZEOF_PID_T == SIZEOF_LONG +#define _Py_PARSE_PID "l" +#define PyLong_FromPid PyLong_FromLong +#define PyLong_AsPid PyLong_AsLong +#elif defined(SIZEOF_LONG_LONG) && SIZEOF_PID_T == SIZEOF_LONG_LONG +#define _Py_PARSE_PID "L" +#define PyLong_FromPid PyLong_FromLongLong +#define PyLong_AsPid PyLong_AsLongLong +#else +#error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)" +#endif /* SIZEOF_PID_T */ + +#if SIZEOF_VOID_P == SIZEOF_INT +# define _Py_PARSE_INTPTR "i" +# define _Py_PARSE_UINTPTR "I" +#elif SIZEOF_VOID_P == SIZEOF_LONG +# define _Py_PARSE_INTPTR "l" +# define _Py_PARSE_UINTPTR "k" +#elif defined(SIZEOF_LONG_LONG) && SIZEOF_VOID_P == SIZEOF_LONG_LONG +# define _Py_PARSE_INTPTR "L" +# define _Py_PARSE_UINTPTR "K" +#else +# error "void* different in size from int, long and long long" +#endif /* SIZEOF_VOID_P */ + +/* Used by Python/mystrtoul.c, _PyBytes_FromHex(), + _PyBytes_DecodeEscapeRecode(), etc. */ +#ifndef Py_LIMITED_API +PyAPI_DATA(unsigned char) _PyLong_DigitValue[256]; +#endif + +/* _PyLong_Frexp returns a double x and an exponent e such that the + true value is approximately equal to x * 2**e. e is >= 0. x is + 0.0 if and only if the input is 0 (in which case, e and x are both + zeroes); otherwise, 0.5 <= abs(x) < 1.0. On overflow, which is + possible if the number of bits doesn't fit into a Py_ssize_t, sets + OverflowError and returns -1.0 for x, 0 for e. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(double) _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e); +#endif + +PyAPI_FUNC(double) PyLong_AsDouble(PyObject *); +PyAPI_FUNC(PyObject *) PyLong_FromVoidPtr(void *); +PyAPI_FUNC(void *) PyLong_AsVoidPtr(PyObject *); + +PyAPI_FUNC(PyObject *) PyLong_FromLongLong(long long); +PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLongLong(unsigned long long); +PyAPI_FUNC(long long) PyLong_AsLongLong(PyObject *); +PyAPI_FUNC(unsigned long long) PyLong_AsUnsignedLongLong(PyObject *); +PyAPI_FUNC(unsigned long long) PyLong_AsUnsignedLongLongMask(PyObject *); +PyAPI_FUNC(long long) PyLong_AsLongLongAndOverflow(PyObject *, int *); + +PyAPI_FUNC(PyObject *) PyLong_FromString(const char *, char **, int); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyLong_FromUnicode(Py_UNICODE*, Py_ssize_t, int) Py_DEPRECATED(3.3); +PyAPI_FUNC(PyObject *) PyLong_FromUnicodeObject(PyObject *u, int base); +PyAPI_FUNC(PyObject *) _PyLong_FromBytes(const char *, Py_ssize_t, int); +#endif + +#ifndef Py_LIMITED_API +/* _PyLong_Sign. Return 0 if v is 0, -1 if v < 0, +1 if v > 0. + v must not be NULL, and must be a normalized long. + There are no error cases. +*/ +PyAPI_FUNC(int) _PyLong_Sign(PyObject *v); + + +/* _PyLong_NumBits. Return the number of bits needed to represent the + absolute value of a long. For example, this returns 1 for 1 and -1, 2 + for 2 and -2, and 2 for 3 and -3. It returns 0 for 0. + v must not be NULL, and must be a normalized long. + (size_t)-1 is returned and OverflowError set if the true result doesn't + fit in a size_t. +*/ +PyAPI_FUNC(size_t) _PyLong_NumBits(PyObject *v); + +/* _PyLong_DivmodNear. Given integers a and b, compute the nearest + integer q to the exact quotient a / b, rounding to the nearest even integer + in the case of a tie. Return (q, r), where r = a - q*b. The remainder r + will satisfy abs(r) <= abs(b)/2, with equality possible only if q is + even. +*/ +PyAPI_FUNC(PyObject *) _PyLong_DivmodNear(PyObject *, PyObject *); + +/* _PyLong_FromByteArray: View the n unsigned bytes as a binary integer in + base 256, and return a Python int with the same numeric value. + If n is 0, the integer is 0. Else: + If little_endian is 1/true, bytes[n-1] is the MSB and bytes[0] the LSB; + else (little_endian is 0/false) bytes[0] is the MSB and bytes[n-1] the + LSB. + If is_signed is 0/false, view the bytes as a non-negative integer. + If is_signed is 1/true, view the bytes as a 2's-complement integer, + non-negative if bit 0x80 of the MSB is clear, negative if set. + Error returns: + + Return NULL with the appropriate exception set if there's not + enough memory to create the Python int. +*/ +PyAPI_FUNC(PyObject *) _PyLong_FromByteArray( + const unsigned char* bytes, size_t n, + int little_endian, int is_signed); + +/* _PyLong_AsByteArray: Convert the least-significant 8*n bits of long + v to a base-256 integer, stored in array bytes. Normally return 0, + return -1 on error. + If little_endian is 1/true, store the MSB at bytes[n-1] and the LSB at + bytes[0]; else (little_endian is 0/false) store the MSB at bytes[0] and + the LSB at bytes[n-1]. + If is_signed is 0/false, it's an error if v < 0; else (v >= 0) n bytes + are filled and there's nothing special about bit 0x80 of the MSB. + If is_signed is 1/true, bytes is filled with the 2's-complement + representation of v's value. Bit 0x80 of the MSB is the sign bit. + Error returns (-1): + + is_signed is 0 and v < 0. TypeError is set in this case, and bytes + isn't altered. + + n isn't big enough to hold the full mathematical value of v. For + example, if is_signed is 0 and there are more digits in the v than + fit in n; or if is_signed is 1, v < 0, and n is just 1 bit shy of + being large enough to hold a sign bit. OverflowError is set in this + case, but bytes holds the least-significant n bytes of the true value. +*/ +PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v, + unsigned char* bytes, size_t n, + int little_endian, int is_signed); + +/* _PyLong_FromNbInt: Convert the given object to a PyLongObject + using the nb_int slot, if available. Raise TypeError if either the + nb_int slot is not available or the result of the call to nb_int + returns something not of type int. +*/ +PyAPI_FUNC(PyLongObject *)_PyLong_FromNbInt(PyObject *); + +/* _PyLong_Format: Convert the long to a string object with given base, + appending a base prefix of 0[box] if base is 2, 8 or 16. */ +PyAPI_FUNC(PyObject *) _PyLong_Format(PyObject *obj, int base); + +PyAPI_FUNC(int) _PyLong_FormatWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + int base, + int alternate); + +PyAPI_FUNC(char*) _PyLong_FormatBytesWriter( + _PyBytesWriter *writer, + char *str, + PyObject *obj, + int base, + int alternate); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(int) _PyLong_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); +#endif /* Py_LIMITED_API */ + +/* These aren't really part of the int object, but they're handy. The + functions are in Python/mystrtoul.c. + */ +PyAPI_FUNC(unsigned long) PyOS_strtoul(const char *, char **, int); +PyAPI_FUNC(long) PyOS_strtol(const char *, char **, int); + +#ifndef Py_LIMITED_API +/* For use by the gcd function in mathmodule.c */ +PyAPI_FUNC(PyObject *) _PyLong_GCD(PyObject *, PyObject *); +#endif /* !Py_LIMITED_API */ + +#ifndef Py_LIMITED_API +PyAPI_DATA(PyObject *) _PyLong_Zero; +PyAPI_DATA(PyObject *) _PyLong_One; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LONGOBJECT_H */ diff --git a/venv/Include/marshal.h b/venv/Include/marshal.h new file mode 100644 index 00000000..09d9337e --- /dev/null +++ b/venv/Include/marshal.h @@ -0,0 +1,28 @@ + +/* Interface for marshal.c */ + +#ifndef Py_MARSHAL_H +#define Py_MARSHAL_H +#ifdef __cplusplus +extern "C" { +#endif + +#define Py_MARSHAL_VERSION 4 + +PyAPI_FUNC(void) PyMarshal_WriteLongToFile(long, FILE *, int); +PyAPI_FUNC(void) PyMarshal_WriteObjectToFile(PyObject *, FILE *, int); +PyAPI_FUNC(PyObject *) PyMarshal_WriteObjectToString(PyObject *, int); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(long) PyMarshal_ReadLongFromFile(FILE *); +PyAPI_FUNC(int) PyMarshal_ReadShortFromFile(FILE *); +PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromFile(FILE *); +PyAPI_FUNC(PyObject *) PyMarshal_ReadLastObjectFromFile(FILE *); +#endif +PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromString(const char *, + Py_ssize_t); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MARSHAL_H */ diff --git a/venv/Include/memoryobject.h b/venv/Include/memoryobject.h new file mode 100644 index 00000000..990a716f --- /dev/null +++ b/venv/Include/memoryobject.h @@ -0,0 +1,72 @@ +/* Memory view object. In Python this is available as "memoryview". */ + +#ifndef Py_MEMORYOBJECT_H +#define Py_MEMORYOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_DATA(PyTypeObject) _PyManagedBuffer_Type; +#endif +PyAPI_DATA(PyTypeObject) PyMemoryView_Type; + +#define PyMemoryView_Check(op) (Py_TYPE(op) == &PyMemoryView_Type) + +#ifndef Py_LIMITED_API +/* Get a pointer to the memoryview's private copy of the exporter's buffer. */ +#define PyMemoryView_GET_BUFFER(op) (&((PyMemoryViewObject *)(op))->view) +/* Get a pointer to the exporting object (this may be NULL!). */ +#define PyMemoryView_GET_BASE(op) (((PyMemoryViewObject *)(op))->view.obj) +#endif + +PyAPI_FUNC(PyObject *) PyMemoryView_FromObject(PyObject *base); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyMemoryView_FromMemory(char *mem, Py_ssize_t size, + int flags); +#endif +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyMemoryView_FromBuffer(Py_buffer *info); +#endif +PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base, + int buffertype, + char order); + + +/* The structs are declared here so that macros can work, but they shouldn't + be considered public. Don't access their fields directly, use the macros + and functions instead! */ +#ifndef Py_LIMITED_API +#define _Py_MANAGED_BUFFER_RELEASED 0x001 /* access to exporter blocked */ +#define _Py_MANAGED_BUFFER_FREE_FORMAT 0x002 /* free format */ +typedef struct { + PyObject_HEAD + int flags; /* state flags */ + Py_ssize_t exports; /* number of direct memoryview exports */ + Py_buffer master; /* snapshot buffer obtained from the original exporter */ +} _PyManagedBufferObject; + + +/* memoryview state flags */ +#define _Py_MEMORYVIEW_RELEASED 0x001 /* access to master buffer blocked */ +#define _Py_MEMORYVIEW_C 0x002 /* C-contiguous layout */ +#define _Py_MEMORYVIEW_FORTRAN 0x004 /* Fortran contiguous layout */ +#define _Py_MEMORYVIEW_SCALAR 0x008 /* scalar: ndim = 0 */ +#define _Py_MEMORYVIEW_PIL 0x010 /* PIL-style layout */ + +typedef struct { + PyObject_VAR_HEAD + _PyManagedBufferObject *mbuf; /* managed buffer */ + Py_hash_t hash; /* hash value for read-only views */ + int flags; /* state flags */ + Py_ssize_t exports; /* number of buffer re-exports */ + Py_buffer view; /* private copy of the exporter's view */ + PyObject *weakreflist; + Py_ssize_t ob_array[1]; /* shape, strides, suboffsets */ +} PyMemoryViewObject; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MEMORYOBJECT_H */ diff --git a/venv/Include/metagrammar.h b/venv/Include/metagrammar.h new file mode 100644 index 00000000..15c8ef8f --- /dev/null +++ b/venv/Include/metagrammar.h @@ -0,0 +1,18 @@ +#ifndef Py_METAGRAMMAR_H +#define Py_METAGRAMMAR_H +#ifdef __cplusplus +extern "C" { +#endif + + +#define MSTART 256 +#define RULE 257 +#define RHS 258 +#define ALT 259 +#define ITEM 260 +#define ATOM 261 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_METAGRAMMAR_H */ diff --git a/venv/Include/methodobject.h b/venv/Include/methodobject.h new file mode 100644 index 00000000..ea35d86b --- /dev/null +++ b/venv/Include/methodobject.h @@ -0,0 +1,135 @@ + +/* Method object interface */ + +#ifndef Py_METHODOBJECT_H +#define Py_METHODOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* This is about the type 'builtin_function_or_method', + not Python methods in user-defined classes. See classobject.h + for the latter. */ + +PyAPI_DATA(PyTypeObject) PyCFunction_Type; + +#define PyCFunction_Check(op) (Py_TYPE(op) == &PyCFunction_Type) + +typedef PyObject *(*PyCFunction)(PyObject *, PyObject *); +typedef PyObject *(*_PyCFunctionFast) (PyObject *, PyObject *const *, Py_ssize_t); +typedef PyObject *(*PyCFunctionWithKeywords)(PyObject *, PyObject *, + PyObject *); +typedef PyObject *(*_PyCFunctionFastWithKeywords) (PyObject *, + PyObject *const *, Py_ssize_t, + PyObject *); +typedef PyObject *(*PyNoArgsFunction)(PyObject *); + +PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *); +PyAPI_FUNC(PyObject *) PyCFunction_GetSelf(PyObject *); +PyAPI_FUNC(int) PyCFunction_GetFlags(PyObject *); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#ifndef Py_LIMITED_API +#define PyCFunction_GET_FUNCTION(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_meth) +#define PyCFunction_GET_SELF(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags & METH_STATIC ? \ + NULL : ((PyCFunctionObject *)func) -> m_self) +#define PyCFunction_GET_FLAGS(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags) +#endif +PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyCFunction_FastCallDict(PyObject *func, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyCFunction_FastCallKeywords(PyObject *func, + PyObject *const *stack, + Py_ssize_t nargs, + PyObject *kwnames); +#endif + +struct PyMethodDef { + const char *ml_name; /* The name of the built-in function/method */ + PyCFunction ml_meth; /* The C function that implements it */ + int ml_flags; /* Combination of METH_xxx flags, which mostly + describe the args expected by the C func */ + const char *ml_doc; /* The __doc__ attribute, or NULL */ +}; +typedef struct PyMethodDef PyMethodDef; + +#define PyCFunction_New(ML, SELF) PyCFunction_NewEx((ML), (SELF), NULL) +PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, + PyObject *); + +/* Flag passed to newmethodobject */ +/* #define METH_OLDARGS 0x0000 -- unsupported now */ +#define METH_VARARGS 0x0001 +#define METH_KEYWORDS 0x0002 +/* METH_NOARGS and METH_O must not be combined with the flags above. */ +#define METH_NOARGS 0x0004 +#define METH_O 0x0008 + +/* METH_CLASS and METH_STATIC are a little different; these control + the construction of methods for a class. These cannot be used for + functions in modules. */ +#define METH_CLASS 0x0010 +#define METH_STATIC 0x0020 + +/* METH_COEXIST allows a method to be entered even though a slot has + already filled the entry. When defined, the flag allows a separate + method, "__contains__" for example, to coexist with a defined + slot like sq_contains. */ + +#define METH_COEXIST 0x0040 + +#ifndef Py_LIMITED_API +#define METH_FASTCALL 0x0080 +#endif + +/* This bit is preserved for Stackless Python */ +#ifdef STACKLESS +#define METH_STACKLESS 0x0100 +#else +#define METH_STACKLESS 0x0000 +#endif + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_HEAD + PyMethodDef *m_ml; /* Description of the C function to call */ + PyObject *m_self; /* Passed as 'self' arg to the C func, can be NULL */ + PyObject *m_module; /* The __module__ attribute, can be anything */ + PyObject *m_weakreflist; /* List of weak references */ +} PyCFunctionObject; + +PyAPI_FUNC(PyObject *) _PyMethodDef_RawFastCallDict( + PyMethodDef *method, + PyObject *self, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyMethodDef_RawFastCallKeywords( + PyMethodDef *method, + PyObject *self, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames); +#endif + +PyAPI_FUNC(int) PyCFunction_ClearFreeList(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyCFunction_DebugMallocStats(FILE *out); +PyAPI_FUNC(void) _PyMethod_DebugMallocStats(FILE *out); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_METHODOBJECT_H */ diff --git a/venv/Include/modsupport.h b/venv/Include/modsupport.h new file mode 100644 index 00000000..a238bef0 --- /dev/null +++ b/venv/Include/modsupport.h @@ -0,0 +1,229 @@ + +#ifndef Py_MODSUPPORT_H +#define Py_MODSUPPORT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Module support interface */ + +#include + +/* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier + to mean Py_ssize_t */ +#ifdef PY_SSIZE_T_CLEAN +#define PyArg_Parse _PyArg_Parse_SizeT +#define PyArg_ParseTuple _PyArg_ParseTuple_SizeT +#define PyArg_ParseTupleAndKeywords _PyArg_ParseTupleAndKeywords_SizeT +#define PyArg_VaParse _PyArg_VaParse_SizeT +#define PyArg_VaParseTupleAndKeywords _PyArg_VaParseTupleAndKeywords_SizeT +#define Py_BuildValue _Py_BuildValue_SizeT +#define Py_VaBuildValue _Py_VaBuildValue_SizeT +#ifndef Py_LIMITED_API +#define _Py_VaBuildStack _Py_VaBuildStack_SizeT +#endif +#else +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _Py_VaBuildValue_SizeT(const char *, va_list); +PyAPI_FUNC(PyObject **) _Py_VaBuildStack_SizeT( + PyObject **small_stack, + Py_ssize_t small_stack_len, + const char *format, + va_list va, + Py_ssize_t *p_nargs); +#endif /* !Py_LIMITED_API */ +#endif + +/* Due to a glitch in 3.2, the _SizeT versions weren't exported from the DLL. */ +#if !defined(PY_SSIZE_T_CLEAN) || !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(int) PyArg_Parse(PyObject *, const char *, ...); +PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...); +PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, + const char *, char **, ...); +PyAPI_FUNC(int) PyArg_VaParse(PyObject *, const char *, va_list); +PyAPI_FUNC(int) PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, + const char *, char **, va_list); +#endif +PyAPI_FUNC(int) PyArg_ValidateKeywordArguments(PyObject *); +PyAPI_FUNC(int) PyArg_UnpackTuple(PyObject *, const char *, Py_ssize_t, Py_ssize_t, ...); +PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...); +PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...); + + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyArg_UnpackStack( + PyObject *const *args, + Py_ssize_t nargs, + const char *name, + Py_ssize_t min, + Py_ssize_t max, + ...); + +PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kwargs); +PyAPI_FUNC(int) _PyArg_NoPositional(const char *funcname, PyObject *args); +#define _PyArg_NoKeywords(funcname, kwargs) \ + ((kwargs) == NULL || _PyArg_NoKeywords((funcname), (kwargs))) +#define _PyArg_NoPositional(funcname, args) \ + ((args) == NULL || _PyArg_NoPositional((funcname), (args))) + +#endif + +PyAPI_FUNC(PyObject *) Py_VaBuildValue(const char *, va_list); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject **) _Py_VaBuildStack( + PyObject **small_stack, + Py_ssize_t small_stack_len, + const char *format, + va_list va, + Py_ssize_t *p_nargs); +#endif + +#ifndef Py_LIMITED_API +typedef struct _PyArg_Parser { + const char *format; + const char * const *keywords; + const char *fname; + const char *custom_msg; + int pos; /* number of positional-only arguments */ + int min; /* minimal number of arguments */ + int max; /* maximal number of positional arguments */ + PyObject *kwtuple; /* tuple of keyword parameter names */ + struct _PyArg_Parser *next; +} _PyArg_Parser; +#ifdef PY_SSIZE_T_CLEAN +#define _PyArg_ParseTupleAndKeywordsFast _PyArg_ParseTupleAndKeywordsFast_SizeT +#define _PyArg_ParseStack _PyArg_ParseStack_SizeT +#define _PyArg_ParseStackAndKeywords _PyArg_ParseStackAndKeywords_SizeT +#define _PyArg_VaParseTupleAndKeywordsFast _PyArg_VaParseTupleAndKeywordsFast_SizeT +#endif +PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast(PyObject *, PyObject *, + struct _PyArg_Parser *, ...); +PyAPI_FUNC(int) _PyArg_ParseStack( + PyObject *const *args, + Py_ssize_t nargs, + const char *format, + ...); +PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords( + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames, + struct _PyArg_Parser *, + ...); +PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast(PyObject *, PyObject *, + struct _PyArg_Parser *, va_list); +void _PyArg_Fini(void); +#endif /* Py_LIMITED_API */ + +PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *); +PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long); +PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *); +#define PyModule_AddIntMacro(m, c) PyModule_AddIntConstant(m, #c, c) +#define PyModule_AddStringMacro(m, c) PyModule_AddStringConstant(m, #c, c) + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +PyAPI_FUNC(int) PyModule_SetDocString(PyObject *, const char *); +PyAPI_FUNC(int) PyModule_AddFunctions(PyObject *, PyMethodDef *); +PyAPI_FUNC(int) PyModule_ExecDef(PyObject *module, PyModuleDef *def); +#endif + +#define Py_CLEANUP_SUPPORTED 0x20000 + +#define PYTHON_API_VERSION 1013 +#define PYTHON_API_STRING "1013" +/* The API version is maintained (independently from the Python version) + so we can detect mismatches between the interpreter and dynamically + loaded modules. These are diagnosed by an error message but + the module is still loaded (because the mismatch can only be tested + after loading the module). The error message is intended to + explain the core dump a few seconds later. + + The symbol PYTHON_API_STRING defines the same value as a string + literal. *** PLEASE MAKE SURE THE DEFINITIONS MATCH. *** + + Please add a line or two to the top of this log for each API + version change: + + 22-Feb-2006 MvL 1013 PEP 353 - long indices for sequence lengths + + 19-Aug-2002 GvR 1012 Changes to string object struct for + interning changes, saving 3 bytes. + + 17-Jul-2001 GvR 1011 Descr-branch, just to be on the safe side + + 25-Jan-2001 FLD 1010 Parameters added to PyCode_New() and + PyFrame_New(); Python 2.1a2 + + 14-Mar-2000 GvR 1009 Unicode API added + + 3-Jan-1999 GvR 1007 Decided to change back! (Don't reuse 1008!) + + 3-Dec-1998 GvR 1008 Python 1.5.2b1 + + 18-Jan-1997 GvR 1007 string interning and other speedups + + 11-Oct-1996 GvR renamed Py_Ellipses to Py_Ellipsis :-( + + 30-Jul-1996 GvR Slice and ellipses syntax added + + 23-Jul-1996 GvR For 1.4 -- better safe than sorry this time :-) + + 7-Nov-1995 GvR Keyword arguments (should've been done at 1.3 :-( ) + + 10-Jan-1995 GvR Renamed globals to new naming scheme + + 9-Jan-1995 GvR Initial version (incompatible with older API) +*/ + +/* The PYTHON_ABI_VERSION is introduced in PEP 384. For the lifetime of + Python 3, it will stay at the value of 3; changes to the limited API + must be performed in a strictly backwards-compatible manner. */ +#define PYTHON_ABI_VERSION 3 +#define PYTHON_ABI_STRING "3" + +#ifdef Py_TRACE_REFS + /* When we are tracing reference counts, rename module creation functions so + modules compiled with incompatible settings will generate a + link-time error. */ + #define PyModule_Create2 PyModule_Create2TraceRefs + #define PyModule_FromDefAndSpec2 PyModule_FromDefAndSpec2TraceRefs +#endif + +PyAPI_FUNC(PyObject *) PyModule_Create2(struct PyModuleDef*, + int apiver); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyModule_CreateInitialized(struct PyModuleDef*, + int apiver); +#endif + +#ifdef Py_LIMITED_API +#define PyModule_Create(module) \ + PyModule_Create2(module, PYTHON_ABI_VERSION) +#else +#define PyModule_Create(module) \ + PyModule_Create2(module, PYTHON_API_VERSION) +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +PyAPI_FUNC(PyObject *) PyModule_FromDefAndSpec2(PyModuleDef *def, + PyObject *spec, + int module_api_version); + +#ifdef Py_LIMITED_API +#define PyModule_FromDefAndSpec(module, spec) \ + PyModule_FromDefAndSpec2(module, spec, PYTHON_ABI_VERSION) +#else +#define PyModule_FromDefAndSpec(module, spec) \ + PyModule_FromDefAndSpec2(module, spec, PYTHON_API_VERSION) +#endif /* Py_LIMITED_API */ +#endif /* New in 3.5 */ + +#ifndef Py_LIMITED_API +PyAPI_DATA(const char *) _Py_PackageContext; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MODSUPPORT_H */ diff --git a/venv/Include/moduleobject.h b/venv/Include/moduleobject.h new file mode 100644 index 00000000..1d8fe46d --- /dev/null +++ b/venv/Include/moduleobject.h @@ -0,0 +1,89 @@ + +/* Module object interface */ + +#ifndef Py_MODULEOBJECT_H +#define Py_MODULEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyModule_Type; + +#define PyModule_Check(op) PyObject_TypeCheck(op, &PyModule_Type) +#define PyModule_CheckExact(op) (Py_TYPE(op) == &PyModule_Type) + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyModule_NewObject( + PyObject *name + ); +#endif +PyAPI_FUNC(PyObject *) PyModule_New( + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) PyModule_GetDict(PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyModule_GetNameObject(PyObject *); +#endif +PyAPI_FUNC(const char *) PyModule_GetName(PyObject *); +PyAPI_FUNC(const char *) PyModule_GetFilename(PyObject *) Py_DEPRECATED(3.2); +PyAPI_FUNC(PyObject *) PyModule_GetFilenameObject(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyModule_Clear(PyObject *); +PyAPI_FUNC(void) _PyModule_ClearDict(PyObject *); +#endif +PyAPI_FUNC(struct PyModuleDef*) PyModule_GetDef(PyObject*); +PyAPI_FUNC(void*) PyModule_GetState(PyObject*); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +PyAPI_FUNC(PyObject *) PyModuleDef_Init(struct PyModuleDef*); +PyAPI_DATA(PyTypeObject) PyModuleDef_Type; +#endif + +typedef struct PyModuleDef_Base { + PyObject_HEAD + PyObject* (*m_init)(void); + Py_ssize_t m_index; + PyObject* m_copy; +} PyModuleDef_Base; + +#define PyModuleDef_HEAD_INIT { \ + PyObject_HEAD_INIT(NULL) \ + NULL, /* m_init */ \ + 0, /* m_index */ \ + NULL, /* m_copy */ \ + } + +struct PyModuleDef_Slot; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +typedef struct PyModuleDef_Slot{ + int slot; + void *value; +} PyModuleDef_Slot; + +#define Py_mod_create 1 +#define Py_mod_exec 2 + +#ifndef Py_LIMITED_API +#define _Py_mod_LAST_SLOT 2 +#endif + +#endif /* New in 3.5 */ + +typedef struct PyModuleDef{ + PyModuleDef_Base m_base; + const char* m_name; + const char* m_doc; + Py_ssize_t m_size; + PyMethodDef *m_methods; + struct PyModuleDef_Slot* m_slots; + traverseproc m_traverse; + inquiry m_clear; + freefunc m_free; +} PyModuleDef; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MODULEOBJECT_H */ diff --git a/venv/Include/namespaceobject.h b/venv/Include/namespaceobject.h new file mode 100644 index 00000000..0c8d95c0 --- /dev/null +++ b/venv/Include/namespaceobject.h @@ -0,0 +1,19 @@ + +/* simple namespace object interface */ + +#ifndef NAMESPACEOBJECT_H +#define NAMESPACEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_DATA(PyTypeObject) _PyNamespace_Type; + +PyAPI_FUNC(PyObject *) _PyNamespace_New(PyObject *kwds); +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !NAMESPACEOBJECT_H */ diff --git a/venv/Include/node.h b/venv/Include/node.h new file mode 100644 index 00000000..40596dfe --- /dev/null +++ b/venv/Include/node.h @@ -0,0 +1,44 @@ + +/* Parse tree node interface */ + +#ifndef Py_NODE_H +#define Py_NODE_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _node { + short n_type; + char *n_str; + int n_lineno; + int n_col_offset; + int n_nchildren; + struct _node *n_child; +} node; + +PyAPI_FUNC(node *) PyNode_New(int type); +PyAPI_FUNC(int) PyNode_AddChild(node *n, int type, + char *str, int lineno, int col_offset); +PyAPI_FUNC(void) PyNode_Free(node *n); +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyNode_SizeOf(node *n); +#endif + +/* Node access functions */ +#define NCH(n) ((n)->n_nchildren) + +#define CHILD(n, i) (&(n)->n_child[i]) +#define RCHILD(n, i) (CHILD(n, NCH(n) + i)) +#define TYPE(n) ((n)->n_type) +#define STR(n) ((n)->n_str) +#define LINENO(n) ((n)->n_lineno) + +/* Assert that the type of a node is what we expect */ +#define REQ(n, type) assert(TYPE(n) == (type)) + +PyAPI_FUNC(void) PyNode_ListTree(node *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_NODE_H */ diff --git a/venv/Include/object.h b/venv/Include/object.h new file mode 100644 index 00000000..c772deaf --- /dev/null +++ b/venv/Include/object.h @@ -0,0 +1,1104 @@ +#ifndef Py_OBJECT_H +#define Py_OBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Object and type object interface */ + +/* +Objects are structures allocated on the heap. Special rules apply to +the use of objects to ensure they are properly garbage-collected. +Objects are never allocated statically or on the stack; they must be +accessed through special macros and functions only. (Type objects are +exceptions to the first rule; the standard types are represented by +statically initialized type objects, although work on type/class unification +for Python 2.2 made it possible to have heap-allocated type objects too). + +An object has a 'reference count' that is increased or decreased when a +pointer to the object is copied or deleted; when the reference count +reaches zero there are no references to the object left and it can be +removed from the heap. + +An object has a 'type' that determines what it represents and what kind +of data it contains. An object's type is fixed when it is created. +Types themselves are represented as objects; an object contains a +pointer to the corresponding type object. The type itself has a type +pointer pointing to the object representing the type 'type', which +contains a pointer to itself!). + +Objects do not float around in memory; once allocated an object keeps +the same size and address. Objects that must hold variable-size data +can contain pointers to variable-size parts of the object. Not all +objects of the same type have the same size; but the size cannot change +after allocation. (These restrictions are made so a reference to an +object can be simply a pointer -- moving an object would require +updating all the pointers, and changing an object's size would require +moving it if there was another object right next to it.) + +Objects are always accessed through pointers of the type 'PyObject *'. +The type 'PyObject' is a structure that only contains the reference count +and the type pointer. The actual memory allocated for an object +contains other data that can only be accessed after casting the pointer +to a pointer to a longer structure type. This longer type must start +with the reference count and type fields; the macro PyObject_HEAD should be +used for this (to accommodate for future changes). The implementation +of a particular object type can cast the object pointer to the proper +type and back. + +A standard interface exists for objects that contain an array of items +whose size is determined when the object is allocated. +*/ + +/* Py_DEBUG implies Py_TRACE_REFS. */ +#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS) +#define Py_TRACE_REFS +#endif + +/* Py_TRACE_REFS implies Py_REF_DEBUG. */ +#if defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) +#define Py_REF_DEBUG +#endif + +#if defined(Py_LIMITED_API) && defined(Py_REF_DEBUG) +#error Py_LIMITED_API is incompatible with Py_DEBUG, Py_TRACE_REFS, and Py_REF_DEBUG +#endif + + +#ifdef Py_TRACE_REFS +/* Define pointers to support a doubly-linked list of all live heap objects. */ +#define _PyObject_HEAD_EXTRA \ + struct _object *_ob_next; \ + struct _object *_ob_prev; + +#define _PyObject_EXTRA_INIT 0, 0, + +#else +#define _PyObject_HEAD_EXTRA +#define _PyObject_EXTRA_INIT +#endif + +/* PyObject_HEAD defines the initial segment of every PyObject. */ +#define PyObject_HEAD PyObject ob_base; + +#define PyObject_HEAD_INIT(type) \ + { _PyObject_EXTRA_INIT \ + 1, type }, + +#define PyVarObject_HEAD_INIT(type, size) \ + { PyObject_HEAD_INIT(type) size }, + +/* PyObject_VAR_HEAD defines the initial segment of all variable-size + * container objects. These end with a declaration of an array with 1 + * element, but enough space is malloc'ed so that the array actually + * has room for ob_size elements. Note that ob_size is an element count, + * not necessarily a byte count. + */ +#define PyObject_VAR_HEAD PyVarObject ob_base; +#define Py_INVALID_SIZE (Py_ssize_t)-1 + +/* Nothing is actually declared to be a PyObject, but every pointer to + * a Python object can be cast to a PyObject*. This is inheritance built + * by hand. Similarly every pointer to a variable-size Python object can, + * in addition, be cast to PyVarObject*. + */ +typedef struct _object { + _PyObject_HEAD_EXTRA + Py_ssize_t ob_refcnt; + struct _typeobject *ob_type; +} PyObject; + +typedef struct { + PyObject ob_base; + Py_ssize_t ob_size; /* Number of items in variable part */ +} PyVarObject; + +#define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) +#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) +#define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) + +#ifndef Py_LIMITED_API +/********************* String Literals ****************************************/ +/* This structure helps managing static strings. The basic usage goes like this: + Instead of doing + + r = PyObject_CallMethod(o, "foo", "args", ...); + + do + + _Py_IDENTIFIER(foo); + ... + r = _PyObject_CallMethodId(o, &PyId_foo, "args", ...); + + PyId_foo is a static variable, either on block level or file level. On first + usage, the string "foo" is interned, and the structures are linked. On interpreter + shutdown, all strings are released (through _PyUnicode_ClearStaticStrings). + + Alternatively, _Py_static_string allows choosing the variable name. + _PyUnicode_FromId returns a borrowed reference to the interned string. + _PyObject_{Get,Set,Has}AttrId are __getattr__ versions using _Py_Identifier*. +*/ +typedef struct _Py_Identifier { + struct _Py_Identifier *next; + const char* string; + PyObject *object; +} _Py_Identifier; + +#define _Py_static_string_init(value) { .next = NULL, .string = value, .object = NULL } +#define _Py_static_string(varname, value) static _Py_Identifier varname = _Py_static_string_init(value) +#define _Py_IDENTIFIER(varname) _Py_static_string(PyId_##varname, #varname) + +#endif /* !Py_LIMITED_API */ + +/* +Type objects contain a string containing the type name (to help somewhat +in debugging), the allocation parameters (see PyObject_New() and +PyObject_NewVar()), +and methods for accessing objects of the type. Methods are optional, a +nil pointer meaning that particular kind of access is not available for +this type. The Py_DECREF() macro uses the tp_dealloc method without +checking for a nil pointer; it should always be implemented except if +the implementation can guarantee that the reference count will never +reach zero (e.g., for statically allocated type objects). + +NB: the methods for certain type groups are now contained in separate +method blocks. +*/ + +typedef PyObject * (*unaryfunc)(PyObject *); +typedef PyObject * (*binaryfunc)(PyObject *, PyObject *); +typedef PyObject * (*ternaryfunc)(PyObject *, PyObject *, PyObject *); +typedef int (*inquiry)(PyObject *); +typedef Py_ssize_t (*lenfunc)(PyObject *); +typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t); +typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t); +typedef int(*ssizeobjargproc)(PyObject *, Py_ssize_t, PyObject *); +typedef int(*ssizessizeobjargproc)(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); +typedef int(*objobjargproc)(PyObject *, PyObject *, PyObject *); + +#ifndef Py_LIMITED_API +/* buffer interface */ +typedef struct bufferinfo { + void *buf; + PyObject *obj; /* owned reference */ + Py_ssize_t len; + Py_ssize_t itemsize; /* This is Py_ssize_t so it can be + pointed to by strides in simple case.*/ + int readonly; + int ndim; + char *format; + Py_ssize_t *shape; + Py_ssize_t *strides; + Py_ssize_t *suboffsets; + void *internal; +} Py_buffer; + +typedef int (*getbufferproc)(PyObject *, Py_buffer *, int); +typedef void (*releasebufferproc)(PyObject *, Py_buffer *); + +/* Maximum number of dimensions */ +#define PyBUF_MAX_NDIM 64 + +/* Flags for getting buffers */ +#define PyBUF_SIMPLE 0 +#define PyBUF_WRITABLE 0x0001 +/* we used to include an E, backwards compatible alias */ +#define PyBUF_WRITEABLE PyBUF_WRITABLE +#define PyBUF_FORMAT 0x0004 +#define PyBUF_ND 0x0008 +#define PyBUF_STRIDES (0x0010 | PyBUF_ND) +#define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) +#define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) +#define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) +#define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) + +#define PyBUF_CONTIG (PyBUF_ND | PyBUF_WRITABLE) +#define PyBUF_CONTIG_RO (PyBUF_ND) + +#define PyBUF_STRIDED (PyBUF_STRIDES | PyBUF_WRITABLE) +#define PyBUF_STRIDED_RO (PyBUF_STRIDES) + +#define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT) +#define PyBUF_RECORDS_RO (PyBUF_STRIDES | PyBUF_FORMAT) + +#define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT) +#define PyBUF_FULL_RO (PyBUF_INDIRECT | PyBUF_FORMAT) + + +#define PyBUF_READ 0x100 +#define PyBUF_WRITE 0x200 + +/* End buffer interface */ +#endif /* Py_LIMITED_API */ + +typedef int (*objobjproc)(PyObject *, PyObject *); +typedef int (*visitproc)(PyObject *, void *); +typedef int (*traverseproc)(PyObject *, visitproc, void *); + +#ifndef Py_LIMITED_API +typedef struct { + /* Number implementations must check *both* + arguments for proper type and implement the necessary conversions + in the slot functions themselves. */ + + binaryfunc nb_add; + binaryfunc nb_subtract; + binaryfunc nb_multiply; + binaryfunc nb_remainder; + binaryfunc nb_divmod; + ternaryfunc nb_power; + unaryfunc nb_negative; + unaryfunc nb_positive; + unaryfunc nb_absolute; + inquiry nb_bool; + unaryfunc nb_invert; + binaryfunc nb_lshift; + binaryfunc nb_rshift; + binaryfunc nb_and; + binaryfunc nb_xor; + binaryfunc nb_or; + unaryfunc nb_int; + void *nb_reserved; /* the slot formerly known as nb_long */ + unaryfunc nb_float; + + binaryfunc nb_inplace_add; + binaryfunc nb_inplace_subtract; + binaryfunc nb_inplace_multiply; + binaryfunc nb_inplace_remainder; + ternaryfunc nb_inplace_power; + binaryfunc nb_inplace_lshift; + binaryfunc nb_inplace_rshift; + binaryfunc nb_inplace_and; + binaryfunc nb_inplace_xor; + binaryfunc nb_inplace_or; + + binaryfunc nb_floor_divide; + binaryfunc nb_true_divide; + binaryfunc nb_inplace_floor_divide; + binaryfunc nb_inplace_true_divide; + + unaryfunc nb_index; + + binaryfunc nb_matrix_multiply; + binaryfunc nb_inplace_matrix_multiply; +} PyNumberMethods; + +typedef struct { + lenfunc sq_length; + binaryfunc sq_concat; + ssizeargfunc sq_repeat; + ssizeargfunc sq_item; + void *was_sq_slice; + ssizeobjargproc sq_ass_item; + void *was_sq_ass_slice; + objobjproc sq_contains; + + binaryfunc sq_inplace_concat; + ssizeargfunc sq_inplace_repeat; +} PySequenceMethods; + +typedef struct { + lenfunc mp_length; + binaryfunc mp_subscript; + objobjargproc mp_ass_subscript; +} PyMappingMethods; + +typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; +} PyAsyncMethods; + +typedef struct { + getbufferproc bf_getbuffer; + releasebufferproc bf_releasebuffer; +} PyBufferProcs; +#endif /* Py_LIMITED_API */ + +typedef void (*freefunc)(void *); +typedef void (*destructor)(PyObject *); +#ifndef Py_LIMITED_API +/* We can't provide a full compile-time check that limited-API + users won't implement tp_print. However, not defining printfunc + and making tp_print of a different function pointer type + should at least cause a warning in most cases. */ +typedef int (*printfunc)(PyObject *, FILE *, int); +#endif +typedef PyObject *(*getattrfunc)(PyObject *, char *); +typedef PyObject *(*getattrofunc)(PyObject *, PyObject *); +typedef int (*setattrfunc)(PyObject *, char *, PyObject *); +typedef int (*setattrofunc)(PyObject *, PyObject *, PyObject *); +typedef PyObject *(*reprfunc)(PyObject *); +typedef Py_hash_t (*hashfunc)(PyObject *); +typedef PyObject *(*richcmpfunc) (PyObject *, PyObject *, int); +typedef PyObject *(*getiterfunc) (PyObject *); +typedef PyObject *(*iternextfunc) (PyObject *); +typedef PyObject *(*descrgetfunc) (PyObject *, PyObject *, PyObject *); +typedef int (*descrsetfunc) (PyObject *, PyObject *, PyObject *); +typedef int (*initproc)(PyObject *, PyObject *, PyObject *); +typedef PyObject *(*newfunc)(struct _typeobject *, PyObject *, PyObject *); +typedef PyObject *(*allocfunc)(struct _typeobject *, Py_ssize_t); + +#ifdef Py_LIMITED_API +typedef struct _typeobject PyTypeObject; /* opaque */ +#else +typedef struct _typeobject { + PyObject_VAR_HEAD + const char *tp_name; /* For printing, in format "." */ + Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ + + /* Methods to implement standard operations */ + + destructor tp_dealloc; + printfunc tp_print; + getattrfunc tp_getattr; + setattrfunc tp_setattr; + PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2) + or tp_reserved (Python 3) */ + reprfunc tp_repr; + + /* Method suites for standard classes */ + + PyNumberMethods *tp_as_number; + PySequenceMethods *tp_as_sequence; + PyMappingMethods *tp_as_mapping; + + /* More standard operations (here for binary compatibility) */ + + hashfunc tp_hash; + ternaryfunc tp_call; + reprfunc tp_str; + getattrofunc tp_getattro; + setattrofunc tp_setattro; + + /* Functions to access object as input/output buffer */ + PyBufferProcs *tp_as_buffer; + + /* Flags to define presence of optional/expanded features */ + unsigned long tp_flags; + + const char *tp_doc; /* Documentation string */ + + /* Assigned meaning in release 2.0 */ + /* call function for all accessible objects */ + traverseproc tp_traverse; + + /* delete references to contained objects */ + inquiry tp_clear; + + /* Assigned meaning in release 2.1 */ + /* rich comparisons */ + richcmpfunc tp_richcompare; + + /* weak reference enabler */ + Py_ssize_t tp_weaklistoffset; + + /* Iterators */ + getiterfunc tp_iter; + iternextfunc tp_iternext; + + /* Attribute descriptor and subclassing stuff */ + struct PyMethodDef *tp_methods; + struct PyMemberDef *tp_members; + struct PyGetSetDef *tp_getset; + struct _typeobject *tp_base; + PyObject *tp_dict; + descrgetfunc tp_descr_get; + descrsetfunc tp_descr_set; + Py_ssize_t tp_dictoffset; + initproc tp_init; + allocfunc tp_alloc; + newfunc tp_new; + freefunc tp_free; /* Low-level free-memory routine */ + inquiry tp_is_gc; /* For PyObject_IS_GC */ + PyObject *tp_bases; + PyObject *tp_mro; /* method resolution order */ + PyObject *tp_cache; + PyObject *tp_subclasses; + PyObject *tp_weaklist; + destructor tp_del; + + /* Type attribute cache version tag. Added in version 2.6 */ + unsigned int tp_version_tag; + + destructor tp_finalize; + +#ifdef COUNT_ALLOCS + /* these must be last and never explicitly initialized */ + Py_ssize_t tp_allocs; + Py_ssize_t tp_frees; + Py_ssize_t tp_maxalloc; + struct _typeobject *tp_prev; + struct _typeobject *tp_next; +#endif +} PyTypeObject; +#endif + +typedef struct{ + int slot; /* slot id, see below */ + void *pfunc; /* function pointer */ +} PyType_Slot; + +typedef struct{ + const char* name; + int basicsize; + int itemsize; + unsigned int flags; + PyType_Slot *slots; /* terminated by slot==0. */ +} PyType_Spec; + +PyAPI_FUNC(PyObject*) PyType_FromSpec(PyType_Spec*); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyType_FromSpecWithBases(PyType_Spec*, PyObject*); +#endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 +PyAPI_FUNC(void*) PyType_GetSlot(PyTypeObject*, int); +#endif + +#ifndef Py_LIMITED_API +/* The *real* layout of a type object when allocated on the heap */ +typedef struct _heaptypeobject { + /* Note: there's a dependency on the order of these members + in slotptr() in typeobject.c . */ + PyTypeObject ht_type; + PyAsyncMethods as_async; + PyNumberMethods as_number; + PyMappingMethods as_mapping; + PySequenceMethods as_sequence; /* as_sequence comes after as_mapping, + so that the mapping wins when both + the mapping and the sequence define + a given operator (e.g. __getitem__). + see add_operators() in typeobject.c . */ + PyBufferProcs as_buffer; + PyObject *ht_name, *ht_slots, *ht_qualname; + struct _dictkeysobject *ht_cached_keys; + /* here are optional user slots, followed by the members. */ +} PyHeapTypeObject; + +/* access macro to the members which are floating "behind" the object */ +#define PyHeapType_GET_MEMBERS(etype) \ + ((PyMemberDef *)(((char *)etype) + Py_TYPE(etype)->tp_basicsize)) +#endif + +/* Generic type check */ +PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); +#define PyObject_TypeCheck(ob, tp) \ + (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) + +PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ +PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ +PyAPI_DATA(PyTypeObject) PySuper_Type; /* built-in 'super' */ + +PyAPI_FUNC(unsigned long) PyType_GetFlags(PyTypeObject*); + +#define PyType_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS) +#define PyType_CheckExact(op) (Py_TYPE(op) == &PyType_Type) + +PyAPI_FUNC(int) PyType_Ready(PyTypeObject *); +PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *, + PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(const char *) _PyType_Name(PyTypeObject *); +PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *); +PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, _Py_Identifier *); +PyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *); +#endif +PyAPI_FUNC(unsigned int) PyType_ClearCache(void); +PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyType_GetDocFromInternalDoc(const char *, const char *); +PyAPI_FUNC(PyObject *) _PyType_GetTextSignatureFromInternalDoc(const char *, const char *); +#endif + +/* Generic operations on objects */ +#ifndef Py_LIMITED_API +struct _Py_Identifier; +PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int); +PyAPI_FUNC(void) _Py_BreakPoint(void); +PyAPI_FUNC(void) _PyObject_Dump(PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyObject_Repr(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_Str(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_ASCII(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_Bytes(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_RichCompare(PyObject *, PyObject *, int); +PyAPI_FUNC(int) PyObject_RichCompareBool(PyObject *, PyObject *, int); +PyAPI_FUNC(PyObject *) PyObject_GetAttrString(PyObject *, const char *); +PyAPI_FUNC(int) PyObject_SetAttrString(PyObject *, const char *, PyObject *); +PyAPI_FUNC(int) PyObject_HasAttrString(PyObject *, const char *); +PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyObject_IsAbstract(PyObject *); +PyAPI_FUNC(PyObject *) _PyObject_GetAttrId(PyObject *, struct _Py_Identifier *); +PyAPI_FUNC(int) _PyObject_SetAttrId(PyObject *, struct _Py_Identifier *, PyObject *); +PyAPI_FUNC(int) _PyObject_HasAttrId(PyObject *, struct _Py_Identifier *); +/* Replacements of PyObject_GetAttr() and _PyObject_GetAttrId() which + don't raise AttributeError. + + Return 1 and set *result != NULL if an attribute is found. + Return 0 and set *result == NULL if an attribute is not found; + an AttributeError is silenced. + Return -1 and set *result == NULL if an error other than AttributeError + is raised. +*/ +PyAPI_FUNC(int) _PyObject_LookupAttr(PyObject *, PyObject *, PyObject **); +PyAPI_FUNC(int) _PyObject_LookupAttrId(PyObject *, struct _Py_Identifier *, PyObject **); +PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, + PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(int) PyObject_GenericSetDict(PyObject *, PyObject *, void *); +#endif +PyAPI_FUNC(Py_hash_t) PyObject_Hash(PyObject *); +PyAPI_FUNC(Py_hash_t) PyObject_HashNotImplemented(PyObject *); +PyAPI_FUNC(int) PyObject_IsTrue(PyObject *); +PyAPI_FUNC(int) PyObject_Not(PyObject *); +PyAPI_FUNC(int) PyCallable_Check(PyObject *); + +PyAPI_FUNC(void) PyObject_ClearWeakRefs(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyObject_CallFinalizer(PyObject *); +PyAPI_FUNC(int) PyObject_CallFinalizerFromDealloc(PyObject *); +#endif + +#ifndef Py_LIMITED_API +/* Same as PyObject_Generic{Get,Set}Attr, but passing the attributes + dict as the last parameter. */ +PyAPI_FUNC(PyObject *) +_PyObject_GenericGetAttrWithDict(PyObject *, PyObject *, PyObject *, int); +PyAPI_FUNC(int) +_PyObject_GenericSetAttrWithDict(PyObject *, PyObject *, + PyObject *, PyObject *); +#endif /* !Py_LIMITED_API */ + +/* Helper to look up a builtin object */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) +_PyObject_GetBuiltin(const char *name); +#endif + +/* PyObject_Dir(obj) acts like Python builtins.dir(obj), returning a + list of strings. PyObject_Dir(NULL) is like builtins.dir(), + returning the names of the current locals. In this case, if there are + no current locals, NULL is returned, and PyErr_Occurred() is false. +*/ +PyAPI_FUNC(PyObject *) PyObject_Dir(PyObject *); + + +/* Helpers for printing recursive container types */ +PyAPI_FUNC(int) Py_ReprEnter(PyObject *); +PyAPI_FUNC(void) Py_ReprLeave(PyObject *); + +/* Flag bits for printing: */ +#define Py_PRINT_RAW 1 /* No string quotes etc. */ + +/* +`Type flags (tp_flags) + +These flags are used to extend the type structure in a backwards-compatible +fashion. Extensions can use the flags to indicate (and test) when a given +type structure contains a new feature. The Python core will use these when +introducing new functionality between major revisions (to avoid mid-version +changes in the PYTHON_API_VERSION). + +Arbitration of the flag bit positions will need to be coordinated among +all extension writers who publicly release their extensions (this will +be fewer than you might expect!).. + +Most flags were removed as of Python 3.0 to make room for new flags. (Some +flags are not for backwards compatibility but to indicate the presence of an +optional feature; these flags remain of course.) + +Type definitions should use Py_TPFLAGS_DEFAULT for their tp_flags value. + +Code can use PyType_HasFeature(type_ob, flag_value) to test whether the +given type object has a specified feature. +*/ + +/* Set if the type object is dynamically allocated */ +#define Py_TPFLAGS_HEAPTYPE (1UL << 9) + +/* Set if the type allows subclassing */ +#define Py_TPFLAGS_BASETYPE (1UL << 10) + +/* Set if the type is 'ready' -- fully initialized */ +#define Py_TPFLAGS_READY (1UL << 12) + +/* Set while the type is being 'readied', to prevent recursive ready calls */ +#define Py_TPFLAGS_READYING (1UL << 13) + +/* Objects support garbage collection (see objimp.h) */ +#define Py_TPFLAGS_HAVE_GC (1UL << 14) + +/* These two bits are preserved for Stackless Python, next after this is 17 */ +#ifdef STACKLESS +#define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION (3UL << 15) +#else +#define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION 0 +#endif + +/* Objects support type attribute cache */ +#define Py_TPFLAGS_HAVE_VERSION_TAG (1UL << 18) +#define Py_TPFLAGS_VALID_VERSION_TAG (1UL << 19) + +/* Type is abstract and cannot be instantiated */ +#define Py_TPFLAGS_IS_ABSTRACT (1UL << 20) + +/* These flags are used to determine if a type is a subclass. */ +#define Py_TPFLAGS_LONG_SUBCLASS (1UL << 24) +#define Py_TPFLAGS_LIST_SUBCLASS (1UL << 25) +#define Py_TPFLAGS_TUPLE_SUBCLASS (1UL << 26) +#define Py_TPFLAGS_BYTES_SUBCLASS (1UL << 27) +#define Py_TPFLAGS_UNICODE_SUBCLASS (1UL << 28) +#define Py_TPFLAGS_DICT_SUBCLASS (1UL << 29) +#define Py_TPFLAGS_BASE_EXC_SUBCLASS (1UL << 30) +#define Py_TPFLAGS_TYPE_SUBCLASS (1UL << 31) + +#define Py_TPFLAGS_DEFAULT ( \ + Py_TPFLAGS_HAVE_STACKLESS_EXTENSION | \ + Py_TPFLAGS_HAVE_VERSION_TAG | \ + 0) + +/* NOTE: The following flags reuse lower bits (removed as part of the + * Python 3.0 transition). */ + +/* Type structure has tp_finalize member (3.4) */ +#define Py_TPFLAGS_HAVE_FINALIZE (1UL << 0) + +#ifdef Py_LIMITED_API +#define PyType_HasFeature(t,f) ((PyType_GetFlags(t) & (f)) != 0) +#else +#define PyType_HasFeature(t,f) (((t)->tp_flags & (f)) != 0) +#endif +#define PyType_FastSubclass(t,f) PyType_HasFeature(t,f) + + +/* +The macros Py_INCREF(op) and Py_DECREF(op) are used to increment or decrement +reference counts. Py_DECREF calls the object's deallocator function when +the refcount falls to 0; for +objects that don't contain references to other objects or heap memory +this can be the standard function free(). Both macros can be used +wherever a void expression is allowed. The argument must not be a +NULL pointer. If it may be NULL, use Py_XINCREF/Py_XDECREF instead. +The macro _Py_NewReference(op) initialize reference counts to 1, and +in special builds (Py_REF_DEBUG, Py_TRACE_REFS) performs additional +bookkeeping appropriate to the special build. + +We assume that the reference count field can never overflow; this can +be proven when the size of the field is the same as the pointer size, so +we ignore the possibility. Provided a C int is at least 32 bits (which +is implicitly assumed in many parts of this code), that's enough for +about 2**31 references to an object. + +XXX The following became out of date in Python 2.2, but I'm not sure +XXX what the full truth is now. Certainly, heap-allocated type objects +XXX can and should be deallocated. +Type objects should never be deallocated; the type pointer in an object +is not considered to be a reference to the type object, to save +complications in the deallocation function. (This is actually a +decision that's up to the implementer of each new type so if you want, +you can count such references to the type object.) +*/ + +/* First define a pile of simple helper macros, one set per special + * build symbol. These either expand to the obvious things, or to + * nothing at all when the special mode isn't in effect. The main + * macros can later be defined just once then, yet expand to different + * things depending on which special build options are and aren't in effect. + * Trust me : while painful, this is 20x easier to understand than, + * e.g, defining _Py_NewReference five different times in a maze of nested + * #ifdefs (we used to do that -- it was impenetrable). + */ +#ifdef Py_REF_DEBUG +PyAPI_DATA(Py_ssize_t) _Py_RefTotal; +PyAPI_FUNC(void) _Py_NegativeRefcount(const char *fname, + int lineno, PyObject *op); +PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); +#define _Py_INC_REFTOTAL _Py_RefTotal++ +#define _Py_DEC_REFTOTAL _Py_RefTotal-- +#define _Py_REF_DEBUG_COMMA , +#define _Py_CHECK_REFCNT(OP) \ +{ if (((PyObject*)OP)->ob_refcnt < 0) \ + _Py_NegativeRefcount(__FILE__, __LINE__, \ + (PyObject *)(OP)); \ +} +/* Py_REF_DEBUG also controls the display of refcounts and memory block + * allocations at the interactive prompt and at interpreter shutdown + */ +PyAPI_FUNC(void) _PyDebug_PrintTotalRefs(void); +#else +#define _Py_INC_REFTOTAL +#define _Py_DEC_REFTOTAL +#define _Py_REF_DEBUG_COMMA +#define _Py_CHECK_REFCNT(OP) /* a semicolon */; +#endif /* Py_REF_DEBUG */ + +#ifdef COUNT_ALLOCS +PyAPI_FUNC(void) inc_count(PyTypeObject *); +PyAPI_FUNC(void) dec_count(PyTypeObject *); +#define _Py_INC_TPALLOCS(OP) inc_count(Py_TYPE(OP)) +#define _Py_INC_TPFREES(OP) dec_count(Py_TYPE(OP)) +#define _Py_DEC_TPFREES(OP) Py_TYPE(OP)->tp_frees-- +#define _Py_COUNT_ALLOCS_COMMA , +#else +#define _Py_INC_TPALLOCS(OP) +#define _Py_INC_TPFREES(OP) +#define _Py_DEC_TPFREES(OP) +#define _Py_COUNT_ALLOCS_COMMA +#endif /* COUNT_ALLOCS */ + +#ifdef Py_TRACE_REFS +/* Py_TRACE_REFS is such major surgery that we call external routines. */ +PyAPI_FUNC(void) _Py_NewReference(PyObject *); +PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); +PyAPI_FUNC(void) _Py_Dealloc(PyObject *); +PyAPI_FUNC(void) _Py_PrintReferences(FILE *); +PyAPI_FUNC(void) _Py_PrintReferenceAddresses(FILE *); +PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force); + +#else +/* Without Py_TRACE_REFS, there's little enough to do that we expand code + * inline. + */ +#define _Py_NewReference(op) ( \ + _Py_INC_TPALLOCS(op) _Py_COUNT_ALLOCS_COMMA \ + _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ + Py_REFCNT(op) = 1) + +#define _Py_ForgetReference(op) _Py_INC_TPFREES(op) + +#ifdef Py_LIMITED_API +PyAPI_FUNC(void) _Py_Dealloc(PyObject *); +#else +#define _Py_Dealloc(op) ( \ + _Py_INC_TPFREES(op) _Py_COUNT_ALLOCS_COMMA \ + (*Py_TYPE(op)->tp_dealloc)((PyObject *)(op))) +#endif +#endif /* !Py_TRACE_REFS */ + +#define Py_INCREF(op) ( \ + _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ + ((PyObject *)(op))->ob_refcnt++) + +#define Py_DECREF(op) \ + do { \ + PyObject *_py_decref_tmp = (PyObject *)(op); \ + if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \ + --(_py_decref_tmp)->ob_refcnt != 0) \ + _Py_CHECK_REFCNT(_py_decref_tmp) \ + else \ + _Py_Dealloc(_py_decref_tmp); \ + } while (0) + +/* Safely decref `op` and set `op` to NULL, especially useful in tp_clear + * and tp_dealloc implementations. + * + * Note that "the obvious" code can be deadly: + * + * Py_XDECREF(op); + * op = NULL; + * + * Typically, `op` is something like self->containee, and `self` is done + * using its `containee` member. In the code sequence above, suppose + * `containee` is non-NULL with a refcount of 1. Its refcount falls to + * 0 on the first line, which can trigger an arbitrary amount of code, + * possibly including finalizers (like __del__ methods or weakref callbacks) + * coded in Python, which in turn can release the GIL and allow other threads + * to run, etc. Such code may even invoke methods of `self` again, or cause + * cyclic gc to trigger, but-- oops! --self->containee still points to the + * object being torn down, and it may be in an insane state while being torn + * down. This has in fact been a rich historic source of miserable (rare & + * hard-to-diagnose) segfaulting (and other) bugs. + * + * The safe way is: + * + * Py_CLEAR(op); + * + * That arranges to set `op` to NULL _before_ decref'ing, so that any code + * triggered as a side-effect of `op` getting torn down no longer believes + * `op` points to a valid object. + * + * There are cases where it's safe to use the naive code, but they're brittle. + * For example, if `op` points to a Python integer, you know that destroying + * one of those can't cause problems -- but in part that relies on that + * Python integers aren't currently weakly referencable. Best practice is + * to use Py_CLEAR() even if you can't think of a reason for why you need to. + */ +#define Py_CLEAR(op) \ + do { \ + PyObject *_py_tmp = (PyObject *)(op); \ + if (_py_tmp != NULL) { \ + (op) = NULL; \ + Py_DECREF(_py_tmp); \ + } \ + } while (0) + +/* Macros to use in case the object pointer may be NULL: */ +#define Py_XINCREF(op) \ + do { \ + PyObject *_py_xincref_tmp = (PyObject *)(op); \ + if (_py_xincref_tmp != NULL) \ + Py_INCREF(_py_xincref_tmp); \ + } while (0) + +#define Py_XDECREF(op) \ + do { \ + PyObject *_py_xdecref_tmp = (PyObject *)(op); \ + if (_py_xdecref_tmp != NULL) \ + Py_DECREF(_py_xdecref_tmp); \ + } while (0) + +#ifndef Py_LIMITED_API +/* Safely decref `op` and set `op` to `op2`. + * + * As in case of Py_CLEAR "the obvious" code can be deadly: + * + * Py_DECREF(op); + * op = op2; + * + * The safe way is: + * + * Py_SETREF(op, op2); + * + * That arranges to set `op` to `op2` _before_ decref'ing, so that any code + * triggered as a side-effect of `op` getting torn down no longer believes + * `op` points to a valid object. + * + * Py_XSETREF is a variant of Py_SETREF that uses Py_XDECREF instead of + * Py_DECREF. + */ + +#define Py_SETREF(op, op2) \ + do { \ + PyObject *_py_tmp = (PyObject *)(op); \ + (op) = (op2); \ + Py_DECREF(_py_tmp); \ + } while (0) + +#define Py_XSETREF(op, op2) \ + do { \ + PyObject *_py_tmp = (PyObject *)(op); \ + (op) = (op2); \ + Py_XDECREF(_py_tmp); \ + } while (0) + +#endif /* ifndef Py_LIMITED_API */ + +/* +These are provided as conveniences to Python runtime embedders, so that +they can have object code that is not dependent on Python compilation flags. +*/ +PyAPI_FUNC(void) Py_IncRef(PyObject *); +PyAPI_FUNC(void) Py_DecRef(PyObject *); + +#ifndef Py_LIMITED_API +PyAPI_DATA(PyTypeObject) _PyNone_Type; +PyAPI_DATA(PyTypeObject) _PyNotImplemented_Type; +#endif /* !Py_LIMITED_API */ + +/* +_Py_NoneStruct is an object of undefined type which can be used in contexts +where NULL (nil) is not suitable (since NULL often means 'error'). + +Don't forget to apply Py_INCREF() when returning this value!!! +*/ +PyAPI_DATA(PyObject) _Py_NoneStruct; /* Don't use this directly */ +#define Py_None (&_Py_NoneStruct) + +/* Macro for returning Py_None from a function */ +#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None + +/* +Py_NotImplemented is a singleton used to signal that an operation is +not implemented for a given type combination. +*/ +PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ +#define Py_NotImplemented (&_Py_NotImplementedStruct) + +/* Macro for returning Py_NotImplemented from a function */ +#define Py_RETURN_NOTIMPLEMENTED \ + return Py_INCREF(Py_NotImplemented), Py_NotImplemented + +/* Rich comparison opcodes */ +#define Py_LT 0 +#define Py_LE 1 +#define Py_EQ 2 +#define Py_NE 3 +#define Py_GT 4 +#define Py_GE 5 + +/* + * Macro for implementing rich comparisons + * + * Needs to be a macro because any C-comparable type can be used. + */ +#define Py_RETURN_RICHCOMPARE(val1, val2, op) \ + do { \ + switch (op) { \ + case Py_EQ: if ((val1) == (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ + case Py_NE: if ((val1) != (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ + case Py_LT: if ((val1) < (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ + case Py_GT: if ((val1) > (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ + case Py_LE: if ((val1) <= (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ + case Py_GE: if ((val1) >= (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ + default: \ + Py_UNREACHABLE(); \ + } \ + } while (0) + +#ifndef Py_LIMITED_API +/* Maps Py_LT to Py_GT, ..., Py_GE to Py_LE. + * Defined in object.c. + */ +PyAPI_DATA(int) _Py_SwappedOp[]; +#endif /* !Py_LIMITED_API */ + + +/* +More conventions +================ + +Argument Checking +----------------- + +Functions that take objects as arguments normally don't check for nil +arguments, but they do check the type of the argument, and return an +error if the function doesn't apply to the type. + +Failure Modes +------------- + +Functions may fail for a variety of reasons, including running out of +memory. This is communicated to the caller in two ways: an error string +is set (see errors.h), and the function result differs: functions that +normally return a pointer return NULL for failure, functions returning +an integer return -1 (which could be a legal return value too!), and +other functions return 0 for success and -1 for failure. +Callers should always check for errors before using the result. If +an error was set, the caller must either explicitly clear it, or pass +the error on to its caller. + +Reference Counts +---------------- + +It takes a while to get used to the proper usage of reference counts. + +Functions that create an object set the reference count to 1; such new +objects must be stored somewhere or destroyed again with Py_DECREF(). +Some functions that 'store' objects, such as PyTuple_SetItem() and +PyList_SetItem(), +don't increment the reference count of the object, since the most +frequent use is to store a fresh object. Functions that 'retrieve' +objects, such as PyTuple_GetItem() and PyDict_GetItemString(), also +don't increment +the reference count, since most frequently the object is only looked at +quickly. Thus, to retrieve an object and store it again, the caller +must call Py_INCREF() explicitly. + +NOTE: functions that 'consume' a reference count, like +PyList_SetItem(), consume the reference even if the object wasn't +successfully stored, to simplify error handling. + +It seems attractive to make other functions that take an object as +argument consume a reference count; however, this may quickly get +confusing (even the current practice is already confusing). Consider +it carefully, it may save lots of calls to Py_INCREF() and Py_DECREF() at +times. +*/ + + +/* Trashcan mechanism, thanks to Christian Tismer. + +When deallocating a container object, it's possible to trigger an unbounded +chain of deallocations, as each Py_DECREF in turn drops the refcount on "the +next" object in the chain to 0. This can easily lead to stack faults, and +especially in threads (which typically have less stack space to work with). + +A container object that participates in cyclic gc can avoid this by +bracketing the body of its tp_dealloc function with a pair of macros: + +static void +mytype_dealloc(mytype *p) +{ + ... declarations go here ... + + PyObject_GC_UnTrack(p); // must untrack first + Py_TRASHCAN_SAFE_BEGIN(p) + ... The body of the deallocator goes here, including all calls ... + ... to Py_DECREF on contained objects. ... + Py_TRASHCAN_SAFE_END(p) +} + +CAUTION: Never return from the middle of the body! If the body needs to +"get out early", put a label immediately before the Py_TRASHCAN_SAFE_END +call, and goto it. Else the call-depth counter (see below) will stay +above 0 forever, and the trashcan will never get emptied. + +How it works: The BEGIN macro increments a call-depth counter. So long +as this counter is small, the body of the deallocator is run directly without +further ado. But if the counter gets large, it instead adds p to a list of +objects to be deallocated later, skips the body of the deallocator, and +resumes execution after the END macro. The tp_dealloc routine then returns +without deallocating anything (and so unbounded call-stack depth is avoided). + +When the call stack finishes unwinding again, code generated by the END macro +notices this, and calls another routine to deallocate all the objects that +may have been added to the list of deferred deallocations. In effect, a +chain of N deallocations is broken into (N-1)/(PyTrash_UNWIND_LEVEL-1) pieces, +with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL. +*/ + +#ifndef Py_LIMITED_API +/* This is the old private API, invoked by the macros before 3.2.4. + Kept for binary compatibility of extensions using the stable ABI. */ +PyAPI_FUNC(void) _PyTrash_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_destroy_chain(void); +#endif /* !Py_LIMITED_API */ + +/* The new thread-safe private API, invoked by the macros below. */ +PyAPI_FUNC(void) _PyTrash_thread_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void); + +#define PyTrash_UNWIND_LEVEL 50 + +#define Py_TRASHCAN_SAFE_BEGIN(op) \ + do { \ + PyThreadState *_tstate = PyThreadState_GET(); \ + if (_tstate->trash_delete_nesting < PyTrash_UNWIND_LEVEL) { \ + ++_tstate->trash_delete_nesting; + /* The body of the deallocator is here. */ +#define Py_TRASHCAN_SAFE_END(op) \ + --_tstate->trash_delete_nesting; \ + if (_tstate->trash_delete_later && _tstate->trash_delete_nesting <= 0) \ + _PyTrash_thread_destroy_chain(); \ + } \ + else \ + _PyTrash_thread_deposit_object((PyObject*)op); \ + } while (0); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) +_PyDebugAllocatorStats(FILE *out, const char *block_name, int num_blocks, + size_t sizeof_block); +PyAPI_FUNC(void) +_PyObject_DebugTypeStats(FILE *out); +#endif /* ifndef Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OBJECT_H */ diff --git a/venv/Include/objimpl.h b/venv/Include/objimpl.h new file mode 100644 index 00000000..057bb50c --- /dev/null +++ b/venv/Include/objimpl.h @@ -0,0 +1,370 @@ +/* The PyObject_ memory family: high-level object memory interfaces. + See pymem.h for the low-level PyMem_ family. +*/ + +#ifndef Py_OBJIMPL_H +#define Py_OBJIMPL_H + +#include "pymem.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* BEWARE: + + Each interface exports both functions and macros. Extension modules should + use the functions, to ensure binary compatibility across Python versions. + Because the Python implementation is free to change internal details, and + the macros may (or may not) expose details for speed, if you do use the + macros you must recompile your extensions with each Python release. + + Never mix calls to PyObject_ memory functions with calls to the platform + malloc/realloc/ calloc/free, or with calls to PyMem_. +*/ + +/* +Functions and macros for modules that implement new object types. + + - PyObject_New(type, typeobj) allocates memory for a new object of the given + type, and initializes part of it. 'type' must be the C structure type used + to represent the object, and 'typeobj' the address of the corresponding + type object. Reference count and type pointer are filled in; the rest of + the bytes of the object are *undefined*! The resulting expression type is + 'type *'. The size of the object is determined by the tp_basicsize field + of the type object. + + - PyObject_NewVar(type, typeobj, n) is similar but allocates a variable-size + object with room for n items. In addition to the refcount and type pointer + fields, this also fills in the ob_size field. + + - PyObject_Del(op) releases the memory allocated for an object. It does not + run a destructor -- it only frees the memory. PyObject_Free is identical. + + - PyObject_Init(op, typeobj) and PyObject_InitVar(op, typeobj, n) don't + allocate memory. Instead of a 'type' parameter, they take a pointer to a + new object (allocated by an arbitrary allocator), and initialize its object + header fields. + +Note that objects created with PyObject_{New, NewVar} are allocated using the +specialized Python allocator (implemented in obmalloc.c), if WITH_PYMALLOC is +enabled. In addition, a special debugging allocator is used if PYMALLOC_DEBUG +is also #defined. + +In case a specific form of memory management is needed (for example, if you +must use the platform malloc heap(s), or shared memory, or C++ local storage or +operator new), you must first allocate the object with your custom allocator, +then pass its pointer to PyObject_{Init, InitVar} for filling in its Python- +specific fields: reference count, type pointer, possibly others. You should +be aware that Python has no control over these objects because they don't +cooperate with the Python memory manager. Such objects may not be eligible +for automatic garbage collection and you have to make sure that they are +released accordingly whenever their destructor gets called (cf. the specific +form of memory management you're using). + +Unless you have specific memory management requirements, use +PyObject_{New, NewVar, Del}. +*/ + +/* + * Raw object memory interface + * =========================== + */ + +/* Functions to call the same malloc/realloc/free as used by Python's + object allocator. If WITH_PYMALLOC is enabled, these may differ from + the platform malloc/realloc/free. The Python object allocator is + designed for fast, cache-conscious allocation of many "small" objects, + and with low hidden memory overhead. + + PyObject_Malloc(0) returns a unique non-NULL pointer if possible. + + PyObject_Realloc(NULL, n) acts like PyObject_Malloc(n). + PyObject_Realloc(p != NULL, 0) does not return NULL, or free the memory + at p. + + Returned pointers must be checked for NULL explicitly; no action is + performed on failure other than to return NULL (no warning it printed, no + exception is set, etc). + + For allocating objects, use PyObject_{New, NewVar} instead whenever + possible. The PyObject_{Malloc, Realloc, Free} family is exposed + so that you can exploit Python's small-block allocator for non-object + uses. If you must use these routines to allocate object memory, make sure + the object gets initialized via PyObject_{Init, InitVar} after obtaining + the raw memory. +*/ +PyAPI_FUNC(void *) PyObject_Malloc(size_t size); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(void *) PyObject_Calloc(size_t nelem, size_t elsize); +#endif +PyAPI_FUNC(void *) PyObject_Realloc(void *ptr, size_t new_size); +PyAPI_FUNC(void) PyObject_Free(void *ptr); + +#ifndef Py_LIMITED_API +/* This function returns the number of allocated memory blocks, regardless of size */ +PyAPI_FUNC(Py_ssize_t) _Py_GetAllocatedBlocks(void); +#endif /* !Py_LIMITED_API */ + +/* Macros */ +#ifdef WITH_PYMALLOC +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyObject_DebugMallocStats(FILE *out); +#endif /* #ifndef Py_LIMITED_API */ +#endif + +/* Macros */ +#define PyObject_MALLOC PyObject_Malloc +#define PyObject_REALLOC PyObject_Realloc +#define PyObject_FREE PyObject_Free +#define PyObject_Del PyObject_Free +#define PyObject_DEL PyObject_Free + + +/* + * Generic object allocator interface + * ================================== + */ + +/* Functions */ +PyAPI_FUNC(PyObject *) PyObject_Init(PyObject *, PyTypeObject *); +PyAPI_FUNC(PyVarObject *) PyObject_InitVar(PyVarObject *, + PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) _PyObject_New(PyTypeObject *); +PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); + +#define PyObject_New(type, typeobj) \ + ( (type *) _PyObject_New(typeobj) ) +#define PyObject_NewVar(type, typeobj, n) \ + ( (type *) _PyObject_NewVar((typeobj), (n)) ) + +/* Macros trading binary compatibility for speed. See also pymem.h. + Note that these macros expect non-NULL object pointers.*/ +#define PyObject_INIT(op, typeobj) \ + ( Py_TYPE(op) = (typeobj), _Py_NewReference((PyObject *)(op)), (op) ) +#define PyObject_INIT_VAR(op, typeobj, size) \ + ( Py_SIZE(op) = (size), PyObject_INIT((op), (typeobj)) ) + +#define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) + +/* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a + vrbl-size object with nitems items, exclusive of gc overhead (if any). The + value is rounded up to the closest multiple of sizeof(void *), in order to + ensure that pointer fields at the end of the object are correctly aligned + for the platform (this is of special importance for subclasses of, e.g., + str or int, so that pointers can be stored after the embedded data). + + Note that there's no memory wastage in doing this, as malloc has to + return (at worst) pointer-aligned memory anyway. +*/ +#if ((SIZEOF_VOID_P - 1) & SIZEOF_VOID_P) != 0 +# error "_PyObject_VAR_SIZE requires SIZEOF_VOID_P be a power of 2" +#endif + +#define _PyObject_VAR_SIZE(typeobj, nitems) \ + _Py_SIZE_ROUND_UP((typeobj)->tp_basicsize + \ + (nitems)*(typeobj)->tp_itemsize, \ + SIZEOF_VOID_P) + +#define PyObject_NEW(type, typeobj) \ +( (type *) PyObject_Init( \ + (PyObject *) PyObject_MALLOC( _PyObject_SIZE(typeobj) ), (typeobj)) ) + +#define PyObject_NEW_VAR(type, typeobj, n) \ +( (type *) PyObject_InitVar( \ + (PyVarObject *) PyObject_MALLOC(_PyObject_VAR_SIZE((typeobj),(n)) ),\ + (typeobj), (n)) ) + +/* This example code implements an object constructor with a custom + allocator, where PyObject_New is inlined, and shows the important + distinction between two steps (at least): + 1) the actual allocation of the object storage; + 2) the initialization of the Python specific fields + in this storage with PyObject_{Init, InitVar}. + + PyObject * + YourObject_New(...) + { + PyObject *op; + + op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct)); + if (op == NULL) + return PyErr_NoMemory(); + + PyObject_Init(op, &YourTypeStruct); + + op->ob_field = value; + ... + return op; + } + + Note that in C++, the use of the new operator usually implies that + the 1st step is performed automatically for you, so in a C++ class + constructor you would start directly with PyObject_Init/InitVar +*/ + +#ifndef Py_LIMITED_API +typedef struct { + /* user context passed as the first argument to the 2 functions */ + void *ctx; + + /* allocate an arena of size bytes */ + void* (*alloc) (void *ctx, size_t size); + + /* free an arena */ + void (*free) (void *ctx, void *ptr, size_t size); +} PyObjectArenaAllocator; + +/* Get the arena allocator. */ +PyAPI_FUNC(void) PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator); + +/* Set the arena allocator. */ +PyAPI_FUNC(void) PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator); +#endif + + +/* + * Garbage Collection Support + * ========================== + */ + +/* C equivalent of gc.collect() which ignores the state of gc.enabled. */ +PyAPI_FUNC(Py_ssize_t) PyGC_Collect(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyGC_CollectNoFail(void); +PyAPI_FUNC(Py_ssize_t) _PyGC_CollectIfEnabled(void); +#endif + +/* Test if a type has a GC head */ +#define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC) + +/* Test if an object has a GC head */ +#define PyObject_IS_GC(o) (PyType_IS_GC(Py_TYPE(o)) && \ + (Py_TYPE(o)->tp_is_gc == NULL || Py_TYPE(o)->tp_is_gc(o))) + +PyAPI_FUNC(PyVarObject *) _PyObject_GC_Resize(PyVarObject *, Py_ssize_t); +#define PyObject_GC_Resize(type, op, n) \ + ( (type *) _PyObject_GC_Resize((PyVarObject *)(op), (n)) ) + +/* GC information is stored BEFORE the object structure. */ +#ifndef Py_LIMITED_API +typedef union _gc_head { + struct { + union _gc_head *gc_next; + union _gc_head *gc_prev; + Py_ssize_t gc_refs; + } gc; + double dummy; /* force worst-case alignment */ +} PyGC_Head; + +extern PyGC_Head *_PyGC_generation0; + +#define _Py_AS_GC(o) ((PyGC_Head *)(o)-1) + +/* Bit 0 is set when tp_finalize is called */ +#define _PyGC_REFS_MASK_FINALIZED (1 << 0) +/* The (N-1) most significant bits contain the gc state / refcount */ +#define _PyGC_REFS_SHIFT (1) +#define _PyGC_REFS_MASK (((size_t) -1) << _PyGC_REFS_SHIFT) + +#define _PyGCHead_REFS(g) ((g)->gc.gc_refs >> _PyGC_REFS_SHIFT) +#define _PyGCHead_SET_REFS(g, v) do { \ + (g)->gc.gc_refs = ((g)->gc.gc_refs & ~_PyGC_REFS_MASK) \ + | (((size_t)(v)) << _PyGC_REFS_SHIFT); \ + } while (0) +#define _PyGCHead_DECREF(g) ((g)->gc.gc_refs -= 1 << _PyGC_REFS_SHIFT) + +#define _PyGCHead_FINALIZED(g) (((g)->gc.gc_refs & _PyGC_REFS_MASK_FINALIZED) != 0) +#define _PyGCHead_SET_FINALIZED(g, v) do { \ + (g)->gc.gc_refs = ((g)->gc.gc_refs & ~_PyGC_REFS_MASK_FINALIZED) \ + | (v != 0); \ + } while (0) + +#define _PyGC_FINALIZED(o) _PyGCHead_FINALIZED(_Py_AS_GC(o)) +#define _PyGC_SET_FINALIZED(o, v) _PyGCHead_SET_FINALIZED(_Py_AS_GC(o), v) + +#define _PyGC_REFS(o) _PyGCHead_REFS(_Py_AS_GC(o)) + +#define _PyGC_REFS_UNTRACKED (-2) +#define _PyGC_REFS_REACHABLE (-3) +#define _PyGC_REFS_TENTATIVELY_UNREACHABLE (-4) + +/* Tell the GC to track this object. NB: While the object is tracked the + * collector it must be safe to call the ob_traverse method. */ +#define _PyObject_GC_TRACK(o) do { \ + PyGC_Head *g = _Py_AS_GC(o); \ + if (_PyGCHead_REFS(g) != _PyGC_REFS_UNTRACKED) \ + Py_FatalError("GC object already tracked"); \ + _PyGCHead_SET_REFS(g, _PyGC_REFS_REACHABLE); \ + g->gc.gc_next = _PyGC_generation0; \ + g->gc.gc_prev = _PyGC_generation0->gc.gc_prev; \ + g->gc.gc_prev->gc.gc_next = g; \ + _PyGC_generation0->gc.gc_prev = g; \ + } while (0); + +/* Tell the GC to stop tracking this object. + * gc_next doesn't need to be set to NULL, but doing so is a good + * way to provoke memory errors if calling code is confused. + */ +#define _PyObject_GC_UNTRACK(o) do { \ + PyGC_Head *g = _Py_AS_GC(o); \ + assert(_PyGCHead_REFS(g) != _PyGC_REFS_UNTRACKED); \ + _PyGCHead_SET_REFS(g, _PyGC_REFS_UNTRACKED); \ + g->gc.gc_prev->gc.gc_next = g->gc.gc_next; \ + g->gc.gc_next->gc.gc_prev = g->gc.gc_prev; \ + g->gc.gc_next = NULL; \ + } while (0); + +/* True if the object is currently tracked by the GC. */ +#define _PyObject_GC_IS_TRACKED(o) \ + (_PyGC_REFS(o) != _PyGC_REFS_UNTRACKED) + +/* True if the object may be tracked by the GC in the future, or already is. + This can be useful to implement some optimizations. */ +#define _PyObject_GC_MAY_BE_TRACKED(obj) \ + (PyObject_IS_GC(obj) && \ + (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) +#endif /* Py_LIMITED_API */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t size); +PyAPI_FUNC(PyObject *) _PyObject_GC_Calloc(size_t size); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(PyObject *) _PyObject_GC_New(PyTypeObject *); +PyAPI_FUNC(PyVarObject *) _PyObject_GC_NewVar(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(void) PyObject_GC_Track(void *); +PyAPI_FUNC(void) PyObject_GC_UnTrack(void *); +PyAPI_FUNC(void) PyObject_GC_Del(void *); + +#define PyObject_GC_New(type, typeobj) \ + ( (type *) _PyObject_GC_New(typeobj) ) +#define PyObject_GC_NewVar(type, typeobj, n) \ + ( (type *) _PyObject_GC_NewVar((typeobj), (n)) ) + + +/* Utility macro to help write tp_traverse functions. + * To use this macro, the tp_traverse function must name its arguments + * "visit" and "arg". This is intended to keep tp_traverse functions + * looking as much alike as possible. + */ +#define Py_VISIT(op) \ + do { \ + if (op) { \ + int vret = visit((PyObject *)(op), arg); \ + if (vret) \ + return vret; \ + } \ + } while (0) + + +/* Test if a type supports weak references */ +#define PyType_SUPPORTS_WEAKREFS(t) ((t)->tp_weaklistoffset > 0) + +#define PyObject_GET_WEAKREFS_LISTPTR(o) \ + ((PyObject **) (((char *) (o)) + Py_TYPE(o)->tp_weaklistoffset)) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OBJIMPL_H */ diff --git a/venv/Include/odictobject.h b/venv/Include/odictobject.h new file mode 100644 index 00000000..8378dc4b --- /dev/null +++ b/venv/Include/odictobject.h @@ -0,0 +1,43 @@ +#ifndef Py_ODICTOBJECT_H +#define Py_ODICTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* OrderedDict */ +/* This API is optional and mostly redundant. */ + +#ifndef Py_LIMITED_API + +typedef struct _odictobject PyODictObject; + +PyAPI_DATA(PyTypeObject) PyODict_Type; +PyAPI_DATA(PyTypeObject) PyODictIter_Type; +PyAPI_DATA(PyTypeObject) PyODictKeys_Type; +PyAPI_DATA(PyTypeObject) PyODictItems_Type; +PyAPI_DATA(PyTypeObject) PyODictValues_Type; + +#define PyODict_Check(op) PyObject_TypeCheck(op, &PyODict_Type) +#define PyODict_CheckExact(op) (Py_TYPE(op) == &PyODict_Type) +#define PyODict_SIZE(op) PyDict_GET_SIZE((op)) + +PyAPI_FUNC(PyObject *) PyODict_New(void); +PyAPI_FUNC(int) PyODict_SetItem(PyObject *od, PyObject *key, PyObject *item); +PyAPI_FUNC(int) PyODict_DelItem(PyObject *od, PyObject *key); + +/* wrappers around PyDict* functions */ +#define PyODict_GetItem(od, key) PyDict_GetItem((PyObject *)od, key) +#define PyODict_GetItemWithError(od, key) \ + PyDict_GetItemWithError((PyObject *)od, key) +#define PyODict_Contains(od, key) PyDict_Contains((PyObject *)od, key) +#define PyODict_Size(od) PyDict_Size((PyObject *)od) +#define PyODict_GetItemString(od, key) \ + PyDict_GetItemString((PyObject *)od, key) + +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ODICTOBJECT_H */ diff --git a/venv/Include/opcode.h b/venv/Include/opcode.h new file mode 100644 index 00000000..fc6cbf3a --- /dev/null +++ b/venv/Include/opcode.h @@ -0,0 +1,147 @@ +/* Auto-generated by Tools/scripts/generate_opcode_h.py */ +#ifndef Py_OPCODE_H +#define Py_OPCODE_H +#ifdef __cplusplus +extern "C" { +#endif + + + /* Instruction opcodes for compiled code */ +#define POP_TOP 1 +#define ROT_TWO 2 +#define ROT_THREE 3 +#define DUP_TOP 4 +#define DUP_TOP_TWO 5 +#define NOP 9 +#define UNARY_POSITIVE 10 +#define UNARY_NEGATIVE 11 +#define UNARY_NOT 12 +#define UNARY_INVERT 15 +#define BINARY_MATRIX_MULTIPLY 16 +#define INPLACE_MATRIX_MULTIPLY 17 +#define BINARY_POWER 19 +#define BINARY_MULTIPLY 20 +#define BINARY_MODULO 22 +#define BINARY_ADD 23 +#define BINARY_SUBTRACT 24 +#define BINARY_SUBSCR 25 +#define BINARY_FLOOR_DIVIDE 26 +#define BINARY_TRUE_DIVIDE 27 +#define INPLACE_FLOOR_DIVIDE 28 +#define INPLACE_TRUE_DIVIDE 29 +#define GET_AITER 50 +#define GET_ANEXT 51 +#define BEFORE_ASYNC_WITH 52 +#define INPLACE_ADD 55 +#define INPLACE_SUBTRACT 56 +#define INPLACE_MULTIPLY 57 +#define INPLACE_MODULO 59 +#define STORE_SUBSCR 60 +#define DELETE_SUBSCR 61 +#define BINARY_LSHIFT 62 +#define BINARY_RSHIFT 63 +#define BINARY_AND 64 +#define BINARY_XOR 65 +#define BINARY_OR 66 +#define INPLACE_POWER 67 +#define GET_ITER 68 +#define GET_YIELD_FROM_ITER 69 +#define PRINT_EXPR 70 +#define LOAD_BUILD_CLASS 71 +#define YIELD_FROM 72 +#define GET_AWAITABLE 73 +#define INPLACE_LSHIFT 75 +#define INPLACE_RSHIFT 76 +#define INPLACE_AND 77 +#define INPLACE_XOR 78 +#define INPLACE_OR 79 +#define BREAK_LOOP 80 +#define WITH_CLEANUP_START 81 +#define WITH_CLEANUP_FINISH 82 +#define RETURN_VALUE 83 +#define IMPORT_STAR 84 +#define SETUP_ANNOTATIONS 85 +#define YIELD_VALUE 86 +#define POP_BLOCK 87 +#define END_FINALLY 88 +#define POP_EXCEPT 89 +#define HAVE_ARGUMENT 90 +#define STORE_NAME 90 +#define DELETE_NAME 91 +#define UNPACK_SEQUENCE 92 +#define FOR_ITER 93 +#define UNPACK_EX 94 +#define STORE_ATTR 95 +#define DELETE_ATTR 96 +#define STORE_GLOBAL 97 +#define DELETE_GLOBAL 98 +#define LOAD_CONST 100 +#define LOAD_NAME 101 +#define BUILD_TUPLE 102 +#define BUILD_LIST 103 +#define BUILD_SET 104 +#define BUILD_MAP 105 +#define LOAD_ATTR 106 +#define COMPARE_OP 107 +#define IMPORT_NAME 108 +#define IMPORT_FROM 109 +#define JUMP_FORWARD 110 +#define JUMP_IF_FALSE_OR_POP 111 +#define JUMP_IF_TRUE_OR_POP 112 +#define JUMP_ABSOLUTE 113 +#define POP_JUMP_IF_FALSE 114 +#define POP_JUMP_IF_TRUE 115 +#define LOAD_GLOBAL 116 +#define CONTINUE_LOOP 119 +#define SETUP_LOOP 120 +#define SETUP_EXCEPT 121 +#define SETUP_FINALLY 122 +#define LOAD_FAST 124 +#define STORE_FAST 125 +#define DELETE_FAST 126 +#define RAISE_VARARGS 130 +#define CALL_FUNCTION 131 +#define MAKE_FUNCTION 132 +#define BUILD_SLICE 133 +#define LOAD_CLOSURE 135 +#define LOAD_DEREF 136 +#define STORE_DEREF 137 +#define DELETE_DEREF 138 +#define CALL_FUNCTION_KW 141 +#define CALL_FUNCTION_EX 142 +#define SETUP_WITH 143 +#define EXTENDED_ARG 144 +#define LIST_APPEND 145 +#define SET_ADD 146 +#define MAP_ADD 147 +#define LOAD_CLASSDEREF 148 +#define BUILD_LIST_UNPACK 149 +#define BUILD_MAP_UNPACK 150 +#define BUILD_MAP_UNPACK_WITH_CALL 151 +#define BUILD_TUPLE_UNPACK 152 +#define BUILD_SET_UNPACK 153 +#define SETUP_ASYNC_WITH 154 +#define FORMAT_VALUE 155 +#define BUILD_CONST_KEY_MAP 156 +#define BUILD_STRING 157 +#define BUILD_TUPLE_UNPACK_WITH_CALL 158 +#define LOAD_METHOD 160 +#define CALL_METHOD 161 + +/* EXCEPT_HANDLER is a special, implicit block type which is created when + entering an except handler. It is not an opcode but we define it here + as we want it to be available to both frameobject.c and ceval.c, while + remaining private.*/ +#define EXCEPT_HANDLER 257 + + +enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, + PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, PyCmp_IN, PyCmp_NOT_IN, + PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD}; + +#define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OPCODE_H */ diff --git a/venv/Include/osdefs.h b/venv/Include/osdefs.h new file mode 100644 index 00000000..bd84c1c1 --- /dev/null +++ b/venv/Include/osdefs.h @@ -0,0 +1,47 @@ +#ifndef Py_OSDEFS_H +#define Py_OSDEFS_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Operating system dependencies */ + +#ifdef MS_WINDOWS +#define SEP L'\\' +#define ALTSEP L'/' +#define MAXPATHLEN 256 +#define DELIM L';' +#endif + +/* Filename separator */ +#ifndef SEP +#define SEP L'/' +#endif + +/* Max pathname length */ +#ifdef __hpux +#include +#include +#ifndef PATH_MAX +#define PATH_MAX MAXPATHLEN +#endif +#endif + +#ifndef MAXPATHLEN +#if defined(PATH_MAX) && PATH_MAX > 1024 +#define MAXPATHLEN PATH_MAX +#else +#define MAXPATHLEN 1024 +#endif +#endif + +/* Search path entry delimiter */ +#ifndef DELIM +#define DELIM L':' +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OSDEFS_H */ diff --git a/venv/Include/osmodule.h b/venv/Include/osmodule.h new file mode 100644 index 00000000..9095c2fd --- /dev/null +++ b/venv/Include/osmodule.h @@ -0,0 +1,17 @@ + +/* os module interface */ + +#ifndef Py_OSMODULE_H +#define Py_OSMODULE_H +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_FUNC(PyObject *) PyOS_FSPath(PyObject *path); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OSMODULE_H */ diff --git a/venv/Include/parsetok.h b/venv/Include/parsetok.h new file mode 100644 index 00000000..c9407a3f --- /dev/null +++ b/venv/Include/parsetok.h @@ -0,0 +1,108 @@ + +/* Parser-tokenizer link interface */ +#ifndef Py_LIMITED_API +#ifndef Py_PARSETOK_H +#define Py_PARSETOK_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int error; +#ifndef PGEN + /* The filename is useless for pgen, see comment in tok_state structure */ + PyObject *filename; +#endif + int lineno; + int offset; + char *text; /* UTF-8-encoded string */ + int token; + int expected; +} perrdetail; + +#if 0 +#define PyPARSE_YIELD_IS_KEYWORD 0x0001 +#endif + +#define PyPARSE_DONT_IMPLY_DEDENT 0x0002 + +#if 0 +#define PyPARSE_WITH_IS_KEYWORD 0x0003 +#define PyPARSE_PRINT_IS_FUNCTION 0x0004 +#define PyPARSE_UNICODE_LITERALS 0x0008 +#endif + +#define PyPARSE_IGNORE_COOKIE 0x0010 +#define PyPARSE_BARRY_AS_BDFL 0x0020 + +PyAPI_FUNC(node *) PyParser_ParseString(const char *, grammar *, int, + perrdetail *); +PyAPI_FUNC(node *) PyParser_ParseFile (FILE *, const char *, grammar *, int, + const char *, const char *, + perrdetail *); + +PyAPI_FUNC(node *) PyParser_ParseStringFlags(const char *, grammar *, int, + perrdetail *, int); +PyAPI_FUNC(node *) PyParser_ParseFileFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + const char *enc, + grammar *g, + int start, + const char *ps1, + const char *ps2, + perrdetail *err_ret, + int flags); +PyAPI_FUNC(node *) PyParser_ParseFileFlagsEx( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + const char *enc, + grammar *g, + int start, + const char *ps1, + const char *ps2, + perrdetail *err_ret, + int *flags); +PyAPI_FUNC(node *) PyParser_ParseFileObject( + FILE *fp, + PyObject *filename, + const char *enc, + grammar *g, + int start, + const char *ps1, + const char *ps2, + perrdetail *err_ret, + int *flags); + +PyAPI_FUNC(node *) PyParser_ParseStringFlagsFilename( + const char *s, + const char *filename, /* decoded from the filesystem encoding */ + grammar *g, + int start, + perrdetail *err_ret, + int flags); +PyAPI_FUNC(node *) PyParser_ParseStringFlagsFilenameEx( + const char *s, + const char *filename, /* decoded from the filesystem encoding */ + grammar *g, + int start, + perrdetail *err_ret, + int *flags); +PyAPI_FUNC(node *) PyParser_ParseStringObject( + const char *s, + PyObject *filename, + grammar *g, + int start, + perrdetail *err_ret, + int *flags); + +/* Note that the following functions are defined in pythonrun.c, + not in parsetok.c */ +PyAPI_FUNC(void) PyParser_SetError(perrdetail *); +PyAPI_FUNC(void) PyParser_ClearError(perrdetail *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PARSETOK_H */ +#endif /* !Py_LIMITED_API */ diff --git a/venv/Include/patchlevel.h b/venv/Include/patchlevel.h new file mode 100644 index 00000000..13876bdc --- /dev/null +++ b/venv/Include/patchlevel.h @@ -0,0 +1,35 @@ + +/* Python version identification scheme. + + When the major or minor version changes, the VERSION variable in + configure.ac must also be changed. + + There is also (independent) API version information in modsupport.h. +*/ + +/* Values for PY_RELEASE_LEVEL */ +#define PY_RELEASE_LEVEL_ALPHA 0xA +#define PY_RELEASE_LEVEL_BETA 0xB +#define PY_RELEASE_LEVEL_GAMMA 0xC /* For release candidates */ +#define PY_RELEASE_LEVEL_FINAL 0xF /* Serial should be 0 here */ + /* Higher for patch releases */ + +/* Version parsed out into numeric values */ +/*--start constants--*/ +#define PY_MAJOR_VERSION 3 +#define PY_MINOR_VERSION 7 +#define PY_MICRO_VERSION 0 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL +#define PY_RELEASE_SERIAL 0 + +/* Version as a string */ +#define PY_VERSION "3.7.0" +/*--end constants--*/ + +/* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. + Use this for numeric comparisons, e.g. #if PY_VERSION_HEX >= ... */ +#define PY_VERSION_HEX ((PY_MAJOR_VERSION << 24) | \ + (PY_MINOR_VERSION << 16) | \ + (PY_MICRO_VERSION << 8) | \ + (PY_RELEASE_LEVEL << 4) | \ + (PY_RELEASE_SERIAL << 0)) diff --git a/venv/Include/pgen.h b/venv/Include/pgen.h new file mode 100644 index 00000000..8a325ed0 --- /dev/null +++ b/venv/Include/pgen.h @@ -0,0 +1,18 @@ +#ifndef Py_PGEN_H +#define Py_PGEN_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Parser generator interface */ + +extern grammar *meta_grammar(void); + +struct _node; +extern grammar *pgen(struct _node *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PGEN_H */ diff --git a/venv/Include/pgenheaders.h b/venv/Include/pgenheaders.h new file mode 100644 index 00000000..dbc5e0a5 --- /dev/null +++ b/venv/Include/pgenheaders.h @@ -0,0 +1,43 @@ +#ifndef Py_PGENHEADERS_H +#define Py_PGENHEADERS_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Include files and extern declarations used by most of the parser. */ + +#include "Python.h" + +PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); + +#define addarc _Py_addarc +#define addbit _Py_addbit +#define adddfa _Py_adddfa +#define addfirstsets _Py_addfirstsets +#define addlabel _Py_addlabel +#define addstate _Py_addstate +#define delbitset _Py_delbitset +#define dumptree _Py_dumptree +#define findlabel _Py_findlabel +#define freegrammar _Py_freegrammar +#define mergebitset _Py_mergebitset +#define meta_grammar _Py_meta_grammar +#define newbitset _Py_newbitset +#define newgrammar _Py_newgrammar +#define pgen _Py_pgen +#define printgrammar _Py_printgrammar +#define printnonterminals _Py_printnonterminals +#define printtree _Py_printtree +#define samebitset _Py_samebitset +#define showtree _Py_showtree +#define tok_dump _Py_tok_dump +#define translatelabels _Py_translatelabels + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PGENHEADERS_H */ diff --git a/venv/Include/py_curses.h b/venv/Include/py_curses.h new file mode 100644 index 00000000..0eebc362 --- /dev/null +++ b/venv/Include/py_curses.h @@ -0,0 +1,159 @@ + +#ifndef Py_CURSES_H +#define Py_CURSES_H + +#ifdef __APPLE__ +/* +** On Mac OS X 10.2 [n]curses.h and stdlib.h use different guards +** against multiple definition of wchar_t. +*/ +#ifdef _BSD_WCHAR_T_DEFINED_ +#define _WCHAR_T +#endif +#endif /* __APPLE__ */ + +/* On FreeBSD, [n]curses.h and stdlib.h/wchar.h use different guards + against multiple definition of wchar_t and wint_t. */ +#if defined(__FreeBSD__) && defined(_XOPEN_SOURCE_EXTENDED) +# ifndef __wchar_t +# define __wchar_t +# endif +# ifndef __wint_t +# define __wint_t +# endif +#endif + +#if !defined(HAVE_CURSES_IS_PAD) && defined(WINDOW_HAS_FLAGS) +/* The following definition is necessary for ncurses 5.7; without it, + some of [n]curses.h set NCURSES_OPAQUE to 1, and then Python + can't get at the WINDOW flags field. */ +#define NCURSES_OPAQUE 0 +#endif + +#ifdef HAVE_NCURSES_H +#include +#else +#include +#endif + +#ifdef HAVE_NCURSES_H +/* configure was checking , but we will + use , which has some or all these features. */ +#if !defined(WINDOW_HAS_FLAGS) && !(NCURSES_OPAQUE+0) +#define WINDOW_HAS_FLAGS 1 +#endif +#if !defined(HAVE_CURSES_IS_PAD) && NCURSES_VERSION_PATCH+0 >= 20090906 +#define HAVE_CURSES_IS_PAD 1 +#endif +#ifndef MVWDELCH_IS_EXPRESSION +#define MVWDELCH_IS_EXPRESSION 1 +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define PyCurses_API_pointers 4 + +/* Type declarations */ + +typedef struct { + PyObject_HEAD + WINDOW *win; + char *encoding; +} PyCursesWindowObject; + +#define PyCursesWindow_Check(v) (Py_TYPE(v) == &PyCursesWindow_Type) + +#define PyCurses_CAPSULE_NAME "_curses._C_API" + + +#ifdef CURSES_MODULE +/* This section is used when compiling _cursesmodule.c */ + +#else +/* This section is used in modules that use the _cursesmodule API */ + +static void **PyCurses_API; + +#define PyCursesWindow_Type (*(PyTypeObject *) PyCurses_API[0]) +#define PyCursesSetupTermCalled {if (! ((int (*)(void))PyCurses_API[1]) () ) return NULL;} +#define PyCursesInitialised {if (! ((int (*)(void))PyCurses_API[2]) () ) return NULL;} +#define PyCursesInitialisedColor {if (! ((int (*)(void))PyCurses_API[3]) () ) return NULL;} + +#define import_curses() \ + PyCurses_API = (void **)PyCapsule_Import(PyCurses_CAPSULE_NAME, 1); + +#endif + +/* general error messages */ +static const char catchall_ERR[] = "curses function returned ERR"; +static const char catchall_NULL[] = "curses function returned NULL"; + +/* Function Prototype Macros - They are ugly but very, very useful. ;-) + + X - function name + TYPE - parameter Type + ERGSTR - format string for construction of the return value + PARSESTR - format string for argument parsing + */ + +#define NoArgNoReturnFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyCursesCheckERR(X(), # X); } + +#define NoArgOrFlagNoReturnFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \ +{ \ + int flag = 0; \ + PyCursesInitialised \ + switch(PyTuple_Size(args)) { \ + case 0: \ + return PyCursesCheckERR(X(), # X); \ + case 1: \ + if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL; \ + if (flag) return PyCursesCheckERR(X(), # X); \ + else return PyCursesCheckERR(no ## X (), # X); \ + default: \ + PyErr_SetString(PyExc_TypeError, # X " requires 0 or 1 arguments"); \ + return NULL; } } + +#define NoArgReturnIntFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyLong_FromLong((long) X()); } + + +#define NoArgReturnStringFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyBytes_FromString(X()); } + +#define NoArgTrueFalseFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + if (X () == FALSE) { \ + Py_RETURN_FALSE; \ + } \ + Py_RETURN_TRUE; } + +#define NoArgNoReturnVoidFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + X(); \ + Py_RETURN_NONE; } + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(Py_CURSES_H) */ + + diff --git a/venv/Include/pyarena.h b/venv/Include/pyarena.h new file mode 100644 index 00000000..db3ad018 --- /dev/null +++ b/venv/Include/pyarena.h @@ -0,0 +1,64 @@ +/* An arena-like memory interface for the compiler. + */ + +#ifndef Py_LIMITED_API +#ifndef Py_PYARENA_H +#define Py_PYARENA_H + +#ifdef __cplusplus +extern "C" { +#endif + + typedef struct _arena PyArena; + + /* PyArena_New() and PyArena_Free() create a new arena and free it, + respectively. Once an arena has been created, it can be used + to allocate memory via PyArena_Malloc(). Pointers to PyObject can + also be registered with the arena via PyArena_AddPyObject(), and the + arena will ensure that the PyObjects stay alive at least until + PyArena_Free() is called. When an arena is freed, all the memory it + allocated is freed, the arena releases internal references to registered + PyObject*, and none of its pointers are valid. + XXX (tim) What does "none of its pointers are valid" mean? Does it + XXX mean that pointers previously obtained via PyArena_Malloc() are + XXX no longer valid? (That's clearly true, but not sure that's what + XXX the text is trying to say.) + + PyArena_New() returns an arena pointer. On error, it + returns a negative number and sets an exception. + XXX (tim): Not true. On error, PyArena_New() actually returns NULL, + XXX and looks like it may or may not set an exception (e.g., if the + XXX internal PyList_New(0) returns NULL, PyArena_New() passes that on + XXX and an exception is set; OTOH, if the internal + XXX block_new(DEFAULT_BLOCK_SIZE) returns NULL, that's passed on but + XXX an exception is not set in that case). + */ + PyAPI_FUNC(PyArena *) PyArena_New(void); + PyAPI_FUNC(void) PyArena_Free(PyArena *); + + /* Mostly like malloc(), return the address of a block of memory spanning + * `size` bytes, or return NULL (without setting an exception) if enough + * new memory can't be obtained. Unlike malloc(0), PyArena_Malloc() with + * size=0 does not guarantee to return a unique pointer (the pointer + * returned may equal one or more other pointers obtained from + * PyArena_Malloc()). + * Note that pointers obtained via PyArena_Malloc() must never be passed to + * the system free() or realloc(), or to any of Python's similar memory- + * management functions. PyArena_Malloc()-obtained pointers remain valid + * until PyArena_Free(ar) is called, at which point all pointers obtained + * from the arena `ar` become invalid simultaneously. + */ + PyAPI_FUNC(void *) PyArena_Malloc(PyArena *, size_t size); + + /* This routine isn't a proper arena allocation routine. It takes + * a PyObject* and records it so that it can be DECREFed when the + * arena is freed. + */ + PyAPI_FUNC(int) PyArena_AddPyObject(PyArena *, PyObject *); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYARENA_H */ +#endif /* Py_LIMITED_API */ diff --git a/venv/Include/pyatomic.h b/venv/Include/pyatomic.h new file mode 100644 index 00000000..9a497a68 --- /dev/null +++ b/venv/Include/pyatomic.h @@ -0,0 +1,535 @@ +#ifndef Py_ATOMIC_H +#define Py_ATOMIC_H +#ifdef Py_BUILD_CORE + +#include "dynamic_annotations.h" + +#include "pyconfig.h" + +#if defined(HAVE_STD_ATOMIC) +#include +#endif + + +#if defined(_MSC_VER) +#include +#include +#endif + +/* This is modeled after the atomics interface from C1x, according to + * the draft at + * http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1425.pdf. + * Operations and types are named the same except with a _Py_ prefix + * and have the same semantics. + * + * Beware, the implementations here are deep magic. + */ + +#if defined(HAVE_STD_ATOMIC) + +typedef enum _Py_memory_order { + _Py_memory_order_relaxed = memory_order_relaxed, + _Py_memory_order_acquire = memory_order_acquire, + _Py_memory_order_release = memory_order_release, + _Py_memory_order_acq_rel = memory_order_acq_rel, + _Py_memory_order_seq_cst = memory_order_seq_cst +} _Py_memory_order; + +typedef struct _Py_atomic_address { + atomic_uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + atomic_int _value; +} _Py_atomic_int; + +#define _Py_atomic_signal_fence(/*memory_order*/ ORDER) \ + atomic_signal_fence(ORDER) + +#define _Py_atomic_thread_fence(/*memory_order*/ ORDER) \ + atomic_thread_fence(ORDER) + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + atomic_store_explicit(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER) + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + atomic_load_explicit(&(ATOMIC_VAL)->_value, ORDER) + +/* Use builtin atomic operations in GCC >= 4.7 */ +#elif defined(HAVE_BUILTIN_ATOMIC) + +typedef enum _Py_memory_order { + _Py_memory_order_relaxed = __ATOMIC_RELAXED, + _Py_memory_order_acquire = __ATOMIC_ACQUIRE, + _Py_memory_order_release = __ATOMIC_RELEASE, + _Py_memory_order_acq_rel = __ATOMIC_ACQ_REL, + _Py_memory_order_seq_cst = __ATOMIC_SEQ_CST +} _Py_memory_order; + +typedef struct _Py_atomic_address { + uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + int _value; +} _Py_atomic_int; + +#define _Py_atomic_signal_fence(/*memory_order*/ ORDER) \ + __atomic_signal_fence(ORDER) + +#define _Py_atomic_thread_fence(/*memory_order*/ ORDER) \ + __atomic_thread_fence(ORDER) + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + (assert((ORDER) == __ATOMIC_RELAXED \ + || (ORDER) == __ATOMIC_SEQ_CST \ + || (ORDER) == __ATOMIC_RELEASE), \ + __atomic_store_n(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER)) + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + (assert((ORDER) == __ATOMIC_RELAXED \ + || (ORDER) == __ATOMIC_SEQ_CST \ + || (ORDER) == __ATOMIC_ACQUIRE \ + || (ORDER) == __ATOMIC_CONSUME), \ + __atomic_load_n(&(ATOMIC_VAL)->_value, ORDER)) + +/* Only support GCC (for expression statements) and x86 (for simple + * atomic semantics) and MSVC x86/x64/ARM */ +#elif defined(__GNUC__) && (defined(__i386__) || defined(__amd64)) +typedef enum _Py_memory_order { + _Py_memory_order_relaxed, + _Py_memory_order_acquire, + _Py_memory_order_release, + _Py_memory_order_acq_rel, + _Py_memory_order_seq_cst +} _Py_memory_order; + +typedef struct _Py_atomic_address { + uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + int _value; +} _Py_atomic_int; + + +static __inline__ void +_Py_atomic_signal_fence(_Py_memory_order order) +{ + if (order != _Py_memory_order_relaxed) + __asm__ volatile("":::"memory"); +} + +static __inline__ void +_Py_atomic_thread_fence(_Py_memory_order order) +{ + if (order != _Py_memory_order_relaxed) + __asm__ volatile("mfence":::"memory"); +} + +/* Tell the race checker about this operation's effects. */ +static __inline__ void +_Py_ANNOTATE_MEMORY_ORDER(const volatile void *address, _Py_memory_order order) +{ + (void)address; /* shut up -Wunused-parameter */ + switch(order) { + case _Py_memory_order_release: + case _Py_memory_order_acq_rel: + case _Py_memory_order_seq_cst: + _Py_ANNOTATE_HAPPENS_BEFORE(address); + break; + case _Py_memory_order_relaxed: + case _Py_memory_order_acquire: + break; + } + switch(order) { + case _Py_memory_order_acquire: + case _Py_memory_order_acq_rel: + case _Py_memory_order_seq_cst: + _Py_ANNOTATE_HAPPENS_AFTER(address); + break; + case _Py_memory_order_relaxed: + case _Py_memory_order_release: + break; + } +} + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + __extension__ ({ \ + __typeof__(ATOMIC_VAL) atomic_val = ATOMIC_VAL; \ + __typeof__(atomic_val->_value) new_val = NEW_VAL;\ + volatile __typeof__(new_val) *volatile_data = &atomic_val->_value; \ + _Py_memory_order order = ORDER; \ + _Py_ANNOTATE_MEMORY_ORDER(atomic_val, order); \ + \ + /* Perform the operation. */ \ + _Py_ANNOTATE_IGNORE_WRITES_BEGIN(); \ + switch(order) { \ + case _Py_memory_order_release: \ + _Py_atomic_signal_fence(_Py_memory_order_release); \ + /* fallthrough */ \ + case _Py_memory_order_relaxed: \ + *volatile_data = new_val; \ + break; \ + \ + case _Py_memory_order_acquire: \ + case _Py_memory_order_acq_rel: \ + case _Py_memory_order_seq_cst: \ + __asm__ volatile("xchg %0, %1" \ + : "+r"(new_val) \ + : "m"(atomic_val->_value) \ + : "memory"); \ + break; \ + } \ + _Py_ANNOTATE_IGNORE_WRITES_END(); \ + }) + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + __extension__ ({ \ + __typeof__(ATOMIC_VAL) atomic_val = ATOMIC_VAL; \ + __typeof__(atomic_val->_value) result; \ + volatile __typeof__(result) *volatile_data = &atomic_val->_value; \ + _Py_memory_order order = ORDER; \ + _Py_ANNOTATE_MEMORY_ORDER(atomic_val, order); \ + \ + /* Perform the operation. */ \ + _Py_ANNOTATE_IGNORE_READS_BEGIN(); \ + switch(order) { \ + case _Py_memory_order_release: \ + case _Py_memory_order_acq_rel: \ + case _Py_memory_order_seq_cst: \ + /* Loads on x86 are not releases by default, so need a */ \ + /* thread fence. */ \ + _Py_atomic_thread_fence(_Py_memory_order_release); \ + break; \ + default: \ + /* No fence */ \ + break; \ + } \ + result = *volatile_data; \ + switch(order) { \ + case _Py_memory_order_acquire: \ + case _Py_memory_order_acq_rel: \ + case _Py_memory_order_seq_cst: \ + /* Loads on x86 are automatically acquire operations so */ \ + /* can get by with just a compiler fence. */ \ + _Py_atomic_signal_fence(_Py_memory_order_acquire); \ + break; \ + default: \ + /* No fence */ \ + break; \ + } \ + _Py_ANNOTATE_IGNORE_READS_END(); \ + result; \ + }) + +#elif defined(_MSC_VER) +/* _Interlocked* functions provide a full memory barrier and are therefore + enough for acq_rel and seq_cst. If the HLE variants aren't available + in hardware they will fall back to a full memory barrier as well. + + This might affect performance but likely only in some very specific and + hard to meassure scenario. +*/ +#if defined(_M_IX86) || defined(_M_X64) +typedef enum _Py_memory_order { + _Py_memory_order_relaxed, + _Py_memory_order_acquire, + _Py_memory_order_release, + _Py_memory_order_acq_rel, + _Py_memory_order_seq_cst +} _Py_memory_order; + +typedef struct _Py_atomic_address { + volatile uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + volatile int _value; +} _Py_atomic_int; + + +#if defined(_M_X64) +#define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) \ + switch (ORDER) { \ + case _Py_memory_order_acquire: \ + _InterlockedExchange64_HLEAcquire((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + break; \ + case _Py_memory_order_release: \ + _InterlockedExchange64_HLERelease((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + break; \ + default: \ + _InterlockedExchange64((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + break; \ + } +#else +#define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) ((void)0); +#endif + +#define _Py_atomic_store_32bit(ATOMIC_VAL, NEW_VAL, ORDER) \ + switch (ORDER) { \ + case _Py_memory_order_acquire: \ + _InterlockedExchange_HLEAcquire((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + break; \ + case _Py_memory_order_release: \ + _InterlockedExchange_HLERelease((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + break; \ + default: \ + _InterlockedExchange((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + break; \ + } + +#if defined(_M_X64) +/* This has to be an intptr_t for now. + gil_created() uses -1 as a sentinel value, if this returns + a uintptr_t it will do an unsigned compare and crash +*/ +inline intptr_t _Py_atomic_load_64bit(volatile uintptr_t* value, int order) { + __int64 old; + switch (order) { + case _Py_memory_order_acquire: + { + do { + old = *value; + } while(_InterlockedCompareExchange64_HLEAcquire((volatile __int64*)value, old, old) != old); + break; + } + case _Py_memory_order_release: + { + do { + old = *value; + } while(_InterlockedCompareExchange64_HLERelease((volatile __int64*)value, old, old) != old); + break; + } + case _Py_memory_order_relaxed: + old = *value; + break; + default: + { + do { + old = *value; + } while(_InterlockedCompareExchange64((volatile __int64*)value, old, old) != old); + break; + } + } + return old; +} + +#else +#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *ATOMIC_VAL +#endif + +inline int _Py_atomic_load_32bit(volatile int* value, int order) { + long old; + switch (order) { + case _Py_memory_order_acquire: + { + do { + old = *value; + } while(_InterlockedCompareExchange_HLEAcquire((volatile long*)value, old, old) != old); + break; + } + case _Py_memory_order_release: + { + do { + old = *value; + } while(_InterlockedCompareExchange_HLERelease((volatile long*)value, old, old) != old); + break; + } + case _Py_memory_order_relaxed: + old = *value; + break; + default: + { + do { + old = *value; + } while(_InterlockedCompareExchange((volatile long*)value, old, old) != old); + break; + } + } + return old; +} + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + if (sizeof(*ATOMIC_VAL._value) == 8) { \ + _Py_atomic_store_64bit((volatile long long*)ATOMIC_VAL._value, NEW_VAL, ORDER) } else { \ + _Py_atomic_store_32bit((volatile long*)ATOMIC_VAL._value, NEW_VAL, ORDER) } + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + ( \ + sizeof(*(ATOMIC_VAL._value)) == 8 ? \ + _Py_atomic_load_64bit((volatile long long*)ATOMIC_VAL._value, ORDER) : \ + _Py_atomic_load_32bit((volatile long*)ATOMIC_VAL._value, ORDER) \ + ) +#elif defined(_M_ARM) || defined(_M_ARM64) +typedef enum _Py_memory_order { + _Py_memory_order_relaxed, + _Py_memory_order_acquire, + _Py_memory_order_release, + _Py_memory_order_acq_rel, + _Py_memory_order_seq_cst +} _Py_memory_order; + +typedef struct _Py_atomic_address { + volatile uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + volatile int _value; +} _Py_atomic_int; + + +#if defined(_M_ARM64) +#define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) \ + switch (ORDER) { \ + case _Py_memory_order_acquire: \ + _InterlockedExchange64_acq((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + break; \ + case _Py_memory_order_release: \ + _InterlockedExchange64_rel((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + break; \ + default: \ + _InterlockedExchange64((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + break; \ + } +#else +#define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) ((void)0); +#endif + +#define _Py_atomic_store_32bit(ATOMIC_VAL, NEW_VAL, ORDER) \ + switch (ORDER) { \ + case _Py_memory_order_acquire: \ + _InterlockedExchange_acq((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + break; \ + case _Py_memory_order_release: \ + _InterlockedExchange_rel((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + break; \ + default: \ + _InterlockedExchange((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + break; \ + } + +#if defined(_M_ARM64) +/* This has to be an intptr_t for now. + gil_created() uses -1 as a sentinel value, if this returns + a uintptr_t it will do an unsigned compare and crash +*/ +inline intptr_t _Py_atomic_load_64bit(volatile uintptr_t* value, int order) { + uintptr_t old; + switch (order) { + case _Py_memory_order_acquire: + { + do { + old = *value; + } while(_InterlockedCompareExchange64_acq(value, old, old) != old); + break; + } + case _Py_memory_order_release: + { + do { + old = *value; + } while(_InterlockedCompareExchange64_rel(value, old, old) != old); + break; + } + case _Py_memory_order_relaxed: + old = *value; + break; + default: + { + do { + old = *value; + } while(_InterlockedCompareExchange64(value, old, old) != old); + break; + } + } + return old; +} + +#else +#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *ATOMIC_VAL +#endif + +inline int _Py_atomic_load_32bit(volatile int* value, int order) { + int old; + switch (order) { + case _Py_memory_order_acquire: + { + do { + old = *value; + } while(_InterlockedCompareExchange_acq(value, old, old) != old); + break; + } + case _Py_memory_order_release: + { + do { + old = *value; + } while(_InterlockedCompareExchange_rel(value, old, old) != old); + break; + } + case _Py_memory_order_relaxed: + old = *value; + break; + default: + { + do { + old = *value; + } while(_InterlockedCompareExchange(value, old, old) != old); + break; + } + } + return old; +} + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + if (sizeof(*ATOMIC_VAL._value) == 8) { \ + _Py_atomic_store_64bit(ATOMIC_VAL._value, NEW_VAL, ORDER) } else { \ + _Py_atomic_store_32bit(ATOMIC_VAL._value, NEW_VAL, ORDER) } + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + ( \ + sizeof(*(ATOMIC_VAL._value)) == 8 ? \ + _Py_atomic_load_64bit(ATOMIC_VAL._value, ORDER) : \ + _Py_atomic_load_32bit(ATOMIC_VAL._value, ORDER) \ + ) +#endif +#else /* !gcc x86 !_msc_ver */ +typedef enum _Py_memory_order { + _Py_memory_order_relaxed, + _Py_memory_order_acquire, + _Py_memory_order_release, + _Py_memory_order_acq_rel, + _Py_memory_order_seq_cst +} _Py_memory_order; + +typedef struct _Py_atomic_address { + uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + int _value; +} _Py_atomic_int; +/* Fall back to other compilers and processors by assuming that simple + volatile accesses are atomic. This is false, so people should port + this. */ +#define _Py_atomic_signal_fence(/*memory_order*/ ORDER) ((void)0) +#define _Py_atomic_thread_fence(/*memory_order*/ ORDER) ((void)0) +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + ((ATOMIC_VAL)->_value = NEW_VAL) +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + ((ATOMIC_VAL)->_value) +#endif + +/* Standardized shortcuts. */ +#define _Py_atomic_store(ATOMIC_VAL, NEW_VAL) \ + _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, _Py_memory_order_seq_cst) +#define _Py_atomic_load(ATOMIC_VAL) \ + _Py_atomic_load_explicit(ATOMIC_VAL, _Py_memory_order_seq_cst) + +/* Python-local extensions */ + +#define _Py_atomic_store_relaxed(ATOMIC_VAL, NEW_VAL) \ + _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, _Py_memory_order_relaxed) +#define _Py_atomic_load_relaxed(ATOMIC_VAL) \ + _Py_atomic_load_explicit(ATOMIC_VAL, _Py_memory_order_relaxed) +#endif /* Py_BUILD_CORE */ +#endif /* Py_ATOMIC_H */ diff --git a/venv/Include/pycapsule.h b/venv/Include/pycapsule.h new file mode 100644 index 00000000..d9ecda7a --- /dev/null +++ b/venv/Include/pycapsule.h @@ -0,0 +1,59 @@ + +/* Capsule objects let you wrap a C "void *" pointer in a Python + object. They're a way of passing data through the Python interpreter + without creating your own custom type. + + Capsules are used for communication between extension modules. + They provide a way for an extension module to export a C interface + to other extension modules, so that extension modules can use the + Python import mechanism to link to one another. + + For more information, please see "c-api/capsule.html" in the + documentation. +*/ + +#ifndef Py_CAPSULE_H +#define Py_CAPSULE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyCapsule_Type; + +typedef void (*PyCapsule_Destructor)(PyObject *); + +#define PyCapsule_CheckExact(op) (Py_TYPE(op) == &PyCapsule_Type) + + +PyAPI_FUNC(PyObject *) PyCapsule_New( + void *pointer, + const char *name, + PyCapsule_Destructor destructor); + +PyAPI_FUNC(void *) PyCapsule_GetPointer(PyObject *capsule, const char *name); + +PyAPI_FUNC(PyCapsule_Destructor) PyCapsule_GetDestructor(PyObject *capsule); + +PyAPI_FUNC(const char *) PyCapsule_GetName(PyObject *capsule); + +PyAPI_FUNC(void *) PyCapsule_GetContext(PyObject *capsule); + +PyAPI_FUNC(int) PyCapsule_IsValid(PyObject *capsule, const char *name); + +PyAPI_FUNC(int) PyCapsule_SetPointer(PyObject *capsule, void *pointer); + +PyAPI_FUNC(int) PyCapsule_SetDestructor(PyObject *capsule, PyCapsule_Destructor destructor); + +PyAPI_FUNC(int) PyCapsule_SetName(PyObject *capsule, const char *name); + +PyAPI_FUNC(int) PyCapsule_SetContext(PyObject *capsule, void *context); + +PyAPI_FUNC(void *) PyCapsule_Import( + const char *name, /* UTF-8 encoded string */ + int no_block); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CAPSULE_H */ diff --git a/venv/Include/pyconfig.h b/venv/Include/pyconfig.h new file mode 100644 index 00000000..d2a3f5dd --- /dev/null +++ b/venv/Include/pyconfig.h @@ -0,0 +1,693 @@ +#ifndef Py_CONFIG_H +#define Py_CONFIG_H + +/* pyconfig.h. NOT Generated automatically by configure. + +This is a manually maintained version used for the Watcom, +Borland and Microsoft Visual C++ compilers. It is a +standard part of the Python distribution. + +WINDOWS DEFINES: +The code specific to Windows should be wrapped around one of +the following #defines + +MS_WIN64 - Code specific to the MS Win64 API +MS_WIN32 - Code specific to the MS Win32 (and Win64) API (obsolete, this covers all supported APIs) +MS_WINDOWS - Code specific to Windows, but all versions. +Py_ENABLE_SHARED - Code if the Python core is built as a DLL. + +Also note that neither "_M_IX86" or "_MSC_VER" should be used for +any purpose other than "Windows Intel x86 specific" and "Microsoft +compiler specific". Therefore, these should be very rare. + + +NOTE: The following symbols are deprecated: +NT, USE_DL_EXPORT, USE_DL_IMPORT, DL_EXPORT, DL_IMPORT +MS_CORE_DLL. + +WIN32 is still required for the locale module. + +*/ + +/* Deprecated USE_DL_EXPORT macro - please use Py_BUILD_CORE */ +#ifdef USE_DL_EXPORT +# define Py_BUILD_CORE +#endif /* USE_DL_EXPORT */ + +/* Visual Studio 2005 introduces deprecation warnings for + "insecure" and POSIX functions. The insecure functions should + be replaced by *_s versions (according to Microsoft); the + POSIX functions by _* versions (which, according to Microsoft, + would be ISO C conforming). Neither renaming is feasible, so + we just silence the warnings. */ + +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif +#ifndef _CRT_NONSTDC_NO_DEPRECATE +#define _CRT_NONSTDC_NO_DEPRECATE 1 +#endif + +#define HAVE_IO_H +#define HAVE_SYS_UTIME_H +#define HAVE_TEMPNAM +#define HAVE_TMPFILE +#define HAVE_TMPNAM +#define HAVE_CLOCK +#define HAVE_STRERROR + +#include + +#define HAVE_HYPOT +#define HAVE_STRFTIME +#define DONT_HAVE_SIG_ALARM +#define DONT_HAVE_SIG_PAUSE +#define LONG_BIT 32 +#define WORD_BIT 32 + +#define MS_WIN32 /* only support win32 and greater. */ +#define MS_WINDOWS +#ifndef PYTHONPATH +# define PYTHONPATH L".\\DLLs;.\\lib" +#endif +#define NT_THREADS +#define WITH_THREAD +#ifndef NETSCAPE_PI +#define USE_SOCKET +#endif + + +/* Compiler specific defines */ + +/* ------------------------------------------------------------------------*/ +/* Microsoft C defines _MSC_VER */ +#ifdef _MSC_VER + +/* We want COMPILER to expand to a string containing _MSC_VER's *value*. + * This is horridly tricky, because the stringization operator only works + * on macro arguments, and doesn't evaluate macros passed *as* arguments. + * Attempts simpler than the following appear doomed to produce "_MSC_VER" + * literally in the string. + */ +#define _Py_PASTE_VERSION(SUFFIX) \ + ("[MSC v." _Py_STRINGIZE(_MSC_VER) " " SUFFIX "]") +/* e.g., this produces, after compile-time string catenation, + * ("[MSC v.1200 32 bit (Intel)]") + * + * _Py_STRINGIZE(_MSC_VER) expands to + * _Py_STRINGIZE1((_MSC_VER)) expands to + * _Py_STRINGIZE2(_MSC_VER) but as this call is the result of token-pasting + * it's scanned again for macros and so further expands to (under MSVC 6) + * _Py_STRINGIZE2(1200) which then expands to + * "1200" + */ +#define _Py_STRINGIZE(X) _Py_STRINGIZE1((X)) +#define _Py_STRINGIZE1(X) _Py_STRINGIZE2 ## X +#define _Py_STRINGIZE2(X) #X + +/* MSVC defines _WINxx to differentiate the windows platform types + + Note that for compatibility reasons _WIN32 is defined on Win32 + *and* on Win64. For the same reasons, in Python, MS_WIN32 is + defined on Win32 *and* Win64. Win32 only code must therefore be + guarded as follows: + #if defined(MS_WIN32) && !defined(MS_WIN64) +*/ +#ifdef _WIN64 +#define MS_WIN64 +#endif + +/* set the COMPILER */ +#ifdef MS_WIN64 +#if defined(_M_X64) || defined(_M_AMD64) +#if defined(__INTEL_COMPILER) +#define COMPILER ("[ICC v." _Py_STRINGIZE(__INTEL_COMPILER) " 64 bit (amd64) with MSC v." _Py_STRINGIZE(_MSC_VER) " CRT]") +#else +#define COMPILER _Py_PASTE_VERSION("64 bit (AMD64)") +#endif /* __INTEL_COMPILER */ +#define PYD_PLATFORM_TAG "win_amd64" +#else +#define COMPILER _Py_PASTE_VERSION("64 bit (Unknown)") +#endif +#endif /* MS_WIN64 */ + +/* set the version macros for the windows headers */ +/* Python 3.5+ requires Windows Vista or greater */ +#define Py_WINVER 0x0600 /* _WIN32_WINNT_VISTA */ +#define Py_NTDDI NTDDI_VISTA + +/* We only set these values when building Python - we don't want to force + these values on extensions, as that will affect the prototypes and + structures exposed in the Windows headers. Even when building Python, we + allow a single source file to override this - they may need access to + structures etc so it can optionally use new Windows features if it + determines at runtime they are available. +*/ +#if defined(Py_BUILD_CORE) || defined(Py_BUILD_CORE_BUILTIN) || defined(Py_BUILD_CORE_MODULE) +#ifndef NTDDI_VERSION +#define NTDDI_VERSION Py_NTDDI +#endif +#ifndef WINVER +#define WINVER Py_WINVER +#endif +#ifndef _WIN32_WINNT +#define _WIN32_WINNT Py_WINVER +#endif +#endif + +/* _W64 is not defined for VC6 or eVC4 */ +#ifndef _W64 +#define _W64 +#endif + +/* Define like size_t, omitting the "unsigned" */ +#ifdef MS_WIN64 +typedef __int64 ssize_t; +#else +typedef _W64 int ssize_t; +#endif +#define HAVE_SSIZE_T 1 + +#if defined(MS_WIN32) && !defined(MS_WIN64) +#if defined(_M_IX86) +#if defined(__INTEL_COMPILER) +#define COMPILER ("[ICC v." _Py_STRINGIZE(__INTEL_COMPILER) " 32 bit (Intel) with MSC v." _Py_STRINGIZE(_MSC_VER) " CRT]") +#else +#define COMPILER _Py_PASTE_VERSION("32 bit (Intel)") +#endif /* __INTEL_COMPILER */ +#define PYD_PLATFORM_TAG "win32" +#elif defined(_M_ARM) +#define COMPILER _Py_PASTE_VERSION("32 bit (ARM)") +#define PYD_PLATFORM_TAG "win_arm" +#else +#define COMPILER _Py_PASTE_VERSION("32 bit (Unknown)") +#endif +#endif /* MS_WIN32 && !MS_WIN64 */ + +typedef int pid_t; + +#include +#define Py_IS_NAN _isnan +#define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X)) +#define Py_IS_FINITE(X) _finite(X) +#define copysign _copysign + +/* VS 2010 and above already defines hypot as _hypot */ +#if _MSC_VER < 1600 +#define hypot _hypot +#endif + +/* VS 2015 defines these names with a leading underscore */ +#if _MSC_VER >= 1900 +#define timezone _timezone +#define daylight _daylight +#define tzname _tzname +#endif + +/* Side by Side assemblies supported in VS 2005 and VS 2008 but not 2010*/ +#if _MSC_VER >= 1400 && _MSC_VER < 1600 +#define HAVE_SXS 1 +#endif + +/* define some ANSI types that are not defined in earlier Win headers */ +#if _MSC_VER >= 1200 +/* This file only exists in VC 6.0 or higher */ +#include +#endif + +#endif /* _MSC_VER */ + +/* ------------------------------------------------------------------------*/ +/* egcs/gnu-win32 defines __GNUC__ and _WIN32 */ +#if defined(__GNUC__) && defined(_WIN32) +/* XXX These defines are likely incomplete, but should be easy to fix. + They should be complete enough to build extension modules. */ +/* Suggested by Rene Liebscher to avoid a GCC 2.91.* + bug that requires structure imports. More recent versions of the + compiler don't exhibit this bug. +*/ +#if (__GNUC__==2) && (__GNUC_MINOR__<=91) +#warning "Please use an up-to-date version of gcc! (>2.91 recommended)" +#endif + +#define COMPILER "[gcc]" +#define hypot _hypot +#define PY_LONG_LONG long long +#define PY_LLONG_MIN LLONG_MIN +#define PY_LLONG_MAX LLONG_MAX +#define PY_ULLONG_MAX ULLONG_MAX +#endif /* GNUC */ + +/* ------------------------------------------------------------------------*/ +/* lcc-win32 defines __LCC__ */ +#if defined(__LCC__) +/* XXX These defines are likely incomplete, but should be easy to fix. + They should be complete enough to build extension modules. */ + +#define COMPILER "[lcc-win32]" +typedef int pid_t; +/* __declspec() is supported here too - do nothing to get the defaults */ + +#endif /* LCC */ + +/* ------------------------------------------------------------------------*/ +/* End of compilers - finish up */ + +#ifndef NO_STDIO_H +# include +#endif + +/* 64 bit ints are usually spelt __int64 unless compiler has overridden */ +#ifndef PY_LONG_LONG +# define PY_LONG_LONG __int64 +# define PY_LLONG_MAX _I64_MAX +# define PY_LLONG_MIN _I64_MIN +# define PY_ULLONG_MAX _UI64_MAX +#endif + +/* For Windows the Python core is in a DLL by default. Test +Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ +#if !defined(MS_NO_COREDLL) && !defined(Py_NO_ENABLE_SHARED) +# define Py_ENABLE_SHARED 1 /* standard symbol for shared library */ +# define MS_COREDLL /* deprecated old symbol */ +#endif /* !MS_NO_COREDLL && ... */ + +/* All windows compilers that use this header support __declspec */ +#define HAVE_DECLSPEC_DLL + +/* For an MSVC DLL, we can nominate the .lib files used by extensions */ +#ifdef MS_COREDLL +# if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN) + /* not building the core - must be an ext */ +# if defined(_MSC_VER) + /* So MSVC users need not specify the .lib + file in their Makefile (other compilers are + generally taken care of by distutils.) */ +# if defined(_DEBUG) +# pragma comment(lib,"python37_d.lib") +# elif defined(Py_LIMITED_API) +# pragma comment(lib,"python3.lib") +# else +# pragma comment(lib,"python37.lib") +# endif /* _DEBUG */ +# endif /* _MSC_VER */ +# endif /* Py_BUILD_CORE */ +#endif /* MS_COREDLL */ + +#if defined(MS_WIN64) +/* maintain "win32" sys.platform for backward compatibility of Python code, + the Win64 API should be close enough to the Win32 API to make this + preferable */ +# define PLATFORM "win32" +# define SIZEOF_VOID_P 8 +# define SIZEOF_TIME_T 8 +# define SIZEOF_OFF_T 4 +# define SIZEOF_FPOS_T 8 +# define SIZEOF_HKEY 8 +# define SIZEOF_SIZE_T 8 +/* configure.ac defines HAVE_LARGEFILE_SUPPORT iff HAVE_LONG_LONG, + sizeof(off_t) > sizeof(long), and sizeof(PY_LONG_LONG) >= sizeof(off_t). + On Win64 the second condition is not true, but if fpos_t replaces off_t + then this is true. The uses of HAVE_LARGEFILE_SUPPORT imply that Win64 + should define this. */ +# define HAVE_LARGEFILE_SUPPORT +#elif defined(MS_WIN32) +# define PLATFORM "win32" +# define HAVE_LARGEFILE_SUPPORT +# define SIZEOF_VOID_P 4 +# define SIZEOF_OFF_T 4 +# define SIZEOF_FPOS_T 8 +# define SIZEOF_HKEY 4 +# define SIZEOF_SIZE_T 4 + /* MS VS2005 changes time_t to a 64-bit type on all platforms */ +# if defined(_MSC_VER) && _MSC_VER >= 1400 +# define SIZEOF_TIME_T 8 +# else +# define SIZEOF_TIME_T 4 +# endif +#endif + +#ifdef _DEBUG +# define Py_DEBUG +#endif + + +#ifdef MS_WIN32 + +#define SIZEOF_SHORT 2 +#define SIZEOF_INT 4 +#define SIZEOF_LONG 4 +#define SIZEOF_LONG_LONG 8 +#define SIZEOF_DOUBLE 8 +#define SIZEOF_FLOAT 4 + +/* VC 7.1 has them and VC 6.0 does not. VC 6.0 has a version number of 1200. + Microsoft eMbedded Visual C++ 4.0 has a version number of 1201 and doesn't + define these. + If some compiler does not provide them, modify the #if appropriately. */ +#if defined(_MSC_VER) +#if _MSC_VER > 1300 +#define HAVE_UINTPTR_T 1 +#define HAVE_INTPTR_T 1 +#else +/* VC6, VS 2002 and eVC4 don't support the C99 LL suffix for 64-bit integer literals */ +#define Py_LL(x) x##I64 +#endif /* _MSC_VER > 1300 */ +#endif /* _MSC_VER */ + +#endif + +/* define signed and unsigned exact-width 32-bit and 64-bit types, used in the + implementation of Python integers. */ +#define PY_UINT32_T uint32_t +#define PY_UINT64_T uint64_t +#define PY_INT32_T int32_t +#define PY_INT64_T int64_t + +/* Fairly standard from here! */ + +/* Define to 1 if you have the `copysign' function. */ +#define HAVE_COPYSIGN 1 + +/* Define to 1 if you have the `round' function. */ +#if _MSC_VER >= 1800 +#define HAVE_ROUND 1 +#endif + +/* Define to 1 if you have the `isinf' macro. */ +#define HAVE_DECL_ISINF 1 + +/* Define to 1 if you have the `isnan' function. */ +#define HAVE_DECL_ISNAN 1 + +/* Define if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* #undef _ALL_SOURCE */ +#endif + +/* Define to empty if the keyword does not work. */ +/* #define const */ + +/* Define to 1 if you have the header file. */ +#define HAVE_CONIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DIRECT_H 1 + +/* Define if you have dirent.h. */ +/* #define DIRENT 1 */ + +/* Define to the type of elements in the array set by `getgroups'. + Usually this is either `int' or `gid_t'. */ +/* #undef GETGROUPS_T */ + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define if your struct tm has tm_zone. */ +/* #undef HAVE_TM_ZONE */ + +/* Define if you don't have tm_zone but do have the external array + tzname. */ +#define HAVE_TZNAME + +/* Define to `int' if doesn't define. */ +/* #undef mode_t */ + +/* Define if you don't have dirent.h, but have ndir.h. */ +/* #undef NDIR */ + +/* Define to `long' if doesn't define. */ +/* #undef off_t */ + +/* Define to `int' if doesn't define. */ +/* #undef pid_t */ + +/* Define if the system does not provide POSIX.1 features except + with this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define if you need to in order for stat and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define as the return type of signal handlers (int or void). */ +#define RETSIGTYPE void + +/* Define to `unsigned' if doesn't define. */ +/* #undef size_t */ + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if you don't have dirent.h, but have sys/dir.h. */ +/* #undef SYSDIR */ + +/* Define if you don't have dirent.h, but have sys/ndir.h. */ +/* #undef SYSNDIR */ + +/* Define if you can safely include both and . */ +/* #undef TIME_WITH_SYS_TIME */ + +/* Define if your declares struct tm. */ +/* #define TM_IN_SYS_TIME 1 */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ + +/* Define if the closedir function returns void instead of int. */ +/* #undef VOID_CLOSEDIR */ + +/* Define if getpgrp() must be called as getpgrp(0) + and (consequently) setpgrp() as setpgrp(0, 0). */ +/* #undef GETPGRP_HAVE_ARGS */ + +/* Define this if your time.h defines altzone */ +/* #define HAVE_ALTZONE */ + +/* Define if you have the putenv function. */ +#define HAVE_PUTENV + +/* Define if your compiler supports function prototypes */ +#define HAVE_PROTOTYPES + +/* Define if you can safely include both and + (which you can't on SCO ODT 3.0). */ +/* #undef SYS_SELECT_WITH_SYS_TIME */ + +/* Define if you want documentation strings in extension modules */ +#define WITH_DOC_STRINGS 1 + +/* Define if you want to compile in rudimentary thread support */ +/* #undef WITH_THREAD */ + +/* Define if you want to use the GNU readline library */ +/* #define WITH_READLINE 1 */ + +/* Use Python's own small-block memory-allocator. */ +#define WITH_PYMALLOC 1 + +/* Define if you have clock. */ +/* #define HAVE_CLOCK */ + +/* Define when any dynamic module loading is enabled */ +#define HAVE_DYNAMIC_LOADING + +/* Define if you have ftime. */ +#define HAVE_FTIME + +/* Define if you have getpeername. */ +#define HAVE_GETPEERNAME + +/* Define if you have getpgrp. */ +/* #undef HAVE_GETPGRP */ + +/* Define if you have getpid. */ +#define HAVE_GETPID + +/* Define if you have gettimeofday. */ +/* #undef HAVE_GETTIMEOFDAY */ + +/* Define if you have getwd. */ +/* #undef HAVE_GETWD */ + +/* Define if you have lstat. */ +/* #undef HAVE_LSTAT */ + +/* Define if you have the mktime function. */ +#define HAVE_MKTIME + +/* Define if you have nice. */ +/* #undef HAVE_NICE */ + +/* Define if you have readlink. */ +/* #undef HAVE_READLINK */ + +/* Define if you have setpgid. */ +/* #undef HAVE_SETPGID */ + +/* Define if you have setpgrp. */ +/* #undef HAVE_SETPGRP */ + +/* Define if you have setsid. */ +/* #undef HAVE_SETSID */ + +/* Define if you have setvbuf. */ +#define HAVE_SETVBUF + +/* Define if you have siginterrupt. */ +/* #undef HAVE_SIGINTERRUPT */ + +/* Define if you have symlink. */ +/* #undef HAVE_SYMLINK */ + +/* Define if you have tcgetpgrp. */ +/* #undef HAVE_TCGETPGRP */ + +/* Define if you have tcsetpgrp. */ +/* #undef HAVE_TCSETPGRP */ + +/* Define if you have times. */ +/* #undef HAVE_TIMES */ + +/* Define if you have uname. */ +/* #undef HAVE_UNAME */ + +/* Define if you have waitpid. */ +/* #undef HAVE_WAITPID */ + +/* Define to 1 if you have the `wcsftime' function. */ +#if defined(_MSC_VER) && _MSC_VER >= 1310 +#define HAVE_WCSFTIME 1 +#endif + +/* Define to 1 if you have the `wcscoll' function. */ +#define HAVE_WCSCOLL 1 + +/* Define to 1 if you have the `wcsxfrm' function. */ +#define HAVE_WCSXFRM 1 + +/* Define if the zlib library has inflateCopy */ +#define HAVE_ZLIB_COPY 1 + +/* Define if you have the header file. */ +/* #undef HAVE_DLFCN_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PROCESS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define if you have the prototypes. */ +#define HAVE_STDARG_PROTOTYPES + +/* Define if you have the header file. */ +#define HAVE_STDDEF_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_AUDIOIO_H */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_PARAM_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_SELECT_H 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define if you have the header file. */ +/* #define HAVE_SYS_TIME_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_TIMES_H 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UN_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UTIME_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UTSNAME_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_UNISTD_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_UTIME_H 1 */ + +/* Define if the compiler provides a wchar.h header file. */ +#define HAVE_WCHAR_H 1 + +/* The size of `wchar_t', as computed by sizeof. */ +#define SIZEOF_WCHAR_T 2 + +/* The size of `_Bool', as computed by sizeof. */ +#define SIZEOF__BOOL 1 + +/* The size of `pid_t', as computed by sizeof. */ +#define SIZEOF_PID_T SIZEOF_INT + +/* Define if you have the dl library (-ldl). */ +/* #undef HAVE_LIBDL */ + +/* Define if you have the mpc library (-lmpc). */ +/* #undef HAVE_LIBMPC */ + +/* Define if you have the nsl library (-lnsl). */ +#define HAVE_LIBNSL 1 + +/* Define if you have the seq library (-lseq). */ +/* #undef HAVE_LIBSEQ */ + +/* Define if you have the socket library (-lsocket). */ +#define HAVE_LIBSOCKET 1 + +/* Define if you have the sun library (-lsun). */ +/* #undef HAVE_LIBSUN */ + +/* Define if you have the termcap library (-ltermcap). */ +/* #undef HAVE_LIBTERMCAP */ + +/* Define if you have the termlib library (-ltermlib). */ +/* #undef HAVE_LIBTERMLIB */ + +/* Define if you have the thread library (-lthread). */ +/* #undef HAVE_LIBTHREAD */ + +/* WinSock does not use a bitmask in select, and uses + socket handles greater than FD_SETSIZE */ +#define Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE + +/* Define if C doubles are 64-bit IEEE 754 binary format, stored with the + least significant byte first */ +#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 1 + +/* Define to 1 if you have the `erf' function. */ +#define HAVE_ERF 1 + +/* Define to 1 if you have the `erfc' function. */ +#define HAVE_ERFC 1 + +/* Define if you have the 'inet_pton' function. */ +#define HAVE_INET_PTON 1 + +/* framework name */ +#define _PYTHONFRAMEWORK "" + +/* Define if libssl has X509_VERIFY_PARAM_set1_host and related function */ +#define HAVE_X509_VERIFY_PARAM_SET1_HOST 1 + +#endif /* !Py_CONFIG_H */ diff --git a/venv/Include/pyctype.h b/venv/Include/pyctype.h new file mode 100644 index 00000000..6bce63ee --- /dev/null +++ b/venv/Include/pyctype.h @@ -0,0 +1,33 @@ +#ifndef Py_LIMITED_API +#ifndef PYCTYPE_H +#define PYCTYPE_H + +#define PY_CTF_LOWER 0x01 +#define PY_CTF_UPPER 0x02 +#define PY_CTF_ALPHA (PY_CTF_LOWER|PY_CTF_UPPER) +#define PY_CTF_DIGIT 0x04 +#define PY_CTF_ALNUM (PY_CTF_ALPHA|PY_CTF_DIGIT) +#define PY_CTF_SPACE 0x08 +#define PY_CTF_XDIGIT 0x10 + +PyAPI_DATA(const unsigned int) _Py_ctype_table[256]; + +/* Unlike their C counterparts, the following macros are not meant to + * handle an int with any of the values [EOF, 0-UCHAR_MAX]. The argument + * must be a signed/unsigned char. */ +#define Py_ISLOWER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_LOWER) +#define Py_ISUPPER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_UPPER) +#define Py_ISALPHA(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALPHA) +#define Py_ISDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_DIGIT) +#define Py_ISXDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_XDIGIT) +#define Py_ISALNUM(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALNUM) +#define Py_ISSPACE(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_SPACE) + +PyAPI_DATA(const unsigned char) _Py_ctype_tolower[256]; +PyAPI_DATA(const unsigned char) _Py_ctype_toupper[256]; + +#define Py_TOLOWER(c) (_Py_ctype_tolower[Py_CHARMASK(c)]) +#define Py_TOUPPER(c) (_Py_ctype_toupper[Py_CHARMASK(c)]) + +#endif /* !PYCTYPE_H */ +#endif /* !Py_LIMITED_API */ diff --git a/venv/Include/pydebug.h b/venv/Include/pydebug.h new file mode 100644 index 00000000..bd4aafe3 --- /dev/null +++ b/venv/Include/pydebug.h @@ -0,0 +1,40 @@ +#ifndef Py_LIMITED_API +#ifndef Py_PYDEBUG_H +#define Py_PYDEBUG_H +#ifdef __cplusplus +extern "C" { +#endif + +/* These global variable are defined in pylifecycle.c */ +/* XXX (ncoghlan): move these declarations to pylifecycle.h? */ +PyAPI_DATA(int) Py_DebugFlag; +PyAPI_DATA(int) Py_VerboseFlag; +PyAPI_DATA(int) Py_QuietFlag; +PyAPI_DATA(int) Py_InteractiveFlag; +PyAPI_DATA(int) Py_InspectFlag; +PyAPI_DATA(int) Py_OptimizeFlag; +PyAPI_DATA(int) Py_NoSiteFlag; +PyAPI_DATA(int) Py_BytesWarningFlag; +PyAPI_DATA(int) Py_FrozenFlag; +PyAPI_DATA(int) Py_IgnoreEnvironmentFlag; +PyAPI_DATA(int) Py_DontWriteBytecodeFlag; +PyAPI_DATA(int) Py_NoUserSiteDirectory; +PyAPI_DATA(int) Py_UnbufferedStdioFlag; +PyAPI_DATA(int) Py_HashRandomizationFlag; +PyAPI_DATA(int) Py_IsolatedFlag; + +#ifdef MS_WINDOWS +PyAPI_DATA(int) Py_LegacyWindowsFSEncodingFlag; +PyAPI_DATA(int) Py_LegacyWindowsStdioFlag; +#endif + +/* this is a wrapper around getenv() that pays attention to + Py_IgnoreEnvironmentFlag. It should be used for getting variables like + PYTHONPATH and PYTHONHOME from the environment */ +#define Py_GETENV(s) (Py_IgnoreEnvironmentFlag ? NULL : getenv(s)) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYDEBUG_H */ +#endif /* Py_LIMITED_API */ diff --git a/venv/Include/pydtrace.h b/venv/Include/pydtrace.h new file mode 100644 index 00000000..037961d4 --- /dev/null +++ b/venv/Include/pydtrace.h @@ -0,0 +1,57 @@ +/* Static DTrace probes interface */ + +#ifndef Py_DTRACE_H +#define Py_DTRACE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef WITH_DTRACE + +#include "pydtrace_probes.h" + +/* pydtrace_probes.h, on systems with DTrace, is auto-generated to include + `PyDTrace_{PROBE}` and `PyDTrace_{PROBE}_ENABLED()` macros for every probe + defined in pydtrace_provider.d. + + Calling these functions must be guarded by a `PyDTrace_{PROBE}_ENABLED()` + check to minimize performance impact when probing is off. For example: + + if (PyDTrace_FUNCTION_ENTRY_ENABLED()) + PyDTrace_FUNCTION_ENTRY(f); +*/ + +#else + +/* Without DTrace, compile to nothing. */ + +static inline void PyDTrace_LINE(const char *arg0, const char *arg1, int arg2) {} +static inline void PyDTrace_FUNCTION_ENTRY(const char *arg0, const char *arg1, int arg2) {} +static inline void PyDTrace_FUNCTION_RETURN(const char *arg0, const char *arg1, int arg2) {} +static inline void PyDTrace_GC_START(int arg0) {} +static inline void PyDTrace_GC_DONE(int arg0) {} +static inline void PyDTrace_INSTANCE_NEW_START(int arg0) {} +static inline void PyDTrace_INSTANCE_NEW_DONE(int arg0) {} +static inline void PyDTrace_INSTANCE_DELETE_START(int arg0) {} +static inline void PyDTrace_INSTANCE_DELETE_DONE(int arg0) {} +static inline void PyDTrace_IMPORT_FIND_LOAD_START(const char *arg0) {} +static inline void PyDTrace_IMPORT_FIND_LOAD_DONE(const char *arg0, int arg1) {} + +static inline int PyDTrace_LINE_ENABLED(void) { return 0; } +static inline int PyDTrace_FUNCTION_ENTRY_ENABLED(void) { return 0; } +static inline int PyDTrace_FUNCTION_RETURN_ENABLED(void) { return 0; } +static inline int PyDTrace_GC_START_ENABLED(void) { return 0; } +static inline int PyDTrace_GC_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_NEW_START_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_NEW_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_DELETE_START_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_DELETE_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_IMPORT_FIND_LOAD_START_ENABLED(void) { return 0; } +static inline int PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED(void) { return 0; } + +#endif /* !WITH_DTRACE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_DTRACE_H */ diff --git a/venv/Include/pyerrors.h b/venv/Include/pyerrors.h new file mode 100644 index 00000000..f289471b --- /dev/null +++ b/venv/Include/pyerrors.h @@ -0,0 +1,504 @@ +#ifndef Py_ERRORS_H +#define Py_ERRORS_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Error objects */ + +#ifndef Py_LIMITED_API +/* PyException_HEAD defines the initial segment of every exception class. */ +#define PyException_HEAD PyObject_HEAD PyObject *dict;\ + PyObject *args; PyObject *traceback;\ + PyObject *context; PyObject *cause;\ + char suppress_context; + +typedef struct { + PyException_HEAD +} PyBaseExceptionObject; + +typedef struct { + PyException_HEAD + PyObject *msg; + PyObject *filename; + PyObject *lineno; + PyObject *offset; + PyObject *text; + PyObject *print_file_and_line; +} PySyntaxErrorObject; + +typedef struct { + PyException_HEAD + PyObject *msg; + PyObject *name; + PyObject *path; +} PyImportErrorObject; + +typedef struct { + PyException_HEAD + PyObject *encoding; + PyObject *object; + Py_ssize_t start; + Py_ssize_t end; + PyObject *reason; +} PyUnicodeErrorObject; + +typedef struct { + PyException_HEAD + PyObject *code; +} PySystemExitObject; + +typedef struct { + PyException_HEAD + PyObject *myerrno; + PyObject *strerror; + PyObject *filename; + PyObject *filename2; +#ifdef MS_WINDOWS + PyObject *winerror; +#endif + Py_ssize_t written; /* only for BlockingIOError, -1 otherwise */ +} PyOSErrorObject; + +typedef struct { + PyException_HEAD + PyObject *value; +} PyStopIterationObject; + +/* Compatibility typedefs */ +typedef PyOSErrorObject PyEnvironmentErrorObject; +#ifdef MS_WINDOWS +typedef PyOSErrorObject PyWindowsErrorObject; +#endif +#endif /* !Py_LIMITED_API */ + +/* Error handling definitions */ + +PyAPI_FUNC(void) PyErr_SetNone(PyObject *); +PyAPI_FUNC(void) PyErr_SetObject(PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyErr_SetKeyError(PyObject *); +_PyErr_StackItem *_PyErr_GetTopmostException(PyThreadState *tstate); +#endif +PyAPI_FUNC(void) PyErr_SetString( + PyObject *exception, + const char *string /* decoded from utf-8 */ + ); +PyAPI_FUNC(PyObject *) PyErr_Occurred(void); +PyAPI_FUNC(void) PyErr_Clear(void); +PyAPI_FUNC(void) PyErr_Fetch(PyObject **, PyObject **, PyObject **); +PyAPI_FUNC(void) PyErr_Restore(PyObject *, PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(void) PyErr_GetExcInfo(PyObject **, PyObject **, PyObject **); +PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *); +#endif + +#if defined(__clang__) || \ + (defined(__GNUC_MAJOR__) && \ + ((__GNUC_MAJOR__ >= 3) || \ + (__GNUC_MAJOR__ == 2) && (__GNUC_MINOR__ >= 5))) +#define _Py_NO_RETURN __attribute__((__noreturn__)) +#else +#define _Py_NO_RETURN +#endif + +/* Defined in Python/pylifecycle.c */ +PyAPI_FUNC(void) Py_FatalError(const char *message) _Py_NO_RETURN; + +#if defined(Py_DEBUG) || defined(Py_LIMITED_API) +#define _PyErr_OCCURRED() PyErr_Occurred() +#else +#define _PyErr_OCCURRED() (PyThreadState_GET()->curexc_type) +#endif + +/* Error testing and normalization */ +PyAPI_FUNC(int) PyErr_GivenExceptionMatches(PyObject *, PyObject *); +PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *); +PyAPI_FUNC(void) PyErr_NormalizeException(PyObject**, PyObject**, PyObject**); + +/* Traceback manipulation (PEP 3134) */ +PyAPI_FUNC(int) PyException_SetTraceback(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyException_GetTraceback(PyObject *); + +/* Cause manipulation (PEP 3134) */ +PyAPI_FUNC(PyObject *) PyException_GetCause(PyObject *); +PyAPI_FUNC(void) PyException_SetCause(PyObject *, PyObject *); + +/* Context manipulation (PEP 3134) */ +PyAPI_FUNC(PyObject *) PyException_GetContext(PyObject *); +PyAPI_FUNC(void) PyException_SetContext(PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *); +#endif + +/* */ + +#define PyExceptionClass_Check(x) \ + (PyType_Check((x)) && \ + PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS)) + +#define PyExceptionInstance_Check(x) \ + PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS) + +#define PyExceptionClass_Name(x) \ + ((char *)(((PyTypeObject*)(x))->tp_name)) + +#define PyExceptionInstance_Class(x) ((PyObject*)((x)->ob_type)) + + +/* Predefined exceptions */ + +PyAPI_DATA(PyObject *) PyExc_BaseException; +PyAPI_DATA(PyObject *) PyExc_Exception; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_DATA(PyObject *) PyExc_StopAsyncIteration; +#endif +PyAPI_DATA(PyObject *) PyExc_StopIteration; +PyAPI_DATA(PyObject *) PyExc_GeneratorExit; +PyAPI_DATA(PyObject *) PyExc_ArithmeticError; +PyAPI_DATA(PyObject *) PyExc_LookupError; + +PyAPI_DATA(PyObject *) PyExc_AssertionError; +PyAPI_DATA(PyObject *) PyExc_AttributeError; +PyAPI_DATA(PyObject *) PyExc_BufferError; +PyAPI_DATA(PyObject *) PyExc_EOFError; +PyAPI_DATA(PyObject *) PyExc_FloatingPointError; +PyAPI_DATA(PyObject *) PyExc_OSError; +PyAPI_DATA(PyObject *) PyExc_ImportError; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_DATA(PyObject *) PyExc_ModuleNotFoundError; +#endif +PyAPI_DATA(PyObject *) PyExc_IndexError; +PyAPI_DATA(PyObject *) PyExc_KeyError; +PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt; +PyAPI_DATA(PyObject *) PyExc_MemoryError; +PyAPI_DATA(PyObject *) PyExc_NameError; +PyAPI_DATA(PyObject *) PyExc_OverflowError; +PyAPI_DATA(PyObject *) PyExc_RuntimeError; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_DATA(PyObject *) PyExc_RecursionError; +#endif +PyAPI_DATA(PyObject *) PyExc_NotImplementedError; +PyAPI_DATA(PyObject *) PyExc_SyntaxError; +PyAPI_DATA(PyObject *) PyExc_IndentationError; +PyAPI_DATA(PyObject *) PyExc_TabError; +PyAPI_DATA(PyObject *) PyExc_ReferenceError; +PyAPI_DATA(PyObject *) PyExc_SystemError; +PyAPI_DATA(PyObject *) PyExc_SystemExit; +PyAPI_DATA(PyObject *) PyExc_TypeError; +PyAPI_DATA(PyObject *) PyExc_UnboundLocalError; +PyAPI_DATA(PyObject *) PyExc_UnicodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeEncodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeDecodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError; +PyAPI_DATA(PyObject *) PyExc_ValueError; +PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError; + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_DATA(PyObject *) PyExc_BlockingIOError; +PyAPI_DATA(PyObject *) PyExc_BrokenPipeError; +PyAPI_DATA(PyObject *) PyExc_ChildProcessError; +PyAPI_DATA(PyObject *) PyExc_ConnectionError; +PyAPI_DATA(PyObject *) PyExc_ConnectionAbortedError; +PyAPI_DATA(PyObject *) PyExc_ConnectionRefusedError; +PyAPI_DATA(PyObject *) PyExc_ConnectionResetError; +PyAPI_DATA(PyObject *) PyExc_FileExistsError; +PyAPI_DATA(PyObject *) PyExc_FileNotFoundError; +PyAPI_DATA(PyObject *) PyExc_InterruptedError; +PyAPI_DATA(PyObject *) PyExc_IsADirectoryError; +PyAPI_DATA(PyObject *) PyExc_NotADirectoryError; +PyAPI_DATA(PyObject *) PyExc_PermissionError; +PyAPI_DATA(PyObject *) PyExc_ProcessLookupError; +PyAPI_DATA(PyObject *) PyExc_TimeoutError; +#endif + + +/* Compatibility aliases */ +PyAPI_DATA(PyObject *) PyExc_EnvironmentError; +PyAPI_DATA(PyObject *) PyExc_IOError; +#ifdef MS_WINDOWS +PyAPI_DATA(PyObject *) PyExc_WindowsError; +#endif + +/* Predefined warning categories */ +PyAPI_DATA(PyObject *) PyExc_Warning; +PyAPI_DATA(PyObject *) PyExc_UserWarning; +PyAPI_DATA(PyObject *) PyExc_DeprecationWarning; +PyAPI_DATA(PyObject *) PyExc_PendingDeprecationWarning; +PyAPI_DATA(PyObject *) PyExc_SyntaxWarning; +PyAPI_DATA(PyObject *) PyExc_RuntimeWarning; +PyAPI_DATA(PyObject *) PyExc_FutureWarning; +PyAPI_DATA(PyObject *) PyExc_ImportWarning; +PyAPI_DATA(PyObject *) PyExc_UnicodeWarning; +PyAPI_DATA(PyObject *) PyExc_BytesWarning; +PyAPI_DATA(PyObject *) PyExc_ResourceWarning; + + +/* Convenience functions */ + +PyAPI_FUNC(int) PyErr_BadArgument(void); +PyAPI_FUNC(PyObject *) PyErr_NoMemory(void); +PyAPI_FUNC(PyObject *) PyErr_SetFromErrno(PyObject *); +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObject( + PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObjects( + PyObject *, PyObject *, PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilename( + PyObject *exc, + const char *filename /* decoded from the filesystem encoding */ + ); +#if defined(MS_WINDOWS) && !defined(Py_LIMITED_API) +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithUnicodeFilename( + PyObject *, const Py_UNICODE *) Py_DEPRECATED(3.3); +#endif /* MS_WINDOWS */ + +PyAPI_FUNC(PyObject *) PyErr_Format( + PyObject *exception, + const char *format, /* ASCII-encoded string */ + ... + ); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(PyObject *) PyErr_FormatV( + PyObject *exception, + const char *format, + va_list vargs); +#endif + +#ifndef Py_LIMITED_API +/* Like PyErr_Format(), but saves current exception as __context__ and + __cause__. + */ +PyAPI_FUNC(PyObject *) _PyErr_FormatFromCause( + PyObject *exception, + const char *format, /* ASCII-encoded string */ + ... + ); +#endif + +#ifdef MS_WINDOWS +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename( + int ierr, + const char *filename /* decoded from the filesystem encoding */ + ); +#ifndef Py_LIMITED_API +/* XXX redeclare to use WSTRING */ +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithUnicodeFilename( + int, const Py_UNICODE *) Py_DEPRECATED(3.3); +#endif +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErr(int); +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObject( + PyObject *,int, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObjects( + PyObject *,int, PyObject *, PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilename( + PyObject *exc, + int ierr, + const char *filename /* decoded from the filesystem encoding */ + ); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithUnicodeFilename( + PyObject *,int, const Py_UNICODE *) Py_DEPRECATED(3.3); +#endif +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int); +#endif /* MS_WINDOWS */ + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_FUNC(PyObject *) PyErr_SetImportErrorSubclass(PyObject *, PyObject *, + PyObject *, PyObject *); +#endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyErr_SetImportError(PyObject *, PyObject *, + PyObject *); +#endif + +/* Export the old function so that the existing API remains available: */ +PyAPI_FUNC(void) PyErr_BadInternalCall(void); +PyAPI_FUNC(void) _PyErr_BadInternalCall(const char *filename, int lineno); +/* Mask the old API with a call to the new API for code compiled under + Python 2.0: */ +#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) + +/* Function to create a new exception */ +PyAPI_FUNC(PyObject *) PyErr_NewException( + const char *name, PyObject *base, PyObject *dict); +PyAPI_FUNC(PyObject *) PyErr_NewExceptionWithDoc( + const char *name, const char *doc, PyObject *base, PyObject *dict); +PyAPI_FUNC(void) PyErr_WriteUnraisable(PyObject *); + +/* In exceptions.c */ +#ifndef Py_LIMITED_API +/* Helper that attempts to replace the current exception with one of the + * same type but with a prefix added to the exception text. The resulting + * exception description looks like: + * + * prefix (exc_type: original_exc_str) + * + * Only some exceptions can be safely replaced. If the function determines + * it isn't safe to perform the replacement, it will leave the original + * unmodified exception in place. + * + * Returns a borrowed reference to the new exception (if any), NULL if the + * existing exception was left in place. + */ +PyAPI_FUNC(PyObject *) _PyErr_TrySetFromCause( + const char *prefix_format, /* ASCII-encoded string */ + ... + ); +#endif + + +/* In signalmodule.c */ +PyAPI_FUNC(int) PyErr_CheckSignals(void); +PyAPI_FUNC(void) PyErr_SetInterrupt(void); + +/* In signalmodule.c */ +#ifndef Py_LIMITED_API +int PySignal_SetWakeupFd(int fd); +#endif + +/* Support for adding program text to SyntaxErrors */ +PyAPI_FUNC(void) PyErr_SyntaxLocation( + const char *filename, /* decoded from the filesystem encoding */ + int lineno); +PyAPI_FUNC(void) PyErr_SyntaxLocationEx( + const char *filename, /* decoded from the filesystem encoding */ + int lineno, + int col_offset); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyErr_SyntaxLocationObject( + PyObject *filename, + int lineno, + int col_offset); +#endif +PyAPI_FUNC(PyObject *) PyErr_ProgramText( + const char *filename, /* decoded from the filesystem encoding */ + int lineno); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyErr_ProgramTextObject( + PyObject *filename, + int lineno); +#endif + +/* The following functions are used to create and modify unicode + exceptions from C */ + +/* create a UnicodeDecodeError object */ +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_Create( + const char *encoding, /* UTF-8 encoded string */ + const char *object, + Py_ssize_t length, + Py_ssize_t start, + Py_ssize_t end, + const char *reason /* UTF-8 encoded string */ + ); + +/* create a UnicodeEncodeError object */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_Create( + const char *encoding, /* UTF-8 encoded string */ + const Py_UNICODE *object, + Py_ssize_t length, + Py_ssize_t start, + Py_ssize_t end, + const char *reason /* UTF-8 encoded string */ + ) Py_DEPRECATED(3.3); +#endif + +/* create a UnicodeTranslateError object */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_Create( + const Py_UNICODE *object, + Py_ssize_t length, + Py_ssize_t start, + Py_ssize_t end, + const char *reason /* UTF-8 encoded string */ + ) Py_DEPRECATED(3.3); +PyAPI_FUNC(PyObject *) _PyUnicodeTranslateError_Create( + PyObject *object, + Py_ssize_t start, + Py_ssize_t end, + const char *reason /* UTF-8 encoded string */ + ); +#endif + +/* get the encoding attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetEncoding(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetEncoding(PyObject *); + +/* get the object attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetObject(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetObject(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetObject(PyObject *); + +/* get the value of the start attribute (the int * may not be NULL) + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_GetStart(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeDecodeError_GetStart(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeTranslateError_GetStart(PyObject *, Py_ssize_t *); + +/* assign a new value to the start attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetStart(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetStart(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetStart(PyObject *, Py_ssize_t); + +/* get the value of the end attribute (the int *may not be NULL) + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_GetEnd(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeDecodeError_GetEnd(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeTranslateError_GetEnd(PyObject *, Py_ssize_t *); + +/* assign a new value to the end attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetEnd(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetEnd(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetEnd(PyObject *, Py_ssize_t); + +/* get the value of the reason attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetReason(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetReason(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetReason(PyObject *); + +/* assign a new value to the reason attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetReason( + PyObject *exc, + const char *reason /* UTF-8 encoded string */ + ); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetReason( + PyObject *exc, + const char *reason /* UTF-8 encoded string */ + ); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason( + PyObject *exc, + const char *reason /* UTF-8 encoded string */ + ); + +/* These APIs aren't really part of the error implementation, but + often needed to format error messages; the native C lib APIs are + not available on all platforms, which is why we provide emulations + for those platforms in Python/mysnprintf.c, + WARNING: The return value of snprintf varies across platforms; do + not rely on any particular behavior; eventually the C99 defn may + be reliable. +*/ +#if defined(MS_WIN32) && !defined(HAVE_SNPRINTF) +# define HAVE_SNPRINTF +# define snprintf _snprintf +# define vsnprintf _vsnprintf +#endif + +#include +PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 3, 4))); +PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) + Py_GCC_ATTRIBUTE((format(printf, 3, 0))); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ERRORS_H */ diff --git a/venv/Include/pyexpat.h b/venv/Include/pyexpat.h new file mode 100644 index 00000000..44259bf6 --- /dev/null +++ b/venv/Include/pyexpat.h @@ -0,0 +1,53 @@ +/* Stuff to export relevant 'expat' entry points from pyexpat to other + * parser modules, such as cElementTree. */ + +/* note: you must import expat.h before importing this module! */ + +#define PyExpat_CAPI_MAGIC "pyexpat.expat_CAPI 1.0" +#define PyExpat_CAPSULE_NAME "pyexpat.expat_CAPI" + +struct PyExpat_CAPI +{ + char* magic; /* set to PyExpat_CAPI_MAGIC */ + int size; /* set to sizeof(struct PyExpat_CAPI) */ + int MAJOR_VERSION; + int MINOR_VERSION; + int MICRO_VERSION; + /* pointers to selected expat functions. add new functions at + the end, if needed */ + const XML_LChar * (*ErrorString)(enum XML_Error code); + enum XML_Error (*GetErrorCode)(XML_Parser parser); + XML_Size (*GetErrorColumnNumber)(XML_Parser parser); + XML_Size (*GetErrorLineNumber)(XML_Parser parser); + enum XML_Status (*Parse)( + XML_Parser parser, const char *s, int len, int isFinal); + XML_Parser (*ParserCreate_MM)( + const XML_Char *encoding, const XML_Memory_Handling_Suite *memsuite, + const XML_Char *namespaceSeparator); + void (*ParserFree)(XML_Parser parser); + void (*SetCharacterDataHandler)( + XML_Parser parser, XML_CharacterDataHandler handler); + void (*SetCommentHandler)( + XML_Parser parser, XML_CommentHandler handler); + void (*SetDefaultHandlerExpand)( + XML_Parser parser, XML_DefaultHandler handler); + void (*SetElementHandler)( + XML_Parser parser, XML_StartElementHandler start, + XML_EndElementHandler end); + void (*SetNamespaceDeclHandler)( + XML_Parser parser, XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end); + void (*SetProcessingInstructionHandler)( + XML_Parser parser, XML_ProcessingInstructionHandler handler); + void (*SetUnknownEncodingHandler)( + XML_Parser parser, XML_UnknownEncodingHandler handler, + void *encodingHandlerData); + void (*SetUserData)(XML_Parser parser, void *userData); + void (*SetStartDoctypeDeclHandler)(XML_Parser parser, + XML_StartDoctypeDeclHandler start); + enum XML_Status (*SetEncoding)(XML_Parser parser, const XML_Char *encoding); + int (*DefaultUnknownEncodingHandler)( + void *encodingHandlerData, const XML_Char *name, XML_Encoding *info); + /* always add new stuff to the end! */ +}; + diff --git a/venv/Include/pyfpe.h b/venv/Include/pyfpe.h new file mode 100644 index 00000000..5a99e397 --- /dev/null +++ b/venv/Include/pyfpe.h @@ -0,0 +1,12 @@ +#ifndef Py_PYFPE_H +#define Py_PYFPE_H + +/* These macros used to do something when Python was built with --with-fpectl, + * but support for that was dropped in 3.7. We continue to define them though, + * to avoid breaking API users. + */ + +#define PyFPE_START_PROTECT(err_string, leave_stmt) +#define PyFPE_END_PROTECT(v) + +#endif /* !Py_PYFPE_H */ diff --git a/venv/Include/pyhash.h b/venv/Include/pyhash.h new file mode 100644 index 00000000..9cfd071e --- /dev/null +++ b/venv/Include/pyhash.h @@ -0,0 +1,145 @@ +#ifndef Py_HASH_H + +#define Py_HASH_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Helpers for hash functions */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_hash_t) _Py_HashDouble(double); +PyAPI_FUNC(Py_hash_t) _Py_HashPointer(void*); +PyAPI_FUNC(Py_hash_t) _Py_HashBytes(const void*, Py_ssize_t); +#endif + +/* Prime multiplier used in string and various other hashes. */ +#define _PyHASH_MULTIPLIER 1000003UL /* 0xf4243 */ + +/* Parameters used for the numeric hash implementation. See notes for + _Py_HashDouble in Python/pyhash.c. Numeric hashes are based on + reduction modulo the prime 2**_PyHASH_BITS - 1. */ + +#if SIZEOF_VOID_P >= 8 +# define _PyHASH_BITS 61 +#else +# define _PyHASH_BITS 31 +#endif + +#define _PyHASH_MODULUS (((size_t)1 << _PyHASH_BITS) - 1) +#define _PyHASH_INF 314159 +#define _PyHASH_NAN 0 +#define _PyHASH_IMAG _PyHASH_MULTIPLIER + + +/* hash secret + * + * memory layout on 64 bit systems + * cccccccc cccccccc cccccccc uc -- unsigned char[24] + * pppppppp ssssssss ........ fnv -- two Py_hash_t + * k0k0k0k0 k1k1k1k1 ........ siphash -- two uint64_t + * ........ ........ ssssssss djbx33a -- 16 bytes padding + one Py_hash_t + * ........ ........ eeeeeeee pyexpat XML hash salt + * + * memory layout on 32 bit systems + * cccccccc cccccccc cccccccc uc + * ppppssss ........ ........ fnv -- two Py_hash_t + * k0k0k0k0 k1k1k1k1 ........ siphash -- two uint64_t (*) + * ........ ........ ssss.... djbx33a -- 16 bytes padding + one Py_hash_t + * ........ ........ eeee.... pyexpat XML hash salt + * + * (*) The siphash member may not be available on 32 bit platforms without + * an unsigned int64 data type. + */ +#ifndef Py_LIMITED_API +typedef union { + /* ensure 24 bytes */ + unsigned char uc[24]; + /* two Py_hash_t for FNV */ + struct { + Py_hash_t prefix; + Py_hash_t suffix; + } fnv; + /* two uint64 for SipHash24 */ + struct { + uint64_t k0; + uint64_t k1; + } siphash; + /* a different (!) Py_hash_t for small string optimization */ + struct { + unsigned char padding[16]; + Py_hash_t suffix; + } djbx33a; + struct { + unsigned char padding[16]; + Py_hash_t hashsalt; + } expat; +} _Py_HashSecret_t; +PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; +#endif + +#ifdef Py_DEBUG +PyAPI_DATA(int) _Py_HashSecret_Initialized; +#endif + + +/* hash function definition */ +#ifndef Py_LIMITED_API +typedef struct { + Py_hash_t (*const hash)(const void *, Py_ssize_t); + const char *name; + const int hash_bits; + const int seed_bits; +} PyHash_FuncDef; + +PyAPI_FUNC(PyHash_FuncDef*) PyHash_GetFuncDef(void); +#endif + + +/* cutoff for small string DJBX33A optimization in range [1, cutoff). + * + * About 50% of the strings in a typical Python application are smaller than + * 6 to 7 chars. However DJBX33A is vulnerable to hash collision attacks. + * NEVER use DJBX33A for long strings! + * + * A Py_HASH_CUTOFF of 0 disables small string optimization. 32 bit platforms + * should use a smaller cutoff because it is easier to create colliding + * strings. A cutoff of 7 on 64bit platforms and 5 on 32bit platforms should + * provide a decent safety margin. + */ +#ifndef Py_HASH_CUTOFF +# define Py_HASH_CUTOFF 0 +#elif (Py_HASH_CUTOFF > 7 || Py_HASH_CUTOFF < 0) +# error Py_HASH_CUTOFF must in range 0...7. +#endif /* Py_HASH_CUTOFF */ + + +/* hash algorithm selection + * + * The values for Py_HASH_SIPHASH24 and Py_HASH_FNV are hard-coded in the + * configure script. + * + * - FNV is available on all platforms and architectures. + * - SIPHASH24 only works on plaforms that don't require aligned memory for integers. + * - With EXTERNAL embedders can provide an alternative implementation with:: + * + * PyHash_FuncDef PyHash_Func = {...}; + * + * XXX: Figure out __declspec() for extern PyHash_FuncDef. + */ +#define Py_HASH_EXTERNAL 0 +#define Py_HASH_SIPHASH24 1 +#define Py_HASH_FNV 2 + +#ifndef Py_HASH_ALGORITHM +# ifndef HAVE_ALIGNED_REQUIRED +# define Py_HASH_ALGORITHM Py_HASH_SIPHASH24 +# else +# define Py_HASH_ALGORITHM Py_HASH_FNV +# endif /* uint64_t && uint32_t && aligned */ +#endif /* Py_HASH_ALGORITHM */ + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_HASH_H */ diff --git a/venv/Include/pylifecycle.h b/venv/Include/pylifecycle.h new file mode 100644 index 00000000..659c6df6 --- /dev/null +++ b/venv/Include/pylifecycle.h @@ -0,0 +1,214 @@ + +/* Interfaces to configure, query, create & destroy the Python runtime */ + +#ifndef Py_PYLIFECYCLE_H +#define Py_PYLIFECYCLE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +typedef struct { + const char *prefix; + const char *msg; + int user_err; +} _PyInitError; + +/* Almost all errors causing Python initialization to fail */ +#ifdef _MSC_VER + /* Visual Studio 2015 doesn't implement C99 __func__ in C */ +# define _Py_INIT_GET_FUNC() __FUNCTION__ +#else +# define _Py_INIT_GET_FUNC() __func__ +#endif + +#define _Py_INIT_OK() \ + (_PyInitError){.prefix = NULL, .msg = NULL, .user_err = 0} +#define _Py_INIT_ERR(MSG) \ + (_PyInitError){.prefix = _Py_INIT_GET_FUNC(), .msg = (MSG), .user_err = 0} +/* Error that can be fixed by the user like invalid input parameter. + Don't abort() the process on such error. */ +#define _Py_INIT_USER_ERR(MSG) \ + (_PyInitError){.prefix = _Py_INIT_GET_FUNC(), .msg = (MSG), .user_err = 1} +#define _Py_INIT_NO_MEMORY() _Py_INIT_USER_ERR("memory allocation failed") +#define _Py_INIT_FAILED(err) \ + (err.msg != NULL) + +#endif + + +PyAPI_FUNC(void) Py_SetProgramName(const wchar_t *); +PyAPI_FUNC(wchar_t *) Py_GetProgramName(void); + +PyAPI_FUNC(void) Py_SetPythonHome(const wchar_t *); +PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void); + +#ifndef Py_LIMITED_API +/* Only used by applications that embed the interpreter and need to + * override the standard encoding determination mechanism + */ +PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, + const char *errors); + +/* PEP 432 Multi-phase initialization API (Private while provisional!) */ +PyAPI_FUNC(_PyInitError) _Py_InitializeCore(const _PyCoreConfig *); +PyAPI_FUNC(int) _Py_IsCoreInitialized(void); + +PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *); +PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *); +PyAPI_FUNC(int) _PyCoreConfig_Copy( + _PyCoreConfig *config, + const _PyCoreConfig *config2); + +PyAPI_FUNC(_PyInitError) _PyMainInterpreterConfig_Read( + _PyMainInterpreterConfig *config, + const _PyCoreConfig *core_config); +PyAPI_FUNC(void) _PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *); +PyAPI_FUNC(int) _PyMainInterpreterConfig_Copy( + _PyMainInterpreterConfig *config, + const _PyMainInterpreterConfig *config2); + +PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig *); +#endif + +/* Initialization and finalization */ +PyAPI_FUNC(void) Py_Initialize(void); +PyAPI_FUNC(void) Py_InitializeEx(int); +#ifndef Py_LIMITED_API +PyAPI_FUNC(_PyInitError) _Py_InitializeEx_Private(int, int); +PyAPI_FUNC(void) _Py_FatalInitError(_PyInitError err) _Py_NO_RETURN; +#endif +PyAPI_FUNC(void) Py_Finalize(void); +PyAPI_FUNC(int) Py_FinalizeEx(void); +PyAPI_FUNC(int) Py_IsInitialized(void); + +/* Subinterpreter support */ +PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void); +PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *); + + +/* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level + * exit functions. + */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_PyAtExit(void (*func)(PyObject *), PyObject *); +#endif +PyAPI_FUNC(int) Py_AtExit(void (*func)(void)); + +PyAPI_FUNC(void) Py_Exit(int) _Py_NO_RETURN; + +/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_RestoreSignals(void); + +PyAPI_FUNC(int) Py_FdIsInteractive(FILE *, const char *); +#endif + +/* Bootstrap __main__ (defined in Modules/main.c) */ +PyAPI_FUNC(int) Py_Main(int argc, wchar_t **argv); +#ifdef Py_BUILD_CORE +PyAPI_FUNC(int) _Py_UnixMain(int argc, char **argv); +#endif + +/* In getpath.c */ +PyAPI_FUNC(wchar_t *) Py_GetProgramFullPath(void); +PyAPI_FUNC(wchar_t *) Py_GetPrefix(void); +PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void); +PyAPI_FUNC(wchar_t *) Py_GetPath(void); +#ifdef Py_BUILD_CORE +PyAPI_FUNC(_PyInitError) _PyPathConfig_Init(const _PyCoreConfig *core_config); +PyAPI_FUNC(PyObject*) _PyPathConfig_ComputeArgv0(int argc, wchar_t **argv); +PyAPI_FUNC(int) _Py_FindEnvConfigValue( + FILE *env_file, + const wchar_t *key, + wchar_t *value, + size_t value_size); +#endif +PyAPI_FUNC(void) Py_SetPath(const wchar_t *); +#ifdef MS_WINDOWS +int _Py_CheckPython3(void); +#endif + +/* In their own files */ +PyAPI_FUNC(const char *) Py_GetVersion(void); +PyAPI_FUNC(const char *) Py_GetPlatform(void); +PyAPI_FUNC(const char *) Py_GetCopyright(void); +PyAPI_FUNC(const char *) Py_GetCompiler(void); +PyAPI_FUNC(const char *) Py_GetBuildInfo(void); +#ifndef Py_LIMITED_API +PyAPI_FUNC(const char *) _Py_gitidentifier(void); +PyAPI_FUNC(const char *) _Py_gitversion(void); +#endif + +/* Internal -- various one-time initializations */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void); +PyAPI_FUNC(_PyInitError) _PySys_BeginInit(PyObject **sysmod); +PyAPI_FUNC(int) _PySys_EndInit(PyObject *sysdict, _PyMainInterpreterConfig *config); +PyAPI_FUNC(_PyInitError) _PyImport_Init(PyInterpreterState *interp); +PyAPI_FUNC(void) _PyExc_Init(PyObject * bltinmod); +PyAPI_FUNC(_PyInitError) _PyImportHooks_Init(void); +PyAPI_FUNC(int) _PyFrame_Init(void); +PyAPI_FUNC(int) _PyFloat_Init(void); +PyAPI_FUNC(int) PyByteArray_Init(void); +PyAPI_FUNC(_PyInitError) _Py_HashRandomization_Init(const _PyCoreConfig *); +#endif +#ifdef Py_BUILD_CORE +PyAPI_FUNC(int) _Py_ReadHashSeed( + const char *seed_text, + int *use_hash_seed, + unsigned long *hash_seed); +#endif + +/* Various internal finalizers */ + +#ifdef Py_BUILD_CORE +PyAPI_FUNC(void) _PyExc_Fini(void); +PyAPI_FUNC(void) _PyImport_Fini(void); +PyAPI_FUNC(void) _PyImport_Fini2(void); +PyAPI_FUNC(void) _PyGC_DumpShutdownStats(void); +PyAPI_FUNC(void) _PyGC_Fini(void); +PyAPI_FUNC(void) _PyType_Fini(void); +PyAPI_FUNC(void) _Py_HashRandomization_Fini(void); +#endif /* Py_BUILD_CORE */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyMethod_Fini(void); +PyAPI_FUNC(void) PyFrame_Fini(void); +PyAPI_FUNC(void) PyCFunction_Fini(void); +PyAPI_FUNC(void) PyDict_Fini(void); +PyAPI_FUNC(void) PyTuple_Fini(void); +PyAPI_FUNC(void) PyList_Fini(void); +PyAPI_FUNC(void) PySet_Fini(void); +PyAPI_FUNC(void) PyBytes_Fini(void); +PyAPI_FUNC(void) PyByteArray_Fini(void); +PyAPI_FUNC(void) PyFloat_Fini(void); +PyAPI_FUNC(void) PyOS_FiniInterrupts(void); +PyAPI_FUNC(void) PySlice_Fini(void); +PyAPI_FUNC(void) PyAsyncGen_Fini(void); + +PyAPI_FUNC(int) _Py_IsFinalizing(void); +#endif /* !Py_LIMITED_API */ + +/* Signals */ +typedef void (*PyOS_sighandler_t)(int); +PyAPI_FUNC(PyOS_sighandler_t) PyOS_getsig(int); +PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t); + +#ifndef Py_LIMITED_API +/* Random */ +PyAPI_FUNC(int) _PyOS_URandom(void *buffer, Py_ssize_t size); +PyAPI_FUNC(int) _PyOS_URandomNonblock(void *buffer, Py_ssize_t size); +#endif /* !Py_LIMITED_API */ + +/* Legacy locale support */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_CoerceLegacyLocale(const _PyCoreConfig *config); +PyAPI_FUNC(int) _Py_LegacyLocaleDetected(void); +PyAPI_FUNC(char *) _Py_SetLocaleFromEnv(int category); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYLIFECYCLE_H */ diff --git a/venv/Include/pymacconfig.h b/venv/Include/pymacconfig.h new file mode 100644 index 00000000..9dde11bd --- /dev/null +++ b/venv/Include/pymacconfig.h @@ -0,0 +1,102 @@ +#ifndef PYMACCONFIG_H +#define PYMACCONFIG_H + /* + * This file moves some of the autoconf magic to compile-time + * when building on MacOSX. This is needed for building 4-way + * universal binaries and for 64-bit universal binaries because + * the values redefined below aren't configure-time constant but + * only compile-time constant in these scenarios. + */ + +#if defined(__APPLE__) + +# undef SIZEOF_LONG +# undef SIZEOF_PTHREAD_T +# undef SIZEOF_SIZE_T +# undef SIZEOF_TIME_T +# undef SIZEOF_VOID_P +# undef SIZEOF__BOOL +# undef SIZEOF_UINTPTR_T +# undef SIZEOF_PTHREAD_T +# undef WORDS_BIGENDIAN +# undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 +# undef DOUBLE_IS_BIG_ENDIAN_IEEE754 +# undef DOUBLE_IS_LITTLE_ENDIAN_IEEE754 +# undef HAVE_GCC_ASM_FOR_X87 + +# undef VA_LIST_IS_ARRAY +# if defined(__LP64__) && defined(__x86_64__) +# define VA_LIST_IS_ARRAY 1 +# endif + +# undef HAVE_LARGEFILE_SUPPORT +# ifndef __LP64__ +# define HAVE_LARGEFILE_SUPPORT 1 +# endif + +# undef SIZEOF_LONG +# ifdef __LP64__ +# define SIZEOF__BOOL 1 +# define SIZEOF__BOOL 1 +# define SIZEOF_LONG 8 +# define SIZEOF_PTHREAD_T 8 +# define SIZEOF_SIZE_T 8 +# define SIZEOF_TIME_T 8 +# define SIZEOF_VOID_P 8 +# define SIZEOF_UINTPTR_T 8 +# define SIZEOF_PTHREAD_T 8 +# else +# ifdef __ppc__ +# define SIZEOF__BOOL 4 +# else +# define SIZEOF__BOOL 1 +# endif +# define SIZEOF_LONG 4 +# define SIZEOF_PTHREAD_T 4 +# define SIZEOF_SIZE_T 4 +# define SIZEOF_TIME_T 4 +# define SIZEOF_VOID_P 4 +# define SIZEOF_UINTPTR_T 4 +# define SIZEOF_PTHREAD_T 4 +# endif + +# if defined(__LP64__) + /* MacOSX 10.4 (the first release to support 64-bit code + * at all) only supports 64-bit in the UNIX layer. + * Therefore suppress the toolbox-glue in 64-bit mode. + */ + + /* In 64-bit mode setpgrp always has no arguments, in 32-bit + * mode that depends on the compilation environment + */ +# undef SETPGRP_HAVE_ARG + +# endif + +#ifdef __BIG_ENDIAN__ +#define WORDS_BIGENDIAN 1 +#define DOUBLE_IS_BIG_ENDIAN_IEEE754 +#else +#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 +#endif /* __BIG_ENDIAN */ + +#ifdef __i386__ +# define HAVE_GCC_ASM_FOR_X87 +#endif + + /* + * The definition in pyconfig.h is only valid on the OS release + * where configure ran on and not necessarily for all systems where + * the executable can be used on. + * + * Specifically: OSX 10.4 has limited supported for '%zd', while + * 10.5 has full support for '%zd'. A binary built on 10.5 won't + * work properly on 10.4 unless we suppress the definition + * of PY_FORMAT_SIZE_T + */ +#undef PY_FORMAT_SIZE_T + + +#endif /* defined(_APPLE__) */ + +#endif /* PYMACCONFIG_H */ diff --git a/venv/Include/pymacro.h b/venv/Include/pymacro.h new file mode 100644 index 00000000..3f6ddbe9 --- /dev/null +++ b/venv/Include/pymacro.h @@ -0,0 +1,100 @@ +#ifndef Py_PYMACRO_H +#define Py_PYMACRO_H + +/* Minimum value between x and y */ +#define Py_MIN(x, y) (((x) > (y)) ? (y) : (x)) + +/* Maximum value between x and y */ +#define Py_MAX(x, y) (((x) > (y)) ? (x) : (y)) + +/* Absolute value of the number x */ +#define Py_ABS(x) ((x) < 0 ? -(x) : (x)) + +#define _Py_XSTRINGIFY(x) #x + +/* Convert the argument to a string. For example, Py_STRINGIFY(123) is replaced + with "123" by the preprocessor. Defines are also replaced by their value. + For example Py_STRINGIFY(__LINE__) is replaced by the line number, not + by "__LINE__". */ +#define Py_STRINGIFY(x) _Py_XSTRINGIFY(x) + +/* Get the size of a structure member in bytes */ +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) + +/* Argument must be a char or an int in [-128, 127] or [0, 255]. */ +#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff)) + +/* Assert a build-time dependency, as an expression. + + Your compile will fail if the condition isn't true, or can't be evaluated + by the compiler. This can be used in an expression: its value is 0. + + Example: + + #define foo_to_char(foo) \ + ((char *)(foo) \ + + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0)) + + Written by Rusty Russell, public domain, http://ccodearchive.net/ */ +#define Py_BUILD_ASSERT_EXPR(cond) \ + (sizeof(char [1 - 2*!(cond)]) - 1) + +#define Py_BUILD_ASSERT(cond) do { \ + (void)Py_BUILD_ASSERT_EXPR(cond); \ + } while(0) + +/* Get the number of elements in a visible array + + This does not work on pointers, or arrays declared as [], or function + parameters. With correct compiler support, such usage will cause a build + error (see Py_BUILD_ASSERT_EXPR). + + Written by Rusty Russell, public domain, http://ccodearchive.net/ + + Requires at GCC 3.1+ */ +#if (defined(__GNUC__) && !defined(__STRICT_ANSI__) && \ + (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) || (__GNUC__ >= 4))) +/* Two gcc extensions. + &a[0] degrades to a pointer: a different type from an array */ +#define Py_ARRAY_LENGTH(array) \ + (sizeof(array) / sizeof((array)[0]) \ + + Py_BUILD_ASSERT_EXPR(!__builtin_types_compatible_p(typeof(array), \ + typeof(&(array)[0])))) +#else +#define Py_ARRAY_LENGTH(array) \ + (sizeof(array) / sizeof((array)[0])) +#endif + + +/* Define macros for inline documentation. */ +#define PyDoc_VAR(name) static char name[] +#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str) +#ifdef WITH_DOC_STRINGS +#define PyDoc_STR(str) str +#else +#define PyDoc_STR(str) "" +#endif + +/* Below "a" is a power of 2. */ +/* Round down size "n" to be a multiple of "a". */ +#define _Py_SIZE_ROUND_DOWN(n, a) ((size_t)(n) & ~(size_t)((a) - 1)) +/* Round up size "n" to be a multiple of "a". */ +#define _Py_SIZE_ROUND_UP(n, a) (((size_t)(n) + \ + (size_t)((a) - 1)) & ~(size_t)((a) - 1)) +/* Round pointer "p" down to the closest "a"-aligned address <= "p". */ +#define _Py_ALIGN_DOWN(p, a) ((void *)((uintptr_t)(p) & ~(uintptr_t)((a) - 1))) +/* Round pointer "p" up to the closest "a"-aligned address >= "p". */ +#define _Py_ALIGN_UP(p, a) ((void *)(((uintptr_t)(p) + \ + (uintptr_t)((a) - 1)) & ~(uintptr_t)((a) - 1))) +/* Check if pointer "p" is aligned to "a"-bytes boundary. */ +#define _Py_IS_ALIGNED(p, a) (!((uintptr_t)(p) & (uintptr_t)((a) - 1))) + +#ifdef __GNUC__ +#define Py_UNUSED(name) _unused_ ## name __attribute__((unused)) +#else +#define Py_UNUSED(name) _unused_ ## name +#endif + +#define Py_UNREACHABLE() abort() + +#endif /* Py_PYMACRO_H */ diff --git a/venv/Include/pymath.h b/venv/Include/pymath.h new file mode 100644 index 00000000..6cf69f98 --- /dev/null +++ b/venv/Include/pymath.h @@ -0,0 +1,230 @@ +#ifndef Py_PYMATH_H +#define Py_PYMATH_H + +#include "pyconfig.h" /* include for defines */ + +/************************************************************************** +Symbols and macros to supply platform-independent interfaces to mathematical +functions and constants +**************************************************************************/ + +/* Python provides implementations for copysign, round and hypot in + * Python/pymath.c just in case your math library doesn't provide the + * functions. + * + *Note: PC/pyconfig.h defines copysign as _copysign + */ +#ifndef HAVE_COPYSIGN +extern double copysign(double, double); +#endif + +#ifndef HAVE_ROUND +extern double round(double); +#endif + +#ifndef HAVE_HYPOT +extern double hypot(double, double); +#endif + +/* extra declarations */ +#ifndef _MSC_VER +#ifndef __STDC__ +extern double fmod (double, double); +extern double frexp (double, int *); +extern double ldexp (double, int); +extern double modf (double, double *); +extern double pow(double, double); +#endif /* __STDC__ */ +#endif /* _MSC_VER */ + +/* High precision definition of pi and e (Euler) + * The values are taken from libc6's math.h. + */ +#ifndef Py_MATH_PIl +#define Py_MATH_PIl 3.1415926535897932384626433832795029L +#endif +#ifndef Py_MATH_PI +#define Py_MATH_PI 3.14159265358979323846 +#endif + +#ifndef Py_MATH_El +#define Py_MATH_El 2.7182818284590452353602874713526625L +#endif + +#ifndef Py_MATH_E +#define Py_MATH_E 2.7182818284590452354 +#endif + +/* Tau (2pi) to 40 digits, taken from tauday.com/tau-digits. */ +#ifndef Py_MATH_TAU +#define Py_MATH_TAU 6.2831853071795864769252867665590057683943L +#endif + + +/* On x86, Py_FORCE_DOUBLE forces a floating-point number out of an x87 FPU + register and into a 64-bit memory location, rounding from extended + precision to double precision in the process. On other platforms it does + nothing. */ + +/* we take double rounding as evidence of x87 usage */ +#ifndef Py_LIMITED_API +#ifndef Py_FORCE_DOUBLE +# ifdef X87_DOUBLE_ROUNDING +PyAPI_FUNC(double) _Py_force_double(double); +# define Py_FORCE_DOUBLE(X) (_Py_force_double(X)) +# else +# define Py_FORCE_DOUBLE(X) (X) +# endif +#endif +#endif + +#ifndef Py_LIMITED_API +#ifdef HAVE_GCC_ASM_FOR_X87 +PyAPI_FUNC(unsigned short) _Py_get_387controlword(void); +PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); +#endif +#endif + +/* Py_IS_NAN(X) + * Return 1 if float or double arg is a NaN, else 0. + * Caution: + * X is evaluated more than once. + * This may not work on all platforms. Each platform has *some* + * way to spell this, though -- override in pyconfig.h if you have + * a platform where it doesn't work. + * Note: PC/pyconfig.h defines Py_IS_NAN as _isnan + */ +#ifndef Py_IS_NAN +#if defined HAVE_DECL_ISNAN && HAVE_DECL_ISNAN == 1 +#define Py_IS_NAN(X) isnan(X) +#else +#define Py_IS_NAN(X) ((X) != (X)) +#endif +#endif + +/* Py_IS_INFINITY(X) + * Return 1 if float or double arg is an infinity, else 0. + * Caution: + * X is evaluated more than once. + * This implementation may set the underflow flag if |X| is very small; + * it really can't be implemented correctly (& easily) before C99. + * Override in pyconfig.h if you have a better spelling on your platform. + * Py_FORCE_DOUBLE is used to avoid getting false negatives from a + * non-infinite value v sitting in an 80-bit x87 register such that + * v becomes infinite when spilled from the register to 64-bit memory. + * Note: PC/pyconfig.h defines Py_IS_INFINITY as _isinf + */ +#ifndef Py_IS_INFINITY +# if defined HAVE_DECL_ISINF && HAVE_DECL_ISINF == 1 +# define Py_IS_INFINITY(X) isinf(X) +# else +# define Py_IS_INFINITY(X) ((X) && \ + (Py_FORCE_DOUBLE(X)*0.5 == Py_FORCE_DOUBLE(X))) +# endif +#endif + +/* Py_IS_FINITE(X) + * Return 1 if float or double arg is neither infinite nor NAN, else 0. + * Some compilers (e.g. VisualStudio) have intrisics for this, so a special + * macro for this particular test is useful + * Note: PC/pyconfig.h defines Py_IS_FINITE as _finite + */ +#ifndef Py_IS_FINITE +#if defined HAVE_DECL_ISFINITE && HAVE_DECL_ISFINITE == 1 +#define Py_IS_FINITE(X) isfinite(X) +#elif defined HAVE_FINITE +#define Py_IS_FINITE(X) finite(X) +#else +#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X)) +#endif +#endif + +/* HUGE_VAL is supposed to expand to a positive double infinity. Python + * uses Py_HUGE_VAL instead because some platforms are broken in this + * respect. We used to embed code in pyport.h to try to worm around that, + * but different platforms are broken in conflicting ways. If you're on + * a platform where HUGE_VAL is defined incorrectly, fiddle your Python + * config to #define Py_HUGE_VAL to something that works on your platform. + */ +#ifndef Py_HUGE_VAL +#define Py_HUGE_VAL HUGE_VAL +#endif + +/* Py_NAN + * A value that evaluates to a NaN. On IEEE 754 platforms INF*0 or + * INF/INF works. Define Py_NO_NAN in pyconfig.h if your platform + * doesn't support NaNs. + */ +#if !defined(Py_NAN) && !defined(Py_NO_NAN) +#if !defined(__INTEL_COMPILER) + #define Py_NAN (Py_HUGE_VAL * 0.) +#else /* __INTEL_COMPILER */ + #if defined(ICC_NAN_STRICT) + #pragma float_control(push) + #pragma float_control(precise, on) + #pragma float_control(except, on) + #if defined(_MSC_VER) + __declspec(noinline) + #else /* Linux */ + __attribute__((noinline)) + #endif /* _MSC_VER */ + static double __icc_nan() + { + return sqrt(-1.0); + } + #pragma float_control (pop) + #define Py_NAN __icc_nan() + #else /* ICC_NAN_RELAXED as default for Intel Compiler */ + static const union { unsigned char buf[8]; double __icc_nan; } __nan_store = {0,0,0,0,0,0,0xf8,0x7f}; + #define Py_NAN (__nan_store.__icc_nan) + #endif /* ICC_NAN_STRICT */ +#endif /* __INTEL_COMPILER */ +#endif + +/* Py_OVERFLOWED(X) + * Return 1 iff a libm function overflowed. Set errno to 0 before calling + * a libm function, and invoke this macro after, passing the function + * result. + * Caution: + * This isn't reliable. C99 no longer requires libm to set errno under + * any exceptional condition, but does require +- HUGE_VAL return + * values on overflow. A 754 box *probably* maps HUGE_VAL to a + * double infinity, and we're cool if that's so, unless the input + * was an infinity and an infinity is the expected result. A C89 + * system sets errno to ERANGE, so we check for that too. We're + * out of luck if a C99 754 box doesn't map HUGE_VAL to +Inf, or + * if the returned result is a NaN, or if a C89 box returns HUGE_VAL + * in non-overflow cases. + * X is evaluated more than once. + * Some platforms have better way to spell this, so expect some #ifdef'ery. + * + * OpenBSD uses 'isinf()' because a compiler bug on that platform causes + * the longer macro version to be mis-compiled. This isn't optimal, and + * should be removed once a newer compiler is available on that platform. + * The system that had the failure was running OpenBSD 3.2 on Intel, with + * gcc 2.95.3. + * + * According to Tim's checkin, the FreeBSD systems use isinf() to work + * around a FPE bug on that platform. + */ +#if defined(__FreeBSD__) || defined(__OpenBSD__) +#define Py_OVERFLOWED(X) isinf(X) +#else +#define Py_OVERFLOWED(X) ((X) != 0.0 && (errno == ERANGE || \ + (X) == Py_HUGE_VAL || \ + (X) == -Py_HUGE_VAL)) +#endif + +/* Return whether integral type *type* is signed or not. */ +#define _Py_IntegralTypeSigned(type) ((type)(-1) < 0) +/* Return the maximum value of integral type *type*. */ +#define _Py_IntegralTypeMax(type) ((_Py_IntegralTypeSigned(type)) ? (((((type)1 << (sizeof(type)*CHAR_BIT - 2)) - 1) << 1) + 1) : ~(type)0) +/* Return the minimum value of integral type *type*. */ +#define _Py_IntegralTypeMin(type) ((_Py_IntegralTypeSigned(type)) ? -_Py_IntegralTypeMax(type) - 1 : 0) +/* Check whether *v* is in the range of integral type *type*. This is most + * useful if *v* is floating-point, since demoting a floating-point *v* to an + * integral type that cannot represent *v*'s integral part is undefined + * behavior. */ +#define _Py_InIntegralTypeRange(type, v) (_Py_IntegralTypeMin(type) <= v && v <= _Py_IntegralTypeMax(type)) + +#endif /* Py_PYMATH_H */ diff --git a/venv/Include/pymem.h b/venv/Include/pymem.h new file mode 100644 index 00000000..8ee0efdd --- /dev/null +++ b/venv/Include/pymem.h @@ -0,0 +1,244 @@ +/* The PyMem_ family: low-level memory allocation interfaces. + See objimpl.h for the PyObject_ memory family. +*/ + +#ifndef Py_PYMEM_H +#define Py_PYMEM_H + +#include "pyport.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void *) PyMem_RawMalloc(size_t size); +PyAPI_FUNC(void *) PyMem_RawCalloc(size_t nelem, size_t elsize); +PyAPI_FUNC(void *) PyMem_RawRealloc(void *ptr, size_t new_size); +PyAPI_FUNC(void) PyMem_RawFree(void *ptr); + +/* Configure the Python memory allocators. Pass NULL to use default + allocators. */ +PyAPI_FUNC(int) _PyMem_SetupAllocators(const char *opt); + +/* Try to get the allocators name set by _PyMem_SetupAllocators(). */ +PyAPI_FUNC(const char*) _PyMem_GetAllocatorsName(void); + +/* Track an allocated memory block in the tracemalloc module. + Return 0 on success, return -1 on error (failed to allocate memory to store + the trace). + + Return -2 if tracemalloc is disabled. + + If memory block is already tracked, update the existing trace. */ +PyAPI_FUNC(int) PyTraceMalloc_Track( + unsigned int domain, + uintptr_t ptr, + size_t size); + +/* Untrack an allocated memory block in the tracemalloc module. + Do nothing if the block was not tracked. + + Return -2 if tracemalloc is disabled, otherwise return 0. */ +PyAPI_FUNC(int) PyTraceMalloc_Untrack( + unsigned int domain, + uintptr_t ptr); + +/* Get the traceback where a memory block was allocated. + + Return a tuple of (filename: str, lineno: int) tuples. + + Return None if the tracemalloc module is disabled or if the memory block + is not tracked by tracemalloc. + + Raise an exception and return NULL on error. */ +PyAPI_FUNC(PyObject*) _PyTraceMalloc_GetTraceback( + unsigned int domain, + uintptr_t ptr); +#endif /* !Py_LIMITED_API */ + + +/* BEWARE: + + Each interface exports both functions and macros. Extension modules should + use the functions, to ensure binary compatibility across Python versions. + Because the Python implementation is free to change internal details, and + the macros may (or may not) expose details for speed, if you do use the + macros you must recompile your extensions with each Python release. + + Never mix calls to PyMem_ with calls to the platform malloc/realloc/ + calloc/free. For example, on Windows different DLLs may end up using + different heaps, and if you use PyMem_Malloc you'll get the memory from the + heap used by the Python DLL; it could be a disaster if you free()'ed that + directly in your own extension. Using PyMem_Free instead ensures Python + can return the memory to the proper heap. As another example, in + PYMALLOC_DEBUG mode, Python wraps all calls to all PyMem_ and PyObject_ + memory functions in special debugging wrappers that add additional + debugging info to dynamic memory blocks. The system routines have no idea + what to do with that stuff, and the Python wrappers have no idea what to do + with raw blocks obtained directly by the system routines then. + + The GIL must be held when using these APIs. +*/ + +/* + * Raw memory interface + * ==================== + */ + +/* Functions + + Functions supplying platform-independent semantics for malloc/realloc/ + free. These functions make sure that allocating 0 bytes returns a distinct + non-NULL pointer (whenever possible -- if we're flat out of memory, NULL + may be returned), even if the platform malloc and realloc don't. + Returned pointers must be checked for NULL explicitly. No action is + performed on failure (no exception is set, no warning is printed, etc). +*/ + +PyAPI_FUNC(void *) PyMem_Malloc(size_t size); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(void *) PyMem_Calloc(size_t nelem, size_t elsize); +#endif +PyAPI_FUNC(void *) PyMem_Realloc(void *ptr, size_t new_size); +PyAPI_FUNC(void) PyMem_Free(void *ptr); + +#ifndef Py_LIMITED_API +/* strdup() using PyMem_RawMalloc() */ +PyAPI_FUNC(char *) _PyMem_RawStrdup(const char *str); + +/* strdup() using PyMem_Malloc() */ +PyAPI_FUNC(char *) _PyMem_Strdup(const char *str); + +/* wcsdup() using PyMem_RawMalloc() */ +PyAPI_FUNC(wchar_t*) _PyMem_RawWcsdup(const wchar_t *str); +#endif + +/* Macros. */ + +/* PyMem_MALLOC(0) means malloc(1). Some systems would return NULL + for malloc(0), which would be treated as an error. Some platforms + would return a pointer with no memory behind it, which would break + pymalloc. To solve these problems, allocate an extra byte. */ +/* Returns NULL to indicate error if a negative size or size larger than + Py_ssize_t can represent is supplied. Helps prevents security holes. */ +#define PyMem_MALLOC(n) PyMem_Malloc(n) +#define PyMem_REALLOC(p, n) PyMem_Realloc(p, n) +#define PyMem_FREE(p) PyMem_Free(p) + +/* + * Type-oriented memory interface + * ============================== + * + * Allocate memory for n objects of the given type. Returns a new pointer + * or NULL if the request was too large or memory allocation failed. Use + * these macros rather than doing the multiplication yourself so that proper + * overflow checking is always done. + */ + +#define PyMem_New(type, n) \ + ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + ( (type *) PyMem_Malloc((n) * sizeof(type)) ) ) +#define PyMem_NEW(type, n) \ + ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + ( (type *) PyMem_MALLOC((n) * sizeof(type)) ) ) + +/* + * The value of (p) is always clobbered by this macro regardless of success. + * The caller MUST check if (p) is NULL afterwards and deal with the memory + * error if so. This means the original value of (p) MUST be saved for the + * caller's memory error handler to not lose track of it. + */ +#define PyMem_Resize(p, type, n) \ + ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + (type *) PyMem_Realloc((p), (n) * sizeof(type)) ) +#define PyMem_RESIZE(p, type, n) \ + ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + (type *) PyMem_REALLOC((p), (n) * sizeof(type)) ) + +/* PyMem{Del,DEL} are left over from ancient days, and shouldn't be used + * anymore. They're just confusing aliases for PyMem_{Free,FREE} now. + */ +#define PyMem_Del PyMem_Free +#define PyMem_DEL PyMem_FREE + +#ifndef Py_LIMITED_API +typedef enum { + /* PyMem_RawMalloc(), PyMem_RawRealloc() and PyMem_RawFree() */ + PYMEM_DOMAIN_RAW, + + /* PyMem_Malloc(), PyMem_Realloc() and PyMem_Free() */ + PYMEM_DOMAIN_MEM, + + /* PyObject_Malloc(), PyObject_Realloc() and PyObject_Free() */ + PYMEM_DOMAIN_OBJ +} PyMemAllocatorDomain; + +typedef struct { + /* user context passed as the first argument to the 4 functions */ + void *ctx; + + /* allocate a memory block */ + void* (*malloc) (void *ctx, size_t size); + + /* allocate a memory block initialized by zeros */ + void* (*calloc) (void *ctx, size_t nelem, size_t elsize); + + /* allocate or resize a memory block */ + void* (*realloc) (void *ctx, void *ptr, size_t new_size); + + /* release a memory block */ + void (*free) (void *ctx, void *ptr); +} PyMemAllocatorEx; + +/* Get the memory block allocator of the specified domain. */ +PyAPI_FUNC(void) PyMem_GetAllocator(PyMemAllocatorDomain domain, + PyMemAllocatorEx *allocator); + +/* Set the memory block allocator of the specified domain. + + The new allocator must return a distinct non-NULL pointer when requesting + zero bytes. + + For the PYMEM_DOMAIN_RAW domain, the allocator must be thread-safe: the GIL + is not held when the allocator is called. + + If the new allocator is not a hook (don't call the previous allocator), the + PyMem_SetupDebugHooks() function must be called to reinstall the debug hooks + on top on the new allocator. */ +PyAPI_FUNC(void) PyMem_SetAllocator(PyMemAllocatorDomain domain, + PyMemAllocatorEx *allocator); + +/* Setup hooks to detect bugs in the following Python memory allocator + functions: + + - PyMem_RawMalloc(), PyMem_RawRealloc(), PyMem_RawFree() + - PyMem_Malloc(), PyMem_Realloc(), PyMem_Free() + - PyObject_Malloc(), PyObject_Realloc() and PyObject_Free() + + Newly allocated memory is filled with the byte 0xCB, freed memory is filled + with the byte 0xDB. Additional checks: + + - detect API violations, ex: PyObject_Free() called on a buffer allocated + by PyMem_Malloc() + - detect write before the start of the buffer (buffer underflow) + - detect write after the end of the buffer (buffer overflow) + + The function does nothing if Python is not compiled is debug mode. */ +PyAPI_FUNC(void) PyMem_SetupDebugHooks(void); +#endif + +#ifdef Py_BUILD_CORE +/* Set the memory allocator of the specified domain to the default. + Save the old allocator into *old_alloc if it's non-NULL. + Return on success, or return -1 if the domain is unknown. */ +PyAPI_FUNC(int) _PyMem_SetDefaultAllocator( + PyMemAllocatorDomain domain, + PyMemAllocatorEx *old_alloc); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYMEM_H */ diff --git a/venv/Include/pyport.h b/venv/Include/pyport.h new file mode 100644 index 00000000..c1f4c7fb --- /dev/null +++ b/venv/Include/pyport.h @@ -0,0 +1,793 @@ +#ifndef Py_PYPORT_H +#define Py_PYPORT_H + +#include "pyconfig.h" /* include for defines */ + +#include + +/************************************************************************** +Symbols and macros to supply platform-independent interfaces to basic +C language & library operations whose spellings vary across platforms. + +Please try to make documentation here as clear as possible: by definition, +the stuff here is trying to illuminate C's darkest corners. + +Config #defines referenced here: + +SIGNED_RIGHT_SHIFT_ZERO_FILLS +Meaning: To be defined iff i>>j does not extend the sign bit when i is a + signed integral type and i < 0. +Used in: Py_ARITHMETIC_RIGHT_SHIFT + +Py_DEBUG +Meaning: Extra checks compiled in for debug mode. +Used in: Py_SAFE_DOWNCAST + +**************************************************************************/ + +/* typedefs for some C9X-defined synonyms for integral types. + * + * The names in Python are exactly the same as the C9X names, except with a + * Py_ prefix. Until C9X is universally implemented, this is the only way + * to ensure that Python gets reliable names that don't conflict with names + * in non-Python code that are playing their own tricks to define the C9X + * names. + * + * NOTE: don't go nuts here! Python has no use for *most* of the C9X + * integral synonyms. Only define the ones we actually need. + */ + +/* long long is required. Ensure HAVE_LONG_LONG is defined for compatibility. */ +#ifndef HAVE_LONG_LONG +#define HAVE_LONG_LONG 1 +#endif +#ifndef PY_LONG_LONG +#define PY_LONG_LONG long long +/* If LLONG_MAX is defined in limits.h, use that. */ +#define PY_LLONG_MIN LLONG_MIN +#define PY_LLONG_MAX LLONG_MAX +#define PY_ULLONG_MAX ULLONG_MAX +#endif + +#define PY_UINT32_T uint32_t +#define PY_UINT64_T uint64_t + +/* Signed variants of the above */ +#define PY_INT32_T int32_t +#define PY_INT64_T int64_t + +/* If PYLONG_BITS_IN_DIGIT is not defined then we'll use 30-bit digits if all + the necessary integer types are available, and we're on a 64-bit platform + (as determined by SIZEOF_VOID_P); otherwise we use 15-bit digits. */ + +#ifndef PYLONG_BITS_IN_DIGIT +#if SIZEOF_VOID_P >= 8 +#define PYLONG_BITS_IN_DIGIT 30 +#else +#define PYLONG_BITS_IN_DIGIT 15 +#endif +#endif + +/* uintptr_t is the C9X name for an unsigned integral type such that a + * legitimate void* can be cast to uintptr_t and then back to void* again + * without loss of information. Similarly for intptr_t, wrt a signed + * integral type. + */ +typedef uintptr_t Py_uintptr_t; +typedef intptr_t Py_intptr_t; + +/* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) == + * sizeof(size_t). C99 doesn't define such a thing directly (size_t is an + * unsigned integral type). See PEP 353 for details. + */ +#ifdef HAVE_SSIZE_T +typedef ssize_t Py_ssize_t; +#elif SIZEOF_VOID_P == SIZEOF_SIZE_T +typedef Py_intptr_t Py_ssize_t; +#else +# error "Python needs a typedef for Py_ssize_t in pyport.h." +#endif + +/* Py_hash_t is the same size as a pointer. */ +#define SIZEOF_PY_HASH_T SIZEOF_SIZE_T +typedef Py_ssize_t Py_hash_t; +/* Py_uhash_t is the unsigned equivalent needed to calculate numeric hash. */ +#define SIZEOF_PY_UHASH_T SIZEOF_SIZE_T +typedef size_t Py_uhash_t; + +/* Only used for compatibility with code that may not be PY_SSIZE_T_CLEAN. */ +#ifdef PY_SSIZE_T_CLEAN +typedef Py_ssize_t Py_ssize_clean_t; +#else +typedef int Py_ssize_clean_t; +#endif + +/* Largest possible value of size_t. */ +#define PY_SIZE_MAX SIZE_MAX + +/* Largest positive value of type Py_ssize_t. */ +#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) +/* Smallest negative value of type Py_ssize_t. */ +#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1) + +/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf + * format to convert an argument with the width of a size_t or Py_ssize_t. + * C99 introduced "z" for this purpose, but not all platforms support that; + * e.g., MS compilers use "I" instead. + * + * These "high level" Python format functions interpret "z" correctly on + * all platforms (Python interprets the format string itself, and does whatever + * the platform C requires to convert a size_t/Py_ssize_t argument): + * + * PyBytes_FromFormat + * PyErr_Format + * PyBytes_FromFormatV + * PyUnicode_FromFormatV + * + * Lower-level uses require that you interpolate the correct format modifier + * yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for + * example, + * + * Py_ssize_t index; + * fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index); + * + * That will expand to %ld, or %Id, or to something else correct for a + * Py_ssize_t on the platform. + */ +#ifndef PY_FORMAT_SIZE_T +# if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__) +# define PY_FORMAT_SIZE_T "" +# elif SIZEOF_SIZE_T == SIZEOF_LONG +# define PY_FORMAT_SIZE_T "l" +# elif defined(MS_WINDOWS) +# define PY_FORMAT_SIZE_T "I" +# else +# error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T" +# endif +#endif + +/* Py_LOCAL can be used instead of static to get the fastest possible calling + * convention for functions that are local to a given module. + * + * Py_LOCAL_INLINE does the same thing, and also explicitly requests inlining, + * for platforms that support that. + * + * If PY_LOCAL_AGGRESSIVE is defined before python.h is included, more + * "aggressive" inlining/optimization is enabled for the entire module. This + * may lead to code bloat, and may slow things down for those reasons. It may + * also lead to errors, if the code relies on pointer aliasing. Use with + * care. + * + * NOTE: You can only use this for functions that are entirely local to a + * module; functions that are exported via method tables, callbacks, etc, + * should keep using static. + */ + +#if defined(_MSC_VER) +#if defined(PY_LOCAL_AGGRESSIVE) +/* enable more aggressive optimization for visual studio */ +#pragma optimize("agtw", on) +#endif +/* ignore warnings if the compiler decides not to inline a function */ +#pragma warning(disable: 4710) +/* fastest possible local call under MSVC */ +#define Py_LOCAL(type) static type __fastcall +#define Py_LOCAL_INLINE(type) static __inline type __fastcall +#else +#define Py_LOCAL(type) static type +#define Py_LOCAL_INLINE(type) static inline type +#endif + +/* Py_MEMCPY is kept for backwards compatibility, + * see https://bugs.python.org/issue28126 */ +#define Py_MEMCPY memcpy + +#include + +#ifdef HAVE_IEEEFP_H +#include /* needed for 'finite' declaration on some platforms */ +#endif + +#include /* Moved here from the math section, before extern "C" */ + +/******************************************** + * WRAPPER FOR and/or * + ********************************************/ + +#ifdef TIME_WITH_SYS_TIME +#include +#include +#else /* !TIME_WITH_SYS_TIME */ +#ifdef HAVE_SYS_TIME_H +#include +#else /* !HAVE_SYS_TIME_H */ +#include +#endif /* !HAVE_SYS_TIME_H */ +#endif /* !TIME_WITH_SYS_TIME */ + + +/****************************** + * WRAPPER FOR * + ******************************/ + +/* NB caller must include */ + +#ifdef HAVE_SYS_SELECT_H +#include +#endif /* !HAVE_SYS_SELECT_H */ + +/******************************* + * stat() and fstat() fiddling * + *******************************/ + +#ifdef HAVE_SYS_STAT_H +#include +#elif defined(HAVE_STAT_H) +#include +#endif + +#ifndef S_IFMT +/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */ +#define S_IFMT 0170000 +#endif + +#ifndef S_IFLNK +/* Windows doesn't define S_IFLNK but posixmodule.c maps + * IO_REPARSE_TAG_SYMLINK to S_IFLNK */ +# define S_IFLNK 0120000 +#endif + +#ifndef S_ISREG +#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) +#endif + +#ifndef S_ISDIR +#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR) +#endif + +#ifndef S_ISCHR +#define S_ISCHR(x) (((x) & S_IFMT) == S_IFCHR) +#endif + +#ifdef __cplusplus +/* Move this down here since some C++ #include's don't like to be included + inside an extern "C" */ +extern "C" { +#endif + + +/* Py_ARITHMETIC_RIGHT_SHIFT + * C doesn't define whether a right-shift of a signed integer sign-extends + * or zero-fills. Here a macro to force sign extension: + * Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) + * Return I >> J, forcing sign extension. Arithmetically, return the + * floor of I/2**J. + * Requirements: + * I should have signed integer type. In the terminology of C99, this can + * be either one of the five standard signed integer types (signed char, + * short, int, long, long long) or an extended signed integer type. + * J is an integer >= 0 and strictly less than the number of bits in the + * type of I (because C doesn't define what happens for J outside that + * range either). + * TYPE used to specify the type of I, but is now ignored. It's been left + * in for backwards compatibility with versions <= 2.6 or 3.0. + * Caution: + * I may be evaluated more than once. + */ +#ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS +#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \ + ((I) < 0 ? -1-((-1-(I)) >> (J)) : (I) >> (J)) +#else +#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J)) +#endif + +/* Py_FORCE_EXPANSION(X) + * "Simply" returns its argument. However, macro expansions within the + * argument are evaluated. This unfortunate trickery is needed to get + * token-pasting to work as desired in some cases. + */ +#define Py_FORCE_EXPANSION(X) X + +/* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) + * Cast VALUE to type NARROW from type WIDE. In Py_DEBUG mode, this + * assert-fails if any information is lost. + * Caution: + * VALUE may be evaluated more than once. + */ +#ifdef Py_DEBUG +#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \ + (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE)) +#else +#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE) +#endif + +/* Py_SET_ERRNO_ON_MATH_ERROR(x) + * If a libm function did not set errno, but it looks like the result + * overflowed or not-a-number, set errno to ERANGE or EDOM. Set errno + * to 0 before calling a libm function, and invoke this macro after, + * passing the function result. + * Caution: + * This isn't reliable. See Py_OVERFLOWED comments. + * X is evaluated more than once. + */ +#if defined(__FreeBSD__) || defined(__OpenBSD__) || (defined(__hpux) && defined(__ia64)) +#define _Py_SET_EDOM_FOR_NAN(X) if (isnan(X)) errno = EDOM; +#else +#define _Py_SET_EDOM_FOR_NAN(X) ; +#endif +#define Py_SET_ERRNO_ON_MATH_ERROR(X) \ + do { \ + if (errno == 0) { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ + errno = ERANGE; \ + else _Py_SET_EDOM_FOR_NAN(X) \ + } \ + } while(0) + +/* Py_SET_ERANGE_ON_OVERFLOW(x) + * An alias of Py_SET_ERRNO_ON_MATH_ERROR for backward-compatibility. + */ +#define Py_SET_ERANGE_IF_OVERFLOW(X) Py_SET_ERRNO_ON_MATH_ERROR(X) + +/* Py_ADJUST_ERANGE1(x) + * Py_ADJUST_ERANGE2(x, y) + * Set errno to 0 before calling a libm function, and invoke one of these + * macros after, passing the function result(s) (Py_ADJUST_ERANGE2 is useful + * for functions returning complex results). This makes two kinds of + * adjustments to errno: (A) If it looks like the platform libm set + * errno=ERANGE due to underflow, clear errno. (B) If it looks like the + * platform libm overflowed but didn't set errno, force errno to ERANGE. In + * effect, we're trying to force a useful implementation of C89 errno + * behavior. + * Caution: + * This isn't reliable. See Py_OVERFLOWED comments. + * X and Y may be evaluated more than once. + */ +#define Py_ADJUST_ERANGE1(X) \ + do { \ + if (errno == 0) { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ + errno = ERANGE; \ + } \ + else if (errno == ERANGE && (X) == 0.0) \ + errno = 0; \ + } while(0) + +#define Py_ADJUST_ERANGE2(X, Y) \ + do { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL || \ + (Y) == Py_HUGE_VAL || (Y) == -Py_HUGE_VAL) { \ + if (errno == 0) \ + errno = ERANGE; \ + } \ + else if (errno == ERANGE) \ + errno = 0; \ + } while(0) + +/* The functions _Py_dg_strtod and _Py_dg_dtoa in Python/dtoa.c (which are + * required to support the short float repr introduced in Python 3.1) require + * that the floating-point unit that's being used for arithmetic operations + * on C doubles is set to use 53-bit precision. It also requires that the + * FPU rounding mode is round-half-to-even, but that's less often an issue. + * + * If your FPU isn't already set to 53-bit precision/round-half-to-even, and + * you want to make use of _Py_dg_strtod and _Py_dg_dtoa, then you should + * + * #define HAVE_PY_SET_53BIT_PRECISION 1 + * + * and also give appropriate definitions for the following three macros: + * + * _PY_SET_53BIT_PRECISION_START : store original FPU settings, and + * set FPU to 53-bit precision/round-half-to-even + * _PY_SET_53BIT_PRECISION_END : restore original FPU settings + * _PY_SET_53BIT_PRECISION_HEADER : any variable declarations needed to + * use the two macros above. + * + * The macros are designed to be used within a single C function: see + * Python/pystrtod.c for an example of their use. + */ + +/* get and set x87 control word for gcc/x86 */ +#ifdef HAVE_GCC_ASM_FOR_X87 +#define HAVE_PY_SET_53BIT_PRECISION 1 +/* _Py_get/set_387controlword functions are defined in Python/pymath.c */ +#define _Py_SET_53BIT_PRECISION_HEADER \ + unsigned short old_387controlword, new_387controlword +#define _Py_SET_53BIT_PRECISION_START \ + do { \ + old_387controlword = _Py_get_387controlword(); \ + new_387controlword = (old_387controlword & ~0x0f00) | 0x0200; \ + if (new_387controlword != old_387controlword) \ + _Py_set_387controlword(new_387controlword); \ + } while (0) +#define _Py_SET_53BIT_PRECISION_END \ + if (new_387controlword != old_387controlword) \ + _Py_set_387controlword(old_387controlword) +#endif + +/* get and set x87 control word for VisualStudio/x86 */ +#if defined(_MSC_VER) && !defined(_WIN64) /* x87 not supported in 64-bit */ +#define HAVE_PY_SET_53BIT_PRECISION 1 +#define _Py_SET_53BIT_PRECISION_HEADER \ + unsigned int old_387controlword, new_387controlword, out_387controlword +/* We use the __control87_2 function to set only the x87 control word. + The SSE control word is unaffected. */ +#define _Py_SET_53BIT_PRECISION_START \ + do { \ + __control87_2(0, 0, &old_387controlword, NULL); \ + new_387controlword = \ + (old_387controlword & ~(_MCW_PC | _MCW_RC)) | (_PC_53 | _RC_NEAR); \ + if (new_387controlword != old_387controlword) \ + __control87_2(new_387controlword, _MCW_PC | _MCW_RC, \ + &out_387controlword, NULL); \ + } while (0) +#define _Py_SET_53BIT_PRECISION_END \ + do { \ + if (new_387controlword != old_387controlword) \ + __control87_2(old_387controlword, _MCW_PC | _MCW_RC, \ + &out_387controlword, NULL); \ + } while (0) +#endif + +#ifdef HAVE_GCC_ASM_FOR_MC68881 +#define HAVE_PY_SET_53BIT_PRECISION 1 +#define _Py_SET_53BIT_PRECISION_HEADER \ + unsigned int old_fpcr, new_fpcr +#define _Py_SET_53BIT_PRECISION_START \ + do { \ + __asm__ ("fmove.l %%fpcr,%0" : "=g" (old_fpcr)); \ + /* Set double precision / round to nearest. */ \ + new_fpcr = (old_fpcr & ~0xf0) | 0x80; \ + if (new_fpcr != old_fpcr) \ + __asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (new_fpcr)); \ + } while (0) +#define _Py_SET_53BIT_PRECISION_END \ + do { \ + if (new_fpcr != old_fpcr) \ + __asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (old_fpcr)); \ + } while (0) +#endif + +/* default definitions are empty */ +#ifndef HAVE_PY_SET_53BIT_PRECISION +#define _Py_SET_53BIT_PRECISION_HEADER +#define _Py_SET_53BIT_PRECISION_START +#define _Py_SET_53BIT_PRECISION_END +#endif + +/* If we can't guarantee 53-bit precision, don't use the code + in Python/dtoa.c, but fall back to standard code. This + means that repr of a float will be long (17 sig digits). + + Realistically, there are two things that could go wrong: + + (1) doubles aren't IEEE 754 doubles, or + (2) we're on x86 with the rounding precision set to 64-bits + (extended precision), and we don't know how to change + the rounding precision. + */ + +#if !defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) && \ + !defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \ + !defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754) +#define PY_NO_SHORT_FLOAT_REPR +#endif + +/* double rounding is symptomatic of use of extended precision on x86. If + we're seeing double rounding, and we don't have any mechanism available for + changing the FPU rounding precision, then don't use Python/dtoa.c. */ +#if defined(X87_DOUBLE_ROUNDING) && !defined(HAVE_PY_SET_53BIT_PRECISION) +#define PY_NO_SHORT_FLOAT_REPR +#endif + + +/* Py_DEPRECATED(version) + * Declare a variable, type, or function deprecated. + * Usage: + * extern int old_var Py_DEPRECATED(2.3); + * typedef int T1 Py_DEPRECATED(2.4); + * extern int x() Py_DEPRECATED(2.5); + */ +#if defined(__GNUC__) \ + && ((__GNUC__ >= 4) || (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) +#define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__)) +#else +#define Py_DEPRECATED(VERSION_UNUSED) +#endif + + +/* _Py_HOT_FUNCTION + * The hot attribute on a function is used to inform the compiler that the + * function is a hot spot of the compiled program. The function is optimized + * more aggressively and on many target it is placed into special subsection of + * the text section so all hot functions appears close together improving + * locality. + * + * Usage: + * int _Py_HOT_FUNCTION x(void) { return 3; } + * + * Issue #28618: This attribute must not be abused, otherwise it can have a + * negative effect on performance. Only the functions were Python spend most of + * its time must use it. Use a profiler when running performance benchmark + * suite to find these functions. + */ +#if defined(__GNUC__) \ + && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) +#define _Py_HOT_FUNCTION __attribute__((hot)) +#else +#define _Py_HOT_FUNCTION +#endif + +/* _Py_NO_INLINE + * Disable inlining on a function. For example, it helps to reduce the C stack + * consumption. + * + * Usage: + * int _Py_NO_INLINE x(void) { return 3; } + */ +#if defined(__GNUC__) || defined(__clang__) +# define _Py_NO_INLINE __attribute__((noinline)) +#else +# define _Py_NO_INLINE +#endif + +/************************************************************************** +Prototypes that are missing from the standard include files on some systems +(and possibly only some versions of such systems.) + +Please be conservative with adding new ones, document them and enclose them +in platform-specific #ifdefs. +**************************************************************************/ + +#ifdef SOLARIS +/* Unchecked */ +extern int gethostname(char *, int); +#endif + +#ifdef HAVE__GETPTY +#include /* we need to import mode_t */ +extern char * _getpty(int *, int, mode_t, int); +#endif + +/* On QNX 6, struct termio must be declared by including sys/termio.h + if TCGETA, TCSETA, TCSETAW, or TCSETAF are used. sys/termio.h must + be included before termios.h or it will generate an error. */ +#if defined(HAVE_SYS_TERMIO_H) && !defined(__hpux) +#include +#endif + + +/* On 4.4BSD-descendants, ctype functions serves the whole range of + * wchar_t character set rather than single byte code points only. + * This characteristic can break some operations of string object + * including str.upper() and str.split() on UTF-8 locales. This + * workaround was provided by Tim Robbins of FreeBSD project. + */ + +#if defined(__APPLE__) +# define _PY_PORT_CTYPE_UTF8_ISSUE +#endif + +#ifdef _PY_PORT_CTYPE_UTF8_ISSUE +#ifndef __cplusplus + /* The workaround below is unsafe in C++ because + * the defines these symbols as real functions, + * with a slightly different signature. + * See issue #10910 + */ +#include +#include +#undef isalnum +#define isalnum(c) iswalnum(btowc(c)) +#undef isalpha +#define isalpha(c) iswalpha(btowc(c)) +#undef islower +#define islower(c) iswlower(btowc(c)) +#undef isspace +#define isspace(c) iswspace(btowc(c)) +#undef isupper +#define isupper(c) iswupper(btowc(c)) +#undef tolower +#define tolower(c) towlower(btowc(c)) +#undef toupper +#define toupper(c) towupper(btowc(c)) +#endif +#endif + + +/* Declarations for symbol visibility. + + PyAPI_FUNC(type): Declares a public Python API function and return type + PyAPI_DATA(type): Declares public Python data and its type + PyMODINIT_FUNC: A Python module init function. If these functions are + inside the Python core, they are private to the core. + If in an extension module, it may be declared with + external linkage depending on the platform. + + As a number of platforms support/require "__declspec(dllimport/dllexport)", + we support a HAVE_DECLSPEC_DLL macro to save duplication. +*/ + +/* + All windows ports, except cygwin, are handled in PC/pyconfig.h. + + Cygwin is the only other autoconf platform requiring special + linkage handling and it uses __declspec(). +*/ +#if defined(__CYGWIN__) +# define HAVE_DECLSPEC_DLL +#endif + +/* only get special linkage if built as shared or platform is Cygwin */ +#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) +# if defined(HAVE_DECLSPEC_DLL) +# if defined(Py_BUILD_CORE) || defined(Py_BUILD_CORE_BUILTIN) +# define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE +# define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE + /* module init functions inside the core need no external linkage */ + /* except for Cygwin to handle embedding */ +# if defined(__CYGWIN__) +# define PyMODINIT_FUNC __declspec(dllexport) PyObject* +# else /* __CYGWIN__ */ +# define PyMODINIT_FUNC PyObject* +# endif /* __CYGWIN__ */ +# else /* Py_BUILD_CORE */ + /* Building an extension module, or an embedded situation */ + /* public Python functions and data are imported */ + /* Under Cygwin, auto-import functions to prevent compilation */ + /* failures similar to those described at the bottom of 4.1: */ + /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ +# if !defined(__CYGWIN__) +# define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE +# endif /* !__CYGWIN__ */ +# define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE + /* module init functions outside the core must be exported */ +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" __declspec(dllexport) PyObject* +# else /* __cplusplus */ +# define PyMODINIT_FUNC __declspec(dllexport) PyObject* +# endif /* __cplusplus */ +# endif /* Py_BUILD_CORE */ +# endif /* HAVE_DECLSPEC_DLL */ +#endif /* Py_ENABLE_SHARED */ + +/* If no external linkage macros defined by now, create defaults */ +#ifndef PyAPI_FUNC +# define PyAPI_FUNC(RTYPE) RTYPE +#endif +#ifndef PyAPI_DATA +# define PyAPI_DATA(RTYPE) extern RTYPE +#endif +#ifndef PyMODINIT_FUNC +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" PyObject* +# else /* __cplusplus */ +# define PyMODINIT_FUNC PyObject* +# endif /* __cplusplus */ +#endif + +/* limits.h constants that may be missing */ + +#ifndef INT_MAX +#define INT_MAX 2147483647 +#endif + +#ifndef LONG_MAX +#if SIZEOF_LONG == 4 +#define LONG_MAX 0X7FFFFFFFL +#elif SIZEOF_LONG == 8 +#define LONG_MAX 0X7FFFFFFFFFFFFFFFL +#else +#error "could not set LONG_MAX in pyport.h" +#endif +#endif + +#ifndef LONG_MIN +#define LONG_MIN (-LONG_MAX-1) +#endif + +#ifndef LONG_BIT +#define LONG_BIT (8 * SIZEOF_LONG) +#endif + +#if LONG_BIT != 8 * SIZEOF_LONG +/* 04-Oct-2000 LONG_BIT is apparently (mis)defined as 64 on some recent + * 32-bit platforms using gcc. We try to catch that here at compile-time + * rather than waiting for integer multiplication to trigger bogus + * overflows. + */ +#error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)." +#endif + +#ifdef __cplusplus +} +#endif + +/* + * Hide GCC attributes from compilers that don't support them. + */ +#if (!defined(__GNUC__) || __GNUC__ < 2 || \ + (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ) +#define Py_GCC_ATTRIBUTE(x) +#else +#define Py_GCC_ATTRIBUTE(x) __attribute__(x) +#endif + +/* + * Specify alignment on compilers that support it. + */ +#if defined(__GNUC__) && __GNUC__ >= 3 +#define Py_ALIGNED(x) __attribute__((aligned(x))) +#else +#define Py_ALIGNED(x) +#endif + +/* Eliminate end-of-loop code not reached warnings from SunPro C + * when using do{...}while(0) macros + */ +#ifdef __SUNPRO_C +#pragma error_messages (off,E_END_OF_LOOP_CODE_NOT_REACHED) +#endif + +#ifndef Py_LL +#define Py_LL(x) x##LL +#endif + +#ifndef Py_ULL +#define Py_ULL(x) Py_LL(x##U) +#endif + +#define Py_VA_COPY va_copy + +/* + * Convenient macros to deal with endianness of the platform. WORDS_BIGENDIAN is + * detected by configure and defined in pyconfig.h. The code in pyconfig.h + * also takes care of Apple's universal builds. + */ + +#ifdef WORDS_BIGENDIAN +#define PY_BIG_ENDIAN 1 +#define PY_LITTLE_ENDIAN 0 +#else +#define PY_BIG_ENDIAN 0 +#define PY_LITTLE_ENDIAN 1 +#endif + +#if defined(Py_BUILD_CORE) || defined(Py_BUILD_CORE_BUILTIN) +/* + * Macros to protect CRT calls against instant termination when passed an + * invalid parameter (issue23524). + */ +#if defined _MSC_VER && _MSC_VER >= 1900 + +extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; +#define _Py_BEGIN_SUPPRESS_IPH { _invalid_parameter_handler _Py_old_handler = \ + _set_thread_local_invalid_parameter_handler(_Py_silent_invalid_parameter_handler); +#define _Py_END_SUPPRESS_IPH _set_thread_local_invalid_parameter_handler(_Py_old_handler); } + +#else + +#define _Py_BEGIN_SUPPRESS_IPH +#define _Py_END_SUPPRESS_IPH + +#endif /* _MSC_VER >= 1900 */ +#endif /* Py_BUILD_CORE */ + +#ifdef __ANDROID__ +/* The Android langinfo.h header is not used. */ +#undef HAVE_LANGINFO_H +#undef CODESET +#endif + +/* Maximum value of the Windows DWORD type */ +#define PY_DWORD_MAX 4294967295U + +/* This macro used to tell whether Python was built with multithreading + * enabled. Now multithreading is always enabled, but keep the macro + * for compatibility. + */ +#ifndef WITH_THREAD +#define WITH_THREAD +#endif + +#endif /* Py_PYPORT_H */ diff --git a/venv/Include/pystate.h b/venv/Include/pystate.h new file mode 100644 index 00000000..29d7148b --- /dev/null +++ b/venv/Include/pystate.h @@ -0,0 +1,452 @@ + +/* Thread and interpreter state structures and their interfaces */ + + +#ifndef Py_PYSTATE_H +#define Py_PYSTATE_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "pythread.h" + +/* This limitation is for performance and simplicity. If needed it can be +removed (with effort). */ +#define MAX_CO_EXTRA_USERS 255 + +/* State shared between threads */ + +struct _ts; /* Forward */ +struct _is; /* Forward */ +struct _frame; /* Forward declaration for PyFrameObject. */ + +#ifdef Py_LIMITED_API +typedef struct _is PyInterpreterState; +#else +typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int); + + +typedef struct { + int install_signal_handlers; /* Install signal handlers? -1 means unset */ + + int ignore_environment; /* -E, Py_IgnoreEnvironmentFlag */ + int use_hash_seed; /* PYTHONHASHSEED=x */ + unsigned long hash_seed; + const char *allocator; /* Memory allocator: _PyMem_SetupAllocators() */ + int dev_mode; /* PYTHONDEVMODE, -X dev */ + int faulthandler; /* PYTHONFAULTHANDLER, -X faulthandler */ + int tracemalloc; /* PYTHONTRACEMALLOC, -X tracemalloc=N */ + int import_time; /* PYTHONPROFILEIMPORTTIME, -X importtime */ + int show_ref_count; /* -X showrefcount */ + int show_alloc_count; /* -X showalloccount */ + int dump_refs; /* PYTHONDUMPREFS */ + int malloc_stats; /* PYTHONMALLOCSTATS */ + int coerce_c_locale; /* PYTHONCOERCECLOCALE, -1 means unknown */ + int coerce_c_locale_warn; /* PYTHONCOERCECLOCALE=warn */ + int utf8_mode; /* PYTHONUTF8, -X utf8; -1 means unknown */ + + wchar_t *program_name; /* Program name, see also Py_GetProgramName() */ + int argc; /* Number of command line arguments, + -1 means unset */ + wchar_t **argv; /* Command line arguments */ + wchar_t *program; /* argv[0] or "" */ + + int nxoption; /* Number of -X options */ + wchar_t **xoptions; /* -X options */ + + int nwarnoption; /* Number of warnings options */ + wchar_t **warnoptions; /* Warnings options */ + + /* Path configuration inputs */ + wchar_t *module_search_path_env; /* PYTHONPATH environment variable */ + wchar_t *home; /* PYTHONHOME environment variable, + see also Py_SetPythonHome(). */ + + /* Path configuration outputs */ + int nmodule_search_path; /* Number of sys.path paths, + -1 means unset */ + wchar_t **module_search_paths; /* sys.path paths */ + wchar_t *executable; /* sys.executable */ + wchar_t *prefix; /* sys.prefix */ + wchar_t *base_prefix; /* sys.base_prefix */ + wchar_t *exec_prefix; /* sys.exec_prefix */ + wchar_t *base_exec_prefix; /* sys.base_exec_prefix */ + + /* Private fields */ + int _disable_importlib; /* Needed by freeze_importlib */ +} _PyCoreConfig; + +#define _PyCoreConfig_INIT \ + (_PyCoreConfig){ \ + .install_signal_handlers = -1, \ + .use_hash_seed = -1, \ + .coerce_c_locale = -1, \ + .utf8_mode = -1, \ + .argc = -1, \ + .nmodule_search_path = -1} +/* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */ + +/* Placeholders while working on the new configuration API + * + * See PEP 432 for final anticipated contents + */ +typedef struct { + int install_signal_handlers; /* Install signal handlers? -1 means unset */ + PyObject *argv; /* sys.argv list, can be NULL */ + PyObject *executable; /* sys.executable str */ + PyObject *prefix; /* sys.prefix str */ + PyObject *base_prefix; /* sys.base_prefix str, can be NULL */ + PyObject *exec_prefix; /* sys.exec_prefix str */ + PyObject *base_exec_prefix; /* sys.base_exec_prefix str, can be NULL */ + PyObject *warnoptions; /* sys.warnoptions list, can be NULL */ + PyObject *xoptions; /* sys._xoptions dict, can be NULL */ + PyObject *module_search_path; /* sys.path list */ +} _PyMainInterpreterConfig; + +#define _PyMainInterpreterConfig_INIT \ + (_PyMainInterpreterConfig){.install_signal_handlers = -1} +/* Note: _PyMainInterpreterConfig_INIT sets other fields to 0/NULL */ + +typedef struct _is { + + struct _is *next; + struct _ts *tstate_head; + + int64_t id; + int64_t id_refcount; + PyThread_type_lock id_mutex; + + PyObject *modules; + PyObject *modules_by_index; + PyObject *sysdict; + PyObject *builtins; + PyObject *importlib; + + /* Used in Python/sysmodule.c. */ + int check_interval; + + /* Used in Modules/_threadmodule.c. */ + long num_threads; + /* Support for runtime thread stack size tuning. + A value of 0 means using the platform's default stack size + or the size specified by the THREAD_STACK_SIZE macro. */ + /* Used in Python/thread.c. */ + size_t pythread_stacksize; + + PyObject *codec_search_path; + PyObject *codec_search_cache; + PyObject *codec_error_registry; + int codecs_initialized; + int fscodec_initialized; + + _PyCoreConfig core_config; + _PyMainInterpreterConfig config; +#ifdef HAVE_DLOPEN + int dlopenflags; +#endif + + PyObject *builtins_copy; + PyObject *import_func; + /* Initialized to PyEval_EvalFrameDefault(). */ + _PyFrameEvalFunction eval_frame; + + Py_ssize_t co_extra_user_count; + freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; + +#ifdef HAVE_FORK + PyObject *before_forkers; + PyObject *after_forkers_parent; + PyObject *after_forkers_child; +#endif + /* AtExit module */ + void (*pyexitfunc)(PyObject *); + PyObject *pyexitmodule; + + uint64_t tstate_next_unique_id; +} PyInterpreterState; +#endif /* !Py_LIMITED_API */ + + +/* State unique per thread */ + +#ifndef Py_LIMITED_API +/* Py_tracefunc return -1 when raising an exception, or 0 for success. */ +typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *); + +/* The following values are used for 'what' for tracefunc functions + * + * To add a new kind of trace event, also update "trace_init" in + * Python/sysmodule.c to define the Python level event name + */ +#define PyTrace_CALL 0 +#define PyTrace_EXCEPTION 1 +#define PyTrace_LINE 2 +#define PyTrace_RETURN 3 +#define PyTrace_C_CALL 4 +#define PyTrace_C_EXCEPTION 5 +#define PyTrace_C_RETURN 6 +#define PyTrace_OPCODE 7 +#endif /* Py_LIMITED_API */ + +#ifdef Py_LIMITED_API +typedef struct _ts PyThreadState; +#else + +typedef struct _err_stackitem { + /* This struct represents an entry on the exception stack, which is a + * per-coroutine state. (Coroutine in the computer science sense, + * including the thread and generators). + * This ensures that the exception state is not impacted by "yields" + * from an except handler. + */ + PyObject *exc_type, *exc_value, *exc_traceback; + + struct _err_stackitem *previous_item; + +} _PyErr_StackItem; + + +typedef struct _ts { + /* See Python/ceval.c for comments explaining most fields */ + + struct _ts *prev; + struct _ts *next; + PyInterpreterState *interp; + + struct _frame *frame; + int recursion_depth; + char overflowed; /* The stack has overflowed. Allow 50 more calls + to handle the runtime error. */ + char recursion_critical; /* The current calls must not cause + a stack overflow. */ + int stackcheck_counter; + + /* 'tracing' keeps track of the execution depth when tracing/profiling. + This is to prevent the actual trace/profile code from being recorded in + the trace/profile. */ + int tracing; + int use_tracing; + + Py_tracefunc c_profilefunc; + Py_tracefunc c_tracefunc; + PyObject *c_profileobj; + PyObject *c_traceobj; + + /* The exception currently being raised */ + PyObject *curexc_type; + PyObject *curexc_value; + PyObject *curexc_traceback; + + /* The exception currently being handled, if no coroutines/generators + * are present. Always last element on the stack referred to be exc_info. + */ + _PyErr_StackItem exc_state; + + /* Pointer to the top of the stack of the exceptions currently + * being handled */ + _PyErr_StackItem *exc_info; + + PyObject *dict; /* Stores per-thread state */ + + int gilstate_counter; + + PyObject *async_exc; /* Asynchronous exception to raise */ + unsigned long thread_id; /* Thread id where this tstate was created */ + + int trash_delete_nesting; + PyObject *trash_delete_later; + + /* Called when a thread state is deleted normally, but not when it + * is destroyed after fork(). + * Pain: to prevent rare but fatal shutdown errors (issue 18808), + * Thread.join() must wait for the join'ed thread's tstate to be unlinked + * from the tstate chain. That happens at the end of a thread's life, + * in pystate.c. + * The obvious way doesn't quite work: create a lock which the tstate + * unlinking code releases, and have Thread.join() wait to acquire that + * lock. The problem is that we _are_ at the end of the thread's life: + * if the thread holds the last reference to the lock, decref'ing the + * lock will delete the lock, and that may trigger arbitrary Python code + * if there's a weakref, with a callback, to the lock. But by this time + * _PyThreadState_Current is already NULL, so only the simplest of C code + * can be allowed to run (in particular it must not be possible to + * release the GIL). + * So instead of holding the lock directly, the tstate holds a weakref to + * the lock: that's the value of on_delete_data below. Decref'ing a + * weakref is harmless. + * on_delete points to _threadmodule.c's static release_sentinel() function. + * After the tstate is unlinked, release_sentinel is called with the + * weakref-to-lock (on_delete_data) argument, and release_sentinel releases + * the indirectly held lock. + */ + void (*on_delete)(void *); + void *on_delete_data; + + int coroutine_origin_tracking_depth; + + PyObject *coroutine_wrapper; + int in_coroutine_wrapper; + + PyObject *async_gen_firstiter; + PyObject *async_gen_finalizer; + + PyObject *context; + uint64_t context_ver; + + /* Unique thread state id. */ + uint64_t id; + + /* XXX signal handlers should also be here */ + +} PyThreadState; +#endif /* !Py_LIMITED_API */ + + +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void); +PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *); +PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 +/* New in 3.7 */ +PyAPI_FUNC(int64_t) PyInterpreterState_GetID(PyInterpreterState *); +#endif +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyState_AddModule(PyObject*, struct PyModuleDef*); +#endif /* !Py_LIMITED_API */ +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* New in 3.3 */ +PyAPI_FUNC(int) PyState_AddModule(PyObject*, struct PyModuleDef*); +PyAPI_FUNC(int) PyState_RemoveModule(struct PyModuleDef*); +#endif +PyAPI_FUNC(PyObject*) PyState_FindModule(struct PyModuleDef*); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyState_ClearModules(void); +#endif + +PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *); +PyAPI_FUNC(void) _PyThreadState_Init(PyThreadState *); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *); +PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyThreadState_DeleteExcept(PyThreadState *tstate); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyGILState_Reinit(void); +#endif /* !Py_LIMITED_API */ + +/* Return the current thread state. The global interpreter lock must be held. + * When the current thread state is NULL, this issues a fatal error (so that + * the caller needn't check for NULL). */ +PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void); + +#ifndef Py_LIMITED_API +/* Similar to PyThreadState_Get(), but don't issue a fatal error + * if it is NULL. */ +PyAPI_FUNC(PyThreadState *) _PyThreadState_UncheckedGet(void); +#endif /* !Py_LIMITED_API */ + +PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *); +PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void); +PyAPI_FUNC(int) PyThreadState_SetAsyncExc(unsigned long, PyObject *); + + +/* Variable and macro for in-line access to current thread state */ + +/* Assuming the current thread holds the GIL, this is the + PyThreadState for the current thread. */ +#ifdef Py_BUILD_CORE +# define _PyThreadState_Current _PyRuntime.gilstate.tstate_current +# define PyThreadState_GET() \ + ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current)) +#else +# define PyThreadState_GET() PyThreadState_Get() +#endif + +typedef + enum {PyGILState_LOCKED, PyGILState_UNLOCKED} + PyGILState_STATE; + + +/* Ensure that the current thread is ready to call the Python + C API, regardless of the current state of Python, or of its + thread lock. This may be called as many times as desired + by a thread so long as each call is matched with a call to + PyGILState_Release(). In general, other thread-state APIs may + be used between _Ensure() and _Release() calls, so long as the + thread-state is restored to its previous state before the Release(). + For example, normal use of the Py_BEGIN_ALLOW_THREADS/ + Py_END_ALLOW_THREADS macros are acceptable. + + The return value is an opaque "handle" to the thread state when + PyGILState_Ensure() was called, and must be passed to + PyGILState_Release() to ensure Python is left in the same state. Even + though recursive calls are allowed, these handles can *not* be shared - + each unique call to PyGILState_Ensure must save the handle for its + call to PyGILState_Release. + + When the function returns, the current thread will hold the GIL. + + Failure is a fatal error. +*/ +PyAPI_FUNC(PyGILState_STATE) PyGILState_Ensure(void); + +/* Release any resources previously acquired. After this call, Python's + state will be the same as it was prior to the corresponding + PyGILState_Ensure() call (but generally this state will be unknown to + the caller, hence the use of the GILState API.) + + Every call to PyGILState_Ensure must be matched by a call to + PyGILState_Release on the same thread. +*/ +PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE); + +/* Helper/diagnostic function - get the current thread state for + this thread. May return NULL if no GILState API has been used + on the current thread. Note that the main thread always has such a + thread-state, even if no auto-thread-state call has been made + on the main thread. +*/ +PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void); + +#ifndef Py_LIMITED_API +/* Helper/diagnostic function - return 1 if the current thread + currently holds the GIL, 0 otherwise. + + The function returns 1 if _PyGILState_check_enabled is non-zero. */ +PyAPI_FUNC(int) PyGILState_Check(void); + +/* Unsafe function to get the single PyInterpreterState used by this process' + GILState implementation. + + Return NULL before _PyGILState_Init() is called and after _PyGILState_Fini() + is called. */ +PyAPI_FUNC(PyInterpreterState *) _PyGILState_GetInterpreterStateUnsafe(void); +#endif /* !Py_LIMITED_API */ + + +/* The implementation of sys._current_frames() Returns a dict mapping + thread id to that thread's current frame. +*/ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyThread_CurrentFrames(void); +#endif + +/* Routines for advanced debuggers, requested by David Beazley. + Don't use unless you know what you are doing! */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Main(void); +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void); +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *); +PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *); +PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *); + +typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYSTATE_H */ diff --git a/venv/Include/pystrcmp.h b/venv/Include/pystrcmp.h new file mode 100644 index 00000000..edb12397 --- /dev/null +++ b/venv/Include/pystrcmp.h @@ -0,0 +1,23 @@ +#ifndef Py_STRCMP_H +#define Py_STRCMP_H + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(int) PyOS_mystrnicmp(const char *, const char *, Py_ssize_t); +PyAPI_FUNC(int) PyOS_mystricmp(const char *, const char *); + +#ifdef MS_WINDOWS +#define PyOS_strnicmp strnicmp +#define PyOS_stricmp stricmp +#else +#define PyOS_strnicmp PyOS_mystrnicmp +#define PyOS_stricmp PyOS_mystricmp +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_STRCMP_H */ diff --git a/venv/Include/pystrhex.h b/venv/Include/pystrhex.h new file mode 100644 index 00000000..66a30e22 --- /dev/null +++ b/venv/Include/pystrhex.h @@ -0,0 +1,19 @@ +#ifndef Py_STRHEX_H +#define Py_STRHEX_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +/* Returns a str() containing the hex representation of argbuf. */ +PyAPI_FUNC(PyObject*) _Py_strhex(const char* argbuf, const Py_ssize_t arglen); +/* Returns a bytes() containing the ASCII hex representation of argbuf. */ +PyAPI_FUNC(PyObject*) _Py_strhex_bytes(const char* argbuf, const Py_ssize_t arglen); +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_STRHEX_H */ diff --git a/venv/Include/pystrtod.h b/venv/Include/pystrtod.h new file mode 100644 index 00000000..c1e84de6 --- /dev/null +++ b/venv/Include/pystrtod.h @@ -0,0 +1,45 @@ +#ifndef Py_STRTOD_H +#define Py_STRTOD_H + +#ifdef __cplusplus +extern "C" { +#endif + + +PyAPI_FUNC(double) PyOS_string_to_double(const char *str, + char **endptr, + PyObject *overflow_exception); + +/* The caller is responsible for calling PyMem_Free to free the buffer + that's is returned. */ +PyAPI_FUNC(char *) PyOS_double_to_string(double val, + char format_code, + int precision, + int flags, + int *type); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _Py_string_to_number_with_underscores( + const char *str, Py_ssize_t len, const char *what, PyObject *obj, void *arg, + PyObject *(*innerfunc)(const char *, Py_ssize_t, void *)); + +PyAPI_FUNC(double) _Py_parse_inf_or_nan(const char *p, char **endptr); +#endif + + +/* PyOS_double_to_string's "flags" parameter can be set to 0 or more of: */ +#define Py_DTSF_SIGN 0x01 /* always add the sign */ +#define Py_DTSF_ADD_DOT_0 0x02 /* if the result is an integer add ".0" */ +#define Py_DTSF_ALT 0x04 /* "alternate" formatting. it's format_code + specific */ + +/* PyOS_double_to_string's "type", if non-NULL, will be set to one of: */ +#define Py_DTST_FINITE 0 +#define Py_DTST_INFINITE 1 +#define Py_DTST_NAN 2 + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_STRTOD_H */ diff --git a/venv/Include/pythonrun.h b/venv/Include/pythonrun.h new file mode 100644 index 00000000..6f0c6fc6 --- /dev/null +++ b/venv/Include/pythonrun.h @@ -0,0 +1,181 @@ + +/* Interfaces to parse and execute pieces of python code */ + +#ifndef Py_PYTHONRUN_H +#define Py_PYTHONRUN_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_AnyFileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int closeit, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_SimpleFileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int closeit, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveOneFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveOneObject( + FILE *fp, + PyObject *filename, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveLoopFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags); + +PyAPI_FUNC(struct _mod *) PyParser_ASTFromString( + const char *s, + const char *filename, /* decoded from the filesystem encoding */ + int start, + PyCompilerFlags *flags, + PyArena *arena); +PyAPI_FUNC(struct _mod *) PyParser_ASTFromStringObject( + const char *s, + PyObject *filename, + int start, + PyCompilerFlags *flags, + PyArena *arena); +PyAPI_FUNC(struct _mod *) PyParser_ASTFromFile( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + const char* enc, + int start, + const char *ps1, + const char *ps2, + PyCompilerFlags *flags, + int *errcode, + PyArena *arena); +PyAPI_FUNC(struct _mod *) PyParser_ASTFromFileObject( + FILE *fp, + PyObject *filename, + const char* enc, + int start, + const char *ps1, + const char *ps2, + PyCompilerFlags *flags, + int *errcode, + PyArena *arena); +#endif + +#ifndef PyParser_SimpleParseString +#define PyParser_SimpleParseString(S, B) \ + PyParser_SimpleParseStringFlags(S, B, 0) +#define PyParser_SimpleParseFile(FP, S, B) \ + PyParser_SimpleParseFileFlags(FP, S, B, 0) +#endif +PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlags(const char *, int, + int); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlagsFilename(const char *, + const char *, + int, int); +#endif +PyAPI_FUNC(struct _node *) PyParser_SimpleParseFileFlags(FILE *, const char *, + int, int); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *, + PyObject *, PyCompilerFlags *); + +PyAPI_FUNC(PyObject *) PyRun_FileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int start, + PyObject *globals, + PyObject *locals, + int closeit, + PyCompilerFlags *flags); +#endif + +#ifdef Py_LIMITED_API +PyAPI_FUNC(PyObject *) Py_CompileString(const char *, const char *, int); +#else +#define Py_CompileString(str, p, s) Py_CompileStringExFlags(str, p, s, NULL, -1) +#define Py_CompileStringFlags(str, p, s, f) Py_CompileStringExFlags(str, p, s, f, -1) +PyAPI_FUNC(PyObject *) Py_CompileStringExFlags( + const char *str, + const char *filename, /* decoded from the filesystem encoding */ + int start, + PyCompilerFlags *flags, + int optimize); +PyAPI_FUNC(PyObject *) Py_CompileStringObject( + const char *str, + PyObject *filename, int start, + PyCompilerFlags *flags, + int optimize); +#endif +PyAPI_FUNC(struct symtable *) Py_SymtableString( + const char *str, + const char *filename, /* decoded from the filesystem encoding */ + int start); +#ifndef Py_LIMITED_API +PyAPI_FUNC(struct symtable *) Py_SymtableStringObject( + const char *str, + PyObject *filename, + int start); +#endif + +PyAPI_FUNC(void) PyErr_Print(void); +PyAPI_FUNC(void) PyErr_PrintEx(int); +PyAPI_FUNC(void) PyErr_Display(PyObject *, PyObject *, PyObject *); + +#ifndef Py_LIMITED_API +/* Use macros for a bunch of old variants */ +#define PyRun_String(str, s, g, l) PyRun_StringFlags(str, s, g, l, NULL) +#define PyRun_AnyFile(fp, name) PyRun_AnyFileExFlags(fp, name, 0, NULL) +#define PyRun_AnyFileEx(fp, name, closeit) \ + PyRun_AnyFileExFlags(fp, name, closeit, NULL) +#define PyRun_AnyFileFlags(fp, name, flags) \ + PyRun_AnyFileExFlags(fp, name, 0, flags) +#define PyRun_SimpleString(s) PyRun_SimpleStringFlags(s, NULL) +#define PyRun_SimpleFile(f, p) PyRun_SimpleFileExFlags(f, p, 0, NULL) +#define PyRun_SimpleFileEx(f, p, c) PyRun_SimpleFileExFlags(f, p, c, NULL) +#define PyRun_InteractiveOne(f, p) PyRun_InteractiveOneFlags(f, p, NULL) +#define PyRun_InteractiveLoop(f, p) PyRun_InteractiveLoopFlags(f, p, NULL) +#define PyRun_File(fp, p, s, g, l) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, NULL) +#define PyRun_FileEx(fp, p, s, g, l, c) \ + PyRun_FileExFlags(fp, p, s, g, l, c, NULL) +#define PyRun_FileFlags(fp, p, s, g, l, flags) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, flags) +#endif + +/* Stuff with no proper home (yet) */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(char *) PyOS_Readline(FILE *, FILE *, const char *); +#endif +PyAPI_DATA(int) (*PyOS_InputHook)(void); +PyAPI_DATA(char) *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *); +#ifndef Py_LIMITED_API +PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; +#endif + +/* Stack size, in "pointers" (so we get extra safety margins + on 64-bit platforms). On a 32-bit platform, this translates + to an 8k margin. */ +#define PYOS_STACK_MARGIN 2048 + +#if defined(WIN32) && !defined(MS_WIN64) && defined(_MSC_VER) && _MSC_VER >= 1300 +/* Enable stack checking under Microsoft C */ +#define USE_STACKCHECK +#endif + +#ifdef USE_STACKCHECK +/* Check that we aren't overflowing our stack */ +PyAPI_FUNC(int) PyOS_CheckStack(void); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYTHONRUN_H */ diff --git a/venv/Include/pythread.h b/venv/Include/pythread.h new file mode 100644 index 00000000..eb61033b --- /dev/null +++ b/venv/Include/pythread.h @@ -0,0 +1,155 @@ + +#ifndef Py_PYTHREAD_H +#define Py_PYTHREAD_H + +typedef void *PyThread_type_lock; +typedef void *PyThread_type_sema; + +#ifdef __cplusplus +extern "C" { +#endif + +/* Return status codes for Python lock acquisition. Chosen for maximum + * backwards compatibility, ie failure -> 0, success -> 1. */ +typedef enum PyLockStatus { + PY_LOCK_FAILURE = 0, + PY_LOCK_ACQUIRED = 1, + PY_LOCK_INTR +} PyLockStatus; + +#ifndef Py_LIMITED_API +#define PYTHREAD_INVALID_THREAD_ID ((unsigned long)-1) +#endif + +PyAPI_FUNC(void) PyThread_init_thread(void); +PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); +PyAPI_FUNC(void) PyThread_exit_thread(void); +PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); + +PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void); +PyAPI_FUNC(void) PyThread_free_lock(PyThread_type_lock); +PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int); +#define WAIT_LOCK 1 +#define NOWAIT_LOCK 0 + +/* PY_TIMEOUT_T is the integral type used to specify timeouts when waiting + on a lock (see PyThread_acquire_lock_timed() below). + PY_TIMEOUT_MAX is the highest usable value (in microseconds) of that + type, and depends on the system threading API. + + NOTE: this isn't the same value as `_thread.TIMEOUT_MAX`. The _thread + module exposes a higher-level API, with timeouts expressed in seconds + and floating-point numbers allowed. +*/ +#define PY_TIMEOUT_T long long + +#if defined(_POSIX_THREADS) + /* PyThread_acquire_lock_timed() uses _PyTime_FromNanoseconds(us * 1000), + convert microseconds to nanoseconds. */ +# define PY_TIMEOUT_MAX (PY_LLONG_MAX / 1000) +#elif defined (NT_THREADS) + /* In the NT API, the timeout is a DWORD and is expressed in milliseconds */ +# if 0xFFFFFFFFLL * 1000 < PY_LLONG_MAX +# define PY_TIMEOUT_MAX (0xFFFFFFFFLL * 1000) +# else +# define PY_TIMEOUT_MAX PY_LLONG_MAX +# endif +#else +# define PY_TIMEOUT_MAX PY_LLONG_MAX +#endif + + +/* If microseconds == 0, the call is non-blocking: it returns immediately + even when the lock can't be acquired. + If microseconds > 0, the call waits up to the specified duration. + If microseconds < 0, the call waits until success (or abnormal failure) + + microseconds must be less than PY_TIMEOUT_MAX. Behaviour otherwise is + undefined. + + If intr_flag is true and the acquire is interrupted by a signal, then the + call will return PY_LOCK_INTR. The caller may reattempt to acquire the + lock. +*/ +PyAPI_FUNC(PyLockStatus) PyThread_acquire_lock_timed(PyThread_type_lock, + PY_TIMEOUT_T microseconds, + int intr_flag); + +PyAPI_FUNC(void) PyThread_release_lock(PyThread_type_lock); + +PyAPI_FUNC(size_t) PyThread_get_stacksize(void); +PyAPI_FUNC(int) PyThread_set_stacksize(size_t); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyThread_GetInfo(void); +#endif + + +/* Thread Local Storage (TLS) API + TLS API is DEPRECATED. Use Thread Specific Storage (TSS) API. + + The existing TLS API has used int to represent TLS keys across all + platforms, but it is not POSIX-compliant. Therefore, the new TSS API uses + opaque data type to represent TSS keys to be compatible (see PEP 539). +*/ +PyAPI_FUNC(int) PyThread_create_key(void) Py_DEPRECATED(3.7); +PyAPI_FUNC(void) PyThread_delete_key(int key) Py_DEPRECATED(3.7); +PyAPI_FUNC(int) PyThread_set_key_value(int key, void *value) Py_DEPRECATED(3.7); +PyAPI_FUNC(void *) PyThread_get_key_value(int key) Py_DEPRECATED(3.7); +PyAPI_FUNC(void) PyThread_delete_key_value(int key) Py_DEPRECATED(3.7); + +/* Cleanup after a fork */ +PyAPI_FUNC(void) PyThread_ReInitTLS(void) Py_DEPRECATED(3.7); + + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 +/* New in 3.7 */ +/* Thread Specific Storage (TSS) API */ + +typedef struct _Py_tss_t Py_tss_t; /* opaque */ + +#ifndef Py_LIMITED_API +#if defined(_POSIX_THREADS) + /* Darwin needs pthread.h to know type name the pthread_key_t. */ +# include +# define NATIVE_TSS_KEY_T pthread_key_t +#elif defined(NT_THREADS) + /* In Windows, native TSS key type is DWORD, + but hardcode the unsigned long to avoid errors for include directive. + */ +# define NATIVE_TSS_KEY_T unsigned long +#else +# error "Require native threads. See https://bugs.python.org/issue31370" +#endif + +/* When Py_LIMITED_API is not defined, the type layout of Py_tss_t is + exposed to allow static allocation in the API clients. Even in this case, + you must handle TSS keys through API functions due to compatibility. +*/ +struct _Py_tss_t { + int _is_initialized; + NATIVE_TSS_KEY_T _key; +}; + +#undef NATIVE_TSS_KEY_T + +/* When static allocation, you must initialize with Py_tss_NEEDS_INIT. */ +#define Py_tss_NEEDS_INIT {0} +#endif /* !Py_LIMITED_API */ + +PyAPI_FUNC(Py_tss_t *) PyThread_tss_alloc(void); +PyAPI_FUNC(void) PyThread_tss_free(Py_tss_t *key); + +/* The parameter key must not be NULL. */ +PyAPI_FUNC(int) PyThread_tss_is_created(Py_tss_t *key); +PyAPI_FUNC(int) PyThread_tss_create(Py_tss_t *key); +PyAPI_FUNC(void) PyThread_tss_delete(Py_tss_t *key); +PyAPI_FUNC(int) PyThread_tss_set(Py_tss_t *key, void *value); +PyAPI_FUNC(void *) PyThread_tss_get(Py_tss_t *key); +#endif /* New in 3.7 */ + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYTHREAD_H */ diff --git a/venv/Include/pytime.h b/venv/Include/pytime.h new file mode 100644 index 00000000..4870a9df --- /dev/null +++ b/venv/Include/pytime.h @@ -0,0 +1,246 @@ +#ifndef Py_LIMITED_API +#ifndef Py_PYTIME_H +#define Py_PYTIME_H + +#include "pyconfig.h" /* include for defines */ +#include "object.h" + +/************************************************************************** +Symbols and macros to supply platform-independent interfaces to time related +functions and constants +**************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif + +/* _PyTime_t: Python timestamp with subsecond precision. It can be used to + store a duration, and so indirectly a date (related to another date, like + UNIX epoch). */ +typedef int64_t _PyTime_t; +#define _PyTime_MIN PY_LLONG_MIN +#define _PyTime_MAX PY_LLONG_MAX + +typedef enum { + /* Round towards minus infinity (-inf). + For example, used to read a clock. */ + _PyTime_ROUND_FLOOR=0, + /* Round towards infinity (+inf). + For example, used for timeout to wait "at least" N seconds. */ + _PyTime_ROUND_CEILING=1, + /* Round to nearest with ties going to nearest even integer. + For example, used to round from a Python float. */ + _PyTime_ROUND_HALF_EVEN=2, + /* Round away from zero + For example, used for timeout. _PyTime_ROUND_CEILING rounds + -1e-9 to 0 milliseconds which causes bpo-31786 issue. + _PyTime_ROUND_UP rounds -1e-9 to -1 millisecond which keeps + the timeout sign as expected. select.poll(timeout) must block + for negative values." */ + _PyTime_ROUND_UP=3, + /* _PyTime_ROUND_TIMEOUT (an alias for _PyTime_ROUND_UP) should be + used for timeouts. */ + _PyTime_ROUND_TIMEOUT = _PyTime_ROUND_UP +} _PyTime_round_t; + + +/* Convert a time_t to a PyLong. */ +PyAPI_FUNC(PyObject *) _PyLong_FromTime_t( + time_t sec); + +/* Convert a PyLong to a time_t. */ +PyAPI_FUNC(time_t) _PyLong_AsTime_t( + PyObject *obj); + +/* Convert a number of seconds, int or float, to time_t. */ +PyAPI_FUNC(int) _PyTime_ObjectToTime_t( + PyObject *obj, + time_t *sec, + _PyTime_round_t); + +/* Convert a number of seconds, int or float, to a timeval structure. + usec is in the range [0; 999999] and rounded towards zero. + For example, -1.2 is converted to (-2, 800000). */ +PyAPI_FUNC(int) _PyTime_ObjectToTimeval( + PyObject *obj, + time_t *sec, + long *usec, + _PyTime_round_t); + +/* Convert a number of seconds, int or float, to a timespec structure. + nsec is in the range [0; 999999999] and rounded towards zero. + For example, -1.2 is converted to (-2, 800000000). */ +PyAPI_FUNC(int) _PyTime_ObjectToTimespec( + PyObject *obj, + time_t *sec, + long *nsec, + _PyTime_round_t); + + +/* Create a timestamp from a number of seconds. */ +PyAPI_FUNC(_PyTime_t) _PyTime_FromSeconds(int seconds); + +/* Macro to create a timestamp from a number of seconds, no integer overflow. + Only use the macro for small values, prefer _PyTime_FromSeconds(). */ +#define _PYTIME_FROMSECONDS(seconds) \ + ((_PyTime_t)(seconds) * (1000 * 1000 * 1000)) + +/* Create a timestamp from a number of nanoseconds. */ +PyAPI_FUNC(_PyTime_t) _PyTime_FromNanoseconds(_PyTime_t ns); + +/* Create a timestamp from nanoseconds (Python int). */ +PyAPI_FUNC(int) _PyTime_FromNanosecondsObject(_PyTime_t *t, + PyObject *obj); + +/* Convert a number of seconds (Python float or int) to a timetamp. + Raise an exception and return -1 on error, return 0 on success. */ +PyAPI_FUNC(int) _PyTime_FromSecondsObject(_PyTime_t *t, + PyObject *obj, + _PyTime_round_t round); + +/* Convert a number of milliseconds (Python float or int, 10^-3) to a timetamp. + Raise an exception and return -1 on error, return 0 on success. */ +PyAPI_FUNC(int) _PyTime_FromMillisecondsObject(_PyTime_t *t, + PyObject *obj, + _PyTime_round_t round); + +/* Convert a timestamp to a number of seconds as a C double. */ +PyAPI_FUNC(double) _PyTime_AsSecondsDouble(_PyTime_t t); + +/* Convert timestamp to a number of milliseconds (10^-3 seconds). */ +PyAPI_FUNC(_PyTime_t) _PyTime_AsMilliseconds(_PyTime_t t, + _PyTime_round_t round); + +/* Convert timestamp to a number of microseconds (10^-6 seconds). */ +PyAPI_FUNC(_PyTime_t) _PyTime_AsMicroseconds(_PyTime_t t, + _PyTime_round_t round); + +/* Convert timestamp to a number of nanoseconds (10^-9 seconds) as a Python int + object. */ +PyAPI_FUNC(PyObject *) _PyTime_AsNanosecondsObject(_PyTime_t t); + +/* Create a timestamp from a timeval structure. + Raise an exception and return -1 on overflow, return 0 on success. */ +PyAPI_FUNC(int) _PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv); + +/* Convert a timestamp to a timeval structure (microsecond resolution). + tv_usec is always positive. + Raise an exception and return -1 if the conversion overflowed, + return 0 on success. */ +PyAPI_FUNC(int) _PyTime_AsTimeval(_PyTime_t t, + struct timeval *tv, + _PyTime_round_t round); + +/* Similar to _PyTime_AsTimeval(), but don't raise an exception on error. */ +PyAPI_FUNC(int) _PyTime_AsTimeval_noraise(_PyTime_t t, + struct timeval *tv, + _PyTime_round_t round); + +/* Convert a timestamp to a number of seconds (secs) and microseconds (us). + us is always positive. This function is similar to _PyTime_AsTimeval() + except that secs is always a time_t type, whereas the timeval structure + uses a C long for tv_sec on Windows. + Raise an exception and return -1 if the conversion overflowed, + return 0 on success. */ +PyAPI_FUNC(int) _PyTime_AsTimevalTime_t( + _PyTime_t t, + time_t *secs, + int *us, + _PyTime_round_t round); + +#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE) +/* Create a timestamp from a timespec structure. + Raise an exception and return -1 on overflow, return 0 on success. */ +PyAPI_FUNC(int) _PyTime_FromTimespec(_PyTime_t *tp, struct timespec *ts); + +/* Convert a timestamp to a timespec structure (nanosecond resolution). + tv_nsec is always positive. + Raise an exception and return -1 on error, return 0 on success. */ +PyAPI_FUNC(int) _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts); +#endif + +/* Compute ticks * mul / div. + The caller must ensure that ((div - 1) * mul) cannot overflow. */ +PyAPI_FUNC(_PyTime_t) _PyTime_MulDiv(_PyTime_t ticks, + _PyTime_t mul, + _PyTime_t div); + +/* Get the current time from the system clock. + + The function cannot fail. _PyTime_Init() ensures that the system clock + works. */ +PyAPI_FUNC(_PyTime_t) _PyTime_GetSystemClock(void); + +/* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. + The clock is not affected by system clock updates. The reference point of + the returned value is undefined, so that only the difference between the + results of consecutive calls is valid. + + The function cannot fail. _PyTime_Init() ensures that a monotonic clock + is available and works. */ +PyAPI_FUNC(_PyTime_t) _PyTime_GetMonotonicClock(void); + + +/* Structure used by time.get_clock_info() */ +typedef struct { + const char *implementation; + int monotonic; + int adjustable; + double resolution; +} _Py_clock_info_t; + +/* Get the current time from the system clock. + * Fill clock information if info is not NULL. + * Raise an exception and return -1 on error, return 0 on success. + */ +PyAPI_FUNC(int) _PyTime_GetSystemClockWithInfo( + _PyTime_t *t, + _Py_clock_info_t *info); + +/* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. + The clock is not affected by system clock updates. The reference point of + the returned value is undefined, so that only the difference between the + results of consecutive calls is valid. + + Fill info (if set) with information of the function used to get the time. + + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_GetMonotonicClockWithInfo( + _PyTime_t *t, + _Py_clock_info_t *info); + + +/* Initialize time. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_Init(void); + +/* Converts a timestamp to the Gregorian time, using the local time zone. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_localtime(time_t t, struct tm *tm); + +/* Converts a timestamp to the Gregorian time, assuming UTC. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_gmtime(time_t t, struct tm *tm); + +/* Get the performance counter: clock with the highest available resolution to + measure a short duration. + + The function cannot fail. _PyTime_Init() ensures that the system clock + works. */ +PyAPI_FUNC(_PyTime_t) _PyTime_GetPerfCounter(void); + +/* Get the performance counter: clock with the highest available resolution to + measure a short duration. + + Fill info (if set) with information of the function used to get the time. + + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_GetPerfCounterWithInfo( + _PyTime_t *t, + _Py_clock_info_t *info); + +#ifdef __cplusplus +} +#endif + +#endif /* Py_PYTIME_H */ +#endif /* Py_LIMITED_API */ diff --git a/venv/Include/rangeobject.h b/venv/Include/rangeobject.h new file mode 100644 index 00000000..7e4dc288 --- /dev/null +++ b/venv/Include/rangeobject.h @@ -0,0 +1,27 @@ + +/* Range object interface */ + +#ifndef Py_RANGEOBJECT_H +#define Py_RANGEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* +A range object represents an integer range. This is an immutable object; +a range cannot change its value after creation. + +Range objects behave like the corresponding tuple objects except that +they are represented by a start, stop, and step datamembers. +*/ + +PyAPI_DATA(PyTypeObject) PyRange_Type; +PyAPI_DATA(PyTypeObject) PyRangeIter_Type; +PyAPI_DATA(PyTypeObject) PyLongRangeIter_Type; + +#define PyRange_Check(op) (Py_TYPE(op) == &PyRange_Type) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_RANGEOBJECT_H */ diff --git a/venv/Include/setobject.h b/venv/Include/setobject.h new file mode 100644 index 00000000..fc0ea839 --- /dev/null +++ b/venv/Include/setobject.h @@ -0,0 +1,108 @@ +/* Set object interface */ + +#ifndef Py_SETOBJECT_H +#define Py_SETOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API + +/* There are three kinds of entries in the table: + +1. Unused: key == NULL and hash == 0 +2. Dummy: key == dummy and hash == -1 +3. Active: key != NULL and key != dummy and hash != -1 + +The hash field of Unused slots is always zero. + +The hash field of Dummy slots are set to -1 +meaning that dummy entries can be detected by +either entry->key==dummy or by entry->hash==-1. +*/ + +#define PySet_MINSIZE 8 + +typedef struct { + PyObject *key; + Py_hash_t hash; /* Cached hash code of the key */ +} setentry; + +/* The SetObject data structure is shared by set and frozenset objects. + +Invariant for sets: + - hash is -1 + +Invariants for frozensets: + - data is immutable. + - hash is the hash of the frozenset or -1 if not computed yet. + +*/ + +typedef struct { + PyObject_HEAD + + Py_ssize_t fill; /* Number active and dummy entries*/ + Py_ssize_t used; /* Number active entries */ + + /* The table contains mask + 1 slots, and that's a power of 2. + * We store the mask instead of the size because the mask is more + * frequently needed. + */ + Py_ssize_t mask; + + /* The table points to a fixed-size smalltable for small tables + * or to additional malloc'ed memory for bigger tables. + * The table pointer is never NULL which saves us from repeated + * runtime null-tests. + */ + setentry *table; + Py_hash_t hash; /* Only used by frozenset objects */ + Py_ssize_t finger; /* Search finger for pop() */ + + setentry smalltable[PySet_MINSIZE]; + PyObject *weakreflist; /* List of weak references */ +} PySetObject; + +#define PySet_GET_SIZE(so) (assert(PyAnySet_Check(so)),(((PySetObject *)(so))->used)) + +PyAPI_DATA(PyObject *) _PySet_Dummy; + +PyAPI_FUNC(int) _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, Py_hash_t *hash); +PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable); +PyAPI_FUNC(int) PySet_ClearFreeList(void); + +#endif /* Section excluded by Py_LIMITED_API */ + +PyAPI_DATA(PyTypeObject) PySet_Type; +PyAPI_DATA(PyTypeObject) PyFrozenSet_Type; +PyAPI_DATA(PyTypeObject) PySetIter_Type; + +PyAPI_FUNC(PyObject *) PySet_New(PyObject *); +PyAPI_FUNC(PyObject *) PyFrozenSet_New(PyObject *); + +PyAPI_FUNC(int) PySet_Add(PyObject *set, PyObject *key); +PyAPI_FUNC(int) PySet_Clear(PyObject *set); +PyAPI_FUNC(int) PySet_Contains(PyObject *anyset, PyObject *key); +PyAPI_FUNC(int) PySet_Discard(PyObject *set, PyObject *key); +PyAPI_FUNC(PyObject *) PySet_Pop(PyObject *set); +PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset); + +#define PyFrozenSet_CheckExact(ob) (Py_TYPE(ob) == &PyFrozenSet_Type) +#define PyAnySet_CheckExact(ob) \ + (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type) +#define PyAnySet_Check(ob) \ + (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PySet_Type) || \ + PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) +#define PySet_Check(ob) \ + (Py_TYPE(ob) == &PySet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PySet_Type)) +#define PyFrozenSet_Check(ob) \ + (Py_TYPE(ob) == &PyFrozenSet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SETOBJECT_H */ diff --git a/venv/Include/sliceobject.h b/venv/Include/sliceobject.h new file mode 100644 index 00000000..c238b099 --- /dev/null +++ b/venv/Include/sliceobject.h @@ -0,0 +1,63 @@ +#ifndef Py_SLICEOBJECT_H +#define Py_SLICEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* The unique ellipsis object "..." */ + +PyAPI_DATA(PyObject) _Py_EllipsisObject; /* Don't use this directly */ + +#define Py_Ellipsis (&_Py_EllipsisObject) + +/* Slice object interface */ + +/* + +A slice object containing start, stop, and step data members (the +names are from range). After much talk with Guido, it was decided to +let these be any arbitrary python type. Py_None stands for omitted values. +*/ +#ifndef Py_LIMITED_API +typedef struct { + PyObject_HEAD + PyObject *start, *stop, *step; /* not NULL */ +} PySliceObject; +#endif + +PyAPI_DATA(PyTypeObject) PySlice_Type; +PyAPI_DATA(PyTypeObject) PyEllipsis_Type; + +#define PySlice_Check(op) (Py_TYPE(op) == &PySlice_Type) + +PyAPI_FUNC(PyObject *) PySlice_New(PyObject* start, PyObject* stop, + PyObject* step); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PySlice_FromIndices(Py_ssize_t start, Py_ssize_t stop); +PyAPI_FUNC(int) _PySlice_GetLongIndices(PySliceObject *self, PyObject *length, + PyObject **start_ptr, PyObject **stop_ptr, + PyObject **step_ptr); +#endif +PyAPI_FUNC(int) PySlice_GetIndices(PyObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); +PyAPI_FUNC(int) PySlice_GetIndicesEx(PyObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, + Py_ssize_t *step, Py_ssize_t *slicelength) Py_DEPRECATED(3.7); + +#if !defined(Py_LIMITED_API) || (Py_LIMITED_API+0 >= 0x03050400 && Py_LIMITED_API+0 < 0x03060000) || Py_LIMITED_API+0 >= 0x03060100 +#define PySlice_GetIndicesEx(slice, length, start, stop, step, slicelen) ( \ + PySlice_Unpack((slice), (start), (stop), (step)) < 0 ? \ + ((*(slicelen) = 0), -1) : \ + ((*(slicelen) = PySlice_AdjustIndices((length), (start), (stop), *(step))), \ + 0)) +PyAPI_FUNC(int) PySlice_Unpack(PyObject *slice, + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); +PyAPI_FUNC(Py_ssize_t) PySlice_AdjustIndices(Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, + Py_ssize_t step); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SLICEOBJECT_H */ diff --git a/venv/Include/structmember.h b/venv/Include/structmember.h new file mode 100644 index 00000000..b54f7081 --- /dev/null +++ b/venv/Include/structmember.h @@ -0,0 +1,74 @@ +#ifndef Py_STRUCTMEMBER_H +#define Py_STRUCTMEMBER_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Interface to map C struct members to Python object attributes */ + +#include /* For offsetof */ + +/* An array of PyMemberDef structures defines the name, type and offset + of selected members of a C structure. These can be read by + PyMember_GetOne() and set by PyMember_SetOne() (except if their READONLY + flag is set). The array must be terminated with an entry whose name + pointer is NULL. */ + +typedef struct PyMemberDef { + const char *name; + int type; + Py_ssize_t offset; + int flags; + const char *doc; +} PyMemberDef; + +/* Types */ +#define T_SHORT 0 +#define T_INT 1 +#define T_LONG 2 +#define T_FLOAT 3 +#define T_DOUBLE 4 +#define T_STRING 5 +#define T_OBJECT 6 +/* XXX the ordering here is weird for binary compatibility */ +#define T_CHAR 7 /* 1-character string */ +#define T_BYTE 8 /* 8-bit signed int */ +/* unsigned variants: */ +#define T_UBYTE 9 +#define T_USHORT 10 +#define T_UINT 11 +#define T_ULONG 12 + +/* Added by Jack: strings contained in the structure */ +#define T_STRING_INPLACE 13 + +/* Added by Lillo: bools contained in the structure (assumed char) */ +#define T_BOOL 14 + +#define T_OBJECT_EX 16 /* Like T_OBJECT, but raises AttributeError + when the value is NULL, instead of + converting to None. */ +#define T_LONGLONG 17 +#define T_ULONGLONG 18 + +#define T_PYSSIZET 19 /* Py_ssize_t */ +#define T_NONE 20 /* Value is always None */ + + +/* Flags */ +#define READONLY 1 +#define READ_RESTRICTED 2 +#define PY_WRITE_RESTRICTED 4 +#define RESTRICTED (READ_RESTRICTED | PY_WRITE_RESTRICTED) + + +/* Current API, use this */ +PyAPI_FUNC(PyObject *) PyMember_GetOne(const char *, struct PyMemberDef *); +PyAPI_FUNC(int) PyMember_SetOne(char *, struct PyMemberDef *, PyObject *); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_STRUCTMEMBER_H */ diff --git a/venv/Include/structseq.h b/venv/Include/structseq.h new file mode 100644 index 00000000..e5e5d5c5 --- /dev/null +++ b/venv/Include/structseq.h @@ -0,0 +1,49 @@ + +/* Named tuple object interface */ + +#ifndef Py_STRUCTSEQ_H +#define Py_STRUCTSEQ_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct PyStructSequence_Field { + const char *name; + const char *doc; +} PyStructSequence_Field; + +typedef struct PyStructSequence_Desc { + const char *name; + const char *doc; + struct PyStructSequence_Field *fields; + int n_in_sequence; +} PyStructSequence_Desc; + +extern char* PyStructSequence_UnnamedField; + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyStructSequence_InitType(PyTypeObject *type, + PyStructSequence_Desc *desc); +PyAPI_FUNC(int) PyStructSequence_InitType2(PyTypeObject *type, + PyStructSequence_Desc *desc); +#endif +PyAPI_FUNC(PyTypeObject*) PyStructSequence_NewType(PyStructSequence_Desc *desc); + +PyAPI_FUNC(PyObject *) PyStructSequence_New(PyTypeObject* type); + +#ifndef Py_LIMITED_API +typedef PyTupleObject PyStructSequence; + +/* Macro, *only* to be used to fill in brand new objects */ +#define PyStructSequence_SET_ITEM(op, i, v) PyTuple_SET_ITEM(op, i, v) + +#define PyStructSequence_GET_ITEM(op, i) PyTuple_GET_ITEM(op, i) +#endif + +PyAPI_FUNC(void) PyStructSequence_SetItem(PyObject*, Py_ssize_t, PyObject*); +PyAPI_FUNC(PyObject*) PyStructSequence_GetItem(PyObject*, Py_ssize_t); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_STRUCTSEQ_H */ diff --git a/venv/Include/symtable.h b/venv/Include/symtable.h new file mode 100644 index 00000000..007f88db --- /dev/null +++ b/venv/Include/symtable.h @@ -0,0 +1,118 @@ +#ifndef Py_LIMITED_API +#ifndef Py_SYMTABLE_H +#define Py_SYMTABLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* XXX(ncoghlan): This is a weird mix of public names and interpreter internal + * names. + */ + +typedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock } + _Py_block_ty; + +struct _symtable_entry; + +struct symtable { + PyObject *st_filename; /* name of file being compiled, + decoded from the filesystem encoding */ + struct _symtable_entry *st_cur; /* current symbol table entry */ + struct _symtable_entry *st_top; /* symbol table entry for module */ + PyObject *st_blocks; /* dict: map AST node addresses + * to symbol table entries */ + PyObject *st_stack; /* list: stack of namespace info */ + PyObject *st_global; /* borrowed ref to st_top->ste_symbols */ + int st_nblocks; /* number of blocks used. kept for + consistency with the corresponding + compiler structure */ + PyObject *st_private; /* name of current class or NULL */ + PyFutureFeatures *st_future; /* module's future features that affect + the symbol table */ + int recursion_depth; /* current recursion depth */ + int recursion_limit; /* recursion limit */ +}; + +typedef struct _symtable_entry { + PyObject_HEAD + PyObject *ste_id; /* int: key in ste_table->st_blocks */ + PyObject *ste_symbols; /* dict: variable names to flags */ + PyObject *ste_name; /* string: name of current block */ + PyObject *ste_varnames; /* list of function parameters */ + PyObject *ste_children; /* list of child blocks */ + PyObject *ste_directives;/* locations of global and nonlocal statements */ + _Py_block_ty ste_type; /* module, class, or function */ + int ste_nested; /* true if block is nested */ + unsigned ste_free : 1; /* true if block has free variables */ + unsigned ste_child_free : 1; /* true if a child block has free vars, + including free refs to globals */ + unsigned ste_generator : 1; /* true if namespace is a generator */ + unsigned ste_coroutine : 1; /* true if namespace is a coroutine */ + unsigned ste_varargs : 1; /* true if block has varargs */ + unsigned ste_varkeywords : 1; /* true if block has varkeywords */ + unsigned ste_returns_value : 1; /* true if namespace uses return with + an argument */ + unsigned ste_needs_class_closure : 1; /* for class scopes, true if a + closure over __class__ + should be created */ + int ste_lineno; /* first line of block */ + int ste_col_offset; /* offset of first line of block */ + int ste_opt_lineno; /* lineno of last exec or import * */ + int ste_opt_col_offset; /* offset of last exec or import * */ + struct symtable *ste_table; +} PySTEntryObject; + +PyAPI_DATA(PyTypeObject) PySTEntry_Type; + +#define PySTEntry_Check(op) (Py_TYPE(op) == &PySTEntry_Type) + +PyAPI_FUNC(int) PyST_GetScope(PySTEntryObject *, PyObject *); + +PyAPI_FUNC(struct symtable *) PySymtable_Build( + mod_ty mod, + const char *filename, /* decoded from the filesystem encoding */ + PyFutureFeatures *future); +PyAPI_FUNC(struct symtable *) PySymtable_BuildObject( + mod_ty mod, + PyObject *filename, + PyFutureFeatures *future); +PyAPI_FUNC(PySTEntryObject *) PySymtable_Lookup(struct symtable *, void *); + +PyAPI_FUNC(void) PySymtable_Free(struct symtable *); + +/* Flags for def-use information */ + +#define DEF_GLOBAL 1 /* global stmt */ +#define DEF_LOCAL 2 /* assignment in code block */ +#define DEF_PARAM 2<<1 /* formal parameter */ +#define DEF_NONLOCAL 2<<2 /* nonlocal stmt */ +#define USE 2<<3 /* name is used */ +#define DEF_FREE 2<<4 /* name used but not defined in nested block */ +#define DEF_FREE_CLASS 2<<5 /* free variable from class's method */ +#define DEF_IMPORT 2<<6 /* assignment occurred via import */ +#define DEF_ANNOT 2<<7 /* this name is annotated */ + +#define DEF_BOUND (DEF_LOCAL | DEF_PARAM | DEF_IMPORT) + +/* GLOBAL_EXPLICIT and GLOBAL_IMPLICIT are used internally by the symbol + table. GLOBAL is returned from PyST_GetScope() for either of them. + It is stored in ste_symbols at bits 12-15. +*/ +#define SCOPE_OFFSET 11 +#define SCOPE_MASK (DEF_GLOBAL | DEF_LOCAL | DEF_PARAM | DEF_NONLOCAL) + +#define LOCAL 1 +#define GLOBAL_EXPLICIT 2 +#define GLOBAL_IMPLICIT 3 +#define FREE 4 +#define CELL 5 + +#define GENERATOR 1 +#define GENERATOR_EXPRESSION 2 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SYMTABLE_H */ +#endif /* Py_LIMITED_API */ diff --git a/venv/Include/sysmodule.h b/venv/Include/sysmodule.h new file mode 100644 index 00000000..719ecfcf --- /dev/null +++ b/venv/Include/sysmodule.h @@ -0,0 +1,48 @@ + +/* System module interface */ + +#ifndef Py_SYSMODULE_H +#define Py_SYSMODULE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) PySys_GetObject(const char *); +PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PySys_GetObjectId(_Py_Identifier *key); +PyAPI_FUNC(int) _PySys_SetObjectId(_Py_Identifier *key, PyObject *); +#endif + +PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **); +PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int); +PyAPI_FUNC(void) PySys_SetPath(const wchar_t *); + +PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(void) PySys_FormatStdout(const char *format, ...); +PyAPI_FUNC(void) PySys_FormatStderr(const char *format, ...); + +PyAPI_FUNC(void) PySys_ResetWarnOptions(void); +PyAPI_FUNC(void) PySys_AddWarnOption(const wchar_t *); +PyAPI_FUNC(void) PySys_AddWarnOptionUnicode(PyObject *); +PyAPI_FUNC(int) PySys_HasWarnOptions(void); + +PyAPI_FUNC(void) PySys_AddXOption(const wchar_t *); +PyAPI_FUNC(PyObject *) PySys_GetXOptions(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *); +#endif + +#ifdef Py_BUILD_CORE +PyAPI_FUNC(int) _PySys_AddXOptionWithError(const wchar_t *s); +PyAPI_FUNC(int) _PySys_AddWarnOptionWithError(PyObject *option); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SYSMODULE_H */ diff --git a/venv/Include/token.h b/venv/Include/token.h new file mode 100644 index 00000000..cd1cd00f --- /dev/null +++ b/venv/Include/token.h @@ -0,0 +1,92 @@ + +/* Token types */ +#ifndef Py_LIMITED_API +#ifndef Py_TOKEN_H +#define Py_TOKEN_H +#ifdef __cplusplus +extern "C" { +#endif + +#undef TILDE /* Prevent clash of our definition with system macro. Ex AIX, ioctl.h */ + +#define ENDMARKER 0 +#define NAME 1 +#define NUMBER 2 +#define STRING 3 +#define NEWLINE 4 +#define INDENT 5 +#define DEDENT 6 +#define LPAR 7 +#define RPAR 8 +#define LSQB 9 +#define RSQB 10 +#define COLON 11 +#define COMMA 12 +#define SEMI 13 +#define PLUS 14 +#define MINUS 15 +#define STAR 16 +#define SLASH 17 +#define VBAR 18 +#define AMPER 19 +#define LESS 20 +#define GREATER 21 +#define EQUAL 22 +#define DOT 23 +#define PERCENT 24 +#define LBRACE 25 +#define RBRACE 26 +#define EQEQUAL 27 +#define NOTEQUAL 28 +#define LESSEQUAL 29 +#define GREATEREQUAL 30 +#define TILDE 31 +#define CIRCUMFLEX 32 +#define LEFTSHIFT 33 +#define RIGHTSHIFT 34 +#define DOUBLESTAR 35 +#define PLUSEQUAL 36 +#define MINEQUAL 37 +#define STAREQUAL 38 +#define SLASHEQUAL 39 +#define PERCENTEQUAL 40 +#define AMPEREQUAL 41 +#define VBAREQUAL 42 +#define CIRCUMFLEXEQUAL 43 +#define LEFTSHIFTEQUAL 44 +#define RIGHTSHIFTEQUAL 45 +#define DOUBLESTAREQUAL 46 +#define DOUBLESLASH 47 +#define DOUBLESLASHEQUAL 48 +#define AT 49 +#define ATEQUAL 50 +#define RARROW 51 +#define ELLIPSIS 52 +/* Don't forget to update the table _PyParser_TokenNames in tokenizer.c! */ +#define OP 53 +#define ERRORTOKEN 54 +/* These aren't used by the C tokenizer but are needed for tokenize.py */ +#define COMMENT 55 +#define NL 56 +#define ENCODING 57 +#define N_TOKENS 58 + +/* Special definitions for cooperation with parser */ + +#define NT_OFFSET 256 + +#define ISTERMINAL(x) ((x) < NT_OFFSET) +#define ISNONTERMINAL(x) ((x) >= NT_OFFSET) +#define ISEOF(x) ((x) == ENDMARKER) + + +PyAPI_DATA(const char *) _PyParser_TokenNames[]; /* Token names */ +PyAPI_FUNC(int) PyToken_OneChar(int); +PyAPI_FUNC(int) PyToken_TwoChars(int, int); +PyAPI_FUNC(int) PyToken_ThreeChars(int, int, int); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TOKEN_H */ +#endif /* Py_LIMITED_API */ diff --git a/venv/Include/traceback.h b/venv/Include/traceback.h new file mode 100644 index 00000000..b5874100 --- /dev/null +++ b/venv/Include/traceback.h @@ -0,0 +1,119 @@ + +#ifndef Py_TRACEBACK_H +#define Py_TRACEBACK_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "pystate.h" + +struct _frame; + +/* Traceback interface */ +#ifndef Py_LIMITED_API +typedef struct _traceback { + PyObject_HEAD + struct _traceback *tb_next; + struct _frame *tb_frame; + int tb_lasti; + int tb_lineno; +} PyTracebackObject; +#endif + +PyAPI_FUNC(int) PyTraceBack_Here(struct _frame *); +PyAPI_FUNC(int) PyTraceBack_Print(PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, PyObject *, int, int); +PyAPI_FUNC(void) _PyTraceback_Add(const char *, const char *, int); +#endif + +/* Reveal traceback type so we can typecheck traceback objects */ +PyAPI_DATA(PyTypeObject) PyTraceBack_Type; +#define PyTraceBack_Check(v) (Py_TYPE(v) == &PyTraceBack_Type) + +#ifndef Py_LIMITED_API +/* Write the Python traceback into the file 'fd'. For example: + + Traceback (most recent call first): + File "xxx", line xxx in + File "xxx", line xxx in + ... + File "xxx", line xxx in + + This function is written for debug purpose only, to dump the traceback in + the worst case: after a segmentation fault, at fatal error, etc. That's why, + it is very limited. Strings are truncated to 100 characters and encoded to + ASCII with backslashreplace. It doesn't write the source code, only the + function name, filename and line number of each frame. Write only the first + 100 frames: if the traceback is truncated, write the line " ...". + + This function is signal safe. */ + +PyAPI_FUNC(void) _Py_DumpTraceback( + int fd, + PyThreadState *tstate); + +/* Write the traceback of all threads into the file 'fd'. current_thread can be + NULL. + + Return NULL on success, or an error message on error. + + This function is written for debug purpose only. It calls + _Py_DumpTraceback() for each thread, and so has the same limitations. It + only write the traceback of the first 100 threads: write "..." if there are + more threads. + + If current_tstate is NULL, the function tries to get the Python thread state + of the current thread. It is not an error if the function is unable to get + the current Python thread state. + + If interp is NULL, the function tries to get the interpreter state from + the current Python thread state, or from + _PyGILState_GetInterpreterStateUnsafe() in last resort. + + It is better to pass NULL to interp and current_tstate, the function tries + different options to retrieve these informations. + + This function is signal safe. */ + +PyAPI_FUNC(const char*) _Py_DumpTracebackThreads( + int fd, + PyInterpreterState *interp, + PyThreadState *current_tstate); +#endif /* !Py_LIMITED_API */ + +#ifndef Py_LIMITED_API + +/* Write a Unicode object into the file descriptor fd. Encode the string to + ASCII using the backslashreplace error handler. + + Do nothing if text is not a Unicode object. The function accepts Unicode + string which is not ready (PyUnicode_WCHAR_KIND). + + This function is signal safe. */ +PyAPI_FUNC(void) _Py_DumpASCII(int fd, PyObject *text); + +/* Format an integer as decimal into the file descriptor fd. + + This function is signal safe. */ +PyAPI_FUNC(void) _Py_DumpDecimal( + int fd, + unsigned long value); + +/* Format an integer as hexadecimal into the file descriptor fd with at least + width digits. + + The maximum width is sizeof(unsigned long)*2 digits. + + This function is signal safe. */ +PyAPI_FUNC(void) _Py_DumpHexadecimal( + int fd, + unsigned long value, + Py_ssize_t width); + +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TRACEBACK_H */ diff --git a/venv/Include/tupleobject.h b/venv/Include/tupleobject.h new file mode 100644 index 00000000..72a7d8d5 --- /dev/null +++ b/venv/Include/tupleobject.h @@ -0,0 +1,73 @@ + +/* Tuple object interface */ + +#ifndef Py_TUPLEOBJECT_H +#define Py_TUPLEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* +Another generally useful object type is a tuple of object pointers. +For Python, this is an immutable type. C code can change the tuple items +(but not their number), and even use tuples as general-purpose arrays of +object references, but in general only brand new tuples should be mutated, +not ones that might already have been exposed to Python code. + +*** WARNING *** PyTuple_SetItem does not increment the new item's reference +count, but does decrement the reference count of the item it replaces, +if not nil. It does *decrement* the reference count if it is *not* +inserted in the tuple. Similarly, PyTuple_GetItem does not increment the +returned item's reference count. +*/ + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_VAR_HEAD + PyObject *ob_item[1]; + + /* ob_item contains space for 'ob_size' elements. + * Items must normally not be NULL, except during construction when + * the tuple is not yet visible outside the function that builds it. + */ +} PyTupleObject; +#endif + +PyAPI_DATA(PyTypeObject) PyTuple_Type; +PyAPI_DATA(PyTypeObject) PyTupleIter_Type; + +#define PyTuple_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TUPLE_SUBCLASS) +#define PyTuple_CheckExact(op) (Py_TYPE(op) == &PyTuple_Type) + +PyAPI_FUNC(PyObject *) PyTuple_New(Py_ssize_t size); +PyAPI_FUNC(Py_ssize_t) PyTuple_Size(PyObject *); +PyAPI_FUNC(PyObject *) PyTuple_GetItem(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyTuple_SetItem(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(PyObject *) PyTuple_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyTuple_Resize(PyObject **, Py_ssize_t); +#endif +PyAPI_FUNC(PyObject *) PyTuple_Pack(Py_ssize_t, ...); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); +#endif + +/* Macro, trading safety for speed */ +#ifndef Py_LIMITED_API +#define PyTuple_GET_ITEM(op, i) (((PyTupleObject *)(op))->ob_item[i]) +#define PyTuple_GET_SIZE(op) (assert(PyTuple_Check(op)),Py_SIZE(op)) + +/* Macro, *only* to be used to fill in brand new tuples */ +#define PyTuple_SET_ITEM(op, i, v) (((PyTupleObject *)(op))->ob_item[i] = v) +#endif + +PyAPI_FUNC(int) PyTuple_ClearFreeList(void); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out); +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TUPLEOBJECT_H */ diff --git a/venv/Include/typeslots.h b/venv/Include/typeslots.h new file mode 100644 index 00000000..0ce6a377 --- /dev/null +++ b/venv/Include/typeslots.h @@ -0,0 +1,85 @@ +/* Do not renumber the file; these numbers are part of the stable ABI. */ +/* Disabled, see #10181 */ +#undef Py_bf_getbuffer +#undef Py_bf_releasebuffer +#define Py_mp_ass_subscript 3 +#define Py_mp_length 4 +#define Py_mp_subscript 5 +#define Py_nb_absolute 6 +#define Py_nb_add 7 +#define Py_nb_and 8 +#define Py_nb_bool 9 +#define Py_nb_divmod 10 +#define Py_nb_float 11 +#define Py_nb_floor_divide 12 +#define Py_nb_index 13 +#define Py_nb_inplace_add 14 +#define Py_nb_inplace_and 15 +#define Py_nb_inplace_floor_divide 16 +#define Py_nb_inplace_lshift 17 +#define Py_nb_inplace_multiply 18 +#define Py_nb_inplace_or 19 +#define Py_nb_inplace_power 20 +#define Py_nb_inplace_remainder 21 +#define Py_nb_inplace_rshift 22 +#define Py_nb_inplace_subtract 23 +#define Py_nb_inplace_true_divide 24 +#define Py_nb_inplace_xor 25 +#define Py_nb_int 26 +#define Py_nb_invert 27 +#define Py_nb_lshift 28 +#define Py_nb_multiply 29 +#define Py_nb_negative 30 +#define Py_nb_or 31 +#define Py_nb_positive 32 +#define Py_nb_power 33 +#define Py_nb_remainder 34 +#define Py_nb_rshift 35 +#define Py_nb_subtract 36 +#define Py_nb_true_divide 37 +#define Py_nb_xor 38 +#define Py_sq_ass_item 39 +#define Py_sq_concat 40 +#define Py_sq_contains 41 +#define Py_sq_inplace_concat 42 +#define Py_sq_inplace_repeat 43 +#define Py_sq_item 44 +#define Py_sq_length 45 +#define Py_sq_repeat 46 +#define Py_tp_alloc 47 +#define Py_tp_base 48 +#define Py_tp_bases 49 +#define Py_tp_call 50 +#define Py_tp_clear 51 +#define Py_tp_dealloc 52 +#define Py_tp_del 53 +#define Py_tp_descr_get 54 +#define Py_tp_descr_set 55 +#define Py_tp_doc 56 +#define Py_tp_getattr 57 +#define Py_tp_getattro 58 +#define Py_tp_hash 59 +#define Py_tp_init 60 +#define Py_tp_is_gc 61 +#define Py_tp_iter 62 +#define Py_tp_iternext 63 +#define Py_tp_methods 64 +#define Py_tp_new 65 +#define Py_tp_repr 66 +#define Py_tp_richcompare 67 +#define Py_tp_setattr 68 +#define Py_tp_setattro 69 +#define Py_tp_str 70 +#define Py_tp_traverse 71 +#define Py_tp_members 72 +#define Py_tp_getset 73 +#define Py_tp_free 74 +#define Py_nb_matrix_multiply 75 +#define Py_nb_inplace_matrix_multiply 76 +#define Py_am_await 77 +#define Py_am_aiter 78 +#define Py_am_anext 79 +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +#define Py_tp_finalize 80 +#endif diff --git a/venv/Include/ucnhash.h b/venv/Include/ucnhash.h new file mode 100644 index 00000000..45362e99 --- /dev/null +++ b/venv/Include/ucnhash.h @@ -0,0 +1,36 @@ +/* Unicode name database interface */ +#ifndef Py_LIMITED_API +#ifndef Py_UCNHASH_H +#define Py_UCNHASH_H +#ifdef __cplusplus +extern "C" { +#endif + +/* revised ucnhash CAPI interface (exported through a "wrapper") */ + +#define PyUnicodeData_CAPSULE_NAME "unicodedata.ucnhash_CAPI" + +typedef struct { + + /* Size of this struct */ + int size; + + /* Get name for a given character code. Returns non-zero if + success, zero if not. Does not set Python exceptions. + If self is NULL, data come from the default version of the database. + If it is not NULL, it should be a unicodedata.ucd_X_Y_Z object */ + int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen, + int with_alias_and_seq); + + /* Get character code for a given name. Same error handling + as for getname. */ + int (*getcode)(PyObject *self, const char* name, int namelen, Py_UCS4* code, + int with_named_seq); + +} _PyUnicode_Name_CAPI; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_UCNHASH_H */ +#endif /* !Py_LIMITED_API */ diff --git a/venv/Include/unicodeobject.h b/venv/Include/unicodeobject.h new file mode 100644 index 00000000..0274de67 --- /dev/null +++ b/venv/Include/unicodeobject.h @@ -0,0 +1,2334 @@ +#ifndef Py_UNICODEOBJECT_H +#define Py_UNICODEOBJECT_H + +#include + +/* + +Unicode implementation based on original code by Fredrik Lundh, +modified by Marc-Andre Lemburg (mal@lemburg.com) according to the +Unicode Integration Proposal. (See +http://www.egenix.com/files/python/unicode-proposal.txt). + +Copyright (c) Corporation for National Research Initiatives. + + + Original header: + -------------------------------------------------------------------- + + * Yet another Unicode string type for Python. This type supports the + * 16-bit Basic Multilingual Plane (BMP) only. + * + * Written by Fredrik Lundh, January 1999. + * + * Copyright (c) 1999 by Secret Labs AB. + * Copyright (c) 1999 by Fredrik Lundh. + * + * fredrik@pythonware.com + * http://www.pythonware.com + * + * -------------------------------------------------------------------- + * This Unicode String Type is + * + * Copyright (c) 1999 by Secret Labs AB + * Copyright (c) 1999 by Fredrik Lundh + * + * By obtaining, using, and/or copying this software and/or its + * associated documentation, you agree that you have read, understood, + * and will comply with the following terms and conditions: + * + * Permission to use, copy, modify, and distribute this software and its + * associated documentation for any purpose and without fee is hereby + * granted, provided that the above copyright notice appears in all + * copies, and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of Secret Labs + * AB or the author not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. + * + * SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * -------------------------------------------------------------------- */ + +#include + +/* === Internal API ======================================================= */ + +/* --- Internal Unicode Format -------------------------------------------- */ + +/* Python 3.x requires unicode */ +#define Py_USING_UNICODE + +#ifndef SIZEOF_WCHAR_T +#error Must define SIZEOF_WCHAR_T +#endif + +#define Py_UNICODE_SIZE SIZEOF_WCHAR_T + +/* If wchar_t can be used for UCS-4 storage, set Py_UNICODE_WIDE. + Otherwise, Unicode strings are stored as UCS-2 (with limited support + for UTF-16) */ + +#if Py_UNICODE_SIZE >= 4 +#define Py_UNICODE_WIDE +#endif + +/* Set these flags if the platform has "wchar.h" and the + wchar_t type is a 16-bit unsigned type */ +/* #define HAVE_WCHAR_H */ +/* #define HAVE_USABLE_WCHAR_T */ + +/* Py_UNICODE was the native Unicode storage format (code unit) used by + Python and represents a single Unicode element in the Unicode type. + With PEP 393, Py_UNICODE is deprecated and replaced with a + typedef to wchar_t. */ + +#ifndef Py_LIMITED_API +#define PY_UNICODE_TYPE wchar_t +typedef wchar_t Py_UNICODE /* Py_DEPRECATED(3.3) */; +#endif + +/* If the compiler provides a wchar_t type we try to support it + through the interface functions PyUnicode_FromWideChar(), + PyUnicode_AsWideChar() and PyUnicode_AsWideCharString(). */ + +#ifdef HAVE_USABLE_WCHAR_T +# ifndef HAVE_WCHAR_H +# define HAVE_WCHAR_H +# endif +#endif + +#ifdef HAVE_WCHAR_H +# include +#endif + +/* Py_UCS4 and Py_UCS2 are typedefs for the respective + unicode representations. */ +typedef uint32_t Py_UCS4; +typedef uint16_t Py_UCS2; +typedef uint8_t Py_UCS1; + +/* --- Internal Unicode Operations ---------------------------------------- */ + +/* Since splitting on whitespace is an important use case, and + whitespace in most situations is solely ASCII whitespace, we + optimize for the common case by using a quick look-up table + _Py_ascii_whitespace (see below) with an inlined check. + + */ +#ifndef Py_LIMITED_API +#define Py_UNICODE_ISSPACE(ch) \ + ((ch) < 128U ? _Py_ascii_whitespace[(ch)] : _PyUnicode_IsWhitespace(ch)) + +#define Py_UNICODE_ISLOWER(ch) _PyUnicode_IsLowercase(ch) +#define Py_UNICODE_ISUPPER(ch) _PyUnicode_IsUppercase(ch) +#define Py_UNICODE_ISTITLE(ch) _PyUnicode_IsTitlecase(ch) +#define Py_UNICODE_ISLINEBREAK(ch) _PyUnicode_IsLinebreak(ch) + +#define Py_UNICODE_TOLOWER(ch) _PyUnicode_ToLowercase(ch) +#define Py_UNICODE_TOUPPER(ch) _PyUnicode_ToUppercase(ch) +#define Py_UNICODE_TOTITLE(ch) _PyUnicode_ToTitlecase(ch) + +#define Py_UNICODE_ISDECIMAL(ch) _PyUnicode_IsDecimalDigit(ch) +#define Py_UNICODE_ISDIGIT(ch) _PyUnicode_IsDigit(ch) +#define Py_UNICODE_ISNUMERIC(ch) _PyUnicode_IsNumeric(ch) +#define Py_UNICODE_ISPRINTABLE(ch) _PyUnicode_IsPrintable(ch) + +#define Py_UNICODE_TODECIMAL(ch) _PyUnicode_ToDecimalDigit(ch) +#define Py_UNICODE_TODIGIT(ch) _PyUnicode_ToDigit(ch) +#define Py_UNICODE_TONUMERIC(ch) _PyUnicode_ToNumeric(ch) + +#define Py_UNICODE_ISALPHA(ch) _PyUnicode_IsAlpha(ch) + +#define Py_UNICODE_ISALNUM(ch) \ + (Py_UNICODE_ISALPHA(ch) || \ + Py_UNICODE_ISDECIMAL(ch) || \ + Py_UNICODE_ISDIGIT(ch) || \ + Py_UNICODE_ISNUMERIC(ch)) + +#define Py_UNICODE_COPY(target, source, length) \ + memcpy((target), (source), (length)*sizeof(Py_UNICODE)) + +#define Py_UNICODE_FILL(target, value, length) \ + do {Py_ssize_t i_; Py_UNICODE *t_ = (target); Py_UNICODE v_ = (value);\ + for (i_ = 0; i_ < (length); i_++) t_[i_] = v_;\ + } while (0) + +/* macros to work with surrogates */ +#define Py_UNICODE_IS_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDFFF) +#define Py_UNICODE_IS_HIGH_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDBFF) +#define Py_UNICODE_IS_LOW_SURROGATE(ch) (0xDC00 <= (ch) && (ch) <= 0xDFFF) +/* Join two surrogate characters and return a single Py_UCS4 value. */ +#define Py_UNICODE_JOIN_SURROGATES(high, low) \ + (((((Py_UCS4)(high) & 0x03FF) << 10) | \ + ((Py_UCS4)(low) & 0x03FF)) + 0x10000) +/* high surrogate = top 10 bits added to D800 */ +#define Py_UNICODE_HIGH_SURROGATE(ch) (0xD800 - (0x10000 >> 10) + ((ch) >> 10)) +/* low surrogate = bottom 10 bits added to DC00 */ +#define Py_UNICODE_LOW_SURROGATE(ch) (0xDC00 + ((ch) & 0x3FF)) + +/* Check if substring matches at given offset. The offset must be + valid, and the substring must not be empty. */ + +#define Py_UNICODE_MATCH(string, offset, substring) \ + ((*((string)->wstr + (offset)) == *((substring)->wstr)) && \ + ((*((string)->wstr + (offset) + (substring)->wstr_length-1) == *((substring)->wstr + (substring)->wstr_length-1))) && \ + !memcmp((string)->wstr + (offset), (substring)->wstr, (substring)->wstr_length*sizeof(Py_UNICODE))) + +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* --- Unicode Type ------------------------------------------------------- */ + +#ifndef Py_LIMITED_API + +/* ASCII-only strings created through PyUnicode_New use the PyASCIIObject + structure. state.ascii and state.compact are set, and the data + immediately follow the structure. utf8_length and wstr_length can be found + in the length field; the utf8 pointer is equal to the data pointer. */ +typedef struct { + /* There are 4 forms of Unicode strings: + + - compact ascii: + + * structure = PyASCIIObject + * test: PyUnicode_IS_COMPACT_ASCII(op) + * kind = PyUnicode_1BYTE_KIND + * compact = 1 + * ascii = 1 + * ready = 1 + * (length is the length of the utf8 and wstr strings) + * (data starts just after the structure) + * (since ASCII is decoded from UTF-8, the utf8 string are the data) + + - compact: + + * structure = PyCompactUnicodeObject + * test: PyUnicode_IS_COMPACT(op) && !PyUnicode_IS_ASCII(op) + * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or + PyUnicode_4BYTE_KIND + * compact = 1 + * ready = 1 + * ascii = 0 + * utf8 is not shared with data + * utf8_length = 0 if utf8 is NULL + * wstr is shared with data and wstr_length=length + if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2 + or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_t)=4 + * wstr_length = 0 if wstr is NULL + * (data starts just after the structure) + + - legacy string, not ready: + + * structure = PyUnicodeObject + * test: kind == PyUnicode_WCHAR_KIND + * length = 0 (use wstr_length) + * hash = -1 + * kind = PyUnicode_WCHAR_KIND + * compact = 0 + * ascii = 0 + * ready = 0 + * interned = SSTATE_NOT_INTERNED + * wstr is not NULL + * data.any is NULL + * utf8 is NULL + * utf8_length = 0 + + - legacy string, ready: + + * structure = PyUnicodeObject structure + * test: !PyUnicode_IS_COMPACT(op) && kind != PyUnicode_WCHAR_KIND + * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or + PyUnicode_4BYTE_KIND + * compact = 0 + * ready = 1 + * data.any is not NULL + * utf8 is shared and utf8_length = length with data.any if ascii = 1 + * utf8_length = 0 if utf8 is NULL + * wstr is shared with data.any and wstr_length = length + if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2 + or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_4)=4 + * wstr_length = 0 if wstr is NULL + + Compact strings use only one memory block (structure + characters), + whereas legacy strings use one block for the structure and one block + for characters. + + Legacy strings are created by PyUnicode_FromUnicode() and + PyUnicode_FromStringAndSize(NULL, size) functions. They become ready + when PyUnicode_READY() is called. + + See also _PyUnicode_CheckConsistency(). + */ + PyObject_HEAD + Py_ssize_t length; /* Number of code points in the string */ + Py_hash_t hash; /* Hash value; -1 if not set */ + struct { + /* + SSTATE_NOT_INTERNED (0) + SSTATE_INTERNED_MORTAL (1) + SSTATE_INTERNED_IMMORTAL (2) + + If interned != SSTATE_NOT_INTERNED, the two references from the + dictionary to this object are *not* counted in ob_refcnt. + */ + unsigned int interned:2; + /* Character size: + + - PyUnicode_WCHAR_KIND (0): + + * character type = wchar_t (16 or 32 bits, depending on the + platform) + + - PyUnicode_1BYTE_KIND (1): + + * character type = Py_UCS1 (8 bits, unsigned) + * all characters are in the range U+0000-U+00FF (latin1) + * if ascii is set, all characters are in the range U+0000-U+007F + (ASCII), otherwise at least one character is in the range + U+0080-U+00FF + + - PyUnicode_2BYTE_KIND (2): + + * character type = Py_UCS2 (16 bits, unsigned) + * all characters are in the range U+0000-U+FFFF (BMP) + * at least one character is in the range U+0100-U+FFFF + + - PyUnicode_4BYTE_KIND (4): + + * character type = Py_UCS4 (32 bits, unsigned) + * all characters are in the range U+0000-U+10FFFF + * at least one character is in the range U+10000-U+10FFFF + */ + unsigned int kind:3; + /* Compact is with respect to the allocation scheme. Compact unicode + objects only require one memory block while non-compact objects use + one block for the PyUnicodeObject struct and another for its data + buffer. */ + unsigned int compact:1; + /* The string only contains characters in the range U+0000-U+007F (ASCII) + and the kind is PyUnicode_1BYTE_KIND. If ascii is set and compact is + set, use the PyASCIIObject structure. */ + unsigned int ascii:1; + /* The ready flag indicates whether the object layout is initialized + completely. This means that this is either a compact object, or + the data pointer is filled out. The bit is redundant, and helps + to minimize the test in PyUnicode_IS_READY(). */ + unsigned int ready:1; + /* Padding to ensure that PyUnicode_DATA() is always aligned to + 4 bytes (see issue #19537 on m68k). */ + unsigned int :24; + } state; + wchar_t *wstr; /* wchar_t representation (null-terminated) */ +} PyASCIIObject; + +/* Non-ASCII strings allocated through PyUnicode_New use the + PyCompactUnicodeObject structure. state.compact is set, and the data + immediately follow the structure. */ +typedef struct { + PyASCIIObject _base; + Py_ssize_t utf8_length; /* Number of bytes in utf8, excluding the + * terminating \0. */ + char *utf8; /* UTF-8 representation (null-terminated) */ + Py_ssize_t wstr_length; /* Number of code points in wstr, possible + * surrogates count as two code points. */ +} PyCompactUnicodeObject; + +/* Strings allocated through PyUnicode_FromUnicode(NULL, len) use the + PyUnicodeObject structure. The actual string data is initially in the wstr + block, and copied into the data block using _PyUnicode_Ready. */ +typedef struct { + PyCompactUnicodeObject _base; + union { + void *any; + Py_UCS1 *latin1; + Py_UCS2 *ucs2; + Py_UCS4 *ucs4; + } data; /* Canonical, smallest-form Unicode buffer */ +} PyUnicodeObject; +#endif + +PyAPI_DATA(PyTypeObject) PyUnicode_Type; +PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type; + +#define PyUnicode_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS) +#define PyUnicode_CheckExact(op) (Py_TYPE(op) == &PyUnicode_Type) + +/* Fast access macros */ +#ifndef Py_LIMITED_API + +#define PyUnicode_WSTR_LENGTH(op) \ + (PyUnicode_IS_COMPACT_ASCII(op) ? \ + ((PyASCIIObject*)op)->length : \ + ((PyCompactUnicodeObject*)op)->wstr_length) + +/* Returns the deprecated Py_UNICODE representation's size in code units + (this includes surrogate pairs as 2 units). + If the Py_UNICODE representation is not available, it will be computed + on request. Use PyUnicode_GET_LENGTH() for the length in code points. */ + +#define PyUnicode_GET_SIZE(op) \ + (assert(PyUnicode_Check(op)), \ + (((PyASCIIObject *)(op))->wstr) ? \ + PyUnicode_WSTR_LENGTH(op) : \ + ((void)PyUnicode_AsUnicode((PyObject *)(op)), \ + assert(((PyASCIIObject *)(op))->wstr), \ + PyUnicode_WSTR_LENGTH(op))) + /* Py_DEPRECATED(3.3) */ + +#define PyUnicode_GET_DATA_SIZE(op) \ + (PyUnicode_GET_SIZE(op) * Py_UNICODE_SIZE) + /* Py_DEPRECATED(3.3) */ + +/* Alias for PyUnicode_AsUnicode(). This will create a wchar_t/Py_UNICODE + representation on demand. Using this macro is very inefficient now, + try to port your code to use the new PyUnicode_*BYTE_DATA() macros or + use PyUnicode_WRITE() and PyUnicode_READ(). */ + +#define PyUnicode_AS_UNICODE(op) \ + (assert(PyUnicode_Check(op)), \ + (((PyASCIIObject *)(op))->wstr) ? (((PyASCIIObject *)(op))->wstr) : \ + PyUnicode_AsUnicode((PyObject *)(op))) + /* Py_DEPRECATED(3.3) */ + +#define PyUnicode_AS_DATA(op) \ + ((const char *)(PyUnicode_AS_UNICODE(op))) + /* Py_DEPRECATED(3.3) */ + + +/* --- Flexible String Representation Helper Macros (PEP 393) -------------- */ + +/* Values for PyASCIIObject.state: */ + +/* Interning state. */ +#define SSTATE_NOT_INTERNED 0 +#define SSTATE_INTERNED_MORTAL 1 +#define SSTATE_INTERNED_IMMORTAL 2 + +/* Return true if the string contains only ASCII characters, or 0 if not. The + string may be compact (PyUnicode_IS_COMPACT_ASCII) or not, but must be + ready. */ +#define PyUnicode_IS_ASCII(op) \ + (assert(PyUnicode_Check(op)), \ + assert(PyUnicode_IS_READY(op)), \ + ((PyASCIIObject*)op)->state.ascii) + +/* Return true if the string is compact or 0 if not. + No type checks or Ready calls are performed. */ +#define PyUnicode_IS_COMPACT(op) \ + (((PyASCIIObject*)(op))->state.compact) + +/* Return true if the string is a compact ASCII string (use PyASCIIObject + structure), or 0 if not. No type checks or Ready calls are performed. */ +#define PyUnicode_IS_COMPACT_ASCII(op) \ + (((PyASCIIObject*)op)->state.ascii && PyUnicode_IS_COMPACT(op)) + +enum PyUnicode_Kind { +/* String contains only wstr byte characters. This is only possible + when the string was created with a legacy API and _PyUnicode_Ready() + has not been called yet. */ + PyUnicode_WCHAR_KIND = 0, +/* Return values of the PyUnicode_KIND() macro: */ + PyUnicode_1BYTE_KIND = 1, + PyUnicode_2BYTE_KIND = 2, + PyUnicode_4BYTE_KIND = 4 +}; + +/* Return pointers to the canonical representation cast to unsigned char, + Py_UCS2, or Py_UCS4 for direct character access. + No checks are performed, use PyUnicode_KIND() before to ensure + these will work correctly. */ + +#define PyUnicode_1BYTE_DATA(op) ((Py_UCS1*)PyUnicode_DATA(op)) +#define PyUnicode_2BYTE_DATA(op) ((Py_UCS2*)PyUnicode_DATA(op)) +#define PyUnicode_4BYTE_DATA(op) ((Py_UCS4*)PyUnicode_DATA(op)) + +/* Return one of the PyUnicode_*_KIND values defined above. */ +#define PyUnicode_KIND(op) \ + (assert(PyUnicode_Check(op)), \ + assert(PyUnicode_IS_READY(op)), \ + ((PyASCIIObject *)(op))->state.kind) + +/* Return a void pointer to the raw unicode buffer. */ +#define _PyUnicode_COMPACT_DATA(op) \ + (PyUnicode_IS_ASCII(op) ? \ + ((void*)((PyASCIIObject*)(op) + 1)) : \ + ((void*)((PyCompactUnicodeObject*)(op) + 1))) + +#define _PyUnicode_NONCOMPACT_DATA(op) \ + (assert(((PyUnicodeObject*)(op))->data.any), \ + ((((PyUnicodeObject *)(op))->data.any))) + +#define PyUnicode_DATA(op) \ + (assert(PyUnicode_Check(op)), \ + PyUnicode_IS_COMPACT(op) ? _PyUnicode_COMPACT_DATA(op) : \ + _PyUnicode_NONCOMPACT_DATA(op)) + +/* In the access macros below, "kind" may be evaluated more than once. + All other macro parameters are evaluated exactly once, so it is safe + to put side effects into them (such as increasing the index). */ + +/* Write into the canonical representation, this macro does not do any sanity + checks and is intended for usage in loops. The caller should cache the + kind and data pointers obtained from other macro calls. + index is the index in the string (starts at 0) and value is the new + code point value which should be written to that location. */ +#define PyUnicode_WRITE(kind, data, index, value) \ + do { \ + switch ((kind)) { \ + case PyUnicode_1BYTE_KIND: { \ + ((Py_UCS1 *)(data))[(index)] = (Py_UCS1)(value); \ + break; \ + } \ + case PyUnicode_2BYTE_KIND: { \ + ((Py_UCS2 *)(data))[(index)] = (Py_UCS2)(value); \ + break; \ + } \ + default: { \ + assert((kind) == PyUnicode_4BYTE_KIND); \ + ((Py_UCS4 *)(data))[(index)] = (Py_UCS4)(value); \ + } \ + } \ + } while (0) + +/* Read a code point from the string's canonical representation. No checks + or ready calls are performed. */ +#define PyUnicode_READ(kind, data, index) \ + ((Py_UCS4) \ + ((kind) == PyUnicode_1BYTE_KIND ? \ + ((const Py_UCS1 *)(data))[(index)] : \ + ((kind) == PyUnicode_2BYTE_KIND ? \ + ((const Py_UCS2 *)(data))[(index)] : \ + ((const Py_UCS4 *)(data))[(index)] \ + ) \ + )) + +/* PyUnicode_READ_CHAR() is less efficient than PyUnicode_READ() because it + calls PyUnicode_KIND() and might call it twice. For single reads, use + PyUnicode_READ_CHAR, for multiple consecutive reads callers should + cache kind and use PyUnicode_READ instead. */ +#define PyUnicode_READ_CHAR(unicode, index) \ + (assert(PyUnicode_Check(unicode)), \ + assert(PyUnicode_IS_READY(unicode)), \ + (Py_UCS4) \ + (PyUnicode_KIND((unicode)) == PyUnicode_1BYTE_KIND ? \ + ((const Py_UCS1 *)(PyUnicode_DATA((unicode))))[(index)] : \ + (PyUnicode_KIND((unicode)) == PyUnicode_2BYTE_KIND ? \ + ((const Py_UCS2 *)(PyUnicode_DATA((unicode))))[(index)] : \ + ((const Py_UCS4 *)(PyUnicode_DATA((unicode))))[(index)] \ + ) \ + )) + +/* Returns the length of the unicode string. The caller has to make sure that + the string has it's canonical representation set before calling + this macro. Call PyUnicode_(FAST_)Ready to ensure that. */ +#define PyUnicode_GET_LENGTH(op) \ + (assert(PyUnicode_Check(op)), \ + assert(PyUnicode_IS_READY(op)), \ + ((PyASCIIObject *)(op))->length) + + +/* Fast check to determine whether an object is ready. Equivalent to + PyUnicode_IS_COMPACT(op) || ((PyUnicodeObject*)(op))->data.any) */ + +#define PyUnicode_IS_READY(op) (((PyASCIIObject*)op)->state.ready) + +/* PyUnicode_READY() does less work than _PyUnicode_Ready() in the best + case. If the canonical representation is not yet set, it will still call + _PyUnicode_Ready(). + Returns 0 on success and -1 on errors. */ +#define PyUnicode_READY(op) \ + (assert(PyUnicode_Check(op)), \ + (PyUnicode_IS_READY(op) ? \ + 0 : _PyUnicode_Ready((PyObject *)(op)))) + +/* Return a maximum character value which is suitable for creating another + string based on op. This is always an approximation but more efficient + than iterating over the string. */ +#define PyUnicode_MAX_CHAR_VALUE(op) \ + (assert(PyUnicode_IS_READY(op)), \ + (PyUnicode_IS_ASCII(op) ? \ + (0x7f) : \ + (PyUnicode_KIND(op) == PyUnicode_1BYTE_KIND ? \ + (0xffU) : \ + (PyUnicode_KIND(op) == PyUnicode_2BYTE_KIND ? \ + (0xffffU) : \ + (0x10ffffU))))) + +#endif + +/* --- Constants ---------------------------------------------------------- */ + +/* This Unicode character will be used as replacement character during + decoding if the errors argument is set to "replace". Note: the + Unicode character U+FFFD is the official REPLACEMENT CHARACTER in + Unicode 3.0. */ + +#define Py_UNICODE_REPLACEMENT_CHARACTER ((Py_UCS4) 0xFFFD) + +/* === Public API ========================================================= */ + +/* --- Plain Py_UNICODE --------------------------------------------------- */ + +/* With PEP 393, this is the recommended way to allocate a new unicode object. + This function will allocate the object and its buffer in a single memory + block. Objects created using this function are not resizable. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_New( + Py_ssize_t size, /* Number of code points in the new string */ + Py_UCS4 maxchar /* maximum code point value in the string */ + ); +#endif + +/* Initializes the canonical string representation from the deprecated + wstr/Py_UNICODE representation. This function is used to convert Unicode + objects which were created using the old API to the new flexible format + introduced with PEP 393. + + Don't call this function directly, use the public PyUnicode_READY() macro + instead. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyUnicode_Ready( + PyObject *unicode /* Unicode object */ + ); +#endif + +/* Get a copy of a Unicode string. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyUnicode_Copy( + PyObject *unicode + ); +#endif + +/* Copy character from one unicode object into another, this function performs + character conversion when necessary and falls back to memcpy() if possible. + + Fail if to is too small (smaller than *how_many* or smaller than + len(from)-from_start), or if kind(from[from_start:from_start+how_many]) > + kind(to), or if *to* has more than 1 reference. + + Return the number of written character, or return -1 and raise an exception + on error. + + Pseudo-code: + + how_many = min(how_many, len(from) - from_start) + to[to_start:to_start+how_many] = from[from_start:from_start+how_many] + return how_many + + Note: The function doesn't write a terminating null character. + */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) PyUnicode_CopyCharacters( + PyObject *to, + Py_ssize_t to_start, + PyObject *from, + Py_ssize_t from_start, + Py_ssize_t how_many + ); + +/* Unsafe version of PyUnicode_CopyCharacters(): don't check arguments and so + may crash if parameters are invalid (e.g. if the output string + is too short). */ +PyAPI_FUNC(void) _PyUnicode_FastCopyCharacters( + PyObject *to, + Py_ssize_t to_start, + PyObject *from, + Py_ssize_t from_start, + Py_ssize_t how_many + ); +#endif + +#ifndef Py_LIMITED_API +/* Fill a string with a character: write fill_char into + unicode[start:start+length]. + + Fail if fill_char is bigger than the string maximum character, or if the + string has more than 1 reference. + + Return the number of written character, or return -1 and raise an exception + on error. */ +PyAPI_FUNC(Py_ssize_t) PyUnicode_Fill( + PyObject *unicode, + Py_ssize_t start, + Py_ssize_t length, + Py_UCS4 fill_char + ); + +/* Unsafe version of PyUnicode_Fill(): don't check arguments and so may crash + if parameters are invalid (e.g. if length is longer than the string). */ +PyAPI_FUNC(void) _PyUnicode_FastFill( + PyObject *unicode, + Py_ssize_t start, + Py_ssize_t length, + Py_UCS4 fill_char + ); +#endif + +/* Create a Unicode Object from the Py_UNICODE buffer u of the given + size. + + u may be NULL which causes the contents to be undefined. It is the + user's responsibility to fill in the needed data afterwards. Note + that modifying the Unicode object contents after construction is + only allowed if u was set to NULL. + + The buffer is copied into the new object. */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( + const Py_UNICODE *u, /* Unicode buffer */ + Py_ssize_t size /* size of buffer */ + ) /* Py_DEPRECATED(3.3) */; +#endif + +/* Similar to PyUnicode_FromUnicode(), but u points to UTF-8 encoded bytes */ +PyAPI_FUNC(PyObject*) PyUnicode_FromStringAndSize( + const char *u, /* UTF-8 encoded string */ + Py_ssize_t size /* size of buffer */ + ); + +/* Similar to PyUnicode_FromUnicode(), but u points to null-terminated + UTF-8 encoded bytes. The size is determined with strlen(). */ +PyAPI_FUNC(PyObject*) PyUnicode_FromString( + const char *u /* UTF-8 encoded string */ + ); + +#ifndef Py_LIMITED_API +/* Create a new string from a buffer of Py_UCS1, Py_UCS2 or Py_UCS4 characters. + Scan the string to find the maximum character. */ +PyAPI_FUNC(PyObject*) PyUnicode_FromKindAndData( + int kind, + const void *buffer, + Py_ssize_t size); + +/* Create a new string from a buffer of ASCII characters. + WARNING: Don't check if the string contains any non-ASCII character. */ +PyAPI_FUNC(PyObject*) _PyUnicode_FromASCII( + const char *buffer, + Py_ssize_t size); +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyUnicode_Substring( + PyObject *str, + Py_ssize_t start, + Py_ssize_t end); +#endif + +#ifndef Py_LIMITED_API +/* Compute the maximum character of the substring unicode[start:end]. + Return 127 for an empty string. */ +PyAPI_FUNC(Py_UCS4) _PyUnicode_FindMaxChar ( + PyObject *unicode, + Py_ssize_t start, + Py_ssize_t end); +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Copy the string into a UCS4 buffer including the null character if copy_null + is set. Return NULL and raise an exception on error. Raise a SystemError if + the buffer is smaller than the string. Return buffer on success. + + buflen is the length of the buffer in (Py_UCS4) characters. */ +PyAPI_FUNC(Py_UCS4*) PyUnicode_AsUCS4( + PyObject *unicode, + Py_UCS4* buffer, + Py_ssize_t buflen, + int copy_null); + +/* Copy the string into a UCS4 buffer. A new buffer is allocated using + * PyMem_Malloc; if this fails, NULL is returned with a memory error + exception set. */ +PyAPI_FUNC(Py_UCS4*) PyUnicode_AsUCS4Copy(PyObject *unicode); +#endif + +#ifndef Py_LIMITED_API +/* Return a read-only pointer to the Unicode object's internal + Py_UNICODE buffer. + If the wchar_t/Py_UNICODE representation is not yet available, this + function will calculate it. */ + +PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( + PyObject *unicode /* Unicode object */ + ) /* Py_DEPRECATED(3.3) */; + +/* Similar to PyUnicode_AsUnicode(), but raises a ValueError if the string + contains null characters. */ +PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( + PyObject *unicode /* Unicode object */ + ); + +/* Return a read-only pointer to the Unicode object's internal + Py_UNICODE buffer and save the length at size. + If the wchar_t/Py_UNICODE representation is not yet available, this + function will calculate it. */ + +PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize( + PyObject *unicode, /* Unicode object */ + Py_ssize_t *size /* location where to save the length */ + ) /* Py_DEPRECATED(3.3) */; +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Get the length of the Unicode object. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_GetLength( + PyObject *unicode +); +#endif + +/* Get the number of Py_UNICODE units in the + string representation. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_GetSize( + PyObject *unicode /* Unicode object */ + ) Py_DEPRECATED(3.3); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Read a character from the string. */ + +PyAPI_FUNC(Py_UCS4) PyUnicode_ReadChar( + PyObject *unicode, + Py_ssize_t index + ); + +/* Write a character to the string. The string must have been created through + PyUnicode_New, must not be shared, and must not have been hashed yet. + + Return 0 on success, -1 on error. */ + +PyAPI_FUNC(int) PyUnicode_WriteChar( + PyObject *unicode, + Py_ssize_t index, + Py_UCS4 character + ); +#endif + +#ifndef Py_LIMITED_API +/* Get the maximum ordinal for a Unicode character. */ +PyAPI_FUNC(Py_UNICODE) PyUnicode_GetMax(void) Py_DEPRECATED(3.3); +#endif + +/* Resize a Unicode object. The length is the number of characters, except + if the kind of the string is PyUnicode_WCHAR_KIND: in this case, the length + is the number of Py_UNICODE characters. + + *unicode is modified to point to the new (resized) object and 0 + returned on success. + + Try to resize the string in place (which is usually faster than allocating + a new string and copy characters), or create a new string. + + Error handling is implemented as follows: an exception is set, -1 + is returned and *unicode left untouched. + + WARNING: The function doesn't check string content, the result may not be a + string in canonical representation. */ + +PyAPI_FUNC(int) PyUnicode_Resize( + PyObject **unicode, /* Pointer to the Unicode object */ + Py_ssize_t length /* New length */ + ); + +/* Decode obj to a Unicode object. + + bytes, bytearray and other bytes-like objects are decoded according to the + given encoding and error handler. The encoding and error handler can be + NULL to have the interface use UTF-8 and "strict". + + All other objects (including Unicode objects) raise an exception. + + The API returns NULL in case of an error. The caller is responsible + for decref'ing the returned objects. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromEncodedObject( + PyObject *obj, /* Object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Copy an instance of a Unicode subtype to a new true Unicode object if + necessary. If obj is already a true Unicode object (not a subtype), return + the reference with *incremented* refcount. + + The API returns NULL in case of an error. The caller is responsible + for decref'ing the returned objects. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromObject( + PyObject *obj /* Object */ + ); + +PyAPI_FUNC(PyObject *) PyUnicode_FromFormatV( + const char *format, /* ASCII-encoded string */ + va_list vargs + ); +PyAPI_FUNC(PyObject *) PyUnicode_FromFormat( + const char *format, /* ASCII-encoded string */ + ... + ); + +#ifndef Py_LIMITED_API +typedef struct { + PyObject *buffer; + void *data; + enum PyUnicode_Kind kind; + Py_UCS4 maxchar; + Py_ssize_t size; + Py_ssize_t pos; + + /* minimum number of allocated characters (default: 0) */ + Py_ssize_t min_length; + + /* minimum character (default: 127, ASCII) */ + Py_UCS4 min_char; + + /* If non-zero, overallocate the buffer (default: 0). */ + unsigned char overallocate; + + /* If readonly is 1, buffer is a shared string (cannot be modified) + and size is set to 0. */ + unsigned char readonly; +} _PyUnicodeWriter ; + +/* Initialize a Unicode writer. + * + * By default, the minimum buffer size is 0 character and overallocation is + * disabled. Set min_length, min_char and overallocate attributes to control + * the allocation of the buffer. */ +PyAPI_FUNC(void) +_PyUnicodeWriter_Init(_PyUnicodeWriter *writer); + +/* Prepare the buffer to write 'length' characters + with the specified maximum character. + + Return 0 on success, raise an exception and return -1 on error. */ +#define _PyUnicodeWriter_Prepare(WRITER, LENGTH, MAXCHAR) \ + (((MAXCHAR) <= (WRITER)->maxchar \ + && (LENGTH) <= (WRITER)->size - (WRITER)->pos) \ + ? 0 \ + : (((LENGTH) == 0) \ + ? 0 \ + : _PyUnicodeWriter_PrepareInternal((WRITER), (LENGTH), (MAXCHAR)))) + +/* Don't call this function directly, use the _PyUnicodeWriter_Prepare() macro + instead. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, + Py_ssize_t length, Py_UCS4 maxchar); + +/* Prepare the buffer to have at least the kind KIND. + For example, kind=PyUnicode_2BYTE_KIND ensures that the writer will + support characters in range U+000-U+FFFF. + + Return 0 on success, raise an exception and return -1 on error. */ +#define _PyUnicodeWriter_PrepareKind(WRITER, KIND) \ + (assert((KIND) != PyUnicode_WCHAR_KIND), \ + (KIND) <= (WRITER)->kind \ + ? 0 \ + : _PyUnicodeWriter_PrepareKindInternal((WRITER), (KIND))) + +/* Don't call this function directly, use the _PyUnicodeWriter_PrepareKind() + macro instead. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_PrepareKindInternal(_PyUnicodeWriter *writer, + enum PyUnicode_Kind kind); + +/* Append a Unicode character. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteChar(_PyUnicodeWriter *writer, + Py_UCS4 ch + ); + +/* Append a Unicode string. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteStr(_PyUnicodeWriter *writer, + PyObject *str /* Unicode string */ + ); + +/* Append a substring of a Unicode string. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteSubstring(_PyUnicodeWriter *writer, + PyObject *str, /* Unicode string */ + Py_ssize_t start, + Py_ssize_t end + ); + +/* Append an ASCII-encoded byte string. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteASCIIString(_PyUnicodeWriter *writer, + const char *str, /* ASCII-encoded byte string */ + Py_ssize_t len /* number of bytes, or -1 if unknown */ + ); + +/* Append a latin1-encoded byte string. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteLatin1String(_PyUnicodeWriter *writer, + const char *str, /* latin1-encoded byte string */ + Py_ssize_t len /* length in bytes */ + ); + +/* Get the value of the writer as a Unicode string. Clear the + buffer of the writer. Raise an exception and return NULL + on error. */ +PyAPI_FUNC(PyObject *) +_PyUnicodeWriter_Finish(_PyUnicodeWriter *writer); + +/* Deallocate memory of a writer (clear its internal buffer). */ +PyAPI_FUNC(void) +_PyUnicodeWriter_Dealloc(_PyUnicodeWriter *writer); +#endif + +#ifndef Py_LIMITED_API +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(int) _PyUnicode_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); +#endif + +PyAPI_FUNC(void) PyUnicode_InternInPlace(PyObject **); +PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **); +PyAPI_FUNC(PyObject *) PyUnicode_InternFromString( + const char *u /* UTF-8 encoded string */ + ); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_ReleaseInternedUnicodeStrings(void); +#endif + +/* Use only if you know it's a string */ +#define PyUnicode_CHECK_INTERNED(op) \ + (((PyASCIIObject *)(op))->state.interned) + +/* --- wchar_t support for platforms which support it --------------------- */ + +#ifdef HAVE_WCHAR_H + +/* Create a Unicode Object from the wchar_t buffer w of the given + size. + + The buffer is copied into the new object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_FromWideChar( + const wchar_t *w, /* wchar_t buffer */ + Py_ssize_t size /* size of buffer */ + ); + +/* Copies the Unicode Object contents into the wchar_t buffer w. At + most size wchar_t characters are copied. + + Note that the resulting wchar_t string may or may not be + 0-terminated. It is the responsibility of the caller to make sure + that the wchar_t string is 0-terminated in case this is required by + the application. + + Returns the number of wchar_t characters copied (excluding a + possibly trailing 0-termination character) or -1 in case of an + error. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_AsWideChar( + PyObject *unicode, /* Unicode object */ + wchar_t *w, /* wchar_t buffer */ + Py_ssize_t size /* size of buffer */ + ); + +/* Convert the Unicode object to a wide character string. The output string + always ends with a nul character. If size is not NULL, write the number of + wide characters (excluding the null character) into *size. + + Returns a buffer allocated by PyMem_Malloc() (use PyMem_Free() to free it) + on success. On error, returns NULL, *size is undefined and raises a + MemoryError. */ + +PyAPI_FUNC(wchar_t*) PyUnicode_AsWideCharString( + PyObject *unicode, /* Unicode object */ + Py_ssize_t *size /* number of characters of the result */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void*) _PyUnicode_AsKind(PyObject *s, unsigned int kind); +#endif + +#endif + +/* --- Unicode ordinals --------------------------------------------------- */ + +/* Create a Unicode Object from the given Unicode code point ordinal. + + The ordinal must be in range(0x110000). A ValueError is + raised in case it is not. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromOrdinal(int ordinal); + +/* --- Free-list management ----------------------------------------------- */ + +/* Clear the free list used by the Unicode implementation. + + This can be used to release memory used for objects on the free + list back to the Python memory allocator. + +*/ + +PyAPI_FUNC(int) PyUnicode_ClearFreeList(void); + +/* === Builtin Codecs ===================================================== + + Many of these APIs take two arguments encoding and errors. These + parameters encoding and errors have the same semantics as the ones + of the builtin str() API. + + Setting encoding to NULL causes the default encoding (UTF-8) to be used. + + Error handling is set by errors which may also be set to NULL + meaning to use the default handling defined for the codec. Default + error handling for all builtin codecs is "strict" (ValueErrors are + raised). + + The codecs all use a similar interface. Only deviation from the + generic ones are documented. + +*/ + +/* --- Manage the default encoding ---------------------------------------- */ + +/* Returns a pointer to the default encoding (UTF-8) of the + Unicode object unicode and the size of the encoded representation + in bytes stored in *size. + + In case of an error, no *size is set. + + This function caches the UTF-8 encoded string in the unicodeobject + and subsequent calls will return the same string. The memory is released + when the unicodeobject is deallocated. + + _PyUnicode_AsStringAndSize is a #define for PyUnicode_AsUTF8AndSize to + support the previous internal function with the same behaviour. + + *** This API is for interpreter INTERNAL USE ONLY and will likely + *** be removed or changed in the future. + + *** If you need to access the Unicode object as UTF-8 bytes string, + *** please use PyUnicode_AsUTF8String() instead. +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(const char *) PyUnicode_AsUTF8AndSize( + PyObject *unicode, + Py_ssize_t *size); +#define _PyUnicode_AsStringAndSize PyUnicode_AsUTF8AndSize +#endif + +/* Returns a pointer to the default encoding (UTF-8) of the + Unicode object unicode. + + Like PyUnicode_AsUTF8AndSize(), this also caches the UTF-8 representation + in the unicodeobject. + + _PyUnicode_AsString is a #define for PyUnicode_AsUTF8 to + support the previous internal function with the same behaviour. + + Use of this API is DEPRECATED since no size information can be + extracted from the returned data. + + *** This API is for interpreter INTERNAL USE ONLY and will likely + *** be removed or changed for Python 3.1. + + *** If you need to access the Unicode object as UTF-8 bytes string, + *** please use PyUnicode_AsUTF8String() instead. + +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(const char *) PyUnicode_AsUTF8(PyObject *unicode); +#define _PyUnicode_AsString PyUnicode_AsUTF8 +#endif + +/* Returns "utf-8". */ + +PyAPI_FUNC(const char*) PyUnicode_GetDefaultEncoding(void); + +/* --- Generic Codecs ----------------------------------------------------- */ + +/* Create a Unicode object by decoding the encoded string s of the + given size. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Decode( + const char *s, /* encoded string */ + Py_ssize_t size, /* size of buffer */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Decode a Unicode object unicode and return the result as Python + object. + + This API is DEPRECATED. The only supported standard encoding is rot13. + Use PyCodec_Decode() to decode with rot13 and non-standard codecs + that decode from str. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsDecodedObject( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.6); + +/* Decode a Unicode object unicode and return the result as Unicode + object. + + This API is DEPRECATED. The only supported standard encoding is rot13. + Use PyCodec_Decode() to decode with rot13 and non-standard codecs + that decode from str to str. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsDecodedUnicode( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.6); + +/* Encodes a Py_UNICODE buffer of the given size and returns a + Python string object. */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_Encode( + const Py_UNICODE *s, /* Unicode char buffer */ + Py_ssize_t size, /* number of Py_UNICODE chars to encode */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +#endif + +/* Encodes a Unicode object and returns the result as Python + object. + + This API is DEPRECATED. It is superseded by PyUnicode_AsEncodedString() + since all standard encodings (except rot13) encode str to bytes. + Use PyCodec_Encode() for encoding with rot13 and non-standard codecs + that encode form str to non-bytes. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedObject( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.6); + +/* Encodes a Unicode object and returns the result as Python string + object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedString( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a Unicode object and returns the result as Unicode + object. + + This API is DEPRECATED. The only supported standard encodings is rot13. + Use PyCodec_Encode() to encode with rot13 and non-standard codecs + that encode from str to str. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedUnicode( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.6); + +/* Build an encoding map. */ + +PyAPI_FUNC(PyObject*) PyUnicode_BuildEncodingMap( + PyObject* string /* 256 character map */ + ); + +/* --- UTF-7 Codecs ------------------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF7( + const char *string, /* UTF-7 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF7Stateful( + const char *string, /* UTF-7 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF7( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + int base64SetO, /* Encode RFC2152 Set O characters in base64 */ + int base64WhiteSpace, /* Encode whitespace (sp, ht, nl, cr) in base64 */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF7( + PyObject *unicode, /* Unicode object */ + int base64SetO, /* Encode RFC2152 Set O characters in base64 */ + int base64WhiteSpace, /* Encode whitespace (sp, ht, nl, cr) in base64 */ + const char *errors /* error handling */ + ); +#endif + +/* --- UTF-8 Codecs ------------------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF8( + const char *string, /* UTF-8 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF8Stateful( + const char *string, /* UTF-8 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF8String( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyUnicode_AsUTF8String( + PyObject *unicode, + const char *errors); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF8( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +#endif + +/* --- UTF-32 Codecs ------------------------------------------------------ */ + +/* Decodes length bytes from a UTF-32 encoded buffer string and returns + the corresponding Unicode object. + + errors (if non-NULL) defines the error handling. It defaults + to "strict". + + If byteorder is non-NULL, the decoder starts decoding using the + given byte order: + + *byteorder == -1: little endian + *byteorder == 0: native order + *byteorder == 1: big endian + + In native mode, the first four bytes of the stream are checked for a + BOM mark. If found, the BOM mark is analysed, the byte order + adjusted and the BOM skipped. In the other modes, no BOM mark + interpretation is done. After completion, *byteorder is set to the + current byte order at the end of input data. + + If byteorder is NULL, the codec starts in native order mode. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF32( + const char *string, /* UTF-32 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF32Stateful( + const char *string, /* UTF-32 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder, /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +/* Returns a Python string using the UTF-32 encoding in native byte + order. The string always starts with a BOM mark. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF32String( + PyObject *unicode /* Unicode object */ + ); + +/* Returns a Python string object holding the UTF-32 encoded value of + the Unicode data. + + If byteorder is not 0, output is written according to the following + byte order: + + byteorder == -1: little endian + byteorder == 0: native byte order (writes a BOM mark) + byteorder == 1: big endian + + If byteorder is 0, the output string will always start with the + Unicode BOM mark (U+FEFF). In the other two modes, no BOM mark is + prepended. + +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF32( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ) Py_DEPRECATED(3.3); +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF32( + PyObject *object, /* Unicode object */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ); +#endif + +/* --- UTF-16 Codecs ------------------------------------------------------ */ + +/* Decodes length bytes from a UTF-16 encoded buffer string and returns + the corresponding Unicode object. + + errors (if non-NULL) defines the error handling. It defaults + to "strict". + + If byteorder is non-NULL, the decoder starts decoding using the + given byte order: + + *byteorder == -1: little endian + *byteorder == 0: native order + *byteorder == 1: big endian + + In native mode, the first two bytes of the stream are checked for a + BOM mark. If found, the BOM mark is analysed, the byte order + adjusted and the BOM skipped. In the other modes, no BOM mark + interpretation is done. After completion, *byteorder is set to the + current byte order at the end of input data. + + If byteorder is NULL, the codec starts in native order mode. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF16( + const char *string, /* UTF-16 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF16Stateful( + const char *string, /* UTF-16 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder, /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +/* Returns a Python string using the UTF-16 encoding in native byte + order. The string always starts with a BOM mark. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF16String( + PyObject *unicode /* Unicode object */ + ); + +/* Returns a Python string object holding the UTF-16 encoded value of + the Unicode data. + + If byteorder is not 0, output is written according to the following + byte order: + + byteorder == -1: little endian + byteorder == 0: native byte order (writes a BOM mark) + byteorder == 1: big endian + + If byteorder is 0, the output string will always start with the + Unicode BOM mark (U+FEFF). In the other two modes, no BOM mark is + prepended. + + Note that Py_UNICODE data is being interpreted as UTF-16 reduced to + UCS-2. This trick makes it possible to add full UTF-16 capabilities + at a later point without compromising the APIs. + +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF16( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ) Py_DEPRECATED(3.3); +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF16( + PyObject* unicode, /* Unicode object */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ); +#endif + +/* --- Unicode-Escape Codecs ---------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUnicodeEscape( + const char *string, /* Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +#ifndef Py_LIMITED_API +/* Helper for PyUnicode_DecodeUnicodeEscape that detects invalid escape + chars. */ +PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscape( + const char *string, /* Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + const char **first_invalid_escape /* on return, points to first + invalid escaped char in + string. */ +); +#endif + +PyAPI_FUNC(PyObject*) PyUnicode_AsUnicodeEscapeString( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUnicodeEscape( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length /* Number of Py_UNICODE chars to encode */ + ) Py_DEPRECATED(3.3); +#endif + +/* --- Raw-Unicode-Escape Codecs ------------------------------------------ */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeRawUnicodeEscape( + const char *string, /* Raw-Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsRawUnicodeEscapeString( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeRawUnicodeEscape( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length /* Number of Py_UNICODE chars to encode */ + ) Py_DEPRECATED(3.3); +#endif + +/* --- Unicode Internal Codec --------------------------------------------- + + Only for internal use in _codecsmodule.c */ + +#ifndef Py_LIMITED_API +PyObject *_PyUnicode_DecodeUnicodeInternal( + const char *string, + Py_ssize_t length, + const char *errors + ); +#endif + +/* --- Latin-1 Codecs ----------------------------------------------------- + + Note: Latin-1 corresponds to the first 256 Unicode ordinals. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeLatin1( + const char *string, /* Latin-1 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsLatin1String( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyUnicode_AsLatin1String( + PyObject* unicode, + const char* errors); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeLatin1( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +#endif + +/* --- ASCII Codecs ------------------------------------------------------- + + Only 7-bit ASCII data is excepted. All other codes generate errors. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeASCII( + const char *string, /* ASCII encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsASCIIString( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyUnicode_AsASCIIString( + PyObject* unicode, + const char* errors); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeASCII( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +#endif + +/* --- Character Map Codecs ----------------------------------------------- + + This codec uses mappings to encode and decode characters. + + Decoding mappings must map byte ordinals (integers in the range from 0 to + 255) to Unicode strings, integers (which are then interpreted as Unicode + ordinals) or None. Unmapped data bytes (ones which cause a LookupError) + as well as mapped to None, 0xFFFE or '\ufffe' are treated as "undefined + mapping" and cause an error. + + Encoding mappings must map Unicode ordinal integers to bytes objects, + integers in the range from 0 to 255 or None. Unmapped character + ordinals (ones which cause a LookupError) as well as mapped to + None are treated as "undefined mapping" and cause an error. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeCharmap( + const char *string, /* Encoded string */ + Py_ssize_t length, /* size of string */ + PyObject *mapping, /* decoding mapping */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsCharmapString( + PyObject *unicode, /* Unicode object */ + PyObject *mapping /* encoding mapping */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeCharmap( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + PyObject *mapping, /* encoding mapping */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeCharmap( + PyObject *unicode, /* Unicode object */ + PyObject *mapping, /* encoding mapping */ + const char *errors /* error handling */ + ); +#endif + +/* Translate a Py_UNICODE buffer of the given length by applying a + character mapping table to it and return the resulting Unicode + object. + + The mapping table must map Unicode ordinal integers to Unicode strings, + Unicode ordinal integers or None (causing deletion of the character). + + Mapping tables may be dictionaries or sequences. Unmapped character + ordinals (ones which cause a LookupError) are left untouched and + are copied as-is. + +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyUnicode_TranslateCharmap( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + PyObject *table, /* Translate table */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +#endif + +#ifdef MS_WINDOWS + +/* --- MBCS codecs for Windows -------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeMBCS( + const char *string, /* MBCS encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeMBCSStateful( + const char *string, /* MBCS encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyUnicode_DecodeCodePageStateful( + int code_page, /* code page number */ + const char *string, /* encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); +#endif + +PyAPI_FUNC(PyObject*) PyUnicode_AsMBCSString( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyUnicode_EncodeCodePage( + int code_page, /* code page number */ + PyObject *unicode, /* Unicode object */ + const char *errors /* error handling */ + ); +#endif + +#endif /* MS_WINDOWS */ + +#ifndef Py_LIMITED_API +/* --- Decimal Encoder ---------------------------------------------------- */ + +/* Takes a Unicode string holding a decimal value and writes it into + an output buffer using standard ASCII digit codes. + + The output buffer has to provide at least length+1 bytes of storage + area. The output string is 0-terminated. + + The encoder converts whitespace to ' ', decimal characters to their + corresponding ASCII digit and all other Latin-1 characters except + \0 as-is. Characters outside this range (Unicode ordinals 1-256) + are treated as errors. This includes embedded NULL bytes. + + Error handling is defined by the errors argument: + + NULL or "strict": raise a ValueError + "ignore": ignore the wrong characters (these are not copied to the + output buffer) + "replace": replaces illegal characters with '?' + + Returns 0 on success, -1 on failure. + +*/ + +PyAPI_FUNC(int) PyUnicode_EncodeDecimal( + Py_UNICODE *s, /* Unicode buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + char *output, /* Output buffer; must have size >= length */ + const char *errors /* error handling */ + ) /* Py_DEPRECATED(3.3) */; + +/* Transforms code points that have decimal digit property to the + corresponding ASCII digit code points. + + Returns a new Unicode string on success, NULL on failure. +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_TransformDecimalToASCII( + Py_UNICODE *s, /* Unicode buffer */ + Py_ssize_t length /* Number of Py_UNICODE chars to transform */ + ) /* Py_DEPRECATED(3.3) */; + +/* Coverts a Unicode object holding a decimal value to an ASCII string + for using in int, float and complex parsers. + Transforms code points that have decimal digit property to the + corresponding ASCII digit code points. Transforms spaces to ASCII. + Transforms code points starting from the first non-ASCII code point that + is neither a decimal digit nor a space to the end into '?'. */ + +PyAPI_FUNC(PyObject*) _PyUnicode_TransformDecimalAndSpaceToASCII( + PyObject *unicode /* Unicode object */ + ); +#endif + +/* --- Locale encoding --------------------------------------------------- */ + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Decode a string from the current locale encoding. The decoder is strict if + *surrogateescape* is equal to zero, otherwise it uses the 'surrogateescape' + error handler (PEP 383) to escape undecodable bytes. If a byte sequence can + be decoded as a surrogate character and *surrogateescape* is not equal to + zero, the byte sequence is escaped using the 'surrogateescape' error handler + instead of being decoded. *str* must end with a null character but cannot + contain embedded null characters. */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeLocaleAndSize( + const char *str, + Py_ssize_t len, + const char *errors); + +/* Similar to PyUnicode_DecodeLocaleAndSize(), but compute the string + length using strlen(). */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeLocale( + const char *str, + const char *errors); + +/* Encode a Unicode object to the current locale encoding. The encoder is + strict is *surrogateescape* is equal to zero, otherwise the + "surrogateescape" error handler is used. Return a bytes object. The string + cannot contain embedded null characters. */ + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeLocale( + PyObject *unicode, + const char *errors + ); +#endif + +/* --- File system encoding ---------------------------------------------- */ + +/* ParseTuple converter: encode str objects to bytes using + PyUnicode_EncodeFSDefault(); bytes objects are output as-is. */ + +PyAPI_FUNC(int) PyUnicode_FSConverter(PyObject*, void*); + +/* ParseTuple converter: decode bytes objects to unicode using + PyUnicode_DecodeFSDefaultAndSize(); str objects are output as-is. */ + +PyAPI_FUNC(int) PyUnicode_FSDecoder(PyObject*, void*); + +/* Decode a null-terminated string using Py_FileSystemDefaultEncoding + and the "surrogateescape" error handler. + + If Py_FileSystemDefaultEncoding is not set, fall back to the locale + encoding. + + Use PyUnicode_DecodeFSDefaultAndSize() if the string length is known. +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeFSDefault( + const char *s /* encoded string */ + ); + +/* Decode a string using Py_FileSystemDefaultEncoding + and the "surrogateescape" error handler. + + If Py_FileSystemDefaultEncoding is not set, fall back to the locale + encoding. +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeFSDefaultAndSize( + const char *s, /* encoded string */ + Py_ssize_t size /* size */ + ); + +/* Encode a Unicode object to Py_FileSystemDefaultEncoding with the + "surrogateescape" error handler, and return bytes. + + If Py_FileSystemDefaultEncoding is not set, fall back to the locale + encoding. +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeFSDefault( + PyObject *unicode + ); + +/* --- Methods & Slots ---------------------------------------------------- + + These are capable of handling Unicode objects and strings on input + (we refer to them as strings in the descriptions) and return + Unicode objects or integers as appropriate. */ + +/* Concat two strings giving a new Unicode string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Concat( + PyObject *left, /* Left string */ + PyObject *right /* Right string */ + ); + +/* Concat two strings and put the result in *pleft + (sets *pleft to NULL on error) */ + +PyAPI_FUNC(void) PyUnicode_Append( + PyObject **pleft, /* Pointer to left string */ + PyObject *right /* Right string */ + ); + +/* Concat two strings, put the result in *pleft and drop the right object + (sets *pleft to NULL on error) */ + +PyAPI_FUNC(void) PyUnicode_AppendAndDel( + PyObject **pleft, /* Pointer to left string */ + PyObject *right /* Right string */ + ); + +/* Split a string giving a list of Unicode strings. + + If sep is NULL, splitting will be done at all whitespace + substrings. Otherwise, splits occur at the given separator. + + At most maxsplit splits will be done. If negative, no limit is set. + + Separators are not included in the resulting list. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_Split( + PyObject *s, /* String to split */ + PyObject *sep, /* String separator */ + Py_ssize_t maxsplit /* Maxsplit count */ + ); + +/* Dito, but split at line breaks. + + CRLF is considered to be one line break. Line breaks are not + included in the resulting list. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Splitlines( + PyObject *s, /* String to split */ + int keepends /* If true, line end markers are included */ + ); + +/* Partition a string using a given separator. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Partition( + PyObject *s, /* String to partition */ + PyObject *sep /* String separator */ + ); + +/* Partition a string using a given separator, searching from the end of the + string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_RPartition( + PyObject *s, /* String to partition */ + PyObject *sep /* String separator */ + ); + +/* Split a string giving a list of Unicode strings. + + If sep is NULL, splitting will be done at all whitespace + substrings. Otherwise, splits occur at the given separator. + + At most maxsplit splits will be done. But unlike PyUnicode_Split + PyUnicode_RSplit splits from the end of the string. If negative, + no limit is set. + + Separators are not included in the resulting list. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_RSplit( + PyObject *s, /* String to split */ + PyObject *sep, /* String separator */ + Py_ssize_t maxsplit /* Maxsplit count */ + ); + +/* Translate a string by applying a character mapping table to it and + return the resulting Unicode object. + + The mapping table must map Unicode ordinal integers to Unicode strings, + Unicode ordinal integers or None (causing deletion of the character). + + Mapping tables may be dictionaries or sequences. Unmapped character + ordinals (ones which cause a LookupError) are left untouched and + are copied as-is. + +*/ + +PyAPI_FUNC(PyObject *) PyUnicode_Translate( + PyObject *str, /* String */ + PyObject *table, /* Translate table */ + const char *errors /* error handling */ + ); + +/* Join a sequence of strings using the given separator and return + the resulting Unicode string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Join( + PyObject *separator, /* Separator string */ + PyObject *seq /* Sequence object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyUnicode_JoinArray( + PyObject *separator, + PyObject *const *items, + Py_ssize_t seqlen + ); +#endif /* Py_LIMITED_API */ + +/* Return 1 if substr matches str[start:end] at the given tail end, 0 + otherwise. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Tailmatch( + PyObject *str, /* String */ + PyObject *substr, /* Prefix or Suffix string */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end, /* Stop index */ + int direction /* Tail end: -1 prefix, +1 suffix */ + ); + +/* Return the first position of substr in str[start:end] using the + given search direction or -1 if not found. -2 is returned in case + an error occurred and an exception is set. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Find( + PyObject *str, /* String */ + PyObject *substr, /* Substring to find */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end, /* Stop index */ + int direction /* Find direction: +1 forward, -1 backward */ + ); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Like PyUnicode_Find, but search for single character only. */ +PyAPI_FUNC(Py_ssize_t) PyUnicode_FindChar( + PyObject *str, + Py_UCS4 ch, + Py_ssize_t start, + Py_ssize_t end, + int direction + ); +#endif + +/* Count the number of occurrences of substr in str[start:end]. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Count( + PyObject *str, /* String */ + PyObject *substr, /* Substring to count */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end /* Stop index */ + ); + +/* Replace at most maxcount occurrences of substr in str with replstr + and return the resulting Unicode object. */ + +PyAPI_FUNC(PyObject *) PyUnicode_Replace( + PyObject *str, /* String */ + PyObject *substr, /* Substring to find */ + PyObject *replstr, /* Substring to replace */ + Py_ssize_t maxcount /* Max. number of replacements to apply; + -1 = all */ + ); + +/* Compare two strings and return -1, 0, 1 for less than, equal, + greater than resp. + Raise an exception and return -1 on error. */ + +PyAPI_FUNC(int) PyUnicode_Compare( + PyObject *left, /* Left string */ + PyObject *right /* Right string */ + ); + +#ifndef Py_LIMITED_API +/* Test whether a unicode is equal to ASCII identifier. Return 1 if true, + 0 otherwise. The right argument must be ASCII identifier. + Any error occurs inside will be cleared before return. */ + +PyAPI_FUNC(int) _PyUnicode_EqualToASCIIId( + PyObject *left, /* Left string */ + _Py_Identifier *right /* Right identifier */ + ); +#endif + +/* Compare a Unicode object with C string and return -1, 0, 1 for less than, + equal, and greater than, respectively. It is best to pass only + ASCII-encoded strings, but the function interprets the input string as + ISO-8859-1 if it contains non-ASCII characters. + This function does not raise exceptions. */ + +PyAPI_FUNC(int) PyUnicode_CompareWithASCIIString( + PyObject *left, + const char *right /* ASCII-encoded string */ + ); + +#ifndef Py_LIMITED_API +/* Test whether a unicode is equal to ASCII string. Return 1 if true, + 0 otherwise. The right argument must be ASCII-encoded string. + Any error occurs inside will be cleared before return. */ + +PyAPI_FUNC(int) _PyUnicode_EqualToASCIIString( + PyObject *left, + const char *right /* ASCII-encoded string */ + ); +#endif + +/* Rich compare two strings and return one of the following: + + - NULL in case an exception was raised + - Py_True or Py_False for successful comparisons + - Py_NotImplemented in case the type combination is unknown + + Possible values for op: + + Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE + +*/ + +PyAPI_FUNC(PyObject *) PyUnicode_RichCompare( + PyObject *left, /* Left string */ + PyObject *right, /* Right string */ + int op /* Operation: Py_EQ, Py_NE, Py_GT, etc. */ + ); + +/* Apply an argument tuple or dictionary to a format string and return + the resulting Unicode string. */ + +PyAPI_FUNC(PyObject *) PyUnicode_Format( + PyObject *format, /* Format string */ + PyObject *args /* Argument tuple or dictionary */ + ); + +/* Checks whether element is contained in container and return 1/0 + accordingly. + + element has to coerce to a one element Unicode string. -1 is + returned in case of an error. */ + +PyAPI_FUNC(int) PyUnicode_Contains( + PyObject *container, /* Container string */ + PyObject *element /* Element string */ + ); + +/* Checks whether argument is a valid identifier. */ + +PyAPI_FUNC(int) PyUnicode_IsIdentifier(PyObject *s); + +#ifndef Py_LIMITED_API +/* Externally visible for str.strip(unicode) */ +PyAPI_FUNC(PyObject *) _PyUnicode_XStrip( + PyObject *self, + int striptype, + PyObject *sepobj + ); +#endif + +/* Using explicit passed-in values, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyUnicode_InsertThousandsGrouping( + PyObject *unicode, + Py_ssize_t index, + Py_ssize_t n_buffer, + void *digits, + Py_ssize_t n_digits, + Py_ssize_t min_width, + const char *grouping, + PyObject *thousands_sep, + Py_UCS4 *maxchar); +#endif +/* === Characters Type APIs =============================================== */ + +/* Helper array used by Py_UNICODE_ISSPACE(). */ + +#ifndef Py_LIMITED_API +PyAPI_DATA(const unsigned char) _Py_ascii_whitespace[]; + +/* These should not be used directly. Use the Py_UNICODE_IS* and + Py_UNICODE_TO* macros instead. + + These APIs are implemented in Objects/unicodectype.c. + +*/ + +PyAPI_FUNC(int) _PyUnicode_IsLowercase( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsUppercase( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsTitlecase( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsXidStart( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsXidContinue( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsWhitespace( + const Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsLinebreak( + const Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(Py_UCS4) _PyUnicode_ToLowercase( + Py_UCS4 ch /* Unicode character */ + ) /* Py_DEPRECATED(3.3) */; + +PyAPI_FUNC(Py_UCS4) _PyUnicode_ToUppercase( + Py_UCS4 ch /* Unicode character */ + ) /* Py_DEPRECATED(3.3) */; + +PyAPI_FUNC(Py_UCS4) _PyUnicode_ToTitlecase( + Py_UCS4 ch /* Unicode character */ + ) Py_DEPRECATED(3.3); + +PyAPI_FUNC(int) _PyUnicode_ToLowerFull( + Py_UCS4 ch, /* Unicode character */ + Py_UCS4 *res + ); + +PyAPI_FUNC(int) _PyUnicode_ToTitleFull( + Py_UCS4 ch, /* Unicode character */ + Py_UCS4 *res + ); + +PyAPI_FUNC(int) _PyUnicode_ToUpperFull( + Py_UCS4 ch, /* Unicode character */ + Py_UCS4 *res + ); + +PyAPI_FUNC(int) _PyUnicode_ToFoldedFull( + Py_UCS4 ch, /* Unicode character */ + Py_UCS4 *res + ); + +PyAPI_FUNC(int) _PyUnicode_IsCaseIgnorable( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsCased( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_ToDecimalDigit( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_ToDigit( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(double) _PyUnicode_ToNumeric( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsDecimalDigit( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsDigit( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsNumeric( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsPrintable( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsAlpha( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(size_t) Py_UNICODE_strlen( + const Py_UNICODE *u + ) Py_DEPRECATED(3.3); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strcpy( + Py_UNICODE *s1, + const Py_UNICODE *s2) Py_DEPRECATED(3.3); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strcat( + Py_UNICODE *s1, const Py_UNICODE *s2) Py_DEPRECATED(3.3); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strncpy( + Py_UNICODE *s1, + const Py_UNICODE *s2, + size_t n) Py_DEPRECATED(3.3); + +PyAPI_FUNC(int) Py_UNICODE_strcmp( + const Py_UNICODE *s1, + const Py_UNICODE *s2 + ) Py_DEPRECATED(3.3); + +PyAPI_FUNC(int) Py_UNICODE_strncmp( + const Py_UNICODE *s1, + const Py_UNICODE *s2, + size_t n + ) Py_DEPRECATED(3.3); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strchr( + const Py_UNICODE *s, + Py_UNICODE c + ) Py_DEPRECATED(3.3); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strrchr( + const Py_UNICODE *s, + Py_UNICODE c + ) Py_DEPRECATED(3.3); + +PyAPI_FUNC(PyObject*) _PyUnicode_FormatLong(PyObject *, int, int, int); + +/* Create a copy of a unicode string ending with a nul character. Return NULL + and raise a MemoryError exception on memory allocation failure, otherwise + return a new allocated buffer (use PyMem_Free() to free the buffer). */ + +PyAPI_FUNC(Py_UNICODE*) PyUnicode_AsUnicodeCopy( + PyObject *unicode + ) Py_DEPRECATED(3.3); +#endif /* Py_LIMITED_API */ + +#if defined(Py_DEBUG) && !defined(Py_LIMITED_API) +PyAPI_FUNC(int) _PyUnicode_CheckConsistency( + PyObject *op, + int check_content); +#elif !defined(NDEBUG) +/* For asserts that call _PyUnicode_CheckConsistency(), which would + * otherwise be a problem when building with asserts but without Py_DEBUG. */ +#define _PyUnicode_CheckConsistency(op, check_content) PyUnicode_Check(op) +#endif + +#ifndef Py_LIMITED_API +/* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/ +PyAPI_FUNC(PyObject*) _PyUnicode_FromId(_Py_Identifier*); +/* Clear all static strings. */ +PyAPI_FUNC(void) _PyUnicode_ClearStaticStrings(void); + +/* Fast equality check when the inputs are known to be exact unicode types + and where the hash values are equal (i.e. a very probable match) */ +PyAPI_FUNC(int) _PyUnicode_EQ(PyObject *, PyObject *); +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_UNICODEOBJECT_H */ diff --git a/venv/Include/warnings.h b/venv/Include/warnings.h new file mode 100644 index 00000000..a675bb5d --- /dev/null +++ b/venv/Include/warnings.h @@ -0,0 +1,67 @@ +#ifndef Py_WARNINGS_H +#define Py_WARNINGS_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyWarnings_Init(void); +#endif + +PyAPI_FUNC(int) PyErr_WarnEx( + PyObject *category, + const char *message, /* UTF-8 encoded string */ + Py_ssize_t stack_level); +PyAPI_FUNC(int) PyErr_WarnFormat( + PyObject *category, + Py_ssize_t stack_level, + const char *format, /* ASCII-encoded string */ + ...); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +/* Emit a ResourceWarning warning */ +PyAPI_FUNC(int) PyErr_ResourceWarning( + PyObject *source, + Py_ssize_t stack_level, + const char *format, /* ASCII-encoded string */ + ...); +#endif +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) PyErr_WarnExplicitObject( + PyObject *category, + PyObject *message, + PyObject *filename, + int lineno, + PyObject *module, + PyObject *registry); +#endif +PyAPI_FUNC(int) PyErr_WarnExplicit( + PyObject *category, + const char *message, /* UTF-8 encoded string */ + const char *filename, /* decoded from the filesystem encoding */ + int lineno, + const char *module, /* UTF-8 encoded string */ + PyObject *registry); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) +PyErr_WarnExplicitFormat(PyObject *category, + const char *filename, int lineno, + const char *module, PyObject *registry, + const char *format, ...); +#endif + +/* DEPRECATED: Use PyErr_WarnEx() instead. */ +#ifndef Py_LIMITED_API +#define PyErr_Warn(category, msg) PyErr_WarnEx(category, msg, 1) +#endif + +#ifndef Py_LIMITED_API +void _PyErr_WarnUnawaitedCoroutine(PyObject *coro); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_WARNINGS_H */ + diff --git a/venv/Include/weakrefobject.h b/venv/Include/weakrefobject.h new file mode 100644 index 00000000..17051568 --- /dev/null +++ b/venv/Include/weakrefobject.h @@ -0,0 +1,86 @@ +/* Weak references objects for Python. */ + +#ifndef Py_WEAKREFOBJECT_H +#define Py_WEAKREFOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct _PyWeakReference PyWeakReference; + +/* PyWeakReference is the base struct for the Python ReferenceType, ProxyType, + * and CallableProxyType. + */ +#ifndef Py_LIMITED_API +struct _PyWeakReference { + PyObject_HEAD + + /* The object to which this is a weak reference, or Py_None if none. + * Note that this is a stealth reference: wr_object's refcount is + * not incremented to reflect this pointer. + */ + PyObject *wr_object; + + /* A callable to invoke when wr_object dies, or NULL if none. */ + PyObject *wr_callback; + + /* A cache for wr_object's hash code. As usual for hashes, this is -1 + * if the hash code isn't known yet. + */ + Py_hash_t hash; + + /* If wr_object is weakly referenced, wr_object has a doubly-linked NULL- + * terminated list of weak references to it. These are the list pointers. + * If wr_object goes away, wr_object is set to Py_None, and these pointers + * have no meaning then. + */ + PyWeakReference *wr_prev; + PyWeakReference *wr_next; +}; +#endif + +PyAPI_DATA(PyTypeObject) _PyWeakref_RefType; +PyAPI_DATA(PyTypeObject) _PyWeakref_ProxyType; +PyAPI_DATA(PyTypeObject) _PyWeakref_CallableProxyType; + +#define PyWeakref_CheckRef(op) PyObject_TypeCheck(op, &_PyWeakref_RefType) +#define PyWeakref_CheckRefExact(op) \ + (Py_TYPE(op) == &_PyWeakref_RefType) +#define PyWeakref_CheckProxy(op) \ + ((Py_TYPE(op) == &_PyWeakref_ProxyType) || \ + (Py_TYPE(op) == &_PyWeakref_CallableProxyType)) + +#define PyWeakref_Check(op) \ + (PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op)) + + +PyAPI_FUNC(PyObject *) PyWeakref_NewRef(PyObject *ob, + PyObject *callback); +PyAPI_FUNC(PyObject *) PyWeakref_NewProxy(PyObject *ob, + PyObject *callback); +PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *ref); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyWeakref_GetWeakrefCount(PyWeakReference *head); + +PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self); +#endif + +/* Explanation for the Py_REFCNT() check: when a weakref's target is part + of a long chain of deallocations which triggers the trashcan mechanism, + clearing the weakrefs can be delayed long after the target's refcount + has dropped to zero. In the meantime, code accessing the weakref will + be able to "see" the target object even though it is supposed to be + unreachable. See issue #16602. */ + +#define PyWeakref_GET_OBJECT(ref) \ + (Py_REFCNT(((PyWeakReference *)(ref))->wr_object) > 0 \ + ? ((PyWeakReference *)(ref))->wr_object \ + : Py_None) + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_WEAKREFOBJECT_H */ diff --git a/venv/Lib/__future__.py b/venv/Lib/__future__.py new file mode 100644 index 00000000..ce8bed7a --- /dev/null +++ b/venv/Lib/__future__.py @@ -0,0 +1,146 @@ +"""Record of phased-in incompatible language changes. + +Each line is of the form: + + FeatureName = "_Feature(" OptionalRelease "," MandatoryRelease "," + CompilerFlag ")" + +where, normally, OptionalRelease < MandatoryRelease, and both are 5-tuples +of the same form as sys.version_info: + + (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int + PY_MINOR_VERSION, # the 1; an int + PY_MICRO_VERSION, # the 0; an int + PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string + PY_RELEASE_SERIAL # the 3; an int + ) + +OptionalRelease records the first release in which + + from __future__ import FeatureName + +was accepted. + +In the case of MandatoryReleases that have not yet occurred, +MandatoryRelease predicts the release in which the feature will become part +of the language. + +Else MandatoryRelease records when the feature became part of the language; +in releases at or after that, modules no longer need + + from __future__ import FeatureName + +to use the feature in question, but may continue to use such imports. + +MandatoryRelease may also be None, meaning that a planned feature got +dropped. + +Instances of class _Feature have two corresponding methods, +.getOptionalRelease() and .getMandatoryRelease(). + +CompilerFlag is the (bitfield) flag that should be passed in the fourth +argument to the builtin function compile() to enable the feature in +dynamically compiled code. This flag is stored in the .compiler_flag +attribute on _Future instances. These values must match the appropriate +#defines of CO_xxx flags in Include/compile.h. + +No feature line is ever to be deleted from this file. +""" + +all_feature_names = [ + "nested_scopes", + "generators", + "division", + "absolute_import", + "with_statement", + "print_function", + "unicode_literals", + "barry_as_FLUFL", + "generator_stop", + "annotations", +] + +__all__ = ["all_feature_names"] + all_feature_names + +# The CO_xxx symbols are defined here under the same names defined in +# code.h and used by compile.h, so that an editor search will find them here. +# However, they're not exported in __all__, because they don't really belong to +# this module. +CO_NESTED = 0x0010 # nested_scopes +CO_GENERATOR_ALLOWED = 0 # generators (obsolete, was 0x1000) +CO_FUTURE_DIVISION = 0x2000 # division +CO_FUTURE_ABSOLUTE_IMPORT = 0x4000 # perform absolute imports by default +CO_FUTURE_WITH_STATEMENT = 0x8000 # with statement +CO_FUTURE_PRINT_FUNCTION = 0x10000 # print function +CO_FUTURE_UNICODE_LITERALS = 0x20000 # unicode string literals +CO_FUTURE_BARRY_AS_BDFL = 0x40000 +CO_FUTURE_GENERATOR_STOP = 0x80000 # StopIteration becomes RuntimeError in generators +CO_FUTURE_ANNOTATIONS = 0x100000 # annotations become strings at runtime + +class _Feature: + def __init__(self, optionalRelease, mandatoryRelease, compiler_flag): + self.optional = optionalRelease + self.mandatory = mandatoryRelease + self.compiler_flag = compiler_flag + + def getOptionalRelease(self): + """Return first release in which this feature was recognized. + + This is a 5-tuple, of the same form as sys.version_info. + """ + + return self.optional + + def getMandatoryRelease(self): + """Return release in which this feature will become mandatory. + + This is a 5-tuple, of the same form as sys.version_info, or, if + the feature was dropped, is None. + """ + + return self.mandatory + + def __repr__(self): + return "_Feature" + repr((self.optional, + self.mandatory, + self.compiler_flag)) + +nested_scopes = _Feature((2, 1, 0, "beta", 1), + (2, 2, 0, "alpha", 0), + CO_NESTED) + +generators = _Feature((2, 2, 0, "alpha", 1), + (2, 3, 0, "final", 0), + CO_GENERATOR_ALLOWED) + +division = _Feature((2, 2, 0, "alpha", 2), + (3, 0, 0, "alpha", 0), + CO_FUTURE_DIVISION) + +absolute_import = _Feature((2, 5, 0, "alpha", 1), + (3, 0, 0, "alpha", 0), + CO_FUTURE_ABSOLUTE_IMPORT) + +with_statement = _Feature((2, 5, 0, "alpha", 1), + (2, 6, 0, "alpha", 0), + CO_FUTURE_WITH_STATEMENT) + +print_function = _Feature((2, 6, 0, "alpha", 2), + (3, 0, 0, "alpha", 0), + CO_FUTURE_PRINT_FUNCTION) + +unicode_literals = _Feature((2, 6, 0, "alpha", 2), + (3, 0, 0, "alpha", 0), + CO_FUTURE_UNICODE_LITERALS) + +barry_as_FLUFL = _Feature((3, 1, 0, "alpha", 2), + (3, 9, 0, "alpha", 0), + CO_FUTURE_BARRY_AS_BDFL) + +generator_stop = _Feature((3, 5, 0, "beta", 1), + (3, 7, 0, "alpha", 0), + CO_FUTURE_GENERATOR_STOP) + +annotations = _Feature((3, 7, 0, "beta", 1), + (4, 0, 0, "alpha", 0), + CO_FUTURE_ANNOTATIONS) diff --git a/venv/Lib/__pycache__/__future__.cpython-37.pyc b/venv/Lib/__pycache__/__future__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..112791955f7b9193ca8d51de44168e565c3d2d5a GIT binary patch literal 4130 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 MJmiF3bfymf6UB6Xk^lez literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/abc.cpython-37.pyc b/venv/Lib/__pycache__/abc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53fe4d2d7d72130e67f2b82c6bc203064b39c6bb GIT binary patch literal 6449 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 JmzB-x{{y?n`vL#} literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/bisect.cpython-37.pyc b/venv/Lib/__pycache__/bisect.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7938923432678b36482b49015e52c4f14a9f72bb GIT binary patch literal 2696 zcmds&&u`O66vt<5$4#BIbVZ?BP9skBE{#x+6|h@MwHt{osI3-AgQ7`h63^DL!;BNs z%9Rl89|A}IB_H9`!)ot);yt@bp}=Za3sSX?Jbr#}{NDWdOawX9BsoiBmIRV%)e909 zcTZpXF_ashWVtuMW#S>@x@TAzvt=Q>d>AI|x}OgyP^Yd?M$6pySvwxWP$7Fh5EH77 z#0ng1wk0!?>rNm=Ee~r7YkRl^sry4H4Dl$ARwCKsi5khRV++E^*vGds?^hlU<)+rL z&TOcbxy5|^Qbu`3$C(wznH8wa?kn+{=qh~n*R?xq&GkDQtIeI=d)u2UzpQVq|FpTi zvVOnb9LZ?Z3{|_?&Vi^64zem_gtcwu>te(AW)T`PTc*X&qg7fZF0^_c{2$+@?BGrkYn~VkXqsjPq+9Zem)P&E|O4W9N`i(mGd<01W}KVCB}AOSjgi9Mm`t-1O_uAgh)6f zsue?D9{cR63d20v$!vZ@Hh4FY@PC_7TYx&v34Sfl3$_}u)d+-dX_OI-dg7P#4B9Al zdKMd$LtViJSuL75u(E1_WWnKO@DvyP?G zSw6z6@zk#SvGx{B99-i1+ zpMB0|Gp&}0JFQlJifWXwoMMeRAXwDQD)s&V{sP5`?-tGm9{S*XPcd`t%w@BDqaTZ5 bC~sl?TrwTYyXal=7QM?B9NP2LwH^8n`0ujH literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/codecs.cpython-37.pyc b/venv/Lib/__pycache__/codecs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..126d44e22a8c9a27f81bdc9f1ce47333b4eff345 GIT binary patch literal 33896 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 Ao&W#< literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/copy.cpython-37.pyc b/venv/Lib/__pycache__/copy.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f32641091b709e081144ff0d1e6899f27087fdf0 GIT binary patch literal 7099 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 Xj5>k`0XhO~%yCT9tR5}1`i1`j@2@s- literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/copyreg.cpython-37.pyc b/venv/Lib/__pycache__/copyreg.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdf2ee52831974a02fe2fb758f969dcce20ade1d GIT binary patch literal 4242 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/functools.cpython-37.pyc b/venv/Lib/__pycache__/functools.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c096d2323c6b672739117e18974d02756d3e23d1 GIT binary patch literal 23812 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 Zd1~YfqIMiTXlJtpt%95$`MR<1{{e0$d&>X- literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/token.cpython-37.pyc b/venv/Lib/__pycache__/token.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ce0e2e46207ea11d011acb00908d3bd4f81b396 GIT binary patch literal 3597 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/types.cpython-37.pyc b/venv/Lib/__pycache__/types.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b52da7a1af0b2de4595bd8167368d66060d8435b GIT binary patch literal 8972 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/weakref.cpython-37.pyc b/venv/Lib/__pycache__/weakref.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..006ad8b37295c2916c757ad8e688c30b44eeeb76 GIT binary patch literal 19108 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 len(other): + return False + for elem in self: + if elem not in other: + return False + return True + + def __lt__(self, other): + if not isinstance(other, Set): + return NotImplemented + return len(self) < len(other) and self.__le__(other) + + def __gt__(self, other): + if not isinstance(other, Set): + return NotImplemented + return len(self) > len(other) and self.__ge__(other) + + def __ge__(self, other): + if not isinstance(other, Set): + return NotImplemented + if len(self) < len(other): + return False + for elem in other: + if elem not in self: + return False + return True + + def __eq__(self, other): + if not isinstance(other, Set): + return NotImplemented + return len(self) == len(other) and self.__le__(other) + + @classmethod + def _from_iterable(cls, it): + '''Construct an instance of the class from any iterable input. + + Must override this method if the class constructor signature + does not accept an iterable for an input. + ''' + return cls(it) + + def __and__(self, other): + if not isinstance(other, Iterable): + return NotImplemented + return self._from_iterable(value for value in other if value in self) + + __rand__ = __and__ + + def isdisjoint(self, other): + 'Return True if two sets have a null intersection.' + for value in other: + if value in self: + return False + return True + + def __or__(self, other): + if not isinstance(other, Iterable): + return NotImplemented + chain = (e for s in (self, other) for e in s) + return self._from_iterable(chain) + + __ror__ = __or__ + + def __sub__(self, other): + if not isinstance(other, Set): + if not isinstance(other, Iterable): + return NotImplemented + other = self._from_iterable(other) + return self._from_iterable(value for value in self + if value not in other) + + def __rsub__(self, other): + if not isinstance(other, Set): + if not isinstance(other, Iterable): + return NotImplemented + other = self._from_iterable(other) + return self._from_iterable(value for value in other + if value not in self) + + def __xor__(self, other): + if not isinstance(other, Set): + if not isinstance(other, Iterable): + return NotImplemented + other = self._from_iterable(other) + return (self - other) | (other - self) + + __rxor__ = __xor__ + + def _hash(self): + """Compute the hash value of a set. + + Note that we don't define __hash__: not all sets are hashable. + But if you define a hashable set type, its __hash__ should + call this function. + + This must be compatible __eq__. + + All sets ought to compare equal if they contain the same + elements, regardless of how they are implemented, and + regardless of the order of the elements; so there's not much + freedom for __eq__ or __hash__. We match the algorithm used + by the built-in frozenset type. + """ + MAX = sys.maxsize + MASK = 2 * MAX + 1 + n = len(self) + h = 1927868237 * (n + 1) + h &= MASK + for x in self: + hx = hash(x) + h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167 + h &= MASK + h = h * 69069 + 907133923 + h &= MASK + if h > MAX: + h -= MASK + 1 + if h == -1: + h = 590923713 + return h + +Set.register(frozenset) + + +class MutableSet(Set): + """A mutable set is a finite, iterable container. + + This class provides concrete generic implementations of all + methods except for __contains__, __iter__, __len__, + add(), and discard(). + + To override the comparisons (presumably for speed, as the + semantics are fixed), all you have to do is redefine __le__ and + then the other operations will automatically follow suit. + """ + + __slots__ = () + + @abstractmethod + def add(self, value): + """Add an element.""" + raise NotImplementedError + + @abstractmethod + def discard(self, value): + """Remove an element. Do not raise an exception if absent.""" + raise NotImplementedError + + def remove(self, value): + """Remove an element. If not a member, raise a KeyError.""" + if value not in self: + raise KeyError(value) + self.discard(value) + + def pop(self): + """Return the popped value. Raise KeyError if empty.""" + it = iter(self) + try: + value = next(it) + except StopIteration: + raise KeyError from None + self.discard(value) + return value + + def clear(self): + """This is slow (creates N new iterators!) but effective.""" + try: + while True: + self.pop() + except KeyError: + pass + + def __ior__(self, it): + for value in it: + self.add(value) + return self + + def __iand__(self, it): + for value in (self - it): + self.discard(value) + return self + + def __ixor__(self, it): + if it is self: + self.clear() + else: + if not isinstance(it, Set): + it = self._from_iterable(it) + for value in it: + if value in self: + self.discard(value) + else: + self.add(value) + return self + + def __isub__(self, it): + if it is self: + self.clear() + else: + for value in it: + self.discard(value) + return self + +MutableSet.register(set) + + +### MAPPINGS ### + + +class Mapping(Collection): + + __slots__ = () + + """A Mapping is a generic container for associating key/value + pairs. + + This class provides concrete generic implementations of all + methods except for __getitem__, __iter__, and __len__. + + """ + + @abstractmethod + def __getitem__(self, key): + raise KeyError + + def get(self, key, default=None): + 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.' + try: + return self[key] + except KeyError: + return default + + def __contains__(self, key): + try: + self[key] + except KeyError: + return False + else: + return True + + def keys(self): + "D.keys() -> a set-like object providing a view on D's keys" + return KeysView(self) + + def items(self): + "D.items() -> a set-like object providing a view on D's items" + return ItemsView(self) + + def values(self): + "D.values() -> an object providing a view on D's values" + return ValuesView(self) + + def __eq__(self, other): + if not isinstance(other, Mapping): + return NotImplemented + return dict(self.items()) == dict(other.items()) + + __reversed__ = None + +Mapping.register(mappingproxy) + + +class MappingView(Sized): + + __slots__ = '_mapping', + + def __init__(self, mapping): + self._mapping = mapping + + def __len__(self): + return len(self._mapping) + + def __repr__(self): + return '{0.__class__.__name__}({0._mapping!r})'.format(self) + + +class KeysView(MappingView, Set): + + __slots__ = () + + @classmethod + def _from_iterable(self, it): + return set(it) + + def __contains__(self, key): + return key in self._mapping + + def __iter__(self): + yield from self._mapping + +KeysView.register(dict_keys) + + +class ItemsView(MappingView, Set): + + __slots__ = () + + @classmethod + def _from_iterable(self, it): + return set(it) + + def __contains__(self, item): + key, value = item + try: + v = self._mapping[key] + except KeyError: + return False + else: + return v is value or v == value + + def __iter__(self): + for key in self._mapping: + yield (key, self._mapping[key]) + +ItemsView.register(dict_items) + + +class ValuesView(MappingView, Collection): + + __slots__ = () + + def __contains__(self, value): + for key in self._mapping: + v = self._mapping[key] + if v is value or v == value: + return True + return False + + def __iter__(self): + for key in self._mapping: + yield self._mapping[key] + +ValuesView.register(dict_values) + + +class MutableMapping(Mapping): + + __slots__ = () + + """A MutableMapping is a generic container for associating + key/value pairs. + + This class provides concrete generic implementations of all + methods except for __getitem__, __setitem__, __delitem__, + __iter__, and __len__. + + """ + + @abstractmethod + def __setitem__(self, key, value): + raise KeyError + + @abstractmethod + def __delitem__(self, key): + raise KeyError + + __marker = object() + + def pop(self, key, default=__marker): + '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + ''' + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def popitem(self): + '''D.popitem() -> (k, v), remove and return some (key, value) pair + as a 2-tuple; but raise KeyError if D is empty. + ''' + try: + key = next(iter(self)) + except StopIteration: + raise KeyError from None + value = self[key] + del self[key] + return key, value + + def clear(self): + 'D.clear() -> None. Remove all items from D.' + try: + while True: + self.popitem() + except KeyError: + pass + + def update(*args, **kwds): + ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F. + If E present and has a .keys() method, does: for k in E: D[k] = E[k] + If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v + In either case, this is followed by: for k, v in F.items(): D[k] = v + ''' + if not args: + raise TypeError("descriptor 'update' of 'MutableMapping' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('update expected at most 1 arguments, got %d' % + len(args)) + if args: + other = args[0] + if isinstance(other, Mapping): + for key in other: + self[key] = other[key] + elif hasattr(other, "keys"): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + def setdefault(self, key, default=None): + 'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D' + try: + return self[key] + except KeyError: + self[key] = default + return default + +MutableMapping.register(dict) + + +### SEQUENCES ### + + +class Sequence(Reversible, Collection): + + """All the operations on a read-only sequence. + + Concrete subclasses must override __new__ or __init__, + __getitem__, and __len__. + """ + + __slots__ = () + + @abstractmethod + def __getitem__(self, index): + raise IndexError + + def __iter__(self): + i = 0 + try: + while True: + v = self[i] + yield v + i += 1 + except IndexError: + return + + def __contains__(self, value): + for v in self: + if v is value or v == value: + return True + return False + + def __reversed__(self): + for i in reversed(range(len(self))): + yield self[i] + + def index(self, value, start=0, stop=None): + '''S.index(value, [start, [stop]]) -> integer -- return first index of value. + Raises ValueError if the value is not present. + + Supporting start and stop arguments is optional, but + recommended. + ''' + if start is not None and start < 0: + start = max(len(self) + start, 0) + if stop is not None and stop < 0: + stop += len(self) + + i = start + while stop is None or i < stop: + try: + v = self[i] + if v is value or v == value: + return i + except IndexError: + break + i += 1 + raise ValueError + + def count(self, value): + 'S.count(value) -> integer -- return number of occurrences of value' + return sum(1 for v in self if v is value or v == value) + +Sequence.register(tuple) +Sequence.register(str) +Sequence.register(range) +Sequence.register(memoryview) + + +class ByteString(Sequence): + + """This unifies bytes and bytearray. + + XXX Should add all their methods. + """ + + __slots__ = () + +ByteString.register(bytes) +ByteString.register(bytearray) + + +class MutableSequence(Sequence): + + __slots__ = () + + """All the operations on a read-write sequence. + + Concrete subclasses must provide __new__ or __init__, + __getitem__, __setitem__, __delitem__, __len__, and insert(). + + """ + + @abstractmethod + def __setitem__(self, index, value): + raise IndexError + + @abstractmethod + def __delitem__(self, index): + raise IndexError + + @abstractmethod + def insert(self, index, value): + 'S.insert(index, value) -- insert value before index' + raise IndexError + + def append(self, value): + 'S.append(value) -- append value to the end of the sequence' + self.insert(len(self), value) + + def clear(self): + 'S.clear() -> None -- remove all items from S' + try: + while True: + self.pop() + except IndexError: + pass + + def reverse(self): + 'S.reverse() -- reverse *IN PLACE*' + n = len(self) + for i in range(n//2): + self[i], self[n-i-1] = self[n-i-1], self[i] + + def extend(self, values): + 'S.extend(iterable) -- extend sequence by appending elements from the iterable' + for v in values: + self.append(v) + + def pop(self, index=-1): + '''S.pop([index]) -> item -- remove and return item at index (default last). + Raise IndexError if list is empty or index is out of range. + ''' + v = self[index] + del self[index] + return v + + def remove(self, value): + '''S.remove(value) -- remove first occurrence of value. + Raise ValueError if the value is not present. + ''' + del self[self.index(value)] + + def __iadd__(self, values): + self.extend(values) + return self + +MutableSequence.register(list) +MutableSequence.register(bytearray) # Multiply inheriting, see ByteString diff --git a/venv/Lib/_dummy_thread.py b/venv/Lib/_dummy_thread.py new file mode 100644 index 00000000..a2cae54b --- /dev/null +++ b/venv/Lib/_dummy_thread.py @@ -0,0 +1,163 @@ +"""Drop-in replacement for the thread module. + +Meant to be used as a brain-dead substitute so that threaded code does +not need to be rewritten for when the thread module is not present. + +Suggested usage is:: + + try: + import _thread + except ImportError: + import _dummy_thread as _thread + +""" +# Exports only things specified by thread documentation; +# skipping obsolete synonyms allocate(), start_new(), exit_thread(). +__all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock', + 'interrupt_main', 'LockType'] + +# A dummy value +TIMEOUT_MAX = 2**31 + +# NOTE: this module can be imported early in the extension building process, +# and so top level imports of other modules should be avoided. Instead, all +# imports are done when needed on a function-by-function basis. Since threads +# are disabled, the import lock should not be an issue anyway (??). + +error = RuntimeError + +def start_new_thread(function, args, kwargs={}): + """Dummy implementation of _thread.start_new_thread(). + + Compatibility is maintained by making sure that ``args`` is a + tuple and ``kwargs`` is a dictionary. If an exception is raised + and it is SystemExit (which can be done by _thread.exit()) it is + caught and nothing is done; all other exceptions are printed out + by using traceback.print_exc(). + + If the executed function calls interrupt_main the KeyboardInterrupt will be + raised when the function returns. + + """ + if type(args) != type(tuple()): + raise TypeError("2nd arg must be a tuple") + if type(kwargs) != type(dict()): + raise TypeError("3rd arg must be a dict") + global _main + _main = False + try: + function(*args, **kwargs) + except SystemExit: + pass + except: + import traceback + traceback.print_exc() + _main = True + global _interrupt + if _interrupt: + _interrupt = False + raise KeyboardInterrupt + +def exit(): + """Dummy implementation of _thread.exit().""" + raise SystemExit + +def get_ident(): + """Dummy implementation of _thread.get_ident(). + + Since this module should only be used when _threadmodule is not + available, it is safe to assume that the current process is the + only thread. Thus a constant can be safely returned. + """ + return 1 + +def allocate_lock(): + """Dummy implementation of _thread.allocate_lock().""" + return LockType() + +def stack_size(size=None): + """Dummy implementation of _thread.stack_size().""" + if size is not None: + raise error("setting thread stack size not supported") + return 0 + +def _set_sentinel(): + """Dummy implementation of _thread._set_sentinel().""" + return LockType() + +class LockType(object): + """Class implementing dummy implementation of _thread.LockType. + + Compatibility is maintained by maintaining self.locked_status + which is a boolean that stores the state of the lock. Pickling of + the lock, though, should not be done since if the _thread module is + then used with an unpickled ``lock()`` from here problems could + occur from this class not having atomic methods. + + """ + + def __init__(self): + self.locked_status = False + + def acquire(self, waitflag=None, timeout=-1): + """Dummy implementation of acquire(). + + For blocking calls, self.locked_status is automatically set to + True and returned appropriately based on value of + ``waitflag``. If it is non-blocking, then the value is + actually checked and not set if it is already acquired. This + is all done so that threading.Condition's assert statements + aren't triggered and throw a little fit. + + """ + if waitflag is None or waitflag: + self.locked_status = True + return True + else: + if not self.locked_status: + self.locked_status = True + return True + else: + if timeout > 0: + import time + time.sleep(timeout) + return False + + __enter__ = acquire + + def __exit__(self, typ, val, tb): + self.release() + + def release(self): + """Release the dummy lock.""" + # XXX Perhaps shouldn't actually bother to test? Could lead + # to problems for complex, threaded code. + if not self.locked_status: + raise error + self.locked_status = False + return True + + def locked(self): + return self.locked_status + + def __repr__(self): + return "<%s %s.%s object at %s>" % ( + "locked" if self.locked_status else "unlocked", + self.__class__.__module__, + self.__class__.__qualname__, + hex(id(self)) + ) + +# Used to signal that interrupt_main was called in a "thread" +_interrupt = False +# True when not executing in a "thread" +_main = True + +def interrupt_main(): + """Set _interrupt flag to True to have start_new_thread raise + KeyboardInterrupt upon exiting.""" + if _main: + raise KeyboardInterrupt + else: + global _interrupt + _interrupt = True diff --git a/venv/Lib/_weakrefset.py b/venv/Lib/_weakrefset.py new file mode 100644 index 00000000..304c66f5 --- /dev/null +++ b/venv/Lib/_weakrefset.py @@ -0,0 +1,196 @@ +# Access WeakSet through the weakref module. +# This code is separated-out because it is needed +# by abc.py to load everything else at startup. + +from _weakref import ref + +__all__ = ['WeakSet'] + + +class _IterationGuard: + # This context manager registers itself in the current iterators of the + # weak container, such as to delay all removals until the context manager + # exits. + # This technique should be relatively thread-safe (since sets are). + + def __init__(self, weakcontainer): + # Don't create cycles + self.weakcontainer = ref(weakcontainer) + + def __enter__(self): + w = self.weakcontainer() + if w is not None: + w._iterating.add(self) + return self + + def __exit__(self, e, t, b): + w = self.weakcontainer() + if w is not None: + s = w._iterating + s.remove(self) + if not s: + w._commit_removals() + + +class WeakSet: + def __init__(self, data=None): + self.data = set() + def _remove(item, selfref=ref(self)): + self = selfref() + if self is not None: + if self._iterating: + self._pending_removals.append(item) + else: + self.data.discard(item) + self._remove = _remove + # A list of keys to be removed + self._pending_removals = [] + self._iterating = set() + if data is not None: + self.update(data) + + def _commit_removals(self): + l = self._pending_removals + discard = self.data.discard + while l: + discard(l.pop()) + + def __iter__(self): + with _IterationGuard(self): + for itemref in self.data: + item = itemref() + if item is not None: + # Caveat: the iterator will keep a strong reference to + # `item` until it is resumed or closed. + yield item + + def __len__(self): + return len(self.data) - len(self._pending_removals) + + def __contains__(self, item): + try: + wr = ref(item) + except TypeError: + return False + return wr in self.data + + def __reduce__(self): + return (self.__class__, (list(self),), + getattr(self, '__dict__', None)) + + def add(self, item): + if self._pending_removals: + self._commit_removals() + self.data.add(ref(item, self._remove)) + + def clear(self): + if self._pending_removals: + self._commit_removals() + self.data.clear() + + def copy(self): + return self.__class__(self) + + def pop(self): + if self._pending_removals: + self._commit_removals() + while True: + try: + itemref = self.data.pop() + except KeyError: + raise KeyError('pop from empty WeakSet') from None + item = itemref() + if item is not None: + return item + + def remove(self, item): + if self._pending_removals: + self._commit_removals() + self.data.remove(ref(item)) + + def discard(self, item): + if self._pending_removals: + self._commit_removals() + self.data.discard(ref(item)) + + def update(self, other): + if self._pending_removals: + self._commit_removals() + for element in other: + self.add(element) + + def __ior__(self, other): + self.update(other) + return self + + def difference(self, other): + newset = self.copy() + newset.difference_update(other) + return newset + __sub__ = difference + + def difference_update(self, other): + self.__isub__(other) + def __isub__(self, other): + if self._pending_removals: + self._commit_removals() + if self is other: + self.data.clear() + else: + self.data.difference_update(ref(item) for item in other) + return self + + def intersection(self, other): + return self.__class__(item for item in other if item in self) + __and__ = intersection + + def intersection_update(self, other): + self.__iand__(other) + def __iand__(self, other): + if self._pending_removals: + self._commit_removals() + self.data.intersection_update(ref(item) for item in other) + return self + + def issubset(self, other): + return self.data.issubset(ref(item) for item in other) + __le__ = issubset + + def __lt__(self, other): + return self.data < set(map(ref, other)) + + def issuperset(self, other): + return self.data.issuperset(ref(item) for item in other) + __ge__ = issuperset + + def __gt__(self, other): + return self.data > set(map(ref, other)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.data == set(map(ref, other)) + + def symmetric_difference(self, other): + newset = self.copy() + newset.symmetric_difference_update(other) + return newset + __xor__ = symmetric_difference + + def symmetric_difference_update(self, other): + self.__ixor__(other) + def __ixor__(self, other): + if self._pending_removals: + self._commit_removals() + if self is other: + self.data.clear() + else: + self.data.symmetric_difference_update(ref(item, self._remove) for item in other) + return self + + def union(self, other): + return self.__class__(e for s in (self, other) for e in s) + __or__ = union + + def isdisjoint(self, other): + return len(self.intersection(other)) == 0 diff --git a/venv/Lib/abc.py b/venv/Lib/abc.py new file mode 100644 index 00000000..70941412 --- /dev/null +++ b/venv/Lib/abc.py @@ -0,0 +1,170 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Abstract Base Classes (ABCs) according to PEP 3119.""" + + +def abstractmethod(funcobj): + """A decorator indicating abstract methods. + + Requires that the metaclass is ABCMeta or derived from it. A + class that has a metaclass derived from ABCMeta cannot be + instantiated unless all of its abstract methods are overridden. + The abstract methods can be called using any of the normal + 'super' call mechanisms. + + Usage: + + class C(metaclass=ABCMeta): + @abstractmethod + def my_abstract_method(self, ...): + ... + """ + funcobj.__isabstractmethod__ = True + return funcobj + + +class abstractclassmethod(classmethod): + """A decorator indicating abstract classmethods. + + Similar to abstractmethod. + + Usage: + + class C(metaclass=ABCMeta): + @abstractclassmethod + def my_abstract_classmethod(cls, ...): + ... + + 'abstractclassmethod' is deprecated. Use 'classmethod' with + 'abstractmethod' instead. + """ + + __isabstractmethod__ = True + + def __init__(self, callable): + callable.__isabstractmethod__ = True + super().__init__(callable) + + +class abstractstaticmethod(staticmethod): + """A decorator indicating abstract staticmethods. + + Similar to abstractmethod. + + Usage: + + class C(metaclass=ABCMeta): + @abstractstaticmethod + def my_abstract_staticmethod(...): + ... + + 'abstractstaticmethod' is deprecated. Use 'staticmethod' with + 'abstractmethod' instead. + """ + + __isabstractmethod__ = True + + def __init__(self, callable): + callable.__isabstractmethod__ = True + super().__init__(callable) + + +class abstractproperty(property): + """A decorator indicating abstract properties. + + Requires that the metaclass is ABCMeta or derived from it. A + class that has a metaclass derived from ABCMeta cannot be + instantiated unless all of its abstract properties are overridden. + The abstract properties can be called using any of the normal + 'super' call mechanisms. + + Usage: + + class C(metaclass=ABCMeta): + @abstractproperty + def my_abstract_property(self): + ... + + This defines a read-only property; you can also define a read-write + abstract property using the 'long' form of property declaration: + + class C(metaclass=ABCMeta): + def getx(self): ... + def setx(self, value): ... + x = abstractproperty(getx, setx) + + 'abstractproperty' is deprecated. Use 'property' with 'abstractmethod' + instead. + """ + + __isabstractmethod__ = True + + +try: + from _abc import (get_cache_token, _abc_init, _abc_register, + _abc_instancecheck, _abc_subclasscheck, _get_dump, + _reset_registry, _reset_caches) +except ImportError: + from _py_abc import ABCMeta, get_cache_token + ABCMeta.__module__ = 'abc' +else: + class ABCMeta(type): + """Metaclass for defining Abstract Base Classes (ABCs). + + Use this metaclass to create an ABC. An ABC can be subclassed + directly, and then acts as a mix-in class. You can also register + unrelated concrete classes (even built-in classes) and unrelated + ABCs as 'virtual subclasses' -- these and their descendants will + be considered subclasses of the registering ABC by the built-in + issubclass() function, but the registering ABC won't show up in + their MRO (Method Resolution Order) nor will method + implementations defined by the registering ABC be callable (not + even via super()). + """ + def __new__(mcls, name, bases, namespace, **kwargs): + cls = super().__new__(mcls, name, bases, namespace, **kwargs) + _abc_init(cls) + return cls + + def register(cls, subclass): + """Register a virtual subclass of an ABC. + + Returns the subclass, to allow usage as a class decorator. + """ + return _abc_register(cls, subclass) + + def __instancecheck__(cls, instance): + """Override for isinstance(instance, cls).""" + return _abc_instancecheck(cls, instance) + + def __subclasscheck__(cls, subclass): + """Override for issubclass(subclass, cls).""" + return _abc_subclasscheck(cls, subclass) + + def _dump_registry(cls, file=None): + """Debug helper to print the ABC registry.""" + print(f"Class: {cls.__module__}.{cls.__qualname__}", file=file) + print(f"Inv. counter: {get_cache_token()}", file=file) + (_abc_registry, _abc_cache, _abc_negative_cache, + _abc_negative_cache_version) = _get_dump(cls) + print(f"_abc_registry: {_abc_registry!r}", file=file) + print(f"_abc_cache: {_abc_cache!r}", file=file) + print(f"_abc_negative_cache: {_abc_negative_cache!r}", file=file) + print(f"_abc_negative_cache_version: {_abc_negative_cache_version!r}", + file=file) + + def _abc_registry_clear(cls): + """Clear the registry (for debugging or testing).""" + _reset_registry(cls) + + def _abc_caches_clear(cls): + """Clear the caches (for debugging or testing).""" + _reset_caches(cls) + + +class ABC(metaclass=ABCMeta): + """Helper class that provides a standard way to create an ABC using + inheritance. + """ + __slots__ = () diff --git a/venv/Lib/base64.py b/venv/Lib/base64.py new file mode 100644 index 00000000..eb8f258a --- /dev/null +++ b/venv/Lib/base64.py @@ -0,0 +1,602 @@ +#! /usr/bin/env python3 + +"""Base16, Base32, Base64 (RFC 3548), Base85 and Ascii85 data encodings""" + +# Modified 04-Oct-1995 by Jack Jansen to use binascii module +# Modified 30-Dec-2003 by Barry Warsaw to add full RFC 3548 support +# Modified 22-May-2007 by Guido van Rossum to use bytes everywhere + +import re +import struct +import binascii + + +__all__ = [ + # Legacy interface exports traditional RFC 2045 Base64 encodings + 'encode', 'decode', 'encodebytes', 'decodebytes', + # Generalized interface for other encodings + 'b64encode', 'b64decode', 'b32encode', 'b32decode', + 'b16encode', 'b16decode', + # Base85 and Ascii85 encodings + 'b85encode', 'b85decode', 'a85encode', 'a85decode', + # Standard Base64 encoding + 'standard_b64encode', 'standard_b64decode', + # Some common Base64 alternatives. As referenced by RFC 3458, see thread + # starting at: + # + # http://zgp.org/pipermail/p2p-hackers/2001-September/000316.html + 'urlsafe_b64encode', 'urlsafe_b64decode', + ] + + +bytes_types = (bytes, bytearray) # Types acceptable as binary data + +def _bytes_from_decode_data(s): + if isinstance(s, str): + try: + return s.encode('ascii') + except UnicodeEncodeError: + raise ValueError('string argument should contain only ASCII characters') + if isinstance(s, bytes_types): + return s + try: + return memoryview(s).tobytes() + except TypeError: + raise TypeError("argument should be a bytes-like object or ASCII " + "string, not %r" % s.__class__.__name__) from None + + +# Base64 encoding/decoding uses binascii + +def b64encode(s, altchars=None): + """Encode the bytes-like object s using Base64 and return a bytes object. + + Optional altchars should be a byte string of length 2 which specifies an + alternative alphabet for the '+' and '/' characters. This allows an + application to e.g. generate url or filesystem safe Base64 strings. + """ + encoded = binascii.b2a_base64(s, newline=False) + if altchars is not None: + assert len(altchars) == 2, repr(altchars) + return encoded.translate(bytes.maketrans(b'+/', altchars)) + return encoded + + +def b64decode(s, altchars=None, validate=False): + """Decode the Base64 encoded bytes-like object or ASCII string s. + + Optional altchars must be a bytes-like object or ASCII string of length 2 + which specifies the alternative alphabet used instead of the '+' and '/' + characters. + + The result is returned as a bytes object. A binascii.Error is raised if + s is incorrectly padded. + + If validate is False (the default), characters that are neither in the + normal base-64 alphabet nor the alternative alphabet are discarded prior + to the padding check. If validate is True, these non-alphabet characters + in the input result in a binascii.Error. + """ + s = _bytes_from_decode_data(s) + if altchars is not None: + altchars = _bytes_from_decode_data(altchars) + assert len(altchars) == 2, repr(altchars) + s = s.translate(bytes.maketrans(altchars, b'+/')) + if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): + raise binascii.Error('Non-base64 digit found') + return binascii.a2b_base64(s) + + +def standard_b64encode(s): + """Encode bytes-like object s using the standard Base64 alphabet. + + The result is returned as a bytes object. + """ + return b64encode(s) + +def standard_b64decode(s): + """Decode bytes encoded with the standard Base64 alphabet. + + Argument s is a bytes-like object or ASCII string to decode. The result + is returned as a bytes object. A binascii.Error is raised if the input + is incorrectly padded. Characters that are not in the standard alphabet + are discarded prior to the padding check. + """ + return b64decode(s) + + +_urlsafe_encode_translation = bytes.maketrans(b'+/', b'-_') +_urlsafe_decode_translation = bytes.maketrans(b'-_', b'+/') + +def urlsafe_b64encode(s): + """Encode bytes using the URL- and filesystem-safe Base64 alphabet. + + Argument s is a bytes-like object to encode. The result is returned as a + bytes object. The alphabet uses '-' instead of '+' and '_' instead of + '/'. + """ + return b64encode(s).translate(_urlsafe_encode_translation) + +def urlsafe_b64decode(s): + """Decode bytes using the URL- and filesystem-safe Base64 alphabet. + + Argument s is a bytes-like object or ASCII string to decode. The result + is returned as a bytes object. A binascii.Error is raised if the input + is incorrectly padded. Characters that are not in the URL-safe base-64 + alphabet, and are not a plus '+' or slash '/', are discarded prior to the + padding check. + + The alphabet uses '-' instead of '+' and '_' instead of '/'. + """ + s = _bytes_from_decode_data(s) + s = s.translate(_urlsafe_decode_translation) + return b64decode(s) + + + +# Base32 encoding/decoding must be done in Python +_b32alphabet = b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567' +_b32tab2 = None +_b32rev = None + +def b32encode(s): + """Encode the bytes-like object s using Base32 and return a bytes object. + """ + global _b32tab2 + # Delay the initialization of the table to not waste memory + # if the function is never called + if _b32tab2 is None: + b32tab = [bytes((i,)) for i in _b32alphabet] + _b32tab2 = [a + b for a in b32tab for b in b32tab] + b32tab = None + + if not isinstance(s, bytes_types): + s = memoryview(s).tobytes() + leftover = len(s) % 5 + # Pad the last quantum with zero bits if necessary + if leftover: + s = s + b'\0' * (5 - leftover) # Don't use += ! + encoded = bytearray() + from_bytes = int.from_bytes + b32tab2 = _b32tab2 + for i in range(0, len(s), 5): + c = from_bytes(s[i: i + 5], 'big') + encoded += (b32tab2[c >> 30] + # bits 1 - 10 + b32tab2[(c >> 20) & 0x3ff] + # bits 11 - 20 + b32tab2[(c >> 10) & 0x3ff] + # bits 21 - 30 + b32tab2[c & 0x3ff] # bits 31 - 40 + ) + # Adjust for any leftover partial quanta + if leftover == 1: + encoded[-6:] = b'======' + elif leftover == 2: + encoded[-4:] = b'====' + elif leftover == 3: + encoded[-3:] = b'===' + elif leftover == 4: + encoded[-1:] = b'=' + return bytes(encoded) + +def b32decode(s, casefold=False, map01=None): + """Decode the Base32 encoded bytes-like object or ASCII string s. + + Optional casefold is a flag specifying whether a lowercase alphabet is + acceptable as input. For security purposes, the default is False. + + RFC 3548 allows for optional mapping of the digit 0 (zero) to the + letter O (oh), and for optional mapping of the digit 1 (one) to + either the letter I (eye) or letter L (el). The optional argument + map01 when not None, specifies which letter the digit 1 should be + mapped to (when map01 is not None, the digit 0 is always mapped to + the letter O). For security purposes the default is None, so that + 0 and 1 are not allowed in the input. + + The result is returned as a bytes object. A binascii.Error is raised if + the input is incorrectly padded or if there are non-alphabet + characters present in the input. + """ + global _b32rev + # Delay the initialization of the table to not waste memory + # if the function is never called + if _b32rev is None: + _b32rev = {v: k for k, v in enumerate(_b32alphabet)} + s = _bytes_from_decode_data(s) + if len(s) % 8: + raise binascii.Error('Incorrect padding') + # Handle section 2.4 zero and one mapping. The flag map01 will be either + # False, or the character to map the digit 1 (one) to. It should be + # either L (el) or I (eye). + if map01 is not None: + map01 = _bytes_from_decode_data(map01) + assert len(map01) == 1, repr(map01) + s = s.translate(bytes.maketrans(b'01', b'O' + map01)) + if casefold: + s = s.upper() + # Strip off pad characters from the right. We need to count the pad + # characters because this will tell us how many null bytes to remove from + # the end of the decoded string. + l = len(s) + s = s.rstrip(b'=') + padchars = l - len(s) + # Now decode the full quanta + decoded = bytearray() + b32rev = _b32rev + for i in range(0, len(s), 8): + quanta = s[i: i + 8] + acc = 0 + try: + for c in quanta: + acc = (acc << 5) + b32rev[c] + except KeyError: + raise binascii.Error('Non-base32 digit found') from None + decoded += acc.to_bytes(5, 'big') + # Process the last, partial quanta + if padchars: + acc <<= 5 * padchars + last = acc.to_bytes(5, 'big') + if padchars == 1: + decoded[-5:] = last[:-1] + elif padchars == 3: + decoded[-5:] = last[:-2] + elif padchars == 4: + decoded[-5:] = last[:-3] + elif padchars == 6: + decoded[-5:] = last[:-4] + else: + raise binascii.Error('Incorrect padding') + return bytes(decoded) + + + +# RFC 3548, Base 16 Alphabet specifies uppercase, but hexlify() returns +# lowercase. The RFC also recommends against accepting input case +# insensitively. +def b16encode(s): + """Encode the bytes-like object s using Base16 and return a bytes object. + """ + return binascii.hexlify(s).upper() + + +def b16decode(s, casefold=False): + """Decode the Base16 encoded bytes-like object or ASCII string s. + + Optional casefold is a flag specifying whether a lowercase alphabet is + acceptable as input. For security purposes, the default is False. + + The result is returned as a bytes object. A binascii.Error is raised if + s is incorrectly padded or if there are non-alphabet characters present + in the input. + """ + s = _bytes_from_decode_data(s) + if casefold: + s = s.upper() + if re.search(b'[^0-9A-F]', s): + raise binascii.Error('Non-base16 digit found') + return binascii.unhexlify(s) + +# +# Ascii85 encoding/decoding +# + +_a85chars = None +_a85chars2 = None +_A85START = b"<~" +_A85END = b"~>" + +def _85encode(b, chars, chars2, pad=False, foldnuls=False, foldspaces=False): + # Helper function for a85encode and b85encode + if not isinstance(b, bytes_types): + b = memoryview(b).tobytes() + + padding = (-len(b)) % 4 + if padding: + b = b + b'\0' * padding + words = struct.Struct('!%dI' % (len(b) // 4)).unpack(b) + + chunks = [b'z' if foldnuls and not word else + b'y' if foldspaces and word == 0x20202020 else + (chars2[word // 614125] + + chars2[word // 85 % 7225] + + chars[word % 85]) + for word in words] + + if padding and not pad: + if chunks[-1] == b'z': + chunks[-1] = chars[0] * 5 + chunks[-1] = chunks[-1][:-padding] + + return b''.join(chunks) + +def a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False): + """Encode bytes-like object b using Ascii85 and return a bytes object. + + foldspaces is an optional flag that uses the special short sequence 'y' + instead of 4 consecutive spaces (ASCII 0x20) as supported by 'btoa'. This + feature is not supported by the "standard" Adobe encoding. + + wrapcol controls whether the output should have newline (b'\\n') characters + added to it. If this is non-zero, each output line will be at most this + many characters long. + + pad controls whether the input is padded to a multiple of 4 before + encoding. Note that the btoa implementation always pads. + + adobe controls whether the encoded byte sequence is framed with <~ and ~>, + which is used by the Adobe implementation. + """ + global _a85chars, _a85chars2 + # Delay the initialization of tables to not waste memory + # if the function is never called + if _a85chars is None: + _a85chars = [bytes((i,)) for i in range(33, 118)] + _a85chars2 = [(a + b) for a in _a85chars for b in _a85chars] + + result = _85encode(b, _a85chars, _a85chars2, pad, True, foldspaces) + + if adobe: + result = _A85START + result + if wrapcol: + wrapcol = max(2 if adobe else 1, wrapcol) + chunks = [result[i: i + wrapcol] + for i in range(0, len(result), wrapcol)] + if adobe: + if len(chunks[-1]) + 2 > wrapcol: + chunks.append(b'') + result = b'\n'.join(chunks) + if adobe: + result += _A85END + + return result + +def a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\v'): + """Decode the Ascii85 encoded bytes-like object or ASCII string b. + + foldspaces is a flag that specifies whether the 'y' short sequence should be + accepted as shorthand for 4 consecutive spaces (ASCII 0x20). This feature is + not supported by the "standard" Adobe encoding. + + adobe controls whether the input sequence is in Adobe Ascii85 format (i.e. + is framed with <~ and ~>). + + ignorechars should be a byte string containing characters to ignore from the + input. This should only contain whitespace characters, and by default + contains all whitespace characters in ASCII. + + The result is returned as a bytes object. + """ + b = _bytes_from_decode_data(b) + if adobe: + if not b.endswith(_A85END): + raise ValueError( + "Ascii85 encoded byte sequences must end " + "with {!r}".format(_A85END) + ) + if b.startswith(_A85START): + b = b[2:-2] # Strip off start/end markers + else: + b = b[:-2] + # + # We have to go through this stepwise, so as to ignore spaces and handle + # special short sequences + # + packI = struct.Struct('!I').pack + decoded = [] + decoded_append = decoded.append + curr = [] + curr_append = curr.append + curr_clear = curr.clear + for x in b + b'u' * 4: + if b'!'[0] <= x <= b'u'[0]: + curr_append(x) + if len(curr) == 5: + acc = 0 + for x in curr: + acc = 85 * acc + (x - 33) + try: + decoded_append(packI(acc)) + except struct.error: + raise ValueError('Ascii85 overflow') from None + curr_clear() + elif x == b'z'[0]: + if curr: + raise ValueError('z inside Ascii85 5-tuple') + decoded_append(b'\0\0\0\0') + elif foldspaces and x == b'y'[0]: + if curr: + raise ValueError('y inside Ascii85 5-tuple') + decoded_append(b'\x20\x20\x20\x20') + elif x in ignorechars: + # Skip whitespace + continue + else: + raise ValueError('Non-Ascii85 digit found: %c' % x) + + result = b''.join(decoded) + padding = 4 - len(curr) + if padding: + # Throw away the extra padding + result = result[:-padding] + return result + +# The following code is originally taken (with permission) from Mercurial + +_b85alphabet = (b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + b"abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~") +_b85chars = None +_b85chars2 = None +_b85dec = None + +def b85encode(b, pad=False): + """Encode bytes-like object b in base85 format and return a bytes object. + + If pad is true, the input is padded with b'\\0' so its length is a multiple of + 4 bytes before encoding. + """ + global _b85chars, _b85chars2 + # Delay the initialization of tables to not waste memory + # if the function is never called + if _b85chars is None: + _b85chars = [bytes((i,)) for i in _b85alphabet] + _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars] + return _85encode(b, _b85chars, _b85chars2, pad) + +def b85decode(b): + """Decode the base85-encoded bytes-like object or ASCII string b + + The result is returned as a bytes object. + """ + global _b85dec + # Delay the initialization of tables to not waste memory + # if the function is never called + if _b85dec is None: + _b85dec = [None] * 256 + for i, c in enumerate(_b85alphabet): + _b85dec[c] = i + + b = _bytes_from_decode_data(b) + padding = (-len(b)) % 5 + b = b + b'~' * padding + out = [] + packI = struct.Struct('!I').pack + for i in range(0, len(b), 5): + chunk = b[i:i + 5] + acc = 0 + try: + for c in chunk: + acc = acc * 85 + _b85dec[c] + except TypeError: + for j, c in enumerate(chunk): + if _b85dec[c] is None: + raise ValueError('bad base85 character at position %d' + % (i + j)) from None + raise + try: + out.append(packI(acc)) + except struct.error: + raise ValueError('base85 overflow in hunk starting at byte %d' + % i) from None + + result = b''.join(out) + if padding: + result = result[:-padding] + return result + +# Legacy interface. This code could be cleaned up since I don't believe +# binascii has any line length limitations. It just doesn't seem worth it +# though. The files should be opened in binary mode. + +MAXLINESIZE = 76 # Excluding the CRLF +MAXBINSIZE = (MAXLINESIZE//4)*3 + +def encode(input, output): + """Encode a file; input and output are binary files.""" + while True: + s = input.read(MAXBINSIZE) + if not s: + break + while len(s) < MAXBINSIZE: + ns = input.read(MAXBINSIZE-len(s)) + if not ns: + break + s += ns + line = binascii.b2a_base64(s) + output.write(line) + + +def decode(input, output): + """Decode a file; input and output are binary files.""" + while True: + line = input.readline() + if not line: + break + s = binascii.a2b_base64(line) + output.write(s) + +def _input_type_check(s): + try: + m = memoryview(s) + except TypeError as err: + msg = "expected bytes-like object, not %s" % s.__class__.__name__ + raise TypeError(msg) from err + if m.format not in ('c', 'b', 'B'): + msg = ("expected single byte elements, not %r from %s" % + (m.format, s.__class__.__name__)) + raise TypeError(msg) + if m.ndim != 1: + msg = ("expected 1-D data, not %d-D data from %s" % + (m.ndim, s.__class__.__name__)) + raise TypeError(msg) + + +def encodebytes(s): + """Encode a bytestring into a bytes object containing multiple lines + of base-64 data.""" + _input_type_check(s) + pieces = [] + for i in range(0, len(s), MAXBINSIZE): + chunk = s[i : i + MAXBINSIZE] + pieces.append(binascii.b2a_base64(chunk)) + return b"".join(pieces) + +def encodestring(s): + """Legacy alias of encodebytes().""" + import warnings + warnings.warn("encodestring() is a deprecated alias since 3.1, " + "use encodebytes()", + DeprecationWarning, 2) + return encodebytes(s) + + +def decodebytes(s): + """Decode a bytestring of base-64 data into a bytes object.""" + _input_type_check(s) + return binascii.a2b_base64(s) + +def decodestring(s): + """Legacy alias of decodebytes().""" + import warnings + warnings.warn("decodestring() is a deprecated alias since Python 3.1, " + "use decodebytes()", + DeprecationWarning, 2) + return decodebytes(s) + + +# Usable as a script... +def main(): + """Small main program""" + import sys, getopt + try: + opts, args = getopt.getopt(sys.argv[1:], 'deut') + except getopt.error as msg: + sys.stdout = sys.stderr + print(msg) + print("""usage: %s [-d|-e|-u|-t] [file|-] + -d, -u: decode + -e: encode (default) + -t: encode and decode string 'Aladdin:open sesame'"""%sys.argv[0]) + sys.exit(2) + func = encode + for o, a in opts: + if o == '-e': func = encode + if o == '-d': func = decode + if o == '-u': func = decode + if o == '-t': test(); return + if args and args[0] != '-': + with open(args[0], 'rb') as f: + func(f, sys.stdout.buffer) + else: + func(sys.stdin.buffer, sys.stdout.buffer) + + +def test(): + s0 = b"Aladdin:open sesame" + print(repr(s0)) + s1 = encodebytes(s0) + print(repr(s1)) + s2 = decodebytes(s1) + print(repr(s2)) + assert s0 == s2 + + +if __name__ == '__main__': + main() diff --git a/venv/Lib/bisect.py b/venv/Lib/bisect.py new file mode 100644 index 00000000..7732c639 --- /dev/null +++ b/venv/Lib/bisect.py @@ -0,0 +1,92 @@ +"""Bisection algorithms.""" + +def insort_right(a, x, lo=0, hi=None): + """Insert item x in list a, and keep it sorted assuming a is sorted. + + If x is already in a, insert it to the right of the rightmost x. + + Optional args lo (default 0) and hi (default len(a)) bound the + slice of a to be searched. + """ + + if lo < 0: + raise ValueError('lo must be non-negative') + if hi is None: + hi = len(a) + while lo < hi: + mid = (lo+hi)//2 + if x < a[mid]: hi = mid + else: lo = mid+1 + a.insert(lo, x) + +def bisect_right(a, x, lo=0, hi=None): + """Return the index where to insert item x in list a, assuming a is sorted. + + The return value i is such that all e in a[:i] have e <= x, and all e in + a[i:] have e > x. So if x already appears in the list, a.insert(x) will + insert just after the rightmost x already there. + + Optional args lo (default 0) and hi (default len(a)) bound the + slice of a to be searched. + """ + + if lo < 0: + raise ValueError('lo must be non-negative') + if hi is None: + hi = len(a) + while lo < hi: + mid = (lo+hi)//2 + if x < a[mid]: hi = mid + else: lo = mid+1 + return lo + +def insort_left(a, x, lo=0, hi=None): + """Insert item x in list a, and keep it sorted assuming a is sorted. + + If x is already in a, insert it to the left of the leftmost x. + + Optional args lo (default 0) and hi (default len(a)) bound the + slice of a to be searched. + """ + + if lo < 0: + raise ValueError('lo must be non-negative') + if hi is None: + hi = len(a) + while lo < hi: + mid = (lo+hi)//2 + if a[mid] < x: lo = mid+1 + else: hi = mid + a.insert(lo, x) + + +def bisect_left(a, x, lo=0, hi=None): + """Return the index where to insert item x in list a, assuming a is sorted. + + The return value i is such that all e in a[:i] have e < x, and all e in + a[i:] have e >= x. So if x already appears in the list, a.insert(x) will + insert just before the leftmost x already there. + + Optional args lo (default 0) and hi (default len(a)) bound the + slice of a to be searched. + """ + + if lo < 0: + raise ValueError('lo must be non-negative') + if hi is None: + hi = len(a) + while lo < hi: + mid = (lo+hi)//2 + if a[mid] < x: lo = mid+1 + else: hi = mid + return lo + +# Overwrite above definitions with a fast C implementation +try: + from _bisect import * +except ImportError: + pass + +# Create aliases +bisect = bisect_right +insort = insort_right diff --git a/venv/Lib/codecs.py b/venv/Lib/codecs.py new file mode 100644 index 00000000..a70ed20f --- /dev/null +++ b/venv/Lib/codecs.py @@ -0,0 +1,1114 @@ +""" codecs -- Python Codec Registry, API and helpers. + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" + +import builtins +import sys + +### Registry and builtin stateless codec functions + +try: + from _codecs import * +except ImportError as why: + raise SystemError('Failed to load the builtin codecs: %s' % why) + +__all__ = ["register", "lookup", "open", "EncodedFile", "BOM", "BOM_BE", + "BOM_LE", "BOM32_BE", "BOM32_LE", "BOM64_BE", "BOM64_LE", + "BOM_UTF8", "BOM_UTF16", "BOM_UTF16_LE", "BOM_UTF16_BE", + "BOM_UTF32", "BOM_UTF32_LE", "BOM_UTF32_BE", + "CodecInfo", "Codec", "IncrementalEncoder", "IncrementalDecoder", + "StreamReader", "StreamWriter", + "StreamReaderWriter", "StreamRecoder", + "getencoder", "getdecoder", "getincrementalencoder", + "getincrementaldecoder", "getreader", "getwriter", + "encode", "decode", "iterencode", "iterdecode", + "strict_errors", "ignore_errors", "replace_errors", + "xmlcharrefreplace_errors", + "backslashreplace_errors", "namereplace_errors", + "register_error", "lookup_error"] + +### Constants + +# +# Byte Order Mark (BOM = ZERO WIDTH NO-BREAK SPACE = U+FEFF) +# and its possible byte string values +# for UTF8/UTF16/UTF32 output and little/big endian machines +# + +# UTF-8 +BOM_UTF8 = b'\xef\xbb\xbf' + +# UTF-16, little endian +BOM_LE = BOM_UTF16_LE = b'\xff\xfe' + +# UTF-16, big endian +BOM_BE = BOM_UTF16_BE = b'\xfe\xff' + +# UTF-32, little endian +BOM_UTF32_LE = b'\xff\xfe\x00\x00' + +# UTF-32, big endian +BOM_UTF32_BE = b'\x00\x00\xfe\xff' + +if sys.byteorder == 'little': + + # UTF-16, native endianness + BOM = BOM_UTF16 = BOM_UTF16_LE + + # UTF-32, native endianness + BOM_UTF32 = BOM_UTF32_LE + +else: + + # UTF-16, native endianness + BOM = BOM_UTF16 = BOM_UTF16_BE + + # UTF-32, native endianness + BOM_UTF32 = BOM_UTF32_BE + +# Old broken names (don't use in new code) +BOM32_LE = BOM_UTF16_LE +BOM32_BE = BOM_UTF16_BE +BOM64_LE = BOM_UTF32_LE +BOM64_BE = BOM_UTF32_BE + + +### Codec base classes (defining the API) + +class CodecInfo(tuple): + """Codec details when looking up the codec registry""" + + # Private API to allow Python 3.4 to blacklist the known non-Unicode + # codecs in the standard library. A more general mechanism to + # reliably distinguish test encodings from other codecs will hopefully + # be defined for Python 3.5 + # + # See http://bugs.python.org/issue19619 + _is_text_encoding = True # Assume codecs are text encodings by default + + def __new__(cls, encode, decode, streamreader=None, streamwriter=None, + incrementalencoder=None, incrementaldecoder=None, name=None, + *, _is_text_encoding=None): + self = tuple.__new__(cls, (encode, decode, streamreader, streamwriter)) + self.name = name + self.encode = encode + self.decode = decode + self.incrementalencoder = incrementalencoder + self.incrementaldecoder = incrementaldecoder + self.streamwriter = streamwriter + self.streamreader = streamreader + if _is_text_encoding is not None: + self._is_text_encoding = _is_text_encoding + return self + + def __repr__(self): + return "<%s.%s object for encoding %s at %#x>" % \ + (self.__class__.__module__, self.__class__.__qualname__, + self.name, id(self)) + +class Codec: + + """ Defines the interface for stateless encoders/decoders. + + The .encode()/.decode() methods may use different error + handling schemes by providing the errors argument. These + string values are predefined: + + 'strict' - raise a ValueError error (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace' - replace with a suitable replacement character; + Python will use the official U+FFFD REPLACEMENT + CHARACTER for the builtin Unicode codecs on + decoding and '?' on encoding. + 'surrogateescape' - replace with private code points U+DCnn. + 'xmlcharrefreplace' - Replace with the appropriate XML + character reference (only for encoding). + 'backslashreplace' - Replace with backslashed escape sequences. + 'namereplace' - Replace with \\N{...} escape sequences + (only for encoding). + + The set of allowed values can be extended via register_error. + + """ + def encode(self, input, errors='strict'): + + """ Encodes the object input and returns a tuple (output + object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling. + + The method may not store state in the Codec instance. Use + StreamWriter for codecs which have to keep state in order to + make encoding efficient. + + The encoder must be able to handle zero length input and + return an empty object of the output object type in this + situation. + + """ + raise NotImplementedError + + def decode(self, input, errors='strict'): + + """ Decodes the object input and returns a tuple (output + object, length consumed). + + input must be an object which provides the bf_getreadbuf + buffer slot. Python strings, buffer objects and memory + mapped files are examples of objects providing this slot. + + errors defines the error handling to apply. It defaults to + 'strict' handling. + + The method may not store state in the Codec instance. Use + StreamReader for codecs which have to keep state in order to + make decoding efficient. + + The decoder must be able to handle zero length input and + return an empty object of the output object type in this + situation. + + """ + raise NotImplementedError + +class IncrementalEncoder(object): + """ + An IncrementalEncoder encodes an input in multiple steps. The input can + be passed piece by piece to the encode() method. The IncrementalEncoder + remembers the state of the encoding process between calls to encode(). + """ + def __init__(self, errors='strict'): + """ + Creates an IncrementalEncoder instance. + + The IncrementalEncoder may use different error handling schemes by + providing the errors keyword argument. See the module docstring + for a list of possible values. + """ + self.errors = errors + self.buffer = "" + + def encode(self, input, final=False): + """ + Encodes input and returns the resulting object. + """ + raise NotImplementedError + + def reset(self): + """ + Resets the encoder to the initial state. + """ + + def getstate(self): + """ + Return the current state of the encoder. + """ + return 0 + + def setstate(self, state): + """ + Set the current state of the encoder. state must have been + returned by getstate(). + """ + +class BufferedIncrementalEncoder(IncrementalEncoder): + """ + This subclass of IncrementalEncoder can be used as the baseclass for an + incremental encoder if the encoder must keep some of the output in a + buffer between calls to encode(). + """ + def __init__(self, errors='strict'): + IncrementalEncoder.__init__(self, errors) + # unencoded input that is kept between calls to encode() + self.buffer = "" + + def _buffer_encode(self, input, errors, final): + # Overwrite this method in subclasses: It must encode input + # and return an (output, length consumed) tuple + raise NotImplementedError + + def encode(self, input, final=False): + # encode input (taking the buffer into account) + data = self.buffer + input + (result, consumed) = self._buffer_encode(data, self.errors, final) + # keep unencoded input until the next call + self.buffer = data[consumed:] + return result + + def reset(self): + IncrementalEncoder.reset(self) + self.buffer = "" + + def getstate(self): + return self.buffer or 0 + + def setstate(self, state): + self.buffer = state or "" + +class IncrementalDecoder(object): + """ + An IncrementalDecoder decodes an input in multiple steps. The input can + be passed piece by piece to the decode() method. The IncrementalDecoder + remembers the state of the decoding process between calls to decode(). + """ + def __init__(self, errors='strict'): + """ + Create an IncrementalDecoder instance. + + The IncrementalDecoder may use different error handling schemes by + providing the errors keyword argument. See the module docstring + for a list of possible values. + """ + self.errors = errors + + def decode(self, input, final=False): + """ + Decode input and returns the resulting object. + """ + raise NotImplementedError + + def reset(self): + """ + Reset the decoder to the initial state. + """ + + def getstate(self): + """ + Return the current state of the decoder. + + This must be a (buffered_input, additional_state_info) tuple. + buffered_input must be a bytes object containing bytes that + were passed to decode() that have not yet been converted. + additional_state_info must be a non-negative integer + representing the state of the decoder WITHOUT yet having + processed the contents of buffered_input. In the initial state + and after reset(), getstate() must return (b"", 0). + """ + return (b"", 0) + + def setstate(self, state): + """ + Set the current state of the decoder. + + state must have been returned by getstate(). The effect of + setstate((b"", 0)) must be equivalent to reset(). + """ + +class BufferedIncrementalDecoder(IncrementalDecoder): + """ + This subclass of IncrementalDecoder can be used as the baseclass for an + incremental decoder if the decoder must be able to handle incomplete + byte sequences. + """ + def __init__(self, errors='strict'): + IncrementalDecoder.__init__(self, errors) + # undecoded input that is kept between calls to decode() + self.buffer = b"" + + def _buffer_decode(self, input, errors, final): + # Overwrite this method in subclasses: It must decode input + # and return an (output, length consumed) tuple + raise NotImplementedError + + def decode(self, input, final=False): + # decode input (taking the buffer into account) + data = self.buffer + input + (result, consumed) = self._buffer_decode(data, self.errors, final) + # keep undecoded input until the next call + self.buffer = data[consumed:] + return result + + def reset(self): + IncrementalDecoder.reset(self) + self.buffer = b"" + + def getstate(self): + # additional state info is always 0 + return (self.buffer, 0) + + def setstate(self, state): + # ignore additional state info + self.buffer = state[0] + +# +# The StreamWriter and StreamReader class provide generic working +# interfaces which can be used to implement new encoding submodules +# very easily. See encodings/utf_8.py for an example on how this is +# done. +# + +class StreamWriter(Codec): + + def __init__(self, stream, errors='strict'): + + """ Creates a StreamWriter instance. + + stream must be a file-like object open for writing. + + The StreamWriter may use different error handling + schemes by providing the errors keyword argument. These + parameters are predefined: + + 'strict' - raise a ValueError (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace'- replace with a suitable replacement character + 'xmlcharrefreplace' - Replace with the appropriate XML + character reference. + 'backslashreplace' - Replace with backslashed escape + sequences. + 'namereplace' - Replace with \\N{...} escape sequences. + + The set of allowed parameter values can be extended via + register_error. + """ + self.stream = stream + self.errors = errors + + def write(self, object): + + """ Writes the object's contents encoded to self.stream. + """ + data, consumed = self.encode(object, self.errors) + self.stream.write(data) + + def writelines(self, list): + + """ Writes the concatenated list of strings to the stream + using .write(). + """ + self.write(''.join(list)) + + def reset(self): + + """ Flushes and resets the codec buffers used for keeping state. + + Calling this method should ensure that the data on the + output is put into a clean state, that allows appending + of new fresh data without having to rescan the whole + stream to recover state. + + """ + pass + + def seek(self, offset, whence=0): + self.stream.seek(offset, whence) + if whence == 0 and offset == 0: + self.reset() + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### + +class StreamReader(Codec): + + charbuffertype = str + + def __init__(self, stream, errors='strict'): + + """ Creates a StreamReader instance. + + stream must be a file-like object open for reading. + + The StreamReader may use different error handling + schemes by providing the errors keyword argument. These + parameters are predefined: + + 'strict' - raise a ValueError (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace'- replace with a suitable replacement character + 'backslashreplace' - Replace with backslashed escape sequences; + + The set of allowed parameter values can be extended via + register_error. + """ + self.stream = stream + self.errors = errors + self.bytebuffer = b"" + self._empty_charbuffer = self.charbuffertype() + self.charbuffer = self._empty_charbuffer + self.linebuffer = None + + def decode(self, input, errors='strict'): + raise NotImplementedError + + def read(self, size=-1, chars=-1, firstline=False): + + """ Decodes data from the stream self.stream and returns the + resulting object. + + chars indicates the number of decoded code points or bytes to + return. read() will never return more data than requested, + but it might return less, if there is not enough available. + + size indicates the approximate maximum number of decoded + bytes or code points to read for decoding. The decoder + can modify this setting as appropriate. The default value + -1 indicates to read and decode as much as possible. size + is intended to prevent having to decode huge files in one + step. + + If firstline is true, and a UnicodeDecodeError happens + after the first line terminator in the input only the first line + will be returned, the rest of the input will be kept until the + next call to read(). + + The method should use a greedy read strategy, meaning that + it should read as much data as is allowed within the + definition of the encoding and the given size, e.g. if + optional encoding endings or state markers are available + on the stream, these should be read too. + """ + # If we have lines cached, first merge them back into characters + if self.linebuffer: + self.charbuffer = self._empty_charbuffer.join(self.linebuffer) + self.linebuffer = None + + if chars < 0: + # For compatibility with other read() methods that take a + # single argument + chars = size + + # read until we get the required number of characters (if available) + while True: + # can the request be satisfied from the character buffer? + if chars >= 0: + if len(self.charbuffer) >= chars: + break + # we need more data + if size < 0: + newdata = self.stream.read() + else: + newdata = self.stream.read(size) + # decode bytes (those remaining from the last call included) + data = self.bytebuffer + newdata + if not data: + break + try: + newchars, decodedbytes = self.decode(data, self.errors) + except UnicodeDecodeError as exc: + if firstline: + newchars, decodedbytes = \ + self.decode(data[:exc.start], self.errors) + lines = newchars.splitlines(keepends=True) + if len(lines)<=1: + raise + else: + raise + # keep undecoded bytes until the next call + self.bytebuffer = data[decodedbytes:] + # put new characters in the character buffer + self.charbuffer += newchars + # there was no data available + if not newdata: + break + if chars < 0: + # Return everything we've got + result = self.charbuffer + self.charbuffer = self._empty_charbuffer + else: + # Return the first chars characters + result = self.charbuffer[:chars] + self.charbuffer = self.charbuffer[chars:] + return result + + def readline(self, size=None, keepends=True): + + """ Read one line from the input stream and return the + decoded data. + + size, if given, is passed as size argument to the + read() method. + + """ + # If we have lines cached from an earlier read, return + # them unconditionally + if self.linebuffer: + line = self.linebuffer[0] + del self.linebuffer[0] + if len(self.linebuffer) == 1: + # revert to charbuffer mode; we might need more data + # next time + self.charbuffer = self.linebuffer[0] + self.linebuffer = None + if not keepends: + line = line.splitlines(keepends=False)[0] + return line + + readsize = size or 72 + line = self._empty_charbuffer + # If size is given, we call read() only once + while True: + data = self.read(readsize, firstline=True) + if data: + # If we're at a "\r" read one extra character (which might + # be a "\n") to get a proper line ending. If the stream is + # temporarily exhausted we return the wrong line ending. + if (isinstance(data, str) and data.endswith("\r")) or \ + (isinstance(data, bytes) and data.endswith(b"\r")): + data += self.read(size=1, chars=1) + + line += data + lines = line.splitlines(keepends=True) + if lines: + if len(lines) > 1: + # More than one line result; the first line is a full line + # to return + line = lines[0] + del lines[0] + if len(lines) > 1: + # cache the remaining lines + lines[-1] += self.charbuffer + self.linebuffer = lines + self.charbuffer = None + else: + # only one remaining line, put it back into charbuffer + self.charbuffer = lines[0] + self.charbuffer + if not keepends: + line = line.splitlines(keepends=False)[0] + break + line0withend = lines[0] + line0withoutend = lines[0].splitlines(keepends=False)[0] + if line0withend != line0withoutend: # We really have a line end + # Put the rest back together and keep it until the next call + self.charbuffer = self._empty_charbuffer.join(lines[1:]) + \ + self.charbuffer + if keepends: + line = line0withend + else: + line = line0withoutend + break + # we didn't get anything or this was our only try + if not data or size is not None: + if line and not keepends: + line = line.splitlines(keepends=False)[0] + break + if readsize < 8000: + readsize *= 2 + return line + + def readlines(self, sizehint=None, keepends=True): + + """ Read all lines available on the input stream + and return them as a list. + + Line breaks are implemented using the codec's decoder + method and are included in the list entries. + + sizehint, if given, is ignored since there is no efficient + way to finding the true end-of-line. + + """ + data = self.read() + return data.splitlines(keepends) + + def reset(self): + + """ Resets the codec buffers used for keeping state. + + Note that no stream repositioning should take place. + This method is primarily intended to be able to recover + from decoding errors. + + """ + self.bytebuffer = b"" + self.charbuffer = self._empty_charbuffer + self.linebuffer = None + + def seek(self, offset, whence=0): + """ Set the input stream's current position. + + Resets the codec buffers used for keeping state. + """ + self.stream.seek(offset, whence) + self.reset() + + def __next__(self): + + """ Return the next decoded line from the input stream.""" + line = self.readline() + if line: + return line + raise StopIteration + + def __iter__(self): + return self + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### + +class StreamReaderWriter: + + """ StreamReaderWriter instances allow wrapping streams which + work in both read and write modes. + + The design is such that one can use the factory functions + returned by the codec.lookup() function to construct the + instance. + + """ + # Optional attributes set by the file wrappers below + encoding = 'unknown' + + def __init__(self, stream, Reader, Writer, errors='strict'): + + """ Creates a StreamReaderWriter instance. + + stream must be a Stream-like object. + + Reader, Writer must be factory functions or classes + providing the StreamReader, StreamWriter interface resp. + + Error handling is done in the same way as defined for the + StreamWriter/Readers. + + """ + self.stream = stream + self.reader = Reader(stream, errors) + self.writer = Writer(stream, errors) + self.errors = errors + + def read(self, size=-1): + + return self.reader.read(size) + + def readline(self, size=None): + + return self.reader.readline(size) + + def readlines(self, sizehint=None): + + return self.reader.readlines(sizehint) + + def __next__(self): + + """ Return the next decoded line from the input stream.""" + return next(self.reader) + + def __iter__(self): + return self + + def write(self, data): + + return self.writer.write(data) + + def writelines(self, list): + + return self.writer.writelines(list) + + def reset(self): + + self.reader.reset() + self.writer.reset() + + def seek(self, offset, whence=0): + self.stream.seek(offset, whence) + self.reader.reset() + if whence == 0 and offset == 0: + self.writer.reset() + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + # these are needed to make "with StreamReaderWriter(...)" work properly + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### + +class StreamRecoder: + + """ StreamRecoder instances translate data from one encoding to another. + + They use the complete set of APIs returned by the + codecs.lookup() function to implement their task. + + Data written to the StreamRecoder is first decoded into an + intermediate format (depending on the "decode" codec) and then + written to the underlying stream using an instance of the provided + Writer class. + + In the other direction, data is read from the underlying stream using + a Reader instance and then encoded and returned to the caller. + + """ + # Optional attributes set by the file wrappers below + data_encoding = 'unknown' + file_encoding = 'unknown' + + def __init__(self, stream, encode, decode, Reader, Writer, + errors='strict'): + + """ Creates a StreamRecoder instance which implements a two-way + conversion: encode and decode work on the frontend (the + data visible to .read() and .write()) while Reader and Writer + work on the backend (the data in stream). + + You can use these objects to do transparent + transcodings from e.g. latin-1 to utf-8 and back. + + stream must be a file-like object. + + encode and decode must adhere to the Codec interface; Reader and + Writer must be factory functions or classes providing the + StreamReader and StreamWriter interfaces resp. + + Error handling is done in the same way as defined for the + StreamWriter/Readers. + + """ + self.stream = stream + self.encode = encode + self.decode = decode + self.reader = Reader(stream, errors) + self.writer = Writer(stream, errors) + self.errors = errors + + def read(self, size=-1): + + data = self.reader.read(size) + data, bytesencoded = self.encode(data, self.errors) + return data + + def readline(self, size=None): + + if size is None: + data = self.reader.readline() + else: + data = self.reader.readline(size) + data, bytesencoded = self.encode(data, self.errors) + return data + + def readlines(self, sizehint=None): + + data = self.reader.read() + data, bytesencoded = self.encode(data, self.errors) + return data.splitlines(keepends=True) + + def __next__(self): + + """ Return the next decoded line from the input stream.""" + data = next(self.reader) + data, bytesencoded = self.encode(data, self.errors) + return data + + def __iter__(self): + return self + + def write(self, data): + + data, bytesdecoded = self.decode(data, self.errors) + return self.writer.write(data) + + def writelines(self, list): + + data = ''.join(list) + data, bytesdecoded = self.decode(data, self.errors) + return self.writer.write(data) + + def reset(self): + + self.reader.reset() + self.writer.reset() + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### Shortcuts + +def open(filename, mode='r', encoding=None, errors='strict', buffering=1): + + """ Open an encoded file using the given mode and return + a wrapped version providing transparent encoding/decoding. + + Note: The wrapped version will only accept the object format + defined by the codecs, i.e. Unicode objects for most builtin + codecs. Output is also codec dependent and will usually be + Unicode as well. + + Underlying encoded files are always opened in binary mode. + The default file mode is 'r', meaning to open the file in read mode. + + encoding specifies the encoding which is to be used for the + file. + + errors may be given to define the error handling. It defaults + to 'strict' which causes ValueErrors to be raised in case an + encoding error occurs. + + buffering has the same meaning as for the builtin open() API. + It defaults to line buffered. + + The returned wrapped file object provides an extra attribute + .encoding which allows querying the used encoding. This + attribute is only available if an encoding was specified as + parameter. + + """ + if encoding is not None and \ + 'b' not in mode: + # Force opening of the file in binary mode + mode = mode + 'b' + file = builtins.open(filename, mode, buffering) + if encoding is None: + return file + info = lookup(encoding) + srw = StreamReaderWriter(file, info.streamreader, info.streamwriter, errors) + # Add attributes to simplify introspection + srw.encoding = encoding + return srw + +def EncodedFile(file, data_encoding, file_encoding=None, errors='strict'): + + """ Return a wrapped version of file which provides transparent + encoding translation. + + Data written to the wrapped file is decoded according + to the given data_encoding and then encoded to the underlying + file using file_encoding. The intermediate data type + will usually be Unicode but depends on the specified codecs. + + Bytes read from the file are decoded using file_encoding and then + passed back to the caller encoded using data_encoding. + + If file_encoding is not given, it defaults to data_encoding. + + errors may be given to define the error handling. It defaults + to 'strict' which causes ValueErrors to be raised in case an + encoding error occurs. + + The returned wrapped file object provides two extra attributes + .data_encoding and .file_encoding which reflect the given + parameters of the same name. The attributes can be used for + introspection by Python programs. + + """ + if file_encoding is None: + file_encoding = data_encoding + data_info = lookup(data_encoding) + file_info = lookup(file_encoding) + sr = StreamRecoder(file, data_info.encode, data_info.decode, + file_info.streamreader, file_info.streamwriter, errors) + # Add attributes to simplify introspection + sr.data_encoding = data_encoding + sr.file_encoding = file_encoding + return sr + +### Helpers for codec lookup + +def getencoder(encoding): + + """ Lookup up the codec for the given encoding and return + its encoder function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).encode + +def getdecoder(encoding): + + """ Lookup up the codec for the given encoding and return + its decoder function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).decode + +def getincrementalencoder(encoding): + + """ Lookup up the codec for the given encoding and return + its IncrementalEncoder class or factory function. + + Raises a LookupError in case the encoding cannot be found + or the codecs doesn't provide an incremental encoder. + + """ + encoder = lookup(encoding).incrementalencoder + if encoder is None: + raise LookupError(encoding) + return encoder + +def getincrementaldecoder(encoding): + + """ Lookup up the codec for the given encoding and return + its IncrementalDecoder class or factory function. + + Raises a LookupError in case the encoding cannot be found + or the codecs doesn't provide an incremental decoder. + + """ + decoder = lookup(encoding).incrementaldecoder + if decoder is None: + raise LookupError(encoding) + return decoder + +def getreader(encoding): + + """ Lookup up the codec for the given encoding and return + its StreamReader class or factory function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).streamreader + +def getwriter(encoding): + + """ Lookup up the codec for the given encoding and return + its StreamWriter class or factory function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).streamwriter + +def iterencode(iterator, encoding, errors='strict', **kwargs): + """ + Encoding iterator. + + Encodes the input strings from the iterator using an IncrementalEncoder. + + errors and kwargs are passed through to the IncrementalEncoder + constructor. + """ + encoder = getincrementalencoder(encoding)(errors, **kwargs) + for input in iterator: + output = encoder.encode(input) + if output: + yield output + output = encoder.encode("", True) + if output: + yield output + +def iterdecode(iterator, encoding, errors='strict', **kwargs): + """ + Decoding iterator. + + Decodes the input strings from the iterator using an IncrementalDecoder. + + errors and kwargs are passed through to the IncrementalDecoder + constructor. + """ + decoder = getincrementaldecoder(encoding)(errors, **kwargs) + for input in iterator: + output = decoder.decode(input) + if output: + yield output + output = decoder.decode(b"", True) + if output: + yield output + +### Helpers for charmap-based codecs + +def make_identity_dict(rng): + + """ make_identity_dict(rng) -> dict + + Return a dictionary where elements of the rng sequence are + mapped to themselves. + + """ + return {i:i for i in rng} + +def make_encoding_map(decoding_map): + + """ Creates an encoding map from a decoding map. + + If a target mapping in the decoding map occurs multiple + times, then that target is mapped to None (undefined mapping), + causing an exception when encountered by the charmap codec + during translation. + + One example where this happens is cp875.py which decodes + multiple character to \\u001a. + + """ + m = {} + for k,v in decoding_map.items(): + if not v in m: + m[v] = k + else: + m[v] = None + return m + +### error handlers + +try: + strict_errors = lookup_error("strict") + ignore_errors = lookup_error("ignore") + replace_errors = lookup_error("replace") + xmlcharrefreplace_errors = lookup_error("xmlcharrefreplace") + backslashreplace_errors = lookup_error("backslashreplace") + namereplace_errors = lookup_error("namereplace") +except LookupError: + # In --disable-unicode builds, these error handler are missing + strict_errors = None + ignore_errors = None + replace_errors = None + xmlcharrefreplace_errors = None + backslashreplace_errors = None + namereplace_errors = None + +# Tell modulefinder that using codecs probably needs the encodings +# package +_false = 0 +if _false: + import encodings + +### Tests + +if __name__ == '__main__': + + # Make stdout translate Latin-1 output into UTF-8 output + sys.stdout = EncodedFile(sys.stdout, 'latin-1', 'utf-8') + + # Have stdin translate Latin-1 input into UTF-8 input + sys.stdin = EncodedFile(sys.stdin, 'utf-8', 'latin-1') diff --git a/venv/Lib/collections/__init__.py b/venv/Lib/collections/__init__.py new file mode 100644 index 00000000..9a753db7 --- /dev/null +++ b/venv/Lib/collections/__init__.py @@ -0,0 +1,1279 @@ +'''This module implements specialized container datatypes providing +alternatives to Python's general purpose built-in containers, dict, +list, set, and tuple. + +* namedtuple factory function for creating tuple subclasses with named fields +* deque list-like container with fast appends and pops on either end +* ChainMap dict-like class for creating a single view of multiple mappings +* Counter dict subclass for counting hashable objects +* OrderedDict dict subclass that remembers the order entries were added +* defaultdict dict subclass that calls a factory function to supply missing values +* UserDict wrapper around dictionary objects for easier dict subclassing +* UserList wrapper around list objects for easier list subclassing +* UserString wrapper around string objects for easier string subclassing + +''' + +__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList', + 'UserString', 'Counter', 'OrderedDict', 'ChainMap'] + +import _collections_abc +from operator import itemgetter as _itemgetter, eq as _eq +from keyword import iskeyword as _iskeyword +import sys as _sys +import heapq as _heapq +from _weakref import proxy as _proxy +from itertools import repeat as _repeat, chain as _chain, starmap as _starmap +from reprlib import recursive_repr as _recursive_repr + +try: + from _collections import deque +except ImportError: + pass +else: + _collections_abc.MutableSequence.register(deque) + +try: + from _collections import defaultdict +except ImportError: + pass + + +def __getattr__(name): + # For backwards compatibility, continue to make the collections ABCs + # through Python 3.6 available through the collections module. + # Note, no new collections ABCs were added in Python 3.7 + if name in _collections_abc.__all__: + obj = getattr(_collections_abc, name) + import warnings + warnings.warn("Using or importing the ABCs from 'collections' instead " + "of from 'collections.abc' is deprecated, " + "and in 3.8 it will stop working", + DeprecationWarning, stacklevel=2) + globals()[name] = obj + return obj + raise AttributeError(f'module {__name__!r} has no attribute {name!r}') + +################################################################################ +### OrderedDict +################################################################################ + +class _OrderedDictKeysView(_collections_abc.KeysView): + + def __reversed__(self): + yield from reversed(self._mapping) + +class _OrderedDictItemsView(_collections_abc.ItemsView): + + def __reversed__(self): + for key in reversed(self._mapping): + yield (key, self._mapping[key]) + +class _OrderedDictValuesView(_collections_abc.ValuesView): + + def __reversed__(self): + for key in reversed(self._mapping): + yield self._mapping[key] + +class _Link(object): + __slots__ = 'prev', 'next', 'key', '__weakref__' + +class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as regular dictionaries. + + # The internal self.__map dict maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # The sentinel is in self.__hardroot with a weakref proxy in self.__root. + # The prev links are weakref proxies (to prevent circular references). + # Individual links are kept alive by the hard reference in self.__map. + # Those hard references disappear when a key is deleted from an OrderedDict. + + def __init__(*args, **kwds): + '''Initialize an ordered dictionary. The signature is the same as + regular dictionaries. Keyword argument order is preserved. + ''' + if not args: + raise TypeError("descriptor '__init__' of 'OrderedDict' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__hardroot = _Link() + self.__root = root = _proxy(self.__hardroot) + root.prev = root.next = root + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, + dict_setitem=dict.__setitem__, proxy=_proxy, Link=_Link): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link at the end of the linked list, + # and the inherited dictionary is updated with the new key/value pair. + if key not in self: + self.__map[key] = link = Link() + root = self.__root + last = root.prev + link.prev, link.next, link.key = last, root, key + last.next = link + root.prev = proxy(link) + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which gets + # removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link = self.__map.pop(key) + link_prev = link.prev + link_next = link.next + link_prev.next = link_next + link_next.prev = link_prev + link.prev = None + link.next = None + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + # Traverse the linked list in order. + root = self.__root + curr = root.next + while curr is not root: + yield curr.key + curr = curr.next + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + # Traverse the linked list in reverse order. + root = self.__root + curr = root.prev + while curr is not root: + yield curr.key + curr = curr.prev + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + root = self.__root + root.prev = root.next = root + self.__map.clear() + dict.clear(self) + + def popitem(self, last=True): + '''Remove and return a (key, value) pair from the dictionary. + + Pairs are returned in LIFO order if last is true or FIFO order if false. + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root.prev + link_prev = link.prev + link_prev.next = root + root.prev = link_prev + else: + link = root.next + link_next = link.next + root.next = link_next + link_next.prev = root + key = link.key + del self.__map[key] + value = dict.pop(self, key) + return key, value + + def move_to_end(self, key, last=True): + '''Move an existing element to the end (or beginning if last is false). + + Raise KeyError if the element does not exist. + ''' + link = self.__map[key] + link_prev = link.prev + link_next = link.next + soft_link = link_next.prev + link_prev.next = link_next + link_next.prev = link_prev + root = self.__root + if last: + last = root.prev + link.prev = last + link.next = root + root.prev = soft_link + last.next = link + else: + first = root.next + link.prev = root + link.next = first + first.prev = soft_link + root.next = link + + def __sizeof__(self): + sizeof = _sys.getsizeof + n = len(self) + 1 # number of links including root + size = sizeof(self.__dict__) # instance dictionary + size += sizeof(self.__map) * 2 # internal dict and inherited dict + size += sizeof(self.__hardroot) * n # link objects + size += sizeof(self.__root) * n # proxy objects + return size + + update = __update = _collections_abc.MutableMapping.update + + def keys(self): + "D.keys() -> a set-like object providing a view on D's keys" + return _OrderedDictKeysView(self) + + def items(self): + "D.items() -> a set-like object providing a view on D's items" + return _OrderedDictItemsView(self) + + def values(self): + "D.values() -> an object providing a view on D's values" + return _OrderedDictValuesView(self) + + __ne__ = _collections_abc.MutableMapping.__ne__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding + value. If key is not found, d is returned if given, otherwise KeyError + is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + '''Insert key with a value of default if key is not in the dictionary. + + Return the value for key if key is in the dictionary, else default. + ''' + if key in self: + return self[key] + self[key] = default + return default + + @_recursive_repr() + def __repr__(self): + 'od.__repr__() <==> repr(od)' + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, list(self.items())) + + def __reduce__(self): + 'Return state information for pickling' + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + return self.__class__, (), inst_dict or None, None, iter(self.items()) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''Create a new ordered dictionary with keys from iterable and values set to value. + ''' + self = cls() + for key in iterable: + self[key] = value + return self + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return dict.__eq__(self, other) and all(map(_eq, self, other)) + return dict.__eq__(self, other) + + +try: + from _collections import OrderedDict +except ImportError: + # Leave the pure Python version in place. + pass + + +################################################################################ +### namedtuple +################################################################################ + +_nt_itemgetters = {} + +def namedtuple(typename, field_names, *, rename=False, defaults=None, module=None): + """Returns a new subclass of tuple with named fields. + + >>> Point = namedtuple('Point', ['x', 'y']) + >>> Point.__doc__ # docstring for the new class + 'Point(x, y)' + >>> p = Point(11, y=22) # instantiate with positional args or keywords + >>> p[0] + p[1] # indexable like a plain tuple + 33 + >>> x, y = p # unpack like a regular tuple + >>> x, y + (11, 22) + >>> p.x + p.y # fields also accessible by name + 33 + >>> d = p._asdict() # convert to a dictionary + >>> d['x'] + 11 + >>> Point(**d) # convert from a dictionary + Point(x=11, y=22) + >>> p._replace(x=100) # _replace() is like str.replace() but targets named fields + Point(x=100, y=22) + + """ + + # Validate the field names. At the user's option, either generate an error + # message or automatically replace the field name with a valid name. + if isinstance(field_names, str): + field_names = field_names.replace(',', ' ').split() + field_names = list(map(str, field_names)) + typename = _sys.intern(str(typename)) + + if rename: + seen = set() + for index, name in enumerate(field_names): + if (not name.isidentifier() + or _iskeyword(name) + or name.startswith('_') + or name in seen): + field_names[index] = f'_{index}' + seen.add(name) + + for name in [typename] + field_names: + if type(name) is not str: + raise TypeError('Type names and field names must be strings') + if not name.isidentifier(): + raise ValueError('Type names and field names must be valid ' + f'identifiers: {name!r}') + if _iskeyword(name): + raise ValueError('Type names and field names cannot be a ' + f'keyword: {name!r}') + + seen = set() + for name in field_names: + if name.startswith('_') and not rename: + raise ValueError('Field names cannot start with an underscore: ' + f'{name!r}') + if name in seen: + raise ValueError(f'Encountered duplicate field name: {name!r}') + seen.add(name) + + field_defaults = {} + if defaults is not None: + defaults = tuple(defaults) + if len(defaults) > len(field_names): + raise TypeError('Got more default values than field names') + field_defaults = dict(reversed(list(zip(reversed(field_names), + reversed(defaults))))) + + # Variables used in the methods and docstrings + field_names = tuple(map(_sys.intern, field_names)) + num_fields = len(field_names) + arg_list = repr(field_names).replace("'", "")[1:-1] + repr_fmt = '(' + ', '.join(f'{name}=%r' for name in field_names) + ')' + tuple_new = tuple.__new__ + _len = len + + # Create all the named tuple methods to be added to the class namespace + + s = f'def __new__(_cls, {arg_list}): return _tuple_new(_cls, ({arg_list}))' + namespace = {'_tuple_new': tuple_new, '__name__': f'namedtuple_{typename}'} + # Note: exec() has the side-effect of interning the field names + exec(s, namespace) + __new__ = namespace['__new__'] + __new__.__doc__ = f'Create new instance of {typename}({arg_list})' + if defaults is not None: + __new__.__defaults__ = defaults + + @classmethod + def _make(cls, iterable): + result = tuple_new(cls, iterable) + if _len(result) != num_fields: + raise TypeError(f'Expected {num_fields} arguments, got {len(result)}') + return result + + _make.__func__.__doc__ = (f'Make a new {typename} object from a sequence ' + 'or iterable') + + def _replace(_self, **kwds): + result = _self._make(map(kwds.pop, field_names, _self)) + if kwds: + raise ValueError(f'Got unexpected field names: {list(kwds)!r}') + return result + + _replace.__doc__ = (f'Return a new {typename} object replacing specified ' + 'fields with new values') + + def __repr__(self): + 'Return a nicely formatted representation string' + return self.__class__.__name__ + repr_fmt % self + + def _asdict(self): + 'Return a new OrderedDict which maps field names to their values.' + return OrderedDict(zip(self._fields, self)) + + def __getnewargs__(self): + 'Return self as a plain tuple. Used by copy and pickle.' + return tuple(self) + + # Modify function metadata to help with introspection and debugging + + for method in (__new__, _make.__func__, _replace, + __repr__, _asdict, __getnewargs__): + method.__qualname__ = f'{typename}.{method.__name__}' + + # Build-up the class namespace dictionary + # and use type() to build the result class + class_namespace = { + '__doc__': f'{typename}({arg_list})', + '__slots__': (), + '_fields': field_names, + '_fields_defaults': field_defaults, + '__new__': __new__, + '_make': _make, + '_replace': _replace, + '__repr__': __repr__, + '_asdict': _asdict, + '__getnewargs__': __getnewargs__, + } + cache = _nt_itemgetters + for index, name in enumerate(field_names): + try: + itemgetter_object, doc = cache[index] + except KeyError: + itemgetter_object = _itemgetter(index) + doc = f'Alias for field number {index}' + cache[index] = itemgetter_object, doc + class_namespace[name] = property(itemgetter_object, doc=doc) + + result = type(typename, (tuple,), class_namespace) + + # For pickling to work, the __module__ variable needs to be set to the frame + # where the named tuple is created. Bypass this step in environments where + # sys._getframe is not defined (Jython for example) or sys._getframe is not + # defined for arguments greater than 0 (IronPython), or where the user has + # specified a particular module. + if module is None: + try: + module = _sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + pass + if module is not None: + result.__module__ = module + + return result + + +######################################################################## +### Counter +######################################################################## + +def _count_elements(mapping, iterable): + 'Tally elements from the iterable.' + mapping_get = mapping.get + for elem in iterable: + mapping[elem] = mapping_get(elem, 0) + 1 + +try: # Load C helper function if available + from _collections import _count_elements +except ImportError: + pass + +class Counter(dict): + '''Dict subclass for counting hashable items. Sometimes called a bag + or multiset. Elements are stored as dictionary keys and their counts + are stored as dictionary values. + + >>> c = Counter('abcdeabcdabcaba') # count elements from a string + + >>> c.most_common(3) # three most common elements + [('a', 5), ('b', 4), ('c', 3)] + >>> sorted(c) # list all unique elements + ['a', 'b', 'c', 'd', 'e'] + >>> ''.join(sorted(c.elements())) # list elements with repetitions + 'aaaaabbbbcccdde' + >>> sum(c.values()) # total of all counts + 15 + + >>> c['a'] # count of letter 'a' + 5 + >>> for elem in 'shazam': # update counts from an iterable + ... c[elem] += 1 # by adding 1 to each element's count + >>> c['a'] # now there are seven 'a' + 7 + >>> del c['b'] # remove all 'b' + >>> c['b'] # now there are zero 'b' + 0 + + >>> d = Counter('simsalabim') # make another counter + >>> c.update(d) # add in the second counter + >>> c['a'] # now there are nine 'a' + 9 + + >>> c.clear() # empty the counter + >>> c + Counter() + + Note: If a count is set to zero or reduced to zero, it will remain + in the counter until the entry is deleted or the counter is cleared: + + >>> c = Counter('aaabbc') + >>> c['b'] -= 2 # reduce the count of 'b' by two + >>> c.most_common() # 'b' is still in, but its count is zero + [('a', 3), ('c', 1), ('b', 0)] + + ''' + # References: + # http://en.wikipedia.org/wiki/Multiset + # http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html + # http://www.demo2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm + # http://code.activestate.com/recipes/259174/ + # Knuth, TAOCP Vol. II section 4.6.3 + + def __init__(*args, **kwds): + '''Create a new, empty Counter object. And if given, count elements + from an input iterable. Or, initialize the count from another mapping + of elements to their counts. + + >>> c = Counter() # a new, empty counter + >>> c = Counter('gallahad') # a new counter from an iterable + >>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping + >>> c = Counter(a=4, b=2) # a new counter from keyword args + + ''' + if not args: + raise TypeError("descriptor '__init__' of 'Counter' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + super(Counter, self).__init__() + self.update(*args, **kwds) + + def __missing__(self, key): + 'The count of elements not in the Counter is zero.' + # Needed so that self[missing_item] does not raise KeyError + return 0 + + def most_common(self, n=None): + '''List the n most common elements and their counts from the most + common to the least. If n is None, then list all element counts. + + >>> Counter('abcdeabcdabcaba').most_common(3) + [('a', 5), ('b', 4), ('c', 3)] + + ''' + # Emulate Bag.sortedByCount from Smalltalk + if n is None: + return sorted(self.items(), key=_itemgetter(1), reverse=True) + return _heapq.nlargest(n, self.items(), key=_itemgetter(1)) + + def elements(self): + '''Iterator over elements repeating each as many times as its count. + + >>> c = Counter('ABCABC') + >>> sorted(c.elements()) + ['A', 'A', 'B', 'B', 'C', 'C'] + + # Knuth's example for prime factors of 1836: 2**2 * 3**3 * 17**1 + >>> prime_factors = Counter({2: 2, 3: 3, 17: 1}) + >>> product = 1 + >>> for factor in prime_factors.elements(): # loop over factors + ... product *= factor # and multiply them + >>> product + 1836 + + Note, if an element's count has been set to zero or is a negative + number, elements() will ignore it. + + ''' + # Emulate Bag.do from Smalltalk and Multiset.begin from C++. + return _chain.from_iterable(_starmap(_repeat, self.items())) + + # Override dict methods where necessary + + @classmethod + def fromkeys(cls, iterable, v=None): + # There is no equivalent method for counters because setting v=1 + # means that no element can have a count greater than one. + raise NotImplementedError( + 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.') + + def update(*args, **kwds): + '''Like dict.update() but add counts instead of replacing them. + + Source can be an iterable, a dictionary, or another Counter instance. + + >>> c = Counter('which') + >>> c.update('witch') # add elements from another iterable + >>> d = Counter('watch') + >>> c.update(d) # add elements from another counter + >>> c['h'] # four 'h' in which, witch, and watch + 4 + + ''' + # The regular dict.update() operation makes no sense here because the + # replace behavior results in the some of original untouched counts + # being mixed-in with all of the other counts for a mismash that + # doesn't have a straight-forward interpretation in most counting + # contexts. Instead, we implement straight-addition. Both the inputs + # and outputs are allowed to contain zero and negative counts. + + if not args: + raise TypeError("descriptor 'update' of 'Counter' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + iterable = args[0] if args else None + if iterable is not None: + if isinstance(iterable, _collections_abc.Mapping): + if self: + self_get = self.get + for elem, count in iterable.items(): + self[elem] = count + self_get(elem, 0) + else: + super(Counter, self).update(iterable) # fast path when counter is empty + else: + _count_elements(self, iterable) + if kwds: + self.update(kwds) + + def subtract(*args, **kwds): + '''Like dict.update() but subtracts counts instead of replacing them. + Counts can be reduced below zero. Both the inputs and outputs are + allowed to contain zero and negative counts. + + Source can be an iterable, a dictionary, or another Counter instance. + + >>> c = Counter('which') + >>> c.subtract('witch') # subtract elements from another iterable + >>> c.subtract(Counter('watch')) # subtract elements from another counter + >>> c['h'] # 2 in which, minus 1 in witch, minus 1 in watch + 0 + >>> c['w'] # 1 in which, minus 1 in witch, minus 1 in watch + -1 + + ''' + if not args: + raise TypeError("descriptor 'subtract' of 'Counter' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + iterable = args[0] if args else None + if iterable is not None: + self_get = self.get + if isinstance(iterable, _collections_abc.Mapping): + for elem, count in iterable.items(): + self[elem] = self_get(elem, 0) - count + else: + for elem in iterable: + self[elem] = self_get(elem, 0) - 1 + if kwds: + self.subtract(kwds) + + def copy(self): + 'Return a shallow copy.' + return self.__class__(self) + + def __reduce__(self): + return self.__class__, (dict(self),) + + def __delitem__(self, elem): + 'Like dict.__delitem__() but does not raise KeyError for missing values.' + if elem in self: + super().__delitem__(elem) + + def __repr__(self): + if not self: + return '%s()' % self.__class__.__name__ + try: + items = ', '.join(map('%r: %r'.__mod__, self.most_common())) + return '%s({%s})' % (self.__class__.__name__, items) + except TypeError: + # handle case where values are not orderable + return '{0}({1!r})'.format(self.__class__.__name__, dict(self)) + + # Multiset-style mathematical operations discussed in: + # Knuth TAOCP Volume II section 4.6.3 exercise 19 + # and at http://en.wikipedia.org/wiki/Multiset + # + # Outputs guaranteed to only include positive counts. + # + # To strip negative and zero counts, add-in an empty counter: + # c += Counter() + + def __add__(self, other): + '''Add counts from two counters. + + >>> Counter('abbb') + Counter('bcc') + Counter({'b': 4, 'c': 2, 'a': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + newcount = count + other[elem] + if newcount > 0: + result[elem] = newcount + for elem, count in other.items(): + if elem not in self and count > 0: + result[elem] = count + return result + + def __sub__(self, other): + ''' Subtract count, but keep only results with positive counts. + + >>> Counter('abbbc') - Counter('bccd') + Counter({'b': 2, 'a': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + newcount = count - other[elem] + if newcount > 0: + result[elem] = newcount + for elem, count in other.items(): + if elem not in self and count < 0: + result[elem] = 0 - count + return result + + def __or__(self, other): + '''Union is the maximum of value in either of the input counters. + + >>> Counter('abbb') | Counter('bcc') + Counter({'b': 3, 'c': 2, 'a': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + other_count = other[elem] + newcount = other_count if count < other_count else count + if newcount > 0: + result[elem] = newcount + for elem, count in other.items(): + if elem not in self and count > 0: + result[elem] = count + return result + + def __and__(self, other): + ''' Intersection is the minimum of corresponding counts. + + >>> Counter('abbb') & Counter('bcc') + Counter({'b': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + other_count = other[elem] + newcount = count if count < other_count else other_count + if newcount > 0: + result[elem] = newcount + return result + + def __pos__(self): + 'Adds an empty counter, effectively stripping negative and zero counts' + result = Counter() + for elem, count in self.items(): + if count > 0: + result[elem] = count + return result + + def __neg__(self): + '''Subtracts from an empty counter. Strips positive and zero counts, + and flips the sign on negative counts. + + ''' + result = Counter() + for elem, count in self.items(): + if count < 0: + result[elem] = 0 - count + return result + + def _keep_positive(self): + '''Internal method to strip elements with a negative or zero count''' + nonpositive = [elem for elem, count in self.items() if not count > 0] + for elem in nonpositive: + del self[elem] + return self + + def __iadd__(self, other): + '''Inplace add from another counter, keeping only positive counts. + + >>> c = Counter('abbb') + >>> c += Counter('bcc') + >>> c + Counter({'b': 4, 'c': 2, 'a': 1}) + + ''' + for elem, count in other.items(): + self[elem] += count + return self._keep_positive() + + def __isub__(self, other): + '''Inplace subtract counter, but keep only results with positive counts. + + >>> c = Counter('abbbc') + >>> c -= Counter('bccd') + >>> c + Counter({'b': 2, 'a': 1}) + + ''' + for elem, count in other.items(): + self[elem] -= count + return self._keep_positive() + + def __ior__(self, other): + '''Inplace union is the maximum of value from either counter. + + >>> c = Counter('abbb') + >>> c |= Counter('bcc') + >>> c + Counter({'b': 3, 'c': 2, 'a': 1}) + + ''' + for elem, other_count in other.items(): + count = self[elem] + if other_count > count: + self[elem] = other_count + return self._keep_positive() + + def __iand__(self, other): + '''Inplace intersection is the minimum of corresponding counts. + + >>> c = Counter('abbb') + >>> c &= Counter('bcc') + >>> c + Counter({'b': 1}) + + ''' + for elem, count in self.items(): + other_count = other[elem] + if other_count < count: + self[elem] = other_count + return self._keep_positive() + + +######################################################################## +### ChainMap +######################################################################## + +class ChainMap(_collections_abc.MutableMapping): + ''' A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + be accessed or updated using the *maps* attribute. There is no other + state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__(key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union(*self.maps)) # reuses stored hash values if possible + + def __iter__(self): + d = {} + for mapping in reversed(self.maps): + d.update(mapping) # reuses stored hash values if possible + return iter(d) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + def __bool__(self): + return any(self.maps) + + @_recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self, m=None): # like Django's Context.push() + '''New ChainMap with a new map followed by all previous maps. + If no map is provided, an empty dict is used. + ''' + if m is None: + m = {} + return self.__class__(m, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + + +################################################################################ +### UserDict +################################################################################ + +class UserDict(_collections_abc.MutableMapping): + + # Start by filling-out the abstract methods + def __init__(*args, **kwargs): + if not args: + raise TypeError("descriptor '__init__' of 'UserDict' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + if args: + dict = args[0] + elif 'dict' in kwargs: + dict = kwargs.pop('dict') + import warnings + warnings.warn("Passing 'dict' as keyword argument is deprecated", + DeprecationWarning, stacklevel=2) + else: + dict = None + self.data = {} + if dict is not None: + self.update(dict) + if len(kwargs): + self.update(kwargs) + def __len__(self): return len(self.data) + def __getitem__(self, key): + if key in self.data: + return self.data[key] + if hasattr(self.__class__, "__missing__"): + return self.__class__.__missing__(self, key) + raise KeyError(key) + def __setitem__(self, key, item): self.data[key] = item + def __delitem__(self, key): del self.data[key] + def __iter__(self): + return iter(self.data) + + # Modify __contains__ to work correctly when __missing__ is present + def __contains__(self, key): + return key in self.data + + # Now, add the methods in dicts but not in MutableMapping + def __repr__(self): return repr(self.data) + def copy(self): + if self.__class__ is UserDict: + return UserDict(self.data.copy()) + import copy + data = self.data + try: + self.data = {} + c = copy.copy(self) + finally: + self.data = data + c.update(self) + return c + @classmethod + def fromkeys(cls, iterable, value=None): + d = cls() + for key in iterable: + d[key] = value + return d + + + +################################################################################ +### UserList +################################################################################ + +class UserList(_collections_abc.MutableSequence): + """A more or less complete user-defined wrapper around list objects.""" + def __init__(self, initlist=None): + self.data = [] + if initlist is not None: + # XXX should this accept an arbitrary sequence? + if type(initlist) == type(self.data): + self.data[:] = initlist + elif isinstance(initlist, UserList): + self.data[:] = initlist.data[:] + else: + self.data = list(initlist) + def __repr__(self): return repr(self.data) + def __lt__(self, other): return self.data < self.__cast(other) + def __le__(self, other): return self.data <= self.__cast(other) + def __eq__(self, other): return self.data == self.__cast(other) + def __gt__(self, other): return self.data > self.__cast(other) + def __ge__(self, other): return self.data >= self.__cast(other) + def __cast(self, other): + return other.data if isinstance(other, UserList) else other + def __contains__(self, item): return item in self.data + def __len__(self): return len(self.data) + def __getitem__(self, i): return self.data[i] + def __setitem__(self, i, item): self.data[i] = item + def __delitem__(self, i): del self.data[i] + def __add__(self, other): + if isinstance(other, UserList): + return self.__class__(self.data + other.data) + elif isinstance(other, type(self.data)): + return self.__class__(self.data + other) + return self.__class__(self.data + list(other)) + def __radd__(self, other): + if isinstance(other, UserList): + return self.__class__(other.data + self.data) + elif isinstance(other, type(self.data)): + return self.__class__(other + self.data) + return self.__class__(list(other) + self.data) + def __iadd__(self, other): + if isinstance(other, UserList): + self.data += other.data + elif isinstance(other, type(self.data)): + self.data += other + else: + self.data += list(other) + return self + def __mul__(self, n): + return self.__class__(self.data*n) + __rmul__ = __mul__ + def __imul__(self, n): + self.data *= n + return self + def append(self, item): self.data.append(item) + def insert(self, i, item): self.data.insert(i, item) + def pop(self, i=-1): return self.data.pop(i) + def remove(self, item): self.data.remove(item) + def clear(self): self.data.clear() + def copy(self): return self.__class__(self) + def count(self, item): return self.data.count(item) + def index(self, item, *args): return self.data.index(item, *args) + def reverse(self): self.data.reverse() + def sort(self, *args, **kwds): self.data.sort(*args, **kwds) + def extend(self, other): + if isinstance(other, UserList): + self.data.extend(other.data) + else: + self.data.extend(other) + + + +################################################################################ +### UserString +################################################################################ + +class UserString(_collections_abc.Sequence): + def __init__(self, seq): + if isinstance(seq, str): + self.data = seq + elif isinstance(seq, UserString): + self.data = seq.data[:] + else: + self.data = str(seq) + def __str__(self): return str(self.data) + def __repr__(self): return repr(self.data) + def __int__(self): return int(self.data) + def __float__(self): return float(self.data) + def __complex__(self): return complex(self.data) + def __hash__(self): return hash(self.data) + def __getnewargs__(self): + return (self.data[:],) + + def __eq__(self, string): + if isinstance(string, UserString): + return self.data == string.data + return self.data == string + def __lt__(self, string): + if isinstance(string, UserString): + return self.data < string.data + return self.data < string + def __le__(self, string): + if isinstance(string, UserString): + return self.data <= string.data + return self.data <= string + def __gt__(self, string): + if isinstance(string, UserString): + return self.data > string.data + return self.data > string + def __ge__(self, string): + if isinstance(string, UserString): + return self.data >= string.data + return self.data >= string + + def __contains__(self, char): + if isinstance(char, UserString): + char = char.data + return char in self.data + + def __len__(self): return len(self.data) + def __getitem__(self, index): return self.__class__(self.data[index]) + def __add__(self, other): + if isinstance(other, UserString): + return self.__class__(self.data + other.data) + elif isinstance(other, str): + return self.__class__(self.data + other) + return self.__class__(self.data + str(other)) + def __radd__(self, other): + if isinstance(other, str): + return self.__class__(other + self.data) + return self.__class__(str(other) + self.data) + def __mul__(self, n): + return self.__class__(self.data*n) + __rmul__ = __mul__ + def __mod__(self, args): + return self.__class__(self.data % args) + def __rmod__(self, format): + return self.__class__(format % args) + + # the following methods are defined in alphabetical order: + def capitalize(self): return self.__class__(self.data.capitalize()) + def casefold(self): + return self.__class__(self.data.casefold()) + def center(self, width, *args): + return self.__class__(self.data.center(width, *args)) + def count(self, sub, start=0, end=_sys.maxsize): + if isinstance(sub, UserString): + sub = sub.data + return self.data.count(sub, start, end) + def encode(self, encoding=None, errors=None): # XXX improve this? + if encoding: + if errors: + return self.__class__(self.data.encode(encoding, errors)) + return self.__class__(self.data.encode(encoding)) + return self.__class__(self.data.encode()) + def endswith(self, suffix, start=0, end=_sys.maxsize): + return self.data.endswith(suffix, start, end) + def expandtabs(self, tabsize=8): + return self.__class__(self.data.expandtabs(tabsize)) + def find(self, sub, start=0, end=_sys.maxsize): + if isinstance(sub, UserString): + sub = sub.data + return self.data.find(sub, start, end) + def format(self, *args, **kwds): + return self.data.format(*args, **kwds) + def format_map(self, mapping): + return self.data.format_map(mapping) + def index(self, sub, start=0, end=_sys.maxsize): + return self.data.index(sub, start, end) + def isalpha(self): return self.data.isalpha() + def isalnum(self): return self.data.isalnum() + def isascii(self): return self.data.isascii() + def isdecimal(self): return self.data.isdecimal() + def isdigit(self): return self.data.isdigit() + def isidentifier(self): return self.data.isidentifier() + def islower(self): return self.data.islower() + def isnumeric(self): return self.data.isnumeric() + def isprintable(self): return self.data.isprintable() + def isspace(self): return self.data.isspace() + def istitle(self): return self.data.istitle() + def isupper(self): return self.data.isupper() + def join(self, seq): return self.data.join(seq) + def ljust(self, width, *args): + return self.__class__(self.data.ljust(width, *args)) + def lower(self): return self.__class__(self.data.lower()) + def lstrip(self, chars=None): return self.__class__(self.data.lstrip(chars)) + maketrans = str.maketrans + def partition(self, sep): + return self.data.partition(sep) + def replace(self, old, new, maxsplit=-1): + if isinstance(old, UserString): + old = old.data + if isinstance(new, UserString): + new = new.data + return self.__class__(self.data.replace(old, new, maxsplit)) + def rfind(self, sub, start=0, end=_sys.maxsize): + if isinstance(sub, UserString): + sub = sub.data + return self.data.rfind(sub, start, end) + def rindex(self, sub, start=0, end=_sys.maxsize): + return self.data.rindex(sub, start, end) + def rjust(self, width, *args): + return self.__class__(self.data.rjust(width, *args)) + def rpartition(self, sep): + return self.data.rpartition(sep) + def rstrip(self, chars=None): + return self.__class__(self.data.rstrip(chars)) + def split(self, sep=None, maxsplit=-1): + return self.data.split(sep, maxsplit) + def rsplit(self, sep=None, maxsplit=-1): + return self.data.rsplit(sep, maxsplit) + def splitlines(self, keepends=False): return self.data.splitlines(keepends) + def startswith(self, prefix, start=0, end=_sys.maxsize): + return self.data.startswith(prefix, start, end) + def strip(self, chars=None): return self.__class__(self.data.strip(chars)) + def swapcase(self): return self.__class__(self.data.swapcase()) + def title(self): return self.__class__(self.data.title()) + def translate(self, *args): + return self.__class__(self.data.translate(*args)) + def upper(self): return self.__class__(self.data.upper()) + def zfill(self, width): return self.__class__(self.data.zfill(width)) diff --git a/venv/Lib/collections/__pycache__/__init__.cpython-37.pyc b/venv/Lib/collections/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd9c2e103d56ae7c355c7c793676a72db8580de6 GIT binary patch literal 46650 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, is about +# to be pickled, the (, ) tuple is looked up here to see +# if it is a registered extension code for it. Extension codes are +# universal, so that the meaning of a pickle does not depend on +# context. (There are also some codes reserved for local use that +# don't have this restriction.) Codes are positive ints; 0 is +# reserved. + +_extension_registry = {} # key -> code +_inverted_registry = {} # code -> key +_extension_cache = {} # code -> object +# Don't ever rebind those names: pickling grabs a reference to them when +# it's initialized, and won't see a rebinding. + +def add_extension(module, name, code): + """Register an extension code.""" + code = int(code) + if not 1 <= code <= 0x7fffffff: + raise ValueError("code out of range") + key = (module, name) + if (_extension_registry.get(key) == code and + _inverted_registry.get(code) == key): + return # Redundant registrations are benign + if key in _extension_registry: + raise ValueError("key %s is already registered with code %s" % + (key, _extension_registry[key])) + if code in _inverted_registry: + raise ValueError("code %s is already in use for key %s" % + (code, _inverted_registry[code])) + _extension_registry[key] = code + _inverted_registry[code] = key + +def remove_extension(module, name, code): + """Unregister an extension code. For testing only.""" + key = (module, name) + if (_extension_registry.get(key) != code or + _inverted_registry.get(code) != key): + raise ValueError("key %s is not registered with code %s" % + (key, code)) + del _extension_registry[key] + del _inverted_registry[code] + if code in _extension_cache: + del _extension_cache[code] + +def clear_extension_cache(): + _extension_cache.clear() + +# Standard extension code assignments + +# Reserved ranges + +# First Last Count Purpose +# 1 127 127 Reserved for Python standard library +# 128 191 64 Reserved for Zope +# 192 239 48 Reserved for 3rd parties +# 240 255 16 Reserved for private use (will never be assigned) +# 256 Inf Inf Reserved for future assignment + +# Extension codes are assigned by the Python Software Foundation. diff --git a/venv/Lib/distutils/__init__.py b/venv/Lib/distutils/__init__.py new file mode 100644 index 00000000..29fc1da4 --- /dev/null +++ b/venv/Lib/distutils/__init__.py @@ -0,0 +1,101 @@ +import os +import sys +import warnings +import imp +import opcode # opcode is not a virtualenv module, so we can use it to find the stdlib + # Important! To work on pypy, this must be a module that resides in the + # lib-python/modified-x.y.z directory + +dirname = os.path.dirname + +distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils') +if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)): + warnings.warn( + "The virtualenv distutils package at %s appears to be in the same location as the system distutils?") +else: + __path__.insert(0, distutils_path) + real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ('', '', imp.PKG_DIRECTORY)) + # Copy the relevant attributes + try: + __revision__ = real_distutils.__revision__ + except AttributeError: + pass + __version__ = real_distutils.__version__ + +from distutils import dist, sysconfig + +try: + basestring +except NameError: + basestring = str + +## patch build_ext (distutils doesn't know how to get the libs directory +## path on windows - it hardcodes the paths around the patched sys.prefix) + +if sys.platform == 'win32': + from distutils.command.build_ext import build_ext as old_build_ext + class build_ext(old_build_ext): + def finalize_options (self): + if self.library_dirs is None: + self.library_dirs = [] + elif isinstance(self.library_dirs, basestring): + self.library_dirs = self.library_dirs.split(os.pathsep) + + self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs")) + old_build_ext.finalize_options(self) + + from distutils.command import build_ext as build_ext_module + build_ext_module.build_ext = build_ext + +## distutils.dist patches: + +old_find_config_files = dist.Distribution.find_config_files +def find_config_files(self): + found = old_find_config_files(self) + system_distutils = os.path.join(distutils_path, 'distutils.cfg') + #if os.path.exists(system_distutils): + # found.insert(0, system_distutils) + # What to call the per-user config file + if os.name == 'posix': + user_filename = ".pydistutils.cfg" + else: + user_filename = "pydistutils.cfg" + user_filename = os.path.join(sys.prefix, user_filename) + if os.path.isfile(user_filename): + for item in list(found): + if item.endswith('pydistutils.cfg'): + found.remove(item) + found.append(user_filename) + return found +dist.Distribution.find_config_files = find_config_files + +## distutils.sysconfig patches: + +old_get_python_inc = sysconfig.get_python_inc +def sysconfig_get_python_inc(plat_specific=0, prefix=None): + if prefix is None: + prefix = sys.real_prefix + return old_get_python_inc(plat_specific, prefix) +sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__ +sysconfig.get_python_inc = sysconfig_get_python_inc + +old_get_python_lib = sysconfig.get_python_lib +def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None): + if standard_lib and prefix is None: + prefix = sys.real_prefix + return old_get_python_lib(plat_specific, standard_lib, prefix) +sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__ +sysconfig.get_python_lib = sysconfig_get_python_lib + +old_get_config_vars = sysconfig.get_config_vars +def sysconfig_get_config_vars(*args): + real_vars = old_get_config_vars(*args) + if sys.platform == 'win32': + lib_dir = os.path.join(sys.real_prefix, "libs") + if isinstance(real_vars, dict) and 'LIBDIR' not in real_vars: + real_vars['LIBDIR'] = lib_dir # asked for all + elif isinstance(real_vars, list) and 'LIBDIR' in args: + real_vars = real_vars + [lib_dir] # asked for list + return real_vars +sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__ +sysconfig.get_config_vars = sysconfig_get_config_vars diff --git a/venv/Lib/distutils/__pycache__/__init__.cpython-37.pyc b/venv/Lib/distutils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80e62a8a61c6fea157b07a239acfdfeeef3bc3fa GIT binary patch literal 2829 zcma)8-E!N;72X9v5QIpIk}O%Vm4t5mNB^jubUM@NWZWp0$KxhdJ$9yPHfnbu?otLs z0?Y!EEe&)f-}dJTI@D!fps&z(*xO$9rVr4oeg~9jS-EJz+23={?%DmmbCzGUS|P*t z#~=UWyFbq}_D>p|e*rq5qvU_(j47u0kcnx_1+T`AaH`f7Zq<6i(=4eazVNA?)T`Rp zUJ{&g<(xXAQO$(9amvqRq!(()Px+o>3hhkhlzYlKOMj)Cla^x8bvV=Rq^&%~bwkxu zO}okbz&-Uu=P=ZrWI-%^!_q4r(~End`8#Ly`H4E1Vq$ z`YLCzS%u9iZ2mp9(I1GbXLdZfrs{jnU%0sk>tJ|&v?e~}>?uVy%*W z1lh;%aZP_L*YtAIO>T%EsX5hr%ftWZ3I9Y}lnE~Gt3dyw9N^q#n{7StkEe4y_`_5iX6klj=KCF?E!i%{FL4Hf6b zei0Azqn)o`>Fz;niv4J)(}V6z(j7Vu8dM=eb}M#+DRs$>cHxfhtl zUGybO*9uN^g>&MVb?Qyr!b@tWn3a|G#8(_M^+`}Pl8_imTr1`#&5{uZ6~ngfmZ7bL z_f@=;_gbPkjCV|A4sl?U+c3`KG%upGuWh&!Qc{Y$T1w*8?p_HRc?GLHnl=6F!Z7Qi2uN=Hk ztzer9#9Op0As+DeL9JoVL#aSLLZ<*wC;XTfJaGs<#ZR4M2cw#DkT7m5_t;H6$e`8N!sCh2qZ0DNuh zs5QH|_5J{$jkLTNgI5jVu(R~!je8}U6cwxGAj|s z2+4NA5<<}_F>~VJcKKG%tqy7ypk^28x^{IT$A`tMECoyZ$Re%rFe+p|*8O-8_svJp zyzKJoEX7|6`dT_ClzaY%w}>&E z<}TI|O-cqTGD=dO`2RhI_Dk5GdE6wA?_=CYslIcMpJJ5%0To5YpV%}q6g{4za1(D* zLmc>&$`B>>k{1Dz-y`Lge6MaEl@9Q5Kcm!0vIb-VGPdU%QS#E+3x?B=3T z6qNZYgLVGw><|d+120t4-oVr)VSnxVB zDbjUr-FP$>em3rBN>}k|>+qzC#wt*e@+bLat3#3h>5AckD_0qOC3Opb?`-OgDOlItyln2^Og@&Tb z5N!?RNz;{s@xW>FRmTDNZ3K_+bkIl2;$f{x&svC(@?fzLcs>u& M^PP8X& codecs.CodecInfo object + The getregentry() API must return a CodecInfo object with encoder, decoder, + incrementalencoder, incrementaldecoder, streamwriter and streamreader + atttributes which adhere to the Python Codec Interface Standard. + + In addition, a module may optionally also define the following + APIs which are then used by the package's codec search function: + + * getaliases() -> sequence of encoding name strings to use as aliases + + Alias names returned by getaliases() must be normalized encoding + names as defined by normalize_encoding(). + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" + +import codecs +import sys +from . import aliases + +_cache = {} +_unknown = '--unknown--' +_import_tail = ['*'] +_aliases = aliases.aliases + +class CodecRegistryError(LookupError, SystemError): + pass + +def normalize_encoding(encoding): + + """ Normalize an encoding name. + + Normalization works as follows: all non-alphanumeric + characters except the dot used for Python package names are + collapsed and replaced with a single underscore, e.g. ' -;#' + becomes '_'. Leading and trailing underscores are removed. + + Note that encoding names should be ASCII only; if they do use + non-ASCII characters, these must be Latin-1 compatible. + + """ + if isinstance(encoding, bytes): + encoding = str(encoding, "ascii") + + chars = [] + punct = False + for c in encoding: + if c.isalnum() or c == '.': + if punct and chars: + chars.append('_') + chars.append(c) + punct = False + else: + punct = True + return ''.join(chars) + +def search_function(encoding): + + # Cache lookup + entry = _cache.get(encoding, _unknown) + if entry is not _unknown: + return entry + + # Import the module: + # + # First try to find an alias for the normalized encoding + # name and lookup the module using the aliased name, then try to + # lookup the module using the standard import scheme, i.e. first + # try in the encodings package, then at top-level. + # + norm_encoding = normalize_encoding(encoding) + aliased_encoding = _aliases.get(norm_encoding) or \ + _aliases.get(norm_encoding.replace('.', '_')) + if aliased_encoding is not None: + modnames = [aliased_encoding, + norm_encoding] + else: + modnames = [norm_encoding] + for modname in modnames: + if not modname or '.' in modname: + continue + try: + # Import is absolute to prevent the possibly malicious import of a + # module with side-effects that is not in the 'encodings' package. + mod = __import__('encodings.' + modname, fromlist=_import_tail, + level=0) + except ImportError: + # ImportError may occur because 'encodings.(modname)' does not exist, + # or because it imports a name that does not exist (see mbcs and oem) + pass + else: + break + else: + mod = None + + try: + getregentry = mod.getregentry + except AttributeError: + # Not a codec module + mod = None + + if mod is None: + # Cache misses + _cache[encoding] = None + return None + + # Now ask the module for the registry entry + entry = getregentry() + if not isinstance(entry, codecs.CodecInfo): + if not 4 <= len(entry) <= 7: + raise CodecRegistryError('module "%s" (%s) failed to register' + % (mod.__name__, mod.__file__)) + if not callable(entry[0]) or not callable(entry[1]) or \ + (entry[2] is not None and not callable(entry[2])) or \ + (entry[3] is not None and not callable(entry[3])) or \ + (len(entry) > 4 and entry[4] is not None and not callable(entry[4])) or \ + (len(entry) > 5 and entry[5] is not None and not callable(entry[5])): + raise CodecRegistryError('incompatible codecs in module "%s" (%s)' + % (mod.__name__, mod.__file__)) + if len(entry)<7 or entry[6] is None: + entry += (None,)*(6-len(entry)) + (mod.__name__.split(".", 1)[1],) + entry = codecs.CodecInfo(*entry) + + # Cache the codec registry entry + _cache[encoding] = entry + + # Register its aliases (without overwriting previously registered + # aliases) + try: + codecaliases = mod.getaliases() + except AttributeError: + pass + else: + for alias in codecaliases: + if alias not in _aliases: + _aliases[alias] = modname + + # Return the registry entry + return entry + +# Register the search_function in the Python codec registry +codecs.register(search_function) + +if sys.platform == 'win32': + def _alias_mbcs(encoding): + try: + import _winapi + ansi_code_page = "cp%s" % _winapi.GetACP() + if encoding == ansi_code_page: + import encodings.mbcs + return encodings.mbcs.getregentry() + except ImportError: + # Imports may fail while we are shutting down + pass + + codecs.register(_alias_mbcs) diff --git a/venv/Lib/encodings/__pycache__/__init__.cpython-37.pyc b/venv/Lib/encodings/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ddc90fd6a723dd2ea75afa53a9469b6ef9591d9 GIT binary patch literal 3987 zcmai1L2ul~6`movT<%I*E3RWZfLjdgrt+#pXrXLdy` zms}0Gw%6bSMU`s{pL$HCWAFV5J@nKcK={<2^bd-h`puBLvYkU$;BbcX=FOWo-}~Ov zmkSF`f}j2Gwcq{gG9mv_gXyn^&OJQoAJA~(5>B}hQJ3ns;TqiJR%8w=*PWZzi!l&JL28 zP371i;iE{T%$I_tSt12zVa&3FFlEC^fm+W)DFRH7S4(~O6E1?;;=w4**n$6Cu-G3! zS&&F6(qR%SQ&^U;IFSQC3SU9{bZ2c=Dek9?i*6WC_lBCOyf+oU*=F5Q9AqJk-xpEx zVugv--m2EJG|IZ2&z6`rV_&dvFpR`N#2FOsk8v1LS;~~8_u1-jyi}dzp&uN;-1Ebf zO2o@yA~U_Rn?%@6og;)o+4Tc)r}V)x>xoQ?9yXF=*w^`@)ReAj?`*`~geCij@SC=B z7iPS>V10X|+)j#YBxB~Y_ZPAkVRlfuOvn{@Ntr5Fw7xJ7q&}q|X(uUxx4unfajR1J zgBLP{^$a+vKHwu%X-$5XWis3!Ww^Q*2O&J-^8*1u;O3O`D$Ho(*v8ZgGfY*k+`s`i z57iB=;3y@q*uWpNWT-y+Q8Z?LlqS_>zw2FX2plrAKy7~@Vm3<8Z?Qt;l0ulevQ+pI z)=q)(_PqdYek#)PT2gT|f{z4Cx-5)m*1Diu-Z$BJOm4pv!@hn*NmRJv`|=8bQE#1Z+paLPl{>W8<;tg>dNjp_GZ- zYMX`Qc`Cv^uV{K+2?+G(J@07bN9D}lh-^TgZhqLme`oJo7@Y1s@_W5-^})lP-|l|1 z-TC#cM{BpYcK6nY!v}um?`w?}dfooCb9-$s3itP>)RFFaUKod& z=OOT=BJi8)7zP@L>T#gXrhXt({oKbpJw%g{oMiOake4ze2iG4P6Vf9SaQ?)2`DIQX zkl){#n7Mgko|5!exyeni_0!ytzsae3PAqOIwpP8|EO~ok99`!%)jlEIKB?vORC%%P z{~czqtts^(R^J6{6=#Z$r$WBw!xxF{1Gp(GxhlN_5J!Mm-0`E~fgg_sLWY5kFts>1 z@TDJs4N@jv24Yz998a<`*1CzDMtl`-RRADGoa+E9`a>0(iczE(M&LzW(v{Cr#8f2M zCIW$8gOijV*VTi?0AvB8o!8h_5huA-GO<2vAHmMCYHV&~pjQIa5qX?$s2&lp-G#DMJ?K- zi_}5eq_zQ=U%}iA=1Pr_Ab`#ki343aLwj$s`3`}`V>-f2^CRrlZ(#1Jp2N75#N6C$F4J=u zS6Z|U-0oXg_dO)-ndJ9c661Fy=e6V;NY2kB-)KpUm1Oz`wlDn1_Hv(kpFrZjSl!aA zo!5qB7+v74(i>OFC3x^~@#H7C+s3KEal$UWLOxaggYR}T7K(ORDtVtP_uz~+UmYn{|>=p3u6%ECm& zrxTY{=BYH>#i_B8gS;5|V5Xv$4x=!0o9C5EyD2|Z(luSLx(kX$X4QwgSRR0%e{tXo zU7x%4s^^;MNR>R@d2Lj6Xt$<2@AK4!vOM#q<=NL*n0C<+a~{-WH55HvM9-j(VWU5f zo?)tY%d`#KunYrVTSn7xKw*|?(-!?1sBMv6(|^l!xfDA(|<{Q+$9coKM? zT*eqVX`IRydQ!!PWU9HYnqR2q2AX1SGfDcRVFlNnF=A>^!c#?(#((K*XBu&ZgK{84 v9Wl_GzGbd1^>h+*?v|nU#ZRFmy@tlZ9m8OqylmX!Mbo+FeA~orI&=R6p5a+H literal 0 HcmV?d00001 diff --git a/venv/Lib/encodings/__pycache__/aliases.cpython-37.pyc b/venv/Lib/encodings/__pycache__/aliases.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4f72ea29a539d2fd9b66d55dfe8f86dcd5fca2a GIT binary patch literal 6336 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/encodings/__pycache__/cp437.cpython-37.pyc b/venv/Lib/encodings/__pycache__/cp437.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd86eba78575a102cd686ae3370dba5af5a8b336 GIT binary patch literal 7883 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 H6Ce9;($r+V literal 0 HcmV?d00001 diff --git a/venv/Lib/encodings/__pycache__/utf_16_le.cpython-37.pyc b/venv/Lib/encodings/__pycache__/utf_16_le.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5fbe3eaff73001ff44ad259f193b65b827e07d0 GIT binary patch literal 1674 zcmbVM&2HO95a#kv6lFV(niO@>1A9scR6=6|2@({66*(!4#)=`k2&xhwXzog(L6ORE z)j~#Yb&q|A=Ga%-V|(f=^wgQ9Y|E%qpj~2yoZ02>H{Zr9(HnZ zFX)$Cq`vRJhD=IP1SgB&Ac3^gD>#VYrI?<~VG`V*Ci!k&8{M>=hF#ykpN9DNYysKi zjSTvO;r-zm!Fu<&aarTQ3^Fh&e3z~l}$ zxrI5mxQ#)&s=Z&NAf}>_N&cJ;6YwIXUun>ril~oLwNYt~kfl@ey~){@p?Ly^Gob~v zdX*@RU4W}+m0gK^48*u{##xc%nyy-T2$OFqZ^#A+>$-_Db~o&n13%2|{opaX##hl0|lc}&|W+Lwdk+C|Z!Uoa@FQ+woa zMxkG0Z%@|+3_=$uFR)4KHYp+oh)1;%pUlT&0m~w~5f(wBlwH6g`#-{3JCY!hDYcmR zAfOiR`(bkK;Oy243bOwnilIobsQ!%>UAs4OaTibhYy}0`*HBQ^_i4c=sHAa<-78IL zNn1M7l?`tG(!fMngR|!46%;mjVC`xt`_18rY>?t8o3x$1XS`>v9IVp_Bj3K)SsuCb*?n^{8j4@)6a z&-0!`rj#uF^QC{BK)O391W5m>oSiRV>OYtz`9a<&{j{6~eb0N426%hEglzgk`NME@ z^szt4bALp7<&R_~;Rh-De)!CPJ{XM#;n}x%?N1Dxg|$;D$WoOWq~f5rjdO^z+D4(+ zulyx@$pwF9B6K4>3yj)H32s$)5qDOn^PIf>0?96QnUqaP&@X zRWhFdv0U4etVnWAQzKlmI?egFaJ`D>a_67G`pu~@;7q8D5e9PI_x!j(!8+7w%`=@4dxDYJwO;Z zKskZCB<_(QQh+$Dx8w80WFlczJh#FkNR+NMEYklYtnR4-narrI5YKzLEiJLChz3jU9R~381)^r)vUHoStr#La1wf3WCIB=V~Zx87Qaa2so z>+kET0?Hu}cpx5c3$^Y{B|4a56TU;{hTg;6VKzbm~?di!zPlroyfh yN`Yy|^#_l1y-BgrNvlF_KxsT08GZUzWbPMDXMIUsqhVRxwH(7UdsffH$Nn3gc3wmP literal 0 HcmV?d00001 diff --git a/venv/Lib/encodings/aliases.py b/venv/Lib/encodings/aliases.py new file mode 100644 index 00000000..2e63c2f9 --- /dev/null +++ b/venv/Lib/encodings/aliases.py @@ -0,0 +1,550 @@ +""" Encoding Aliases Support + + This module is used by the encodings package search function to + map encodings names to module names. + + Note that the search function normalizes the encoding names before + doing the lookup, so the mapping will have to map normalized + encoding names to module names. + + Contents: + + The following aliases dictionary contains mappings of all IANA + character set names for which the Python core library provides + codecs. In addition to these, a few Python specific codec + aliases have also been added. + +""" +aliases = { + + # Please keep this list sorted alphabetically by value ! + + # ascii codec + '646' : 'ascii', + 'ansi_x3.4_1968' : 'ascii', + 'ansi_x3_4_1968' : 'ascii', # some email headers use this non-standard name + 'ansi_x3.4_1986' : 'ascii', + 'cp367' : 'ascii', + 'csascii' : 'ascii', + 'ibm367' : 'ascii', + 'iso646_us' : 'ascii', + 'iso_646.irv_1991' : 'ascii', + 'iso_ir_6' : 'ascii', + 'us' : 'ascii', + 'us_ascii' : 'ascii', + + # base64_codec codec + 'base64' : 'base64_codec', + 'base_64' : 'base64_codec', + + # big5 codec + 'big5_tw' : 'big5', + 'csbig5' : 'big5', + + # big5hkscs codec + 'big5_hkscs' : 'big5hkscs', + 'hkscs' : 'big5hkscs', + + # bz2_codec codec + 'bz2' : 'bz2_codec', + + # cp037 codec + '037' : 'cp037', + 'csibm037' : 'cp037', + 'ebcdic_cp_ca' : 'cp037', + 'ebcdic_cp_nl' : 'cp037', + 'ebcdic_cp_us' : 'cp037', + 'ebcdic_cp_wt' : 'cp037', + 'ibm037' : 'cp037', + 'ibm039' : 'cp037', + + # cp1026 codec + '1026' : 'cp1026', + 'csibm1026' : 'cp1026', + 'ibm1026' : 'cp1026', + + # cp1125 codec + '1125' : 'cp1125', + 'ibm1125' : 'cp1125', + 'cp866u' : 'cp1125', + 'ruscii' : 'cp1125', + + # cp1140 codec + '1140' : 'cp1140', + 'ibm1140' : 'cp1140', + + # cp1250 codec + '1250' : 'cp1250', + 'windows_1250' : 'cp1250', + + # cp1251 codec + '1251' : 'cp1251', + 'windows_1251' : 'cp1251', + + # cp1252 codec + '1252' : 'cp1252', + 'windows_1252' : 'cp1252', + + # cp1253 codec + '1253' : 'cp1253', + 'windows_1253' : 'cp1253', + + # cp1254 codec + '1254' : 'cp1254', + 'windows_1254' : 'cp1254', + + # cp1255 codec + '1255' : 'cp1255', + 'windows_1255' : 'cp1255', + + # cp1256 codec + '1256' : 'cp1256', + 'windows_1256' : 'cp1256', + + # cp1257 codec + '1257' : 'cp1257', + 'windows_1257' : 'cp1257', + + # cp1258 codec + '1258' : 'cp1258', + 'windows_1258' : 'cp1258', + + # cp273 codec + '273' : 'cp273', + 'ibm273' : 'cp273', + 'csibm273' : 'cp273', + + # cp424 codec + '424' : 'cp424', + 'csibm424' : 'cp424', + 'ebcdic_cp_he' : 'cp424', + 'ibm424' : 'cp424', + + # cp437 codec + '437' : 'cp437', + 'cspc8codepage437' : 'cp437', + 'ibm437' : 'cp437', + + # cp500 codec + '500' : 'cp500', + 'csibm500' : 'cp500', + 'ebcdic_cp_be' : 'cp500', + 'ebcdic_cp_ch' : 'cp500', + 'ibm500' : 'cp500', + + # cp775 codec + '775' : 'cp775', + 'cspc775baltic' : 'cp775', + 'ibm775' : 'cp775', + + # cp850 codec + '850' : 'cp850', + 'cspc850multilingual' : 'cp850', + 'ibm850' : 'cp850', + + # cp852 codec + '852' : 'cp852', + 'cspcp852' : 'cp852', + 'ibm852' : 'cp852', + + # cp855 codec + '855' : 'cp855', + 'csibm855' : 'cp855', + 'ibm855' : 'cp855', + + # cp857 codec + '857' : 'cp857', + 'csibm857' : 'cp857', + 'ibm857' : 'cp857', + + # cp858 codec + '858' : 'cp858', + 'csibm858' : 'cp858', + 'ibm858' : 'cp858', + + # cp860 codec + '860' : 'cp860', + 'csibm860' : 'cp860', + 'ibm860' : 'cp860', + + # cp861 codec + '861' : 'cp861', + 'cp_is' : 'cp861', + 'csibm861' : 'cp861', + 'ibm861' : 'cp861', + + # cp862 codec + '862' : 'cp862', + 'cspc862latinhebrew' : 'cp862', + 'ibm862' : 'cp862', + + # cp863 codec + '863' : 'cp863', + 'csibm863' : 'cp863', + 'ibm863' : 'cp863', + + # cp864 codec + '864' : 'cp864', + 'csibm864' : 'cp864', + 'ibm864' : 'cp864', + + # cp865 codec + '865' : 'cp865', + 'csibm865' : 'cp865', + 'ibm865' : 'cp865', + + # cp866 codec + '866' : 'cp866', + 'csibm866' : 'cp866', + 'ibm866' : 'cp866', + + # cp869 codec + '869' : 'cp869', + 'cp_gr' : 'cp869', + 'csibm869' : 'cp869', + 'ibm869' : 'cp869', + + # cp932 codec + '932' : 'cp932', + 'ms932' : 'cp932', + 'mskanji' : 'cp932', + 'ms_kanji' : 'cp932', + + # cp949 codec + '949' : 'cp949', + 'ms949' : 'cp949', + 'uhc' : 'cp949', + + # cp950 codec + '950' : 'cp950', + 'ms950' : 'cp950', + + # euc_jis_2004 codec + 'jisx0213' : 'euc_jis_2004', + 'eucjis2004' : 'euc_jis_2004', + 'euc_jis2004' : 'euc_jis_2004', + + # euc_jisx0213 codec + 'eucjisx0213' : 'euc_jisx0213', + + # euc_jp codec + 'eucjp' : 'euc_jp', + 'ujis' : 'euc_jp', + 'u_jis' : 'euc_jp', + + # euc_kr codec + 'euckr' : 'euc_kr', + 'korean' : 'euc_kr', + 'ksc5601' : 'euc_kr', + 'ks_c_5601' : 'euc_kr', + 'ks_c_5601_1987' : 'euc_kr', + 'ksx1001' : 'euc_kr', + 'ks_x_1001' : 'euc_kr', + + # gb18030 codec + 'gb18030_2000' : 'gb18030', + + # gb2312 codec + 'chinese' : 'gb2312', + 'csiso58gb231280' : 'gb2312', + 'euc_cn' : 'gb2312', + 'euccn' : 'gb2312', + 'eucgb2312_cn' : 'gb2312', + 'gb2312_1980' : 'gb2312', + 'gb2312_80' : 'gb2312', + 'iso_ir_58' : 'gb2312', + + # gbk codec + '936' : 'gbk', + 'cp936' : 'gbk', + 'ms936' : 'gbk', + + # hex_codec codec + 'hex' : 'hex_codec', + + # hp_roman8 codec + 'roman8' : 'hp_roman8', + 'r8' : 'hp_roman8', + 'csHPRoman8' : 'hp_roman8', + + # hz codec + 'hzgb' : 'hz', + 'hz_gb' : 'hz', + 'hz_gb_2312' : 'hz', + + # iso2022_jp codec + 'csiso2022jp' : 'iso2022_jp', + 'iso2022jp' : 'iso2022_jp', + 'iso_2022_jp' : 'iso2022_jp', + + # iso2022_jp_1 codec + 'iso2022jp_1' : 'iso2022_jp_1', + 'iso_2022_jp_1' : 'iso2022_jp_1', + + # iso2022_jp_2 codec + 'iso2022jp_2' : 'iso2022_jp_2', + 'iso_2022_jp_2' : 'iso2022_jp_2', + + # iso2022_jp_2004 codec + 'iso_2022_jp_2004' : 'iso2022_jp_2004', + 'iso2022jp_2004' : 'iso2022_jp_2004', + + # iso2022_jp_3 codec + 'iso2022jp_3' : 'iso2022_jp_3', + 'iso_2022_jp_3' : 'iso2022_jp_3', + + # iso2022_jp_ext codec + 'iso2022jp_ext' : 'iso2022_jp_ext', + 'iso_2022_jp_ext' : 'iso2022_jp_ext', + + # iso2022_kr codec + 'csiso2022kr' : 'iso2022_kr', + 'iso2022kr' : 'iso2022_kr', + 'iso_2022_kr' : 'iso2022_kr', + + # iso8859_10 codec + 'csisolatin6' : 'iso8859_10', + 'iso_8859_10' : 'iso8859_10', + 'iso_8859_10_1992' : 'iso8859_10', + 'iso_ir_157' : 'iso8859_10', + 'l6' : 'iso8859_10', + 'latin6' : 'iso8859_10', + + # iso8859_11 codec + 'thai' : 'iso8859_11', + 'iso_8859_11' : 'iso8859_11', + 'iso_8859_11_2001' : 'iso8859_11', + + # iso8859_13 codec + 'iso_8859_13' : 'iso8859_13', + 'l7' : 'iso8859_13', + 'latin7' : 'iso8859_13', + + # iso8859_14 codec + 'iso_8859_14' : 'iso8859_14', + 'iso_8859_14_1998' : 'iso8859_14', + 'iso_celtic' : 'iso8859_14', + 'iso_ir_199' : 'iso8859_14', + 'l8' : 'iso8859_14', + 'latin8' : 'iso8859_14', + + # iso8859_15 codec + 'iso_8859_15' : 'iso8859_15', + 'l9' : 'iso8859_15', + 'latin9' : 'iso8859_15', + + # iso8859_16 codec + 'iso_8859_16' : 'iso8859_16', + 'iso_8859_16_2001' : 'iso8859_16', + 'iso_ir_226' : 'iso8859_16', + 'l10' : 'iso8859_16', + 'latin10' : 'iso8859_16', + + # iso8859_2 codec + 'csisolatin2' : 'iso8859_2', + 'iso_8859_2' : 'iso8859_2', + 'iso_8859_2_1987' : 'iso8859_2', + 'iso_ir_101' : 'iso8859_2', + 'l2' : 'iso8859_2', + 'latin2' : 'iso8859_2', + + # iso8859_3 codec + 'csisolatin3' : 'iso8859_3', + 'iso_8859_3' : 'iso8859_3', + 'iso_8859_3_1988' : 'iso8859_3', + 'iso_ir_109' : 'iso8859_3', + 'l3' : 'iso8859_3', + 'latin3' : 'iso8859_3', + + # iso8859_4 codec + 'csisolatin4' : 'iso8859_4', + 'iso_8859_4' : 'iso8859_4', + 'iso_8859_4_1988' : 'iso8859_4', + 'iso_ir_110' : 'iso8859_4', + 'l4' : 'iso8859_4', + 'latin4' : 'iso8859_4', + + # iso8859_5 codec + 'csisolatincyrillic' : 'iso8859_5', + 'cyrillic' : 'iso8859_5', + 'iso_8859_5' : 'iso8859_5', + 'iso_8859_5_1988' : 'iso8859_5', + 'iso_ir_144' : 'iso8859_5', + + # iso8859_6 codec + 'arabic' : 'iso8859_6', + 'asmo_708' : 'iso8859_6', + 'csisolatinarabic' : 'iso8859_6', + 'ecma_114' : 'iso8859_6', + 'iso_8859_6' : 'iso8859_6', + 'iso_8859_6_1987' : 'iso8859_6', + 'iso_ir_127' : 'iso8859_6', + + # iso8859_7 codec + 'csisolatingreek' : 'iso8859_7', + 'ecma_118' : 'iso8859_7', + 'elot_928' : 'iso8859_7', + 'greek' : 'iso8859_7', + 'greek8' : 'iso8859_7', + 'iso_8859_7' : 'iso8859_7', + 'iso_8859_7_1987' : 'iso8859_7', + 'iso_ir_126' : 'iso8859_7', + + # iso8859_8 codec + 'csisolatinhebrew' : 'iso8859_8', + 'hebrew' : 'iso8859_8', + 'iso_8859_8' : 'iso8859_8', + 'iso_8859_8_1988' : 'iso8859_8', + 'iso_ir_138' : 'iso8859_8', + + # iso8859_9 codec + 'csisolatin5' : 'iso8859_9', + 'iso_8859_9' : 'iso8859_9', + 'iso_8859_9_1989' : 'iso8859_9', + 'iso_ir_148' : 'iso8859_9', + 'l5' : 'iso8859_9', + 'latin5' : 'iso8859_9', + + # johab codec + 'cp1361' : 'johab', + 'ms1361' : 'johab', + + # koi8_r codec + 'cskoi8r' : 'koi8_r', + + # kz1048 codec + 'kz_1048' : 'kz1048', + 'rk1048' : 'kz1048', + 'strk1048_2002' : 'kz1048', + + # latin_1 codec + # + # Note that the latin_1 codec is implemented internally in C and a + # lot faster than the charmap codec iso8859_1 which uses the same + # encoding. This is why we discourage the use of the iso8859_1 + # codec and alias it to latin_1 instead. + # + '8859' : 'latin_1', + 'cp819' : 'latin_1', + 'csisolatin1' : 'latin_1', + 'ibm819' : 'latin_1', + 'iso8859' : 'latin_1', + 'iso8859_1' : 'latin_1', + 'iso_8859_1' : 'latin_1', + 'iso_8859_1_1987' : 'latin_1', + 'iso_ir_100' : 'latin_1', + 'l1' : 'latin_1', + 'latin' : 'latin_1', + 'latin1' : 'latin_1', + + # mac_cyrillic codec + 'maccyrillic' : 'mac_cyrillic', + + # mac_greek codec + 'macgreek' : 'mac_greek', + + # mac_iceland codec + 'maciceland' : 'mac_iceland', + + # mac_latin2 codec + 'maccentraleurope' : 'mac_latin2', + 'maclatin2' : 'mac_latin2', + + # mac_roman codec + 'macintosh' : 'mac_roman', + 'macroman' : 'mac_roman', + + # mac_turkish codec + 'macturkish' : 'mac_turkish', + + # mbcs codec + 'ansi' : 'mbcs', + 'dbcs' : 'mbcs', + + # ptcp154 codec + 'csptcp154' : 'ptcp154', + 'pt154' : 'ptcp154', + 'cp154' : 'ptcp154', + 'cyrillic_asian' : 'ptcp154', + + # quopri_codec codec + 'quopri' : 'quopri_codec', + 'quoted_printable' : 'quopri_codec', + 'quotedprintable' : 'quopri_codec', + + # rot_13 codec + 'rot13' : 'rot_13', + + # shift_jis codec + 'csshiftjis' : 'shift_jis', + 'shiftjis' : 'shift_jis', + 'sjis' : 'shift_jis', + 's_jis' : 'shift_jis', + + # shift_jis_2004 codec + 'shiftjis2004' : 'shift_jis_2004', + 'sjis_2004' : 'shift_jis_2004', + 's_jis_2004' : 'shift_jis_2004', + + # shift_jisx0213 codec + 'shiftjisx0213' : 'shift_jisx0213', + 'sjisx0213' : 'shift_jisx0213', + 's_jisx0213' : 'shift_jisx0213', + + # tactis codec + 'tis260' : 'tactis', + + # tis_620 codec + 'tis620' : 'tis_620', + 'tis_620_0' : 'tis_620', + 'tis_620_2529_0' : 'tis_620', + 'tis_620_2529_1' : 'tis_620', + 'iso_ir_166' : 'tis_620', + + # utf_16 codec + 'u16' : 'utf_16', + 'utf16' : 'utf_16', + + # utf_16_be codec + 'unicodebigunmarked' : 'utf_16_be', + 'utf_16be' : 'utf_16_be', + + # utf_16_le codec + 'unicodelittleunmarked' : 'utf_16_le', + 'utf_16le' : 'utf_16_le', + + # utf_32 codec + 'u32' : 'utf_32', + 'utf32' : 'utf_32', + + # utf_32_be codec + 'utf_32be' : 'utf_32_be', + + # utf_32_le codec + 'utf_32le' : 'utf_32_le', + + # utf_7 codec + 'u7' : 'utf_7', + 'utf7' : 'utf_7', + 'unicode_1_1_utf_7' : 'utf_7', + + # utf_8 codec + 'u8' : 'utf_8', + 'utf' : 'utf_8', + 'utf8' : 'utf_8', + 'utf8_ucs2' : 'utf_8', + 'utf8_ucs4' : 'utf_8', + + # uu_codec codec + 'uu' : 'uu_codec', + + # zlib_codec codec + 'zip' : 'zlib_codec', + 'zlib' : 'zlib_codec', + + # temporary mac CJK aliases, will be replaced by proper codecs in 3.1 + 'x_mac_japanese' : 'shift_jis', + 'x_mac_korean' : 'euc_kr', + 'x_mac_simp_chinese' : 'gb2312', + 'x_mac_trad_chinese' : 'big5', +} diff --git a/venv/Lib/encodings/ascii.py b/venv/Lib/encodings/ascii.py new file mode 100644 index 00000000..2033cde9 --- /dev/null +++ b/venv/Lib/encodings/ascii.py @@ -0,0 +1,50 @@ +""" Python 'ascii' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.ascii_encode + decode = codecs.ascii_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.ascii_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.ascii_decode(input, self.errors)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +class StreamConverter(StreamWriter,StreamReader): + + encode = codecs.ascii_decode + decode = codecs.ascii_encode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='ascii', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/venv/Lib/encodings/base64_codec.py b/venv/Lib/encodings/base64_codec.py new file mode 100644 index 00000000..8e7703b3 --- /dev/null +++ b/venv/Lib/encodings/base64_codec.py @@ -0,0 +1,55 @@ +"""Python 'base64_codec' Codec - base64 content transfer encoding. + +This codec de/encodes from bytes to bytes. + +Written by Marc-Andre Lemburg (mal@lemburg.com). +""" + +import codecs +import base64 + +### Codec APIs + +def base64_encode(input, errors='strict'): + assert errors == 'strict' + return (base64.encodebytes(input), len(input)) + +def base64_decode(input, errors='strict'): + assert errors == 'strict' + return (base64.decodebytes(input), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return base64_encode(input, errors) + def decode(self, input, errors='strict'): + return base64_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + assert self.errors == 'strict' + return base64.encodebytes(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + assert self.errors == 'strict' + return base64.decodebytes(input) + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='base64', + encode=base64_encode, + decode=base64_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) diff --git a/venv/Lib/encodings/big5.py b/venv/Lib/encodings/big5.py new file mode 100644 index 00000000..7adeb0e1 --- /dev/null +++ b/venv/Lib/encodings/big5.py @@ -0,0 +1,39 @@ +# +# big5.py: Python Unicode Codec for BIG5 +# +# Written by Hye-Shik Chang +# + +import _codecs_tw, codecs +import _multibytecodec as mbc + +codec = _codecs_tw.getcodec('big5') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='big5', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/big5hkscs.py b/venv/Lib/encodings/big5hkscs.py new file mode 100644 index 00000000..350df37b --- /dev/null +++ b/venv/Lib/encodings/big5hkscs.py @@ -0,0 +1,39 @@ +# +# big5hkscs.py: Python Unicode Codec for BIG5HKSCS +# +# Written by Hye-Shik Chang +# + +import _codecs_hk, codecs +import _multibytecodec as mbc + +codec = _codecs_hk.getcodec('big5hkscs') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='big5hkscs', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/bz2_codec.py b/venv/Lib/encodings/bz2_codec.py new file mode 100644 index 00000000..fd9495e3 --- /dev/null +++ b/venv/Lib/encodings/bz2_codec.py @@ -0,0 +1,78 @@ +"""Python 'bz2_codec' Codec - bz2 compression encoding. + +This codec de/encodes from bytes to bytes and is therefore usable with +bytes.transform() and bytes.untransform(). + +Adapted by Raymond Hettinger from zlib_codec.py which was written +by Marc-Andre Lemburg (mal@lemburg.com). +""" + +import codecs +import bz2 # this codec needs the optional bz2 module ! + +### Codec APIs + +def bz2_encode(input, errors='strict'): + assert errors == 'strict' + return (bz2.compress(input), len(input)) + +def bz2_decode(input, errors='strict'): + assert errors == 'strict' + return (bz2.decompress(input), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return bz2_encode(input, errors) + def decode(self, input, errors='strict'): + return bz2_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + assert errors == 'strict' + self.errors = errors + self.compressobj = bz2.BZ2Compressor() + + def encode(self, input, final=False): + if final: + c = self.compressobj.compress(input) + return c + self.compressobj.flush() + else: + return self.compressobj.compress(input) + + def reset(self): + self.compressobj = bz2.BZ2Compressor() + +class IncrementalDecoder(codecs.IncrementalDecoder): + def __init__(self, errors='strict'): + assert errors == 'strict' + self.errors = errors + self.decompressobj = bz2.BZ2Decompressor() + + def decode(self, input, final=False): + try: + return self.decompressobj.decompress(input) + except EOFError: + return '' + + def reset(self): + self.decompressobj = bz2.BZ2Decompressor() + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name="bz2", + encode=bz2_encode, + decode=bz2_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) diff --git a/venv/Lib/encodings/charmap.py b/venv/Lib/encodings/charmap.py new file mode 100644 index 00000000..81189b16 --- /dev/null +++ b/venv/Lib/encodings/charmap.py @@ -0,0 +1,69 @@ +""" Generic Python Character Mapping Codec. + + Use this codec directly rather than through the automatic + conversion mechanisms supplied by unicode() and .encode(). + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.charmap_encode + decode = codecs.charmap_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict', mapping=None): + codecs.IncrementalEncoder.__init__(self, errors) + self.mapping = mapping + + def encode(self, input, final=False): + return codecs.charmap_encode(input, self.errors, self.mapping)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def __init__(self, errors='strict', mapping=None): + codecs.IncrementalDecoder.__init__(self, errors) + self.mapping = mapping + + def decode(self, input, final=False): + return codecs.charmap_decode(input, self.errors, self.mapping)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + + def __init__(self,stream,errors='strict',mapping=None): + codecs.StreamWriter.__init__(self,stream,errors) + self.mapping = mapping + + def encode(self,input,errors='strict'): + return Codec.encode(input,errors,self.mapping) + +class StreamReader(Codec,codecs.StreamReader): + + def __init__(self,stream,errors='strict',mapping=None): + codecs.StreamReader.__init__(self,stream,errors) + self.mapping = mapping + + def decode(self,input,errors='strict'): + return Codec.decode(input,errors,self.mapping) + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='charmap', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/venv/Lib/encodings/cp037.py b/venv/Lib/encodings/cp037.py new file mode 100644 index 00000000..4edd708f --- /dev/null +++ b/venv/Lib/encodings/cp037.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp037 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP037.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp037', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '\xa2' # 0x4A -> CENT SIGN + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '|' # 0x4F -> VERTICAL LINE + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + '!' # 0x5A -> EXCLAMATION MARK + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '\xac' # 0x5F -> NOT SIGN + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\xa6' # 0x6A -> BROKEN BAR + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + '\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + '\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + '\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + '\xae' # 0xAF -> REGISTERED SIGN + '^' # 0xB0 -> CIRCUMFLEX ACCENT + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '[' # 0xBA -> LEFT SQUARE BRACKET + ']' # 0xBB -> RIGHT SQUARE BRACKET + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\\' # 0xE0 -> REVERSE SOLIDUS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp1006.py b/venv/Lib/encodings/cp1006.py new file mode 100644 index 00000000..a1221c3e --- /dev/null +++ b/venv/Lib/encodings/cp1006.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1006 generated from 'MAPPINGS/VENDORS/MISC/CP1006.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1006', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u06f0' # 0xA1 -> EXTENDED ARABIC-INDIC DIGIT ZERO + '\u06f1' # 0xA2 -> EXTENDED ARABIC-INDIC DIGIT ONE + '\u06f2' # 0xA3 -> EXTENDED ARABIC-INDIC DIGIT TWO + '\u06f3' # 0xA4 -> EXTENDED ARABIC-INDIC DIGIT THREE + '\u06f4' # 0xA5 -> EXTENDED ARABIC-INDIC DIGIT FOUR + '\u06f5' # 0xA6 -> EXTENDED ARABIC-INDIC DIGIT FIVE + '\u06f6' # 0xA7 -> EXTENDED ARABIC-INDIC DIGIT SIX + '\u06f7' # 0xA8 -> EXTENDED ARABIC-INDIC DIGIT SEVEN + '\u06f8' # 0xA9 -> EXTENDED ARABIC-INDIC DIGIT EIGHT + '\u06f9' # 0xAA -> EXTENDED ARABIC-INDIC DIGIT NINE + '\u060c' # 0xAB -> ARABIC COMMA + '\u061b' # 0xAC -> ARABIC SEMICOLON + '\xad' # 0xAD -> SOFT HYPHEN + '\u061f' # 0xAE -> ARABIC QUESTION MARK + '\ufe81' # 0xAF -> ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + '\ufe8d' # 0xB0 -> ARABIC LETTER ALEF ISOLATED FORM + '\ufe8e' # 0xB1 -> ARABIC LETTER ALEF FINAL FORM + '\ufe8e' # 0xB2 -> ARABIC LETTER ALEF FINAL FORM + '\ufe8f' # 0xB3 -> ARABIC LETTER BEH ISOLATED FORM + '\ufe91' # 0xB4 -> ARABIC LETTER BEH INITIAL FORM + '\ufb56' # 0xB5 -> ARABIC LETTER PEH ISOLATED FORM + '\ufb58' # 0xB6 -> ARABIC LETTER PEH INITIAL FORM + '\ufe93' # 0xB7 -> ARABIC LETTER TEH MARBUTA ISOLATED FORM + '\ufe95' # 0xB8 -> ARABIC LETTER TEH ISOLATED FORM + '\ufe97' # 0xB9 -> ARABIC LETTER TEH INITIAL FORM + '\ufb66' # 0xBA -> ARABIC LETTER TTEH ISOLATED FORM + '\ufb68' # 0xBB -> ARABIC LETTER TTEH INITIAL FORM + '\ufe99' # 0xBC -> ARABIC LETTER THEH ISOLATED FORM + '\ufe9b' # 0xBD -> ARABIC LETTER THEH INITIAL FORM + '\ufe9d' # 0xBE -> ARABIC LETTER JEEM ISOLATED FORM + '\ufe9f' # 0xBF -> ARABIC LETTER JEEM INITIAL FORM + '\ufb7a' # 0xC0 -> ARABIC LETTER TCHEH ISOLATED FORM + '\ufb7c' # 0xC1 -> ARABIC LETTER TCHEH INITIAL FORM + '\ufea1' # 0xC2 -> ARABIC LETTER HAH ISOLATED FORM + '\ufea3' # 0xC3 -> ARABIC LETTER HAH INITIAL FORM + '\ufea5' # 0xC4 -> ARABIC LETTER KHAH ISOLATED FORM + '\ufea7' # 0xC5 -> ARABIC LETTER KHAH INITIAL FORM + '\ufea9' # 0xC6 -> ARABIC LETTER DAL ISOLATED FORM + '\ufb84' # 0xC7 -> ARABIC LETTER DAHAL ISOLATED FORMN + '\ufeab' # 0xC8 -> ARABIC LETTER THAL ISOLATED FORM + '\ufead' # 0xC9 -> ARABIC LETTER REH ISOLATED FORM + '\ufb8c' # 0xCA -> ARABIC LETTER RREH ISOLATED FORM + '\ufeaf' # 0xCB -> ARABIC LETTER ZAIN ISOLATED FORM + '\ufb8a' # 0xCC -> ARABIC LETTER JEH ISOLATED FORM + '\ufeb1' # 0xCD -> ARABIC LETTER SEEN ISOLATED FORM + '\ufeb3' # 0xCE -> ARABIC LETTER SEEN INITIAL FORM + '\ufeb5' # 0xCF -> ARABIC LETTER SHEEN ISOLATED FORM + '\ufeb7' # 0xD0 -> ARABIC LETTER SHEEN INITIAL FORM + '\ufeb9' # 0xD1 -> ARABIC LETTER SAD ISOLATED FORM + '\ufebb' # 0xD2 -> ARABIC LETTER SAD INITIAL FORM + '\ufebd' # 0xD3 -> ARABIC LETTER DAD ISOLATED FORM + '\ufebf' # 0xD4 -> ARABIC LETTER DAD INITIAL FORM + '\ufec1' # 0xD5 -> ARABIC LETTER TAH ISOLATED FORM + '\ufec5' # 0xD6 -> ARABIC LETTER ZAH ISOLATED FORM + '\ufec9' # 0xD7 -> ARABIC LETTER AIN ISOLATED FORM + '\ufeca' # 0xD8 -> ARABIC LETTER AIN FINAL FORM + '\ufecb' # 0xD9 -> ARABIC LETTER AIN INITIAL FORM + '\ufecc' # 0xDA -> ARABIC LETTER AIN MEDIAL FORM + '\ufecd' # 0xDB -> ARABIC LETTER GHAIN ISOLATED FORM + '\ufece' # 0xDC -> ARABIC LETTER GHAIN FINAL FORM + '\ufecf' # 0xDD -> ARABIC LETTER GHAIN INITIAL FORM + '\ufed0' # 0xDE -> ARABIC LETTER GHAIN MEDIAL FORM + '\ufed1' # 0xDF -> ARABIC LETTER FEH ISOLATED FORM + '\ufed3' # 0xE0 -> ARABIC LETTER FEH INITIAL FORM + '\ufed5' # 0xE1 -> ARABIC LETTER QAF ISOLATED FORM + '\ufed7' # 0xE2 -> ARABIC LETTER QAF INITIAL FORM + '\ufed9' # 0xE3 -> ARABIC LETTER KAF ISOLATED FORM + '\ufedb' # 0xE4 -> ARABIC LETTER KAF INITIAL FORM + '\ufb92' # 0xE5 -> ARABIC LETTER GAF ISOLATED FORM + '\ufb94' # 0xE6 -> ARABIC LETTER GAF INITIAL FORM + '\ufedd' # 0xE7 -> ARABIC LETTER LAM ISOLATED FORM + '\ufedf' # 0xE8 -> ARABIC LETTER LAM INITIAL FORM + '\ufee0' # 0xE9 -> ARABIC LETTER LAM MEDIAL FORM + '\ufee1' # 0xEA -> ARABIC LETTER MEEM ISOLATED FORM + '\ufee3' # 0xEB -> ARABIC LETTER MEEM INITIAL FORM + '\ufb9e' # 0xEC -> ARABIC LETTER NOON GHUNNA ISOLATED FORM + '\ufee5' # 0xED -> ARABIC LETTER NOON ISOLATED FORM + '\ufee7' # 0xEE -> ARABIC LETTER NOON INITIAL FORM + '\ufe85' # 0xEF -> ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + '\ufeed' # 0xF0 -> ARABIC LETTER WAW ISOLATED FORM + '\ufba6' # 0xF1 -> ARABIC LETTER HEH GOAL ISOLATED FORM + '\ufba8' # 0xF2 -> ARABIC LETTER HEH GOAL INITIAL FORM + '\ufba9' # 0xF3 -> ARABIC LETTER HEH GOAL MEDIAL FORM + '\ufbaa' # 0xF4 -> ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM + '\ufe80' # 0xF5 -> ARABIC LETTER HAMZA ISOLATED FORM + '\ufe89' # 0xF6 -> ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM + '\ufe8a' # 0xF7 -> ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM + '\ufe8b' # 0xF8 -> ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + '\ufef1' # 0xF9 -> ARABIC LETTER YEH ISOLATED FORM + '\ufef2' # 0xFA -> ARABIC LETTER YEH FINAL FORM + '\ufef3' # 0xFB -> ARABIC LETTER YEH INITIAL FORM + '\ufbb0' # 0xFC -> ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM + '\ufbae' # 0xFD -> ARABIC LETTER YEH BARREE ISOLATED FORM + '\ufe7c' # 0xFE -> ARABIC SHADDA ISOLATED FORM + '\ufe7d' # 0xFF -> ARABIC SHADDA MEDIAL FORM +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp1026.py b/venv/Lib/encodings/cp1026.py new file mode 100644 index 00000000..46f71f74 --- /dev/null +++ b/venv/Lib/encodings/cp1026.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1026 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP1026.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1026', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '{' # 0x48 -> LEFT CURLY BRACKET + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '\xc7' # 0x4A -> LATIN CAPITAL LETTER C WITH CEDILLA + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '!' # 0x4F -> EXCLAMATION MARK + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + '\u011e' # 0x5A -> LATIN CAPITAL LETTER G WITH BREVE + '\u0130' # 0x5B -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '^' # 0x5F -> CIRCUMFLEX ACCENT + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '[' # 0x68 -> LEFT SQUARE BRACKET + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\u015f' # 0x6A -> LATIN SMALL LETTER S WITH CEDILLA + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '\u0131' # 0x79 -> LATIN SMALL LETTER DOTLESS I + ':' # 0x7A -> COLON + '\xd6' # 0x7B -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\u015e' # 0x7C -> LATIN CAPITAL LETTER S WITH CEDILLA + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '\xdc' # 0x7F -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '}' # 0x8C -> RIGHT CURLY BRACKET + '`' # 0x8D -> GRAVE ACCENT + '\xa6' # 0x8E -> BROKEN BAR + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '\xf6' # 0xA1 -> LATIN SMALL LETTER O WITH DIAERESIS + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + ']' # 0xAC -> RIGHT SQUARE BRACKET + '$' # 0xAD -> DOLLAR SIGN + '@' # 0xAE -> COMMERCIAL AT + '\xae' # 0xAF -> REGISTERED SIGN + '\xa2' # 0xB0 -> CENT SIGN + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '\xac' # 0xBA -> NOT SIGN + '|' # 0xBB -> VERTICAL LINE + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '\xe7' # 0xC0 -> LATIN SMALL LETTER C WITH CEDILLA + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '~' # 0xCC -> TILDE + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '\u011f' # 0xD0 -> LATIN SMALL LETTER G WITH BREVE + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\\' # 0xDC -> REVERSE SOLIDUS + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xfc' # 0xE0 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '#' # 0xEC -> NUMBER SIGN + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '"' # 0xFC -> QUOTATION MARK + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp1125.py b/venv/Lib/encodings/cp1125.py new file mode 100644 index 00000000..b1fd69de --- /dev/null +++ b/venv/Lib/encodings/cp1125.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec for CP1125 + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1125', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x0081: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x0082: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x0083: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x0084: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x0085: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x0086: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x0087: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x0088: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x0089: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x008a: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x008b: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x008c: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x008d: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x008e: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x008f: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x0090: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x0091: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x0092: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x0093: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x0094: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x0095: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x0096: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x0097: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x0098: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x0099: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x009a: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x009b: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x009c: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x009d: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x009e: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009f: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a2: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00a3: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00a4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00a7: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00a8: 0x0438, # CYRILLIC SMALL LETTER I + 0x00a9: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00aa: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00ab: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00ac: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00ad: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00ae: 0x043e, # CYRILLIC SMALL LETTER O + 0x00af: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e1: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e2: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e3: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e4: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00e5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00e6: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00e7: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00e8: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00e9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00ea: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00eb: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00ec: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ed: 0x044d, # CYRILLIC SMALL LETTER E + 0x00ee: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00ef: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00f0: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00f1: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00f2: 0x0490, # CYRILLIC CAPITAL LETTER GHE WITH UPTURN + 0x00f3: 0x0491, # CYRILLIC SMALL LETTER GHE WITH UPTURN + 0x00f4: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00f5: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00f6: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00f7: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00f8: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x00f9: 0x0457, # CYRILLIC SMALL LETTER YI + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x2116, # NUMERO SIGN + 0x00fd: 0x00a4, # CURRENCY SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0410' # 0x0080 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0x0081 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0x0082 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0x0083 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0x0084 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0x0085 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0x0086 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0x0087 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0x0088 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0x0089 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0x008a -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0x008b -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0x008c -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0x008d -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0x008e -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0x008f -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0x0090 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0x0091 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0x0092 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0x0093 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0x0094 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0x0095 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0x0096 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0x0097 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0x0098 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0x0099 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0x009a -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0x009b -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0x009c -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0x009d -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0x009e -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0x009f -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0x00a1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0x00a2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0x00a3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0x00a4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0x00a5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0x00a6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0x00a7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0x00a8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0x00a9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0x00aa -> CYRILLIC SMALL LETTER KA + '\u043b' # 0x00ab -> CYRILLIC SMALL LETTER EL + '\u043c' # 0x00ac -> CYRILLIC SMALL LETTER EM + '\u043d' # 0x00ad -> CYRILLIC SMALL LETTER EN + '\u043e' # 0x00ae -> CYRILLIC SMALL LETTER O + '\u043f' # 0x00af -> CYRILLIC SMALL LETTER PE + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u0440' # 0x00e0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0x00e1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0x00e2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0x00e3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0x00e4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0x00e5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0x00e6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0x00e7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0x00e8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0x00e9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0x00ea -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0x00eb -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0x00ec -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0x00ed -> CYRILLIC SMALL LETTER E + '\u044e' # 0x00ee -> CYRILLIC SMALL LETTER YU + '\u044f' # 0x00ef -> CYRILLIC SMALL LETTER YA + '\u0401' # 0x00f0 -> CYRILLIC CAPITAL LETTER IO + '\u0451' # 0x00f1 -> CYRILLIC SMALL LETTER IO + '\u0490' # 0x00f2 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN + '\u0491' # 0x00f3 -> CYRILLIC SMALL LETTER GHE WITH UPTURN + '\u0404' # 0x00f4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0454' # 0x00f5 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0406' # 0x00f6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0456' # 0x00f7 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0407' # 0x00f8 -> CYRILLIC CAPITAL LETTER YI + '\u0457' # 0x00f9 -> CYRILLIC SMALL LETTER YI + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u2116' # 0x00fc -> NUMERO SIGN + '\xa4' # 0x00fd -> CURRENCY SIGN + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00fd, # CURRENCY SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x0401: 0x00f0, # CYRILLIC CAPITAL LETTER IO + 0x0404: 0x00f4, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0406: 0x00f6, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0407: 0x00f8, # CYRILLIC CAPITAL LETTER YI + 0x0410: 0x0080, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x0081, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x0082, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x0083, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x0084, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x0085, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x0086, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x0087, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x0088, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x0089, # CYRILLIC CAPITAL LETTER SHORT I + 0x041a: 0x008a, # CYRILLIC CAPITAL LETTER KA + 0x041b: 0x008b, # CYRILLIC CAPITAL LETTER EL + 0x041c: 0x008c, # CYRILLIC CAPITAL LETTER EM + 0x041d: 0x008d, # CYRILLIC CAPITAL LETTER EN + 0x041e: 0x008e, # CYRILLIC CAPITAL LETTER O + 0x041f: 0x008f, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x0090, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x0091, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x0092, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x0093, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x0094, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x0095, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x0096, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x0097, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x0098, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x0099, # CYRILLIC CAPITAL LETTER SHCHA + 0x042a: 0x009a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042b: 0x009b, # CYRILLIC CAPITAL LETTER YERU + 0x042c: 0x009c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042d: 0x009d, # CYRILLIC CAPITAL LETTER E + 0x042e: 0x009e, # CYRILLIC CAPITAL LETTER YU + 0x042f: 0x009f, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A + 0x0431: 0x00a1, # CYRILLIC SMALL LETTER BE + 0x0432: 0x00a2, # CYRILLIC SMALL LETTER VE + 0x0433: 0x00a3, # CYRILLIC SMALL LETTER GHE + 0x0434: 0x00a4, # CYRILLIC SMALL LETTER DE + 0x0435: 0x00a5, # CYRILLIC SMALL LETTER IE + 0x0436: 0x00a6, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0x00a7, # CYRILLIC SMALL LETTER ZE + 0x0438: 0x00a8, # CYRILLIC SMALL LETTER I + 0x0439: 0x00a9, # CYRILLIC SMALL LETTER SHORT I + 0x043a: 0x00aa, # CYRILLIC SMALL LETTER KA + 0x043b: 0x00ab, # CYRILLIC SMALL LETTER EL + 0x043c: 0x00ac, # CYRILLIC SMALL LETTER EM + 0x043d: 0x00ad, # CYRILLIC SMALL LETTER EN + 0x043e: 0x00ae, # CYRILLIC SMALL LETTER O + 0x043f: 0x00af, # CYRILLIC SMALL LETTER PE + 0x0440: 0x00e0, # CYRILLIC SMALL LETTER ER + 0x0441: 0x00e1, # CYRILLIC SMALL LETTER ES + 0x0442: 0x00e2, # CYRILLIC SMALL LETTER TE + 0x0443: 0x00e3, # CYRILLIC SMALL LETTER U + 0x0444: 0x00e4, # CYRILLIC SMALL LETTER EF + 0x0445: 0x00e5, # CYRILLIC SMALL LETTER HA + 0x0446: 0x00e6, # CYRILLIC SMALL LETTER TSE + 0x0447: 0x00e7, # CYRILLIC SMALL LETTER CHE + 0x0448: 0x00e8, # CYRILLIC SMALL LETTER SHA + 0x0449: 0x00e9, # CYRILLIC SMALL LETTER SHCHA + 0x044a: 0x00ea, # CYRILLIC SMALL LETTER HARD SIGN + 0x044b: 0x00eb, # CYRILLIC SMALL LETTER YERU + 0x044c: 0x00ec, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044d: 0x00ed, # CYRILLIC SMALL LETTER E + 0x044e: 0x00ee, # CYRILLIC SMALL LETTER YU + 0x044f: 0x00ef, # CYRILLIC SMALL LETTER YA + 0x0451: 0x00f1, # CYRILLIC SMALL LETTER IO + 0x0454: 0x00f5, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0456: 0x00f7, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0457: 0x00f9, # CYRILLIC SMALL LETTER YI + 0x0490: 0x00f2, # CYRILLIC CAPITAL LETTER GHE WITH UPTURN + 0x0491: 0x00f3, # CYRILLIC SMALL LETTER GHE WITH UPTURN + 0x2116: 0x00fc, # NUMERO SIGN + 0x221a: 0x00fb, # SQUARE ROOT + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp1140.py b/venv/Lib/encodings/cp1140.py new file mode 100644 index 00000000..0a919d83 --- /dev/null +++ b/venv/Lib/encodings/cp1140.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1140 generated from 'python-mappings/CP1140.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1140', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '\xa2' # 0x4A -> CENT SIGN + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '|' # 0x4F -> VERTICAL LINE + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + '!' # 0x5A -> EXCLAMATION MARK + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '\xac' # 0x5F -> NOT SIGN + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\xa6' # 0x6A -> BROKEN BAR + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + '\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + '\u20ac' # 0x9F -> EURO SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + '\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + '\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + '\xae' # 0xAF -> REGISTERED SIGN + '^' # 0xB0 -> CIRCUMFLEX ACCENT + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '[' # 0xBA -> LEFT SQUARE BRACKET + ']' # 0xBB -> RIGHT SQUARE BRACKET + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\\' # 0xE0 -> REVERSE SOLIDUS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp1250.py b/venv/Lib/encodings/cp1250.py new file mode 100644 index 00000000..c2c83aaf --- /dev/null +++ b/venv/Lib/encodings/cp1250.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1250 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1250', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\ufffe' # 0x83 -> UNDEFINED + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\ufffe' # 0x88 -> UNDEFINED + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u015a' # 0x8C -> LATIN CAPITAL LETTER S WITH ACUTE + '\u0164' # 0x8D -> LATIN CAPITAL LETTER T WITH CARON + '\u017d' # 0x8E -> LATIN CAPITAL LETTER Z WITH CARON + '\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u015b' # 0x9C -> LATIN SMALL LETTER S WITH ACUTE + '\u0165' # 0x9D -> LATIN SMALL LETTER T WITH CARON + '\u017e' # 0x9E -> LATIN SMALL LETTER Z WITH CARON + '\u017a' # 0x9F -> LATIN SMALL LETTER Z WITH ACUTE + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u02c7' # 0xA1 -> CARON + '\u02d8' # 0xA2 -> BREVE + '\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u0104' # 0xA5 -> LATIN CAPITAL LETTER A WITH OGONEK + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u02db' # 0xB2 -> OGONEK + '\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\u0105' # 0xB9 -> LATIN SMALL LETTER A WITH OGONEK + '\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u013d' # 0xBC -> LATIN CAPITAL LETTER L WITH CARON + '\u02dd' # 0xBD -> DOUBLE ACUTE ACCENT + '\u013e' # 0xBE -> LATIN SMALL LETTER L WITH CARON + '\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u0154' # 0xC0 -> LATIN CAPITAL LETTER R WITH ACUTE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0139' # 0xC5 -> LATIN CAPITAL LETTER L WITH ACUTE + '\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u011a' # 0xCC -> LATIN CAPITAL LETTER E WITH CARON + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u010e' # 0xCF -> LATIN CAPITAL LETTER D WITH CARON + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0147' # 0xD2 -> LATIN CAPITAL LETTER N WITH CARON + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0158' # 0xD8 -> LATIN CAPITAL LETTER R WITH CARON + '\u016e' # 0xD9 -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\u0170' # 0xDB -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\u0162' # 0xDE -> LATIN CAPITAL LETTER T WITH CEDILLA + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\u0155' # 0xE0 -> LATIN SMALL LETTER R WITH ACUTE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u013a' # 0xE5 -> LATIN SMALL LETTER L WITH ACUTE + '\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u011b' # 0xEC -> LATIN SMALL LETTER E WITH CARON + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u010f' # 0xEF -> LATIN SMALL LETTER D WITH CARON + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\u0148' # 0xF2 -> LATIN SMALL LETTER N WITH CARON + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0159' # 0xF8 -> LATIN SMALL LETTER R WITH CARON + '\u016f' # 0xF9 -> LATIN SMALL LETTER U WITH RING ABOVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\u0171' # 0xFB -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\u0163' # 0xFE -> LATIN SMALL LETTER T WITH CEDILLA + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp1251.py b/venv/Lib/encodings/cp1251.py new file mode 100644 index 00000000..22bc6600 --- /dev/null +++ b/venv/Lib/encodings/cp1251.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1251 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1251', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u0402' # 0x80 -> CYRILLIC CAPITAL LETTER DJE + '\u0403' # 0x81 -> CYRILLIC CAPITAL LETTER GJE + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0453' # 0x83 -> CYRILLIC SMALL LETTER GJE + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u20ac' # 0x88 -> EURO SIGN + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0409' # 0x8A -> CYRILLIC CAPITAL LETTER LJE + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u040a' # 0x8C -> CYRILLIC CAPITAL LETTER NJE + '\u040c' # 0x8D -> CYRILLIC CAPITAL LETTER KJE + '\u040b' # 0x8E -> CYRILLIC CAPITAL LETTER TSHE + '\u040f' # 0x8F -> CYRILLIC CAPITAL LETTER DZHE + '\u0452' # 0x90 -> CYRILLIC SMALL LETTER DJE + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0459' # 0x9A -> CYRILLIC SMALL LETTER LJE + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u045a' # 0x9C -> CYRILLIC SMALL LETTER NJE + '\u045c' # 0x9D -> CYRILLIC SMALL LETTER KJE + '\u045b' # 0x9E -> CYRILLIC SMALL LETTER TSHE + '\u045f' # 0x9F -> CYRILLIC SMALL LETTER DZHE + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u040e' # 0xA1 -> CYRILLIC CAPITAL LETTER SHORT U + '\u045e' # 0xA2 -> CYRILLIC SMALL LETTER SHORT U + '\u0408' # 0xA3 -> CYRILLIC CAPITAL LETTER JE + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u0490' # 0xA5 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\u0401' # 0xA8 -> CYRILLIC CAPITAL LETTER IO + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0404' # 0xAA -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u0407' # 0xAF -> CYRILLIC CAPITAL LETTER YI + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u0406' # 0xB2 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0456' # 0xB3 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0491' # 0xB4 -> CYRILLIC SMALL LETTER GHE WITH UPTURN + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0451' # 0xB8 -> CYRILLIC SMALL LETTER IO + '\u2116' # 0xB9 -> NUMERO SIGN + '\u0454' # 0xBA -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0458' # 0xBC -> CYRILLIC SMALL LETTER JE + '\u0405' # 0xBD -> CYRILLIC CAPITAL LETTER DZE + '\u0455' # 0xBE -> CYRILLIC SMALL LETTER DZE + '\u0457' # 0xBF -> CYRILLIC SMALL LETTER YI + '\u0410' # 0xC0 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xC1 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0xC2 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0xC3 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0xC4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xC5 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0xC6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0xC7 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0xC8 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xC9 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xCA -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xCB -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xCC -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xCD -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xCE -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xCF -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0xD0 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xD1 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xD2 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xD3 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0xD4 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0xD5 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0xD6 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0xD7 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0xD8 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0xD9 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0xDA -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0xDB -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0xDC -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0xDD -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0xDE -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0xDF -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + '\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + '\u044f' # 0xFF -> CYRILLIC SMALL LETTER YA +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp1252.py b/venv/Lib/encodings/cp1252.py new file mode 100644 index 00000000..c0e8088e --- /dev/null +++ b/venv/Lib/encodings/cp1252.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1252 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1252', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\ufffe' # 0x8D -> UNDEFINED + '\u017d' # 0x8E -> LATIN CAPITAL LETTER Z WITH CARON + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\ufffe' # 0x9D -> UNDEFINED + '\u017e' # 0x9E -> LATIN SMALL LETTER Z WITH CARON + '\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp1253.py b/venv/Lib/encodings/cp1253.py new file mode 100644 index 00000000..ec9c0972 --- /dev/null +++ b/venv/Lib/encodings/cp1253.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1253 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1253.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1253', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\ufffe' # 0x88 -> UNDEFINED + '\u2030' # 0x89 -> PER MILLE SIGN + '\ufffe' # 0x8A -> UNDEFINED + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x8C -> UNDEFINED + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x9C -> UNDEFINED + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\ufffe' # 0x9F -> UNDEFINED + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0385' # 0xA1 -> GREEK DIALYTIKA TONOS + '\u0386' # 0xA2 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\ufffe' # 0xAA -> UNDEFINED + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u2015' # 0xAF -> HORIZONTAL BAR + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\u0384' # 0xB4 -> GREEK TONOS + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0388' # 0xB8 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0389' # 0xB9 -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0xBA -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u038c' # 0xBC -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\u038e' # 0xBE -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u038f' # 0xBF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\u0390' # 0xC0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u0391' # 0xC1 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0xC2 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0xC3 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0xC4 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0xC5 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0xC6 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0xC7 -> GREEK CAPITAL LETTER ETA + '\u0398' # 0xC8 -> GREEK CAPITAL LETTER THETA + '\u0399' # 0xC9 -> GREEK CAPITAL LETTER IOTA + '\u039a' # 0xCA -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0xCB -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0xCC -> GREEK CAPITAL LETTER MU + '\u039d' # 0xCD -> GREEK CAPITAL LETTER NU + '\u039e' # 0xCE -> GREEK CAPITAL LETTER XI + '\u039f' # 0xCF -> GREEK CAPITAL LETTER OMICRON + '\u03a0' # 0xD0 -> GREEK CAPITAL LETTER PI + '\u03a1' # 0xD1 -> GREEK CAPITAL LETTER RHO + '\ufffe' # 0xD2 -> UNDEFINED + '\u03a3' # 0xD3 -> GREEK CAPITAL LETTER SIGMA + '\u03a4' # 0xD4 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0xD5 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0xD6 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0xD7 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0xD8 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0xD9 -> GREEK CAPITAL LETTER OMEGA + '\u03aa' # 0xDA -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u03ab' # 0xDB -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\u03ac' # 0xDC -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u03ad' # 0xDD -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0xDE -> GREEK SMALL LETTER ETA WITH TONOS + '\u03af' # 0xDF -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03b0' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + '\u03b3' # 0xE3 -> GREEK SMALL LETTER GAMMA + '\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + '\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + '\u03b6' # 0xE6 -> GREEK SMALL LETTER ZETA + '\u03b7' # 0xE7 -> GREEK SMALL LETTER ETA + '\u03b8' # 0xE8 -> GREEK SMALL LETTER THETA + '\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + '\u03ba' # 0xEA -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0xEB -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0xEC -> GREEK SMALL LETTER MU + '\u03bd' # 0xED -> GREEK SMALL LETTER NU + '\u03be' # 0xEE -> GREEK SMALL LETTER XI + '\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + '\u03c1' # 0xF1 -> GREEK SMALL LETTER RHO + '\u03c2' # 0xF2 -> GREEK SMALL LETTER FINAL SIGMA + '\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + '\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + '\u03c5' # 0xF5 -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0xF6 -> GREEK SMALL LETTER PHI + '\u03c7' # 0xF7 -> GREEK SMALL LETTER CHI + '\u03c8' # 0xF8 -> GREEK SMALL LETTER PSI + '\u03c9' # 0xF9 -> GREEK SMALL LETTER OMEGA + '\u03ca' # 0xFA -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03cb' # 0xFB -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03cc' # 0xFC -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0xFD -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03ce' # 0xFE -> GREEK SMALL LETTER OMEGA WITH TONOS + '\ufffe' # 0xFF -> UNDEFINED +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp1254.py b/venv/Lib/encodings/cp1254.py new file mode 100644 index 00000000..4912327a --- /dev/null +++ b/venv/Lib/encodings/cp1254.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1254 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1254.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1254', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u011e' # 0xD0 -> LATIN CAPITAL LETTER G WITH BREVE + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0130' # 0xDD -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u011f' # 0xF0 -> LATIN SMALL LETTER G WITH BREVE + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u0131' # 0xFD -> LATIN SMALL LETTER DOTLESS I + '\u015f' # 0xFE -> LATIN SMALL LETTER S WITH CEDILLA + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp1255.py b/venv/Lib/encodings/cp1255.py new file mode 100644 index 00000000..91ce26b9 --- /dev/null +++ b/venv/Lib/encodings/cp1255.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1255 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1255.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1255', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\ufffe' # 0x8A -> UNDEFINED + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x8C -> UNDEFINED + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x9C -> UNDEFINED + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\ufffe' # 0x9F -> UNDEFINED + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\u20aa' # 0xA4 -> NEW SHEQEL SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xd7' # 0xAA -> MULTIPLICATION SIGN + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xf7' # 0xBA -> DIVISION SIGN + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\u05b0' # 0xC0 -> HEBREW POINT SHEVA + '\u05b1' # 0xC1 -> HEBREW POINT HATAF SEGOL + '\u05b2' # 0xC2 -> HEBREW POINT HATAF PATAH + '\u05b3' # 0xC3 -> HEBREW POINT HATAF QAMATS + '\u05b4' # 0xC4 -> HEBREW POINT HIRIQ + '\u05b5' # 0xC5 -> HEBREW POINT TSERE + '\u05b6' # 0xC6 -> HEBREW POINT SEGOL + '\u05b7' # 0xC7 -> HEBREW POINT PATAH + '\u05b8' # 0xC8 -> HEBREW POINT QAMATS + '\u05b9' # 0xC9 -> HEBREW POINT HOLAM + '\ufffe' # 0xCA -> UNDEFINED + '\u05bb' # 0xCB -> HEBREW POINT QUBUTS + '\u05bc' # 0xCC -> HEBREW POINT DAGESH OR MAPIQ + '\u05bd' # 0xCD -> HEBREW POINT METEG + '\u05be' # 0xCE -> HEBREW PUNCTUATION MAQAF + '\u05bf' # 0xCF -> HEBREW POINT RAFE + '\u05c0' # 0xD0 -> HEBREW PUNCTUATION PASEQ + '\u05c1' # 0xD1 -> HEBREW POINT SHIN DOT + '\u05c2' # 0xD2 -> HEBREW POINT SIN DOT + '\u05c3' # 0xD3 -> HEBREW PUNCTUATION SOF PASUQ + '\u05f0' # 0xD4 -> HEBREW LIGATURE YIDDISH DOUBLE VAV + '\u05f1' # 0xD5 -> HEBREW LIGATURE YIDDISH VAV YOD + '\u05f2' # 0xD6 -> HEBREW LIGATURE YIDDISH DOUBLE YOD + '\u05f3' # 0xD7 -> HEBREW PUNCTUATION GERESH + '\u05f4' # 0xD8 -> HEBREW PUNCTUATION GERSHAYIM + '\ufffe' # 0xD9 -> UNDEFINED + '\ufffe' # 0xDA -> UNDEFINED + '\ufffe' # 0xDB -> UNDEFINED + '\ufffe' # 0xDC -> UNDEFINED + '\ufffe' # 0xDD -> UNDEFINED + '\ufffe' # 0xDE -> UNDEFINED + '\ufffe' # 0xDF -> UNDEFINED + '\u05d0' # 0xE0 -> HEBREW LETTER ALEF + '\u05d1' # 0xE1 -> HEBREW LETTER BET + '\u05d2' # 0xE2 -> HEBREW LETTER GIMEL + '\u05d3' # 0xE3 -> HEBREW LETTER DALET + '\u05d4' # 0xE4 -> HEBREW LETTER HE + '\u05d5' # 0xE5 -> HEBREW LETTER VAV + '\u05d6' # 0xE6 -> HEBREW LETTER ZAYIN + '\u05d7' # 0xE7 -> HEBREW LETTER HET + '\u05d8' # 0xE8 -> HEBREW LETTER TET + '\u05d9' # 0xE9 -> HEBREW LETTER YOD + '\u05da' # 0xEA -> HEBREW LETTER FINAL KAF + '\u05db' # 0xEB -> HEBREW LETTER KAF + '\u05dc' # 0xEC -> HEBREW LETTER LAMED + '\u05dd' # 0xED -> HEBREW LETTER FINAL MEM + '\u05de' # 0xEE -> HEBREW LETTER MEM + '\u05df' # 0xEF -> HEBREW LETTER FINAL NUN + '\u05e0' # 0xF0 -> HEBREW LETTER NUN + '\u05e1' # 0xF1 -> HEBREW LETTER SAMEKH + '\u05e2' # 0xF2 -> HEBREW LETTER AYIN + '\u05e3' # 0xF3 -> HEBREW LETTER FINAL PE + '\u05e4' # 0xF4 -> HEBREW LETTER PE + '\u05e5' # 0xF5 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0xF6 -> HEBREW LETTER TSADI + '\u05e7' # 0xF7 -> HEBREW LETTER QOF + '\u05e8' # 0xF8 -> HEBREW LETTER RESH + '\u05e9' # 0xF9 -> HEBREW LETTER SHIN + '\u05ea' # 0xFA -> HEBREW LETTER TAV + '\ufffe' # 0xFB -> UNDEFINED + '\ufffe' # 0xFC -> UNDEFINED + '\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + '\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + '\ufffe' # 0xFF -> UNDEFINED +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp1256.py b/venv/Lib/encodings/cp1256.py new file mode 100644 index 00000000..fd6afab5 --- /dev/null +++ b/venv/Lib/encodings/cp1256.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1256 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1256.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1256', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\u067e' # 0x81 -> ARABIC LETTER PEH + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0679' # 0x8A -> ARABIC LETTER TTEH + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\u0686' # 0x8D -> ARABIC LETTER TCHEH + '\u0698' # 0x8E -> ARABIC LETTER JEH + '\u0688' # 0x8F -> ARABIC LETTER DDAL + '\u06af' # 0x90 -> ARABIC LETTER GAF + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u06a9' # 0x98 -> ARABIC LETTER KEHEH + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0691' # 0x9A -> ARABIC LETTER RREH + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\u200c' # 0x9D -> ZERO WIDTH NON-JOINER + '\u200d' # 0x9E -> ZERO WIDTH JOINER + '\u06ba' # 0x9F -> ARABIC LETTER NOON GHUNNA + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u060c' # 0xA1 -> ARABIC COMMA + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u06be' # 0xAA -> ARABIC LETTER HEH DOACHASHMEE + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\u061b' # 0xBA -> ARABIC SEMICOLON + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\u061f' # 0xBF -> ARABIC QUESTION MARK + '\u06c1' # 0xC0 -> ARABIC LETTER HEH GOAL + '\u0621' # 0xC1 -> ARABIC LETTER HAMZA + '\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0xC7 -> ARABIC LETTER ALEF + '\u0628' # 0xC8 -> ARABIC LETTER BEH + '\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0xCA -> ARABIC LETTER TEH + '\u062b' # 0xCB -> ARABIC LETTER THEH + '\u062c' # 0xCC -> ARABIC LETTER JEEM + '\u062d' # 0xCD -> ARABIC LETTER HAH + '\u062e' # 0xCE -> ARABIC LETTER KHAH + '\u062f' # 0xCF -> ARABIC LETTER DAL + '\u0630' # 0xD0 -> ARABIC LETTER THAL + '\u0631' # 0xD1 -> ARABIC LETTER REH + '\u0632' # 0xD2 -> ARABIC LETTER ZAIN + '\u0633' # 0xD3 -> ARABIC LETTER SEEN + '\u0634' # 0xD4 -> ARABIC LETTER SHEEN + '\u0635' # 0xD5 -> ARABIC LETTER SAD + '\u0636' # 0xD6 -> ARABIC LETTER DAD + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0637' # 0xD8 -> ARABIC LETTER TAH + '\u0638' # 0xD9 -> ARABIC LETTER ZAH + '\u0639' # 0xDA -> ARABIC LETTER AIN + '\u063a' # 0xDB -> ARABIC LETTER GHAIN + '\u0640' # 0xDC -> ARABIC TATWEEL + '\u0641' # 0xDD -> ARABIC LETTER FEH + '\u0642' # 0xDE -> ARABIC LETTER QAF + '\u0643' # 0xDF -> ARABIC LETTER KAF + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\u0644' # 0xE1 -> ARABIC LETTER LAM + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0645' # 0xE3 -> ARABIC LETTER MEEM + '\u0646' # 0xE4 -> ARABIC LETTER NOON + '\u0647' # 0xE5 -> ARABIC LETTER HEH + '\u0648' # 0xE6 -> ARABIC LETTER WAW + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0649' # 0xEC -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0xED -> ARABIC LETTER YEH + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u064b' # 0xF0 -> ARABIC FATHATAN + '\u064c' # 0xF1 -> ARABIC DAMMATAN + '\u064d' # 0xF2 -> ARABIC KASRATAN + '\u064e' # 0xF3 -> ARABIC FATHA + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u064f' # 0xF5 -> ARABIC DAMMA + '\u0650' # 0xF6 -> ARABIC KASRA + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0651' # 0xF8 -> ARABIC SHADDA + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\u0652' # 0xFA -> ARABIC SUKUN + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + '\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + '\u06d2' # 0xFF -> ARABIC LETTER YEH BARREE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp1257.py b/venv/Lib/encodings/cp1257.py new file mode 100644 index 00000000..9ebc90d5 --- /dev/null +++ b/venv/Lib/encodings/cp1257.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1257 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1257.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1257', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\ufffe' # 0x83 -> UNDEFINED + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\ufffe' # 0x88 -> UNDEFINED + '\u2030' # 0x89 -> PER MILLE SIGN + '\ufffe' # 0x8A -> UNDEFINED + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x8C -> UNDEFINED + '\xa8' # 0x8D -> DIAERESIS + '\u02c7' # 0x8E -> CARON + '\xb8' # 0x8F -> CEDILLA + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x9C -> UNDEFINED + '\xaf' # 0x9D -> MACRON + '\u02db' # 0x9E -> OGONEK + '\ufffe' # 0x9F -> UNDEFINED + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\ufffe' # 0xA1 -> UNDEFINED + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\ufffe' # 0xA5 -> UNDEFINED + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xd8' # 0xA8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0156' # 0xAA -> LATIN CAPITAL LETTER R WITH CEDILLA + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xc6' # 0xAF -> LATIN CAPITAL LETTER AE + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xf8' # 0xB8 -> LATIN SMALL LETTER O WITH STROKE + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\u0157' # 0xBA -> LATIN SMALL LETTER R WITH CEDILLA + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xe6' # 0xBF -> LATIN SMALL LETTER AE + '\u0104' # 0xC0 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u012e' # 0xC1 -> LATIN CAPITAL LETTER I WITH OGONEK + '\u0100' # 0xC2 -> LATIN CAPITAL LETTER A WITH MACRON + '\u0106' # 0xC3 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\u0118' # 0xC6 -> LATIN CAPITAL LETTER E WITH OGONEK + '\u0112' # 0xC7 -> LATIN CAPITAL LETTER E WITH MACRON + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0179' # 0xCA -> LATIN CAPITAL LETTER Z WITH ACUTE + '\u0116' # 0xCB -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\u0122' # 0xCC -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u0136' # 0xCD -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u012a' # 0xCE -> LATIN CAPITAL LETTER I WITH MACRON + '\u013b' # 0xCF -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u0160' # 0xD0 -> LATIN CAPITAL LETTER S WITH CARON + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0145' # 0xD2 -> LATIN CAPITAL LETTER N WITH CEDILLA + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\u014c' # 0xD4 -> LATIN CAPITAL LETTER O WITH MACRON + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0172' # 0xD8 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u0141' # 0xD9 -> LATIN CAPITAL LETTER L WITH STROKE + '\u015a' # 0xDA -> LATIN CAPITAL LETTER S WITH ACUTE + '\u016a' # 0xDB -> LATIN CAPITAL LETTER U WITH MACRON + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u017b' # 0xDD -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u017d' # 0xDE -> LATIN CAPITAL LETTER Z WITH CARON + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\u0105' # 0xE0 -> LATIN SMALL LETTER A WITH OGONEK + '\u012f' # 0xE1 -> LATIN SMALL LETTER I WITH OGONEK + '\u0101' # 0xE2 -> LATIN SMALL LETTER A WITH MACRON + '\u0107' # 0xE3 -> LATIN SMALL LETTER C WITH ACUTE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\u0119' # 0xE6 -> LATIN SMALL LETTER E WITH OGONEK + '\u0113' # 0xE7 -> LATIN SMALL LETTER E WITH MACRON + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u017a' # 0xEA -> LATIN SMALL LETTER Z WITH ACUTE + '\u0117' # 0xEB -> LATIN SMALL LETTER E WITH DOT ABOVE + '\u0123' # 0xEC -> LATIN SMALL LETTER G WITH CEDILLA + '\u0137' # 0xED -> LATIN SMALL LETTER K WITH CEDILLA + '\u012b' # 0xEE -> LATIN SMALL LETTER I WITH MACRON + '\u013c' # 0xEF -> LATIN SMALL LETTER L WITH CEDILLA + '\u0161' # 0xF0 -> LATIN SMALL LETTER S WITH CARON + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\u0146' # 0xF2 -> LATIN SMALL LETTER N WITH CEDILLA + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\u014d' # 0xF4 -> LATIN SMALL LETTER O WITH MACRON + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0173' # 0xF8 -> LATIN SMALL LETTER U WITH OGONEK + '\u0142' # 0xF9 -> LATIN SMALL LETTER L WITH STROKE + '\u015b' # 0xFA -> LATIN SMALL LETTER S WITH ACUTE + '\u016b' # 0xFB -> LATIN SMALL LETTER U WITH MACRON + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u017e' # 0xFE -> LATIN SMALL LETTER Z WITH CARON + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp1258.py b/venv/Lib/encodings/cp1258.py new file mode 100644 index 00000000..784378a8 --- /dev/null +++ b/venv/Lib/encodings/cp1258.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1258 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1258.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1258', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\ufffe' # 0x8A -> UNDEFINED + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u0300' # 0xCC -> COMBINING GRAVE ACCENT + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\u0309' # 0xD2 -> COMBINING HOOK ABOVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u01a0' # 0xD5 -> LATIN CAPITAL LETTER O WITH HORN + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u01af' # 0xDD -> LATIN CAPITAL LETTER U WITH HORN + '\u0303' # 0xDE -> COMBINING TILDE + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0301' # 0xEC -> COMBINING ACUTE ACCENT + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\u0323' # 0xF2 -> COMBINING DOT BELOW + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u01a1' # 0xF5 -> LATIN SMALL LETTER O WITH HORN + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u01b0' # 0xFD -> LATIN SMALL LETTER U WITH HORN + '\u20ab' # 0xFE -> DONG SIGN + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp273.py b/venv/Lib/encodings/cp273.py new file mode 100644 index 00000000..69c6d778 --- /dev/null +++ b/venv/Lib/encodings/cp273.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp273 generated from 'python-mappings/CP273.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp273', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL (NUL) + '\x01' # 0x01 -> START OF HEADING (SOH) + '\x02' # 0x02 -> START OF TEXT (STX) + '\x03' # 0x03 -> END OF TEXT (ETX) + '\x9c' # 0x04 -> STRING TERMINATOR (ST) + '\t' # 0x05 -> CHARACTER TABULATION (HT) + '\x86' # 0x06 -> START OF SELECTED AREA (SSA) + '\x7f' # 0x07 -> DELETE (DEL) + '\x97' # 0x08 -> END OF GUARDED AREA (EPA) + '\x8d' # 0x09 -> REVERSE LINE FEED (RI) + '\x8e' # 0x0A -> SINGLE-SHIFT TWO (SS2) + '\x0b' # 0x0B -> LINE TABULATION (VT) + '\x0c' # 0x0C -> FORM FEED (FF) + '\r' # 0x0D -> CARRIAGE RETURN (CR) + '\x0e' # 0x0E -> SHIFT OUT (SO) + '\x0f' # 0x0F -> SHIFT IN (SI) + '\x10' # 0x10 -> DATALINK ESCAPE (DLE) + '\x11' # 0x11 -> DEVICE CONTROL ONE (DC1) + '\x12' # 0x12 -> DEVICE CONTROL TWO (DC2) + '\x13' # 0x13 -> DEVICE CONTROL THREE (DC3) + '\x9d' # 0x14 -> OPERATING SYSTEM COMMAND (OSC) + '\x85' # 0x15 -> NEXT LINE (NEL) + '\x08' # 0x16 -> BACKSPACE (BS) + '\x87' # 0x17 -> END OF SELECTED AREA (ESA) + '\x18' # 0x18 -> CANCEL (CAN) + '\x19' # 0x19 -> END OF MEDIUM (EM) + '\x92' # 0x1A -> PRIVATE USE TWO (PU2) + '\x8f' # 0x1B -> SINGLE-SHIFT THREE (SS3) + '\x1c' # 0x1C -> FILE SEPARATOR (IS4) + '\x1d' # 0x1D -> GROUP SEPARATOR (IS3) + '\x1e' # 0x1E -> RECORD SEPARATOR (IS2) + '\x1f' # 0x1F -> UNIT SEPARATOR (IS1) + '\x80' # 0x20 -> PADDING CHARACTER (PAD) + '\x81' # 0x21 -> HIGH OCTET PRESET (HOP) + '\x82' # 0x22 -> BREAK PERMITTED HERE (BPH) + '\x83' # 0x23 -> NO BREAK HERE (NBH) + '\x84' # 0x24 -> INDEX (IND) + '\n' # 0x25 -> LINE FEED (LF) + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK (ETB) + '\x1b' # 0x27 -> ESCAPE (ESC) + '\x88' # 0x28 -> CHARACTER TABULATION SET (HTS) + '\x89' # 0x29 -> CHARACTER TABULATION WITH JUSTIFICATION (HTJ) + '\x8a' # 0x2A -> LINE TABULATION SET (VTS) + '\x8b' # 0x2B -> PARTIAL LINE FORWARD (PLD) + '\x8c' # 0x2C -> PARTIAL LINE BACKWARD (PLU) + '\x05' # 0x2D -> ENQUIRY (ENQ) + '\x06' # 0x2E -> ACKNOWLEDGE (ACK) + '\x07' # 0x2F -> BELL (BEL) + '\x90' # 0x30 -> DEVICE CONTROL STRING (DCS) + '\x91' # 0x31 -> PRIVATE USE ONE (PU1) + '\x16' # 0x32 -> SYNCHRONOUS IDLE (SYN) + '\x93' # 0x33 -> SET TRANSMIT STATE (STS) + '\x94' # 0x34 -> CANCEL CHARACTER (CCH) + '\x95' # 0x35 -> MESSAGE WAITING (MW) + '\x96' # 0x36 -> START OF GUARDED AREA (SPA) + '\x04' # 0x37 -> END OF TRANSMISSION (EOT) + '\x98' # 0x38 -> START OF STRING (SOS) + '\x99' # 0x39 -> SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI) + '\x9a' # 0x3A -> SINGLE CHARACTER INTRODUCER (SCI) + '\x9b' # 0x3B -> CONTROL SEQUENCE INTRODUCER (CSI) + '\x14' # 0x3C -> DEVICE CONTROL FOUR (DC4) + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE (NAK) + '\x9e' # 0x3E -> PRIVACY MESSAGE (PM) + '\x1a' # 0x3F -> SUBSTITUTE (SUB) + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '{' # 0x43 -> LEFT CURLY BRACKET + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '\xc4' # 0x4A -> LATIN CAPITAL LETTER A WITH DIAERESIS + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '!' # 0x4F -> EXCLAMATION MARK + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '~' # 0x59 -> TILDE + '\xdc' # 0x5A -> LATIN CAPITAL LETTER U WITH DIAERESIS + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '^' # 0x5F -> CIRCUMFLEX ACCENT + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '[' # 0x63 -> LEFT SQUARE BRACKET + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\xf6' # 0x6A -> LATIN SMALL LETTER O WITH DIAERESIS + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '\xa7' # 0x7C -> SECTION SIGN + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xf0' # 0x8C -> LATIN SMALL LETTER ETH (Icelandic) + '\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0x8E -> LATIN SMALL LETTER THORN (Icelandic) + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LETTER AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LETTER AE + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '\xdf' # 0xA1 -> LATIN SMALL LETTER SHARP S (German) + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + '\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (Icelandic) + '\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (Icelandic) + '\xae' # 0xAF -> REGISTERED SIGN + '\xa2' # 0xB0 -> CENT SIGN + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '@' # 0xB5 -> COMMERCIAL AT + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '\xac' # 0xBA -> NOT SIGN + '|' # 0xBB -> VERTICAL LINE + '\u203e' # 0xBC -> OVERLINE + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '\xe4' # 0xC0 -> LATIN SMALL LETTER A WITH DIAERESIS + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xa6' # 0xCC -> BROKEN BAR + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '\xfc' # 0xD0 -> LATIN SMALL LETTER U WITH DIAERESIS + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '}' # 0xDC -> RIGHT CURLY BRACKET + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0xE0 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\\' # 0xEC -> REVERSE SOLIDUS + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + ']' # 0xFC -> RIGHT SQUARE BRACKET + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> APPLICATION PROGRAM COMMAND (APC) +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp424.py b/venv/Lib/encodings/cp424.py new file mode 100644 index 00000000..6753daf1 --- /dev/null +++ b/venv/Lib/encodings/cp424.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp424 generated from 'MAPPINGS/VENDORS/MISC/CP424.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp424', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> SELECT + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> REQUIRED NEW LINE + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> GRAPHIC ESCAPE + '\x8d' # 0x09 -> SUPERSCRIPT + '\x8e' # 0x0A -> REPEAT + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> RESTORE/ENABLE PRESENTATION + '\x85' # 0x15 -> NEW LINE + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> PROGRAM OPERATOR COMMUNICATION + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> UNIT BACK SPACE + '\x8f' # 0x1B -> CUSTOMER USE ONE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> DIGIT SELECT + '\x81' # 0x21 -> START OF SIGNIFICANCE + '\x82' # 0x22 -> FIELD SEPARATOR + '\x83' # 0x23 -> WORD UNDERSCORE + '\x84' # 0x24 -> BYPASS OR INHIBIT PRESENTATION + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> SET ATTRIBUTE + '\x89' # 0x29 -> START FIELD EXTENDED + '\x8a' # 0x2A -> SET MODE OR SWITCH + '\x8b' # 0x2B -> CONTROL SEQUENCE PREFIX + '\x8c' # 0x2C -> MODIFY FIELD ATTRIBUTE + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> + '\x91' # 0x31 -> + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> INDEX RETURN + '\x94' # 0x34 -> PRESENTATION POSITION + '\x95' # 0x35 -> TRANSPARENT + '\x96' # 0x36 -> NUMERIC BACKSPACE + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> SUBSCRIPT + '\x99' # 0x39 -> INDENT TABULATION + '\x9a' # 0x3A -> REVERSE FORM FEED + '\x9b' # 0x3B -> CUSTOMER USE THREE + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\u05d0' # 0x41 -> HEBREW LETTER ALEF + '\u05d1' # 0x42 -> HEBREW LETTER BET + '\u05d2' # 0x43 -> HEBREW LETTER GIMEL + '\u05d3' # 0x44 -> HEBREW LETTER DALET + '\u05d4' # 0x45 -> HEBREW LETTER HE + '\u05d5' # 0x46 -> HEBREW LETTER VAV + '\u05d6' # 0x47 -> HEBREW LETTER ZAYIN + '\u05d7' # 0x48 -> HEBREW LETTER HET + '\u05d8' # 0x49 -> HEBREW LETTER TET + '\xa2' # 0x4A -> CENT SIGN + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '|' # 0x4F -> VERTICAL LINE + '&' # 0x50 -> AMPERSAND + '\u05d9' # 0x51 -> HEBREW LETTER YOD + '\u05da' # 0x52 -> HEBREW LETTER FINAL KAF + '\u05db' # 0x53 -> HEBREW LETTER KAF + '\u05dc' # 0x54 -> HEBREW LETTER LAMED + '\u05dd' # 0x55 -> HEBREW LETTER FINAL MEM + '\u05de' # 0x56 -> HEBREW LETTER MEM + '\u05df' # 0x57 -> HEBREW LETTER FINAL NUN + '\u05e0' # 0x58 -> HEBREW LETTER NUN + '\u05e1' # 0x59 -> HEBREW LETTER SAMEKH + '!' # 0x5A -> EXCLAMATION MARK + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '\xac' # 0x5F -> NOT SIGN + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\u05e2' # 0x62 -> HEBREW LETTER AYIN + '\u05e3' # 0x63 -> HEBREW LETTER FINAL PE + '\u05e4' # 0x64 -> HEBREW LETTER PE + '\u05e5' # 0x65 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0x66 -> HEBREW LETTER TSADI + '\u05e7' # 0x67 -> HEBREW LETTER QOF + '\u05e8' # 0x68 -> HEBREW LETTER RESH + '\u05e9' # 0x69 -> HEBREW LETTER SHIN + '\xa6' # 0x6A -> BROKEN BAR + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\ufffe' # 0x70 -> UNDEFINED + '\u05ea' # 0x71 -> HEBREW LETTER TAV + '\ufffe' # 0x72 -> UNDEFINED + '\ufffe' # 0x73 -> UNDEFINED + '\xa0' # 0x74 -> NO-BREAK SPACE + '\ufffe' # 0x75 -> UNDEFINED + '\ufffe' # 0x76 -> UNDEFINED + '\ufffe' # 0x77 -> UNDEFINED + '\u2017' # 0x78 -> DOUBLE LOW LINE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\ufffe' # 0x80 -> UNDEFINED + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\ufffe' # 0x8C -> UNDEFINED + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\ufffe' # 0x9A -> UNDEFINED + '\ufffe' # 0x9B -> UNDEFINED + '\ufffe' # 0x9C -> UNDEFINED + '\xb8' # 0x9D -> CEDILLA + '\ufffe' # 0x9E -> UNDEFINED + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\ufffe' # 0xAA -> UNDEFINED + '\ufffe' # 0xAB -> UNDEFINED + '\ufffe' # 0xAC -> UNDEFINED + '\ufffe' # 0xAD -> UNDEFINED + '\ufffe' # 0xAE -> UNDEFINED + '\xae' # 0xAF -> REGISTERED SIGN + '^' # 0xB0 -> CIRCUMFLEX ACCENT + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '[' # 0xBA -> LEFT SQUARE BRACKET + ']' # 0xBB -> RIGHT SQUARE BRACKET + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\ufffe' # 0xCB -> UNDEFINED + '\ufffe' # 0xCC -> UNDEFINED + '\ufffe' # 0xCD -> UNDEFINED + '\ufffe' # 0xCE -> UNDEFINED + '\ufffe' # 0xCF -> UNDEFINED + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\ufffe' # 0xDB -> UNDEFINED + '\ufffe' # 0xDC -> UNDEFINED + '\ufffe' # 0xDD -> UNDEFINED + '\ufffe' # 0xDE -> UNDEFINED + '\ufffe' # 0xDF -> UNDEFINED + '\\' # 0xE0 -> REVERSE SOLIDUS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\ufffe' # 0xEB -> UNDEFINED + '\ufffe' # 0xEC -> UNDEFINED + '\ufffe' # 0xED -> UNDEFINED + '\ufffe' # 0xEE -> UNDEFINED + '\ufffe' # 0xEF -> UNDEFINED + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\ufffe' # 0xFB -> UNDEFINED + '\ufffe' # 0xFC -> UNDEFINED + '\ufffe' # 0xFD -> UNDEFINED + '\ufffe' # 0xFE -> UNDEFINED + '\x9f' # 0xFF -> EIGHT ONES +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp437.py b/venv/Lib/encodings/cp437.py new file mode 100644 index 00000000..b6c75e2c --- /dev/null +++ b/venv/Lib/encodings/cp437.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec cp437 generated from 'VENDORS/MICSFT/PC/CP437.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp437', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00a5, # YEN SIGN + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xa2' # 0x009b -> CENT SIGN + '\xa3' # 0x009c -> POUND SIGN + '\xa5' # 0x009d -> YEN SIGN + '\u20a7' # 0x009e -> PESETA SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a5: 0x009d, # YEN SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp500.py b/venv/Lib/encodings/cp500.py new file mode 100644 index 00000000..5f61535f --- /dev/null +++ b/venv/Lib/encodings/cp500.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp500 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP500.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp500', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '[' # 0x4A -> LEFT SQUARE BRACKET + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '!' # 0x4F -> EXCLAMATION MARK + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + ']' # 0x5A -> RIGHT SQUARE BRACKET + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '^' # 0x5F -> CIRCUMFLEX ACCENT + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\xa6' # 0x6A -> BROKEN BAR + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + '\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + '\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + '\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + '\xae' # 0xAF -> REGISTERED SIGN + '\xa2' # 0xB0 -> CENT SIGN + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '\xac' # 0xBA -> NOT SIGN + '|' # 0xBB -> VERTICAL LINE + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\\' # 0xE0 -> REVERSE SOLIDUS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp65001.py b/venv/Lib/encodings/cp65001.py new file mode 100644 index 00000000..95cb2aec --- /dev/null +++ b/venv/Lib/encodings/cp65001.py @@ -0,0 +1,43 @@ +""" +Code page 65001: Windows UTF-8 (CP_UTF8). +""" + +import codecs +import functools + +if not hasattr(codecs, 'code_page_encode'): + raise LookupError("cp65001 encoding is only available on Windows") + +### Codec APIs + +encode = functools.partial(codecs.code_page_encode, 65001) +_decode = functools.partial(codecs.code_page_decode, 65001) + +def decode(input, errors='strict'): + return codecs.code_page_decode(65001, input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = _decode + +class StreamWriter(codecs.StreamWriter): + encode = encode + +class StreamReader(codecs.StreamReader): + decode = _decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp65001', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/cp720.py b/venv/Lib/encodings/cp720.py new file mode 100644 index 00000000..96d60961 --- /dev/null +++ b/venv/Lib/encodings/cp720.py @@ -0,0 +1,309 @@ +"""Python Character Mapping Codec cp720 generated on Windows: +Vista 6.0.6002 SP2 Multiprocessor Free with the command: + python Tools/unicode/genwincodec.py 720 +"""#" + + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp720', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\x80' + '\x81' + '\xe9' # 0x82 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x83 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\x84' + '\xe0' # 0x85 -> LATIN SMALL LETTER A WITH GRAVE + '\x86' + '\xe7' # 0x87 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x88 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x89 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x8A -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x8B -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x8C -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\x8d' + '\x8e' + '\x8f' + '\x90' + '\u0651' # 0x91 -> ARABIC SHADDA + '\u0652' # 0x92 -> ARABIC SUKUN + '\xf4' # 0x93 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xa4' # 0x94 -> CURRENCY SIGN + '\u0640' # 0x95 -> ARABIC TATWEEL + '\xfb' # 0x96 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x97 -> LATIN SMALL LETTER U WITH GRAVE + '\u0621' # 0x98 -> ARABIC LETTER HAMZA + '\u0622' # 0x99 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0x9A -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0x9B -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\xa3' # 0x9C -> POUND SIGN + '\u0625' # 0x9D -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0x9E -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0x9F -> ARABIC LETTER ALEF + '\u0628' # 0xA0 -> ARABIC LETTER BEH + '\u0629' # 0xA1 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0xA2 -> ARABIC LETTER TEH + '\u062b' # 0xA3 -> ARABIC LETTER THEH + '\u062c' # 0xA4 -> ARABIC LETTER JEEM + '\u062d' # 0xA5 -> ARABIC LETTER HAH + '\u062e' # 0xA6 -> ARABIC LETTER KHAH + '\u062f' # 0xA7 -> ARABIC LETTER DAL + '\u0630' # 0xA8 -> ARABIC LETTER THAL + '\u0631' # 0xA9 -> ARABIC LETTER REH + '\u0632' # 0xAA -> ARABIC LETTER ZAIN + '\u0633' # 0xAB -> ARABIC LETTER SEEN + '\u0634' # 0xAC -> ARABIC LETTER SHEEN + '\u0635' # 0xAD -> ARABIC LETTER SAD + '\xab' # 0xAE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xAF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0xB0 -> LIGHT SHADE + '\u2592' # 0xB1 -> MEDIUM SHADE + '\u2593' # 0xB2 -> DARK SHADE + '\u2502' # 0xB3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0xB4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0xB5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0xB6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0xB7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0xB8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0xB9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0xBA -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0xBB -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0xBC -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0xBD -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0xBE -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0xBF -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0xC0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0xC1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0xC2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0xC3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0xC4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0xC5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0xC6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0xC7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0xC8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0xC9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0xCA -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0xCB -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0xCC -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0xCD -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0xCE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0xCF -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0xD0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0xD1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0xD2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0xD3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0xD4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0xD5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0xD6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0xD7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0xD8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0xD9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0xDA -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0xDB -> FULL BLOCK + '\u2584' # 0xDC -> LOWER HALF BLOCK + '\u258c' # 0xDD -> LEFT HALF BLOCK + '\u2590' # 0xDE -> RIGHT HALF BLOCK + '\u2580' # 0xDF -> UPPER HALF BLOCK + '\u0636' # 0xE0 -> ARABIC LETTER DAD + '\u0637' # 0xE1 -> ARABIC LETTER TAH + '\u0638' # 0xE2 -> ARABIC LETTER ZAH + '\u0639' # 0xE3 -> ARABIC LETTER AIN + '\u063a' # 0xE4 -> ARABIC LETTER GHAIN + '\u0641' # 0xE5 -> ARABIC LETTER FEH + '\xb5' # 0xE6 -> MICRO SIGN + '\u0642' # 0xE7 -> ARABIC LETTER QAF + '\u0643' # 0xE8 -> ARABIC LETTER KAF + '\u0644' # 0xE9 -> ARABIC LETTER LAM + '\u0645' # 0xEA -> ARABIC LETTER MEEM + '\u0646' # 0xEB -> ARABIC LETTER NOON + '\u0647' # 0xEC -> ARABIC LETTER HEH + '\u0648' # 0xED -> ARABIC LETTER WAW + '\u0649' # 0xEE -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0xEF -> ARABIC LETTER YEH + '\u2261' # 0xF0 -> IDENTICAL TO + '\u064b' # 0xF1 -> ARABIC FATHATAN + '\u064c' # 0xF2 -> ARABIC DAMMATAN + '\u064d' # 0xF3 -> ARABIC KASRATAN + '\u064e' # 0xF4 -> ARABIC FATHA + '\u064f' # 0xF5 -> ARABIC DAMMA + '\u0650' # 0xF6 -> ARABIC KASRA + '\u2248' # 0xF7 -> ALMOST EQUAL TO + '\xb0' # 0xF8 -> DEGREE SIGN + '\u2219' # 0xF9 -> BULLET OPERATOR + '\xb7' # 0xFA -> MIDDLE DOT + '\u221a' # 0xFB -> SQUARE ROOT + '\u207f' # 0xFC -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0xFD -> SUPERSCRIPT TWO + '\u25a0' # 0xFE -> BLACK SQUARE + '\xa0' # 0xFF -> NO-BREAK SPACE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp737.py b/venv/Lib/encodings/cp737.py new file mode 100644 index 00000000..9685bae7 --- /dev/null +++ b/venv/Lib/encodings/cp737.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec cp737 generated from 'VENDORS/MICSFT/PC/CP737.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp737', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x0081: 0x0392, # GREEK CAPITAL LETTER BETA + 0x0082: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x0083: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x0084: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x0085: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x0086: 0x0397, # GREEK CAPITAL LETTER ETA + 0x0087: 0x0398, # GREEK CAPITAL LETTER THETA + 0x0088: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x0089: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x008a: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x008b: 0x039c, # GREEK CAPITAL LETTER MU + 0x008c: 0x039d, # GREEK CAPITAL LETTER NU + 0x008d: 0x039e, # GREEK CAPITAL LETTER XI + 0x008e: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x008f: 0x03a0, # GREEK CAPITAL LETTER PI + 0x0090: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x0091: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x0092: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x0093: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x0094: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x0095: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x0096: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x0097: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x0098: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x0099: 0x03b2, # GREEK SMALL LETTER BETA + 0x009a: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x009b: 0x03b4, # GREEK SMALL LETTER DELTA + 0x009c: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x009d: 0x03b6, # GREEK SMALL LETTER ZETA + 0x009e: 0x03b7, # GREEK SMALL LETTER ETA + 0x009f: 0x03b8, # GREEK SMALL LETTER THETA + 0x00a0: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00a1: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00a2: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x00a3: 0x03bc, # GREEK SMALL LETTER MU + 0x00a4: 0x03bd, # GREEK SMALL LETTER NU + 0x00a5: 0x03be, # GREEK SMALL LETTER XI + 0x00a6: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00a7: 0x03c0, # GREEK SMALL LETTER PI + 0x00a8: 0x03c1, # GREEK SMALL LETTER RHO + 0x00a9: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00aa: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00ab: 0x03c4, # GREEK SMALL LETTER TAU + 0x00ac: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00ad: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ae: 0x03c7, # GREEK SMALL LETTER CHI + 0x00af: 0x03c8, # GREEK SMALL LETTER PSI + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00e1: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x00e2: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x00e3: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x00e4: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00e5: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00e6: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00e7: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00e8: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00e9: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00ea: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x00eb: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x00ec: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x00ed: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x00ee: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x00ef: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x00f0: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x00f5: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0391' # 0x0080 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0x0081 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0x0082 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0x0083 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0x0084 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0x0085 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0x0086 -> GREEK CAPITAL LETTER ETA + '\u0398' # 0x0087 -> GREEK CAPITAL LETTER THETA + '\u0399' # 0x0088 -> GREEK CAPITAL LETTER IOTA + '\u039a' # 0x0089 -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0x008a -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0x008b -> GREEK CAPITAL LETTER MU + '\u039d' # 0x008c -> GREEK CAPITAL LETTER NU + '\u039e' # 0x008d -> GREEK CAPITAL LETTER XI + '\u039f' # 0x008e -> GREEK CAPITAL LETTER OMICRON + '\u03a0' # 0x008f -> GREEK CAPITAL LETTER PI + '\u03a1' # 0x0090 -> GREEK CAPITAL LETTER RHO + '\u03a3' # 0x0091 -> GREEK CAPITAL LETTER SIGMA + '\u03a4' # 0x0092 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0x0093 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0x0094 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0x0095 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0x0096 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0x0097 -> GREEK CAPITAL LETTER OMEGA + '\u03b1' # 0x0098 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0x0099 -> GREEK SMALL LETTER BETA + '\u03b3' # 0x009a -> GREEK SMALL LETTER GAMMA + '\u03b4' # 0x009b -> GREEK SMALL LETTER DELTA + '\u03b5' # 0x009c -> GREEK SMALL LETTER EPSILON + '\u03b6' # 0x009d -> GREEK SMALL LETTER ZETA + '\u03b7' # 0x009e -> GREEK SMALL LETTER ETA + '\u03b8' # 0x009f -> GREEK SMALL LETTER THETA + '\u03b9' # 0x00a0 -> GREEK SMALL LETTER IOTA + '\u03ba' # 0x00a1 -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0x00a2 -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0x00a3 -> GREEK SMALL LETTER MU + '\u03bd' # 0x00a4 -> GREEK SMALL LETTER NU + '\u03be' # 0x00a5 -> GREEK SMALL LETTER XI + '\u03bf' # 0x00a6 -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0x00a7 -> GREEK SMALL LETTER PI + '\u03c1' # 0x00a8 -> GREEK SMALL LETTER RHO + '\u03c3' # 0x00a9 -> GREEK SMALL LETTER SIGMA + '\u03c2' # 0x00aa -> GREEK SMALL LETTER FINAL SIGMA + '\u03c4' # 0x00ab -> GREEK SMALL LETTER TAU + '\u03c5' # 0x00ac -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0x00ad -> GREEK SMALL LETTER PHI + '\u03c7' # 0x00ae -> GREEK SMALL LETTER CHI + '\u03c8' # 0x00af -> GREEK SMALL LETTER PSI + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03c9' # 0x00e0 -> GREEK SMALL LETTER OMEGA + '\u03ac' # 0x00e1 -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u03ad' # 0x00e2 -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0x00e3 -> GREEK SMALL LETTER ETA WITH TONOS + '\u03ca' # 0x00e4 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03af' # 0x00e5 -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03cc' # 0x00e6 -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0x00e7 -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03cb' # 0x00e8 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03ce' # 0x00e9 -> GREEK SMALL LETTER OMEGA WITH TONOS + '\u0386' # 0x00ea -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\u0388' # 0x00eb -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0389' # 0x00ec -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0x00ed -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\u038c' # 0x00ee -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\u038e' # 0x00ef -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u038f' # 0x00f0 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u03aa' # 0x00f4 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u03ab' # 0x00f5 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00f7: 0x00f6, # DIVISION SIGN + 0x0386: 0x00ea, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0388: 0x00eb, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0x00ec, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038a: 0x00ed, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038c: 0x00ee, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038e: 0x00ef, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038f: 0x00f0, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0391: 0x0080, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0x0081, # GREEK CAPITAL LETTER BETA + 0x0393: 0x0082, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0x0083, # GREEK CAPITAL LETTER DELTA + 0x0395: 0x0084, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0x0085, # GREEK CAPITAL LETTER ZETA + 0x0397: 0x0086, # GREEK CAPITAL LETTER ETA + 0x0398: 0x0087, # GREEK CAPITAL LETTER THETA + 0x0399: 0x0088, # GREEK CAPITAL LETTER IOTA + 0x039a: 0x0089, # GREEK CAPITAL LETTER KAPPA + 0x039b: 0x008a, # GREEK CAPITAL LETTER LAMDA + 0x039c: 0x008b, # GREEK CAPITAL LETTER MU + 0x039d: 0x008c, # GREEK CAPITAL LETTER NU + 0x039e: 0x008d, # GREEK CAPITAL LETTER XI + 0x039f: 0x008e, # GREEK CAPITAL LETTER OMICRON + 0x03a0: 0x008f, # GREEK CAPITAL LETTER PI + 0x03a1: 0x0090, # GREEK CAPITAL LETTER RHO + 0x03a3: 0x0091, # GREEK CAPITAL LETTER SIGMA + 0x03a4: 0x0092, # GREEK CAPITAL LETTER TAU + 0x03a5: 0x0093, # GREEK CAPITAL LETTER UPSILON + 0x03a6: 0x0094, # GREEK CAPITAL LETTER PHI + 0x03a7: 0x0095, # GREEK CAPITAL LETTER CHI + 0x03a8: 0x0096, # GREEK CAPITAL LETTER PSI + 0x03a9: 0x0097, # GREEK CAPITAL LETTER OMEGA + 0x03aa: 0x00f4, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03ab: 0x00f5, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03ac: 0x00e1, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03ad: 0x00e2, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03ae: 0x00e3, # GREEK SMALL LETTER ETA WITH TONOS + 0x03af: 0x00e5, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03b1: 0x0098, # GREEK SMALL LETTER ALPHA + 0x03b2: 0x0099, # GREEK SMALL LETTER BETA + 0x03b3: 0x009a, # GREEK SMALL LETTER GAMMA + 0x03b4: 0x009b, # GREEK SMALL LETTER DELTA + 0x03b5: 0x009c, # GREEK SMALL LETTER EPSILON + 0x03b6: 0x009d, # GREEK SMALL LETTER ZETA + 0x03b7: 0x009e, # GREEK SMALL LETTER ETA + 0x03b8: 0x009f, # GREEK SMALL LETTER THETA + 0x03b9: 0x00a0, # GREEK SMALL LETTER IOTA + 0x03ba: 0x00a1, # GREEK SMALL LETTER KAPPA + 0x03bb: 0x00a2, # GREEK SMALL LETTER LAMDA + 0x03bc: 0x00a3, # GREEK SMALL LETTER MU + 0x03bd: 0x00a4, # GREEK SMALL LETTER NU + 0x03be: 0x00a5, # GREEK SMALL LETTER XI + 0x03bf: 0x00a6, # GREEK SMALL LETTER OMICRON + 0x03c0: 0x00a7, # GREEK SMALL LETTER PI + 0x03c1: 0x00a8, # GREEK SMALL LETTER RHO + 0x03c2: 0x00aa, # GREEK SMALL LETTER FINAL SIGMA + 0x03c3: 0x00a9, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00ab, # GREEK SMALL LETTER TAU + 0x03c5: 0x00ac, # GREEK SMALL LETTER UPSILON + 0x03c6: 0x00ad, # GREEK SMALL LETTER PHI + 0x03c7: 0x00ae, # GREEK SMALL LETTER CHI + 0x03c8: 0x00af, # GREEK SMALL LETTER PSI + 0x03c9: 0x00e0, # GREEK SMALL LETTER OMEGA + 0x03ca: 0x00e4, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03cb: 0x00e8, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03cc: 0x00e6, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03cd: 0x00e7, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03ce: 0x00e9, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp775.py b/venv/Lib/encodings/cp775.py new file mode 100644 index 00000000..fe06e7bc --- /dev/null +++ b/venv/Lib/encodings/cp775.py @@ -0,0 +1,697 @@ +""" Python Character Mapping Codec cp775 generated from 'VENDORS/MICSFT/PC/CP775.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp775', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x0101, # LATIN SMALL LETTER A WITH MACRON + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x0123, # LATIN SMALL LETTER G WITH CEDILLA + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x0088: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x0089: 0x0113, # LATIN SMALL LETTER E WITH MACRON + 0x008a: 0x0156, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x008b: 0x0157, # LATIN SMALL LETTER R WITH CEDILLA + 0x008c: 0x012b, # LATIN SMALL LETTER I WITH MACRON + 0x008d: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x014d, # LATIN SMALL LETTER O WITH MACRON + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x0122, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0096: 0x00a2, # CENT SIGN + 0x0097: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x0098: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x00a4, # CURRENCY SIGN + 0x00a0: 0x0100, # LATIN CAPITAL LETTER A WITH MACRON + 0x00a1: 0x012a, # LATIN CAPITAL LETTER I WITH MACRON + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00a4: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00a5: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00a6: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x00a7: 0x00a6, # BROKEN BAR + 0x00a8: 0x00a9, # COPYRIGHT SIGN + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00b6: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00b7: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00b8: 0x0116, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x012e, # LATIN CAPITAL LETTER I WITH OGONEK + 0x00be: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x0172, # LATIN CAPITAL LETTER U WITH OGONEK + 0x00c7: 0x016a, # LATIN CAPITAL LETTER U WITH MACRON + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00d0: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00d1: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00d2: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00d3: 0x0117, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x00d4: 0x012f, # LATIN SMALL LETTER I WITH OGONEK + 0x00d5: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00d6: 0x0173, # LATIN SMALL LETTER U WITH OGONEK + 0x00d7: 0x016b, # LATIN SMALL LETTER U WITH MACRON + 0x00d8: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e2: 0x014c, # LATIN CAPITAL LETTER O WITH MACRON + 0x00e3: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00e8: 0x0136, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x00e9: 0x0137, # LATIN SMALL LETTER K WITH CEDILLA + 0x00ea: 0x013b, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x00eb: 0x013c, # LATIN SMALL LETTER L WITH CEDILLA + 0x00ec: 0x0146, # LATIN SMALL LETTER N WITH CEDILLA + 0x00ed: 0x0112, # LATIN CAPITAL LETTER E WITH MACRON + 0x00ee: 0x0145, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x00ef: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0106' # 0x0080 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\u0101' # 0x0083 -> LATIN SMALL LETTER A WITH MACRON + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u0123' # 0x0085 -> LATIN SMALL LETTER G WITH CEDILLA + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\u0107' # 0x0087 -> LATIN SMALL LETTER C WITH ACUTE + '\u0142' # 0x0088 -> LATIN SMALL LETTER L WITH STROKE + '\u0113' # 0x0089 -> LATIN SMALL LETTER E WITH MACRON + '\u0156' # 0x008a -> LATIN CAPITAL LETTER R WITH CEDILLA + '\u0157' # 0x008b -> LATIN SMALL LETTER R WITH CEDILLA + '\u012b' # 0x008c -> LATIN SMALL LETTER I WITH MACRON + '\u0179' # 0x008d -> LATIN CAPITAL LETTER Z WITH ACUTE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\u014d' # 0x0093 -> LATIN SMALL LETTER O WITH MACRON + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u0122' # 0x0095 -> LATIN CAPITAL LETTER G WITH CEDILLA + '\xa2' # 0x0096 -> CENT SIGN + '\u015a' # 0x0097 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u015b' # 0x0098 -> LATIN SMALL LETTER S WITH ACUTE + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\xd7' # 0x009e -> MULTIPLICATION SIGN + '\xa4' # 0x009f -> CURRENCY SIGN + '\u0100' # 0x00a0 -> LATIN CAPITAL LETTER A WITH MACRON + '\u012a' # 0x00a1 -> LATIN CAPITAL LETTER I WITH MACRON + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\u017b' # 0x00a3 -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u017c' # 0x00a4 -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u017a' # 0x00a5 -> LATIN SMALL LETTER Z WITH ACUTE + '\u201d' # 0x00a6 -> RIGHT DOUBLE QUOTATION MARK + '\xa6' # 0x00a7 -> BROKEN BAR + '\xa9' # 0x00a8 -> COPYRIGHT SIGN + '\xae' # 0x00a9 -> REGISTERED SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\u0141' # 0x00ad -> LATIN CAPITAL LETTER L WITH STROKE + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u0104' # 0x00b5 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u010c' # 0x00b6 -> LATIN CAPITAL LETTER C WITH CARON + '\u0118' # 0x00b7 -> LATIN CAPITAL LETTER E WITH OGONEK + '\u0116' # 0x00b8 -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u012e' # 0x00bd -> LATIN CAPITAL LETTER I WITH OGONEK + '\u0160' # 0x00be -> LATIN CAPITAL LETTER S WITH CARON + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u0172' # 0x00c6 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u016a' # 0x00c7 -> LATIN CAPITAL LETTER U WITH MACRON + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u017d' # 0x00cf -> LATIN CAPITAL LETTER Z WITH CARON + '\u0105' # 0x00d0 -> LATIN SMALL LETTER A WITH OGONEK + '\u010d' # 0x00d1 -> LATIN SMALL LETTER C WITH CARON + '\u0119' # 0x00d2 -> LATIN SMALL LETTER E WITH OGONEK + '\u0117' # 0x00d3 -> LATIN SMALL LETTER E WITH DOT ABOVE + '\u012f' # 0x00d4 -> LATIN SMALL LETTER I WITH OGONEK + '\u0161' # 0x00d5 -> LATIN SMALL LETTER S WITH CARON + '\u0173' # 0x00d6 -> LATIN SMALL LETTER U WITH OGONEK + '\u016b' # 0x00d7 -> LATIN SMALL LETTER U WITH MACRON + '\u017e' # 0x00d8 -> LATIN SMALL LETTER Z WITH CARON + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S (GERMAN) + '\u014c' # 0x00e2 -> LATIN CAPITAL LETTER O WITH MACRON + '\u0143' # 0x00e3 -> LATIN CAPITAL LETTER N WITH ACUTE + '\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + '\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xb5' # 0x00e6 -> MICRO SIGN + '\u0144' # 0x00e7 -> LATIN SMALL LETTER N WITH ACUTE + '\u0136' # 0x00e8 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u0137' # 0x00e9 -> LATIN SMALL LETTER K WITH CEDILLA + '\u013b' # 0x00ea -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u013c' # 0x00eb -> LATIN SMALL LETTER L WITH CEDILLA + '\u0146' # 0x00ec -> LATIN SMALL LETTER N WITH CEDILLA + '\u0112' # 0x00ed -> LATIN CAPITAL LETTER E WITH MACRON + '\u0145' # 0x00ee -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u2019' # 0x00ef -> RIGHT SINGLE QUOTATION MARK + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u201c' # 0x00f2 -> LEFT DOUBLE QUOTATION MARK + '\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0x00f4 -> PILCROW SIGN + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u201e' # 0x00f7 -> DOUBLE LOW-9 QUOTATION MARK + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\xb9' # 0x00fb -> SUPERSCRIPT ONE + '\xb3' # 0x00fc -> SUPERSCRIPT THREE + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a2: 0x0096, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x009f, # CURRENCY SIGN + 0x00a6: 0x00a7, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a9: 0x00a8, # COPYRIGHT SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0100: 0x00a0, # LATIN CAPITAL LETTER A WITH MACRON + 0x0101: 0x0083, # LATIN SMALL LETTER A WITH MACRON + 0x0104: 0x00b5, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0x00d0, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0x0080, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0x0087, # LATIN SMALL LETTER C WITH ACUTE + 0x010c: 0x00b6, # LATIN CAPITAL LETTER C WITH CARON + 0x010d: 0x00d1, # LATIN SMALL LETTER C WITH CARON + 0x0112: 0x00ed, # LATIN CAPITAL LETTER E WITH MACRON + 0x0113: 0x0089, # LATIN SMALL LETTER E WITH MACRON + 0x0116: 0x00b8, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x0117: 0x00d3, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x0118: 0x00b7, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0x00d2, # LATIN SMALL LETTER E WITH OGONEK + 0x0122: 0x0095, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0123: 0x0085, # LATIN SMALL LETTER G WITH CEDILLA + 0x012a: 0x00a1, # LATIN CAPITAL LETTER I WITH MACRON + 0x012b: 0x008c, # LATIN SMALL LETTER I WITH MACRON + 0x012e: 0x00bd, # LATIN CAPITAL LETTER I WITH OGONEK + 0x012f: 0x00d4, # LATIN SMALL LETTER I WITH OGONEK + 0x0136: 0x00e8, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x0137: 0x00e9, # LATIN SMALL LETTER K WITH CEDILLA + 0x013b: 0x00ea, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x013c: 0x00eb, # LATIN SMALL LETTER L WITH CEDILLA + 0x0141: 0x00ad, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0x0088, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0x00e3, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0x00e7, # LATIN SMALL LETTER N WITH ACUTE + 0x0145: 0x00ee, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x0146: 0x00ec, # LATIN SMALL LETTER N WITH CEDILLA + 0x014c: 0x00e2, # LATIN CAPITAL LETTER O WITH MACRON + 0x014d: 0x0093, # LATIN SMALL LETTER O WITH MACRON + 0x0156: 0x008a, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x0157: 0x008b, # LATIN SMALL LETTER R WITH CEDILLA + 0x015a: 0x0097, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015b: 0x0098, # LATIN SMALL LETTER S WITH ACUTE + 0x0160: 0x00be, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0x00d5, # LATIN SMALL LETTER S WITH CARON + 0x016a: 0x00c7, # LATIN CAPITAL LETTER U WITH MACRON + 0x016b: 0x00d7, # LATIN SMALL LETTER U WITH MACRON + 0x0172: 0x00c6, # LATIN CAPITAL LETTER U WITH OGONEK + 0x0173: 0x00d6, # LATIN SMALL LETTER U WITH OGONEK + 0x0179: 0x008d, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017a: 0x00a5, # LATIN SMALL LETTER Z WITH ACUTE + 0x017b: 0x00a3, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017c: 0x00a4, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017d: 0x00cf, # LATIN CAPITAL LETTER Z WITH CARON + 0x017e: 0x00d8, # LATIN SMALL LETTER Z WITH CARON + 0x2019: 0x00ef, # RIGHT SINGLE QUOTATION MARK + 0x201c: 0x00f2, # LEFT DOUBLE QUOTATION MARK + 0x201d: 0x00a6, # RIGHT DOUBLE QUOTATION MARK + 0x201e: 0x00f7, # DOUBLE LOW-9 QUOTATION MARK + 0x2219: 0x00f9, # BULLET OPERATOR + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp850.py b/venv/Lib/encodings/cp850.py new file mode 100644 index 00000000..f98aef99 --- /dev/null +++ b/venv/Lib/encodings/cp850.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP850.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp850', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00f0, # LATIN SMALL LETTER ETH + 0x00d1: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x00fe, # LATIN SMALL LETTER THORN + 0x00e8: 0x00de, # LATIN CAPITAL LETTER THORN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2017, # DOUBLE LOW LINE + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\xd7' # 0x009e -> MULTIPLICATION SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\xae' # 0x00a9 -> REGISTERED SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xa9' # 0x00b8 -> COPYRIGHT SIGN + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\xa2' # 0x00bd -> CENT SIGN + '\xa5' # 0x00be -> YEN SIGN + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + '\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\xf0' # 0x00d0 -> LATIN SMALL LETTER ETH + '\xd0' # 0x00d1 -> LATIN CAPITAL LETTER ETH + '\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + '\u0131' # 0x00d5 -> LATIN SMALL LETTER DOTLESS I + '\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\xa6' # 0x00dd -> BROKEN BAR + '\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + '\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xb5' # 0x00e6 -> MICRO SIGN + '\xfe' # 0x00e7 -> LATIN SMALL LETTER THORN + '\xde' # 0x00e8 -> LATIN CAPITAL LETTER THORN + '\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + '\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + '\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xaf' # 0x00ee -> MACRON + '\xb4' # 0x00ef -> ACUTE ACCENT + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2017' # 0x00f2 -> DOUBLE LOW LINE + '\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0x00f4 -> PILCROW SIGN + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\xb8' # 0x00f7 -> CEDILLA + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\xb7' # 0x00fa -> MIDDLE DOT + '\xb9' # 0x00fb -> SUPERSCRIPT ONE + '\xb3' # 0x00fc -> SUPERSCRIPT THREE + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d0: 0x00d1, # LATIN CAPITAL LETTER ETH + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x00e8, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f0: 0x00d0, # LATIN SMALL LETTER ETH + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x00e7, # LATIN SMALL LETTER THORN + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0131: 0x00d5, # LATIN SMALL LETTER DOTLESS I + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x2017: 0x00f2, # DOUBLE LOW LINE + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp852.py b/venv/Lib/encodings/cp852.py new file mode 100644 index 00000000..34d8a0ea --- /dev/null +++ b/venv/Lib/encodings/cp852.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP852.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp852', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x016f, # LATIN SMALL LETTER U WITH RING ABOVE + 0x0086: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x0150, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x008b: 0x0151, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x0139, # LATIN CAPITAL LETTER L WITH ACUTE + 0x0092: 0x013a, # LATIN SMALL LETTER L WITH ACUTE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x013d, # LATIN CAPITAL LETTER L WITH CARON + 0x0096: 0x013e, # LATIN SMALL LETTER L WITH CARON + 0x0097: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x0098: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x0164, # LATIN CAPITAL LETTER T WITH CARON + 0x009c: 0x0165, # LATIN SMALL LETTER T WITH CARON + 0x009d: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00a5: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00a6: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00a7: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00a8: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00a9: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00ac: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00ad: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x011a, # LATIN CAPITAL LETTER E WITH CARON + 0x00b8: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00be: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x0102, # LATIN CAPITAL LETTER A WITH BREVE + 0x00c7: 0x0103, # LATIN SMALL LETTER A WITH BREVE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x0111, # LATIN SMALL LETTER D WITH STROKE + 0x00d1: 0x0110, # LATIN CAPITAL LETTER D WITH STROKE + 0x00d2: 0x010e, # LATIN CAPITAL LETTER D WITH CARON + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x010f, # LATIN SMALL LETTER D WITH CARON + 0x00d5: 0x0147, # LATIN CAPITAL LETTER N WITH CARON + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x011b, # LATIN SMALL LETTER E WITH CARON + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x0162, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x00de: 0x016e, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00e4: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00e5: 0x0148, # LATIN SMALL LETTER N WITH CARON + 0x00e6: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00e7: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00e8: 0x0154, # LATIN CAPITAL LETTER R WITH ACUTE + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x0155, # LATIN SMALL LETTER R WITH ACUTE + 0x00eb: 0x0170, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x0163, # LATIN SMALL LETTER T WITH CEDILLA + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x02dd, # DOUBLE ACUTE ACCENT + 0x00f2: 0x02db, # OGONEK + 0x00f3: 0x02c7, # CARON + 0x00f4: 0x02d8, # BREVE + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x02d9, # DOT ABOVE + 0x00fb: 0x0171, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x00fc: 0x0158, # LATIN CAPITAL LETTER R WITH CARON + 0x00fd: 0x0159, # LATIN SMALL LETTER R WITH CARON + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u016f' # 0x0085 -> LATIN SMALL LETTER U WITH RING ABOVE + '\u0107' # 0x0086 -> LATIN SMALL LETTER C WITH ACUTE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\u0142' # 0x0088 -> LATIN SMALL LETTER L WITH STROKE + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0150' # 0x008a -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\u0151' # 0x008b -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u0179' # 0x008d -> LATIN CAPITAL LETTER Z WITH ACUTE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0106' # 0x008f -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0139' # 0x0091 -> LATIN CAPITAL LETTER L WITH ACUTE + '\u013a' # 0x0092 -> LATIN SMALL LETTER L WITH ACUTE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u013d' # 0x0095 -> LATIN CAPITAL LETTER L WITH CARON + '\u013e' # 0x0096 -> LATIN SMALL LETTER L WITH CARON + '\u015a' # 0x0097 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u015b' # 0x0098 -> LATIN SMALL LETTER S WITH ACUTE + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0164' # 0x009b -> LATIN CAPITAL LETTER T WITH CARON + '\u0165' # 0x009c -> LATIN SMALL LETTER T WITH CARON + '\u0141' # 0x009d -> LATIN CAPITAL LETTER L WITH STROKE + '\xd7' # 0x009e -> MULTIPLICATION SIGN + '\u010d' # 0x009f -> LATIN SMALL LETTER C WITH CARON + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\u0104' # 0x00a4 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u0105' # 0x00a5 -> LATIN SMALL LETTER A WITH OGONEK + '\u017d' # 0x00a6 -> LATIN CAPITAL LETTER Z WITH CARON + '\u017e' # 0x00a7 -> LATIN SMALL LETTER Z WITH CARON + '\u0118' # 0x00a8 -> LATIN CAPITAL LETTER E WITH OGONEK + '\u0119' # 0x00a9 -> LATIN SMALL LETTER E WITH OGONEK + '\xac' # 0x00aa -> NOT SIGN + '\u017a' # 0x00ab -> LATIN SMALL LETTER Z WITH ACUTE + '\u010c' # 0x00ac -> LATIN CAPITAL LETTER C WITH CARON + '\u015f' # 0x00ad -> LATIN SMALL LETTER S WITH CEDILLA + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u011a' # 0x00b7 -> LATIN CAPITAL LETTER E WITH CARON + '\u015e' # 0x00b8 -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u017b' # 0x00bd -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u017c' # 0x00be -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u0102' # 0x00c6 -> LATIN CAPITAL LETTER A WITH BREVE + '\u0103' # 0x00c7 -> LATIN SMALL LETTER A WITH BREVE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\u0111' # 0x00d0 -> LATIN SMALL LETTER D WITH STROKE + '\u0110' # 0x00d1 -> LATIN CAPITAL LETTER D WITH STROKE + '\u010e' # 0x00d2 -> LATIN CAPITAL LETTER D WITH CARON + '\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u010f' # 0x00d4 -> LATIN SMALL LETTER D WITH CARON + '\u0147' # 0x00d5 -> LATIN CAPITAL LETTER N WITH CARON + '\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u011b' # 0x00d8 -> LATIN SMALL LETTER E WITH CARON + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u0162' # 0x00dd -> LATIN CAPITAL LETTER T WITH CEDILLA + '\u016e' # 0x00de -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0143' # 0x00e3 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0144' # 0x00e4 -> LATIN SMALL LETTER N WITH ACUTE + '\u0148' # 0x00e5 -> LATIN SMALL LETTER N WITH CARON + '\u0160' # 0x00e6 -> LATIN CAPITAL LETTER S WITH CARON + '\u0161' # 0x00e7 -> LATIN SMALL LETTER S WITH CARON + '\u0154' # 0x00e8 -> LATIN CAPITAL LETTER R WITH ACUTE + '\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + '\u0155' # 0x00ea -> LATIN SMALL LETTER R WITH ACUTE + '\u0170' # 0x00eb -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + '\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + '\u0163' # 0x00ee -> LATIN SMALL LETTER T WITH CEDILLA + '\xb4' # 0x00ef -> ACUTE ACCENT + '\xad' # 0x00f0 -> SOFT HYPHEN + '\u02dd' # 0x00f1 -> DOUBLE ACUTE ACCENT + '\u02db' # 0x00f2 -> OGONEK + '\u02c7' # 0x00f3 -> CARON + '\u02d8' # 0x00f4 -> BREVE + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\xb8' # 0x00f7 -> CEDILLA + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\u02d9' # 0x00fa -> DOT ABOVE + '\u0171' # 0x00fb -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\u0158' # 0x00fc -> LATIN CAPITAL LETTER R WITH CARON + '\u0159' # 0x00fd -> LATIN SMALL LETTER R WITH CARON + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b8: 0x00f7, # CEDILLA + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x0102: 0x00c6, # LATIN CAPITAL LETTER A WITH BREVE + 0x0103: 0x00c7, # LATIN SMALL LETTER A WITH BREVE + 0x0104: 0x00a4, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0x00a5, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0x008f, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0x0086, # LATIN SMALL LETTER C WITH ACUTE + 0x010c: 0x00ac, # LATIN CAPITAL LETTER C WITH CARON + 0x010d: 0x009f, # LATIN SMALL LETTER C WITH CARON + 0x010e: 0x00d2, # LATIN CAPITAL LETTER D WITH CARON + 0x010f: 0x00d4, # LATIN SMALL LETTER D WITH CARON + 0x0110: 0x00d1, # LATIN CAPITAL LETTER D WITH STROKE + 0x0111: 0x00d0, # LATIN SMALL LETTER D WITH STROKE + 0x0118: 0x00a8, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0x00a9, # LATIN SMALL LETTER E WITH OGONEK + 0x011a: 0x00b7, # LATIN CAPITAL LETTER E WITH CARON + 0x011b: 0x00d8, # LATIN SMALL LETTER E WITH CARON + 0x0139: 0x0091, # LATIN CAPITAL LETTER L WITH ACUTE + 0x013a: 0x0092, # LATIN SMALL LETTER L WITH ACUTE + 0x013d: 0x0095, # LATIN CAPITAL LETTER L WITH CARON + 0x013e: 0x0096, # LATIN SMALL LETTER L WITH CARON + 0x0141: 0x009d, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0x0088, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0x00e3, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0x00e4, # LATIN SMALL LETTER N WITH ACUTE + 0x0147: 0x00d5, # LATIN CAPITAL LETTER N WITH CARON + 0x0148: 0x00e5, # LATIN SMALL LETTER N WITH CARON + 0x0150: 0x008a, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x0151: 0x008b, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x0154: 0x00e8, # LATIN CAPITAL LETTER R WITH ACUTE + 0x0155: 0x00ea, # LATIN SMALL LETTER R WITH ACUTE + 0x0158: 0x00fc, # LATIN CAPITAL LETTER R WITH CARON + 0x0159: 0x00fd, # LATIN SMALL LETTER R WITH CARON + 0x015a: 0x0097, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015b: 0x0098, # LATIN SMALL LETTER S WITH ACUTE + 0x015e: 0x00b8, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015f: 0x00ad, # LATIN SMALL LETTER S WITH CEDILLA + 0x0160: 0x00e6, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0x00e7, # LATIN SMALL LETTER S WITH CARON + 0x0162: 0x00dd, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x0163: 0x00ee, # LATIN SMALL LETTER T WITH CEDILLA + 0x0164: 0x009b, # LATIN CAPITAL LETTER T WITH CARON + 0x0165: 0x009c, # LATIN SMALL LETTER T WITH CARON + 0x016e: 0x00de, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x016f: 0x0085, # LATIN SMALL LETTER U WITH RING ABOVE + 0x0170: 0x00eb, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x0171: 0x00fb, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x0179: 0x008d, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017a: 0x00ab, # LATIN SMALL LETTER Z WITH ACUTE + 0x017b: 0x00bd, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017c: 0x00be, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017d: 0x00a6, # LATIN CAPITAL LETTER Z WITH CARON + 0x017e: 0x00a7, # LATIN SMALL LETTER Z WITH CARON + 0x02c7: 0x00f3, # CARON + 0x02d8: 0x00f4, # BREVE + 0x02d9: 0x00fa, # DOT ABOVE + 0x02db: 0x00f2, # OGONEK + 0x02dd: 0x00f1, # DOUBLE ACUTE ACCENT + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp855.py b/venv/Lib/encodings/cp855.py new file mode 100644 index 00000000..4fe92106 --- /dev/null +++ b/venv/Lib/encodings/cp855.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP855.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp855', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0452, # CYRILLIC SMALL LETTER DJE + 0x0081: 0x0402, # CYRILLIC CAPITAL LETTER DJE + 0x0082: 0x0453, # CYRILLIC SMALL LETTER GJE + 0x0083: 0x0403, # CYRILLIC CAPITAL LETTER GJE + 0x0084: 0x0451, # CYRILLIC SMALL LETTER IO + 0x0085: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x0086: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0087: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0088: 0x0455, # CYRILLIC SMALL LETTER DZE + 0x0089: 0x0405, # CYRILLIC CAPITAL LETTER DZE + 0x008a: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x008b: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x008c: 0x0457, # CYRILLIC SMALL LETTER YI + 0x008d: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x008e: 0x0458, # CYRILLIC SMALL LETTER JE + 0x008f: 0x0408, # CYRILLIC CAPITAL LETTER JE + 0x0090: 0x0459, # CYRILLIC SMALL LETTER LJE + 0x0091: 0x0409, # CYRILLIC CAPITAL LETTER LJE + 0x0092: 0x045a, # CYRILLIC SMALL LETTER NJE + 0x0093: 0x040a, # CYRILLIC CAPITAL LETTER NJE + 0x0094: 0x045b, # CYRILLIC SMALL LETTER TSHE + 0x0095: 0x040b, # CYRILLIC CAPITAL LETTER TSHE + 0x0096: 0x045c, # CYRILLIC SMALL LETTER KJE + 0x0097: 0x040c, # CYRILLIC CAPITAL LETTER KJE + 0x0098: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x0099: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x009a: 0x045f, # CYRILLIC SMALL LETTER DZHE + 0x009b: 0x040f, # CYRILLIC CAPITAL LETTER DZHE + 0x009c: 0x044e, # CYRILLIC SMALL LETTER YU + 0x009d: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009e: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x009f: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x00a2: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a3: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x00a4: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00a5: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x00a6: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a7: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x00a8: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a9: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x00aa: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00ab: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x00ac: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00ad: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00b6: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x00b7: 0x0438, # CYRILLIC SMALL LETTER I + 0x00b8: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00be: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00c7: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00d1: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x00d2: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00d3: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x00d4: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00d5: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x00d6: 0x043e, # CYRILLIC SMALL LETTER O + 0x00d7: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x00d8: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x00de: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00e1: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e2: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x00e3: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e4: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x00e5: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e6: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x00e7: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e8: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x00e9: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00ea: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x00eb: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00ec: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x00ed: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ee: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x00ef: 0x2116, # NUMERO SIGN + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00f2: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x00f3: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00f4: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x00f5: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00f6: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x00f7: 0x044d, # CYRILLIC SMALL LETTER E + 0x00f8: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x00f9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00fa: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x00fb: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00fc: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x00fd: 0x00a7, # SECTION SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0452' # 0x0080 -> CYRILLIC SMALL LETTER DJE + '\u0402' # 0x0081 -> CYRILLIC CAPITAL LETTER DJE + '\u0453' # 0x0082 -> CYRILLIC SMALL LETTER GJE + '\u0403' # 0x0083 -> CYRILLIC CAPITAL LETTER GJE + '\u0451' # 0x0084 -> CYRILLIC SMALL LETTER IO + '\u0401' # 0x0085 -> CYRILLIC CAPITAL LETTER IO + '\u0454' # 0x0086 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0404' # 0x0087 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0455' # 0x0088 -> CYRILLIC SMALL LETTER DZE + '\u0405' # 0x0089 -> CYRILLIC CAPITAL LETTER DZE + '\u0456' # 0x008a -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0406' # 0x008b -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0457' # 0x008c -> CYRILLIC SMALL LETTER YI + '\u0407' # 0x008d -> CYRILLIC CAPITAL LETTER YI + '\u0458' # 0x008e -> CYRILLIC SMALL LETTER JE + '\u0408' # 0x008f -> CYRILLIC CAPITAL LETTER JE + '\u0459' # 0x0090 -> CYRILLIC SMALL LETTER LJE + '\u0409' # 0x0091 -> CYRILLIC CAPITAL LETTER LJE + '\u045a' # 0x0092 -> CYRILLIC SMALL LETTER NJE + '\u040a' # 0x0093 -> CYRILLIC CAPITAL LETTER NJE + '\u045b' # 0x0094 -> CYRILLIC SMALL LETTER TSHE + '\u040b' # 0x0095 -> CYRILLIC CAPITAL LETTER TSHE + '\u045c' # 0x0096 -> CYRILLIC SMALL LETTER KJE + '\u040c' # 0x0097 -> CYRILLIC CAPITAL LETTER KJE + '\u045e' # 0x0098 -> CYRILLIC SMALL LETTER SHORT U + '\u040e' # 0x0099 -> CYRILLIC CAPITAL LETTER SHORT U + '\u045f' # 0x009a -> CYRILLIC SMALL LETTER DZHE + '\u040f' # 0x009b -> CYRILLIC CAPITAL LETTER DZHE + '\u044e' # 0x009c -> CYRILLIC SMALL LETTER YU + '\u042e' # 0x009d -> CYRILLIC CAPITAL LETTER YU + '\u044a' # 0x009e -> CYRILLIC SMALL LETTER HARD SIGN + '\u042a' # 0x009f -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A + '\u0410' # 0x00a1 -> CYRILLIC CAPITAL LETTER A + '\u0431' # 0x00a2 -> CYRILLIC SMALL LETTER BE + '\u0411' # 0x00a3 -> CYRILLIC CAPITAL LETTER BE + '\u0446' # 0x00a4 -> CYRILLIC SMALL LETTER TSE + '\u0426' # 0x00a5 -> CYRILLIC CAPITAL LETTER TSE + '\u0434' # 0x00a6 -> CYRILLIC SMALL LETTER DE + '\u0414' # 0x00a7 -> CYRILLIC CAPITAL LETTER DE + '\u0435' # 0x00a8 -> CYRILLIC SMALL LETTER IE + '\u0415' # 0x00a9 -> CYRILLIC CAPITAL LETTER IE + '\u0444' # 0x00aa -> CYRILLIC SMALL LETTER EF + '\u0424' # 0x00ab -> CYRILLIC CAPITAL LETTER EF + '\u0433' # 0x00ac -> CYRILLIC SMALL LETTER GHE + '\u0413' # 0x00ad -> CYRILLIC CAPITAL LETTER GHE + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u0445' # 0x00b5 -> CYRILLIC SMALL LETTER HA + '\u0425' # 0x00b6 -> CYRILLIC CAPITAL LETTER HA + '\u0438' # 0x00b7 -> CYRILLIC SMALL LETTER I + '\u0418' # 0x00b8 -> CYRILLIC CAPITAL LETTER I + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u0439' # 0x00bd -> CYRILLIC SMALL LETTER SHORT I + '\u0419' # 0x00be -> CYRILLIC CAPITAL LETTER SHORT I + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u043a' # 0x00c6 -> CYRILLIC SMALL LETTER KA + '\u041a' # 0x00c7 -> CYRILLIC CAPITAL LETTER KA + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\u043b' # 0x00d0 -> CYRILLIC SMALL LETTER EL + '\u041b' # 0x00d1 -> CYRILLIC CAPITAL LETTER EL + '\u043c' # 0x00d2 -> CYRILLIC SMALL LETTER EM + '\u041c' # 0x00d3 -> CYRILLIC CAPITAL LETTER EM + '\u043d' # 0x00d4 -> CYRILLIC SMALL LETTER EN + '\u041d' # 0x00d5 -> CYRILLIC CAPITAL LETTER EN + '\u043e' # 0x00d6 -> CYRILLIC SMALL LETTER O + '\u041e' # 0x00d7 -> CYRILLIC CAPITAL LETTER O + '\u043f' # 0x00d8 -> CYRILLIC SMALL LETTER PE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u041f' # 0x00dd -> CYRILLIC CAPITAL LETTER PE + '\u044f' # 0x00de -> CYRILLIC SMALL LETTER YA + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u042f' # 0x00e0 -> CYRILLIC CAPITAL LETTER YA + '\u0440' # 0x00e1 -> CYRILLIC SMALL LETTER ER + '\u0420' # 0x00e2 -> CYRILLIC CAPITAL LETTER ER + '\u0441' # 0x00e3 -> CYRILLIC SMALL LETTER ES + '\u0421' # 0x00e4 -> CYRILLIC CAPITAL LETTER ES + '\u0442' # 0x00e5 -> CYRILLIC SMALL LETTER TE + '\u0422' # 0x00e6 -> CYRILLIC CAPITAL LETTER TE + '\u0443' # 0x00e7 -> CYRILLIC SMALL LETTER U + '\u0423' # 0x00e8 -> CYRILLIC CAPITAL LETTER U + '\u0436' # 0x00e9 -> CYRILLIC SMALL LETTER ZHE + '\u0416' # 0x00ea -> CYRILLIC CAPITAL LETTER ZHE + '\u0432' # 0x00eb -> CYRILLIC SMALL LETTER VE + '\u0412' # 0x00ec -> CYRILLIC CAPITAL LETTER VE + '\u044c' # 0x00ed -> CYRILLIC SMALL LETTER SOFT SIGN + '\u042c' # 0x00ee -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u2116' # 0x00ef -> NUMERO SIGN + '\xad' # 0x00f0 -> SOFT HYPHEN + '\u044b' # 0x00f1 -> CYRILLIC SMALL LETTER YERU + '\u042b' # 0x00f2 -> CYRILLIC CAPITAL LETTER YERU + '\u0437' # 0x00f3 -> CYRILLIC SMALL LETTER ZE + '\u0417' # 0x00f4 -> CYRILLIC CAPITAL LETTER ZE + '\u0448' # 0x00f5 -> CYRILLIC SMALL LETTER SHA + '\u0428' # 0x00f6 -> CYRILLIC CAPITAL LETTER SHA + '\u044d' # 0x00f7 -> CYRILLIC SMALL LETTER E + '\u042d' # 0x00f8 -> CYRILLIC CAPITAL LETTER E + '\u0449' # 0x00f9 -> CYRILLIC SMALL LETTER SHCHA + '\u0429' # 0x00fa -> CYRILLIC CAPITAL LETTER SHCHA + '\u0447' # 0x00fb -> CYRILLIC SMALL LETTER CHE + '\u0427' # 0x00fc -> CYRILLIC CAPITAL LETTER CHE + '\xa7' # 0x00fd -> SECTION SIGN + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a7: 0x00fd, # SECTION SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x0401: 0x0085, # CYRILLIC CAPITAL LETTER IO + 0x0402: 0x0081, # CYRILLIC CAPITAL LETTER DJE + 0x0403: 0x0083, # CYRILLIC CAPITAL LETTER GJE + 0x0404: 0x0087, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0405: 0x0089, # CYRILLIC CAPITAL LETTER DZE + 0x0406: 0x008b, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0407: 0x008d, # CYRILLIC CAPITAL LETTER YI + 0x0408: 0x008f, # CYRILLIC CAPITAL LETTER JE + 0x0409: 0x0091, # CYRILLIC CAPITAL LETTER LJE + 0x040a: 0x0093, # CYRILLIC CAPITAL LETTER NJE + 0x040b: 0x0095, # CYRILLIC CAPITAL LETTER TSHE + 0x040c: 0x0097, # CYRILLIC CAPITAL LETTER KJE + 0x040e: 0x0099, # CYRILLIC CAPITAL LETTER SHORT U + 0x040f: 0x009b, # CYRILLIC CAPITAL LETTER DZHE + 0x0410: 0x00a1, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x00a3, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x00ec, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x00ad, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x00a7, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x00a9, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x00ea, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x00f4, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x00b8, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x00be, # CYRILLIC CAPITAL LETTER SHORT I + 0x041a: 0x00c7, # CYRILLIC CAPITAL LETTER KA + 0x041b: 0x00d1, # CYRILLIC CAPITAL LETTER EL + 0x041c: 0x00d3, # CYRILLIC CAPITAL LETTER EM + 0x041d: 0x00d5, # CYRILLIC CAPITAL LETTER EN + 0x041e: 0x00d7, # CYRILLIC CAPITAL LETTER O + 0x041f: 0x00dd, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x00e2, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x00e4, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x00e6, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x00e8, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x00ab, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x00b6, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x00a5, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x00fc, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x00f6, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x00fa, # CYRILLIC CAPITAL LETTER SHCHA + 0x042a: 0x009f, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042b: 0x00f2, # CYRILLIC CAPITAL LETTER YERU + 0x042c: 0x00ee, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042d: 0x00f8, # CYRILLIC CAPITAL LETTER E + 0x042e: 0x009d, # CYRILLIC CAPITAL LETTER YU + 0x042f: 0x00e0, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A + 0x0431: 0x00a2, # CYRILLIC SMALL LETTER BE + 0x0432: 0x00eb, # CYRILLIC SMALL LETTER VE + 0x0433: 0x00ac, # CYRILLIC SMALL LETTER GHE + 0x0434: 0x00a6, # CYRILLIC SMALL LETTER DE + 0x0435: 0x00a8, # CYRILLIC SMALL LETTER IE + 0x0436: 0x00e9, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0x00f3, # CYRILLIC SMALL LETTER ZE + 0x0438: 0x00b7, # CYRILLIC SMALL LETTER I + 0x0439: 0x00bd, # CYRILLIC SMALL LETTER SHORT I + 0x043a: 0x00c6, # CYRILLIC SMALL LETTER KA + 0x043b: 0x00d0, # CYRILLIC SMALL LETTER EL + 0x043c: 0x00d2, # CYRILLIC SMALL LETTER EM + 0x043d: 0x00d4, # CYRILLIC SMALL LETTER EN + 0x043e: 0x00d6, # CYRILLIC SMALL LETTER O + 0x043f: 0x00d8, # CYRILLIC SMALL LETTER PE + 0x0440: 0x00e1, # CYRILLIC SMALL LETTER ER + 0x0441: 0x00e3, # CYRILLIC SMALL LETTER ES + 0x0442: 0x00e5, # CYRILLIC SMALL LETTER TE + 0x0443: 0x00e7, # CYRILLIC SMALL LETTER U + 0x0444: 0x00aa, # CYRILLIC SMALL LETTER EF + 0x0445: 0x00b5, # CYRILLIC SMALL LETTER HA + 0x0446: 0x00a4, # CYRILLIC SMALL LETTER TSE + 0x0447: 0x00fb, # CYRILLIC SMALL LETTER CHE + 0x0448: 0x00f5, # CYRILLIC SMALL LETTER SHA + 0x0449: 0x00f9, # CYRILLIC SMALL LETTER SHCHA + 0x044a: 0x009e, # CYRILLIC SMALL LETTER HARD SIGN + 0x044b: 0x00f1, # CYRILLIC SMALL LETTER YERU + 0x044c: 0x00ed, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044d: 0x00f7, # CYRILLIC SMALL LETTER E + 0x044e: 0x009c, # CYRILLIC SMALL LETTER YU + 0x044f: 0x00de, # CYRILLIC SMALL LETTER YA + 0x0451: 0x0084, # CYRILLIC SMALL LETTER IO + 0x0452: 0x0080, # CYRILLIC SMALL LETTER DJE + 0x0453: 0x0082, # CYRILLIC SMALL LETTER GJE + 0x0454: 0x0086, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0455: 0x0088, # CYRILLIC SMALL LETTER DZE + 0x0456: 0x008a, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0457: 0x008c, # CYRILLIC SMALL LETTER YI + 0x0458: 0x008e, # CYRILLIC SMALL LETTER JE + 0x0459: 0x0090, # CYRILLIC SMALL LETTER LJE + 0x045a: 0x0092, # CYRILLIC SMALL LETTER NJE + 0x045b: 0x0094, # CYRILLIC SMALL LETTER TSHE + 0x045c: 0x0096, # CYRILLIC SMALL LETTER KJE + 0x045e: 0x0098, # CYRILLIC SMALL LETTER SHORT U + 0x045f: 0x009a, # CYRILLIC SMALL LETTER DZHE + 0x2116: 0x00ef, # NUMERO SIGN + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp856.py b/venv/Lib/encodings/cp856.py new file mode 100644 index 00000000..cacbfb2f --- /dev/null +++ b/venv/Lib/encodings/cp856.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp856 generated from 'MAPPINGS/VENDORS/MISC/CP856.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp856', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u05d0' # 0x80 -> HEBREW LETTER ALEF + '\u05d1' # 0x81 -> HEBREW LETTER BET + '\u05d2' # 0x82 -> HEBREW LETTER GIMEL + '\u05d3' # 0x83 -> HEBREW LETTER DALET + '\u05d4' # 0x84 -> HEBREW LETTER HE + '\u05d5' # 0x85 -> HEBREW LETTER VAV + '\u05d6' # 0x86 -> HEBREW LETTER ZAYIN + '\u05d7' # 0x87 -> HEBREW LETTER HET + '\u05d8' # 0x88 -> HEBREW LETTER TET + '\u05d9' # 0x89 -> HEBREW LETTER YOD + '\u05da' # 0x8A -> HEBREW LETTER FINAL KAF + '\u05db' # 0x8B -> HEBREW LETTER KAF + '\u05dc' # 0x8C -> HEBREW LETTER LAMED + '\u05dd' # 0x8D -> HEBREW LETTER FINAL MEM + '\u05de' # 0x8E -> HEBREW LETTER MEM + '\u05df' # 0x8F -> HEBREW LETTER FINAL NUN + '\u05e0' # 0x90 -> HEBREW LETTER NUN + '\u05e1' # 0x91 -> HEBREW LETTER SAMEKH + '\u05e2' # 0x92 -> HEBREW LETTER AYIN + '\u05e3' # 0x93 -> HEBREW LETTER FINAL PE + '\u05e4' # 0x94 -> HEBREW LETTER PE + '\u05e5' # 0x95 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0x96 -> HEBREW LETTER TSADI + '\u05e7' # 0x97 -> HEBREW LETTER QOF + '\u05e8' # 0x98 -> HEBREW LETTER RESH + '\u05e9' # 0x99 -> HEBREW LETTER SHIN + '\u05ea' # 0x9A -> HEBREW LETTER TAV + '\ufffe' # 0x9B -> UNDEFINED + '\xa3' # 0x9C -> POUND SIGN + '\ufffe' # 0x9D -> UNDEFINED + '\xd7' # 0x9E -> MULTIPLICATION SIGN + '\ufffe' # 0x9F -> UNDEFINED + '\ufffe' # 0xA0 -> UNDEFINED + '\ufffe' # 0xA1 -> UNDEFINED + '\ufffe' # 0xA2 -> UNDEFINED + '\ufffe' # 0xA3 -> UNDEFINED + '\ufffe' # 0xA4 -> UNDEFINED + '\ufffe' # 0xA5 -> UNDEFINED + '\ufffe' # 0xA6 -> UNDEFINED + '\ufffe' # 0xA7 -> UNDEFINED + '\ufffe' # 0xA8 -> UNDEFINED + '\xae' # 0xA9 -> REGISTERED SIGN + '\xac' # 0xAA -> NOT SIGN + '\xbd' # 0xAB -> VULGAR FRACTION ONE HALF + '\xbc' # 0xAC -> VULGAR FRACTION ONE QUARTER + '\ufffe' # 0xAD -> UNDEFINED + '\xab' # 0xAE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xAF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0xB0 -> LIGHT SHADE + '\u2592' # 0xB1 -> MEDIUM SHADE + '\u2593' # 0xB2 -> DARK SHADE + '\u2502' # 0xB3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0xB4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\ufffe' # 0xB5 -> UNDEFINED + '\ufffe' # 0xB6 -> UNDEFINED + '\ufffe' # 0xB7 -> UNDEFINED + '\xa9' # 0xB8 -> COPYRIGHT SIGN + '\u2563' # 0xB9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0xBA -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0xBB -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0xBC -> BOX DRAWINGS DOUBLE UP AND LEFT + '\xa2' # 0xBD -> CENT SIGN + '\xa5' # 0xBE -> YEN SIGN + '\u2510' # 0xBF -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0xC0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0xC1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0xC2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0xC3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0xC4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0xC5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\ufffe' # 0xC6 -> UNDEFINED + '\ufffe' # 0xC7 -> UNDEFINED + '\u255a' # 0xC8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0xC9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0xCA -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0xCB -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0xCC -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0xCD -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0xCE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0xCF -> CURRENCY SIGN + '\ufffe' # 0xD0 -> UNDEFINED + '\ufffe' # 0xD1 -> UNDEFINED + '\ufffe' # 0xD2 -> UNDEFINED + '\ufffe' # 0xD3 -> UNDEFINEDS + '\ufffe' # 0xD4 -> UNDEFINED + '\ufffe' # 0xD5 -> UNDEFINED + '\ufffe' # 0xD6 -> UNDEFINEDE + '\ufffe' # 0xD7 -> UNDEFINED + '\ufffe' # 0xD8 -> UNDEFINED + '\u2518' # 0xD9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0xDA -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0xDB -> FULL BLOCK + '\u2584' # 0xDC -> LOWER HALF BLOCK + '\xa6' # 0xDD -> BROKEN BAR + '\ufffe' # 0xDE -> UNDEFINED + '\u2580' # 0xDF -> UPPER HALF BLOCK + '\ufffe' # 0xE0 -> UNDEFINED + '\ufffe' # 0xE1 -> UNDEFINED + '\ufffe' # 0xE2 -> UNDEFINED + '\ufffe' # 0xE3 -> UNDEFINED + '\ufffe' # 0xE4 -> UNDEFINED + '\ufffe' # 0xE5 -> UNDEFINED + '\xb5' # 0xE6 -> MICRO SIGN + '\ufffe' # 0xE7 -> UNDEFINED + '\ufffe' # 0xE8 -> UNDEFINED + '\ufffe' # 0xE9 -> UNDEFINED + '\ufffe' # 0xEA -> UNDEFINED + '\ufffe' # 0xEB -> UNDEFINED + '\ufffe' # 0xEC -> UNDEFINED + '\ufffe' # 0xED -> UNDEFINED + '\xaf' # 0xEE -> MACRON + '\xb4' # 0xEF -> ACUTE ACCENT + '\xad' # 0xF0 -> SOFT HYPHEN + '\xb1' # 0xF1 -> PLUS-MINUS SIGN + '\u2017' # 0xF2 -> DOUBLE LOW LINE + '\xbe' # 0xF3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0xF4 -> PILCROW SIGN + '\xa7' # 0xF5 -> SECTION SIGN + '\xf7' # 0xF6 -> DIVISION SIGN + '\xb8' # 0xF7 -> CEDILLA + '\xb0' # 0xF8 -> DEGREE SIGN + '\xa8' # 0xF9 -> DIAERESIS + '\xb7' # 0xFA -> MIDDLE DOT + '\xb9' # 0xFB -> SUPERSCRIPT ONE + '\xb3' # 0xFC -> SUPERSCRIPT THREE + '\xb2' # 0xFD -> SUPERSCRIPT TWO + '\u25a0' # 0xFE -> BLACK SQUARE + '\xa0' # 0xFF -> NO-BREAK SPACE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp857.py b/venv/Lib/encodings/cp857.py new file mode 100644 index 00000000..741b059b --- /dev/null +++ b/venv/Lib/encodings/cp857.py @@ -0,0 +1,694 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP857.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp857', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x0130, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x009f: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x011e, # LATIN CAPITAL LETTER G WITH BREVE + 0x00a7: 0x011f, # LATIN SMALL LETTER G WITH BREVE + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00d1: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: None, # UNDEFINED + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: None, # UNDEFINED + 0x00e8: 0x00d7, # MULTIPLICATION SIGN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ed: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: None, # UNDEFINED + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u0131' # 0x008d -> LATIN SMALL LETTER DOTLESS I + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\u0130' # 0x0098 -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\u015e' # 0x009e -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u015f' # 0x009f -> LATIN SMALL LETTER S WITH CEDILLA + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\u011e' # 0x00a6 -> LATIN CAPITAL LETTER G WITH BREVE + '\u011f' # 0x00a7 -> LATIN SMALL LETTER G WITH BREVE + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\xae' # 0x00a9 -> REGISTERED SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xa9' # 0x00b8 -> COPYRIGHT SIGN + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\xa2' # 0x00bd -> CENT SIGN + '\xa5' # 0x00be -> YEN SIGN + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + '\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\xba' # 0x00d0 -> MASCULINE ORDINAL INDICATOR + '\xaa' # 0x00d1 -> FEMININE ORDINAL INDICATOR + '\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + '\ufffe' # 0x00d5 -> UNDEFINED + '\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\xa6' # 0x00dd -> BROKEN BAR + '\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + '\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xb5' # 0x00e6 -> MICRO SIGN + '\ufffe' # 0x00e7 -> UNDEFINED + '\xd7' # 0x00e8 -> MULTIPLICATION SIGN + '\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + '\xec' # 0x00ec -> LATIN SMALL LETTER I WITH GRAVE + '\xff' # 0x00ed -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xaf' # 0x00ee -> MACRON + '\xb4' # 0x00ef -> ACUTE ACCENT + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\ufffe' # 0x00f2 -> UNDEFINED + '\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0x00f4 -> PILCROW SIGN + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\xb8' # 0x00f7 -> CEDILLA + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\xb7' # 0x00fa -> MIDDLE DOT + '\xb9' # 0x00fb -> SUPERSCRIPT ONE + '\xb3' # 0x00fc -> SUPERSCRIPT THREE + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00d1, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00d0, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x00e8, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x00ed, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x011e: 0x00a6, # LATIN CAPITAL LETTER G WITH BREVE + 0x011f: 0x00a7, # LATIN SMALL LETTER G WITH BREVE + 0x0130: 0x0098, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0131: 0x008d, # LATIN SMALL LETTER DOTLESS I + 0x015e: 0x009e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015f: 0x009f, # LATIN SMALL LETTER S WITH CEDILLA + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp858.py b/venv/Lib/encodings/cp858.py new file mode 100644 index 00000000..7579f525 --- /dev/null +++ b/venv/Lib/encodings/cp858.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec for CP858, modified from cp850. + +""" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp858', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00f0, # LATIN SMALL LETTER ETH + 0x00d1: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: 0x20ac, # EURO SIGN + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x00fe, # LATIN SMALL LETTER THORN + 0x00e8: 0x00de, # LATIN CAPITAL LETTER THORN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2017, # DOUBLE LOW LINE + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\xd7' # 0x009e -> MULTIPLICATION SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\xae' # 0x00a9 -> REGISTERED SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xa9' # 0x00b8 -> COPYRIGHT SIGN + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\xa2' # 0x00bd -> CENT SIGN + '\xa5' # 0x00be -> YEN SIGN + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + '\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\xf0' # 0x00d0 -> LATIN SMALL LETTER ETH + '\xd0' # 0x00d1 -> LATIN CAPITAL LETTER ETH + '\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + '\u20ac' # 0x00d5 -> EURO SIGN + '\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\xa6' # 0x00dd -> BROKEN BAR + '\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + '\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xb5' # 0x00e6 -> MICRO SIGN + '\xfe' # 0x00e7 -> LATIN SMALL LETTER THORN + '\xde' # 0x00e8 -> LATIN CAPITAL LETTER THORN + '\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + '\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + '\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xaf' # 0x00ee -> MACRON + '\xb4' # 0x00ef -> ACUTE ACCENT + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2017' # 0x00f2 -> DOUBLE LOW LINE + '\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0x00f4 -> PILCROW SIGN + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\xb8' # 0x00f7 -> CEDILLA + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\xb7' # 0x00fa -> MIDDLE DOT + '\xb9' # 0x00fb -> SUPERSCRIPT ONE + '\xb3' # 0x00fc -> SUPERSCRIPT THREE + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d0: 0x00d1, # LATIN CAPITAL LETTER ETH + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x00e8, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f0: 0x00d0, # LATIN SMALL LETTER ETH + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x00e7, # LATIN SMALL LETTER THORN + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x20ac: 0x00d5, # EURO SIGN + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x2017: 0x00f2, # DOUBLE LOW LINE + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp860.py b/venv/Lib/encodings/cp860.py new file mode 100644 index 00000000..65903e74 --- /dev/null +++ b/venv/Lib/encodings/cp860.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP860.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp860', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x008c: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x008f: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x0092: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x0099: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0x0084 -> LATIN SMALL LETTER A WITH TILDE + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xc1' # 0x0086 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xca' # 0x0089 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xcd' # 0x008b -> LATIN CAPITAL LETTER I WITH ACUTE + '\xd4' # 0x008c -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc3' # 0x008e -> LATIN CAPITAL LETTER A WITH TILDE + '\xc2' # 0x008f -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xc0' # 0x0091 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc8' # 0x0092 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0x0094 -> LATIN SMALL LETTER O WITH TILDE + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xda' # 0x0096 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xcc' # 0x0098 -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd5' # 0x0099 -> LATIN CAPITAL LETTER O WITH TILDE + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xa2' # 0x009b -> CENT SIGN + '\xa3' # 0x009c -> POUND SIGN + '\xd9' # 0x009d -> LATIN CAPITAL LETTER U WITH GRAVE + '\u20a7' # 0x009e -> PESETA SIGN + '\xd3' # 0x009f -> LATIN CAPITAL LETTER O WITH ACUTE + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\xd2' # 0x00a9 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x0091, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x0086, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x008f, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x008e, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x0092, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x0089, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cc: 0x0098, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x008b, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00a9, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x009f, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x008c, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x0099, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d9: 0x009d, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x0096, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x0084, # LATIN SMALL LETTER A WITH TILDE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x0094, # LATIN SMALL LETTER O WITH TILDE + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp861.py b/venv/Lib/encodings/cp861.py new file mode 100644 index 00000000..860a05fa --- /dev/null +++ b/venv/Lib/encodings/cp861.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP861.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp861', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x008c: 0x00f0, # LATIN SMALL LETTER ETH + 0x008d: 0x00de, # LATIN CAPITAL LETTER THORN + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00fe, # LATIN SMALL LETTER THORN + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x0098: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00a5: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00a6: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00a7: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xd0' # 0x008b -> LATIN CAPITAL LETTER ETH + '\xf0' # 0x008c -> LATIN SMALL LETTER ETH + '\xde' # 0x008d -> LATIN CAPITAL LETTER THORN + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xfe' # 0x0095 -> LATIN SMALL LETTER THORN + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xdd' # 0x0097 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xfd' # 0x0098 -> LATIN SMALL LETTER Y WITH ACUTE + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\u20a7' # 0x009e -> PESETA SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xc1' # 0x00a4 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcd' # 0x00a5 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xd3' # 0x00a6 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xda' # 0x00a7 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a3: 0x009c, # POUND SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c1: 0x00a4, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00cd: 0x00a5, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d0: 0x008b, # LATIN CAPITAL LETTER ETH + 0x00d3: 0x00a6, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00da: 0x00a7, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x0097, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x008d, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f0: 0x008c, # LATIN SMALL LETTER ETH + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x0098, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x0095, # LATIN SMALL LETTER THORN + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp862.py b/venv/Lib/encodings/cp862.py new file mode 100644 index 00000000..3df22f99 --- /dev/null +++ b/venv/Lib/encodings/cp862.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP862.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp862', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x05d0, # HEBREW LETTER ALEF + 0x0081: 0x05d1, # HEBREW LETTER BET + 0x0082: 0x05d2, # HEBREW LETTER GIMEL + 0x0083: 0x05d3, # HEBREW LETTER DALET + 0x0084: 0x05d4, # HEBREW LETTER HE + 0x0085: 0x05d5, # HEBREW LETTER VAV + 0x0086: 0x05d6, # HEBREW LETTER ZAYIN + 0x0087: 0x05d7, # HEBREW LETTER HET + 0x0088: 0x05d8, # HEBREW LETTER TET + 0x0089: 0x05d9, # HEBREW LETTER YOD + 0x008a: 0x05da, # HEBREW LETTER FINAL KAF + 0x008b: 0x05db, # HEBREW LETTER KAF + 0x008c: 0x05dc, # HEBREW LETTER LAMED + 0x008d: 0x05dd, # HEBREW LETTER FINAL MEM + 0x008e: 0x05de, # HEBREW LETTER MEM + 0x008f: 0x05df, # HEBREW LETTER FINAL NUN + 0x0090: 0x05e0, # HEBREW LETTER NUN + 0x0091: 0x05e1, # HEBREW LETTER SAMEKH + 0x0092: 0x05e2, # HEBREW LETTER AYIN + 0x0093: 0x05e3, # HEBREW LETTER FINAL PE + 0x0094: 0x05e4, # HEBREW LETTER PE + 0x0095: 0x05e5, # HEBREW LETTER FINAL TSADI + 0x0096: 0x05e6, # HEBREW LETTER TSADI + 0x0097: 0x05e7, # HEBREW LETTER QOF + 0x0098: 0x05e8, # HEBREW LETTER RESH + 0x0099: 0x05e9, # HEBREW LETTER SHIN + 0x009a: 0x05ea, # HEBREW LETTER TAV + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00a5, # YEN SIGN + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u05d0' # 0x0080 -> HEBREW LETTER ALEF + '\u05d1' # 0x0081 -> HEBREW LETTER BET + '\u05d2' # 0x0082 -> HEBREW LETTER GIMEL + '\u05d3' # 0x0083 -> HEBREW LETTER DALET + '\u05d4' # 0x0084 -> HEBREW LETTER HE + '\u05d5' # 0x0085 -> HEBREW LETTER VAV + '\u05d6' # 0x0086 -> HEBREW LETTER ZAYIN + '\u05d7' # 0x0087 -> HEBREW LETTER HET + '\u05d8' # 0x0088 -> HEBREW LETTER TET + '\u05d9' # 0x0089 -> HEBREW LETTER YOD + '\u05da' # 0x008a -> HEBREW LETTER FINAL KAF + '\u05db' # 0x008b -> HEBREW LETTER KAF + '\u05dc' # 0x008c -> HEBREW LETTER LAMED + '\u05dd' # 0x008d -> HEBREW LETTER FINAL MEM + '\u05de' # 0x008e -> HEBREW LETTER MEM + '\u05df' # 0x008f -> HEBREW LETTER FINAL NUN + '\u05e0' # 0x0090 -> HEBREW LETTER NUN + '\u05e1' # 0x0091 -> HEBREW LETTER SAMEKH + '\u05e2' # 0x0092 -> HEBREW LETTER AYIN + '\u05e3' # 0x0093 -> HEBREW LETTER FINAL PE + '\u05e4' # 0x0094 -> HEBREW LETTER PE + '\u05e5' # 0x0095 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0x0096 -> HEBREW LETTER TSADI + '\u05e7' # 0x0097 -> HEBREW LETTER QOF + '\u05e8' # 0x0098 -> HEBREW LETTER RESH + '\u05e9' # 0x0099 -> HEBREW LETTER SHIN + '\u05ea' # 0x009a -> HEBREW LETTER TAV + '\xa2' # 0x009b -> CENT SIGN + '\xa3' # 0x009c -> POUND SIGN + '\xa5' # 0x009d -> YEN SIGN + '\u20a7' # 0x009e -> PESETA SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S (GERMAN) + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a5: 0x009d, # YEN SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x05d0: 0x0080, # HEBREW LETTER ALEF + 0x05d1: 0x0081, # HEBREW LETTER BET + 0x05d2: 0x0082, # HEBREW LETTER GIMEL + 0x05d3: 0x0083, # HEBREW LETTER DALET + 0x05d4: 0x0084, # HEBREW LETTER HE + 0x05d5: 0x0085, # HEBREW LETTER VAV + 0x05d6: 0x0086, # HEBREW LETTER ZAYIN + 0x05d7: 0x0087, # HEBREW LETTER HET + 0x05d8: 0x0088, # HEBREW LETTER TET + 0x05d9: 0x0089, # HEBREW LETTER YOD + 0x05da: 0x008a, # HEBREW LETTER FINAL KAF + 0x05db: 0x008b, # HEBREW LETTER KAF + 0x05dc: 0x008c, # HEBREW LETTER LAMED + 0x05dd: 0x008d, # HEBREW LETTER FINAL MEM + 0x05de: 0x008e, # HEBREW LETTER MEM + 0x05df: 0x008f, # HEBREW LETTER FINAL NUN + 0x05e0: 0x0090, # HEBREW LETTER NUN + 0x05e1: 0x0091, # HEBREW LETTER SAMEKH + 0x05e2: 0x0092, # HEBREW LETTER AYIN + 0x05e3: 0x0093, # HEBREW LETTER FINAL PE + 0x05e4: 0x0094, # HEBREW LETTER PE + 0x05e5: 0x0095, # HEBREW LETTER FINAL TSADI + 0x05e6: 0x0096, # HEBREW LETTER TSADI + 0x05e7: 0x0097, # HEBREW LETTER QOF + 0x05e8: 0x0098, # HEBREW LETTER RESH + 0x05e9: 0x0099, # HEBREW LETTER SHIN + 0x05ea: 0x009a, # HEBREW LETTER TAV + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp863.py b/venv/Lib/encodings/cp863.py new file mode 100644 index 00000000..764180b6 --- /dev/null +++ b/venv/Lib/encodings/cp863.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP863.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp863', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00b6, # PILCROW SIGN + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x2017, # DOUBLE LOW LINE + 0x008e: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x008f: 0x00a7, # SECTION SIGN + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0092: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x0095: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00a4, # CURRENCY SIGN + 0x0099: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x009e: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00a6, # BROKEN BAR + 0x00a1: 0x00b4, # ACUTE ACCENT + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00a8, # DIAERESIS + 0x00a5: 0x00b8, # CEDILLA + 0x00a6: 0x00b3, # SUPERSCRIPT THREE + 0x00a7: 0x00af, # MACRON + 0x00a8: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xc2' # 0x0084 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xb6' # 0x0086 -> PILCROW SIGN + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u2017' # 0x008d -> DOUBLE LOW LINE + '\xc0' # 0x008e -> LATIN CAPITAL LETTER A WITH GRAVE + '\xa7' # 0x008f -> SECTION SIGN + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xc8' # 0x0091 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xca' # 0x0092 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xcb' # 0x0094 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcf' # 0x0095 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xa4' # 0x0098 -> CURRENCY SIGN + '\xd4' # 0x0099 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xa2' # 0x009b -> CENT SIGN + '\xa3' # 0x009c -> POUND SIGN + '\xd9' # 0x009d -> LATIN CAPITAL LETTER U WITH GRAVE + '\xdb' # 0x009e -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xa6' # 0x00a0 -> BROKEN BAR + '\xb4' # 0x00a1 -> ACUTE ACCENT + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xa8' # 0x00a4 -> DIAERESIS + '\xb8' # 0x00a5 -> CEDILLA + '\xb3' # 0x00a6 -> SUPERSCRIPT THREE + '\xaf' # 0x00a7 -> MACRON + '\xce' # 0x00a8 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xbe' # 0x00ad -> VULGAR FRACTION THREE QUARTERS + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x0098, # CURRENCY SIGN + 0x00a6: 0x00a0, # BROKEN BAR + 0x00a7: 0x008f, # SECTION SIGN + 0x00a8: 0x00a4, # DIAERESIS + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00af: 0x00a7, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00a6, # SUPERSCRIPT THREE + 0x00b4: 0x00a1, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x0086, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00a5, # CEDILLA + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00ad, # VULGAR FRACTION THREE QUARTERS + 0x00c0: 0x008e, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c2: 0x0084, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x0091, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x0092, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x0094, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00ce: 0x00a8, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x0095, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d4: 0x0099, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d9: 0x009d, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00db: 0x009e, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x2017: 0x008d, # DOUBLE LOW LINE + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp864.py b/venv/Lib/encodings/cp864.py new file mode 100644 index 00000000..53df482d --- /dev/null +++ b/venv/Lib/encodings/cp864.py @@ -0,0 +1,690 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP864.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp864', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0025: 0x066a, # ARABIC PERCENT SIGN + 0x0080: 0x00b0, # DEGREE SIGN + 0x0081: 0x00b7, # MIDDLE DOT + 0x0082: 0x2219, # BULLET OPERATOR + 0x0083: 0x221a, # SQUARE ROOT + 0x0084: 0x2592, # MEDIUM SHADE + 0x0085: 0x2500, # FORMS LIGHT HORIZONTAL + 0x0086: 0x2502, # FORMS LIGHT VERTICAL + 0x0087: 0x253c, # FORMS LIGHT VERTICAL AND HORIZONTAL + 0x0088: 0x2524, # FORMS LIGHT VERTICAL AND LEFT + 0x0089: 0x252c, # FORMS LIGHT DOWN AND HORIZONTAL + 0x008a: 0x251c, # FORMS LIGHT VERTICAL AND RIGHT + 0x008b: 0x2534, # FORMS LIGHT UP AND HORIZONTAL + 0x008c: 0x2510, # FORMS LIGHT DOWN AND LEFT + 0x008d: 0x250c, # FORMS LIGHT DOWN AND RIGHT + 0x008e: 0x2514, # FORMS LIGHT UP AND RIGHT + 0x008f: 0x2518, # FORMS LIGHT UP AND LEFT + 0x0090: 0x03b2, # GREEK SMALL BETA + 0x0091: 0x221e, # INFINITY + 0x0092: 0x03c6, # GREEK SMALL PHI + 0x0093: 0x00b1, # PLUS-OR-MINUS SIGN + 0x0094: 0x00bd, # FRACTION 1/2 + 0x0095: 0x00bc, # FRACTION 1/4 + 0x0096: 0x2248, # ALMOST EQUAL TO + 0x0097: 0x00ab, # LEFT POINTING GUILLEMET + 0x0098: 0x00bb, # RIGHT POINTING GUILLEMET + 0x0099: 0xfef7, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + 0x009a: 0xfef8, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + 0x009b: None, # UNDEFINED + 0x009c: None, # UNDEFINED + 0x009d: 0xfefb, # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + 0x009e: 0xfefc, # ARABIC LIGATURE LAM WITH ALEF FINAL FORM + 0x009f: None, # UNDEFINED + 0x00a1: 0x00ad, # SOFT HYPHEN + 0x00a2: 0xfe82, # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + 0x00a5: 0xfe84, # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + 0x00a6: None, # UNDEFINED + 0x00a7: None, # UNDEFINED + 0x00a8: 0xfe8e, # ARABIC LETTER ALEF FINAL FORM + 0x00a9: 0xfe8f, # ARABIC LETTER BEH ISOLATED FORM + 0x00aa: 0xfe95, # ARABIC LETTER TEH ISOLATED FORM + 0x00ab: 0xfe99, # ARABIC LETTER THEH ISOLATED FORM + 0x00ac: 0x060c, # ARABIC COMMA + 0x00ad: 0xfe9d, # ARABIC LETTER JEEM ISOLATED FORM + 0x00ae: 0xfea1, # ARABIC LETTER HAH ISOLATED FORM + 0x00af: 0xfea5, # ARABIC LETTER KHAH ISOLATED FORM + 0x00b0: 0x0660, # ARABIC-INDIC DIGIT ZERO + 0x00b1: 0x0661, # ARABIC-INDIC DIGIT ONE + 0x00b2: 0x0662, # ARABIC-INDIC DIGIT TWO + 0x00b3: 0x0663, # ARABIC-INDIC DIGIT THREE + 0x00b4: 0x0664, # ARABIC-INDIC DIGIT FOUR + 0x00b5: 0x0665, # ARABIC-INDIC DIGIT FIVE + 0x00b6: 0x0666, # ARABIC-INDIC DIGIT SIX + 0x00b7: 0x0667, # ARABIC-INDIC DIGIT SEVEN + 0x00b8: 0x0668, # ARABIC-INDIC DIGIT EIGHT + 0x00b9: 0x0669, # ARABIC-INDIC DIGIT NINE + 0x00ba: 0xfed1, # ARABIC LETTER FEH ISOLATED FORM + 0x00bb: 0x061b, # ARABIC SEMICOLON + 0x00bc: 0xfeb1, # ARABIC LETTER SEEN ISOLATED FORM + 0x00bd: 0xfeb5, # ARABIC LETTER SHEEN ISOLATED FORM + 0x00be: 0xfeb9, # ARABIC LETTER SAD ISOLATED FORM + 0x00bf: 0x061f, # ARABIC QUESTION MARK + 0x00c0: 0x00a2, # CENT SIGN + 0x00c1: 0xfe80, # ARABIC LETTER HAMZA ISOLATED FORM + 0x00c2: 0xfe81, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + 0x00c3: 0xfe83, # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + 0x00c4: 0xfe85, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + 0x00c5: 0xfeca, # ARABIC LETTER AIN FINAL FORM + 0x00c6: 0xfe8b, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + 0x00c7: 0xfe8d, # ARABIC LETTER ALEF ISOLATED FORM + 0x00c8: 0xfe91, # ARABIC LETTER BEH INITIAL FORM + 0x00c9: 0xfe93, # ARABIC LETTER TEH MARBUTA ISOLATED FORM + 0x00ca: 0xfe97, # ARABIC LETTER TEH INITIAL FORM + 0x00cb: 0xfe9b, # ARABIC LETTER THEH INITIAL FORM + 0x00cc: 0xfe9f, # ARABIC LETTER JEEM INITIAL FORM + 0x00cd: 0xfea3, # ARABIC LETTER HAH INITIAL FORM + 0x00ce: 0xfea7, # ARABIC LETTER KHAH INITIAL FORM + 0x00cf: 0xfea9, # ARABIC LETTER DAL ISOLATED FORM + 0x00d0: 0xfeab, # ARABIC LETTER THAL ISOLATED FORM + 0x00d1: 0xfead, # ARABIC LETTER REH ISOLATED FORM + 0x00d2: 0xfeaf, # ARABIC LETTER ZAIN ISOLATED FORM + 0x00d3: 0xfeb3, # ARABIC LETTER SEEN INITIAL FORM + 0x00d4: 0xfeb7, # ARABIC LETTER SHEEN INITIAL FORM + 0x00d5: 0xfebb, # ARABIC LETTER SAD INITIAL FORM + 0x00d6: 0xfebf, # ARABIC LETTER DAD INITIAL FORM + 0x00d7: 0xfec1, # ARABIC LETTER TAH ISOLATED FORM + 0x00d8: 0xfec5, # ARABIC LETTER ZAH ISOLATED FORM + 0x00d9: 0xfecb, # ARABIC LETTER AIN INITIAL FORM + 0x00da: 0xfecf, # ARABIC LETTER GHAIN INITIAL FORM + 0x00db: 0x00a6, # BROKEN VERTICAL BAR + 0x00dc: 0x00ac, # NOT SIGN + 0x00dd: 0x00f7, # DIVISION SIGN + 0x00de: 0x00d7, # MULTIPLICATION SIGN + 0x00df: 0xfec9, # ARABIC LETTER AIN ISOLATED FORM + 0x00e0: 0x0640, # ARABIC TATWEEL + 0x00e1: 0xfed3, # ARABIC LETTER FEH INITIAL FORM + 0x00e2: 0xfed7, # ARABIC LETTER QAF INITIAL FORM + 0x00e3: 0xfedb, # ARABIC LETTER KAF INITIAL FORM + 0x00e4: 0xfedf, # ARABIC LETTER LAM INITIAL FORM + 0x00e5: 0xfee3, # ARABIC LETTER MEEM INITIAL FORM + 0x00e6: 0xfee7, # ARABIC LETTER NOON INITIAL FORM + 0x00e7: 0xfeeb, # ARABIC LETTER HEH INITIAL FORM + 0x00e8: 0xfeed, # ARABIC LETTER WAW ISOLATED FORM + 0x00e9: 0xfeef, # ARABIC LETTER ALEF MAKSURA ISOLATED FORM + 0x00ea: 0xfef3, # ARABIC LETTER YEH INITIAL FORM + 0x00eb: 0xfebd, # ARABIC LETTER DAD ISOLATED FORM + 0x00ec: 0xfecc, # ARABIC LETTER AIN MEDIAL FORM + 0x00ed: 0xfece, # ARABIC LETTER GHAIN FINAL FORM + 0x00ee: 0xfecd, # ARABIC LETTER GHAIN ISOLATED FORM + 0x00ef: 0xfee1, # ARABIC LETTER MEEM ISOLATED FORM + 0x00f0: 0xfe7d, # ARABIC SHADDA MEDIAL FORM + 0x00f1: 0x0651, # ARABIC SHADDAH + 0x00f2: 0xfee5, # ARABIC LETTER NOON ISOLATED FORM + 0x00f3: 0xfee9, # ARABIC LETTER HEH ISOLATED FORM + 0x00f4: 0xfeec, # ARABIC LETTER HEH MEDIAL FORM + 0x00f5: 0xfef0, # ARABIC LETTER ALEF MAKSURA FINAL FORM + 0x00f6: 0xfef2, # ARABIC LETTER YEH FINAL FORM + 0x00f7: 0xfed0, # ARABIC LETTER GHAIN MEDIAL FORM + 0x00f8: 0xfed5, # ARABIC LETTER QAF ISOLATED FORM + 0x00f9: 0xfef5, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + 0x00fa: 0xfef6, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + 0x00fb: 0xfedd, # ARABIC LETTER LAM ISOLATED FORM + 0x00fc: 0xfed9, # ARABIC LETTER KAF ISOLATED FORM + 0x00fd: 0xfef1, # ARABIC LETTER YEH ISOLATED FORM + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: None, # UNDEFINED +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '\u066a' # 0x0025 -> ARABIC PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xb0' # 0x0080 -> DEGREE SIGN + '\xb7' # 0x0081 -> MIDDLE DOT + '\u2219' # 0x0082 -> BULLET OPERATOR + '\u221a' # 0x0083 -> SQUARE ROOT + '\u2592' # 0x0084 -> MEDIUM SHADE + '\u2500' # 0x0085 -> FORMS LIGHT HORIZONTAL + '\u2502' # 0x0086 -> FORMS LIGHT VERTICAL + '\u253c' # 0x0087 -> FORMS LIGHT VERTICAL AND HORIZONTAL + '\u2524' # 0x0088 -> FORMS LIGHT VERTICAL AND LEFT + '\u252c' # 0x0089 -> FORMS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x008a -> FORMS LIGHT VERTICAL AND RIGHT + '\u2534' # 0x008b -> FORMS LIGHT UP AND HORIZONTAL + '\u2510' # 0x008c -> FORMS LIGHT DOWN AND LEFT + '\u250c' # 0x008d -> FORMS LIGHT DOWN AND RIGHT + '\u2514' # 0x008e -> FORMS LIGHT UP AND RIGHT + '\u2518' # 0x008f -> FORMS LIGHT UP AND LEFT + '\u03b2' # 0x0090 -> GREEK SMALL BETA + '\u221e' # 0x0091 -> INFINITY + '\u03c6' # 0x0092 -> GREEK SMALL PHI + '\xb1' # 0x0093 -> PLUS-OR-MINUS SIGN + '\xbd' # 0x0094 -> FRACTION 1/2 + '\xbc' # 0x0095 -> FRACTION 1/4 + '\u2248' # 0x0096 -> ALMOST EQUAL TO + '\xab' # 0x0097 -> LEFT POINTING GUILLEMET + '\xbb' # 0x0098 -> RIGHT POINTING GUILLEMET + '\ufef7' # 0x0099 -> ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + '\ufef8' # 0x009a -> ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + '\ufffe' # 0x009b -> UNDEFINED + '\ufffe' # 0x009c -> UNDEFINED + '\ufefb' # 0x009d -> ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + '\ufefc' # 0x009e -> ARABIC LIGATURE LAM WITH ALEF FINAL FORM + '\ufffe' # 0x009f -> UNDEFINED + '\xa0' # 0x00a0 -> NON-BREAKING SPACE + '\xad' # 0x00a1 -> SOFT HYPHEN + '\ufe82' # 0x00a2 -> ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + '\xa3' # 0x00a3 -> POUND SIGN + '\xa4' # 0x00a4 -> CURRENCY SIGN + '\ufe84' # 0x00a5 -> ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + '\ufffe' # 0x00a6 -> UNDEFINED + '\ufffe' # 0x00a7 -> UNDEFINED + '\ufe8e' # 0x00a8 -> ARABIC LETTER ALEF FINAL FORM + '\ufe8f' # 0x00a9 -> ARABIC LETTER BEH ISOLATED FORM + '\ufe95' # 0x00aa -> ARABIC LETTER TEH ISOLATED FORM + '\ufe99' # 0x00ab -> ARABIC LETTER THEH ISOLATED FORM + '\u060c' # 0x00ac -> ARABIC COMMA + '\ufe9d' # 0x00ad -> ARABIC LETTER JEEM ISOLATED FORM + '\ufea1' # 0x00ae -> ARABIC LETTER HAH ISOLATED FORM + '\ufea5' # 0x00af -> ARABIC LETTER KHAH ISOLATED FORM + '\u0660' # 0x00b0 -> ARABIC-INDIC DIGIT ZERO + '\u0661' # 0x00b1 -> ARABIC-INDIC DIGIT ONE + '\u0662' # 0x00b2 -> ARABIC-INDIC DIGIT TWO + '\u0663' # 0x00b3 -> ARABIC-INDIC DIGIT THREE + '\u0664' # 0x00b4 -> ARABIC-INDIC DIGIT FOUR + '\u0665' # 0x00b5 -> ARABIC-INDIC DIGIT FIVE + '\u0666' # 0x00b6 -> ARABIC-INDIC DIGIT SIX + '\u0667' # 0x00b7 -> ARABIC-INDIC DIGIT SEVEN + '\u0668' # 0x00b8 -> ARABIC-INDIC DIGIT EIGHT + '\u0669' # 0x00b9 -> ARABIC-INDIC DIGIT NINE + '\ufed1' # 0x00ba -> ARABIC LETTER FEH ISOLATED FORM + '\u061b' # 0x00bb -> ARABIC SEMICOLON + '\ufeb1' # 0x00bc -> ARABIC LETTER SEEN ISOLATED FORM + '\ufeb5' # 0x00bd -> ARABIC LETTER SHEEN ISOLATED FORM + '\ufeb9' # 0x00be -> ARABIC LETTER SAD ISOLATED FORM + '\u061f' # 0x00bf -> ARABIC QUESTION MARK + '\xa2' # 0x00c0 -> CENT SIGN + '\ufe80' # 0x00c1 -> ARABIC LETTER HAMZA ISOLATED FORM + '\ufe81' # 0x00c2 -> ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + '\ufe83' # 0x00c3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + '\ufe85' # 0x00c4 -> ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + '\ufeca' # 0x00c5 -> ARABIC LETTER AIN FINAL FORM + '\ufe8b' # 0x00c6 -> ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + '\ufe8d' # 0x00c7 -> ARABIC LETTER ALEF ISOLATED FORM + '\ufe91' # 0x00c8 -> ARABIC LETTER BEH INITIAL FORM + '\ufe93' # 0x00c9 -> ARABIC LETTER TEH MARBUTA ISOLATED FORM + '\ufe97' # 0x00ca -> ARABIC LETTER TEH INITIAL FORM + '\ufe9b' # 0x00cb -> ARABIC LETTER THEH INITIAL FORM + '\ufe9f' # 0x00cc -> ARABIC LETTER JEEM INITIAL FORM + '\ufea3' # 0x00cd -> ARABIC LETTER HAH INITIAL FORM + '\ufea7' # 0x00ce -> ARABIC LETTER KHAH INITIAL FORM + '\ufea9' # 0x00cf -> ARABIC LETTER DAL ISOLATED FORM + '\ufeab' # 0x00d0 -> ARABIC LETTER THAL ISOLATED FORM + '\ufead' # 0x00d1 -> ARABIC LETTER REH ISOLATED FORM + '\ufeaf' # 0x00d2 -> ARABIC LETTER ZAIN ISOLATED FORM + '\ufeb3' # 0x00d3 -> ARABIC LETTER SEEN INITIAL FORM + '\ufeb7' # 0x00d4 -> ARABIC LETTER SHEEN INITIAL FORM + '\ufebb' # 0x00d5 -> ARABIC LETTER SAD INITIAL FORM + '\ufebf' # 0x00d6 -> ARABIC LETTER DAD INITIAL FORM + '\ufec1' # 0x00d7 -> ARABIC LETTER TAH ISOLATED FORM + '\ufec5' # 0x00d8 -> ARABIC LETTER ZAH ISOLATED FORM + '\ufecb' # 0x00d9 -> ARABIC LETTER AIN INITIAL FORM + '\ufecf' # 0x00da -> ARABIC LETTER GHAIN INITIAL FORM + '\xa6' # 0x00db -> BROKEN VERTICAL BAR + '\xac' # 0x00dc -> NOT SIGN + '\xf7' # 0x00dd -> DIVISION SIGN + '\xd7' # 0x00de -> MULTIPLICATION SIGN + '\ufec9' # 0x00df -> ARABIC LETTER AIN ISOLATED FORM + '\u0640' # 0x00e0 -> ARABIC TATWEEL + '\ufed3' # 0x00e1 -> ARABIC LETTER FEH INITIAL FORM + '\ufed7' # 0x00e2 -> ARABIC LETTER QAF INITIAL FORM + '\ufedb' # 0x00e3 -> ARABIC LETTER KAF INITIAL FORM + '\ufedf' # 0x00e4 -> ARABIC LETTER LAM INITIAL FORM + '\ufee3' # 0x00e5 -> ARABIC LETTER MEEM INITIAL FORM + '\ufee7' # 0x00e6 -> ARABIC LETTER NOON INITIAL FORM + '\ufeeb' # 0x00e7 -> ARABIC LETTER HEH INITIAL FORM + '\ufeed' # 0x00e8 -> ARABIC LETTER WAW ISOLATED FORM + '\ufeef' # 0x00e9 -> ARABIC LETTER ALEF MAKSURA ISOLATED FORM + '\ufef3' # 0x00ea -> ARABIC LETTER YEH INITIAL FORM + '\ufebd' # 0x00eb -> ARABIC LETTER DAD ISOLATED FORM + '\ufecc' # 0x00ec -> ARABIC LETTER AIN MEDIAL FORM + '\ufece' # 0x00ed -> ARABIC LETTER GHAIN FINAL FORM + '\ufecd' # 0x00ee -> ARABIC LETTER GHAIN ISOLATED FORM + '\ufee1' # 0x00ef -> ARABIC LETTER MEEM ISOLATED FORM + '\ufe7d' # 0x00f0 -> ARABIC SHADDA MEDIAL FORM + '\u0651' # 0x00f1 -> ARABIC SHADDAH + '\ufee5' # 0x00f2 -> ARABIC LETTER NOON ISOLATED FORM + '\ufee9' # 0x00f3 -> ARABIC LETTER HEH ISOLATED FORM + '\ufeec' # 0x00f4 -> ARABIC LETTER HEH MEDIAL FORM + '\ufef0' # 0x00f5 -> ARABIC LETTER ALEF MAKSURA FINAL FORM + '\ufef2' # 0x00f6 -> ARABIC LETTER YEH FINAL FORM + '\ufed0' # 0x00f7 -> ARABIC LETTER GHAIN MEDIAL FORM + '\ufed5' # 0x00f8 -> ARABIC LETTER QAF ISOLATED FORM + '\ufef5' # 0x00f9 -> ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + '\ufef6' # 0x00fa -> ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + '\ufedd' # 0x00fb -> ARABIC LETTER LAM ISOLATED FORM + '\ufed9' # 0x00fc -> ARABIC LETTER KAF ISOLATED FORM + '\ufef1' # 0x00fd -> ARABIC LETTER YEH ISOLATED FORM + '\u25a0' # 0x00fe -> BLACK SQUARE + '\ufffe' # 0x00ff -> UNDEFINED +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00a0, # NON-BREAKING SPACE + 0x00a2: 0x00c0, # CENT SIGN + 0x00a3: 0x00a3, # POUND SIGN + 0x00a4: 0x00a4, # CURRENCY SIGN + 0x00a6: 0x00db, # BROKEN VERTICAL BAR + 0x00ab: 0x0097, # LEFT POINTING GUILLEMET + 0x00ac: 0x00dc, # NOT SIGN + 0x00ad: 0x00a1, # SOFT HYPHEN + 0x00b0: 0x0080, # DEGREE SIGN + 0x00b1: 0x0093, # PLUS-OR-MINUS SIGN + 0x00b7: 0x0081, # MIDDLE DOT + 0x00bb: 0x0098, # RIGHT POINTING GUILLEMET + 0x00bc: 0x0095, # FRACTION 1/4 + 0x00bd: 0x0094, # FRACTION 1/2 + 0x00d7: 0x00de, # MULTIPLICATION SIGN + 0x00f7: 0x00dd, # DIVISION SIGN + 0x03b2: 0x0090, # GREEK SMALL BETA + 0x03c6: 0x0092, # GREEK SMALL PHI + 0x060c: 0x00ac, # ARABIC COMMA + 0x061b: 0x00bb, # ARABIC SEMICOLON + 0x061f: 0x00bf, # ARABIC QUESTION MARK + 0x0640: 0x00e0, # ARABIC TATWEEL + 0x0651: 0x00f1, # ARABIC SHADDAH + 0x0660: 0x00b0, # ARABIC-INDIC DIGIT ZERO + 0x0661: 0x00b1, # ARABIC-INDIC DIGIT ONE + 0x0662: 0x00b2, # ARABIC-INDIC DIGIT TWO + 0x0663: 0x00b3, # ARABIC-INDIC DIGIT THREE + 0x0664: 0x00b4, # ARABIC-INDIC DIGIT FOUR + 0x0665: 0x00b5, # ARABIC-INDIC DIGIT FIVE + 0x0666: 0x00b6, # ARABIC-INDIC DIGIT SIX + 0x0667: 0x00b7, # ARABIC-INDIC DIGIT SEVEN + 0x0668: 0x00b8, # ARABIC-INDIC DIGIT EIGHT + 0x0669: 0x00b9, # ARABIC-INDIC DIGIT NINE + 0x066a: 0x0025, # ARABIC PERCENT SIGN + 0x2219: 0x0082, # BULLET OPERATOR + 0x221a: 0x0083, # SQUARE ROOT + 0x221e: 0x0091, # INFINITY + 0x2248: 0x0096, # ALMOST EQUAL TO + 0x2500: 0x0085, # FORMS LIGHT HORIZONTAL + 0x2502: 0x0086, # FORMS LIGHT VERTICAL + 0x250c: 0x008d, # FORMS LIGHT DOWN AND RIGHT + 0x2510: 0x008c, # FORMS LIGHT DOWN AND LEFT + 0x2514: 0x008e, # FORMS LIGHT UP AND RIGHT + 0x2518: 0x008f, # FORMS LIGHT UP AND LEFT + 0x251c: 0x008a, # FORMS LIGHT VERTICAL AND RIGHT + 0x2524: 0x0088, # FORMS LIGHT VERTICAL AND LEFT + 0x252c: 0x0089, # FORMS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x008b, # FORMS LIGHT UP AND HORIZONTAL + 0x253c: 0x0087, # FORMS LIGHT VERTICAL AND HORIZONTAL + 0x2592: 0x0084, # MEDIUM SHADE + 0x25a0: 0x00fe, # BLACK SQUARE + 0xfe7d: 0x00f0, # ARABIC SHADDA MEDIAL FORM + 0xfe80: 0x00c1, # ARABIC LETTER HAMZA ISOLATED FORM + 0xfe81: 0x00c2, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + 0xfe82: 0x00a2, # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + 0xfe83: 0x00c3, # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + 0xfe84: 0x00a5, # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + 0xfe85: 0x00c4, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + 0xfe8b: 0x00c6, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + 0xfe8d: 0x00c7, # ARABIC LETTER ALEF ISOLATED FORM + 0xfe8e: 0x00a8, # ARABIC LETTER ALEF FINAL FORM + 0xfe8f: 0x00a9, # ARABIC LETTER BEH ISOLATED FORM + 0xfe91: 0x00c8, # ARABIC LETTER BEH INITIAL FORM + 0xfe93: 0x00c9, # ARABIC LETTER TEH MARBUTA ISOLATED FORM + 0xfe95: 0x00aa, # ARABIC LETTER TEH ISOLATED FORM + 0xfe97: 0x00ca, # ARABIC LETTER TEH INITIAL FORM + 0xfe99: 0x00ab, # ARABIC LETTER THEH ISOLATED FORM + 0xfe9b: 0x00cb, # ARABIC LETTER THEH INITIAL FORM + 0xfe9d: 0x00ad, # ARABIC LETTER JEEM ISOLATED FORM + 0xfe9f: 0x00cc, # ARABIC LETTER JEEM INITIAL FORM + 0xfea1: 0x00ae, # ARABIC LETTER HAH ISOLATED FORM + 0xfea3: 0x00cd, # ARABIC LETTER HAH INITIAL FORM + 0xfea5: 0x00af, # ARABIC LETTER KHAH ISOLATED FORM + 0xfea7: 0x00ce, # ARABIC LETTER KHAH INITIAL FORM + 0xfea9: 0x00cf, # ARABIC LETTER DAL ISOLATED FORM + 0xfeab: 0x00d0, # ARABIC LETTER THAL ISOLATED FORM + 0xfead: 0x00d1, # ARABIC LETTER REH ISOLATED FORM + 0xfeaf: 0x00d2, # ARABIC LETTER ZAIN ISOLATED FORM + 0xfeb1: 0x00bc, # ARABIC LETTER SEEN ISOLATED FORM + 0xfeb3: 0x00d3, # ARABIC LETTER SEEN INITIAL FORM + 0xfeb5: 0x00bd, # ARABIC LETTER SHEEN ISOLATED FORM + 0xfeb7: 0x00d4, # ARABIC LETTER SHEEN INITIAL FORM + 0xfeb9: 0x00be, # ARABIC LETTER SAD ISOLATED FORM + 0xfebb: 0x00d5, # ARABIC LETTER SAD INITIAL FORM + 0xfebd: 0x00eb, # ARABIC LETTER DAD ISOLATED FORM + 0xfebf: 0x00d6, # ARABIC LETTER DAD INITIAL FORM + 0xfec1: 0x00d7, # ARABIC LETTER TAH ISOLATED FORM + 0xfec5: 0x00d8, # ARABIC LETTER ZAH ISOLATED FORM + 0xfec9: 0x00df, # ARABIC LETTER AIN ISOLATED FORM + 0xfeca: 0x00c5, # ARABIC LETTER AIN FINAL FORM + 0xfecb: 0x00d9, # ARABIC LETTER AIN INITIAL FORM + 0xfecc: 0x00ec, # ARABIC LETTER AIN MEDIAL FORM + 0xfecd: 0x00ee, # ARABIC LETTER GHAIN ISOLATED FORM + 0xfece: 0x00ed, # ARABIC LETTER GHAIN FINAL FORM + 0xfecf: 0x00da, # ARABIC LETTER GHAIN INITIAL FORM + 0xfed0: 0x00f7, # ARABIC LETTER GHAIN MEDIAL FORM + 0xfed1: 0x00ba, # ARABIC LETTER FEH ISOLATED FORM + 0xfed3: 0x00e1, # ARABIC LETTER FEH INITIAL FORM + 0xfed5: 0x00f8, # ARABIC LETTER QAF ISOLATED FORM + 0xfed7: 0x00e2, # ARABIC LETTER QAF INITIAL FORM + 0xfed9: 0x00fc, # ARABIC LETTER KAF ISOLATED FORM + 0xfedb: 0x00e3, # ARABIC LETTER KAF INITIAL FORM + 0xfedd: 0x00fb, # ARABIC LETTER LAM ISOLATED FORM + 0xfedf: 0x00e4, # ARABIC LETTER LAM INITIAL FORM + 0xfee1: 0x00ef, # ARABIC LETTER MEEM ISOLATED FORM + 0xfee3: 0x00e5, # ARABIC LETTER MEEM INITIAL FORM + 0xfee5: 0x00f2, # ARABIC LETTER NOON ISOLATED FORM + 0xfee7: 0x00e6, # ARABIC LETTER NOON INITIAL FORM + 0xfee9: 0x00f3, # ARABIC LETTER HEH ISOLATED FORM + 0xfeeb: 0x00e7, # ARABIC LETTER HEH INITIAL FORM + 0xfeec: 0x00f4, # ARABIC LETTER HEH MEDIAL FORM + 0xfeed: 0x00e8, # ARABIC LETTER WAW ISOLATED FORM + 0xfeef: 0x00e9, # ARABIC LETTER ALEF MAKSURA ISOLATED FORM + 0xfef0: 0x00f5, # ARABIC LETTER ALEF MAKSURA FINAL FORM + 0xfef1: 0x00fd, # ARABIC LETTER YEH ISOLATED FORM + 0xfef2: 0x00f6, # ARABIC LETTER YEH FINAL FORM + 0xfef3: 0x00ea, # ARABIC LETTER YEH INITIAL FORM + 0xfef5: 0x00f9, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + 0xfef6: 0x00fa, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + 0xfef7: 0x0099, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + 0xfef8: 0x009a, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + 0xfefb: 0x009d, # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + 0xfefc: 0x009e, # ARABIC LIGATURE LAM WITH ALEF FINAL FORM +} diff --git a/venv/Lib/encodings/cp865.py b/venv/Lib/encodings/cp865.py new file mode 100644 index 00000000..6726cf3f --- /dev/null +++ b/venv/Lib/encodings/cp865.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP865.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp865', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00a4, # CURRENCY SIGN + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\u20a7' # 0x009e -> PESETA SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xa4' # 0x00af -> CURRENCY SIGN + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00af, # CURRENCY SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp866.py b/venv/Lib/encodings/cp866.py new file mode 100644 index 00000000..bec7ae39 --- /dev/null +++ b/venv/Lib/encodings/cp866.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP866.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp866', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x0081: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x0082: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x0083: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x0084: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x0085: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x0086: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x0087: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x0088: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x0089: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x008a: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x008b: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x008c: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x008d: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x008e: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x008f: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x0090: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x0091: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x0092: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x0093: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x0094: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x0095: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x0096: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x0097: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x0098: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x0099: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x009a: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x009b: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x009c: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x009d: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x009e: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009f: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a2: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00a3: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00a4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00a7: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00a8: 0x0438, # CYRILLIC SMALL LETTER I + 0x00a9: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00aa: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00ab: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00ac: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00ad: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00ae: 0x043e, # CYRILLIC SMALL LETTER O + 0x00af: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e1: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e2: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e3: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e4: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00e5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00e6: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00e7: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00e8: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00e9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00ea: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00eb: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00ec: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ed: 0x044d, # CYRILLIC SMALL LETTER E + 0x00ee: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00ef: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00f0: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00f1: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00f2: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00f3: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00f4: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x00f5: 0x0457, # CYRILLIC SMALL LETTER YI + 0x00f6: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x00f7: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x2116, # NUMERO SIGN + 0x00fd: 0x00a4, # CURRENCY SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0410' # 0x0080 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0x0081 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0x0082 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0x0083 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0x0084 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0x0085 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0x0086 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0x0087 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0x0088 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0x0089 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0x008a -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0x008b -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0x008c -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0x008d -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0x008e -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0x008f -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0x0090 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0x0091 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0x0092 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0x0093 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0x0094 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0x0095 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0x0096 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0x0097 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0x0098 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0x0099 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0x009a -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0x009b -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0x009c -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0x009d -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0x009e -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0x009f -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0x00a1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0x00a2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0x00a3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0x00a4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0x00a5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0x00a6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0x00a7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0x00a8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0x00a9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0x00aa -> CYRILLIC SMALL LETTER KA + '\u043b' # 0x00ab -> CYRILLIC SMALL LETTER EL + '\u043c' # 0x00ac -> CYRILLIC SMALL LETTER EM + '\u043d' # 0x00ad -> CYRILLIC SMALL LETTER EN + '\u043e' # 0x00ae -> CYRILLIC SMALL LETTER O + '\u043f' # 0x00af -> CYRILLIC SMALL LETTER PE + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u0440' # 0x00e0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0x00e1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0x00e2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0x00e3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0x00e4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0x00e5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0x00e6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0x00e7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0x00e8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0x00e9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0x00ea -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0x00eb -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0x00ec -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0x00ed -> CYRILLIC SMALL LETTER E + '\u044e' # 0x00ee -> CYRILLIC SMALL LETTER YU + '\u044f' # 0x00ef -> CYRILLIC SMALL LETTER YA + '\u0401' # 0x00f0 -> CYRILLIC CAPITAL LETTER IO + '\u0451' # 0x00f1 -> CYRILLIC SMALL LETTER IO + '\u0404' # 0x00f2 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0454' # 0x00f3 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0407' # 0x00f4 -> CYRILLIC CAPITAL LETTER YI + '\u0457' # 0x00f5 -> CYRILLIC SMALL LETTER YI + '\u040e' # 0x00f6 -> CYRILLIC CAPITAL LETTER SHORT U + '\u045e' # 0x00f7 -> CYRILLIC SMALL LETTER SHORT U + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u2116' # 0x00fc -> NUMERO SIGN + '\xa4' # 0x00fd -> CURRENCY SIGN + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00fd, # CURRENCY SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x0401: 0x00f0, # CYRILLIC CAPITAL LETTER IO + 0x0404: 0x00f2, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0407: 0x00f4, # CYRILLIC CAPITAL LETTER YI + 0x040e: 0x00f6, # CYRILLIC CAPITAL LETTER SHORT U + 0x0410: 0x0080, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x0081, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x0082, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x0083, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x0084, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x0085, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x0086, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x0087, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x0088, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x0089, # CYRILLIC CAPITAL LETTER SHORT I + 0x041a: 0x008a, # CYRILLIC CAPITAL LETTER KA + 0x041b: 0x008b, # CYRILLIC CAPITAL LETTER EL + 0x041c: 0x008c, # CYRILLIC CAPITAL LETTER EM + 0x041d: 0x008d, # CYRILLIC CAPITAL LETTER EN + 0x041e: 0x008e, # CYRILLIC CAPITAL LETTER O + 0x041f: 0x008f, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x0090, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x0091, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x0092, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x0093, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x0094, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x0095, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x0096, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x0097, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x0098, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x0099, # CYRILLIC CAPITAL LETTER SHCHA + 0x042a: 0x009a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042b: 0x009b, # CYRILLIC CAPITAL LETTER YERU + 0x042c: 0x009c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042d: 0x009d, # CYRILLIC CAPITAL LETTER E + 0x042e: 0x009e, # CYRILLIC CAPITAL LETTER YU + 0x042f: 0x009f, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A + 0x0431: 0x00a1, # CYRILLIC SMALL LETTER BE + 0x0432: 0x00a2, # CYRILLIC SMALL LETTER VE + 0x0433: 0x00a3, # CYRILLIC SMALL LETTER GHE + 0x0434: 0x00a4, # CYRILLIC SMALL LETTER DE + 0x0435: 0x00a5, # CYRILLIC SMALL LETTER IE + 0x0436: 0x00a6, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0x00a7, # CYRILLIC SMALL LETTER ZE + 0x0438: 0x00a8, # CYRILLIC SMALL LETTER I + 0x0439: 0x00a9, # CYRILLIC SMALL LETTER SHORT I + 0x043a: 0x00aa, # CYRILLIC SMALL LETTER KA + 0x043b: 0x00ab, # CYRILLIC SMALL LETTER EL + 0x043c: 0x00ac, # CYRILLIC SMALL LETTER EM + 0x043d: 0x00ad, # CYRILLIC SMALL LETTER EN + 0x043e: 0x00ae, # CYRILLIC SMALL LETTER O + 0x043f: 0x00af, # CYRILLIC SMALL LETTER PE + 0x0440: 0x00e0, # CYRILLIC SMALL LETTER ER + 0x0441: 0x00e1, # CYRILLIC SMALL LETTER ES + 0x0442: 0x00e2, # CYRILLIC SMALL LETTER TE + 0x0443: 0x00e3, # CYRILLIC SMALL LETTER U + 0x0444: 0x00e4, # CYRILLIC SMALL LETTER EF + 0x0445: 0x00e5, # CYRILLIC SMALL LETTER HA + 0x0446: 0x00e6, # CYRILLIC SMALL LETTER TSE + 0x0447: 0x00e7, # CYRILLIC SMALL LETTER CHE + 0x0448: 0x00e8, # CYRILLIC SMALL LETTER SHA + 0x0449: 0x00e9, # CYRILLIC SMALL LETTER SHCHA + 0x044a: 0x00ea, # CYRILLIC SMALL LETTER HARD SIGN + 0x044b: 0x00eb, # CYRILLIC SMALL LETTER YERU + 0x044c: 0x00ec, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044d: 0x00ed, # CYRILLIC SMALL LETTER E + 0x044e: 0x00ee, # CYRILLIC SMALL LETTER YU + 0x044f: 0x00ef, # CYRILLIC SMALL LETTER YA + 0x0451: 0x00f1, # CYRILLIC SMALL LETTER IO + 0x0454: 0x00f3, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0457: 0x00f5, # CYRILLIC SMALL LETTER YI + 0x045e: 0x00f7, # CYRILLIC SMALL LETTER SHORT U + 0x2116: 0x00fc, # NUMERO SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp869.py b/venv/Lib/encodings/cp869.py new file mode 100644 index 00000000..8d8a29b1 --- /dev/null +++ b/venv/Lib/encodings/cp869.py @@ -0,0 +1,689 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP869.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp869', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: None, # UNDEFINED + 0x0081: None, # UNDEFINED + 0x0082: None, # UNDEFINED + 0x0083: None, # UNDEFINED + 0x0084: None, # UNDEFINED + 0x0085: None, # UNDEFINED + 0x0086: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0087: None, # UNDEFINED + 0x0088: 0x00b7, # MIDDLE DOT + 0x0089: 0x00ac, # NOT SIGN + 0x008a: 0x00a6, # BROKEN BAR + 0x008b: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x008c: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x008d: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x008e: 0x2015, # HORIZONTAL BAR + 0x008f: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x0090: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x0091: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x0092: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x0093: None, # UNDEFINED + 0x0094: None, # UNDEFINED + 0x0095: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x0096: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x0097: 0x00a9, # COPYRIGHT SIGN + 0x0098: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0099: 0x00b2, # SUPERSCRIPT TWO + 0x009a: 0x00b3, # SUPERSCRIPT THREE + 0x009b: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x009e: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x009f: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00a0: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00a1: 0x0390, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x00a2: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00a3: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00a4: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x00a5: 0x0392, # GREEK CAPITAL LETTER BETA + 0x00a6: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00a7: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x00a8: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x00a9: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x00aa: 0x0397, # GREEK CAPITAL LETTER ETA + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ad: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x00b6: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x00b7: 0x039c, # GREEK CAPITAL LETTER MU + 0x00b8: 0x039d, # GREEK CAPITAL LETTER NU + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x039e, # GREEK CAPITAL LETTER XI + 0x00be: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x03a0, # GREEK CAPITAL LETTER PI + 0x00c7: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00d0: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x00d1: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x00d2: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00d3: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x00d4: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x00d5: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00d6: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00d7: 0x03b2, # GREEK SMALL LETTER BETA + 0x00d8: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00de: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b6, # GREEK SMALL LETTER ZETA + 0x00e1: 0x03b7, # GREEK SMALL LETTER ETA + 0x00e2: 0x03b8, # GREEK SMALL LETTER THETA + 0x00e3: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00e4: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00e5: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x00e6: 0x03bc, # GREEK SMALL LETTER MU + 0x00e7: 0x03bd, # GREEK SMALL LETTER NU + 0x00e8: 0x03be, # GREEK SMALL LETTER XI + 0x00e9: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00ea: 0x03c0, # GREEK SMALL LETTER PI + 0x00eb: 0x03c1, # GREEK SMALL LETTER RHO + 0x00ec: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00ed: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00ee: 0x03c4, # GREEK SMALL LETTER TAU + 0x00ef: 0x0384, # GREEK TONOS + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00f3: 0x03c6, # GREEK SMALL LETTER PHI + 0x00f4: 0x03c7, # GREEK SMALL LETTER CHI + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x03c8, # GREEK SMALL LETTER PSI + 0x00f7: 0x0385, # GREEK DIALYTIKA TONOS + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00fb: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00fc: 0x03b0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x00fd: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\ufffe' # 0x0080 -> UNDEFINED + '\ufffe' # 0x0081 -> UNDEFINED + '\ufffe' # 0x0082 -> UNDEFINED + '\ufffe' # 0x0083 -> UNDEFINED + '\ufffe' # 0x0084 -> UNDEFINED + '\ufffe' # 0x0085 -> UNDEFINED + '\u0386' # 0x0086 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\ufffe' # 0x0087 -> UNDEFINED + '\xb7' # 0x0088 -> MIDDLE DOT + '\xac' # 0x0089 -> NOT SIGN + '\xa6' # 0x008a -> BROKEN BAR + '\u2018' # 0x008b -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x008c -> RIGHT SINGLE QUOTATION MARK + '\u0388' # 0x008d -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u2015' # 0x008e -> HORIZONTAL BAR + '\u0389' # 0x008f -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0x0090 -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\u03aa' # 0x0091 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u038c' # 0x0092 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\ufffe' # 0x0093 -> UNDEFINED + '\ufffe' # 0x0094 -> UNDEFINED + '\u038e' # 0x0095 -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u03ab' # 0x0096 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\xa9' # 0x0097 -> COPYRIGHT SIGN + '\u038f' # 0x0098 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\xb2' # 0x0099 -> SUPERSCRIPT TWO + '\xb3' # 0x009a -> SUPERSCRIPT THREE + '\u03ac' # 0x009b -> GREEK SMALL LETTER ALPHA WITH TONOS + '\xa3' # 0x009c -> POUND SIGN + '\u03ad' # 0x009d -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0x009e -> GREEK SMALL LETTER ETA WITH TONOS + '\u03af' # 0x009f -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03ca' # 0x00a0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u0390' # 0x00a1 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u03cc' # 0x00a2 -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0x00a3 -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u0391' # 0x00a4 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0x00a5 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0x00a6 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0x00a7 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0x00a8 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0x00a9 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0x00aa -> GREEK CAPITAL LETTER ETA + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\u0398' # 0x00ac -> GREEK CAPITAL LETTER THETA + '\u0399' # 0x00ad -> GREEK CAPITAL LETTER IOTA + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u039a' # 0x00b5 -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0x00b6 -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0x00b7 -> GREEK CAPITAL LETTER MU + '\u039d' # 0x00b8 -> GREEK CAPITAL LETTER NU + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u039e' # 0x00bd -> GREEK CAPITAL LETTER XI + '\u039f' # 0x00be -> GREEK CAPITAL LETTER OMICRON + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u03a0' # 0x00c6 -> GREEK CAPITAL LETTER PI + '\u03a1' # 0x00c7 -> GREEK CAPITAL LETTER RHO + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u03a3' # 0x00cf -> GREEK CAPITAL LETTER SIGMA + '\u03a4' # 0x00d0 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0x00d1 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0x00d2 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0x00d3 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0x00d4 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0x00d5 -> GREEK CAPITAL LETTER OMEGA + '\u03b1' # 0x00d6 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0x00d7 -> GREEK SMALL LETTER BETA + '\u03b3' # 0x00d8 -> GREEK SMALL LETTER GAMMA + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u03b4' # 0x00dd -> GREEK SMALL LETTER DELTA + '\u03b5' # 0x00de -> GREEK SMALL LETTER EPSILON + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b6' # 0x00e0 -> GREEK SMALL LETTER ZETA + '\u03b7' # 0x00e1 -> GREEK SMALL LETTER ETA + '\u03b8' # 0x00e2 -> GREEK SMALL LETTER THETA + '\u03b9' # 0x00e3 -> GREEK SMALL LETTER IOTA + '\u03ba' # 0x00e4 -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0x00e5 -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0x00e6 -> GREEK SMALL LETTER MU + '\u03bd' # 0x00e7 -> GREEK SMALL LETTER NU + '\u03be' # 0x00e8 -> GREEK SMALL LETTER XI + '\u03bf' # 0x00e9 -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0x00ea -> GREEK SMALL LETTER PI + '\u03c1' # 0x00eb -> GREEK SMALL LETTER RHO + '\u03c3' # 0x00ec -> GREEK SMALL LETTER SIGMA + '\u03c2' # 0x00ed -> GREEK SMALL LETTER FINAL SIGMA + '\u03c4' # 0x00ee -> GREEK SMALL LETTER TAU + '\u0384' # 0x00ef -> GREEK TONOS + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u03c5' # 0x00f2 -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0x00f3 -> GREEK SMALL LETTER PHI + '\u03c7' # 0x00f4 -> GREEK SMALL LETTER CHI + '\xa7' # 0x00f5 -> SECTION SIGN + '\u03c8' # 0x00f6 -> GREEK SMALL LETTER PSI + '\u0385' # 0x00f7 -> GREEK DIALYTIKA TONOS + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\u03c9' # 0x00fa -> GREEK SMALL LETTER OMEGA + '\u03cb' # 0x00fb -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03b0' # 0x00fc -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\u03ce' # 0x00fd -> GREEK SMALL LETTER OMEGA WITH TONOS + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a3: 0x009c, # POUND SIGN + 0x00a6: 0x008a, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x0097, # COPYRIGHT SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x0089, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x0099, # SUPERSCRIPT TWO + 0x00b3: 0x009a, # SUPERSCRIPT THREE + 0x00b7: 0x0088, # MIDDLE DOT + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x0384: 0x00ef, # GREEK TONOS + 0x0385: 0x00f7, # GREEK DIALYTIKA TONOS + 0x0386: 0x0086, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0388: 0x008d, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0x008f, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038a: 0x0090, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038c: 0x0092, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038e: 0x0095, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038f: 0x0098, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0390: 0x00a1, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x0391: 0x00a4, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0x00a5, # GREEK CAPITAL LETTER BETA + 0x0393: 0x00a6, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0x00a7, # GREEK CAPITAL LETTER DELTA + 0x0395: 0x00a8, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0x00a9, # GREEK CAPITAL LETTER ZETA + 0x0397: 0x00aa, # GREEK CAPITAL LETTER ETA + 0x0398: 0x00ac, # GREEK CAPITAL LETTER THETA + 0x0399: 0x00ad, # GREEK CAPITAL LETTER IOTA + 0x039a: 0x00b5, # GREEK CAPITAL LETTER KAPPA + 0x039b: 0x00b6, # GREEK CAPITAL LETTER LAMDA + 0x039c: 0x00b7, # GREEK CAPITAL LETTER MU + 0x039d: 0x00b8, # GREEK CAPITAL LETTER NU + 0x039e: 0x00bd, # GREEK CAPITAL LETTER XI + 0x039f: 0x00be, # GREEK CAPITAL LETTER OMICRON + 0x03a0: 0x00c6, # GREEK CAPITAL LETTER PI + 0x03a1: 0x00c7, # GREEK CAPITAL LETTER RHO + 0x03a3: 0x00cf, # GREEK CAPITAL LETTER SIGMA + 0x03a4: 0x00d0, # GREEK CAPITAL LETTER TAU + 0x03a5: 0x00d1, # GREEK CAPITAL LETTER UPSILON + 0x03a6: 0x00d2, # GREEK CAPITAL LETTER PHI + 0x03a7: 0x00d3, # GREEK CAPITAL LETTER CHI + 0x03a8: 0x00d4, # GREEK CAPITAL LETTER PSI + 0x03a9: 0x00d5, # GREEK CAPITAL LETTER OMEGA + 0x03aa: 0x0091, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03ab: 0x0096, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03ac: 0x009b, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03ad: 0x009d, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03ae: 0x009e, # GREEK SMALL LETTER ETA WITH TONOS + 0x03af: 0x009f, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03b0: 0x00fc, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x03b1: 0x00d6, # GREEK SMALL LETTER ALPHA + 0x03b2: 0x00d7, # GREEK SMALL LETTER BETA + 0x03b3: 0x00d8, # GREEK SMALL LETTER GAMMA + 0x03b4: 0x00dd, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00de, # GREEK SMALL LETTER EPSILON + 0x03b6: 0x00e0, # GREEK SMALL LETTER ZETA + 0x03b7: 0x00e1, # GREEK SMALL LETTER ETA + 0x03b8: 0x00e2, # GREEK SMALL LETTER THETA + 0x03b9: 0x00e3, # GREEK SMALL LETTER IOTA + 0x03ba: 0x00e4, # GREEK SMALL LETTER KAPPA + 0x03bb: 0x00e5, # GREEK SMALL LETTER LAMDA + 0x03bc: 0x00e6, # GREEK SMALL LETTER MU + 0x03bd: 0x00e7, # GREEK SMALL LETTER NU + 0x03be: 0x00e8, # GREEK SMALL LETTER XI + 0x03bf: 0x00e9, # GREEK SMALL LETTER OMICRON + 0x03c0: 0x00ea, # GREEK SMALL LETTER PI + 0x03c1: 0x00eb, # GREEK SMALL LETTER RHO + 0x03c2: 0x00ed, # GREEK SMALL LETTER FINAL SIGMA + 0x03c3: 0x00ec, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00ee, # GREEK SMALL LETTER TAU + 0x03c5: 0x00f2, # GREEK SMALL LETTER UPSILON + 0x03c6: 0x00f3, # GREEK SMALL LETTER PHI + 0x03c7: 0x00f4, # GREEK SMALL LETTER CHI + 0x03c8: 0x00f6, # GREEK SMALL LETTER PSI + 0x03c9: 0x00fa, # GREEK SMALL LETTER OMEGA + 0x03ca: 0x00a0, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03cb: 0x00fb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03cc: 0x00a2, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03cd: 0x00a3, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03ce: 0x00fd, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x2015: 0x008e, # HORIZONTAL BAR + 0x2018: 0x008b, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x008c, # RIGHT SINGLE QUOTATION MARK + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/venv/Lib/encodings/cp874.py b/venv/Lib/encodings/cp874.py new file mode 100644 index 00000000..59bfcbc9 --- /dev/null +++ b/venv/Lib/encodings/cp874.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp874 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP874.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp874', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\ufffe' # 0x82 -> UNDEFINED + '\ufffe' # 0x83 -> UNDEFINED + '\ufffe' # 0x84 -> UNDEFINED + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\ufffe' # 0x86 -> UNDEFINED + '\ufffe' # 0x87 -> UNDEFINED + '\ufffe' # 0x88 -> UNDEFINED + '\ufffe' # 0x89 -> UNDEFINED + '\ufffe' # 0x8A -> UNDEFINED + '\ufffe' # 0x8B -> UNDEFINED + '\ufffe' # 0x8C -> UNDEFINED + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\ufffe' # 0x99 -> UNDEFINED + '\ufffe' # 0x9A -> UNDEFINED + '\ufffe' # 0x9B -> UNDEFINED + '\ufffe' # 0x9C -> UNDEFINED + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\ufffe' # 0x9F -> UNDEFINED + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + '\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + '\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + '\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + '\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + '\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + '\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + '\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + '\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + '\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + '\u0e0b' # 0xAB -> THAI CHARACTER SO SO + '\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + '\u0e0d' # 0xAD -> THAI CHARACTER YO YING + '\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + '\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + '\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + '\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + '\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + '\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + '\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + '\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + '\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + '\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + '\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + '\u0e19' # 0xB9 -> THAI CHARACTER NO NU + '\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + '\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + '\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + '\u0e1d' # 0xBD -> THAI CHARACTER FO FA + '\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + '\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + '\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + '\u0e21' # 0xC1 -> THAI CHARACTER MO MA + '\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + '\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + '\u0e24' # 0xC4 -> THAI CHARACTER RU + '\u0e25' # 0xC5 -> THAI CHARACTER LO LING + '\u0e26' # 0xC6 -> THAI CHARACTER LU + '\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + '\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + '\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + '\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + '\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + '\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + '\u0e2d' # 0xCD -> THAI CHARACTER O ANG + '\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + '\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + '\u0e30' # 0xD0 -> THAI CHARACTER SARA A + '\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + '\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + '\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + '\u0e34' # 0xD4 -> THAI CHARACTER SARA I + '\u0e35' # 0xD5 -> THAI CHARACTER SARA II + '\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + '\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + '\u0e38' # 0xD8 -> THAI CHARACTER SARA U + '\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + '\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + '\ufffe' # 0xDB -> UNDEFINED + '\ufffe' # 0xDC -> UNDEFINED + '\ufffe' # 0xDD -> UNDEFINED + '\ufffe' # 0xDE -> UNDEFINED + '\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + '\u0e40' # 0xE0 -> THAI CHARACTER SARA E + '\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + '\u0e42' # 0xE2 -> THAI CHARACTER SARA O + '\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + '\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + '\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + '\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + '\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + '\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + '\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + '\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + '\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + '\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + '\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + '\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + '\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + '\u0e50' # 0xF0 -> THAI DIGIT ZERO + '\u0e51' # 0xF1 -> THAI DIGIT ONE + '\u0e52' # 0xF2 -> THAI DIGIT TWO + '\u0e53' # 0xF3 -> THAI DIGIT THREE + '\u0e54' # 0xF4 -> THAI DIGIT FOUR + '\u0e55' # 0xF5 -> THAI DIGIT FIVE + '\u0e56' # 0xF6 -> THAI DIGIT SIX + '\u0e57' # 0xF7 -> THAI DIGIT SEVEN + '\u0e58' # 0xF8 -> THAI DIGIT EIGHT + '\u0e59' # 0xF9 -> THAI DIGIT NINE + '\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + '\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + '\ufffe' # 0xFC -> UNDEFINED + '\ufffe' # 0xFD -> UNDEFINED + '\ufffe' # 0xFE -> UNDEFINED + '\ufffe' # 0xFF -> UNDEFINED +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp875.py b/venv/Lib/encodings/cp875.py new file mode 100644 index 00000000..c25a5a43 --- /dev/null +++ b/venv/Lib/encodings/cp875.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp875 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP875.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp875', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\u0391' # 0x41 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0x42 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0x43 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0x44 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0x45 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0x46 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0x47 -> GREEK CAPITAL LETTER ETA + '\u0398' # 0x48 -> GREEK CAPITAL LETTER THETA + '\u0399' # 0x49 -> GREEK CAPITAL LETTER IOTA + '[' # 0x4A -> LEFT SQUARE BRACKET + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '!' # 0x4F -> EXCLAMATION MARK + '&' # 0x50 -> AMPERSAND + '\u039a' # 0x51 -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0x52 -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0x53 -> GREEK CAPITAL LETTER MU + '\u039d' # 0x54 -> GREEK CAPITAL LETTER NU + '\u039e' # 0x55 -> GREEK CAPITAL LETTER XI + '\u039f' # 0x56 -> GREEK CAPITAL LETTER OMICRON + '\u03a0' # 0x57 -> GREEK CAPITAL LETTER PI + '\u03a1' # 0x58 -> GREEK CAPITAL LETTER RHO + '\u03a3' # 0x59 -> GREEK CAPITAL LETTER SIGMA + ']' # 0x5A -> RIGHT SQUARE BRACKET + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '^' # 0x5F -> CIRCUMFLEX ACCENT + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\u03a4' # 0x62 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0x63 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0x64 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0x65 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0x66 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0x67 -> GREEK CAPITAL LETTER OMEGA + '\u03aa' # 0x68 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u03ab' # 0x69 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '|' # 0x6A -> VERTICAL LINE + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xa8' # 0x70 -> DIAERESIS + '\u0386' # 0x71 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\u0388' # 0x72 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0389' # 0x73 -> GREEK CAPITAL LETTER ETA WITH TONOS + '\xa0' # 0x74 -> NO-BREAK SPACE + '\u038a' # 0x75 -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\u038c' # 0x76 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\u038e' # 0x77 -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u038f' # 0x78 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\u0385' # 0x80 -> GREEK DIALYTIKA TONOS + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\u03b1' # 0x8A -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0x8B -> GREEK SMALL LETTER BETA + '\u03b3' # 0x8C -> GREEK SMALL LETTER GAMMA + '\u03b4' # 0x8D -> GREEK SMALL LETTER DELTA + '\u03b5' # 0x8E -> GREEK SMALL LETTER EPSILON + '\u03b6' # 0x8F -> GREEK SMALL LETTER ZETA + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\u03b7' # 0x9A -> GREEK SMALL LETTER ETA + '\u03b8' # 0x9B -> GREEK SMALL LETTER THETA + '\u03b9' # 0x9C -> GREEK SMALL LETTER IOTA + '\u03ba' # 0x9D -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0x9E -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0x9F -> GREEK SMALL LETTER MU + '\xb4' # 0xA0 -> ACUTE ACCENT + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\u03bd' # 0xAA -> GREEK SMALL LETTER NU + '\u03be' # 0xAB -> GREEK SMALL LETTER XI + '\u03bf' # 0xAC -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0xAD -> GREEK SMALL LETTER PI + '\u03c1' # 0xAE -> GREEK SMALL LETTER RHO + '\u03c3' # 0xAF -> GREEK SMALL LETTER SIGMA + '\xa3' # 0xB0 -> POUND SIGN + '\u03ac' # 0xB1 -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u03ad' # 0xB2 -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0xB3 -> GREEK SMALL LETTER ETA WITH TONOS + '\u03ca' # 0xB4 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03af' # 0xB5 -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03cc' # 0xB6 -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0xB7 -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03cb' # 0xB8 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03ce' # 0xB9 -> GREEK SMALL LETTER OMEGA WITH TONOS + '\u03c2' # 0xBA -> GREEK SMALL LETTER FINAL SIGMA + '\u03c4' # 0xBB -> GREEK SMALL LETTER TAU + '\u03c5' # 0xBC -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0xBD -> GREEK SMALL LETTER PHI + '\u03c7' # 0xBE -> GREEK SMALL LETTER CHI + '\u03c8' # 0xBF -> GREEK SMALL LETTER PSI + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\u03c9' # 0xCB -> GREEK SMALL LETTER OMEGA + '\u0390' # 0xCC -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u03b0' # 0xCD -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\u2018' # 0xCE -> LEFT SINGLE QUOTATION MARK + '\u2015' # 0xCF -> HORIZONTAL BAR + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb1' # 0xDA -> PLUS-MINUS SIGN + '\xbd' # 0xDB -> VULGAR FRACTION ONE HALF + '\x1a' # 0xDC -> SUBSTITUTE + '\u0387' # 0xDD -> GREEK ANO TELEIA + '\u2019' # 0xDE -> RIGHT SINGLE QUOTATION MARK + '\xa6' # 0xDF -> BROKEN BAR + '\\' # 0xE0 -> REVERSE SOLIDUS + '\x1a' # 0xE1 -> SUBSTITUTE + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xa7' # 0xEB -> SECTION SIGN + '\x1a' # 0xEC -> SUBSTITUTE + '\x1a' # 0xED -> SUBSTITUTE + '\xab' # 0xEE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xEF -> NOT SIGN + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xa9' # 0xFB -> COPYRIGHT SIGN + '\x1a' # 0xFC -> SUBSTITUTE + '\x1a' # 0xFD -> SUBSTITUTE + '\xbb' # 0xFE -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/cp932.py b/venv/Lib/encodings/cp932.py new file mode 100644 index 00000000..e01f59b7 --- /dev/null +++ b/venv/Lib/encodings/cp932.py @@ -0,0 +1,39 @@ +# +# cp932.py: Python Unicode Codec for CP932 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('cp932') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='cp932', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/cp949.py b/venv/Lib/encodings/cp949.py new file mode 100644 index 00000000..627c8712 --- /dev/null +++ b/venv/Lib/encodings/cp949.py @@ -0,0 +1,39 @@ +# +# cp949.py: Python Unicode Codec for CP949 +# +# Written by Hye-Shik Chang +# + +import _codecs_kr, codecs +import _multibytecodec as mbc + +codec = _codecs_kr.getcodec('cp949') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='cp949', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/cp950.py b/venv/Lib/encodings/cp950.py new file mode 100644 index 00000000..39eec5ed --- /dev/null +++ b/venv/Lib/encodings/cp950.py @@ -0,0 +1,39 @@ +# +# cp950.py: Python Unicode Codec for CP950 +# +# Written by Hye-Shik Chang +# + +import _codecs_tw, codecs +import _multibytecodec as mbc + +codec = _codecs_tw.getcodec('cp950') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='cp950', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/euc_jis_2004.py b/venv/Lib/encodings/euc_jis_2004.py new file mode 100644 index 00000000..72b87aea --- /dev/null +++ b/venv/Lib/encodings/euc_jis_2004.py @@ -0,0 +1,39 @@ +# +# euc_jis_2004.py: Python Unicode Codec for EUC_JIS_2004 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('euc_jis_2004') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='euc_jis_2004', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/euc_jisx0213.py b/venv/Lib/encodings/euc_jisx0213.py new file mode 100644 index 00000000..cc47d041 --- /dev/null +++ b/venv/Lib/encodings/euc_jisx0213.py @@ -0,0 +1,39 @@ +# +# euc_jisx0213.py: Python Unicode Codec for EUC_JISX0213 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('euc_jisx0213') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='euc_jisx0213', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/euc_jp.py b/venv/Lib/encodings/euc_jp.py new file mode 100644 index 00000000..7bcbe414 --- /dev/null +++ b/venv/Lib/encodings/euc_jp.py @@ -0,0 +1,39 @@ +# +# euc_jp.py: Python Unicode Codec for EUC_JP +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('euc_jp') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='euc_jp', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/euc_kr.py b/venv/Lib/encodings/euc_kr.py new file mode 100644 index 00000000..c1fb1260 --- /dev/null +++ b/venv/Lib/encodings/euc_kr.py @@ -0,0 +1,39 @@ +# +# euc_kr.py: Python Unicode Codec for EUC_KR +# +# Written by Hye-Shik Chang +# + +import _codecs_kr, codecs +import _multibytecodec as mbc + +codec = _codecs_kr.getcodec('euc_kr') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='euc_kr', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/gb18030.py b/venv/Lib/encodings/gb18030.py new file mode 100644 index 00000000..34fb6c36 --- /dev/null +++ b/venv/Lib/encodings/gb18030.py @@ -0,0 +1,39 @@ +# +# gb18030.py: Python Unicode Codec for GB18030 +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('gb18030') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='gb18030', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/gb2312.py b/venv/Lib/encodings/gb2312.py new file mode 100644 index 00000000..3c3b837d --- /dev/null +++ b/venv/Lib/encodings/gb2312.py @@ -0,0 +1,39 @@ +# +# gb2312.py: Python Unicode Codec for GB2312 +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('gb2312') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='gb2312', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/gbk.py b/venv/Lib/encodings/gbk.py new file mode 100644 index 00000000..1b45db89 --- /dev/null +++ b/venv/Lib/encodings/gbk.py @@ -0,0 +1,39 @@ +# +# gbk.py: Python Unicode Codec for GBK +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('gbk') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='gbk', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/hex_codec.py b/venv/Lib/encodings/hex_codec.py new file mode 100644 index 00000000..9fb10728 --- /dev/null +++ b/venv/Lib/encodings/hex_codec.py @@ -0,0 +1,55 @@ +"""Python 'hex_codec' Codec - 2-digit hex content transfer encoding. + +This codec de/encodes from bytes to bytes. + +Written by Marc-Andre Lemburg (mal@lemburg.com). +""" + +import codecs +import binascii + +### Codec APIs + +def hex_encode(input, errors='strict'): + assert errors == 'strict' + return (binascii.b2a_hex(input), len(input)) + +def hex_decode(input, errors='strict'): + assert errors == 'strict' + return (binascii.a2b_hex(input), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return hex_encode(input, errors) + def decode(self, input, errors='strict'): + return hex_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + assert self.errors == 'strict' + return binascii.b2a_hex(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + assert self.errors == 'strict' + return binascii.a2b_hex(input) + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='hex', + encode=hex_encode, + decode=hex_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) diff --git a/venv/Lib/encodings/hp_roman8.py b/venv/Lib/encodings/hp_roman8.py new file mode 100644 index 00000000..58de1033 --- /dev/null +++ b/venv/Lib/encodings/hp_roman8.py @@ -0,0 +1,314 @@ +""" Python Character Mapping Codec generated from 'hp_roman8.txt' with gencodec.py. + + Based on data from ftp://dkuug.dk/i18n/charmaps/HP-ROMAN8 (Keld Simonsen) + + Original source: LaserJet IIP Printer User's Manual HP part no + 33471-90901, Hewlet-Packard, June 1989. + + (Used with permission) + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='hp-roman8', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xc0' # 0xA1 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc2' # 0xA2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc8' # 0xA3 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xca' # 0xA4 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xA5 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xce' # 0xA6 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xA7 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xb4' # 0xA8 -> ACUTE ACCENT + '\u02cb' # 0xA9 -> MODIFIER LETTER GRAVE ACCENT (MANDARIN CHINESE FOURTH TONE) + '\u02c6' # 0xAA -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\xa8' # 0xAB -> DIAERESIS + '\u02dc' # 0xAC -> SMALL TILDE + '\xd9' # 0xAD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xdb' # 0xAE -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\u20a4' # 0xAF -> LIRA SIGN + '\xaf' # 0xB0 -> MACRON + '\xdd' # 0xB1 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xfd' # 0xB2 -> LATIN SMALL LETTER Y WITH ACUTE + '\xb0' # 0xB3 -> DEGREE SIGN + '\xc7' # 0xB4 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xe7' # 0xB5 -> LATIN SMALL LETTER C WITH CEDILLA + '\xd1' # 0xB6 -> LATIN CAPITAL LETTER N WITH TILDE + '\xf1' # 0xB7 -> LATIN SMALL LETTER N WITH TILDE + '\xa1' # 0xB8 -> INVERTED EXCLAMATION MARK + '\xbf' # 0xB9 -> INVERTED QUESTION MARK + '\xa4' # 0xBA -> CURRENCY SIGN + '\xa3' # 0xBB -> POUND SIGN + '\xa5' # 0xBC -> YEN SIGN + '\xa7' # 0xBD -> SECTION SIGN + '\u0192' # 0xBE -> LATIN SMALL LETTER F WITH HOOK + '\xa2' # 0xBF -> CENT SIGN + '\xe2' # 0xC0 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xea' # 0xC1 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xf4' # 0xC2 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xfb' # 0xC3 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xe1' # 0xC4 -> LATIN SMALL LETTER A WITH ACUTE + '\xe9' # 0xC5 -> LATIN SMALL LETTER E WITH ACUTE + '\xf3' # 0xC6 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0xC7 -> LATIN SMALL LETTER U WITH ACUTE + '\xe0' # 0xC8 -> LATIN SMALL LETTER A WITH GRAVE + '\xe8' # 0xC9 -> LATIN SMALL LETTER E WITH GRAVE + '\xf2' # 0xCA -> LATIN SMALL LETTER O WITH GRAVE + '\xf9' # 0xCB -> LATIN SMALL LETTER U WITH GRAVE + '\xe4' # 0xCC -> LATIN SMALL LETTER A WITH DIAERESIS + '\xeb' # 0xCD -> LATIN SMALL LETTER E WITH DIAERESIS + '\xf6' # 0xCE -> LATIN SMALL LETTER O WITH DIAERESIS + '\xfc' # 0xCF -> LATIN SMALL LETTER U WITH DIAERESIS + '\xc5' # 0xD0 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xee' # 0xD1 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xd8' # 0xD2 -> LATIN CAPITAL LETTER O WITH STROKE + '\xc6' # 0xD3 -> LATIN CAPITAL LETTER AE + '\xe5' # 0xD4 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xed' # 0xD5 -> LATIN SMALL LETTER I WITH ACUTE + '\xf8' # 0xD6 -> LATIN SMALL LETTER O WITH STROKE + '\xe6' # 0xD7 -> LATIN SMALL LETTER AE + '\xc4' # 0xD8 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xec' # 0xD9 -> LATIN SMALL LETTER I WITH GRAVE + '\xd6' # 0xDA -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0xDB -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xc9' # 0xDC -> LATIN CAPITAL LETTER E WITH ACUTE + '\xef' # 0xDD -> LATIN SMALL LETTER I WITH DIAERESIS + '\xdf' # 0xDE -> LATIN SMALL LETTER SHARP S (GERMAN) + '\xd4' # 0xDF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xc1' # 0xE0 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0xE1 -> LATIN CAPITAL LETTER A WITH TILDE + '\xe3' # 0xE2 -> LATIN SMALL LETTER A WITH TILDE + '\xd0' # 0xE3 -> LATIN CAPITAL LETTER ETH (ICELANDIC) + '\xf0' # 0xE4 -> LATIN SMALL LETTER ETH (ICELANDIC) + '\xcd' # 0xE5 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xcc' # 0xE6 -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xE7 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd2' # 0xE8 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd5' # 0xE9 -> LATIN CAPITAL LETTER O WITH TILDE + '\xf5' # 0xEA -> LATIN SMALL LETTER O WITH TILDE + '\u0160' # 0xEB -> LATIN CAPITAL LETTER S WITH CARON + '\u0161' # 0xEC -> LATIN SMALL LETTER S WITH CARON + '\xda' # 0xED -> LATIN CAPITAL LETTER U WITH ACUTE + '\u0178' # 0xEE -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xff' # 0xEF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xde' # 0xF0 -> LATIN CAPITAL LETTER THORN (ICELANDIC) + '\xfe' # 0xF1 -> LATIN SMALL LETTER THORN (ICELANDIC) + '\xb7' # 0xF2 -> MIDDLE DOT + '\xb5' # 0xF3 -> MICRO SIGN + '\xb6' # 0xF4 -> PILCROW SIGN + '\xbe' # 0xF5 -> VULGAR FRACTION THREE QUARTERS + '\u2014' # 0xF6 -> EM DASH + '\xbc' # 0xF7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xF8 -> VULGAR FRACTION ONE HALF + '\xaa' # 0xF9 -> FEMININE ORDINAL INDICATOR + '\xba' # 0xFA -> MASCULINE ORDINAL INDICATOR + '\xab' # 0xFB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u25a0' # 0xFC -> BLACK SQUARE + '\xbb' # 0xFD -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xb1' # 0xFE -> PLUS-MINUS SIGN + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/hz.py b/venv/Lib/encodings/hz.py new file mode 100644 index 00000000..383442a3 --- /dev/null +++ b/venv/Lib/encodings/hz.py @@ -0,0 +1,39 @@ +# +# hz.py: Python Unicode Codec for HZ +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('hz') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='hz', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/idna.py b/venv/Lib/encodings/idna.py new file mode 100644 index 00000000..ea405851 --- /dev/null +++ b/venv/Lib/encodings/idna.py @@ -0,0 +1,309 @@ +# This module implements the RFCs 3490 (IDNA) and 3491 (Nameprep) + +import stringprep, re, codecs +from unicodedata import ucd_3_2_0 as unicodedata + +# IDNA section 3.1 +dots = re.compile("[\u002E\u3002\uFF0E\uFF61]") + +# IDNA section 5 +ace_prefix = b"xn--" +sace_prefix = "xn--" + +# This assumes query strings, so AllowUnassigned is true +def nameprep(label): + # Map + newlabel = [] + for c in label: + if stringprep.in_table_b1(c): + # Map to nothing + continue + newlabel.append(stringprep.map_table_b2(c)) + label = "".join(newlabel) + + # Normalize + label = unicodedata.normalize("NFKC", label) + + # Prohibit + for c in label: + if stringprep.in_table_c12(c) or \ + stringprep.in_table_c22(c) or \ + stringprep.in_table_c3(c) or \ + stringprep.in_table_c4(c) or \ + stringprep.in_table_c5(c) or \ + stringprep.in_table_c6(c) or \ + stringprep.in_table_c7(c) or \ + stringprep.in_table_c8(c) or \ + stringprep.in_table_c9(c): + raise UnicodeError("Invalid character %r" % c) + + # Check bidi + RandAL = [stringprep.in_table_d1(x) for x in label] + for c in RandAL: + if c: + # There is a RandAL char in the string. Must perform further + # tests: + # 1) The characters in section 5.8 MUST be prohibited. + # This is table C.8, which was already checked + # 2) If a string contains any RandALCat character, the string + # MUST NOT contain any LCat character. + if any(stringprep.in_table_d2(x) for x in label): + raise UnicodeError("Violation of BIDI requirement 2") + + # 3) If a string contains any RandALCat character, a + # RandALCat character MUST be the first character of the + # string, and a RandALCat character MUST be the last + # character of the string. + if not RandAL[0] or not RandAL[-1]: + raise UnicodeError("Violation of BIDI requirement 3") + + return label + +def ToASCII(label): + try: + # Step 1: try ASCII + label = label.encode("ascii") + except UnicodeError: + pass + else: + # Skip to step 3: UseSTD3ASCIIRules is false, so + # Skip to step 8. + if 0 < len(label) < 64: + return label + raise UnicodeError("label empty or too long") + + # Step 2: nameprep + label = nameprep(label) + + # Step 3: UseSTD3ASCIIRules is false + # Step 4: try ASCII + try: + label = label.encode("ascii") + except UnicodeError: + pass + else: + # Skip to step 8. + if 0 < len(label) < 64: + return label + raise UnicodeError("label empty or too long") + + # Step 5: Check ACE prefix + if label.startswith(sace_prefix): + raise UnicodeError("Label starts with ACE prefix") + + # Step 6: Encode with PUNYCODE + label = label.encode("punycode") + + # Step 7: Prepend ACE prefix + label = ace_prefix + label + + # Step 8: Check size + if 0 < len(label) < 64: + return label + raise UnicodeError("label empty or too long") + +def ToUnicode(label): + # Step 1: Check for ASCII + if isinstance(label, bytes): + pure_ascii = True + else: + try: + label = label.encode("ascii") + pure_ascii = True + except UnicodeError: + pure_ascii = False + if not pure_ascii: + # Step 2: Perform nameprep + label = nameprep(label) + # It doesn't say this, but apparently, it should be ASCII now + try: + label = label.encode("ascii") + except UnicodeError: + raise UnicodeError("Invalid character in IDN label") + # Step 3: Check for ACE prefix + if not label.startswith(ace_prefix): + return str(label, "ascii") + + # Step 4: Remove ACE prefix + label1 = label[len(ace_prefix):] + + # Step 5: Decode using PUNYCODE + result = label1.decode("punycode") + + # Step 6: Apply ToASCII + label2 = ToASCII(result) + + # Step 7: Compare the result of step 6 with the one of step 3 + # label2 will already be in lower case. + if str(label, "ascii").lower() != str(label2, "ascii"): + raise UnicodeError("IDNA does not round-trip", label, label2) + + # Step 8: return the result of step 5 + return result + +### Codec APIs + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + + if errors != 'strict': + # IDNA is quite clear that implementations must be strict + raise UnicodeError("unsupported error handling "+errors) + + if not input: + return b'', 0 + + try: + result = input.encode('ascii') + except UnicodeEncodeError: + pass + else: + # ASCII name: fast path + labels = result.split(b'.') + for label in labels[:-1]: + if not (0 < len(label) < 64): + raise UnicodeError("label empty or too long") + if len(labels[-1]) >= 64: + raise UnicodeError("label too long") + return result, len(input) + + result = bytearray() + labels = dots.split(input) + if labels and not labels[-1]: + trailing_dot = b'.' + del labels[-1] + else: + trailing_dot = b'' + for label in labels: + if result: + # Join with U+002E + result.extend(b'.') + result.extend(ToASCII(label)) + return bytes(result+trailing_dot), len(input) + + def decode(self, input, errors='strict'): + + if errors != 'strict': + raise UnicodeError("Unsupported error handling "+errors) + + if not input: + return "", 0 + + # IDNA allows decoding to operate on Unicode strings, too. + if not isinstance(input, bytes): + # XXX obviously wrong, see #3232 + input = bytes(input) + + if ace_prefix not in input: + # Fast path + try: + return input.decode('ascii'), len(input) + except UnicodeDecodeError: + pass + + labels = input.split(b".") + + if labels and len(labels[-1]) == 0: + trailing_dot = '.' + del labels[-1] + else: + trailing_dot = '' + + result = [] + for label in labels: + result.append(ToUnicode(label)) + + return ".".join(result)+trailing_dot, len(input) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, input, errors, final): + if errors != 'strict': + # IDNA is quite clear that implementations must be strict + raise UnicodeError("unsupported error handling "+errors) + + if not input: + return (b'', 0) + + labels = dots.split(input) + trailing_dot = b'' + if labels: + if not labels[-1]: + trailing_dot = b'.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = b'.' + + result = bytearray() + size = 0 + for label in labels: + if size: + # Join with U+002E + result.extend(b'.') + size += 1 + result.extend(ToASCII(label)) + size += len(label) + + result += trailing_dot + size += len(trailing_dot) + return (bytes(result), size) + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, input, errors, final): + if errors != 'strict': + raise UnicodeError("Unsupported error handling "+errors) + + if not input: + return ("", 0) + + # IDNA allows decoding to operate on Unicode strings, too. + if isinstance(input, str): + labels = dots.split(input) + else: + # Must be ASCII string + input = str(input, "ascii") + labels = input.split(".") + + trailing_dot = '' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(ToUnicode(label)) + if size: + size += 1 + size += len(label) + + result = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/venv/Lib/encodings/iso2022_jp.py b/venv/Lib/encodings/iso2022_jp.py new file mode 100644 index 00000000..ab040606 --- /dev/null +++ b/venv/Lib/encodings/iso2022_jp.py @@ -0,0 +1,39 @@ +# +# iso2022_jp.py: Python Unicode Codec for ISO2022_JP +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/iso2022_jp_1.py b/venv/Lib/encodings/iso2022_jp_1.py new file mode 100644 index 00000000..997044dc --- /dev/null +++ b/venv/Lib/encodings/iso2022_jp_1.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_1.py: Python Unicode Codec for ISO2022_JP_1 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_1') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_1', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/iso2022_jp_2.py b/venv/Lib/encodings/iso2022_jp_2.py new file mode 100644 index 00000000..9106bf76 --- /dev/null +++ b/venv/Lib/encodings/iso2022_jp_2.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_2.py: Python Unicode Codec for ISO2022_JP_2 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_2') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_2', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/iso2022_jp_2004.py b/venv/Lib/encodings/iso2022_jp_2004.py new file mode 100644 index 00000000..40198bf0 --- /dev/null +++ b/venv/Lib/encodings/iso2022_jp_2004.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_2004.py: Python Unicode Codec for ISO2022_JP_2004 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_2004') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_2004', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/iso2022_jp_3.py b/venv/Lib/encodings/iso2022_jp_3.py new file mode 100644 index 00000000..346e08be --- /dev/null +++ b/venv/Lib/encodings/iso2022_jp_3.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_3.py: Python Unicode Codec for ISO2022_JP_3 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_3') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_3', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/iso2022_jp_ext.py b/venv/Lib/encodings/iso2022_jp_ext.py new file mode 100644 index 00000000..752bab98 --- /dev/null +++ b/venv/Lib/encodings/iso2022_jp_ext.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_ext.py: Python Unicode Codec for ISO2022_JP_EXT +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_ext') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_ext', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/iso2022_kr.py b/venv/Lib/encodings/iso2022_kr.py new file mode 100644 index 00000000..bf701876 --- /dev/null +++ b/venv/Lib/encodings/iso2022_kr.py @@ -0,0 +1,39 @@ +# +# iso2022_kr.py: Python Unicode Codec for ISO2022_KR +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_kr') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_kr', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/iso8859_1.py b/venv/Lib/encodings/iso8859_1.py new file mode 100644 index 00000000..8cfc01fe --- /dev/null +++ b/venv/Lib/encodings/iso8859_1.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_1 generated from 'MAPPINGS/ISO8859/8859-1.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-1', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_10.py b/venv/Lib/encodings/iso8859_10.py new file mode 100644 index 00000000..b4fb0419 --- /dev/null +++ b/venv/Lib/encodings/iso8859_10.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_10 generated from 'MAPPINGS/ISO8859/8859-10.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-10', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u0112' # 0xA2 -> LATIN CAPITAL LETTER E WITH MACRON + '\u0122' # 0xA3 -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u012a' # 0xA4 -> LATIN CAPITAL LETTER I WITH MACRON + '\u0128' # 0xA5 -> LATIN CAPITAL LETTER I WITH TILDE + '\u0136' # 0xA6 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\xa7' # 0xA7 -> SECTION SIGN + '\u013b' # 0xA8 -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u0110' # 0xA9 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0160' # 0xAA -> LATIN CAPITAL LETTER S WITH CARON + '\u0166' # 0xAB -> LATIN CAPITAL LETTER T WITH STROKE + '\u017d' # 0xAC -> LATIN CAPITAL LETTER Z WITH CARON + '\xad' # 0xAD -> SOFT HYPHEN + '\u016a' # 0xAE -> LATIN CAPITAL LETTER U WITH MACRON + '\u014a' # 0xAF -> LATIN CAPITAL LETTER ENG + '\xb0' # 0xB0 -> DEGREE SIGN + '\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + '\u0113' # 0xB2 -> LATIN SMALL LETTER E WITH MACRON + '\u0123' # 0xB3 -> LATIN SMALL LETTER G WITH CEDILLA + '\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON + '\u0129' # 0xB5 -> LATIN SMALL LETTER I WITH TILDE + '\u0137' # 0xB6 -> LATIN SMALL LETTER K WITH CEDILLA + '\xb7' # 0xB7 -> MIDDLE DOT + '\u013c' # 0xB8 -> LATIN SMALL LETTER L WITH CEDILLA + '\u0111' # 0xB9 -> LATIN SMALL LETTER D WITH STROKE + '\u0161' # 0xBA -> LATIN SMALL LETTER S WITH CARON + '\u0167' # 0xBB -> LATIN SMALL LETTER T WITH STROKE + '\u017e' # 0xBC -> LATIN SMALL LETTER Z WITH CARON + '\u2015' # 0xBD -> HORIZONTAL BAR + '\u016b' # 0xBE -> LATIN SMALL LETTER U WITH MACRON + '\u014b' # 0xBF -> LATIN SMALL LETTER ENG + '\u0100' # 0xC0 -> LATIN CAPITAL LETTER A WITH MACRON + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\u012e' # 0xC7 -> LATIN CAPITAL LETTER I WITH OGONEK + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u0116' # 0xCC -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) + '\u0145' # 0xD1 -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u014c' # 0xD2 -> LATIN CAPITAL LETTER O WITH MACRON + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\u0168' # 0xD7 -> LATIN CAPITAL LETTER U WITH TILDE + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\u0172' # 0xD9 -> LATIN CAPITAL LETTER U WITH OGONEK + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + '\u0101' # 0xE0 -> LATIN SMALL LETTER A WITH MACRON + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\u012f' # 0xE7 -> LATIN SMALL LETTER I WITH OGONEK + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0117' # 0xEC -> LATIN SMALL LETTER E WITH DOT ABOVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) + '\u0146' # 0xF1 -> LATIN SMALL LETTER N WITH CEDILLA + '\u014d' # 0xF2 -> LATIN SMALL LETTER O WITH MACRON + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u0169' # 0xF7 -> LATIN SMALL LETTER U WITH TILDE + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\u0173' # 0xF9 -> LATIN SMALL LETTER U WITH OGONEK + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) + '\u0138' # 0xFF -> LATIN SMALL LETTER KRA +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_11.py b/venv/Lib/encodings/iso8859_11.py new file mode 100644 index 00000000..c7258ecf --- /dev/null +++ b/venv/Lib/encodings/iso8859_11.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_11 generated from 'MAPPINGS/ISO8859/8859-11.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-11', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + '\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + '\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + '\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + '\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + '\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + '\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + '\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + '\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + '\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + '\u0e0b' # 0xAB -> THAI CHARACTER SO SO + '\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + '\u0e0d' # 0xAD -> THAI CHARACTER YO YING + '\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + '\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + '\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + '\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + '\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + '\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + '\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + '\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + '\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + '\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + '\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + '\u0e19' # 0xB9 -> THAI CHARACTER NO NU + '\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + '\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + '\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + '\u0e1d' # 0xBD -> THAI CHARACTER FO FA + '\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + '\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + '\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + '\u0e21' # 0xC1 -> THAI CHARACTER MO MA + '\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + '\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + '\u0e24' # 0xC4 -> THAI CHARACTER RU + '\u0e25' # 0xC5 -> THAI CHARACTER LO LING + '\u0e26' # 0xC6 -> THAI CHARACTER LU + '\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + '\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + '\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + '\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + '\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + '\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + '\u0e2d' # 0xCD -> THAI CHARACTER O ANG + '\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + '\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + '\u0e30' # 0xD0 -> THAI CHARACTER SARA A + '\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + '\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + '\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + '\u0e34' # 0xD4 -> THAI CHARACTER SARA I + '\u0e35' # 0xD5 -> THAI CHARACTER SARA II + '\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + '\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + '\u0e38' # 0xD8 -> THAI CHARACTER SARA U + '\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + '\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + '\u0e40' # 0xE0 -> THAI CHARACTER SARA E + '\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + '\u0e42' # 0xE2 -> THAI CHARACTER SARA O + '\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + '\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + '\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + '\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + '\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + '\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + '\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + '\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + '\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + '\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + '\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + '\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + '\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + '\u0e50' # 0xF0 -> THAI DIGIT ZERO + '\u0e51' # 0xF1 -> THAI DIGIT ONE + '\u0e52' # 0xF2 -> THAI DIGIT TWO + '\u0e53' # 0xF3 -> THAI DIGIT THREE + '\u0e54' # 0xF4 -> THAI DIGIT FOUR + '\u0e55' # 0xF5 -> THAI DIGIT FIVE + '\u0e56' # 0xF6 -> THAI DIGIT SIX + '\u0e57' # 0xF7 -> THAI DIGIT SEVEN + '\u0e58' # 0xF8 -> THAI DIGIT EIGHT + '\u0e59' # 0xF9 -> THAI DIGIT NINE + '\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + '\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_13.py b/venv/Lib/encodings/iso8859_13.py new file mode 100644 index 00000000..6f8eab2b --- /dev/null +++ b/venv/Lib/encodings/iso8859_13.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_13 generated from 'MAPPINGS/ISO8859/8859-13.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-13', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u201d' # 0xA1 -> RIGHT DOUBLE QUOTATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u201e' # 0xA5 -> DOUBLE LOW-9 QUOTATION MARK + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xd8' # 0xA8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0156' # 0xAA -> LATIN CAPITAL LETTER R WITH CEDILLA + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xc6' # 0xAF -> LATIN CAPITAL LETTER AE + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\u201c' # 0xB4 -> LEFT DOUBLE QUOTATION MARK + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xf8' # 0xB8 -> LATIN SMALL LETTER O WITH STROKE + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\u0157' # 0xBA -> LATIN SMALL LETTER R WITH CEDILLA + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xe6' # 0xBF -> LATIN SMALL LETTER AE + '\u0104' # 0xC0 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u012e' # 0xC1 -> LATIN CAPITAL LETTER I WITH OGONEK + '\u0100' # 0xC2 -> LATIN CAPITAL LETTER A WITH MACRON + '\u0106' # 0xC3 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\u0118' # 0xC6 -> LATIN CAPITAL LETTER E WITH OGONEK + '\u0112' # 0xC7 -> LATIN CAPITAL LETTER E WITH MACRON + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0179' # 0xCA -> LATIN CAPITAL LETTER Z WITH ACUTE + '\u0116' # 0xCB -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\u0122' # 0xCC -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u0136' # 0xCD -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u012a' # 0xCE -> LATIN CAPITAL LETTER I WITH MACRON + '\u013b' # 0xCF -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u0160' # 0xD0 -> LATIN CAPITAL LETTER S WITH CARON + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0145' # 0xD2 -> LATIN CAPITAL LETTER N WITH CEDILLA + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\u014c' # 0xD4 -> LATIN CAPITAL LETTER O WITH MACRON + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0172' # 0xD8 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u0141' # 0xD9 -> LATIN CAPITAL LETTER L WITH STROKE + '\u015a' # 0xDA -> LATIN CAPITAL LETTER S WITH ACUTE + '\u016a' # 0xDB -> LATIN CAPITAL LETTER U WITH MACRON + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u017b' # 0xDD -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u017d' # 0xDE -> LATIN CAPITAL LETTER Z WITH CARON + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + '\u0105' # 0xE0 -> LATIN SMALL LETTER A WITH OGONEK + '\u012f' # 0xE1 -> LATIN SMALL LETTER I WITH OGONEK + '\u0101' # 0xE2 -> LATIN SMALL LETTER A WITH MACRON + '\u0107' # 0xE3 -> LATIN SMALL LETTER C WITH ACUTE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\u0119' # 0xE6 -> LATIN SMALL LETTER E WITH OGONEK + '\u0113' # 0xE7 -> LATIN SMALL LETTER E WITH MACRON + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u017a' # 0xEA -> LATIN SMALL LETTER Z WITH ACUTE + '\u0117' # 0xEB -> LATIN SMALL LETTER E WITH DOT ABOVE + '\u0123' # 0xEC -> LATIN SMALL LETTER G WITH CEDILLA + '\u0137' # 0xED -> LATIN SMALL LETTER K WITH CEDILLA + '\u012b' # 0xEE -> LATIN SMALL LETTER I WITH MACRON + '\u013c' # 0xEF -> LATIN SMALL LETTER L WITH CEDILLA + '\u0161' # 0xF0 -> LATIN SMALL LETTER S WITH CARON + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\u0146' # 0xF2 -> LATIN SMALL LETTER N WITH CEDILLA + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\u014d' # 0xF4 -> LATIN SMALL LETTER O WITH MACRON + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0173' # 0xF8 -> LATIN SMALL LETTER U WITH OGONEK + '\u0142' # 0xF9 -> LATIN SMALL LETTER L WITH STROKE + '\u015b' # 0xFA -> LATIN SMALL LETTER S WITH ACUTE + '\u016b' # 0xFB -> LATIN SMALL LETTER U WITH MACRON + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u017e' # 0xFE -> LATIN SMALL LETTER Z WITH CARON + '\u2019' # 0xFF -> RIGHT SINGLE QUOTATION MARK +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_14.py b/venv/Lib/encodings/iso8859_14.py new file mode 100644 index 00000000..7568d4ee --- /dev/null +++ b/venv/Lib/encodings/iso8859_14.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_14 generated from 'MAPPINGS/ISO8859/8859-14.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-14', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u1e02' # 0xA1 -> LATIN CAPITAL LETTER B WITH DOT ABOVE + '\u1e03' # 0xA2 -> LATIN SMALL LETTER B WITH DOT ABOVE + '\xa3' # 0xA3 -> POUND SIGN + '\u010a' # 0xA4 -> LATIN CAPITAL LETTER C WITH DOT ABOVE + '\u010b' # 0xA5 -> LATIN SMALL LETTER C WITH DOT ABOVE + '\u1e0a' # 0xA6 -> LATIN CAPITAL LETTER D WITH DOT ABOVE + '\xa7' # 0xA7 -> SECTION SIGN + '\u1e80' # 0xA8 -> LATIN CAPITAL LETTER W WITH GRAVE + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u1e82' # 0xAA -> LATIN CAPITAL LETTER W WITH ACUTE + '\u1e0b' # 0xAB -> LATIN SMALL LETTER D WITH DOT ABOVE + '\u1ef2' # 0xAC -> LATIN CAPITAL LETTER Y WITH GRAVE + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u0178' # 0xAF -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u1e1e' # 0xB0 -> LATIN CAPITAL LETTER F WITH DOT ABOVE + '\u1e1f' # 0xB1 -> LATIN SMALL LETTER F WITH DOT ABOVE + '\u0120' # 0xB2 -> LATIN CAPITAL LETTER G WITH DOT ABOVE + '\u0121' # 0xB3 -> LATIN SMALL LETTER G WITH DOT ABOVE + '\u1e40' # 0xB4 -> LATIN CAPITAL LETTER M WITH DOT ABOVE + '\u1e41' # 0xB5 -> LATIN SMALL LETTER M WITH DOT ABOVE + '\xb6' # 0xB6 -> PILCROW SIGN + '\u1e56' # 0xB7 -> LATIN CAPITAL LETTER P WITH DOT ABOVE + '\u1e81' # 0xB8 -> LATIN SMALL LETTER W WITH GRAVE + '\u1e57' # 0xB9 -> LATIN SMALL LETTER P WITH DOT ABOVE + '\u1e83' # 0xBA -> LATIN SMALL LETTER W WITH ACUTE + '\u1e60' # 0xBB -> LATIN CAPITAL LETTER S WITH DOT ABOVE + '\u1ef3' # 0xBC -> LATIN SMALL LETTER Y WITH GRAVE + '\u1e84' # 0xBD -> LATIN CAPITAL LETTER W WITH DIAERESIS + '\u1e85' # 0xBE -> LATIN SMALL LETTER W WITH DIAERESIS + '\u1e61' # 0xBF -> LATIN SMALL LETTER S WITH DOT ABOVE + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u0174' # 0xD0 -> LATIN CAPITAL LETTER W WITH CIRCUMFLEX + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\u1e6a' # 0xD7 -> LATIN CAPITAL LETTER T WITH DOT ABOVE + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\u0176' # 0xDE -> LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u0175' # 0xF0 -> LATIN SMALL LETTER W WITH CIRCUMFLEX + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u1e6b' # 0xF7 -> LATIN SMALL LETTER T WITH DOT ABOVE + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\u0177' # 0xFE -> LATIN SMALL LETTER Y WITH CIRCUMFLEX + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_15.py b/venv/Lib/encodings/iso8859_15.py new file mode 100644 index 00000000..43bdecd4 --- /dev/null +++ b/venv/Lib/encodings/iso8859_15.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_15 generated from 'MAPPINGS/ISO8859/8859-15.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-15', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\u20ac' # 0xA4 -> EURO SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\u0160' # 0xA6 -> LATIN CAPITAL LETTER S WITH CARON + '\xa7' # 0xA7 -> SECTION SIGN + '\u0161' # 0xA8 -> LATIN SMALL LETTER S WITH CARON + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\u017d' # 0xB4 -> LATIN CAPITAL LETTER Z WITH CARON + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u017e' # 0xB8 -> LATIN SMALL LETTER Z WITH CARON + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0152' # 0xBC -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xBD -> LATIN SMALL LIGATURE OE + '\u0178' # 0xBE -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_16.py b/venv/Lib/encodings/iso8859_16.py new file mode 100644 index 00000000..e70c96e3 --- /dev/null +++ b/venv/Lib/encodings/iso8859_16.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_16 generated from 'MAPPINGS/ISO8859/8859-16.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-16', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u0105' # 0xA2 -> LATIN SMALL LETTER A WITH OGONEK + '\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + '\u20ac' # 0xA4 -> EURO SIGN + '\u201e' # 0xA5 -> DOUBLE LOW-9 QUOTATION MARK + '\u0160' # 0xA6 -> LATIN CAPITAL LETTER S WITH CARON + '\xa7' # 0xA7 -> SECTION SIGN + '\u0161' # 0xA8 -> LATIN SMALL LETTER S WITH CARON + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0218' # 0xAA -> LATIN CAPITAL LETTER S WITH COMMA BELOW + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0179' # 0xAC -> LATIN CAPITAL LETTER Z WITH ACUTE + '\xad' # 0xAD -> SOFT HYPHEN + '\u017a' # 0xAE -> LATIN SMALL LETTER Z WITH ACUTE + '\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u010c' # 0xB2 -> LATIN CAPITAL LETTER C WITH CARON + '\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + '\u017d' # 0xB4 -> LATIN CAPITAL LETTER Z WITH CARON + '\u201d' # 0xB5 -> RIGHT DOUBLE QUOTATION MARK + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u017e' # 0xB8 -> LATIN SMALL LETTER Z WITH CARON + '\u010d' # 0xB9 -> LATIN SMALL LETTER C WITH CARON + '\u0219' # 0xBA -> LATIN SMALL LETTER S WITH COMMA BELOW + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0152' # 0xBC -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xBD -> LATIN SMALL LIGATURE OE + '\u0178' # 0xBE -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0106' # 0xC5 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\u015a' # 0xD7 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u0170' # 0xD8 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0118' # 0xDD -> LATIN CAPITAL LETTER E WITH OGONEK + '\u021a' # 0xDE -> LATIN CAPITAL LETTER T WITH COMMA BELOW + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u0107' # 0xE5 -> LATIN SMALL LETTER C WITH ACUTE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u015b' # 0xF7 -> LATIN SMALL LETTER S WITH ACUTE + '\u0171' # 0xF8 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u0119' # 0xFD -> LATIN SMALL LETTER E WITH OGONEK + '\u021b' # 0xFE -> LATIN SMALL LETTER T WITH COMMA BELOW + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_2.py b/venv/Lib/encodings/iso8859_2.py new file mode 100644 index 00000000..3698747b --- /dev/null +++ b/venv/Lib/encodings/iso8859_2.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_2 generated from 'MAPPINGS/ISO8859/8859-2.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-2', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u02d8' # 0xA2 -> BREVE + '\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u013d' # 0xA5 -> LATIN CAPITAL LETTER L WITH CARON + '\u015a' # 0xA6 -> LATIN CAPITAL LETTER S WITH ACUTE + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + '\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u0164' # 0xAB -> LATIN CAPITAL LETTER T WITH CARON + '\u0179' # 0xAC -> LATIN CAPITAL LETTER Z WITH ACUTE + '\xad' # 0xAD -> SOFT HYPHEN + '\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + '\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\xb0' # 0xB0 -> DEGREE SIGN + '\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + '\u02db' # 0xB2 -> OGONEK + '\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\u013e' # 0xB5 -> LATIN SMALL LETTER L WITH CARON + '\u015b' # 0xB6 -> LATIN SMALL LETTER S WITH ACUTE + '\u02c7' # 0xB7 -> CARON + '\xb8' # 0xB8 -> CEDILLA + '\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + '\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + '\u0165' # 0xBB -> LATIN SMALL LETTER T WITH CARON + '\u017a' # 0xBC -> LATIN SMALL LETTER Z WITH ACUTE + '\u02dd' # 0xBD -> DOUBLE ACUTE ACCENT + '\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + '\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u0154' # 0xC0 -> LATIN CAPITAL LETTER R WITH ACUTE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0139' # 0xC5 -> LATIN CAPITAL LETTER L WITH ACUTE + '\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u011a' # 0xCC -> LATIN CAPITAL LETTER E WITH CARON + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u010e' # 0xCF -> LATIN CAPITAL LETTER D WITH CARON + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0147' # 0xD2 -> LATIN CAPITAL LETTER N WITH CARON + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0158' # 0xD8 -> LATIN CAPITAL LETTER R WITH CARON + '\u016e' # 0xD9 -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\u0170' # 0xDB -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\u0162' # 0xDE -> LATIN CAPITAL LETTER T WITH CEDILLA + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\u0155' # 0xE0 -> LATIN SMALL LETTER R WITH ACUTE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u013a' # 0xE5 -> LATIN SMALL LETTER L WITH ACUTE + '\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u011b' # 0xEC -> LATIN SMALL LETTER E WITH CARON + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u010f' # 0xEF -> LATIN SMALL LETTER D WITH CARON + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\u0148' # 0xF2 -> LATIN SMALL LETTER N WITH CARON + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0159' # 0xF8 -> LATIN SMALL LETTER R WITH CARON + '\u016f' # 0xF9 -> LATIN SMALL LETTER U WITH RING ABOVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\u0171' # 0xFB -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\u0163' # 0xFE -> LATIN SMALL LETTER T WITH CEDILLA + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_3.py b/venv/Lib/encodings/iso8859_3.py new file mode 100644 index 00000000..96d3063e --- /dev/null +++ b/venv/Lib/encodings/iso8859_3.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_3 generated from 'MAPPINGS/ISO8859/8859-3.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-3', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0126' # 0xA1 -> LATIN CAPITAL LETTER H WITH STROKE + '\u02d8' # 0xA2 -> BREVE + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\ufffe' + '\u0124' # 0xA6 -> LATIN CAPITAL LETTER H WITH CIRCUMFLEX + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\u0130' # 0xA9 -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u011e' # 0xAB -> LATIN CAPITAL LETTER G WITH BREVE + '\u0134' # 0xAC -> LATIN CAPITAL LETTER J WITH CIRCUMFLEX + '\xad' # 0xAD -> SOFT HYPHEN + '\ufffe' + '\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\xb0' # 0xB0 -> DEGREE SIGN + '\u0127' # 0xB1 -> LATIN SMALL LETTER H WITH STROKE + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\u0125' # 0xB6 -> LATIN SMALL LETTER H WITH CIRCUMFLEX + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\u0131' # 0xB9 -> LATIN SMALL LETTER DOTLESS I + '\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + '\u011f' # 0xBB -> LATIN SMALL LETTER G WITH BREVE + '\u0135' # 0xBC -> LATIN SMALL LETTER J WITH CIRCUMFLEX + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\ufffe' + '\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\ufffe' + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u010a' # 0xC5 -> LATIN CAPITAL LETTER C WITH DOT ABOVE + '\u0108' # 0xC6 -> LATIN CAPITAL LETTER C WITH CIRCUMFLEX + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\ufffe' + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0120' # 0xD5 -> LATIN CAPITAL LETTER G WITH DOT ABOVE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u011c' # 0xD8 -> LATIN CAPITAL LETTER G WITH CIRCUMFLEX + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u016c' # 0xDD -> LATIN CAPITAL LETTER U WITH BREVE + '\u015c' # 0xDE -> LATIN CAPITAL LETTER S WITH CIRCUMFLEX + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\ufffe' + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u010b' # 0xE5 -> LATIN SMALL LETTER C WITH DOT ABOVE + '\u0109' # 0xE6 -> LATIN SMALL LETTER C WITH CIRCUMFLEX + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\ufffe' + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u0121' # 0xF5 -> LATIN SMALL LETTER G WITH DOT ABOVE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u011d' # 0xF8 -> LATIN SMALL LETTER G WITH CIRCUMFLEX + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u016d' # 0xFD -> LATIN SMALL LETTER U WITH BREVE + '\u015d' # 0xFE -> LATIN SMALL LETTER S WITH CIRCUMFLEX + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_4.py b/venv/Lib/encodings/iso8859_4.py new file mode 100644 index 00000000..65c1e00f --- /dev/null +++ b/venv/Lib/encodings/iso8859_4.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_4 generated from 'MAPPINGS/ISO8859/8859-4.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-4', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u0138' # 0xA2 -> LATIN SMALL LETTER KRA + '\u0156' # 0xA3 -> LATIN CAPITAL LETTER R WITH CEDILLA + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u0128' # 0xA5 -> LATIN CAPITAL LETTER I WITH TILDE + '\u013b' # 0xA6 -> LATIN CAPITAL LETTER L WITH CEDILLA + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + '\u0112' # 0xAA -> LATIN CAPITAL LETTER E WITH MACRON + '\u0122' # 0xAB -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u0166' # 0xAC -> LATIN CAPITAL LETTER T WITH STROKE + '\xad' # 0xAD -> SOFT HYPHEN + '\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + '\u02db' # 0xB2 -> OGONEK + '\u0157' # 0xB3 -> LATIN SMALL LETTER R WITH CEDILLA + '\xb4' # 0xB4 -> ACUTE ACCENT + '\u0129' # 0xB5 -> LATIN SMALL LETTER I WITH TILDE + '\u013c' # 0xB6 -> LATIN SMALL LETTER L WITH CEDILLA + '\u02c7' # 0xB7 -> CARON + '\xb8' # 0xB8 -> CEDILLA + '\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + '\u0113' # 0xBA -> LATIN SMALL LETTER E WITH MACRON + '\u0123' # 0xBB -> LATIN SMALL LETTER G WITH CEDILLA + '\u0167' # 0xBC -> LATIN SMALL LETTER T WITH STROKE + '\u014a' # 0xBD -> LATIN CAPITAL LETTER ENG + '\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + '\u014b' # 0xBF -> LATIN SMALL LETTER ENG + '\u0100' # 0xC0 -> LATIN CAPITAL LETTER A WITH MACRON + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\u012e' # 0xC7 -> LATIN CAPITAL LETTER I WITH OGONEK + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u0116' # 0xCC -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u012a' # 0xCF -> LATIN CAPITAL LETTER I WITH MACRON + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0145' # 0xD1 -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u014c' # 0xD2 -> LATIN CAPITAL LETTER O WITH MACRON + '\u0136' # 0xD3 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\u0172' # 0xD9 -> LATIN CAPITAL LETTER U WITH OGONEK + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0168' # 0xDD -> LATIN CAPITAL LETTER U WITH TILDE + '\u016a' # 0xDE -> LATIN CAPITAL LETTER U WITH MACRON + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\u0101' # 0xE0 -> LATIN SMALL LETTER A WITH MACRON + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\u012f' # 0xE7 -> LATIN SMALL LETTER I WITH OGONEK + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0117' # 0xEC -> LATIN SMALL LETTER E WITH DOT ABOVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u012b' # 0xEF -> LATIN SMALL LETTER I WITH MACRON + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\u0146' # 0xF1 -> LATIN SMALL LETTER N WITH CEDILLA + '\u014d' # 0xF2 -> LATIN SMALL LETTER O WITH MACRON + '\u0137' # 0xF3 -> LATIN SMALL LETTER K WITH CEDILLA + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\u0173' # 0xF9 -> LATIN SMALL LETTER U WITH OGONEK + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u0169' # 0xFD -> LATIN SMALL LETTER U WITH TILDE + '\u016b' # 0xFE -> LATIN SMALL LETTER U WITH MACRON + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_5.py b/venv/Lib/encodings/iso8859_5.py new file mode 100644 index 00000000..a3c868a5 --- /dev/null +++ b/venv/Lib/encodings/iso8859_5.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_5 generated from 'MAPPINGS/ISO8859/8859-5.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-5', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0401' # 0xA1 -> CYRILLIC CAPITAL LETTER IO + '\u0402' # 0xA2 -> CYRILLIC CAPITAL LETTER DJE + '\u0403' # 0xA3 -> CYRILLIC CAPITAL LETTER GJE + '\u0404' # 0xA4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0405' # 0xA5 -> CYRILLIC CAPITAL LETTER DZE + '\u0406' # 0xA6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0407' # 0xA7 -> CYRILLIC CAPITAL LETTER YI + '\u0408' # 0xA8 -> CYRILLIC CAPITAL LETTER JE + '\u0409' # 0xA9 -> CYRILLIC CAPITAL LETTER LJE + '\u040a' # 0xAA -> CYRILLIC CAPITAL LETTER NJE + '\u040b' # 0xAB -> CYRILLIC CAPITAL LETTER TSHE + '\u040c' # 0xAC -> CYRILLIC CAPITAL LETTER KJE + '\xad' # 0xAD -> SOFT HYPHEN + '\u040e' # 0xAE -> CYRILLIC CAPITAL LETTER SHORT U + '\u040f' # 0xAF -> CYRILLIC CAPITAL LETTER DZHE + '\u0410' # 0xB0 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xB1 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0xB2 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0xB3 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0xB4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xB5 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0xB6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0xB7 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0xB8 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xB9 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xBA -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xBB -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xBC -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xBD -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xBE -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xBF -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0xC0 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xC1 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xC2 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xC3 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0xC4 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0xC5 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0xC6 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0xC7 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0xC8 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0xC9 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0xCA -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0xCB -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0xCC -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0xCD -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0xCE -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0xCF -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0xD0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xD1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xD2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xD3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xD4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xD5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xD7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xD8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xD9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xDA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xDB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xDC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xDD -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xDE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xDF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xE0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xE1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xE2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xE3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xE4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xE5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xE6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xE7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xE8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xE9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xEA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xEB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xEC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xED -> CYRILLIC SMALL LETTER E + '\u044e' # 0xEE -> CYRILLIC SMALL LETTER YU + '\u044f' # 0xEF -> CYRILLIC SMALL LETTER YA + '\u2116' # 0xF0 -> NUMERO SIGN + '\u0451' # 0xF1 -> CYRILLIC SMALL LETTER IO + '\u0452' # 0xF2 -> CYRILLIC SMALL LETTER DJE + '\u0453' # 0xF3 -> CYRILLIC SMALL LETTER GJE + '\u0454' # 0xF4 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0455' # 0xF5 -> CYRILLIC SMALL LETTER DZE + '\u0456' # 0xF6 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0457' # 0xF7 -> CYRILLIC SMALL LETTER YI + '\u0458' # 0xF8 -> CYRILLIC SMALL LETTER JE + '\u0459' # 0xF9 -> CYRILLIC SMALL LETTER LJE + '\u045a' # 0xFA -> CYRILLIC SMALL LETTER NJE + '\u045b' # 0xFB -> CYRILLIC SMALL LETTER TSHE + '\u045c' # 0xFC -> CYRILLIC SMALL LETTER KJE + '\xa7' # 0xFD -> SECTION SIGN + '\u045e' # 0xFE -> CYRILLIC SMALL LETTER SHORT U + '\u045f' # 0xFF -> CYRILLIC SMALL LETTER DZHE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_6.py b/venv/Lib/encodings/iso8859_6.py new file mode 100644 index 00000000..b02ade6e --- /dev/null +++ b/venv/Lib/encodings/iso8859_6.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_6 generated from 'MAPPINGS/ISO8859/8859-6.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-6', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\ufffe' + '\ufffe' + '\ufffe' + '\xa4' # 0xA4 -> CURRENCY SIGN + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u060c' # 0xAC -> ARABIC COMMA + '\xad' # 0xAD -> SOFT HYPHEN + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u061b' # 0xBB -> ARABIC SEMICOLON + '\ufffe' + '\ufffe' + '\ufffe' + '\u061f' # 0xBF -> ARABIC QUESTION MARK + '\ufffe' + '\u0621' # 0xC1 -> ARABIC LETTER HAMZA + '\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0xC7 -> ARABIC LETTER ALEF + '\u0628' # 0xC8 -> ARABIC LETTER BEH + '\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0xCA -> ARABIC LETTER TEH + '\u062b' # 0xCB -> ARABIC LETTER THEH + '\u062c' # 0xCC -> ARABIC LETTER JEEM + '\u062d' # 0xCD -> ARABIC LETTER HAH + '\u062e' # 0xCE -> ARABIC LETTER KHAH + '\u062f' # 0xCF -> ARABIC LETTER DAL + '\u0630' # 0xD0 -> ARABIC LETTER THAL + '\u0631' # 0xD1 -> ARABIC LETTER REH + '\u0632' # 0xD2 -> ARABIC LETTER ZAIN + '\u0633' # 0xD3 -> ARABIC LETTER SEEN + '\u0634' # 0xD4 -> ARABIC LETTER SHEEN + '\u0635' # 0xD5 -> ARABIC LETTER SAD + '\u0636' # 0xD6 -> ARABIC LETTER DAD + '\u0637' # 0xD7 -> ARABIC LETTER TAH + '\u0638' # 0xD8 -> ARABIC LETTER ZAH + '\u0639' # 0xD9 -> ARABIC LETTER AIN + '\u063a' # 0xDA -> ARABIC LETTER GHAIN + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u0640' # 0xE0 -> ARABIC TATWEEL + '\u0641' # 0xE1 -> ARABIC LETTER FEH + '\u0642' # 0xE2 -> ARABIC LETTER QAF + '\u0643' # 0xE3 -> ARABIC LETTER KAF + '\u0644' # 0xE4 -> ARABIC LETTER LAM + '\u0645' # 0xE5 -> ARABIC LETTER MEEM + '\u0646' # 0xE6 -> ARABIC LETTER NOON + '\u0647' # 0xE7 -> ARABIC LETTER HEH + '\u0648' # 0xE8 -> ARABIC LETTER WAW + '\u0649' # 0xE9 -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0xEA -> ARABIC LETTER YEH + '\u064b' # 0xEB -> ARABIC FATHATAN + '\u064c' # 0xEC -> ARABIC DAMMATAN + '\u064d' # 0xED -> ARABIC KASRATAN + '\u064e' # 0xEE -> ARABIC FATHA + '\u064f' # 0xEF -> ARABIC DAMMA + '\u0650' # 0xF0 -> ARABIC KASRA + '\u0651' # 0xF1 -> ARABIC SHADDA + '\u0652' # 0xF2 -> ARABIC SUKUN + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_7.py b/venv/Lib/encodings/iso8859_7.py new file mode 100644 index 00000000..d7b39cbc --- /dev/null +++ b/venv/Lib/encodings/iso8859_7.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_7 generated from 'MAPPINGS/ISO8859/8859-7.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-7', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u2018' # 0xA1 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xA2 -> RIGHT SINGLE QUOTATION MARK + '\xa3' # 0xA3 -> POUND SIGN + '\u20ac' # 0xA4 -> EURO SIGN + '\u20af' # 0xA5 -> DRACHMA SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u037a' # 0xAA -> GREEK YPOGEGRAMMENI + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\ufffe' + '\u2015' # 0xAF -> HORIZONTAL BAR + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\u0384' # 0xB4 -> GREEK TONOS + '\u0385' # 0xB5 -> GREEK DIALYTIKA TONOS + '\u0386' # 0xB6 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0388' # 0xB8 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0389' # 0xB9 -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0xBA -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u038c' # 0xBC -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\u038e' # 0xBE -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u038f' # 0xBF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\u0390' # 0xC0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u0391' # 0xC1 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0xC2 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0xC3 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0xC4 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0xC5 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0xC6 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0xC7 -> GREEK CAPITAL LETTER ETA + '\u0398' # 0xC8 -> GREEK CAPITAL LETTER THETA + '\u0399' # 0xC9 -> GREEK CAPITAL LETTER IOTA + '\u039a' # 0xCA -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0xCB -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0xCC -> GREEK CAPITAL LETTER MU + '\u039d' # 0xCD -> GREEK CAPITAL LETTER NU + '\u039e' # 0xCE -> GREEK CAPITAL LETTER XI + '\u039f' # 0xCF -> GREEK CAPITAL LETTER OMICRON + '\u03a0' # 0xD0 -> GREEK CAPITAL LETTER PI + '\u03a1' # 0xD1 -> GREEK CAPITAL LETTER RHO + '\ufffe' + '\u03a3' # 0xD3 -> GREEK CAPITAL LETTER SIGMA + '\u03a4' # 0xD4 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0xD5 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0xD6 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0xD7 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0xD8 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0xD9 -> GREEK CAPITAL LETTER OMEGA + '\u03aa' # 0xDA -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u03ab' # 0xDB -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\u03ac' # 0xDC -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u03ad' # 0xDD -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0xDE -> GREEK SMALL LETTER ETA WITH TONOS + '\u03af' # 0xDF -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03b0' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + '\u03b3' # 0xE3 -> GREEK SMALL LETTER GAMMA + '\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + '\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + '\u03b6' # 0xE6 -> GREEK SMALL LETTER ZETA + '\u03b7' # 0xE7 -> GREEK SMALL LETTER ETA + '\u03b8' # 0xE8 -> GREEK SMALL LETTER THETA + '\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + '\u03ba' # 0xEA -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0xEB -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0xEC -> GREEK SMALL LETTER MU + '\u03bd' # 0xED -> GREEK SMALL LETTER NU + '\u03be' # 0xEE -> GREEK SMALL LETTER XI + '\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + '\u03c1' # 0xF1 -> GREEK SMALL LETTER RHO + '\u03c2' # 0xF2 -> GREEK SMALL LETTER FINAL SIGMA + '\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + '\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + '\u03c5' # 0xF5 -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0xF6 -> GREEK SMALL LETTER PHI + '\u03c7' # 0xF7 -> GREEK SMALL LETTER CHI + '\u03c8' # 0xF8 -> GREEK SMALL LETTER PSI + '\u03c9' # 0xF9 -> GREEK SMALL LETTER OMEGA + '\u03ca' # 0xFA -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03cb' # 0xFB -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03cc' # 0xFC -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0xFD -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03ce' # 0xFE -> GREEK SMALL LETTER OMEGA WITH TONOS + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_8.py b/venv/Lib/encodings/iso8859_8.py new file mode 100644 index 00000000..81849027 --- /dev/null +++ b/venv/Lib/encodings/iso8859_8.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_8 generated from 'MAPPINGS/ISO8859/8859-8.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-8', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\ufffe' + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xd7' # 0xAA -> MULTIPLICATION SIGN + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xf7' # 0xBA -> DIVISION SIGN + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u2017' # 0xDF -> DOUBLE LOW LINE + '\u05d0' # 0xE0 -> HEBREW LETTER ALEF + '\u05d1' # 0xE1 -> HEBREW LETTER BET + '\u05d2' # 0xE2 -> HEBREW LETTER GIMEL + '\u05d3' # 0xE3 -> HEBREW LETTER DALET + '\u05d4' # 0xE4 -> HEBREW LETTER HE + '\u05d5' # 0xE5 -> HEBREW LETTER VAV + '\u05d6' # 0xE6 -> HEBREW LETTER ZAYIN + '\u05d7' # 0xE7 -> HEBREW LETTER HET + '\u05d8' # 0xE8 -> HEBREW LETTER TET + '\u05d9' # 0xE9 -> HEBREW LETTER YOD + '\u05da' # 0xEA -> HEBREW LETTER FINAL KAF + '\u05db' # 0xEB -> HEBREW LETTER KAF + '\u05dc' # 0xEC -> HEBREW LETTER LAMED + '\u05dd' # 0xED -> HEBREW LETTER FINAL MEM + '\u05de' # 0xEE -> HEBREW LETTER MEM + '\u05df' # 0xEF -> HEBREW LETTER FINAL NUN + '\u05e0' # 0xF0 -> HEBREW LETTER NUN + '\u05e1' # 0xF1 -> HEBREW LETTER SAMEKH + '\u05e2' # 0xF2 -> HEBREW LETTER AYIN + '\u05e3' # 0xF3 -> HEBREW LETTER FINAL PE + '\u05e4' # 0xF4 -> HEBREW LETTER PE + '\u05e5' # 0xF5 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0xF6 -> HEBREW LETTER TSADI + '\u05e7' # 0xF7 -> HEBREW LETTER QOF + '\u05e8' # 0xF8 -> HEBREW LETTER RESH + '\u05e9' # 0xF9 -> HEBREW LETTER SHIN + '\u05ea' # 0xFA -> HEBREW LETTER TAV + '\ufffe' + '\ufffe' + '\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + '\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/iso8859_9.py b/venv/Lib/encodings/iso8859_9.py new file mode 100644 index 00000000..e539fdda --- /dev/null +++ b/venv/Lib/encodings/iso8859_9.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_9 generated from 'MAPPINGS/ISO8859/8859-9.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-9', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u011e' # 0xD0 -> LATIN CAPITAL LETTER G WITH BREVE + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0130' # 0xDD -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u011f' # 0xF0 -> LATIN SMALL LETTER G WITH BREVE + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u0131' # 0xFD -> LATIN SMALL LETTER DOTLESS I + '\u015f' # 0xFE -> LATIN SMALL LETTER S WITH CEDILLA + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/johab.py b/venv/Lib/encodings/johab.py new file mode 100644 index 00000000..512aeeb7 --- /dev/null +++ b/venv/Lib/encodings/johab.py @@ -0,0 +1,39 @@ +# +# johab.py: Python Unicode Codec for JOHAB +# +# Written by Hye-Shik Chang +# + +import _codecs_kr, codecs +import _multibytecodec as mbc + +codec = _codecs_kr.getcodec('johab') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='johab', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/koi8_r.py b/venv/Lib/encodings/koi8_r.py new file mode 100644 index 00000000..41ddde85 --- /dev/null +++ b/venv/Lib/encodings/koi8_r.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec koi8_r generated from 'MAPPINGS/VENDORS/MISC/KOI8-R.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='koi8-r', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u2500' # 0x80 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u2502' # 0x81 -> BOX DRAWINGS LIGHT VERTICAL + '\u250c' # 0x82 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2510' # 0x83 -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x84 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2518' # 0x85 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u251c' # 0x86 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2524' # 0x87 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u252c' # 0x88 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2534' # 0x89 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u253c' # 0x8A -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u2580' # 0x8B -> UPPER HALF BLOCK + '\u2584' # 0x8C -> LOWER HALF BLOCK + '\u2588' # 0x8D -> FULL BLOCK + '\u258c' # 0x8E -> LEFT HALF BLOCK + '\u2590' # 0x8F -> RIGHT HALF BLOCK + '\u2591' # 0x90 -> LIGHT SHADE + '\u2592' # 0x91 -> MEDIUM SHADE + '\u2593' # 0x92 -> DARK SHADE + '\u2320' # 0x93 -> TOP HALF INTEGRAL + '\u25a0' # 0x94 -> BLACK SQUARE + '\u2219' # 0x95 -> BULLET OPERATOR + '\u221a' # 0x96 -> SQUARE ROOT + '\u2248' # 0x97 -> ALMOST EQUAL TO + '\u2264' # 0x98 -> LESS-THAN OR EQUAL TO + '\u2265' # 0x99 -> GREATER-THAN OR EQUAL TO + '\xa0' # 0x9A -> NO-BREAK SPACE + '\u2321' # 0x9B -> BOTTOM HALF INTEGRAL + '\xb0' # 0x9C -> DEGREE SIGN + '\xb2' # 0x9D -> SUPERSCRIPT TWO + '\xb7' # 0x9E -> MIDDLE DOT + '\xf7' # 0x9F -> DIVISION SIGN + '\u2550' # 0xA0 -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u2551' # 0xA1 -> BOX DRAWINGS DOUBLE VERTICAL + '\u2552' # 0xA2 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO + '\u2553' # 0xA4 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u2554' # 0xA5 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2555' # 0xA6 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2556' # 0xA7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2557' # 0xA8 -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u2558' # 0xA9 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2559' # 0xAA -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u255a' # 0xAB -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u255b' # 0xAC -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u255c' # 0xAD -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255d' # 0xAE -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255e' # 0xAF -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0xB0 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u2560' # 0xB1 -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2561' # 0xB2 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO + '\u2562' # 0xB4 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2563' # 0xB5 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2564' # 0xB6 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0xB7 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2566' # 0xB8 -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2567' # 0xB9 -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0xBA -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2569' # 0xBB -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u256a' # 0xBC -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u256b' # 0xBD -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256c' # 0xBE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa9' # 0xBF -> COPYRIGHT SIGN + '\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU + '\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE + '\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE + '\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE + '\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF + '\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE + '\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA + '\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xCF -> CYRILLIC SMALL LETTER O + '\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE + '\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA + '\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U + '\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + '\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE + '\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU + '\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE + '\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA + '\u044d' # 0xDC -> CYRILLIC SMALL LETTER E + '\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA + '\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE + '\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN + '\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU + '\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE + '\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE + '\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE + '\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF + '\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE + '\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA + '\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE + '\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA + '\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U + '\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE + '\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU + '\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE + '\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA + '\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E + '\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA + '\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE + '\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/koi8_t.py b/venv/Lib/encodings/koi8_t.py new file mode 100644 index 00000000..b5415ba3 --- /dev/null +++ b/venv/Lib/encodings/koi8_t.py @@ -0,0 +1,308 @@ +""" Python Character Mapping Codec koi8_t +""" +# http://ru.wikipedia.org/wiki/КОИ-8 +# http://www.opensource.apple.com/source/libiconv/libiconv-4/libiconv/tests/KOI8-T.TXT + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='koi8-t', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u049b' # 0x80 -> CYRILLIC SMALL LETTER KA WITH DESCENDER + '\u0493' # 0x81 -> CYRILLIC SMALL LETTER GHE WITH STROKE + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0492' # 0x83 -> CYRILLIC CAPITAL LETTER GHE WITH STROKE + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\ufffe' # 0x88 -> UNDEFINED + '\u2030' # 0x89 -> PER MILLE SIGN + '\u04b3' # 0x8A -> CYRILLIC SMALL LETTER HA WITH DESCENDER + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u04b2' # 0x8C -> CYRILLIC CAPITAL LETTER HA WITH DESCENDER + '\u04b7' # 0x8D -> CYRILLIC SMALL LETTER CHE WITH DESCENDER + '\u04b6' # 0x8E -> CYRILLIC CAPITAL LETTER CHE WITH DESCENDER + '\ufffe' # 0x8F -> UNDEFINED + '\u049a' # 0x90 -> CYRILLIC CAPITAL LETTER KA WITH DESCENDER + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x9C -> UNDEFINED + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\ufffe' # 0x9F -> UNDEFINED + '\ufffe' # 0xA0 -> UNDEFINED + '\u04ef' # 0xA1 -> CYRILLIC SMALL LETTER U WITH MACRON + '\u04ee' # 0xA2 -> CYRILLIC CAPITAL LETTER U WITH MACRON + '\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u04e3' # 0xA5 -> CYRILLIC SMALL LETTER I WITH MACRON + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\ufffe' # 0xA8 -> UNDEFINED + '\ufffe' # 0xA9 -> UNDEFINED + '\ufffe' # 0xAA -> UNDEFINED + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\ufffe' # 0xAF -> UNDEFINED + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO + '\ufffe' # 0xB4 -> UNDEFINED + '\u04e2' # 0xB5 -> CYRILLIC CAPITAL LETTER I WITH MACRON + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\ufffe' # 0xB8 -> UNDEFINED + '\u2116' # 0xB9 -> NUMERO SIGN + '\ufffe' # 0xBA -> UNDEFINED + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\ufffe' # 0xBC -> UNDEFINED + '\ufffe' # 0xBD -> UNDEFINED + '\ufffe' # 0xBE -> UNDEFINED + '\xa9' # 0xBF -> COPYRIGHT SIGN + '\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU + '\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE + '\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE + '\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE + '\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF + '\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE + '\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA + '\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xCF -> CYRILLIC SMALL LETTER O + '\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE + '\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA + '\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U + '\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + '\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE + '\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU + '\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE + '\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA + '\u044d' # 0xDC -> CYRILLIC SMALL LETTER E + '\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA + '\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE + '\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN + '\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU + '\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE + '\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE + '\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE + '\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF + '\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE + '\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA + '\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE + '\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA + '\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U + '\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE + '\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU + '\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE + '\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA + '\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E + '\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA + '\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE + '\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/koi8_u.py b/venv/Lib/encodings/koi8_u.py new file mode 100644 index 00000000..f9e3fae5 --- /dev/null +++ b/venv/Lib/encodings/koi8_u.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec koi8_u generated from 'python-mappings/KOI8-U.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='koi8-u', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u2500' # 0x80 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u2502' # 0x81 -> BOX DRAWINGS LIGHT VERTICAL + '\u250c' # 0x82 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2510' # 0x83 -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x84 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2518' # 0x85 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u251c' # 0x86 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2524' # 0x87 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u252c' # 0x88 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2534' # 0x89 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u253c' # 0x8A -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u2580' # 0x8B -> UPPER HALF BLOCK + '\u2584' # 0x8C -> LOWER HALF BLOCK + '\u2588' # 0x8D -> FULL BLOCK + '\u258c' # 0x8E -> LEFT HALF BLOCK + '\u2590' # 0x8F -> RIGHT HALF BLOCK + '\u2591' # 0x90 -> LIGHT SHADE + '\u2592' # 0x91 -> MEDIUM SHADE + '\u2593' # 0x92 -> DARK SHADE + '\u2320' # 0x93 -> TOP HALF INTEGRAL + '\u25a0' # 0x94 -> BLACK SQUARE + '\u2219' # 0x95 -> BULLET OPERATOR + '\u221a' # 0x96 -> SQUARE ROOT + '\u2248' # 0x97 -> ALMOST EQUAL TO + '\u2264' # 0x98 -> LESS-THAN OR EQUAL TO + '\u2265' # 0x99 -> GREATER-THAN OR EQUAL TO + '\xa0' # 0x9A -> NO-BREAK SPACE + '\u2321' # 0x9B -> BOTTOM HALF INTEGRAL + '\xb0' # 0x9C -> DEGREE SIGN + '\xb2' # 0x9D -> SUPERSCRIPT TWO + '\xb7' # 0x9E -> MIDDLE DOT + '\xf7' # 0x9F -> DIVISION SIGN + '\u2550' # 0xA0 -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u2551' # 0xA1 -> BOX DRAWINGS DOUBLE VERTICAL + '\u2552' # 0xA2 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO + '\u0454' # 0xA4 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u2554' # 0xA5 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u0456' # 0xA6 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0457' # 0xA7 -> CYRILLIC SMALL LETTER YI (UKRAINIAN) + '\u2557' # 0xA8 -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u2558' # 0xA9 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2559' # 0xAA -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u255a' # 0xAB -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u255b' # 0xAC -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u0491' # 0xAD -> CYRILLIC SMALL LETTER UKRAINIAN GHE WITH UPTURN + '\u255d' # 0xAE -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255e' # 0xAF -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0xB0 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u2560' # 0xB1 -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2561' # 0xB2 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO + '\u0404' # 0xB4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u2563' # 0xB5 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u0406' # 0xB6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0407' # 0xB7 -> CYRILLIC CAPITAL LETTER YI (UKRAINIAN) + '\u2566' # 0xB8 -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2567' # 0xB9 -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0xBA -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2569' # 0xBB -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u256a' # 0xBC -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u0490' # 0xBD -> CYRILLIC CAPITAL LETTER UKRAINIAN GHE WITH UPTURN + '\u256c' # 0xBE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa9' # 0xBF -> COPYRIGHT SIGN + '\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU + '\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE + '\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE + '\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE + '\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF + '\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE + '\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA + '\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xCF -> CYRILLIC SMALL LETTER O + '\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE + '\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA + '\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U + '\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + '\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE + '\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU + '\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE + '\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA + '\u044d' # 0xDC -> CYRILLIC SMALL LETTER E + '\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA + '\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE + '\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN + '\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU + '\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE + '\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE + '\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE + '\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF + '\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE + '\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA + '\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE + '\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA + '\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U + '\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE + '\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU + '\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE + '\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA + '\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E + '\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA + '\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE + '\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/kz1048.py b/venv/Lib/encodings/kz1048.py new file mode 100644 index 00000000..712aee6e --- /dev/null +++ b/venv/Lib/encodings/kz1048.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec kz1048 generated from 'MAPPINGS/VENDORS/MISC/KZ1048.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self, input, errors='strict'): + return codecs.charmap_encode(input, errors, encoding_table) + + def decode(self, input, errors='strict'): + return codecs.charmap_decode(input, errors, decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input, self.errors, encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input, self.errors, decoding_table)[0] + +class StreamWriter(Codec, codecs.StreamWriter): + pass + +class StreamReader(Codec, codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='kz1048', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u0402' # 0x80 -> CYRILLIC CAPITAL LETTER DJE + '\u0403' # 0x81 -> CYRILLIC CAPITAL LETTER GJE + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0453' # 0x83 -> CYRILLIC SMALL LETTER GJE + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u20ac' # 0x88 -> EURO SIGN + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0409' # 0x8A -> CYRILLIC CAPITAL LETTER LJE + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u040a' # 0x8C -> CYRILLIC CAPITAL LETTER NJE + '\u049a' # 0x8D -> CYRILLIC CAPITAL LETTER KA WITH DESCENDER + '\u04ba' # 0x8E -> CYRILLIC CAPITAL LETTER SHHA + '\u040f' # 0x8F -> CYRILLIC CAPITAL LETTER DZHE + '\u0452' # 0x90 -> CYRILLIC SMALL LETTER DJE + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0459' # 0x9A -> CYRILLIC SMALL LETTER LJE + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u045a' # 0x9C -> CYRILLIC SMALL LETTER NJE + '\u049b' # 0x9D -> CYRILLIC SMALL LETTER KA WITH DESCENDER + '\u04bb' # 0x9E -> CYRILLIC SMALL LETTER SHHA + '\u045f' # 0x9F -> CYRILLIC SMALL LETTER DZHE + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u04b0' # 0xA1 -> CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + '\u04b1' # 0xA2 -> CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE + '\u04d8' # 0xA3 -> CYRILLIC CAPITAL LETTER SCHWA + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u04e8' # 0xA5 -> CYRILLIC CAPITAL LETTER BARRED O + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\u0401' # 0xA8 -> CYRILLIC CAPITAL LETTER IO + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0492' # 0xAA -> CYRILLIC CAPITAL LETTER GHE WITH STROKE + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u04ae' # 0xAF -> CYRILLIC CAPITAL LETTER STRAIGHT U + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u0406' # 0xB2 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0456' # 0xB3 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u04e9' # 0xB4 -> CYRILLIC SMALL LETTER BARRED O + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0451' # 0xB8 -> CYRILLIC SMALL LETTER IO + '\u2116' # 0xB9 -> NUMERO SIGN + '\u0493' # 0xBA -> CYRILLIC SMALL LETTER GHE WITH STROKE + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u04d9' # 0xBC -> CYRILLIC SMALL LETTER SCHWA + '\u04a2' # 0xBD -> CYRILLIC CAPITAL LETTER EN WITH DESCENDER + '\u04a3' # 0xBE -> CYRILLIC SMALL LETTER EN WITH DESCENDER + '\u04af' # 0xBF -> CYRILLIC SMALL LETTER STRAIGHT U + '\u0410' # 0xC0 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xC1 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0xC2 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0xC3 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0xC4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xC5 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0xC6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0xC7 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0xC8 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xC9 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xCA -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xCB -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xCC -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xCD -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xCE -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xCF -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0xD0 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xD1 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xD2 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xD3 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0xD4 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0xD5 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0xD6 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0xD7 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0xD8 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0xD9 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0xDA -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0xDB -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0xDC -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0xDD -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0xDE -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0xDF -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + '\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + '\u044f' # 0xFF -> CYRILLIC SMALL LETTER YA +) + +### Encoding table +encoding_table = codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/latin_1.py b/venv/Lib/encodings/latin_1.py new file mode 100644 index 00000000..370160c0 --- /dev/null +++ b/venv/Lib/encodings/latin_1.py @@ -0,0 +1,50 @@ +""" Python 'latin-1' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.latin_1_encode + decode = codecs.latin_1_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.latin_1_encode(input,self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.latin_1_decode(input,self.errors)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +class StreamConverter(StreamWriter,StreamReader): + + encode = codecs.latin_1_decode + decode = codecs.latin_1_encode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-1', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/mac_arabic.py b/venv/Lib/encodings/mac_arabic.py new file mode 100644 index 00000000..72847e85 --- /dev/null +++ b/venv/Lib/encodings/mac_arabic.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/APPLE/ARABIC.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-arabic', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x0081: 0x00a0, # NO-BREAK SPACE, right-left + 0x0082: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0083: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0084: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x0085: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x0086: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x0087: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x0088: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0089: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x008a: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x008b: 0x06ba, # ARABIC LETTER NOON GHUNNA + 0x008c: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x008d: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x008e: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x008f: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x0090: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0091: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x0092: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x0093: 0x2026, # HORIZONTAL ELLIPSIS, right-left + 0x0094: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x0095: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x0096: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x0097: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x0098: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x0099: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x009b: 0x00f7, # DIVISION SIGN, right-left + 0x009c: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x009d: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x009e: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x009f: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00a0: 0x0020, # SPACE, right-left + 0x00a1: 0x0021, # EXCLAMATION MARK, right-left + 0x00a2: 0x0022, # QUOTATION MARK, right-left + 0x00a3: 0x0023, # NUMBER SIGN, right-left + 0x00a4: 0x0024, # DOLLAR SIGN, right-left + 0x00a5: 0x066a, # ARABIC PERCENT SIGN + 0x00a6: 0x0026, # AMPERSAND, right-left + 0x00a7: 0x0027, # APOSTROPHE, right-left + 0x00a8: 0x0028, # LEFT PARENTHESIS, right-left + 0x00a9: 0x0029, # RIGHT PARENTHESIS, right-left + 0x00aa: 0x002a, # ASTERISK, right-left + 0x00ab: 0x002b, # PLUS SIGN, right-left + 0x00ac: 0x060c, # ARABIC COMMA + 0x00ad: 0x002d, # HYPHEN-MINUS, right-left + 0x00ae: 0x002e, # FULL STOP, right-left + 0x00af: 0x002f, # SOLIDUS, right-left + 0x00b0: 0x0660, # ARABIC-INDIC DIGIT ZERO, right-left (need override) + 0x00b1: 0x0661, # ARABIC-INDIC DIGIT ONE, right-left (need override) + 0x00b2: 0x0662, # ARABIC-INDIC DIGIT TWO, right-left (need override) + 0x00b3: 0x0663, # ARABIC-INDIC DIGIT THREE, right-left (need override) + 0x00b4: 0x0664, # ARABIC-INDIC DIGIT FOUR, right-left (need override) + 0x00b5: 0x0665, # ARABIC-INDIC DIGIT FIVE, right-left (need override) + 0x00b6: 0x0666, # ARABIC-INDIC DIGIT SIX, right-left (need override) + 0x00b7: 0x0667, # ARABIC-INDIC DIGIT SEVEN, right-left (need override) + 0x00b8: 0x0668, # ARABIC-INDIC DIGIT EIGHT, right-left (need override) + 0x00b9: 0x0669, # ARABIC-INDIC DIGIT NINE, right-left (need override) + 0x00ba: 0x003a, # COLON, right-left + 0x00bb: 0x061b, # ARABIC SEMICOLON + 0x00bc: 0x003c, # LESS-THAN SIGN, right-left + 0x00bd: 0x003d, # EQUALS SIGN, right-left + 0x00be: 0x003e, # GREATER-THAN SIGN, right-left + 0x00bf: 0x061f, # ARABIC QUESTION MARK + 0x00c0: 0x274a, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + 0x00c1: 0x0621, # ARABIC LETTER HAMZA + 0x00c2: 0x0622, # ARABIC LETTER ALEF WITH MADDA ABOVE + 0x00c3: 0x0623, # ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x00c4: 0x0624, # ARABIC LETTER WAW WITH HAMZA ABOVE + 0x00c5: 0x0625, # ARABIC LETTER ALEF WITH HAMZA BELOW + 0x00c6: 0x0626, # ARABIC LETTER YEH WITH HAMZA ABOVE + 0x00c7: 0x0627, # ARABIC LETTER ALEF + 0x00c8: 0x0628, # ARABIC LETTER BEH + 0x00c9: 0x0629, # ARABIC LETTER TEH MARBUTA + 0x00ca: 0x062a, # ARABIC LETTER TEH + 0x00cb: 0x062b, # ARABIC LETTER THEH + 0x00cc: 0x062c, # ARABIC LETTER JEEM + 0x00cd: 0x062d, # ARABIC LETTER HAH + 0x00ce: 0x062e, # ARABIC LETTER KHAH + 0x00cf: 0x062f, # ARABIC LETTER DAL + 0x00d0: 0x0630, # ARABIC LETTER THAL + 0x00d1: 0x0631, # ARABIC LETTER REH + 0x00d2: 0x0632, # ARABIC LETTER ZAIN + 0x00d3: 0x0633, # ARABIC LETTER SEEN + 0x00d4: 0x0634, # ARABIC LETTER SHEEN + 0x00d5: 0x0635, # ARABIC LETTER SAD + 0x00d6: 0x0636, # ARABIC LETTER DAD + 0x00d7: 0x0637, # ARABIC LETTER TAH + 0x00d8: 0x0638, # ARABIC LETTER ZAH + 0x00d9: 0x0639, # ARABIC LETTER AIN + 0x00da: 0x063a, # ARABIC LETTER GHAIN + 0x00db: 0x005b, # LEFT SQUARE BRACKET, right-left + 0x00dc: 0x005c, # REVERSE SOLIDUS, right-left + 0x00dd: 0x005d, # RIGHT SQUARE BRACKET, right-left + 0x00de: 0x005e, # CIRCUMFLEX ACCENT, right-left + 0x00df: 0x005f, # LOW LINE, right-left + 0x00e0: 0x0640, # ARABIC TATWEEL + 0x00e1: 0x0641, # ARABIC LETTER FEH + 0x00e2: 0x0642, # ARABIC LETTER QAF + 0x00e3: 0x0643, # ARABIC LETTER KAF + 0x00e4: 0x0644, # ARABIC LETTER LAM + 0x00e5: 0x0645, # ARABIC LETTER MEEM + 0x00e6: 0x0646, # ARABIC LETTER NOON + 0x00e7: 0x0647, # ARABIC LETTER HEH + 0x00e8: 0x0648, # ARABIC LETTER WAW + 0x00e9: 0x0649, # ARABIC LETTER ALEF MAKSURA + 0x00ea: 0x064a, # ARABIC LETTER YEH + 0x00eb: 0x064b, # ARABIC FATHATAN + 0x00ec: 0x064c, # ARABIC DAMMATAN + 0x00ed: 0x064d, # ARABIC KASRATAN + 0x00ee: 0x064e, # ARABIC FATHA + 0x00ef: 0x064f, # ARABIC DAMMA + 0x00f0: 0x0650, # ARABIC KASRA + 0x00f1: 0x0651, # ARABIC SHADDA + 0x00f2: 0x0652, # ARABIC SUKUN + 0x00f3: 0x067e, # ARABIC LETTER PEH + 0x00f4: 0x0679, # ARABIC LETTER TTEH + 0x00f5: 0x0686, # ARABIC LETTER TCHEH + 0x00f6: 0x06d5, # ARABIC LETTER AE + 0x00f7: 0x06a4, # ARABIC LETTER VEH + 0x00f8: 0x06af, # ARABIC LETTER GAF + 0x00f9: 0x0688, # ARABIC LETTER DDAL + 0x00fa: 0x0691, # ARABIC LETTER RREH + 0x00fb: 0x007b, # LEFT CURLY BRACKET, right-left + 0x00fc: 0x007c, # VERTICAL LINE, right-left + 0x00fd: 0x007d, # RIGHT CURLY BRACKET, right-left + 0x00fe: 0x0698, # ARABIC LETTER JEH + 0x00ff: 0x06d2, # ARABIC LETTER YEH BARREE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> CONTROL CHARACTER + '\x01' # 0x0001 -> CONTROL CHARACTER + '\x02' # 0x0002 -> CONTROL CHARACTER + '\x03' # 0x0003 -> CONTROL CHARACTER + '\x04' # 0x0004 -> CONTROL CHARACTER + '\x05' # 0x0005 -> CONTROL CHARACTER + '\x06' # 0x0006 -> CONTROL CHARACTER + '\x07' # 0x0007 -> CONTROL CHARACTER + '\x08' # 0x0008 -> CONTROL CHARACTER + '\t' # 0x0009 -> CONTROL CHARACTER + '\n' # 0x000a -> CONTROL CHARACTER + '\x0b' # 0x000b -> CONTROL CHARACTER + '\x0c' # 0x000c -> CONTROL CHARACTER + '\r' # 0x000d -> CONTROL CHARACTER + '\x0e' # 0x000e -> CONTROL CHARACTER + '\x0f' # 0x000f -> CONTROL CHARACTER + '\x10' # 0x0010 -> CONTROL CHARACTER + '\x11' # 0x0011 -> CONTROL CHARACTER + '\x12' # 0x0012 -> CONTROL CHARACTER + '\x13' # 0x0013 -> CONTROL CHARACTER + '\x14' # 0x0014 -> CONTROL CHARACTER + '\x15' # 0x0015 -> CONTROL CHARACTER + '\x16' # 0x0016 -> CONTROL CHARACTER + '\x17' # 0x0017 -> CONTROL CHARACTER + '\x18' # 0x0018 -> CONTROL CHARACTER + '\x19' # 0x0019 -> CONTROL CHARACTER + '\x1a' # 0x001a -> CONTROL CHARACTER + '\x1b' # 0x001b -> CONTROL CHARACTER + '\x1c' # 0x001c -> CONTROL CHARACTER + '\x1d' # 0x001d -> CONTROL CHARACTER + '\x1e' # 0x001e -> CONTROL CHARACTER + '\x1f' # 0x001f -> CONTROL CHARACTER + ' ' # 0x0020 -> SPACE, left-right + '!' # 0x0021 -> EXCLAMATION MARK, left-right + '"' # 0x0022 -> QUOTATION MARK, left-right + '#' # 0x0023 -> NUMBER SIGN, left-right + '$' # 0x0024 -> DOLLAR SIGN, left-right + '%' # 0x0025 -> PERCENT SIGN, left-right + '&' # 0x0026 -> AMPERSAND, left-right + "'" # 0x0027 -> APOSTROPHE, left-right + '(' # 0x0028 -> LEFT PARENTHESIS, left-right + ')' # 0x0029 -> RIGHT PARENTHESIS, left-right + '*' # 0x002a -> ASTERISK, left-right + '+' # 0x002b -> PLUS SIGN, left-right + ',' # 0x002c -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + '-' # 0x002d -> HYPHEN-MINUS, left-right + '.' # 0x002e -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + '/' # 0x002f -> SOLIDUS, left-right + '0' # 0x0030 -> DIGIT ZERO; in Arabic-script context, displayed as 0x0660 ARABIC-INDIC DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE; in Arabic-script context, displayed as 0x0661 ARABIC-INDIC DIGIT ONE + '2' # 0x0032 -> DIGIT TWO; in Arabic-script context, displayed as 0x0662 ARABIC-INDIC DIGIT TWO + '3' # 0x0033 -> DIGIT THREE; in Arabic-script context, displayed as 0x0663 ARABIC-INDIC DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR; in Arabic-script context, displayed as 0x0664 ARABIC-INDIC DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE; in Arabic-script context, displayed as 0x0665 ARABIC-INDIC DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX; in Arabic-script context, displayed as 0x0666 ARABIC-INDIC DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x0667 ARABIC-INDIC DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x0668 ARABIC-INDIC DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE; in Arabic-script context, displayed as 0x0669 ARABIC-INDIC DIGIT NINE + ':' # 0x003a -> COLON, left-right + ';' # 0x003b -> SEMICOLON, left-right + '<' # 0x003c -> LESS-THAN SIGN, left-right + '=' # 0x003d -> EQUALS SIGN, left-right + '>' # 0x003e -> GREATER-THAN SIGN, left-right + '?' # 0x003f -> QUESTION MARK, left-right + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET, left-right + '\\' # 0x005c -> REVERSE SOLIDUS, left-right + ']' # 0x005d -> RIGHT SQUARE BRACKET, left-right + '^' # 0x005e -> CIRCUMFLEX ACCENT, left-right + '_' # 0x005f -> LOW LINE, left-right + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET, left-right + '|' # 0x007c -> VERTICAL LINE, left-right + '}' # 0x007d -> RIGHT CURLY BRACKET, left-right + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> CONTROL CHARACTER + '\xc4' # 0x0080 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xa0' # 0x0081 -> NO-BREAK SPACE, right-left + '\xc7' # 0x0082 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x0083 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x0084 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x0085 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x0086 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x0087 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x0088 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x0089 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x008a -> LATIN SMALL LETTER A WITH DIAERESIS + '\u06ba' # 0x008b -> ARABIC LETTER NOON GHUNNA + '\xab' # 0x008c -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + '\xe7' # 0x008d -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x008e -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x008f -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x0090 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0091 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x0092 -> LATIN SMALL LETTER I WITH ACUTE + '\u2026' # 0x0093 -> HORIZONTAL ELLIPSIS, right-left + '\xee' # 0x0094 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x0095 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x0096 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x0097 -> LATIN SMALL LETTER O WITH ACUTE + '\xbb' # 0x0098 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + '\xf4' # 0x0099 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x009a -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0x009b -> DIVISION SIGN, right-left + '\xfa' # 0x009c -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x009d -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x009e -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x009f -> LATIN SMALL LETTER U WITH DIAERESIS + ' ' # 0x00a0 -> SPACE, right-left + '!' # 0x00a1 -> EXCLAMATION MARK, right-left + '"' # 0x00a2 -> QUOTATION MARK, right-left + '#' # 0x00a3 -> NUMBER SIGN, right-left + '$' # 0x00a4 -> DOLLAR SIGN, right-left + '\u066a' # 0x00a5 -> ARABIC PERCENT SIGN + '&' # 0x00a6 -> AMPERSAND, right-left + "'" # 0x00a7 -> APOSTROPHE, right-left + '(' # 0x00a8 -> LEFT PARENTHESIS, right-left + ')' # 0x00a9 -> RIGHT PARENTHESIS, right-left + '*' # 0x00aa -> ASTERISK, right-left + '+' # 0x00ab -> PLUS SIGN, right-left + '\u060c' # 0x00ac -> ARABIC COMMA + '-' # 0x00ad -> HYPHEN-MINUS, right-left + '.' # 0x00ae -> FULL STOP, right-left + '/' # 0x00af -> SOLIDUS, right-left + '\u0660' # 0x00b0 -> ARABIC-INDIC DIGIT ZERO, right-left (need override) + '\u0661' # 0x00b1 -> ARABIC-INDIC DIGIT ONE, right-left (need override) + '\u0662' # 0x00b2 -> ARABIC-INDIC DIGIT TWO, right-left (need override) + '\u0663' # 0x00b3 -> ARABIC-INDIC DIGIT THREE, right-left (need override) + '\u0664' # 0x00b4 -> ARABIC-INDIC DIGIT FOUR, right-left (need override) + '\u0665' # 0x00b5 -> ARABIC-INDIC DIGIT FIVE, right-left (need override) + '\u0666' # 0x00b6 -> ARABIC-INDIC DIGIT SIX, right-left (need override) + '\u0667' # 0x00b7 -> ARABIC-INDIC DIGIT SEVEN, right-left (need override) + '\u0668' # 0x00b8 -> ARABIC-INDIC DIGIT EIGHT, right-left (need override) + '\u0669' # 0x00b9 -> ARABIC-INDIC DIGIT NINE, right-left (need override) + ':' # 0x00ba -> COLON, right-left + '\u061b' # 0x00bb -> ARABIC SEMICOLON + '<' # 0x00bc -> LESS-THAN SIGN, right-left + '=' # 0x00bd -> EQUALS SIGN, right-left + '>' # 0x00be -> GREATER-THAN SIGN, right-left + '\u061f' # 0x00bf -> ARABIC QUESTION MARK + '\u274a' # 0x00c0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + '\u0621' # 0x00c1 -> ARABIC LETTER HAMZA + '\u0622' # 0x00c2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0x00c3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0x00c4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0625' # 0x00c5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0x00c6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0x00c7 -> ARABIC LETTER ALEF + '\u0628' # 0x00c8 -> ARABIC LETTER BEH + '\u0629' # 0x00c9 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0x00ca -> ARABIC LETTER TEH + '\u062b' # 0x00cb -> ARABIC LETTER THEH + '\u062c' # 0x00cc -> ARABIC LETTER JEEM + '\u062d' # 0x00cd -> ARABIC LETTER HAH + '\u062e' # 0x00ce -> ARABIC LETTER KHAH + '\u062f' # 0x00cf -> ARABIC LETTER DAL + '\u0630' # 0x00d0 -> ARABIC LETTER THAL + '\u0631' # 0x00d1 -> ARABIC LETTER REH + '\u0632' # 0x00d2 -> ARABIC LETTER ZAIN + '\u0633' # 0x00d3 -> ARABIC LETTER SEEN + '\u0634' # 0x00d4 -> ARABIC LETTER SHEEN + '\u0635' # 0x00d5 -> ARABIC LETTER SAD + '\u0636' # 0x00d6 -> ARABIC LETTER DAD + '\u0637' # 0x00d7 -> ARABIC LETTER TAH + '\u0638' # 0x00d8 -> ARABIC LETTER ZAH + '\u0639' # 0x00d9 -> ARABIC LETTER AIN + '\u063a' # 0x00da -> ARABIC LETTER GHAIN + '[' # 0x00db -> LEFT SQUARE BRACKET, right-left + '\\' # 0x00dc -> REVERSE SOLIDUS, right-left + ']' # 0x00dd -> RIGHT SQUARE BRACKET, right-left + '^' # 0x00de -> CIRCUMFLEX ACCENT, right-left + '_' # 0x00df -> LOW LINE, right-left + '\u0640' # 0x00e0 -> ARABIC TATWEEL + '\u0641' # 0x00e1 -> ARABIC LETTER FEH + '\u0642' # 0x00e2 -> ARABIC LETTER QAF + '\u0643' # 0x00e3 -> ARABIC LETTER KAF + '\u0644' # 0x00e4 -> ARABIC LETTER LAM + '\u0645' # 0x00e5 -> ARABIC LETTER MEEM + '\u0646' # 0x00e6 -> ARABIC LETTER NOON + '\u0647' # 0x00e7 -> ARABIC LETTER HEH + '\u0648' # 0x00e8 -> ARABIC LETTER WAW + '\u0649' # 0x00e9 -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0x00ea -> ARABIC LETTER YEH + '\u064b' # 0x00eb -> ARABIC FATHATAN + '\u064c' # 0x00ec -> ARABIC DAMMATAN + '\u064d' # 0x00ed -> ARABIC KASRATAN + '\u064e' # 0x00ee -> ARABIC FATHA + '\u064f' # 0x00ef -> ARABIC DAMMA + '\u0650' # 0x00f0 -> ARABIC KASRA + '\u0651' # 0x00f1 -> ARABIC SHADDA + '\u0652' # 0x00f2 -> ARABIC SUKUN + '\u067e' # 0x00f3 -> ARABIC LETTER PEH + '\u0679' # 0x00f4 -> ARABIC LETTER TTEH + '\u0686' # 0x00f5 -> ARABIC LETTER TCHEH + '\u06d5' # 0x00f6 -> ARABIC LETTER AE + '\u06a4' # 0x00f7 -> ARABIC LETTER VEH + '\u06af' # 0x00f8 -> ARABIC LETTER GAF + '\u0688' # 0x00f9 -> ARABIC LETTER DDAL + '\u0691' # 0x00fa -> ARABIC LETTER RREH + '{' # 0x00fb -> LEFT CURLY BRACKET, right-left + '|' # 0x00fc -> VERTICAL LINE, right-left + '}' # 0x00fd -> RIGHT CURLY BRACKET, right-left + '\u0698' # 0x00fe -> ARABIC LETTER JEH + '\u06d2' # 0x00ff -> ARABIC LETTER YEH BARREE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # CONTROL CHARACTER + 0x0001: 0x0001, # CONTROL CHARACTER + 0x0002: 0x0002, # CONTROL CHARACTER + 0x0003: 0x0003, # CONTROL CHARACTER + 0x0004: 0x0004, # CONTROL CHARACTER + 0x0005: 0x0005, # CONTROL CHARACTER + 0x0006: 0x0006, # CONTROL CHARACTER + 0x0007: 0x0007, # CONTROL CHARACTER + 0x0008: 0x0008, # CONTROL CHARACTER + 0x0009: 0x0009, # CONTROL CHARACTER + 0x000a: 0x000a, # CONTROL CHARACTER + 0x000b: 0x000b, # CONTROL CHARACTER + 0x000c: 0x000c, # CONTROL CHARACTER + 0x000d: 0x000d, # CONTROL CHARACTER + 0x000e: 0x000e, # CONTROL CHARACTER + 0x000f: 0x000f, # CONTROL CHARACTER + 0x0010: 0x0010, # CONTROL CHARACTER + 0x0011: 0x0011, # CONTROL CHARACTER + 0x0012: 0x0012, # CONTROL CHARACTER + 0x0013: 0x0013, # CONTROL CHARACTER + 0x0014: 0x0014, # CONTROL CHARACTER + 0x0015: 0x0015, # CONTROL CHARACTER + 0x0016: 0x0016, # CONTROL CHARACTER + 0x0017: 0x0017, # CONTROL CHARACTER + 0x0018: 0x0018, # CONTROL CHARACTER + 0x0019: 0x0019, # CONTROL CHARACTER + 0x001a: 0x001a, # CONTROL CHARACTER + 0x001b: 0x001b, # CONTROL CHARACTER + 0x001c: 0x001c, # CONTROL CHARACTER + 0x001d: 0x001d, # CONTROL CHARACTER + 0x001e: 0x001e, # CONTROL CHARACTER + 0x001f: 0x001f, # CONTROL CHARACTER + 0x0020: 0x0020, # SPACE, left-right + 0x0020: 0x00a0, # SPACE, right-left + 0x0021: 0x0021, # EXCLAMATION MARK, left-right + 0x0021: 0x00a1, # EXCLAMATION MARK, right-left + 0x0022: 0x0022, # QUOTATION MARK, left-right + 0x0022: 0x00a2, # QUOTATION MARK, right-left + 0x0023: 0x0023, # NUMBER SIGN, left-right + 0x0023: 0x00a3, # NUMBER SIGN, right-left + 0x0024: 0x0024, # DOLLAR SIGN, left-right + 0x0024: 0x00a4, # DOLLAR SIGN, right-left + 0x0025: 0x0025, # PERCENT SIGN, left-right + 0x0026: 0x0026, # AMPERSAND, left-right + 0x0026: 0x00a6, # AMPERSAND, right-left + 0x0027: 0x0027, # APOSTROPHE, left-right + 0x0027: 0x00a7, # APOSTROPHE, right-left + 0x0028: 0x0028, # LEFT PARENTHESIS, left-right + 0x0028: 0x00a8, # LEFT PARENTHESIS, right-left + 0x0029: 0x0029, # RIGHT PARENTHESIS, left-right + 0x0029: 0x00a9, # RIGHT PARENTHESIS, right-left + 0x002a: 0x002a, # ASTERISK, left-right + 0x002a: 0x00aa, # ASTERISK, right-left + 0x002b: 0x002b, # PLUS SIGN, left-right + 0x002b: 0x00ab, # PLUS SIGN, right-left + 0x002c: 0x002c, # COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + 0x002d: 0x002d, # HYPHEN-MINUS, left-right + 0x002d: 0x00ad, # HYPHEN-MINUS, right-left + 0x002e: 0x002e, # FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + 0x002e: 0x00ae, # FULL STOP, right-left + 0x002f: 0x002f, # SOLIDUS, left-right + 0x002f: 0x00af, # SOLIDUS, right-left + 0x0030: 0x0030, # DIGIT ZERO; in Arabic-script context, displayed as 0x0660 ARABIC-INDIC DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE; in Arabic-script context, displayed as 0x0661 ARABIC-INDIC DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO; in Arabic-script context, displayed as 0x0662 ARABIC-INDIC DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE; in Arabic-script context, displayed as 0x0663 ARABIC-INDIC DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR; in Arabic-script context, displayed as 0x0664 ARABIC-INDIC DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE; in Arabic-script context, displayed as 0x0665 ARABIC-INDIC DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX; in Arabic-script context, displayed as 0x0666 ARABIC-INDIC DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN; in Arabic-script context, displayed as 0x0667 ARABIC-INDIC DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT; in Arabic-script context, displayed as 0x0668 ARABIC-INDIC DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE; in Arabic-script context, displayed as 0x0669 ARABIC-INDIC DIGIT NINE + 0x003a: 0x003a, # COLON, left-right + 0x003a: 0x00ba, # COLON, right-left + 0x003b: 0x003b, # SEMICOLON, left-right + 0x003c: 0x003c, # LESS-THAN SIGN, left-right + 0x003c: 0x00bc, # LESS-THAN SIGN, right-left + 0x003d: 0x003d, # EQUALS SIGN, left-right + 0x003d: 0x00bd, # EQUALS SIGN, right-left + 0x003e: 0x003e, # GREATER-THAN SIGN, left-right + 0x003e: 0x00be, # GREATER-THAN SIGN, right-left + 0x003f: 0x003f, # QUESTION MARK, left-right + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET, left-right + 0x005b: 0x00db, # LEFT SQUARE BRACKET, right-left + 0x005c: 0x005c, # REVERSE SOLIDUS, left-right + 0x005c: 0x00dc, # REVERSE SOLIDUS, right-left + 0x005d: 0x005d, # RIGHT SQUARE BRACKET, left-right + 0x005d: 0x00dd, # RIGHT SQUARE BRACKET, right-left + 0x005e: 0x005e, # CIRCUMFLEX ACCENT, left-right + 0x005e: 0x00de, # CIRCUMFLEX ACCENT, right-left + 0x005f: 0x005f, # LOW LINE, left-right + 0x005f: 0x00df, # LOW LINE, right-left + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET, left-right + 0x007b: 0x00fb, # LEFT CURLY BRACKET, right-left + 0x007c: 0x007c, # VERTICAL LINE, left-right + 0x007c: 0x00fc, # VERTICAL LINE, right-left + 0x007d: 0x007d, # RIGHT CURLY BRACKET, left-right + 0x007d: 0x00fd, # RIGHT CURLY BRACKET, right-left + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # CONTROL CHARACTER + 0x00a0: 0x0081, # NO-BREAK SPACE, right-left + 0x00ab: 0x008c, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x00bb: 0x0098, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x00c4: 0x0080, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c7: 0x0082, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0083, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x0084, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0085, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00dc: 0x0086, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00e0: 0x0088, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x0087, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0089, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x008a, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e7: 0x008d, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008f, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x008e, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0090, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0091, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x0092, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x0094, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x0095, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x0096, # LATIN SMALL LETTER N WITH TILDE + 0x00f3: 0x0097, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0099, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x009a, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x009b, # DIVISION SIGN, right-left + 0x00f9: 0x009d, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x009c, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x009e, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x009f, # LATIN SMALL LETTER U WITH DIAERESIS + 0x060c: 0x00ac, # ARABIC COMMA + 0x061b: 0x00bb, # ARABIC SEMICOLON + 0x061f: 0x00bf, # ARABIC QUESTION MARK + 0x0621: 0x00c1, # ARABIC LETTER HAMZA + 0x0622: 0x00c2, # ARABIC LETTER ALEF WITH MADDA ABOVE + 0x0623: 0x00c3, # ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x0624: 0x00c4, # ARABIC LETTER WAW WITH HAMZA ABOVE + 0x0625: 0x00c5, # ARABIC LETTER ALEF WITH HAMZA BELOW + 0x0626: 0x00c6, # ARABIC LETTER YEH WITH HAMZA ABOVE + 0x0627: 0x00c7, # ARABIC LETTER ALEF + 0x0628: 0x00c8, # ARABIC LETTER BEH + 0x0629: 0x00c9, # ARABIC LETTER TEH MARBUTA + 0x062a: 0x00ca, # ARABIC LETTER TEH + 0x062b: 0x00cb, # ARABIC LETTER THEH + 0x062c: 0x00cc, # ARABIC LETTER JEEM + 0x062d: 0x00cd, # ARABIC LETTER HAH + 0x062e: 0x00ce, # ARABIC LETTER KHAH + 0x062f: 0x00cf, # ARABIC LETTER DAL + 0x0630: 0x00d0, # ARABIC LETTER THAL + 0x0631: 0x00d1, # ARABIC LETTER REH + 0x0632: 0x00d2, # ARABIC LETTER ZAIN + 0x0633: 0x00d3, # ARABIC LETTER SEEN + 0x0634: 0x00d4, # ARABIC LETTER SHEEN + 0x0635: 0x00d5, # ARABIC LETTER SAD + 0x0636: 0x00d6, # ARABIC LETTER DAD + 0x0637: 0x00d7, # ARABIC LETTER TAH + 0x0638: 0x00d8, # ARABIC LETTER ZAH + 0x0639: 0x00d9, # ARABIC LETTER AIN + 0x063a: 0x00da, # ARABIC LETTER GHAIN + 0x0640: 0x00e0, # ARABIC TATWEEL + 0x0641: 0x00e1, # ARABIC LETTER FEH + 0x0642: 0x00e2, # ARABIC LETTER QAF + 0x0643: 0x00e3, # ARABIC LETTER KAF + 0x0644: 0x00e4, # ARABIC LETTER LAM + 0x0645: 0x00e5, # ARABIC LETTER MEEM + 0x0646: 0x00e6, # ARABIC LETTER NOON + 0x0647: 0x00e7, # ARABIC LETTER HEH + 0x0648: 0x00e8, # ARABIC LETTER WAW + 0x0649: 0x00e9, # ARABIC LETTER ALEF MAKSURA + 0x064a: 0x00ea, # ARABIC LETTER YEH + 0x064b: 0x00eb, # ARABIC FATHATAN + 0x064c: 0x00ec, # ARABIC DAMMATAN + 0x064d: 0x00ed, # ARABIC KASRATAN + 0x064e: 0x00ee, # ARABIC FATHA + 0x064f: 0x00ef, # ARABIC DAMMA + 0x0650: 0x00f0, # ARABIC KASRA + 0x0651: 0x00f1, # ARABIC SHADDA + 0x0652: 0x00f2, # ARABIC SUKUN + 0x0660: 0x00b0, # ARABIC-INDIC DIGIT ZERO, right-left (need override) + 0x0661: 0x00b1, # ARABIC-INDIC DIGIT ONE, right-left (need override) + 0x0662: 0x00b2, # ARABIC-INDIC DIGIT TWO, right-left (need override) + 0x0663: 0x00b3, # ARABIC-INDIC DIGIT THREE, right-left (need override) + 0x0664: 0x00b4, # ARABIC-INDIC DIGIT FOUR, right-left (need override) + 0x0665: 0x00b5, # ARABIC-INDIC DIGIT FIVE, right-left (need override) + 0x0666: 0x00b6, # ARABIC-INDIC DIGIT SIX, right-left (need override) + 0x0667: 0x00b7, # ARABIC-INDIC DIGIT SEVEN, right-left (need override) + 0x0668: 0x00b8, # ARABIC-INDIC DIGIT EIGHT, right-left (need override) + 0x0669: 0x00b9, # ARABIC-INDIC DIGIT NINE, right-left (need override) + 0x066a: 0x00a5, # ARABIC PERCENT SIGN + 0x0679: 0x00f4, # ARABIC LETTER TTEH + 0x067e: 0x00f3, # ARABIC LETTER PEH + 0x0686: 0x00f5, # ARABIC LETTER TCHEH + 0x0688: 0x00f9, # ARABIC LETTER DDAL + 0x0691: 0x00fa, # ARABIC LETTER RREH + 0x0698: 0x00fe, # ARABIC LETTER JEH + 0x06a4: 0x00f7, # ARABIC LETTER VEH + 0x06af: 0x00f8, # ARABIC LETTER GAF + 0x06ba: 0x008b, # ARABIC LETTER NOON GHUNNA + 0x06d2: 0x00ff, # ARABIC LETTER YEH BARREE + 0x06d5: 0x00f6, # ARABIC LETTER AE + 0x2026: 0x0093, # HORIZONTAL ELLIPSIS, right-left + 0x274a: 0x00c0, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left +} diff --git a/venv/Lib/encodings/mac_centeuro.py b/venv/Lib/encodings/mac_centeuro.py new file mode 100644 index 00000000..5785a0ec --- /dev/null +++ b/venv/Lib/encodings/mac_centeuro.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_centeuro generated from 'MAPPINGS/VENDORS/APPLE/CENTEURO.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-centeuro', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON + '\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK + '\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON + '\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE + '\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE + '\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE + '\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON + '\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON + '\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON + '\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON + '\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA + '\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK + '\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK + '\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON + '\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE + '\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA + '\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON + '\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON + '\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE + '\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE + '\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA + '\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE + '\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON + '\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON + '\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE + '\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE + '\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON + '\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA + '\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA + '\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON + '\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON + '\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON + '\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON + '\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON + '\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE + '\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK + '\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE + '\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA + '\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE + '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/mac_croatian.py b/venv/Lib/encodings/mac_croatian.py new file mode 100644 index 00000000..4a92fe61 --- /dev/null +++ b/venv/Lib/encodings/mac_croatian.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_croatian generated from 'MAPPINGS/VENDORS/APPLE/CROATIAN.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-croatian', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + '\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\u2206' # 0xB4 -> INCREMENT + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + '\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\uf8ff' # 0xD8 -> Apple logo + '\xa9' # 0xD9 -> COPYRIGHT SIGN + '\u2044' # 0xDA -> FRACTION SLASH + '\u20ac' # 0xDB -> EURO SIGN + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\xc6' # 0xDE -> LATIN CAPITAL LETTER AE + '\xbb' # 0xDF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2013' # 0xE0 -> EN DASH + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u03c0' # 0xF9 -> GREEK SMALL LETTER PI + '\xcb' # 0xFA -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\xca' # 0xFD -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xe6' # 0xFE -> LATIN SMALL LETTER AE + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/mac_cyrillic.py b/venv/Lib/encodings/mac_cyrillic.py new file mode 100644 index 00000000..d20272ac --- /dev/null +++ b/venv/Lib/encodings/mac_cyrillic.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_cyrillic generated from 'MAPPINGS/VENDORS/APPLE/CYRILLIC.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-cyrillic', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\u0410' # 0x80 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0x81 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0x82 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0x83 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0x84 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0x85 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0x86 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0x87 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0x88 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0x89 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0x8A -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0x8B -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0x8C -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0x8D -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0x8E -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0x8F -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0x90 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0x91 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0x92 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0x93 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0x94 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0x95 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0x96 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0x97 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0x98 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0x99 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0x9A -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0x9B -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0x9C -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0x9D -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0x9E -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0x9F -> CYRILLIC CAPITAL LETTER YA + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\u0490' # 0xA2 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\u0406' # 0xA7 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\u0402' # 0xAB -> CYRILLIC CAPITAL LETTER DJE + '\u0452' # 0xAC -> CYRILLIC SMALL LETTER DJE + '\u2260' # 0xAD -> NOT EQUAL TO + '\u0403' # 0xAE -> CYRILLIC CAPITAL LETTER GJE + '\u0453' # 0xAF -> CYRILLIC SMALL LETTER GJE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\u0456' # 0xB4 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\xb5' # 0xB5 -> MICRO SIGN + '\u0491' # 0xB6 -> CYRILLIC SMALL LETTER GHE WITH UPTURN + '\u0408' # 0xB7 -> CYRILLIC CAPITAL LETTER JE + '\u0404' # 0xB8 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0454' # 0xB9 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0407' # 0xBA -> CYRILLIC CAPITAL LETTER YI + '\u0457' # 0xBB -> CYRILLIC SMALL LETTER YI + '\u0409' # 0xBC -> CYRILLIC CAPITAL LETTER LJE + '\u0459' # 0xBD -> CYRILLIC SMALL LETTER LJE + '\u040a' # 0xBE -> CYRILLIC CAPITAL LETTER NJE + '\u045a' # 0xBF -> CYRILLIC SMALL LETTER NJE + '\u0458' # 0xC0 -> CYRILLIC SMALL LETTER JE + '\u0405' # 0xC1 -> CYRILLIC CAPITAL LETTER DZE + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\u040b' # 0xCB -> CYRILLIC CAPITAL LETTER TSHE + '\u045b' # 0xCC -> CYRILLIC SMALL LETTER TSHE + '\u040c' # 0xCD -> CYRILLIC CAPITAL LETTER KJE + '\u045c' # 0xCE -> CYRILLIC SMALL LETTER KJE + '\u0455' # 0xCF -> CYRILLIC SMALL LETTER DZE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u201e' # 0xD7 -> DOUBLE LOW-9 QUOTATION MARK + '\u040e' # 0xD8 -> CYRILLIC CAPITAL LETTER SHORT U + '\u045e' # 0xD9 -> CYRILLIC SMALL LETTER SHORT U + '\u040f' # 0xDA -> CYRILLIC CAPITAL LETTER DZHE + '\u045f' # 0xDB -> CYRILLIC SMALL LETTER DZHE + '\u2116' # 0xDC -> NUMERO SIGN + '\u0401' # 0xDD -> CYRILLIC CAPITAL LETTER IO + '\u0451' # 0xDE -> CYRILLIC SMALL LETTER IO + '\u044f' # 0xDF -> CYRILLIC SMALL LETTER YA + '\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + '\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + '\u20ac' # 0xFF -> EURO SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/mac_farsi.py b/venv/Lib/encodings/mac_farsi.py new file mode 100644 index 00000000..e357d435 --- /dev/null +++ b/venv/Lib/encodings/mac_farsi.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_farsi generated from 'MAPPINGS/VENDORS/APPLE/FARSI.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-farsi', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE, left-right + '!' # 0x21 -> EXCLAMATION MARK, left-right + '"' # 0x22 -> QUOTATION MARK, left-right + '#' # 0x23 -> NUMBER SIGN, left-right + '$' # 0x24 -> DOLLAR SIGN, left-right + '%' # 0x25 -> PERCENT SIGN, left-right + '&' # 0x26 -> AMPERSAND, left-right + "'" # 0x27 -> APOSTROPHE, left-right + '(' # 0x28 -> LEFT PARENTHESIS, left-right + ')' # 0x29 -> RIGHT PARENTHESIS, left-right + '*' # 0x2A -> ASTERISK, left-right + '+' # 0x2B -> PLUS SIGN, left-right + ',' # 0x2C -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + '-' # 0x2D -> HYPHEN-MINUS, left-right + '.' # 0x2E -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + '/' # 0x2F -> SOLIDUS, left-right + '0' # 0x30 -> DIGIT ZERO; in Arabic-script context, displayed as 0x06F0 EXTENDED ARABIC-INDIC DIGIT ZERO + '1' # 0x31 -> DIGIT ONE; in Arabic-script context, displayed as 0x06F1 EXTENDED ARABIC-INDIC DIGIT ONE + '2' # 0x32 -> DIGIT TWO; in Arabic-script context, displayed as 0x06F2 EXTENDED ARABIC-INDIC DIGIT TWO + '3' # 0x33 -> DIGIT THREE; in Arabic-script context, displayed as 0x06F3 EXTENDED ARABIC-INDIC DIGIT THREE + '4' # 0x34 -> DIGIT FOUR; in Arabic-script context, displayed as 0x06F4 EXTENDED ARABIC-INDIC DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE; in Arabic-script context, displayed as 0x06F5 EXTENDED ARABIC-INDIC DIGIT FIVE + '6' # 0x36 -> DIGIT SIX; in Arabic-script context, displayed as 0x06F6 EXTENDED ARABIC-INDIC DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE; in Arabic-script context, displayed as 0x06F9 EXTENDED ARABIC-INDIC DIGIT NINE + ':' # 0x3A -> COLON, left-right + ';' # 0x3B -> SEMICOLON, left-right + '<' # 0x3C -> LESS-THAN SIGN, left-right + '=' # 0x3D -> EQUALS SIGN, left-right + '>' # 0x3E -> GREATER-THAN SIGN, left-right + '?' # 0x3F -> QUESTION MARK, left-right + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET, left-right + '\\' # 0x5C -> REVERSE SOLIDUS, left-right + ']' # 0x5D -> RIGHT SQUARE BRACKET, left-right + '^' # 0x5E -> CIRCUMFLEX ACCENT, left-right + '_' # 0x5F -> LOW LINE, left-right + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET, left-right + '|' # 0x7C -> VERTICAL LINE, left-right + '}' # 0x7D -> RIGHT CURLY BRACKET, left-right + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xa0' # 0x81 -> NO-BREAK SPACE, right-left + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\u06ba' # 0x8B -> ARABIC LETTER NOON GHUNNA + '\xab' # 0x8C -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\u2026' # 0x93 -> HORIZONTAL ELLIPSIS, right-left + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xbb' # 0x98 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0x9B -> DIVISION SIGN, right-left + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + ' ' # 0xA0 -> SPACE, right-left + '!' # 0xA1 -> EXCLAMATION MARK, right-left + '"' # 0xA2 -> QUOTATION MARK, right-left + '#' # 0xA3 -> NUMBER SIGN, right-left + '$' # 0xA4 -> DOLLAR SIGN, right-left + '\u066a' # 0xA5 -> ARABIC PERCENT SIGN + '&' # 0xA6 -> AMPERSAND, right-left + "'" # 0xA7 -> APOSTROPHE, right-left + '(' # 0xA8 -> LEFT PARENTHESIS, right-left + ')' # 0xA9 -> RIGHT PARENTHESIS, right-left + '*' # 0xAA -> ASTERISK, right-left + '+' # 0xAB -> PLUS SIGN, right-left + '\u060c' # 0xAC -> ARABIC COMMA + '-' # 0xAD -> HYPHEN-MINUS, right-left + '.' # 0xAE -> FULL STOP, right-left + '/' # 0xAF -> SOLIDUS, right-left + '\u06f0' # 0xB0 -> EXTENDED ARABIC-INDIC DIGIT ZERO, right-left (need override) + '\u06f1' # 0xB1 -> EXTENDED ARABIC-INDIC DIGIT ONE, right-left (need override) + '\u06f2' # 0xB2 -> EXTENDED ARABIC-INDIC DIGIT TWO, right-left (need override) + '\u06f3' # 0xB3 -> EXTENDED ARABIC-INDIC DIGIT THREE, right-left (need override) + '\u06f4' # 0xB4 -> EXTENDED ARABIC-INDIC DIGIT FOUR, right-left (need override) + '\u06f5' # 0xB5 -> EXTENDED ARABIC-INDIC DIGIT FIVE, right-left (need override) + '\u06f6' # 0xB6 -> EXTENDED ARABIC-INDIC DIGIT SIX, right-left (need override) + '\u06f7' # 0xB7 -> EXTENDED ARABIC-INDIC DIGIT SEVEN, right-left (need override) + '\u06f8' # 0xB8 -> EXTENDED ARABIC-INDIC DIGIT EIGHT, right-left (need override) + '\u06f9' # 0xB9 -> EXTENDED ARABIC-INDIC DIGIT NINE, right-left (need override) + ':' # 0xBA -> COLON, right-left + '\u061b' # 0xBB -> ARABIC SEMICOLON + '<' # 0xBC -> LESS-THAN SIGN, right-left + '=' # 0xBD -> EQUALS SIGN, right-left + '>' # 0xBE -> GREATER-THAN SIGN, right-left + '\u061f' # 0xBF -> ARABIC QUESTION MARK + '\u274a' # 0xC0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + '\u0621' # 0xC1 -> ARABIC LETTER HAMZA + '\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0xC7 -> ARABIC LETTER ALEF + '\u0628' # 0xC8 -> ARABIC LETTER BEH + '\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0xCA -> ARABIC LETTER TEH + '\u062b' # 0xCB -> ARABIC LETTER THEH + '\u062c' # 0xCC -> ARABIC LETTER JEEM + '\u062d' # 0xCD -> ARABIC LETTER HAH + '\u062e' # 0xCE -> ARABIC LETTER KHAH + '\u062f' # 0xCF -> ARABIC LETTER DAL + '\u0630' # 0xD0 -> ARABIC LETTER THAL + '\u0631' # 0xD1 -> ARABIC LETTER REH + '\u0632' # 0xD2 -> ARABIC LETTER ZAIN + '\u0633' # 0xD3 -> ARABIC LETTER SEEN + '\u0634' # 0xD4 -> ARABIC LETTER SHEEN + '\u0635' # 0xD5 -> ARABIC LETTER SAD + '\u0636' # 0xD6 -> ARABIC LETTER DAD + '\u0637' # 0xD7 -> ARABIC LETTER TAH + '\u0638' # 0xD8 -> ARABIC LETTER ZAH + '\u0639' # 0xD9 -> ARABIC LETTER AIN + '\u063a' # 0xDA -> ARABIC LETTER GHAIN + '[' # 0xDB -> LEFT SQUARE BRACKET, right-left + '\\' # 0xDC -> REVERSE SOLIDUS, right-left + ']' # 0xDD -> RIGHT SQUARE BRACKET, right-left + '^' # 0xDE -> CIRCUMFLEX ACCENT, right-left + '_' # 0xDF -> LOW LINE, right-left + '\u0640' # 0xE0 -> ARABIC TATWEEL + '\u0641' # 0xE1 -> ARABIC LETTER FEH + '\u0642' # 0xE2 -> ARABIC LETTER QAF + '\u0643' # 0xE3 -> ARABIC LETTER KAF + '\u0644' # 0xE4 -> ARABIC LETTER LAM + '\u0645' # 0xE5 -> ARABIC LETTER MEEM + '\u0646' # 0xE6 -> ARABIC LETTER NOON + '\u0647' # 0xE7 -> ARABIC LETTER HEH + '\u0648' # 0xE8 -> ARABIC LETTER WAW + '\u0649' # 0xE9 -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0xEA -> ARABIC LETTER YEH + '\u064b' # 0xEB -> ARABIC FATHATAN + '\u064c' # 0xEC -> ARABIC DAMMATAN + '\u064d' # 0xED -> ARABIC KASRATAN + '\u064e' # 0xEE -> ARABIC FATHA + '\u064f' # 0xEF -> ARABIC DAMMA + '\u0650' # 0xF0 -> ARABIC KASRA + '\u0651' # 0xF1 -> ARABIC SHADDA + '\u0652' # 0xF2 -> ARABIC SUKUN + '\u067e' # 0xF3 -> ARABIC LETTER PEH + '\u0679' # 0xF4 -> ARABIC LETTER TTEH + '\u0686' # 0xF5 -> ARABIC LETTER TCHEH + '\u06d5' # 0xF6 -> ARABIC LETTER AE + '\u06a4' # 0xF7 -> ARABIC LETTER VEH + '\u06af' # 0xF8 -> ARABIC LETTER GAF + '\u0688' # 0xF9 -> ARABIC LETTER DDAL + '\u0691' # 0xFA -> ARABIC LETTER RREH + '{' # 0xFB -> LEFT CURLY BRACKET, right-left + '|' # 0xFC -> VERTICAL LINE, right-left + '}' # 0xFD -> RIGHT CURLY BRACKET, right-left + '\u0698' # 0xFE -> ARABIC LETTER JEH + '\u06d2' # 0xFF -> ARABIC LETTER YEH BARREE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/mac_greek.py b/venv/Lib/encodings/mac_greek.py new file mode 100644 index 00000000..d3d0c4f0 --- /dev/null +++ b/venv/Lib/encodings/mac_greek.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_greek generated from 'MAPPINGS/VENDORS/APPLE/GREEK.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-greek', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xb9' # 0x81 -> SUPERSCRIPT ONE + '\xb2' # 0x82 -> SUPERSCRIPT TWO + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xb3' # 0x84 -> SUPERSCRIPT THREE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0385' # 0x87 -> GREEK DIALYTIKA TONOS + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\u0384' # 0x8B -> GREEK TONOS + '\xa8' # 0x8C -> DIAERESIS + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xa3' # 0x92 -> POUND SIGN + '\u2122' # 0x93 -> TRADE MARK SIGN + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\u2022' # 0x96 -> BULLET + '\xbd' # 0x97 -> VULGAR FRACTION ONE HALF + '\u2030' # 0x98 -> PER MILLE SIGN + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xa6' # 0x9B -> BROKEN BAR + '\u20ac' # 0x9C -> EURO SIGN # before Mac OS 9.2.2, was SOFT HYPHEN + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\u0393' # 0xA1 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0xA2 -> GREEK CAPITAL LETTER DELTA + '\u0398' # 0xA3 -> GREEK CAPITAL LETTER THETA + '\u039b' # 0xA4 -> GREEK CAPITAL LETTER LAMDA + '\u039e' # 0xA5 -> GREEK CAPITAL LETTER XI + '\u03a0' # 0xA6 -> GREEK CAPITAL LETTER PI + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u03a3' # 0xAA -> GREEK CAPITAL LETTER SIGMA + '\u03aa' # 0xAB -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\xa7' # 0xAC -> SECTION SIGN + '\u2260' # 0xAD -> NOT EQUAL TO + '\xb0' # 0xAE -> DEGREE SIGN + '\xb7' # 0xAF -> MIDDLE DOT + '\u0391' # 0xB0 -> GREEK CAPITAL LETTER ALPHA + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\u0392' # 0xB5 -> GREEK CAPITAL LETTER BETA + '\u0395' # 0xB6 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0xB7 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0xB8 -> GREEK CAPITAL LETTER ETA + '\u0399' # 0xB9 -> GREEK CAPITAL LETTER IOTA + '\u039a' # 0xBA -> GREEK CAPITAL LETTER KAPPA + '\u039c' # 0xBB -> GREEK CAPITAL LETTER MU + '\u03a6' # 0xBC -> GREEK CAPITAL LETTER PHI + '\u03ab' # 0xBD -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\u03a8' # 0xBE -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0xBF -> GREEK CAPITAL LETTER OMEGA + '\u03ac' # 0xC0 -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u039d' # 0xC1 -> GREEK CAPITAL LETTER NU + '\xac' # 0xC2 -> NOT SIGN + '\u039f' # 0xC3 -> GREEK CAPITAL LETTER OMICRON + '\u03a1' # 0xC4 -> GREEK CAPITAL LETTER RHO + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u03a4' # 0xC6 -> GREEK CAPITAL LETTER TAU + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\u03a5' # 0xCB -> GREEK CAPITAL LETTER UPSILON + '\u03a7' # 0xCC -> GREEK CAPITAL LETTER CHI + '\u0386' # 0xCD -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\u0388' # 0xCE -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2015' # 0xD1 -> HORIZONTAL BAR + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u0389' # 0xD7 -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0xD8 -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\u038c' # 0xD9 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\u038e' # 0xDA -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u03ad' # 0xDB -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0xDC -> GREEK SMALL LETTER ETA WITH TONOS + '\u03af' # 0xDD -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03cc' # 0xDE -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u038f' # 0xDF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\u03cd' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + '\u03c8' # 0xE3 -> GREEK SMALL LETTER PSI + '\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + '\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + '\u03c6' # 0xE6 -> GREEK SMALL LETTER PHI + '\u03b3' # 0xE7 -> GREEK SMALL LETTER GAMMA + '\u03b7' # 0xE8 -> GREEK SMALL LETTER ETA + '\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + '\u03be' # 0xEA -> GREEK SMALL LETTER XI + '\u03ba' # 0xEB -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0xEC -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0xED -> GREEK SMALL LETTER MU + '\u03bd' # 0xEE -> GREEK SMALL LETTER NU + '\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + '\u03ce' # 0xF1 -> GREEK SMALL LETTER OMEGA WITH TONOS + '\u03c1' # 0xF2 -> GREEK SMALL LETTER RHO + '\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + '\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + '\u03b8' # 0xF5 -> GREEK SMALL LETTER THETA + '\u03c9' # 0xF6 -> GREEK SMALL LETTER OMEGA + '\u03c2' # 0xF7 -> GREEK SMALL LETTER FINAL SIGMA + '\u03c7' # 0xF8 -> GREEK SMALL LETTER CHI + '\u03c5' # 0xF9 -> GREEK SMALL LETTER UPSILON + '\u03b6' # 0xFA -> GREEK SMALL LETTER ZETA + '\u03ca' # 0xFB -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03cb' # 0xFC -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u0390' # 0xFD -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u03b0' # 0xFE -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\xad' # 0xFF -> SOFT HYPHEN # before Mac OS 9.2.2, was undefined +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/mac_iceland.py b/venv/Lib/encodings/mac_iceland.py new file mode 100644 index 00000000..add10f4e --- /dev/null +++ b/venv/Lib/encodings/mac_iceland.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_iceland generated from 'MAPPINGS/VENDORS/APPLE/ICELAND.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-iceland', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\xdd' # 0xA0 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + '\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\xe6' # 0xBE -> LATIN SMALL LETTER AE + '\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u2044' # 0xDA -> FRACTION SLASH + '\u20ac' # 0xDB -> EURO SIGN + '\xd0' # 0xDC -> LATIN CAPITAL LETTER ETH + '\xf0' # 0xDD -> LATIN SMALL LETTER ETH + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + '\xfe' # 0xDF -> LATIN SMALL LETTER THORN + '\xfd' # 0xE0 -> LATIN SMALL LETTER Y WITH ACUTE + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\uf8ff' # 0xF0 -> Apple logo + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u02d8' # 0xF9 -> BREVE + '\u02d9' # 0xFA -> DOT ABOVE + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + '\u02db' # 0xFE -> OGONEK + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/mac_latin2.py b/venv/Lib/encodings/mac_latin2.py new file mode 100644 index 00000000..da9d4b13 --- /dev/null +++ b/venv/Lib/encodings/mac_latin2.py @@ -0,0 +1,312 @@ +""" Python Character Mapping Codec mac_latin2 generated from 'MAPPINGS/VENDORS/MICSFT/MAC/LATIN2.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-latin2', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON + '\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK + '\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON + '\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE + '\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE + '\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE + '\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON + '\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON + '\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON + '\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON + '\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA + '\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK + '\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK + '\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON + '\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE + '\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA + '\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON + '\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON + '\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE + '\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE + '\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA + '\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE + '\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON + '\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON + '\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE + '\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE + '\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON + '\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA + '\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA + '\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON + '\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON + '\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON + '\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON + '\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON + '\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE + '\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK + '\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE + '\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA + '\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE + '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/mac_roman.py b/venv/Lib/encodings/mac_roman.py new file mode 100644 index 00000000..b74b0021 --- /dev/null +++ b/venv/Lib/encodings/mac_roman.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_roman generated from 'MAPPINGS/VENDORS/APPLE/ROMAN.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-roman', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + '\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\xe6' # 0xBE -> LATIN SMALL LETTER AE + '\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u2044' # 0xDA -> FRACTION SLASH + '\u20ac' # 0xDB -> EURO SIGN + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufb01' # 0xDE -> LATIN SMALL LIGATURE FI + '\ufb02' # 0xDF -> LATIN SMALL LIGATURE FL + '\u2021' # 0xE0 -> DOUBLE DAGGER + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\uf8ff' # 0xF0 -> Apple logo + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u02d8' # 0xF9 -> BREVE + '\u02d9' # 0xFA -> DOT ABOVE + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + '\u02db' # 0xFE -> OGONEK + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/mac_romanian.py b/venv/Lib/encodings/mac_romanian.py new file mode 100644 index 00000000..d141b4c5 --- /dev/null +++ b/venv/Lib/encodings/mac_romanian.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_romanian generated from 'MAPPINGS/VENDORS/APPLE/ROMANIAN.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-romanian', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\u0102' # 0xAE -> LATIN CAPITAL LETTER A WITH BREVE + '\u0218' # 0xAF -> LATIN CAPITAL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\u0103' # 0xBE -> LATIN SMALL LETTER A WITH BREVE + '\u0219' # 0xBF -> LATIN SMALL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u2044' # 0xDA -> FRACTION SLASH + '\u20ac' # 0xDB -> EURO SIGN + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u021a' # 0xDE -> LATIN CAPITAL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later + '\u021b' # 0xDF -> LATIN SMALL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later + '\u2021' # 0xE0 -> DOUBLE DAGGER + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\uf8ff' # 0xF0 -> Apple logo + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u02d8' # 0xF9 -> BREVE + '\u02d9' # 0xFA -> DOT ABOVE + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + '\u02db' # 0xFE -> OGONEK + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/mac_turkish.py b/venv/Lib/encodings/mac_turkish.py new file mode 100644 index 00000000..044d4cb5 --- /dev/null +++ b/venv/Lib/encodings/mac_turkish.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_turkish generated from 'MAPPINGS/VENDORS/APPLE/TURKISH.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mac-turkish', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + '\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\xe6' # 0xBE -> LATIN SMALL LETTER AE + '\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u011e' # 0xDA -> LATIN CAPITAL LETTER G WITH BREVE + '\u011f' # 0xDB -> LATIN SMALL LETTER G WITH BREVE + '\u0130' # 0xDC -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\u0131' # 0xDD -> LATIN SMALL LETTER DOTLESS I + '\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u015f' # 0xDF -> LATIN SMALL LETTER S WITH CEDILLA + '\u2021' # 0xE0 -> DOUBLE DAGGER + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\uf8ff' # 0xF0 -> Apple logo + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\uf8a0' # 0xF5 -> undefined1 + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u02d8' # 0xF9 -> BREVE + '\u02d9' # 0xFA -> DOT ABOVE + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + '\u02db' # 0xFE -> OGONEK + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/mbcs.py b/venv/Lib/encodings/mbcs.py new file mode 100644 index 00000000..baf46cbd --- /dev/null +++ b/venv/Lib/encodings/mbcs.py @@ -0,0 +1,47 @@ +""" Python 'mbcs' Codec for Windows + + +Cloned by Mark Hammond (mhammond@skippinet.com.au) from ascii.py, +which was written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +# Import them explicitly to cause an ImportError +# on non-Windows systems +from codecs import mbcs_encode, mbcs_decode +# for IncrementalDecoder, IncrementalEncoder, ... +import codecs + +### Codec APIs + +encode = mbcs_encode + +def decode(input, errors='strict'): + return mbcs_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return mbcs_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = mbcs_decode + +class StreamWriter(codecs.StreamWriter): + encode = mbcs_encode + +class StreamReader(codecs.StreamReader): + decode = mbcs_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mbcs', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/oem.py b/venv/Lib/encodings/oem.py new file mode 100644 index 00000000..2c3426ba --- /dev/null +++ b/venv/Lib/encodings/oem.py @@ -0,0 +1,41 @@ +""" Python 'oem' Codec for Windows + +""" +# Import them explicitly to cause an ImportError +# on non-Windows systems +from codecs import oem_encode, oem_decode +# for IncrementalDecoder, IncrementalEncoder, ... +import codecs + +### Codec APIs + +encode = oem_encode + +def decode(input, errors='strict'): + return oem_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return oem_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = oem_decode + +class StreamWriter(codecs.StreamWriter): + encode = oem_encode + +class StreamReader(codecs.StreamReader): + decode = oem_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='oem', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/palmos.py b/venv/Lib/encodings/palmos.py new file mode 100644 index 00000000..c506d654 --- /dev/null +++ b/venv/Lib/encodings/palmos.py @@ -0,0 +1,308 @@ +""" Python Character Mapping Codec for PalmOS 3.5. + +Written by Sjoerd Mullender (sjoerd@acm.org); based on iso8859_15.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='palmos', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\x81' # 0x81 -> + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\u2666' # 0x8D -> BLACK DIAMOND SUIT + '\u2663' # 0x8E -> BLACK CLUB SUIT + '\u2665' # 0x8F -> BLACK HEART SUIT + '\u2660' # 0x90 -> BLACK SPADE SUIT + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + '\x9b' # 0x9B -> + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/ptcp154.py b/venv/Lib/encodings/ptcp154.py new file mode 100644 index 00000000..656b79d6 --- /dev/null +++ b/venv/Lib/encodings/ptcp154.py @@ -0,0 +1,312 @@ +""" Python Character Mapping Codec generated from 'PTCP154.txt' with gencodec.py. + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='ptcp154', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE (DEL) + '\u0496' # 0x80 -> CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER + '\u0492' # 0x81 -> CYRILLIC CAPITAL LETTER GHE WITH STROKE + '\u04ee' # 0x82 -> CYRILLIC CAPITAL LETTER U WITH MACRON + '\u0493' # 0x83 -> CYRILLIC SMALL LETTER GHE WITH STROKE + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u04b6' # 0x86 -> CYRILLIC CAPITAL LETTER CHE WITH DESCENDER + '\u04ae' # 0x87 -> CYRILLIC CAPITAL LETTER STRAIGHT U + '\u04b2' # 0x88 -> CYRILLIC CAPITAL LETTER HA WITH DESCENDER + '\u04af' # 0x89 -> CYRILLIC SMALL LETTER STRAIGHT U + '\u04a0' # 0x8A -> CYRILLIC CAPITAL LETTER BASHKIR KA + '\u04e2' # 0x8B -> CYRILLIC CAPITAL LETTER I WITH MACRON + '\u04a2' # 0x8C -> CYRILLIC CAPITAL LETTER EN WITH DESCENDER + '\u049a' # 0x8D -> CYRILLIC CAPITAL LETTER KA WITH DESCENDER + '\u04ba' # 0x8E -> CYRILLIC CAPITAL LETTER SHHA + '\u04b8' # 0x8F -> CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE + '\u0497' # 0x90 -> CYRILLIC SMALL LETTER ZHE WITH DESCENDER + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u04b3' # 0x98 -> CYRILLIC SMALL LETTER HA WITH DESCENDER + '\u04b7' # 0x99 -> CYRILLIC SMALL LETTER CHE WITH DESCENDER + '\u04a1' # 0x9A -> CYRILLIC SMALL LETTER BASHKIR KA + '\u04e3' # 0x9B -> CYRILLIC SMALL LETTER I WITH MACRON + '\u04a3' # 0x9C -> CYRILLIC SMALL LETTER EN WITH DESCENDER + '\u049b' # 0x9D -> CYRILLIC SMALL LETTER KA WITH DESCENDER + '\u04bb' # 0x9E -> CYRILLIC SMALL LETTER SHHA + '\u04b9' # 0x9F -> CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u040e' # 0xA1 -> CYRILLIC CAPITAL LETTER SHORT U (Byelorussian) + '\u045e' # 0xA2 -> CYRILLIC SMALL LETTER SHORT U (Byelorussian) + '\u0408' # 0xA3 -> CYRILLIC CAPITAL LETTER JE + '\u04e8' # 0xA4 -> CYRILLIC CAPITAL LETTER BARRED O + '\u0498' # 0xA5 -> CYRILLIC CAPITAL LETTER ZE WITH DESCENDER + '\u04b0' # 0xA6 -> CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + '\xa7' # 0xA7 -> SECTION SIGN + '\u0401' # 0xA8 -> CYRILLIC CAPITAL LETTER IO + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u04d8' # 0xAA -> CYRILLIC CAPITAL LETTER SCHWA + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\u04ef' # 0xAD -> CYRILLIC SMALL LETTER U WITH MACRON + '\xae' # 0xAE -> REGISTERED SIGN + '\u049c' # 0xAF -> CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE + '\xb0' # 0xB0 -> DEGREE SIGN + '\u04b1' # 0xB1 -> CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE + '\u0406' # 0xB2 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0456' # 0xB3 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0499' # 0xB4 -> CYRILLIC SMALL LETTER ZE WITH DESCENDER + '\u04e9' # 0xB5 -> CYRILLIC SMALL LETTER BARRED O + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0451' # 0xB8 -> CYRILLIC SMALL LETTER IO + '\u2116' # 0xB9 -> NUMERO SIGN + '\u04d9' # 0xBA -> CYRILLIC SMALL LETTER SCHWA + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0458' # 0xBC -> CYRILLIC SMALL LETTER JE + '\u04aa' # 0xBD -> CYRILLIC CAPITAL LETTER ES WITH DESCENDER + '\u04ab' # 0xBE -> CYRILLIC SMALL LETTER ES WITH DESCENDER + '\u049d' # 0xBF -> CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE + '\u0410' # 0xC0 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xC1 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0xC2 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0xC3 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0xC4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xC5 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0xC6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0xC7 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0xC8 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xC9 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xCA -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xCB -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xCC -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xCD -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xCE -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xCF -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0xD0 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xD1 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xD2 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xD3 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0xD4 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0xD5 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0xD6 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0xD7 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0xD8 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0xD9 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0xDA -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0xDB -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0xDC -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0xDD -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0xDE -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0xDF -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + '\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + '\u044f' # 0xFF -> CYRILLIC SMALL LETTER YA +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/punycode.py b/venv/Lib/encodings/punycode.py new file mode 100644 index 00000000..66c51013 --- /dev/null +++ b/venv/Lib/encodings/punycode.py @@ -0,0 +1,237 @@ +""" Codec for the Punicode encoding, as specified in RFC 3492 + +Written by Martin v. Löwis. +""" + +import codecs + +##################### Encoding ##################################### + +def segregate(str): + """3.1 Basic code point segregation""" + base = bytearray() + extended = set() + for c in str: + if ord(c) < 128: + base.append(ord(c)) + else: + extended.add(c) + extended = sorted(extended) + return bytes(base), extended + +def selective_len(str, max): + """Return the length of str, considering only characters below max.""" + res = 0 + for c in str: + if ord(c) < max: + res += 1 + return res + +def selective_find(str, char, index, pos): + """Return a pair (index, pos), indicating the next occurrence of + char in str. index is the position of the character considering + only ordinals up to and including char, and pos is the position in + the full string. index/pos is the starting position in the full + string.""" + + l = len(str) + while 1: + pos += 1 + if pos == l: + return (-1, -1) + c = str[pos] + if c == char: + return index+1, pos + elif c < char: + index += 1 + +def insertion_unsort(str, extended): + """3.2 Insertion unsort coding""" + oldchar = 0x80 + result = [] + oldindex = -1 + for c in extended: + index = pos = -1 + char = ord(c) + curlen = selective_len(str, char) + delta = (curlen+1) * (char - oldchar) + while 1: + index,pos = selective_find(str,c,index,pos) + if index == -1: + break + delta += index - oldindex + result.append(delta-1) + oldindex = index + delta = 0 + oldchar = char + + return result + +def T(j, bias): + # Punycode parameters: tmin = 1, tmax = 26, base = 36 + res = 36 * (j + 1) - bias + if res < 1: return 1 + if res > 26: return 26 + return res + +digits = b"abcdefghijklmnopqrstuvwxyz0123456789" +def generate_generalized_integer(N, bias): + """3.3 Generalized variable-length integers""" + result = bytearray() + j = 0 + while 1: + t = T(j, bias) + if N < t: + result.append(digits[N]) + return bytes(result) + result.append(digits[t + ((N - t) % (36 - t))]) + N = (N - t) // (36 - t) + j += 1 + +def adapt(delta, first, numchars): + if first: + delta //= 700 + else: + delta //= 2 + delta += delta // numchars + # ((base - tmin) * tmax) // 2 == 455 + divisions = 0 + while delta > 455: + delta = delta // 35 # base - tmin + divisions += 36 + bias = divisions + (36 * delta // (delta + 38)) + return bias + + +def generate_integers(baselen, deltas): + """3.4 Bias adaptation""" + # Punycode parameters: initial bias = 72, damp = 700, skew = 38 + result = bytearray() + bias = 72 + for points, delta in enumerate(deltas): + s = generate_generalized_integer(delta, bias) + result.extend(s) + bias = adapt(delta, points==0, baselen+points+1) + return bytes(result) + +def punycode_encode(text): + base, extended = segregate(text) + deltas = insertion_unsort(text, extended) + extended = generate_integers(len(base), deltas) + if base: + return base + b"-" + extended + return extended + +##################### Decoding ##################################### + +def decode_generalized_number(extended, extpos, bias, errors): + """3.3 Generalized variable-length integers""" + result = 0 + w = 1 + j = 0 + while 1: + try: + char = ord(extended[extpos]) + except IndexError: + if errors == "strict": + raise UnicodeError("incomplete punicode string") + return extpos + 1, None + extpos += 1 + if 0x41 <= char <= 0x5A: # A-Z + digit = char - 0x41 + elif 0x30 <= char <= 0x39: + digit = char - 22 # 0x30-26 + elif errors == "strict": + raise UnicodeError("Invalid extended code point '%s'" + % extended[extpos]) + else: + return extpos, None + t = T(j, bias) + result += digit * w + if digit < t: + return extpos, result + w = w * (36 - t) + j += 1 + + +def insertion_sort(base, extended, errors): + """3.2 Insertion unsort coding""" + char = 0x80 + pos = -1 + bias = 72 + extpos = 0 + while extpos < len(extended): + newpos, delta = decode_generalized_number(extended, extpos, + bias, errors) + if delta is None: + # There was an error in decoding. We can't continue because + # synchronization is lost. + return base + pos += delta+1 + char += pos // (len(base) + 1) + if char > 0x10FFFF: + if errors == "strict": + raise UnicodeError("Invalid character U+%x" % char) + char = ord('?') + pos = pos % (len(base) + 1) + base = base[:pos] + chr(char) + base[pos:] + bias = adapt(delta, (extpos == 0), len(base)) + extpos = newpos + return base + +def punycode_decode(text, errors): + if isinstance(text, str): + text = text.encode("ascii") + if isinstance(text, memoryview): + text = bytes(text) + pos = text.rfind(b"-") + if pos == -1: + base = "" + extended = str(text, "ascii").upper() + else: + base = str(text[:pos], "ascii", errors) + extended = str(text[pos+1:], "ascii").upper() + return insertion_sort(base, extended, errors) + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self, input, errors='strict'): + res = punycode_encode(input) + return res, len(input) + + def decode(self, input, errors='strict'): + if errors not in ('strict', 'replace', 'ignore'): + raise UnicodeError("Unsupported error handling "+errors) + res = punycode_decode(input, errors) + return res, len(input) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return punycode_encode(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + if self.errors not in ('strict', 'replace', 'ignore'): + raise UnicodeError("Unsupported error handling "+self.errors) + return punycode_decode(input, self.errors) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='punycode', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/venv/Lib/encodings/quopri_codec.py b/venv/Lib/encodings/quopri_codec.py new file mode 100644 index 00000000..496cb765 --- /dev/null +++ b/venv/Lib/encodings/quopri_codec.py @@ -0,0 +1,56 @@ +"""Codec for quoted-printable encoding. + +This codec de/encodes from bytes to bytes. +""" + +import codecs +import quopri +from io import BytesIO + +def quopri_encode(input, errors='strict'): + assert errors == 'strict' + f = BytesIO(input) + g = BytesIO() + quopri.encode(f, g, quotetabs=True) + return (g.getvalue(), len(input)) + +def quopri_decode(input, errors='strict'): + assert errors == 'strict' + f = BytesIO(input) + g = BytesIO() + quopri.decode(f, g) + return (g.getvalue(), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return quopri_encode(input, errors) + def decode(self, input, errors='strict'): + return quopri_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return quopri_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return quopri_decode(input, self.errors)[0] + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +# encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='quopri', + encode=quopri_encode, + decode=quopri_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) diff --git a/venv/Lib/encodings/raw_unicode_escape.py b/venv/Lib/encodings/raw_unicode_escape.py new file mode 100644 index 00000000..2b919b40 --- /dev/null +++ b/venv/Lib/encodings/raw_unicode_escape.py @@ -0,0 +1,45 @@ +""" Python 'raw-unicode-escape' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.raw_unicode_escape_encode + decode = codecs.raw_unicode_escape_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.raw_unicode_escape_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.raw_unicode_escape_decode(input, self.errors)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='raw-unicode-escape', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/venv/Lib/encodings/rot_13.py b/venv/Lib/encodings/rot_13.py new file mode 100644 index 00000000..5627bfbc --- /dev/null +++ b/venv/Lib/encodings/rot_13.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python +""" Python Character Mapping Codec for ROT13. + +This codec de/encodes from str to str. + +Written by Marc-Andre Lemburg (mal@lemburg.com). +""" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return (str.translate(input, rot13_map), len(input)) + + def decode(self, input, errors='strict'): + return (str.translate(input, rot13_map), len(input)) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return str.translate(input, rot13_map) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return str.translate(input, rot13_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='rot-13', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) + +### Map + +rot13_map = codecs.make_identity_dict(range(256)) +rot13_map.update({ + 0x0041: 0x004e, + 0x0042: 0x004f, + 0x0043: 0x0050, + 0x0044: 0x0051, + 0x0045: 0x0052, + 0x0046: 0x0053, + 0x0047: 0x0054, + 0x0048: 0x0055, + 0x0049: 0x0056, + 0x004a: 0x0057, + 0x004b: 0x0058, + 0x004c: 0x0059, + 0x004d: 0x005a, + 0x004e: 0x0041, + 0x004f: 0x0042, + 0x0050: 0x0043, + 0x0051: 0x0044, + 0x0052: 0x0045, + 0x0053: 0x0046, + 0x0054: 0x0047, + 0x0055: 0x0048, + 0x0056: 0x0049, + 0x0057: 0x004a, + 0x0058: 0x004b, + 0x0059: 0x004c, + 0x005a: 0x004d, + 0x0061: 0x006e, + 0x0062: 0x006f, + 0x0063: 0x0070, + 0x0064: 0x0071, + 0x0065: 0x0072, + 0x0066: 0x0073, + 0x0067: 0x0074, + 0x0068: 0x0075, + 0x0069: 0x0076, + 0x006a: 0x0077, + 0x006b: 0x0078, + 0x006c: 0x0079, + 0x006d: 0x007a, + 0x006e: 0x0061, + 0x006f: 0x0062, + 0x0070: 0x0063, + 0x0071: 0x0064, + 0x0072: 0x0065, + 0x0073: 0x0066, + 0x0074: 0x0067, + 0x0075: 0x0068, + 0x0076: 0x0069, + 0x0077: 0x006a, + 0x0078: 0x006b, + 0x0079: 0x006c, + 0x007a: 0x006d, +}) + +### Filter API + +def rot13(infile, outfile): + outfile.write(codecs.encode(infile.read(), 'rot-13')) + +if __name__ == '__main__': + import sys + rot13(sys.stdin, sys.stdout) diff --git a/venv/Lib/encodings/shift_jis.py b/venv/Lib/encodings/shift_jis.py new file mode 100644 index 00000000..83381172 --- /dev/null +++ b/venv/Lib/encodings/shift_jis.py @@ -0,0 +1,39 @@ +# +# shift_jis.py: Python Unicode Codec for SHIFT_JIS +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('shift_jis') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='shift_jis', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/shift_jis_2004.py b/venv/Lib/encodings/shift_jis_2004.py new file mode 100644 index 00000000..161b1e86 --- /dev/null +++ b/venv/Lib/encodings/shift_jis_2004.py @@ -0,0 +1,39 @@ +# +# shift_jis_2004.py: Python Unicode Codec for SHIFT_JIS_2004 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('shift_jis_2004') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='shift_jis_2004', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/shift_jisx0213.py b/venv/Lib/encodings/shift_jisx0213.py new file mode 100644 index 00000000..cb653f53 --- /dev/null +++ b/venv/Lib/encodings/shift_jisx0213.py @@ -0,0 +1,39 @@ +# +# shift_jisx0213.py: Python Unicode Codec for SHIFT_JISX0213 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('shift_jisx0213') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='shift_jisx0213', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/tis_620.py b/venv/Lib/encodings/tis_620.py new file mode 100644 index 00000000..e2883863 --- /dev/null +++ b/venv/Lib/encodings/tis_620.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec tis_620 generated from 'python-mappings/TIS-620.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_table) + + def decode(self,input,errors='strict'): + return codecs.charmap_decode(input,errors,decoding_table) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_table)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='tis-620', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\ufffe' + '\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + '\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + '\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + '\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + '\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + '\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + '\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + '\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + '\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + '\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + '\u0e0b' # 0xAB -> THAI CHARACTER SO SO + '\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + '\u0e0d' # 0xAD -> THAI CHARACTER YO YING + '\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + '\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + '\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + '\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + '\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + '\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + '\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + '\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + '\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + '\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + '\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + '\u0e19' # 0xB9 -> THAI CHARACTER NO NU + '\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + '\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + '\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + '\u0e1d' # 0xBD -> THAI CHARACTER FO FA + '\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + '\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + '\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + '\u0e21' # 0xC1 -> THAI CHARACTER MO MA + '\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + '\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + '\u0e24' # 0xC4 -> THAI CHARACTER RU + '\u0e25' # 0xC5 -> THAI CHARACTER LO LING + '\u0e26' # 0xC6 -> THAI CHARACTER LU + '\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + '\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + '\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + '\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + '\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + '\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + '\u0e2d' # 0xCD -> THAI CHARACTER O ANG + '\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + '\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + '\u0e30' # 0xD0 -> THAI CHARACTER SARA A + '\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + '\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + '\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + '\u0e34' # 0xD4 -> THAI CHARACTER SARA I + '\u0e35' # 0xD5 -> THAI CHARACTER SARA II + '\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + '\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + '\u0e38' # 0xD8 -> THAI CHARACTER SARA U + '\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + '\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + '\u0e40' # 0xE0 -> THAI CHARACTER SARA E + '\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + '\u0e42' # 0xE2 -> THAI CHARACTER SARA O + '\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + '\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + '\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + '\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + '\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + '\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + '\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + '\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + '\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + '\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + '\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + '\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + '\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + '\u0e50' # 0xF0 -> THAI DIGIT ZERO + '\u0e51' # 0xF1 -> THAI DIGIT ONE + '\u0e52' # 0xF2 -> THAI DIGIT TWO + '\u0e53' # 0xF3 -> THAI DIGIT THREE + '\u0e54' # 0xF4 -> THAI DIGIT FOUR + '\u0e55' # 0xF5 -> THAI DIGIT FIVE + '\u0e56' # 0xF6 -> THAI DIGIT SIX + '\u0e57' # 0xF7 -> THAI DIGIT SEVEN + '\u0e58' # 0xF8 -> THAI DIGIT EIGHT + '\u0e59' # 0xF9 -> THAI DIGIT NINE + '\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + '\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/venv/Lib/encodings/undefined.py b/venv/Lib/encodings/undefined.py new file mode 100644 index 00000000..46902883 --- /dev/null +++ b/venv/Lib/encodings/undefined.py @@ -0,0 +1,49 @@ +""" Python 'undefined' Codec + + This codec will always raise a ValueError exception when being + used. It is intended for use by the site.py file to switch off + automatic string to Unicode coercion. + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + raise UnicodeError("undefined encoding") + + def decode(self,input,errors='strict'): + raise UnicodeError("undefined encoding") + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + raise UnicodeError("undefined encoding") + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + raise UnicodeError("undefined encoding") + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='undefined', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/venv/Lib/encodings/unicode_escape.py b/venv/Lib/encodings/unicode_escape.py new file mode 100644 index 00000000..817f9326 --- /dev/null +++ b/venv/Lib/encodings/unicode_escape.py @@ -0,0 +1,45 @@ +""" Python 'unicode-escape' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.unicode_escape_encode + decode = codecs.unicode_escape_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.unicode_escape_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.unicode_escape_decode(input, self.errors)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='unicode-escape', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/venv/Lib/encodings/unicode_internal.py b/venv/Lib/encodings/unicode_internal.py new file mode 100644 index 00000000..df3e7752 --- /dev/null +++ b/venv/Lib/encodings/unicode_internal.py @@ -0,0 +1,45 @@ +""" Python 'unicode-internal' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.unicode_internal_encode + decode = codecs.unicode_internal_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.unicode_internal_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.unicode_internal_decode(input, self.errors)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='unicode-internal', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/venv/Lib/encodings/utf_16.py b/venv/Lib/encodings/utf_16.py new file mode 100644 index 00000000..c6124824 --- /dev/null +++ b/venv/Lib/encodings/utf_16.py @@ -0,0 +1,155 @@ +""" Python 'utf-16' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs, sys + +### Codec APIs + +encode = codecs.utf_16_encode + +def decode(input, errors='strict'): + return codecs.utf_16_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + codecs.IncrementalEncoder.__init__(self, errors) + self.encoder = None + + def encode(self, input, final=False): + if self.encoder is None: + result = codecs.utf_16_encode(input, self.errors)[0] + if sys.byteorder == 'little': + self.encoder = codecs.utf_16_le_encode + else: + self.encoder = codecs.utf_16_be_encode + return result + return self.encoder(input, self.errors)[0] + + def reset(self): + codecs.IncrementalEncoder.reset(self) + self.encoder = None + + def getstate(self): + # state info we return to the caller: + # 0: stream is in natural order for this platform + # 2: endianness hasn't been determined yet + # (we're never writing in unnatural order) + return (2 if self.encoder is None else 0) + + def setstate(self, state): + if state: + self.encoder = None + else: + if sys.byteorder == 'little': + self.encoder = codecs.utf_16_le_encode + else: + self.encoder = codecs.utf_16_be_encode + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def __init__(self, errors='strict'): + codecs.BufferedIncrementalDecoder.__init__(self, errors) + self.decoder = None + + def _buffer_decode(self, input, errors, final): + if self.decoder is None: + (output, consumed, byteorder) = \ + codecs.utf_16_ex_decode(input, errors, 0, final) + if byteorder == -1: + self.decoder = codecs.utf_16_le_decode + elif byteorder == 1: + self.decoder = codecs.utf_16_be_decode + elif consumed >= 2: + raise UnicodeError("UTF-16 stream does not start with BOM") + return (output, consumed) + return self.decoder(input, self.errors, final) + + def reset(self): + codecs.BufferedIncrementalDecoder.reset(self) + self.decoder = None + + def getstate(self): + # additional state info from the base class must be None here, + # as it isn't passed along to the caller + state = codecs.BufferedIncrementalDecoder.getstate(self)[0] + # additional state info we pass to the caller: + # 0: stream is in natural order for this platform + # 1: stream is in unnatural order + # 2: endianness hasn't been determined yet + if self.decoder is None: + return (state, 2) + addstate = int((sys.byteorder == "big") != + (self.decoder is codecs.utf_16_be_decode)) + return (state, addstate) + + def setstate(self, state): + # state[1] will be ignored by BufferedIncrementalDecoder.setstate() + codecs.BufferedIncrementalDecoder.setstate(self, state) + state = state[1] + if state == 0: + self.decoder = (codecs.utf_16_be_decode + if sys.byteorder == "big" + else codecs.utf_16_le_decode) + elif state == 1: + self.decoder = (codecs.utf_16_le_decode + if sys.byteorder == "big" + else codecs.utf_16_be_decode) + else: + self.decoder = None + +class StreamWriter(codecs.StreamWriter): + def __init__(self, stream, errors='strict'): + codecs.StreamWriter.__init__(self, stream, errors) + self.encoder = None + + def reset(self): + codecs.StreamWriter.reset(self) + self.encoder = None + + def encode(self, input, errors='strict'): + if self.encoder is None: + result = codecs.utf_16_encode(input, errors) + if sys.byteorder == 'little': + self.encoder = codecs.utf_16_le_encode + else: + self.encoder = codecs.utf_16_be_encode + return result + else: + return self.encoder(input, errors) + +class StreamReader(codecs.StreamReader): + + def reset(self): + codecs.StreamReader.reset(self) + try: + del self.decode + except AttributeError: + pass + + def decode(self, input, errors='strict'): + (object, consumed, byteorder) = \ + codecs.utf_16_ex_decode(input, errors, 0, False) + if byteorder == -1: + self.decode = codecs.utf_16_le_decode + elif byteorder == 1: + self.decode = codecs.utf_16_be_decode + elif consumed>=2: + raise UnicodeError("UTF-16 stream does not start with BOM") + return (object, consumed) + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-16', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/utf_16_be.py b/venv/Lib/encodings/utf_16_be.py new file mode 100644 index 00000000..86b458eb --- /dev/null +++ b/venv/Lib/encodings/utf_16_be.py @@ -0,0 +1,42 @@ +""" Python 'utf-16-be' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +encode = codecs.utf_16_be_encode + +def decode(input, errors='strict'): + return codecs.utf_16_be_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_16_be_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_16_be_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_16_be_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_16_be_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-16-be', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/utf_16_le.py b/venv/Lib/encodings/utf_16_le.py new file mode 100644 index 00000000..ec454142 --- /dev/null +++ b/venv/Lib/encodings/utf_16_le.py @@ -0,0 +1,42 @@ +""" Python 'utf-16-le' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +encode = codecs.utf_16_le_encode + +def decode(input, errors='strict'): + return codecs.utf_16_le_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_16_le_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_16_le_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_16_le_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_16_le_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-16-le', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/utf_32.py b/venv/Lib/encodings/utf_32.py new file mode 100644 index 00000000..cdf84d14 --- /dev/null +++ b/venv/Lib/encodings/utf_32.py @@ -0,0 +1,150 @@ +""" +Python 'utf-32' Codec +""" +import codecs, sys + +### Codec APIs + +encode = codecs.utf_32_encode + +def decode(input, errors='strict'): + return codecs.utf_32_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + codecs.IncrementalEncoder.__init__(self, errors) + self.encoder = None + + def encode(self, input, final=False): + if self.encoder is None: + result = codecs.utf_32_encode(input, self.errors)[0] + if sys.byteorder == 'little': + self.encoder = codecs.utf_32_le_encode + else: + self.encoder = codecs.utf_32_be_encode + return result + return self.encoder(input, self.errors)[0] + + def reset(self): + codecs.IncrementalEncoder.reset(self) + self.encoder = None + + def getstate(self): + # state info we return to the caller: + # 0: stream is in natural order for this platform + # 2: endianness hasn't been determined yet + # (we're never writing in unnatural order) + return (2 if self.encoder is None else 0) + + def setstate(self, state): + if state: + self.encoder = None + else: + if sys.byteorder == 'little': + self.encoder = codecs.utf_32_le_encode + else: + self.encoder = codecs.utf_32_be_encode + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def __init__(self, errors='strict'): + codecs.BufferedIncrementalDecoder.__init__(self, errors) + self.decoder = None + + def _buffer_decode(self, input, errors, final): + if self.decoder is None: + (output, consumed, byteorder) = \ + codecs.utf_32_ex_decode(input, errors, 0, final) + if byteorder == -1: + self.decoder = codecs.utf_32_le_decode + elif byteorder == 1: + self.decoder = codecs.utf_32_be_decode + elif consumed >= 4: + raise UnicodeError("UTF-32 stream does not start with BOM") + return (output, consumed) + return self.decoder(input, self.errors, final) + + def reset(self): + codecs.BufferedIncrementalDecoder.reset(self) + self.decoder = None + + def getstate(self): + # additional state info from the base class must be None here, + # as it isn't passed along to the caller + state = codecs.BufferedIncrementalDecoder.getstate(self)[0] + # additional state info we pass to the caller: + # 0: stream is in natural order for this platform + # 1: stream is in unnatural order + # 2: endianness hasn't been determined yet + if self.decoder is None: + return (state, 2) + addstate = int((sys.byteorder == "big") != + (self.decoder is codecs.utf_32_be_decode)) + return (state, addstate) + + def setstate(self, state): + # state[1] will be ignored by BufferedIncrementalDecoder.setstate() + codecs.BufferedIncrementalDecoder.setstate(self, state) + state = state[1] + if state == 0: + self.decoder = (codecs.utf_32_be_decode + if sys.byteorder == "big" + else codecs.utf_32_le_decode) + elif state == 1: + self.decoder = (codecs.utf_32_le_decode + if sys.byteorder == "big" + else codecs.utf_32_be_decode) + else: + self.decoder = None + +class StreamWriter(codecs.StreamWriter): + def __init__(self, stream, errors='strict'): + self.encoder = None + codecs.StreamWriter.__init__(self, stream, errors) + + def reset(self): + codecs.StreamWriter.reset(self) + self.encoder = None + + def encode(self, input, errors='strict'): + if self.encoder is None: + result = codecs.utf_32_encode(input, errors) + if sys.byteorder == 'little': + self.encoder = codecs.utf_32_le_encode + else: + self.encoder = codecs.utf_32_be_encode + return result + else: + return self.encoder(input, errors) + +class StreamReader(codecs.StreamReader): + + def reset(self): + codecs.StreamReader.reset(self) + try: + del self.decode + except AttributeError: + pass + + def decode(self, input, errors='strict'): + (object, consumed, byteorder) = \ + codecs.utf_32_ex_decode(input, errors, 0, False) + if byteorder == -1: + self.decode = codecs.utf_32_le_decode + elif byteorder == 1: + self.decode = codecs.utf_32_be_decode + elif consumed>=4: + raise UnicodeError("UTF-32 stream does not start with BOM") + return (object, consumed) + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-32', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/utf_32_be.py b/venv/Lib/encodings/utf_32_be.py new file mode 100644 index 00000000..fe272b5f --- /dev/null +++ b/venv/Lib/encodings/utf_32_be.py @@ -0,0 +1,37 @@ +""" +Python 'utf-32-be' Codec +""" +import codecs + +### Codec APIs + +encode = codecs.utf_32_be_encode + +def decode(input, errors='strict'): + return codecs.utf_32_be_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_32_be_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_32_be_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_32_be_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_32_be_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-32-be', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/utf_32_le.py b/venv/Lib/encodings/utf_32_le.py new file mode 100644 index 00000000..9e482109 --- /dev/null +++ b/venv/Lib/encodings/utf_32_le.py @@ -0,0 +1,37 @@ +""" +Python 'utf-32-le' Codec +""" +import codecs + +### Codec APIs + +encode = codecs.utf_32_le_encode + +def decode(input, errors='strict'): + return codecs.utf_32_le_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_32_le_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_32_le_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_32_le_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_32_le_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-32-le', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/utf_7.py b/venv/Lib/encodings/utf_7.py new file mode 100644 index 00000000..8e0567f2 --- /dev/null +++ b/venv/Lib/encodings/utf_7.py @@ -0,0 +1,38 @@ +""" Python 'utf-7' Codec + +Written by Brian Quinlan (brian@sweetapp.com). +""" +import codecs + +### Codec APIs + +encode = codecs.utf_7_encode + +def decode(input, errors='strict'): + return codecs.utf_7_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_7_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_7_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_7_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_7_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-7', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/utf_8.py b/venv/Lib/encodings/utf_8.py new file mode 100644 index 00000000..1bf63365 --- /dev/null +++ b/venv/Lib/encodings/utf_8.py @@ -0,0 +1,42 @@ +""" Python 'utf-8' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +encode = codecs.utf_8_encode + +def decode(input, errors='strict'): + return codecs.utf_8_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_8_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_8_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_8_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_8_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-8', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/utf_8_sig.py b/venv/Lib/encodings/utf_8_sig.py new file mode 100644 index 00000000..1bb47920 --- /dev/null +++ b/venv/Lib/encodings/utf_8_sig.py @@ -0,0 +1,130 @@ +""" Python 'utf-8-sig' Codec +This work similar to UTF-8 with the following changes: + +* On encoding/writing a UTF-8 encoded BOM will be prepended/written as the + first three bytes. + +* On decoding/reading if the first three bytes are a UTF-8 encoded BOM, these + bytes will be skipped. +""" +import codecs + +### Codec APIs + +def encode(input, errors='strict'): + return (codecs.BOM_UTF8 + codecs.utf_8_encode(input, errors)[0], + len(input)) + +def decode(input, errors='strict'): + prefix = 0 + if input[:3] == codecs.BOM_UTF8: + input = input[3:] + prefix = 3 + (output, consumed) = codecs.utf_8_decode(input, errors, True) + return (output, consumed+prefix) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + codecs.IncrementalEncoder.__init__(self, errors) + self.first = 1 + + def encode(self, input, final=False): + if self.first: + self.first = 0 + return codecs.BOM_UTF8 + \ + codecs.utf_8_encode(input, self.errors)[0] + else: + return codecs.utf_8_encode(input, self.errors)[0] + + def reset(self): + codecs.IncrementalEncoder.reset(self) + self.first = 1 + + def getstate(self): + return self.first + + def setstate(self, state): + self.first = state + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def __init__(self, errors='strict'): + codecs.BufferedIncrementalDecoder.__init__(self, errors) + self.first = 1 + + def _buffer_decode(self, input, errors, final): + if self.first: + if len(input) < 3: + if codecs.BOM_UTF8.startswith(input): + # not enough data to decide if this really is a BOM + # => try again on the next call + return ("", 0) + else: + self.first = 0 + else: + self.first = 0 + if input[:3] == codecs.BOM_UTF8: + (output, consumed) = \ + codecs.utf_8_decode(input[3:], errors, final) + return (output, consumed+3) + return codecs.utf_8_decode(input, errors, final) + + def reset(self): + codecs.BufferedIncrementalDecoder.reset(self) + self.first = 1 + + def getstate(self): + state = codecs.BufferedIncrementalDecoder.getstate(self) + # state[1] must be 0 here, as it isn't passed along to the caller + return (state[0], self.first) + + def setstate(self, state): + # state[1] will be ignored by BufferedIncrementalDecoder.setstate() + codecs.BufferedIncrementalDecoder.setstate(self, state) + self.first = state[1] + +class StreamWriter(codecs.StreamWriter): + def reset(self): + codecs.StreamWriter.reset(self) + try: + del self.encode + except AttributeError: + pass + + def encode(self, input, errors='strict'): + self.encode = codecs.utf_8_encode + return encode(input, errors) + +class StreamReader(codecs.StreamReader): + def reset(self): + codecs.StreamReader.reset(self) + try: + del self.decode + except AttributeError: + pass + + def decode(self, input, errors='strict'): + if len(input) < 3: + if codecs.BOM_UTF8.startswith(input): + # not enough data to decide if this is a BOM + # => try again on the next call + return ("", 0) + elif input[:3] == codecs.BOM_UTF8: + self.decode = codecs.utf_8_decode + (output, consumed) = codecs.utf_8_decode(input[3:],errors) + return (output, consumed+3) + # (else) no BOM present + self.decode = codecs.utf_8_decode + return codecs.utf_8_decode(input, errors) + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-8-sig', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/venv/Lib/encodings/uu_codec.py b/venv/Lib/encodings/uu_codec.py new file mode 100644 index 00000000..2a5728fb --- /dev/null +++ b/venv/Lib/encodings/uu_codec.py @@ -0,0 +1,99 @@ +"""Python 'uu_codec' Codec - UU content transfer encoding. + +This codec de/encodes from bytes to bytes. + +Written by Marc-Andre Lemburg (mal@lemburg.com). Some details were +adapted from uu.py which was written by Lance Ellinghouse and +modified by Jack Jansen and Fredrik Lundh. +""" + +import codecs +import binascii +from io import BytesIO + +### Codec APIs + +def uu_encode(input, errors='strict', filename='', mode=0o666): + assert errors == 'strict' + infile = BytesIO(input) + outfile = BytesIO() + read = infile.read + write = outfile.write + + # Encode + write(('begin %o %s\n' % (mode & 0o777, filename)).encode('ascii')) + chunk = read(45) + while chunk: + write(binascii.b2a_uu(chunk)) + chunk = read(45) + write(b' \nend\n') + + return (outfile.getvalue(), len(input)) + +def uu_decode(input, errors='strict'): + assert errors == 'strict' + infile = BytesIO(input) + outfile = BytesIO() + readline = infile.readline + write = outfile.write + + # Find start of encoded data + while 1: + s = readline() + if not s: + raise ValueError('Missing "begin" line in input data') + if s[:5] == b'begin': + break + + # Decode + while True: + s = readline() + if not s or s == b'end\n': + break + try: + data = binascii.a2b_uu(s) + except binascii.Error as v: + # Workaround for broken uuencoders by /Fredrik Lundh + nbytes = (((s[0]-32) & 63) * 4 + 5) // 3 + data = binascii.a2b_uu(s[:nbytes]) + #sys.stderr.write("Warning: %s\n" % str(v)) + write(data) + if not s: + raise ValueError('Truncated input data') + + return (outfile.getvalue(), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return uu_encode(input, errors) + + def decode(self, input, errors='strict'): + return uu_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return uu_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return uu_decode(input, self.errors)[0] + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='uu', + encode=uu_encode, + decode=uu_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + _is_text_encoding=False, + ) diff --git a/venv/Lib/encodings/zlib_codec.py b/venv/Lib/encodings/zlib_codec.py new file mode 100644 index 00000000..95908a4b --- /dev/null +++ b/venv/Lib/encodings/zlib_codec.py @@ -0,0 +1,77 @@ +"""Python 'zlib_codec' Codec - zlib compression encoding. + +This codec de/encodes from bytes to bytes. + +Written by Marc-Andre Lemburg (mal@lemburg.com). +""" + +import codecs +import zlib # this codec needs the optional zlib module ! + +### Codec APIs + +def zlib_encode(input, errors='strict'): + assert errors == 'strict' + return (zlib.compress(input), len(input)) + +def zlib_decode(input, errors='strict'): + assert errors == 'strict' + return (zlib.decompress(input), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return zlib_encode(input, errors) + def decode(self, input, errors='strict'): + return zlib_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + assert errors == 'strict' + self.errors = errors + self.compressobj = zlib.compressobj() + + def encode(self, input, final=False): + if final: + c = self.compressobj.compress(input) + return c + self.compressobj.flush() + else: + return self.compressobj.compress(input) + + def reset(self): + self.compressobj = zlib.compressobj() + +class IncrementalDecoder(codecs.IncrementalDecoder): + def __init__(self, errors='strict'): + assert errors == 'strict' + self.errors = errors + self.decompressobj = zlib.decompressobj() + + def decode(self, input, final=False): + if final: + c = self.decompressobj.decompress(input) + return c + self.decompressobj.flush() + else: + return self.decompressobj.decompress(input) + + def reset(self): + self.decompressobj = zlib.decompressobj() + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='zlib', + encode=zlib_encode, + decode=zlib_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + _is_text_encoding=False, + ) diff --git a/venv/Lib/enum.py b/venv/Lib/enum.py new file mode 100644 index 00000000..576de031 --- /dev/null +++ b/venv/Lib/enum.py @@ -0,0 +1,901 @@ +import sys +from types import MappingProxyType, DynamicClassAttribute + +# try _collections first to reduce startup cost +try: + from _collections import OrderedDict +except ImportError: + from collections import OrderedDict + + +__all__ = [ + 'EnumMeta', + 'Enum', 'IntEnum', 'Flag', 'IntFlag', + 'auto', 'unique', + ] + + +def _is_descriptor(obj): + """Returns True if obj is a descriptor, False otherwise.""" + return ( + hasattr(obj, '__get__') or + hasattr(obj, '__set__') or + hasattr(obj, '__delete__')) + + +def _is_dunder(name): + """Returns True if a __dunder__ name, False otherwise.""" + return (name[:2] == name[-2:] == '__' and + name[2:3] != '_' and + name[-3:-2] != '_' and + len(name) > 4) + + +def _is_sunder(name): + """Returns True if a _sunder_ name, False otherwise.""" + return (name[0] == name[-1] == '_' and + name[1:2] != '_' and + name[-2:-1] != '_' and + len(name) > 2) + +def _make_class_unpicklable(cls): + """Make the given class un-picklable.""" + def _break_on_call_reduce(self, proto): + raise TypeError('%r cannot be pickled' % self) + cls.__reduce_ex__ = _break_on_call_reduce + cls.__module__ = '' + +_auto_null = object() +class auto: + """ + Instances are replaced with an appropriate value in Enum class suites. + """ + value = _auto_null + + +class _EnumDict(dict): + """Track enum member order and ensure member names are not reused. + + EnumMeta will use the names found in self._member_names as the + enumeration member names. + + """ + def __init__(self): + super().__init__() + self._member_names = [] + self._last_values = [] + self._ignore = [] + + def __setitem__(self, key, value): + """Changes anything not dundered or not a descriptor. + + If an enum member name is used twice, an error is raised; duplicate + values are not checked for. + + Single underscore (sunder) names are reserved. + + """ + if _is_sunder(key): + if key not in ( + '_order_', '_create_pseudo_member_', + '_generate_next_value_', '_missing_', '_ignore_', + ): + raise ValueError('_names_ are reserved for future Enum use') + if key == '_generate_next_value_': + setattr(self, '_generate_next_value', value) + elif key == '_ignore_': + if isinstance(value, str): + value = value.replace(',',' ').split() + else: + value = list(value) + self._ignore = value + already = set(value) & set(self._member_names) + if already: + raise ValueError('_ignore_ cannot specify already set names: %r' % (already, )) + elif _is_dunder(key): + if key == '__order__': + key = '_order_' + elif key in self._member_names: + # descriptor overwriting an enum? + raise TypeError('Attempted to reuse key: %r' % key) + elif key in self._ignore: + pass + elif not _is_descriptor(value): + if key in self: + # enum overwriting a descriptor? + raise TypeError('%r already defined as: %r' % (key, self[key])) + if isinstance(value, auto): + if value.value == _auto_null: + value.value = self._generate_next_value(key, 1, len(self._member_names), self._last_values[:]) + value = value.value + self._member_names.append(key) + self._last_values.append(value) + super().__setitem__(key, value) + + +# Dummy value for Enum as EnumMeta explicitly checks for it, but of course +# until EnumMeta finishes running the first time the Enum class doesn't exist. +# This is also why there are checks in EnumMeta like `if Enum is not None` +Enum = None + + +class EnumMeta(type): + """Metaclass for Enum""" + @classmethod + def __prepare__(metacls, cls, bases): + # create the namespace dict + enum_dict = _EnumDict() + # inherit previous flags and _generate_next_value_ function + member_type, first_enum = metacls._get_mixins_(bases) + if first_enum is not None: + enum_dict['_generate_next_value_'] = getattr(first_enum, '_generate_next_value_', None) + return enum_dict + + def __new__(metacls, cls, bases, classdict): + # an Enum class is final once enumeration items have been defined; it + # cannot be mixed with other types (int, float, etc.) if it has an + # inherited __new__ unless a new __new__ is defined (or the resulting + # class will fail). + # + # remove any keys listed in _ignore_ + classdict.setdefault('_ignore_', []).append('_ignore_') + ignore = classdict['_ignore_'] + for key in ignore: + classdict.pop(key, None) + member_type, first_enum = metacls._get_mixins_(bases) + __new__, save_new, use_args = metacls._find_new_(classdict, member_type, + first_enum) + + # save enum items into separate mapping so they don't get baked into + # the new class + enum_members = {k: classdict[k] for k in classdict._member_names} + for name in classdict._member_names: + del classdict[name] + + # adjust the sunders + _order_ = classdict.pop('_order_', None) + + # check for illegal enum names (any others?) + invalid_names = set(enum_members) & {'mro', } + if invalid_names: + raise ValueError('Invalid enum member name: {0}'.format( + ','.join(invalid_names))) + + # create a default docstring if one has not been provided + if '__doc__' not in classdict: + classdict['__doc__'] = 'An enumeration.' + + # create our new Enum type + enum_class = super().__new__(metacls, cls, bases, classdict) + enum_class._member_names_ = [] # names in definition order + enum_class._member_map_ = OrderedDict() # name->value map + enum_class._member_type_ = member_type + + # save attributes from super classes so we know if we can take + # the shortcut of storing members in the class dict + base_attributes = {a for b in enum_class.mro() for a in b.__dict__} + + # Reverse value->name map for hashable values. + enum_class._value2member_map_ = {} + + # If a custom type is mixed into the Enum, and it does not know how + # to pickle itself, pickle.dumps will succeed but pickle.loads will + # fail. Rather than have the error show up later and possibly far + # from the source, sabotage the pickle protocol for this class so + # that pickle.dumps also fails. + # + # However, if the new class implements its own __reduce_ex__, do not + # sabotage -- it's on them to make sure it works correctly. We use + # __reduce_ex__ instead of any of the others as it is preferred by + # pickle over __reduce__, and it handles all pickle protocols. + if '__reduce_ex__' not in classdict: + if member_type is not object: + methods = ('__getnewargs_ex__', '__getnewargs__', + '__reduce_ex__', '__reduce__') + if not any(m in member_type.__dict__ for m in methods): + _make_class_unpicklable(enum_class) + + # instantiate them, checking for duplicates as we go + # we instantiate first instead of checking for duplicates first in case + # a custom __new__ is doing something funky with the values -- such as + # auto-numbering ;) + for member_name in classdict._member_names: + value = enum_members[member_name] + if not isinstance(value, tuple): + args = (value, ) + else: + args = value + if member_type is tuple: # special case for tuple enums + args = (args, ) # wrap it one more time + if not use_args: + enum_member = __new__(enum_class) + if not hasattr(enum_member, '_value_'): + enum_member._value_ = value + else: + enum_member = __new__(enum_class, *args) + if not hasattr(enum_member, '_value_'): + if member_type is object: + enum_member._value_ = value + else: + enum_member._value_ = member_type(*args) + value = enum_member._value_ + enum_member._name_ = member_name + enum_member.__objclass__ = enum_class + enum_member.__init__(*args) + # If another member with the same value was already defined, the + # new member becomes an alias to the existing one. + for name, canonical_member in enum_class._member_map_.items(): + if canonical_member._value_ == enum_member._value_: + enum_member = canonical_member + break + else: + # Aliases don't appear in member names (only in __members__). + enum_class._member_names_.append(member_name) + # performance boost for any member that would not shadow + # a DynamicClassAttribute + if member_name not in base_attributes: + setattr(enum_class, member_name, enum_member) + # now add to _member_map_ + enum_class._member_map_[member_name] = enum_member + try: + # This may fail if value is not hashable. We can't add the value + # to the map, and by-value lookups for this value will be + # linear. + enum_class._value2member_map_[value] = enum_member + except TypeError: + pass + + # double check that repr and friends are not the mixin's or various + # things break (such as pickle) + for name in ('__repr__', '__str__', '__format__', '__reduce_ex__'): + class_method = getattr(enum_class, name) + obj_method = getattr(member_type, name, None) + enum_method = getattr(first_enum, name, None) + if obj_method is not None and obj_method is class_method: + setattr(enum_class, name, enum_method) + + # replace any other __new__ with our own (as long as Enum is not None, + # anyway) -- again, this is to support pickle + if Enum is not None: + # if the user defined their own __new__, save it before it gets + # clobbered in case they subclass later + if save_new: + enum_class.__new_member__ = __new__ + enum_class.__new__ = Enum.__new__ + + # py3 support for definition order (helps keep py2/py3 code in sync) + if _order_ is not None: + if isinstance(_order_, str): + _order_ = _order_.replace(',', ' ').split() + if _order_ != enum_class._member_names_: + raise TypeError('member order does not match _order_') + + return enum_class + + def __bool__(self): + """ + classes/types should always be True. + """ + return True + + def __call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1): + """Either returns an existing member, or creates a new enum class. + + This method is used both when an enum class is given a value to match + to an enumeration member (i.e. Color(3)) and for the functional API + (i.e. Color = Enum('Color', names='RED GREEN BLUE')). + + When used for the functional API: + + `value` will be the name of the new class. + + `names` should be either a string of white-space/comma delimited names + (values will start at `start`), or an iterator/mapping of name, value pairs. + + `module` should be set to the module this class is being created in; + if it is not set, an attempt to find that module will be made, but if + it fails the class will not be picklable. + + `qualname` should be set to the actual location this class can be found + at in its module; by default it is set to the global scope. If this is + not correct, unpickling will fail in some circumstances. + + `type`, if set, will be mixed in as the first base class. + + """ + if names is None: # simple value lookup + return cls.__new__(cls, value) + # otherwise, functional API: we're creating a new Enum type + return cls._create_(value, names, module=module, qualname=qualname, type=type, start=start) + + def __contains__(cls, member): + if not isinstance(member, Enum): + import warnings + warnings.warn( + "using non-Enums in containment checks will raise " + "TypeError in Python 3.8", + DeprecationWarning, 2) + return isinstance(member, cls) and member._name_ in cls._member_map_ + + def __delattr__(cls, attr): + # nicer error message when someone tries to delete an attribute + # (see issue19025). + if attr in cls._member_map_: + raise AttributeError( + "%s: cannot delete Enum member." % cls.__name__) + super().__delattr__(attr) + + def __dir__(self): + return (['__class__', '__doc__', '__members__', '__module__'] + + self._member_names_) + + def __getattr__(cls, name): + """Return the enum member matching `name` + + We use __getattr__ instead of descriptors or inserting into the enum + class' __dict__ in order to support `name` and `value` being both + properties for enum members (which live in the class' __dict__) and + enum members themselves. + + """ + if _is_dunder(name): + raise AttributeError(name) + try: + return cls._member_map_[name] + except KeyError: + raise AttributeError(name) from None + + def __getitem__(cls, name): + return cls._member_map_[name] + + def __iter__(cls): + return (cls._member_map_[name] for name in cls._member_names_) + + def __len__(cls): + return len(cls._member_names_) + + @property + def __members__(cls): + """Returns a mapping of member name->value. + + This mapping lists all enum members, including aliases. Note that this + is a read-only view of the internal mapping. + + """ + return MappingProxyType(cls._member_map_) + + def __repr__(cls): + return "" % cls.__name__ + + def __reversed__(cls): + return (cls._member_map_[name] for name in reversed(cls._member_names_)) + + def __setattr__(cls, name, value): + """Block attempts to reassign Enum members. + + A simple assignment to the class namespace only changes one of the + several possible ways to get an Enum member from the Enum class, + resulting in an inconsistent Enumeration. + + """ + member_map = cls.__dict__.get('_member_map_', {}) + if name in member_map: + raise AttributeError('Cannot reassign members.') + super().__setattr__(name, value) + + def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, start=1): + """Convenience method to create a new Enum class. + + `names` can be: + + * A string containing member names, separated either with spaces or + commas. Values are incremented by 1 from `start`. + * An iterable of member names. Values are incremented by 1 from `start`. + * An iterable of (member name, value) pairs. + * A mapping of member name -> value pairs. + + """ + metacls = cls.__class__ + bases = (cls, ) if type is None else (type, cls) + _, first_enum = cls._get_mixins_(bases) + classdict = metacls.__prepare__(class_name, bases) + + # special processing needed for names? + if isinstance(names, str): + names = names.replace(',', ' ').split() + if isinstance(names, (tuple, list)) and names and isinstance(names[0], str): + original_names, names = names, [] + last_values = [] + for count, name in enumerate(original_names): + value = first_enum._generate_next_value_(name, start, count, last_values[:]) + last_values.append(value) + names.append((name, value)) + + # Here, names is either an iterable of (name, value) or a mapping. + for item in names: + if isinstance(item, str): + member_name, member_value = item, names[item] + else: + member_name, member_value = item + classdict[member_name] = member_value + enum_class = metacls.__new__(metacls, class_name, bases, classdict) + + # TODO: replace the frame hack if a blessed way to know the calling + # module is ever developed + if module is None: + try: + module = sys._getframe(2).f_globals['__name__'] + except (AttributeError, ValueError) as exc: + pass + if module is None: + _make_class_unpicklable(enum_class) + else: + enum_class.__module__ = module + if qualname is not None: + enum_class.__qualname__ = qualname + + return enum_class + + @staticmethod + def _get_mixins_(bases): + """Returns the type for creating enum members, and the first inherited + enum class. + + bases: the tuple of bases that was given to __new__ + + """ + if not bases: + return object, Enum + + # double check that we are not subclassing a class with existing + # enumeration members; while we're at it, see if any other data + # type has been mixed in so we can use the correct __new__ + member_type = first_enum = None + for base in bases: + if (base is not Enum and + issubclass(base, Enum) and + base._member_names_): + raise TypeError("Cannot extend enumerations") + # base is now the last base in bases + if not issubclass(base, Enum): + raise TypeError("new enumerations must be created as " + "`ClassName([mixin_type,] enum_type)`") + + # get correct mix-in type (either mix-in type of Enum subclass, or + # first base if last base is Enum) + if not issubclass(bases[0], Enum): + member_type = bases[0] # first data type + first_enum = bases[-1] # enum type + else: + for base in bases[0].__mro__: + # most common: (IntEnum, int, Enum, object) + # possible: (, , + # , , + # ) + if issubclass(base, Enum): + if first_enum is None: + first_enum = base + else: + if member_type is None: + member_type = base + + return member_type, first_enum + + @staticmethod + def _find_new_(classdict, member_type, first_enum): + """Returns the __new__ to be used for creating the enum members. + + classdict: the class dictionary given to __new__ + member_type: the data type whose __new__ will be used by default + first_enum: enumeration to check for an overriding __new__ + + """ + # now find the correct __new__, checking to see of one was defined + # by the user; also check earlier enum classes in case a __new__ was + # saved as __new_member__ + __new__ = classdict.get('__new__', None) + + # should __new__ be saved as __new_member__ later? + save_new = __new__ is not None + + if __new__ is None: + # check all possibles for __new_member__ before falling back to + # __new__ + for method in ('__new_member__', '__new__'): + for possible in (member_type, first_enum): + target = getattr(possible, method, None) + if target not in { + None, + None.__new__, + object.__new__, + Enum.__new__, + }: + __new__ = target + break + if __new__ is not None: + break + else: + __new__ = object.__new__ + + # if a non-object.__new__ is used then whatever value/tuple was + # assigned to the enum member name will be passed to __new__ and to the + # new enum member's __init__ + if __new__ is object.__new__: + use_args = False + else: + use_args = True + + return __new__, save_new, use_args + + +class Enum(metaclass=EnumMeta): + """Generic enumeration. + + Derive from this class to define new enumerations. + + """ + def __new__(cls, value): + # all enum instances are actually created during class construction + # without calling this method; this method is called by the metaclass' + # __call__ (i.e. Color(3) ), and by pickle + if type(value) is cls: + # For lookups like Color(Color.RED) + return value + # by-value search for a matching enum member + # see if it's in the reverse mapping (for hashable values) + try: + if value in cls._value2member_map_: + return cls._value2member_map_[value] + except TypeError: + # not there, now do long search -- O(n) behavior + for member in cls._member_map_.values(): + if member._value_ == value: + return member + # still not found -- try _missing_ hook + return cls._missing_(value) + + def _generate_next_value_(name, start, count, last_values): + for last_value in reversed(last_values): + try: + return last_value + 1 + except TypeError: + pass + else: + return start + + @classmethod + def _missing_(cls, value): + raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + + def __repr__(self): + return "<%s.%s: %r>" % ( + self.__class__.__name__, self._name_, self._value_) + + def __str__(self): + return "%s.%s" % (self.__class__.__name__, self._name_) + + def __dir__(self): + added_behavior = [ + m + for cls in self.__class__.mro() + for m in cls.__dict__ + if m[0] != '_' and m not in self._member_map_ + ] + return (['__class__', '__doc__', '__module__'] + added_behavior) + + def __format__(self, format_spec): + # mixed-in Enums should use the mixed-in type's __format__, otherwise + # we can get strange results with the Enum name showing up instead of + # the value + + # pure Enum branch + if self._member_type_ is object: + cls = str + val = str(self) + # mix-in branch + else: + cls = self._member_type_ + val = self._value_ + return cls.__format__(val, format_spec) + + def __hash__(self): + return hash(self._name_) + + def __reduce_ex__(self, proto): + return self.__class__, (self._value_, ) + + # DynamicClassAttribute is used to provide access to the `name` and + # `value` properties of enum members while keeping some measure of + # protection from modification, while still allowing for an enumeration + # to have members named `name` and `value`. This works because enumeration + # members are not set directly on the enum class -- __getattr__ is + # used to look them up. + + @DynamicClassAttribute + def name(self): + """The name of the Enum member.""" + return self._name_ + + @DynamicClassAttribute + def value(self): + """The value of the Enum member.""" + return self._value_ + + @classmethod + def _convert(cls, name, module, filter, source=None): + """ + Create a new Enum subclass that replaces a collection of global constants + """ + # convert all constants from source (or module) that pass filter() to + # a new Enum called name, and export the enum and its members back to + # module; + # also, replace the __reduce_ex__ method so unpickling works in + # previous Python versions + module_globals = vars(sys.modules[module]) + if source: + source = vars(source) + else: + source = module_globals + # We use an OrderedDict of sorted source keys so that the + # _value2member_map is populated in the same order every time + # for a consistent reverse mapping of number to name when there + # are multiple names for the same number rather than varying + # between runs due to hash randomization of the module dictionary. + members = [ + (name, source[name]) + for name in source.keys() + if filter(name)] + try: + # sort by value + members.sort(key=lambda t: (t[1], t[0])) + except TypeError: + # unless some values aren't comparable, in which case sort by name + members.sort(key=lambda t: t[0]) + cls = cls(name, members, module=module) + cls.__reduce_ex__ = _reduce_ex_by_name + module_globals.update(cls.__members__) + module_globals[name] = cls + return cls + + +class IntEnum(int, Enum): + """Enum where members are also (and must be) ints""" + + +def _reduce_ex_by_name(self, proto): + return self.name + +class Flag(Enum): + """Support for flags""" + + def _generate_next_value_(name, start, count, last_values): + """ + Generate the next value when not given. + + name: the name of the member + start: the initital start value or None + count: the number of existing members + last_value: the last value assigned or None + """ + if not count: + return start if start is not None else 1 + for last_value in reversed(last_values): + try: + high_bit = _high_bit(last_value) + break + except Exception: + raise TypeError('Invalid Flag value: %r' % last_value) from None + return 2 ** (high_bit+1) + + @classmethod + def _missing_(cls, value): + original_value = value + if value < 0: + value = ~value + possible_member = cls._create_pseudo_member_(value) + if original_value < 0: + possible_member = ~possible_member + return possible_member + + @classmethod + def _create_pseudo_member_(cls, value): + """ + Create a composite member iff value contains only members. + """ + pseudo_member = cls._value2member_map_.get(value, None) + if pseudo_member is None: + # verify all bits are accounted for + _, extra_flags = _decompose(cls, value) + if extra_flags: + raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + # construct a singleton enum pseudo-member + pseudo_member = object.__new__(cls) + pseudo_member._name_ = None + pseudo_member._value_ = value + # use setdefault in case another thread already created a composite + # with this value + pseudo_member = cls._value2member_map_.setdefault(value, pseudo_member) + return pseudo_member + + def __contains__(self, other): + if not isinstance(other, self.__class__): + import warnings + warnings.warn( + "using non-Flags in containment checks will raise " + "TypeError in Python 3.8", + DeprecationWarning, 2) + return False + return other._value_ & self._value_ == other._value_ + + def __repr__(self): + cls = self.__class__ + if self._name_ is not None: + return '<%s.%s: %r>' % (cls.__name__, self._name_, self._value_) + members, uncovered = _decompose(cls, self._value_) + return '<%s.%s: %r>' % ( + cls.__name__, + '|'.join([str(m._name_ or m._value_) for m in members]), + self._value_, + ) + + def __str__(self): + cls = self.__class__ + if self._name_ is not None: + return '%s.%s' % (cls.__name__, self._name_) + members, uncovered = _decompose(cls, self._value_) + if len(members) == 1 and members[0]._name_ is None: + return '%s.%r' % (cls.__name__, members[0]._value_) + else: + return '%s.%s' % ( + cls.__name__, + '|'.join([str(m._name_ or m._value_) for m in members]), + ) + + def __bool__(self): + return bool(self._value_) + + def __or__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.__class__(self._value_ | other._value_) + + def __and__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.__class__(self._value_ & other._value_) + + def __xor__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.__class__(self._value_ ^ other._value_) + + def __invert__(self): + members, uncovered = _decompose(self.__class__, self._value_) + inverted = self.__class__(0) + for m in self.__class__: + if m not in members and not (m._value_ & self._value_): + inverted = inverted | m + return self.__class__(inverted) + + +class IntFlag(int, Flag): + """Support for integer-based Flags""" + + @classmethod + def _missing_(cls, value): + if not isinstance(value, int): + raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + new_member = cls._create_pseudo_member_(value) + return new_member + + @classmethod + def _create_pseudo_member_(cls, value): + pseudo_member = cls._value2member_map_.get(value, None) + if pseudo_member is None: + need_to_create = [value] + # get unaccounted for bits + _, extra_flags = _decompose(cls, value) + # timer = 10 + while extra_flags: + # timer -= 1 + bit = _high_bit(extra_flags) + flag_value = 2 ** bit + if (flag_value not in cls._value2member_map_ and + flag_value not in need_to_create + ): + need_to_create.append(flag_value) + if extra_flags == -flag_value: + extra_flags = 0 + else: + extra_flags ^= flag_value + for value in reversed(need_to_create): + # construct singleton pseudo-members + pseudo_member = int.__new__(cls, value) + pseudo_member._name_ = None + pseudo_member._value_ = value + # use setdefault in case another thread already created a composite + # with this value + pseudo_member = cls._value2member_map_.setdefault(value, pseudo_member) + return pseudo_member + + def __or__(self, other): + if not isinstance(other, (self.__class__, int)): + return NotImplemented + result = self.__class__(self._value_ | self.__class__(other)._value_) + return result + + def __and__(self, other): + if not isinstance(other, (self.__class__, int)): + return NotImplemented + return self.__class__(self._value_ & self.__class__(other)._value_) + + def __xor__(self, other): + if not isinstance(other, (self.__class__, int)): + return NotImplemented + return self.__class__(self._value_ ^ self.__class__(other)._value_) + + __ror__ = __or__ + __rand__ = __and__ + __rxor__ = __xor__ + + def __invert__(self): + result = self.__class__(~self._value_) + return result + + +def _high_bit(value): + """returns index of highest bit, or -1 if value is zero or negative""" + return value.bit_length() - 1 + +def unique(enumeration): + """Class decorator for enumerations ensuring unique member values.""" + duplicates = [] + for name, member in enumeration.__members__.items(): + if name != member.name: + duplicates.append((name, member.name)) + if duplicates: + alias_details = ', '.join( + ["%s -> %s" % (alias, name) for (alias, name) in duplicates]) + raise ValueError('duplicate values found in %r: %s' % + (enumeration, alias_details)) + return enumeration + +def _decompose(flag, value): + """Extract all members from the value.""" + # _decompose is only called if the value is not named + not_covered = value + negative = value < 0 + # issue29167: wrap accesses to _value2member_map_ in a list to avoid race + # conditions between iterating over it and having more pseudo- + # members added to it + if negative: + # only check for named flags + flags_to_check = [ + (m, v) + for v, m in list(flag._value2member_map_.items()) + if m.name is not None + ] + else: + # check for named flags and powers-of-two flags + flags_to_check = [ + (m, v) + for v, m in list(flag._value2member_map_.items()) + if m.name is not None or _power_of_two(v) + ] + members = [] + for member, member_value in flags_to_check: + if member_value and member_value & value == member_value: + members.append(member) + not_covered &= ~member_value + if not members and value in flag._value2member_map_: + members.append(flag._value2member_map_[value]) + members.sort(key=lambda m: m._value_, reverse=True) + if len(members) > 1 and members[0].value == value: + # we have the breakdown, don't need the value member itself + members.pop(0) + return members, not_covered + +def _power_of_two(value): + if value < 1: + return False + return value == 2 ** _high_bit(value) diff --git a/venv/Lib/fnmatch.py b/venv/Lib/fnmatch.py new file mode 100644 index 00000000..b98e6413 --- /dev/null +++ b/venv/Lib/fnmatch.py @@ -0,0 +1,128 @@ +"""Filename matching with shell patterns. + +fnmatch(FILENAME, PATTERN) matches according to the local convention. +fnmatchcase(FILENAME, PATTERN) always takes case in account. + +The functions operate by translating the pattern into a regular +expression. They cache the compiled regular expressions for speed. + +The function translate(PATTERN) returns a regular expression +corresponding to PATTERN. (It does not compile it.) +""" +import os +import posixpath +import re +import functools + +__all__ = ["filter", "fnmatch", "fnmatchcase", "translate"] + +def fnmatch(name, pat): + """Test whether FILENAME matches PATTERN. + + Patterns are Unix shell style: + + * matches everything + ? matches any single character + [seq] matches any character in seq + [!seq] matches any char not in seq + + An initial period in FILENAME is not special. + Both FILENAME and PATTERN are first case-normalized + if the operating system requires it. + If you don't want this, use fnmatchcase(FILENAME, PATTERN). + """ + name = os.path.normcase(name) + pat = os.path.normcase(pat) + return fnmatchcase(name, pat) + +@functools.lru_cache(maxsize=256, typed=True) +def _compile_pattern(pat): + if isinstance(pat, bytes): + pat_str = str(pat, 'ISO-8859-1') + res_str = translate(pat_str) + res = bytes(res_str, 'ISO-8859-1') + else: + res = translate(pat) + return re.compile(res).match + +def filter(names, pat): + """Return the subset of the list NAMES that match PAT.""" + result = [] + pat = os.path.normcase(pat) + match = _compile_pattern(pat) + if os.path is posixpath: + # normcase on posix is NOP. Optimize it away from the loop. + for name in names: + if match(name): + result.append(name) + else: + for name in names: + if match(os.path.normcase(name)): + result.append(name) + return result + +def fnmatchcase(name, pat): + """Test whether FILENAME matches PATTERN, including case. + + This is a version of fnmatch() which doesn't case-normalize + its arguments. + """ + match = _compile_pattern(pat) + return match(name) is not None + + +def translate(pat): + """Translate a shell PATTERN to a regular expression. + + There is no way to quote meta-characters. + """ + + i, n = 0, len(pat) + res = '' + while i < n: + c = pat[i] + i = i+1 + if c == '*': + res = res + '.*' + elif c == '?': + res = res + '.' + elif c == '[': + j = i + if j < n and pat[j] == '!': + j = j+1 + if j < n and pat[j] == ']': + j = j+1 + while j < n and pat[j] != ']': + j = j+1 + if j >= n: + res = res + '\\[' + else: + stuff = pat[i:j] + if '--' not in stuff: + stuff = stuff.replace('\\', r'\\') + else: + chunks = [] + k = i+2 if pat[i] == '!' else i+1 + while True: + k = pat.find('-', k, j) + if k < 0: + break + chunks.append(pat[i:k]) + i = k+1 + k = k+3 + chunks.append(pat[i:j]) + # Escape backslashes and hyphens for set difference (--). + # Hyphens that create ranges shouldn't be escaped. + stuff = '-'.join(s.replace('\\', r'\\').replace('-', r'\-') + for s in chunks) + # Escape set operations (&&, ~~ and ||). + stuff = re.sub(r'([&~|])', r'\\\1', stuff) + i = j+1 + if stuff[0] == '!': + stuff = '^' + stuff[1:] + elif stuff[0] in ('^', '['): + stuff = '\\' + stuff + res = '%s[%s]' % (res, stuff) + else: + res = res + re.escape(c) + return r'(?s:%s)\Z' % res diff --git a/venv/Lib/functools.py b/venv/Lib/functools.py new file mode 100644 index 00000000..c8b79c2a --- /dev/null +++ b/venv/Lib/functools.py @@ -0,0 +1,828 @@ +"""functools.py - Tools for working with functions and callable objects +""" +# Python module wrapper for _functools C module +# to allow utilities written in Python to be added +# to the functools module. +# Written by Nick Coghlan , +# Raymond Hettinger , +# and Łukasz Langa . +# Copyright (C) 2006-2013 Python Software Foundation. +# See C source code for _functools credits/copyright + +__all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES', + 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial', + 'partialmethod', 'singledispatch'] + +try: + from _functools import reduce +except ImportError: + pass +from abc import get_cache_token +from collections import namedtuple +# import types, weakref # Deferred to single_dispatch() +from reprlib import recursive_repr +from _thread import RLock + + +################################################################################ +### update_wrapper() and wraps() decorator +################################################################################ + +# update_wrapper() and wraps() are tools to help write +# wrapper functions that can handle naive introspection + +WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__', + '__annotations__') +WRAPPER_UPDATES = ('__dict__',) +def update_wrapper(wrapper, + wrapped, + assigned = WRAPPER_ASSIGNMENTS, + updated = WRAPPER_UPDATES): + """Update a wrapper function to look like the wrapped function + + wrapper is the function to be updated + wrapped is the original function + assigned is a tuple naming the attributes assigned directly + from the wrapped function to the wrapper function (defaults to + functools.WRAPPER_ASSIGNMENTS) + updated is a tuple naming the attributes of the wrapper that + are updated with the corresponding attribute from the wrapped + function (defaults to functools.WRAPPER_UPDATES) + """ + for attr in assigned: + try: + value = getattr(wrapped, attr) + except AttributeError: + pass + else: + setattr(wrapper, attr, value) + for attr in updated: + getattr(wrapper, attr).update(getattr(wrapped, attr, {})) + # Issue #17482: set __wrapped__ last so we don't inadvertently copy it + # from the wrapped function when updating __dict__ + wrapper.__wrapped__ = wrapped + # Return the wrapper so this can be used as a decorator via partial() + return wrapper + +def wraps(wrapped, + assigned = WRAPPER_ASSIGNMENTS, + updated = WRAPPER_UPDATES): + """Decorator factory to apply update_wrapper() to a wrapper function + + Returns a decorator that invokes update_wrapper() with the decorated + function as the wrapper argument and the arguments to wraps() as the + remaining arguments. Default arguments are as for update_wrapper(). + This is a convenience function to simplify applying partial() to + update_wrapper(). + """ + return partial(update_wrapper, wrapped=wrapped, + assigned=assigned, updated=updated) + + +################################################################################ +### total_ordering class decorator +################################################################################ + +# The total ordering functions all invoke the root magic method directly +# rather than using the corresponding operator. This avoids possible +# infinite recursion that could occur when the operator dispatch logic +# detects a NotImplemented result and then calls a reflected method. + +def _gt_from_lt(self, other, NotImplemented=NotImplemented): + 'Return a > b. Computed by @total_ordering from (not a < b) and (a != b).' + op_result = self.__lt__(other) + if op_result is NotImplemented: + return op_result + return not op_result and self != other + +def _le_from_lt(self, other, NotImplemented=NotImplemented): + 'Return a <= b. Computed by @total_ordering from (a < b) or (a == b).' + op_result = self.__lt__(other) + return op_result or self == other + +def _ge_from_lt(self, other, NotImplemented=NotImplemented): + 'Return a >= b. Computed by @total_ordering from (not a < b).' + op_result = self.__lt__(other) + if op_result is NotImplemented: + return op_result + return not op_result + +def _ge_from_le(self, other, NotImplemented=NotImplemented): + 'Return a >= b. Computed by @total_ordering from (not a <= b) or (a == b).' + op_result = self.__le__(other) + if op_result is NotImplemented: + return op_result + return not op_result or self == other + +def _lt_from_le(self, other, NotImplemented=NotImplemented): + 'Return a < b. Computed by @total_ordering from (a <= b) and (a != b).' + op_result = self.__le__(other) + if op_result is NotImplemented: + return op_result + return op_result and self != other + +def _gt_from_le(self, other, NotImplemented=NotImplemented): + 'Return a > b. Computed by @total_ordering from (not a <= b).' + op_result = self.__le__(other) + if op_result is NotImplemented: + return op_result + return not op_result + +def _lt_from_gt(self, other, NotImplemented=NotImplemented): + 'Return a < b. Computed by @total_ordering from (not a > b) and (a != b).' + op_result = self.__gt__(other) + if op_result is NotImplemented: + return op_result + return not op_result and self != other + +def _ge_from_gt(self, other, NotImplemented=NotImplemented): + 'Return a >= b. Computed by @total_ordering from (a > b) or (a == b).' + op_result = self.__gt__(other) + return op_result or self == other + +def _le_from_gt(self, other, NotImplemented=NotImplemented): + 'Return a <= b. Computed by @total_ordering from (not a > b).' + op_result = self.__gt__(other) + if op_result is NotImplemented: + return op_result + return not op_result + +def _le_from_ge(self, other, NotImplemented=NotImplemented): + 'Return a <= b. Computed by @total_ordering from (not a >= b) or (a == b).' + op_result = self.__ge__(other) + if op_result is NotImplemented: + return op_result + return not op_result or self == other + +def _gt_from_ge(self, other, NotImplemented=NotImplemented): + 'Return a > b. Computed by @total_ordering from (a >= b) and (a != b).' + op_result = self.__ge__(other) + if op_result is NotImplemented: + return op_result + return op_result and self != other + +def _lt_from_ge(self, other, NotImplemented=NotImplemented): + 'Return a < b. Computed by @total_ordering from (not a >= b).' + op_result = self.__ge__(other) + if op_result is NotImplemented: + return op_result + return not op_result + +_convert = { + '__lt__': [('__gt__', _gt_from_lt), + ('__le__', _le_from_lt), + ('__ge__', _ge_from_lt)], + '__le__': [('__ge__', _ge_from_le), + ('__lt__', _lt_from_le), + ('__gt__', _gt_from_le)], + '__gt__': [('__lt__', _lt_from_gt), + ('__ge__', _ge_from_gt), + ('__le__', _le_from_gt)], + '__ge__': [('__le__', _le_from_ge), + ('__gt__', _gt_from_ge), + ('__lt__', _lt_from_ge)] +} + +def total_ordering(cls): + """Class decorator that fills in missing ordering methods""" + # Find user-defined comparisons (not those inherited from object). + roots = {op for op in _convert if getattr(cls, op, None) is not getattr(object, op, None)} + if not roots: + raise ValueError('must define at least one ordering operation: < > <= >=') + root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__ + for opname, opfunc in _convert[root]: + if opname not in roots: + opfunc.__name__ = opname + setattr(cls, opname, opfunc) + return cls + + +################################################################################ +### cmp_to_key() function converter +################################################################################ + +def cmp_to_key(mycmp): + """Convert a cmp= function into a key= function""" + class K(object): + __slots__ = ['obj'] + def __init__(self, obj): + self.obj = obj + def __lt__(self, other): + return mycmp(self.obj, other.obj) < 0 + def __gt__(self, other): + return mycmp(self.obj, other.obj) > 0 + def __eq__(self, other): + return mycmp(self.obj, other.obj) == 0 + def __le__(self, other): + return mycmp(self.obj, other.obj) <= 0 + def __ge__(self, other): + return mycmp(self.obj, other.obj) >= 0 + __hash__ = None + return K + +try: + from _functools import cmp_to_key +except ImportError: + pass + + +################################################################################ +### partial() argument application +################################################################################ + +# Purely functional, no descriptor behaviour +class partial: + """New function with partial application of the given arguments + and keywords. + """ + + __slots__ = "func", "args", "keywords", "__dict__", "__weakref__" + + def __new__(*args, **keywords): + if not args: + raise TypeError("descriptor '__new__' of partial needs an argument") + if len(args) < 2: + raise TypeError("type 'partial' takes at least one argument") + cls, func, *args = args + if not callable(func): + raise TypeError("the first argument must be callable") + args = tuple(args) + + if hasattr(func, "func"): + args = func.args + args + tmpkw = func.keywords.copy() + tmpkw.update(keywords) + keywords = tmpkw + del tmpkw + func = func.func + + self = super(partial, cls).__new__(cls) + + self.func = func + self.args = args + self.keywords = keywords + return self + + def __call__(*args, **keywords): + if not args: + raise TypeError("descriptor '__call__' of partial needs an argument") + self, *args = args + newkeywords = self.keywords.copy() + newkeywords.update(keywords) + return self.func(*self.args, *args, **newkeywords) + + @recursive_repr() + def __repr__(self): + qualname = type(self).__qualname__ + args = [repr(self.func)] + args.extend(repr(x) for x in self.args) + args.extend(f"{k}={v!r}" for (k, v) in self.keywords.items()) + if type(self).__module__ == "functools": + return f"functools.{qualname}({', '.join(args)})" + return f"{qualname}({', '.join(args)})" + + def __reduce__(self): + return type(self), (self.func,), (self.func, self.args, + self.keywords or None, self.__dict__ or None) + + def __setstate__(self, state): + if not isinstance(state, tuple): + raise TypeError("argument to __setstate__ must be a tuple") + if len(state) != 4: + raise TypeError(f"expected 4 items in state, got {len(state)}") + func, args, kwds, namespace = state + if (not callable(func) or not isinstance(args, tuple) or + (kwds is not None and not isinstance(kwds, dict)) or + (namespace is not None and not isinstance(namespace, dict))): + raise TypeError("invalid partial state") + + args = tuple(args) # just in case it's a subclass + if kwds is None: + kwds = {} + elif type(kwds) is not dict: # XXX does it need to be *exactly* dict? + kwds = dict(kwds) + if namespace is None: + namespace = {} + + self.__dict__ = namespace + self.func = func + self.args = args + self.keywords = kwds + +try: + from _functools import partial +except ImportError: + pass + +# Descriptor version +class partialmethod(object): + """Method descriptor with partial application of the given arguments + and keywords. + + Supports wrapping existing descriptors and handles non-descriptor + callables as instance methods. + """ + + def __init__(self, func, *args, **keywords): + if not callable(func) and not hasattr(func, "__get__"): + raise TypeError("{!r} is not callable or a descriptor" + .format(func)) + + # func could be a descriptor like classmethod which isn't callable, + # so we can't inherit from partial (it verifies func is callable) + if isinstance(func, partialmethod): + # flattening is mandatory in order to place cls/self before all + # other arguments + # it's also more efficient since only one function will be called + self.func = func.func + self.args = func.args + args + self.keywords = func.keywords.copy() + self.keywords.update(keywords) + else: + self.func = func + self.args = args + self.keywords = keywords + + def __repr__(self): + args = ", ".join(map(repr, self.args)) + keywords = ", ".join("{}={!r}".format(k, v) + for k, v in self.keywords.items()) + format_string = "{module}.{cls}({func}, {args}, {keywords})" + return format_string.format(module=self.__class__.__module__, + cls=self.__class__.__qualname__, + func=self.func, + args=args, + keywords=keywords) + + def _make_unbound_method(self): + def _method(*args, **keywords): + call_keywords = self.keywords.copy() + call_keywords.update(keywords) + cls_or_self, *rest = args + call_args = (cls_or_self,) + self.args + tuple(rest) + return self.func(*call_args, **call_keywords) + _method.__isabstractmethod__ = self.__isabstractmethod__ + _method._partialmethod = self + return _method + + def __get__(self, obj, cls): + get = getattr(self.func, "__get__", None) + result = None + if get is not None: + new_func = get(obj, cls) + if new_func is not self.func: + # Assume __get__ returning something new indicates the + # creation of an appropriate callable + result = partial(new_func, *self.args, **self.keywords) + try: + result.__self__ = new_func.__self__ + except AttributeError: + pass + if result is None: + # If the underlying descriptor didn't do anything, treat this + # like an instance method + result = self._make_unbound_method().__get__(obj, cls) + return result + + @property + def __isabstractmethod__(self): + return getattr(self.func, "__isabstractmethod__", False) + + +################################################################################ +### LRU Cache function decorator +################################################################################ + +_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"]) + +class _HashedSeq(list): + """ This class guarantees that hash() will be called no more than once + per element. This is important because the lru_cache() will hash + the key multiple times on a cache miss. + + """ + + __slots__ = 'hashvalue' + + def __init__(self, tup, hash=hash): + self[:] = tup + self.hashvalue = hash(tup) + + def __hash__(self): + return self.hashvalue + +def _make_key(args, kwds, typed, + kwd_mark = (object(),), + fasttypes = {int, str, frozenset, type(None)}, + tuple=tuple, type=type, len=len): + """Make a cache key from optionally typed positional and keyword arguments + + The key is constructed in a way that is flat as possible rather than + as a nested structure that would take more memory. + + If there is only a single argument and its data type is known to cache + its hash value, then that argument is returned without a wrapper. This + saves space and improves lookup speed. + + """ + # All of code below relies on kwds preserving the order input by the user. + # Formerly, we sorted() the kwds before looping. The new way is *much* + # faster; however, it means that f(x=1, y=2) will now be treated as a + # distinct call from f(y=2, x=1) which will be cached separately. + key = args + if kwds: + key += kwd_mark + for item in kwds.items(): + key += item + if typed: + key += tuple(type(v) for v in args) + if kwds: + key += tuple(type(v) for v in kwds.values()) + elif len(key) == 1 and type(key[0]) in fasttypes: + return key[0] + return _HashedSeq(key) + +def lru_cache(maxsize=128, typed=False): + """Least-recently-used cache decorator. + + If *maxsize* is set to None, the LRU features are disabled and the cache + can grow without bound. + + If *typed* is True, arguments of different types will be cached separately. + For example, f(3.0) and f(3) will be treated as distinct calls with + distinct results. + + Arguments to the cached function must be hashable. + + View the cache statistics named tuple (hits, misses, maxsize, currsize) + with f.cache_info(). Clear the cache and statistics with f.cache_clear(). + Access the underlying function with f.__wrapped__. + + See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used + + """ + + # Users should only access the lru_cache through its public API: + # cache_info, cache_clear, and f.__wrapped__ + # The internals of the lru_cache are encapsulated for thread safety and + # to allow the implementation to change (including a possible C version). + + # Early detection of an erroneous call to @lru_cache without any arguments + # resulting in the inner function being passed to maxsize instead of an + # integer or None. + if maxsize is not None and not isinstance(maxsize, int): + raise TypeError('Expected maxsize to be an integer or None') + + def decorating_function(user_function): + wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo) + return update_wrapper(wrapper, user_function) + + return decorating_function + +def _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo): + # Constants shared by all lru cache instances: + sentinel = object() # unique object used to signal cache misses + make_key = _make_key # build a key from the function arguments + PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields + + cache = {} + hits = misses = 0 + full = False + cache_get = cache.get # bound method to lookup a key or return None + cache_len = cache.__len__ # get cache size without calling len() + lock = RLock() # because linkedlist updates aren't threadsafe + root = [] # root of the circular doubly linked list + root[:] = [root, root, None, None] # initialize by pointing to self + + if maxsize == 0: + + def wrapper(*args, **kwds): + # No caching -- just a statistics update after a successful call + nonlocal misses + result = user_function(*args, **kwds) + misses += 1 + return result + + elif maxsize is None: + + def wrapper(*args, **kwds): + # Simple caching without ordering or size limit + nonlocal hits, misses + key = make_key(args, kwds, typed) + result = cache_get(key, sentinel) + if result is not sentinel: + hits += 1 + return result + result = user_function(*args, **kwds) + cache[key] = result + misses += 1 + return result + + else: + + def wrapper(*args, **kwds): + # Size limited caching that tracks accesses by recency + nonlocal root, hits, misses, full + key = make_key(args, kwds, typed) + with lock: + link = cache_get(key) + if link is not None: + # Move the link to the front of the circular queue + link_prev, link_next, _key, result = link + link_prev[NEXT] = link_next + link_next[PREV] = link_prev + last = root[PREV] + last[NEXT] = root[PREV] = link + link[PREV] = last + link[NEXT] = root + hits += 1 + return result + result = user_function(*args, **kwds) + with lock: + if key in cache: + # Getting here means that this same key was added to the + # cache while the lock was released. Since the link + # update is already done, we need only return the + # computed result and update the count of misses. + pass + elif full: + # Use the old root to store the new key and result. + oldroot = root + oldroot[KEY] = key + oldroot[RESULT] = result + # Empty the oldest link and make it the new root. + # Keep a reference to the old key and old result to + # prevent their ref counts from going to zero during the + # update. That will prevent potentially arbitrary object + # clean-up code (i.e. __del__) from running while we're + # still adjusting the links. + root = oldroot[NEXT] + oldkey = root[KEY] + oldresult = root[RESULT] + root[KEY] = root[RESULT] = None + # Now update the cache dictionary. + del cache[oldkey] + # Save the potentially reentrant cache[key] assignment + # for last, after the root and links have been put in + # a consistent state. + cache[key] = oldroot + else: + # Put result in a new link at the front of the queue. + last = root[PREV] + link = [last, root, key, result] + last[NEXT] = root[PREV] = cache[key] = link + # Use the cache_len bound method instead of the len() function + # which could potentially be wrapped in an lru_cache itself. + full = (cache_len() >= maxsize) + misses += 1 + return result + + def cache_info(): + """Report cache statistics""" + with lock: + return _CacheInfo(hits, misses, maxsize, cache_len()) + + def cache_clear(): + """Clear the cache and cache statistics""" + nonlocal hits, misses, full + with lock: + cache.clear() + root[:] = [root, root, None, None] + hits = misses = 0 + full = False + + wrapper.cache_info = cache_info + wrapper.cache_clear = cache_clear + return wrapper + +try: + from _functools import _lru_cache_wrapper +except ImportError: + pass + + +################################################################################ +### singledispatch() - single-dispatch generic function decorator +################################################################################ + +def _c3_merge(sequences): + """Merges MROs in *sequences* to a single MRO using the C3 algorithm. + + Adapted from http://www.python.org/download/releases/2.3/mro/. + + """ + result = [] + while True: + sequences = [s for s in sequences if s] # purge empty sequences + if not sequences: + return result + for s1 in sequences: # find merge candidates among seq heads + candidate = s1[0] + for s2 in sequences: + if candidate in s2[1:]: + candidate = None + break # reject the current head, it appears later + else: + break + if candidate is None: + raise RuntimeError("Inconsistent hierarchy") + result.append(candidate) + # remove the chosen candidate + for seq in sequences: + if seq[0] == candidate: + del seq[0] + +def _c3_mro(cls, abcs=None): + """Computes the method resolution order using extended C3 linearization. + + If no *abcs* are given, the algorithm works exactly like the built-in C3 + linearization used for method resolution. + + If given, *abcs* is a list of abstract base classes that should be inserted + into the resulting MRO. Unrelated ABCs are ignored and don't end up in the + result. The algorithm inserts ABCs where their functionality is introduced, + i.e. issubclass(cls, abc) returns True for the class itself but returns + False for all its direct base classes. Implicit ABCs for a given class + (either registered or inferred from the presence of a special method like + __len__) are inserted directly after the last ABC explicitly listed in the + MRO of said class. If two implicit ABCs end up next to each other in the + resulting MRO, their ordering depends on the order of types in *abcs*. + + """ + for i, base in enumerate(reversed(cls.__bases__)): + if hasattr(base, '__abstractmethods__'): + boundary = len(cls.__bases__) - i + break # Bases up to the last explicit ABC are considered first. + else: + boundary = 0 + abcs = list(abcs) if abcs else [] + explicit_bases = list(cls.__bases__[:boundary]) + abstract_bases = [] + other_bases = list(cls.__bases__[boundary:]) + for base in abcs: + if issubclass(cls, base) and not any( + issubclass(b, base) for b in cls.__bases__ + ): + # If *cls* is the class that introduces behaviour described by + # an ABC *base*, insert said ABC to its MRO. + abstract_bases.append(base) + for base in abstract_bases: + abcs.remove(base) + explicit_c3_mros = [_c3_mro(base, abcs=abcs) for base in explicit_bases] + abstract_c3_mros = [_c3_mro(base, abcs=abcs) for base in abstract_bases] + other_c3_mros = [_c3_mro(base, abcs=abcs) for base in other_bases] + return _c3_merge( + [[cls]] + + explicit_c3_mros + abstract_c3_mros + other_c3_mros + + [explicit_bases] + [abstract_bases] + [other_bases] + ) + +def _compose_mro(cls, types): + """Calculates the method resolution order for a given class *cls*. + + Includes relevant abstract base classes (with their respective bases) from + the *types* iterable. Uses a modified C3 linearization algorithm. + + """ + bases = set(cls.__mro__) + # Remove entries which are already present in the __mro__ or unrelated. + def is_related(typ): + return (typ not in bases and hasattr(typ, '__mro__') + and issubclass(cls, typ)) + types = [n for n in types if is_related(n)] + # Remove entries which are strict bases of other entries (they will end up + # in the MRO anyway. + def is_strict_base(typ): + for other in types: + if typ != other and typ in other.__mro__: + return True + return False + types = [n for n in types if not is_strict_base(n)] + # Subclasses of the ABCs in *types* which are also implemented by + # *cls* can be used to stabilize ABC ordering. + type_set = set(types) + mro = [] + for typ in types: + found = [] + for sub in typ.__subclasses__(): + if sub not in bases and issubclass(cls, sub): + found.append([s for s in sub.__mro__ if s in type_set]) + if not found: + mro.append(typ) + continue + # Favor subclasses with the biggest number of useful bases + found.sort(key=len, reverse=True) + for sub in found: + for subcls in sub: + if subcls not in mro: + mro.append(subcls) + return _c3_mro(cls, abcs=mro) + +def _find_impl(cls, registry): + """Returns the best matching implementation from *registry* for type *cls*. + + Where there is no registered implementation for a specific type, its method + resolution order is used to find a more generic implementation. + + Note: if *registry* does not contain an implementation for the base + *object* type, this function may return None. + + """ + mro = _compose_mro(cls, registry.keys()) + match = None + for t in mro: + if match is not None: + # If *match* is an implicit ABC but there is another unrelated, + # equally matching implicit ABC, refuse the temptation to guess. + if (t in registry and t not in cls.__mro__ + and match not in cls.__mro__ + and not issubclass(match, t)): + raise RuntimeError("Ambiguous dispatch: {} or {}".format( + match, t)) + break + if t in registry: + match = t + return registry.get(match) + +def singledispatch(func): + """Single-dispatch generic function decorator. + + Transforms a function into a generic function, which can have different + behaviours depending upon the type of its first argument. The decorated + function acts as the default implementation, and additional + implementations can be registered using the register() attribute of the + generic function. + """ + # There are many programs that use functools without singledispatch, so we + # trade-off making singledispatch marginally slower for the benefit of + # making start-up of such applications slightly faster. + import types, weakref + + registry = {} + dispatch_cache = weakref.WeakKeyDictionary() + cache_token = None + + def dispatch(cls): + """generic_func.dispatch(cls) -> + + Runs the dispatch algorithm to return the best available implementation + for the given *cls* registered on *generic_func*. + + """ + nonlocal cache_token + if cache_token is not None: + current_token = get_cache_token() + if cache_token != current_token: + dispatch_cache.clear() + cache_token = current_token + try: + impl = dispatch_cache[cls] + except KeyError: + try: + impl = registry[cls] + except KeyError: + impl = _find_impl(cls, registry) + dispatch_cache[cls] = impl + return impl + + def register(cls, func=None): + """generic_func.register(cls, func) -> func + + Registers a new implementation for the given *cls* on a *generic_func*. + + """ + nonlocal cache_token + if func is None: + if isinstance(cls, type): + return lambda f: register(cls, f) + ann = getattr(cls, '__annotations__', {}) + if not ann: + raise TypeError( + f"Invalid first argument to `register()`: {cls!r}. " + f"Use either `@register(some_class)` or plain `@register` " + f"on an annotated function." + ) + func = cls + + # only import typing if annotation parsing is necessary + from typing import get_type_hints + argname, cls = next(iter(get_type_hints(func).items())) + assert isinstance(cls, type), ( + f"Invalid annotation for {argname!r}. {cls!r} is not a class." + ) + registry[cls] = func + if cache_token is None and hasattr(cls, '__abstractmethods__'): + cache_token = get_cache_token() + dispatch_cache.clear() + return func + + def wrapper(*args, **kw): + return dispatch(args[0].__class__)(*args, **kw) + + registry[object] = func + wrapper.register = register + wrapper.dispatch = dispatch + wrapper.registry = types.MappingProxyType(registry) + wrapper._clear_cache = dispatch_cache.clear + update_wrapper(wrapper, func) + return wrapper diff --git a/venv/Lib/genericpath.py b/venv/Lib/genericpath.py new file mode 100644 index 00000000..303b3b34 --- /dev/null +++ b/venv/Lib/genericpath.py @@ -0,0 +1,151 @@ +""" +Path operations common to more than one OS +Do not use directly. The OS specific modules import the appropriate +functions from this module themselves. +""" +import os +import stat + +__all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime', + 'getsize', 'isdir', 'isfile', 'samefile', 'sameopenfile', + 'samestat'] + + +# Does a path exist? +# This is false for dangling symbolic links on systems that support them. +def exists(path): + """Test whether a path exists. Returns False for broken symbolic links""" + try: + os.stat(path) + except OSError: + return False + return True + + +# This follows symbolic links, so both islink() and isdir() can be true +# for the same path on systems that support symlinks +def isfile(path): + """Test whether a path is a regular file""" + try: + st = os.stat(path) + except OSError: + return False + return stat.S_ISREG(st.st_mode) + + +# Is a path a directory? +# This follows symbolic links, so both islink() and isdir() +# can be true for the same path on systems that support symlinks +def isdir(s): + """Return true if the pathname refers to an existing directory.""" + try: + st = os.stat(s) + except OSError: + return False + return stat.S_ISDIR(st.st_mode) + + +def getsize(filename): + """Return the size of a file, reported by os.stat().""" + return os.stat(filename).st_size + + +def getmtime(filename): + """Return the last modification time of a file, reported by os.stat().""" + return os.stat(filename).st_mtime + + +def getatime(filename): + """Return the last access time of a file, reported by os.stat().""" + return os.stat(filename).st_atime + + +def getctime(filename): + """Return the metadata change time of a file, reported by os.stat().""" + return os.stat(filename).st_ctime + + +# Return the longest prefix of all list elements. +def commonprefix(m): + "Given a list of pathnames, returns the longest common leading component" + if not m: return '' + # Some people pass in a list of pathname parts to operate in an OS-agnostic + # fashion; don't try to translate in that case as that's an abuse of the + # API and they are already doing what they need to be OS-agnostic and so + # they most likely won't be using an os.PathLike object in the sublists. + if not isinstance(m[0], (list, tuple)): + m = tuple(map(os.fspath, m)) + s1 = min(m) + s2 = max(m) + for i, c in enumerate(s1): + if c != s2[i]: + return s1[:i] + return s1 + +# Are two stat buffers (obtained from stat, fstat or lstat) +# describing the same file? +def samestat(s1, s2): + """Test whether two stat buffers reference the same file""" + return (s1.st_ino == s2.st_ino and + s1.st_dev == s2.st_dev) + + +# Are two filenames really pointing to the same file? +def samefile(f1, f2): + """Test whether two pathnames reference the same actual file""" + s1 = os.stat(f1) + s2 = os.stat(f2) + return samestat(s1, s2) + + +# Are two open files really referencing the same file? +# (Not necessarily the same file descriptor!) +def sameopenfile(fp1, fp2): + """Test whether two open file objects reference the same file""" + s1 = os.fstat(fp1) + s2 = os.fstat(fp2) + return samestat(s1, s2) + + +# Split a path in root and extension. +# The extension is everything starting at the last dot in the last +# pathname component; the root is everything before that. +# It is always true that root + ext == p. + +# Generic implementation of splitext, to be parametrized with +# the separators +def _splitext(p, sep, altsep, extsep): + """Split the extension from a pathname. + + Extension is everything from the last dot to the end, ignoring + leading dots. Returns "(root, ext)"; ext may be empty.""" + # NOTE: This code must work for text and bytes strings. + + sepIndex = p.rfind(sep) + if altsep: + altsepIndex = p.rfind(altsep) + sepIndex = max(sepIndex, altsepIndex) + + dotIndex = p.rfind(extsep) + if dotIndex > sepIndex: + # skip all leading dots + filenameIndex = sepIndex + 1 + while filenameIndex < dotIndex: + if p[filenameIndex:filenameIndex+1] != extsep: + return p[:dotIndex], p[dotIndex:] + filenameIndex += 1 + + return p, p[:0] + +def _check_arg_types(funcname, *args): + hasstr = hasbytes = False + for s in args: + if isinstance(s, str): + hasstr = True + elif isinstance(s, bytes): + hasbytes = True + else: + raise TypeError('%s() argument must be str or bytes, not %r' % + (funcname, s.__class__.__name__)) from None + if hasstr and hasbytes: + raise TypeError("Can't mix strings and bytes in path components") from None diff --git a/venv/Lib/hashlib.py b/venv/Lib/hashlib.py new file mode 100644 index 00000000..e30c6100 --- /dev/null +++ b/venv/Lib/hashlib.py @@ -0,0 +1,251 @@ +#. Copyright (C) 2005-2010 Gregory P. Smith (greg@krypto.org) +# Licensed to PSF under a Contributor Agreement. +# + +__doc__ = """hashlib module - A common interface to many hash functions. + +new(name, data=b'', **kwargs) - returns a new hash object implementing the + given hash function; initializing the hash + using the given binary data. + +Named constructor functions are also available, these are faster +than using new(name): + +md5(), sha1(), sha224(), sha256(), sha384(), sha512(), blake2b(), blake2s(), +sha3_224, sha3_256, sha3_384, sha3_512, shake_128, and shake_256. + +More algorithms may be available on your platform but the above are guaranteed +to exist. See the algorithms_guaranteed and algorithms_available attributes +to find out what algorithm names can be passed to new(). + +NOTE: If you want the adler32 or crc32 hash functions they are available in +the zlib module. + +Choose your hash function wisely. Some have known collision weaknesses. +sha384 and sha512 will be slow on 32 bit platforms. + +Hash objects have these methods: + - update(arg): Update the hash object with the bytes in arg. Repeated calls + are equivalent to a single call with the concatenation of all + the arguments. + - digest(): Return the digest of the bytes passed to the update() method + so far. + - hexdigest(): Like digest() except the digest is returned as a unicode + object of double length, containing only hexadecimal digits. + - copy(): Return a copy (clone) of the hash object. This can be used to + efficiently compute the digests of strings that share a common + initial substring. + +For example, to obtain the digest of the string 'Nobody inspects the +spammish repetition': + + >>> import hashlib + >>> m = hashlib.md5() + >>> m.update(b"Nobody inspects") + >>> m.update(b" the spammish repetition") + >>> m.digest() + b'\\xbbd\\x9c\\x83\\xdd\\x1e\\xa5\\xc9\\xd9\\xde\\xc9\\xa1\\x8d\\xf0\\xff\\xe9' + +More condensed: + + >>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest() + 'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2' + +""" + +# This tuple and __get_builtin_constructor() must be modified if a new +# always available algorithm is added. +__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', + 'blake2b', 'blake2s', + 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', + 'shake_128', 'shake_256') + + +algorithms_guaranteed = set(__always_supported) +algorithms_available = set(__always_supported) + +__all__ = __always_supported + ('new', 'algorithms_guaranteed', + 'algorithms_available', 'pbkdf2_hmac') + + +__builtin_constructor_cache = {} + +def __get_builtin_constructor(name): + cache = __builtin_constructor_cache + constructor = cache.get(name) + if constructor is not None: + return constructor + try: + if name in ('SHA1', 'sha1'): + import _sha1 + cache['SHA1'] = cache['sha1'] = _sha1.sha1 + elif name in ('MD5', 'md5'): + import _md5 + cache['MD5'] = cache['md5'] = _md5.md5 + elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'): + import _sha256 + cache['SHA224'] = cache['sha224'] = _sha256.sha224 + cache['SHA256'] = cache['sha256'] = _sha256.sha256 + elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'): + import _sha512 + cache['SHA384'] = cache['sha384'] = _sha512.sha384 + cache['SHA512'] = cache['sha512'] = _sha512.sha512 + elif name in ('blake2b', 'blake2s'): + import _blake2 + cache['blake2b'] = _blake2.blake2b + cache['blake2s'] = _blake2.blake2s + elif name in {'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', + 'shake_128', 'shake_256'}: + import _sha3 + cache['sha3_224'] = _sha3.sha3_224 + cache['sha3_256'] = _sha3.sha3_256 + cache['sha3_384'] = _sha3.sha3_384 + cache['sha3_512'] = _sha3.sha3_512 + cache['shake_128'] = _sha3.shake_128 + cache['shake_256'] = _sha3.shake_256 + except ImportError: + pass # no extension module, this hash is unsupported. + + constructor = cache.get(name) + if constructor is not None: + return constructor + + raise ValueError('unsupported hash type ' + name) + + +def __get_openssl_constructor(name): + if name in {'blake2b', 'blake2s'}: + # Prefer our blake2 implementation. + return __get_builtin_constructor(name) + try: + f = getattr(_hashlib, 'openssl_' + name) + # Allow the C module to raise ValueError. The function will be + # defined but the hash not actually available thanks to OpenSSL. + f() + # Use the C function directly (very fast) + return f + except (AttributeError, ValueError): + return __get_builtin_constructor(name) + + +def __py_new(name, data=b'', **kwargs): + """new(name, data=b'', **kwargs) - Return a new hashing object using the + named algorithm; optionally initialized with data (which must be bytes). + """ + return __get_builtin_constructor(name)(data, **kwargs) + + +def __hash_new(name, data=b'', **kwargs): + """new(name, data=b'') - Return a new hashing object using the named algorithm; + optionally initialized with data (which must be bytes). + """ + if name in {'blake2b', 'blake2s'}: + # Prefer our blake2 implementation. + # OpenSSL 1.1.0 comes with a limited implementation of blake2b/s. + # It does neither support keyed blake2 nor advanced features like + # salt, personal, tree hashing or SSE. + return __get_builtin_constructor(name)(data, **kwargs) + try: + return _hashlib.new(name, data) + except ValueError: + # If the _hashlib module (OpenSSL) doesn't support the named + # hash, try using our builtin implementations. + # This allows for SHA224/256 and SHA384/512 support even though + # the OpenSSL library prior to 0.9.8 doesn't provide them. + return __get_builtin_constructor(name)(data) + + +try: + import _hashlib + new = __hash_new + __get_hash = __get_openssl_constructor + algorithms_available = algorithms_available.union( + _hashlib.openssl_md_meth_names) +except ImportError: + new = __py_new + __get_hash = __get_builtin_constructor + +try: + # OpenSSL's PKCS5_PBKDF2_HMAC requires OpenSSL 1.0+ with HMAC and SHA + from _hashlib import pbkdf2_hmac +except ImportError: + _trans_5C = bytes((x ^ 0x5C) for x in range(256)) + _trans_36 = bytes((x ^ 0x36) for x in range(256)) + + def pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None): + """Password based key derivation function 2 (PKCS #5 v2.0) + + This Python implementations based on the hmac module about as fast + as OpenSSL's PKCS5_PBKDF2_HMAC for short passwords and much faster + for long passwords. + """ + if not isinstance(hash_name, str): + raise TypeError(hash_name) + + if not isinstance(password, (bytes, bytearray)): + password = bytes(memoryview(password)) + if not isinstance(salt, (bytes, bytearray)): + salt = bytes(memoryview(salt)) + + # Fast inline HMAC implementation + inner = new(hash_name) + outer = new(hash_name) + blocksize = getattr(inner, 'block_size', 64) + if len(password) > blocksize: + password = new(hash_name, password).digest() + password = password + b'\x00' * (blocksize - len(password)) + inner.update(password.translate(_trans_36)) + outer.update(password.translate(_trans_5C)) + + def prf(msg, inner=inner, outer=outer): + # PBKDF2_HMAC uses the password as key. We can re-use the same + # digest objects and just update copies to skip initialization. + icpy = inner.copy() + ocpy = outer.copy() + icpy.update(msg) + ocpy.update(icpy.digest()) + return ocpy.digest() + + if iterations < 1: + raise ValueError(iterations) + if dklen is None: + dklen = outer.digest_size + if dklen < 1: + raise ValueError(dklen) + + dkey = b'' + loop = 1 + from_bytes = int.from_bytes + while len(dkey) < dklen: + prev = prf(salt + loop.to_bytes(4, 'big')) + # endianness doesn't matter here as long to / from use the same + rkey = int.from_bytes(prev, 'big') + for i in range(iterations - 1): + prev = prf(prev) + # rkey = rkey ^ prev + rkey ^= from_bytes(prev, 'big') + loop += 1 + dkey += rkey.to_bytes(inner.digest_size, 'big') + + return dkey[:dklen] + +try: + # OpenSSL's scrypt requires OpenSSL 1.1+ + from _hashlib import scrypt +except ImportError: + pass + + +for __func_name in __always_supported: + # try them all, some may not work due to the OpenSSL + # version not supporting that algorithm. + try: + globals()[__func_name] = __get_hash(__func_name) + except ValueError: + import logging + logging.exception('code for hash %s was not found.', __func_name) + + +# Cleanup locals() +del __always_supported, __func_name, __get_hash +del __py_new, __hash_new, __get_openssl_constructor diff --git a/venv/Lib/heapq.py b/venv/Lib/heapq.py new file mode 100644 index 00000000..b31f4186 --- /dev/null +++ b/venv/Lib/heapq.py @@ -0,0 +1,607 @@ +"""Heap queue algorithm (a.k.a. priority queue). + +Heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for +all k, counting elements from 0. For the sake of comparison, +non-existing elements are considered to be infinite. The interesting +property of a heap is that a[0] is always its smallest element. + +Usage: + +heap = [] # creates an empty heap +heappush(heap, item) # pushes a new item on the heap +item = heappop(heap) # pops the smallest item from the heap +item = heap[0] # smallest item on the heap without popping it +heapify(x) # transforms list into a heap, in-place, in linear time +item = heapreplace(heap, item) # pops and returns smallest item, and adds + # new item; the heap size is unchanged + +Our API differs from textbook heap algorithms as follows: + +- We use 0-based indexing. This makes the relationship between the + index for a node and the indexes for its children slightly less + obvious, but is more suitable since Python uses 0-based indexing. + +- Our heappop() method returns the smallest item, not the largest. + +These two make it possible to view the heap as a regular Python list +without surprises: heap[0] is the smallest item, and heap.sort() +maintains the heap invariant! +""" + +# Original code by Kevin O'Connor, augmented by Tim Peters and Raymond Hettinger + +__about__ = """Heap queues + +[explanation by François Pinard] + +Heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for +all k, counting elements from 0. For the sake of comparison, +non-existing elements are considered to be infinite. The interesting +property of a heap is that a[0] is always its smallest element. + +The strange invariant above is meant to be an efficient memory +representation for a tournament. The numbers below are `k', not a[k]: + + 0 + + 1 2 + + 3 4 5 6 + + 7 8 9 10 11 12 13 14 + + 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 + + +In the tree above, each cell `k' is topping `2*k+1' and `2*k+2'. In +a usual binary tournament we see in sports, each cell is the winner +over the two cells it tops, and we can trace the winner down the tree +to see all opponents s/he had. However, in many computer applications +of such tournaments, we do not need to trace the history of a winner. +To be more memory efficient, when a winner is promoted, we try to +replace it by something else at a lower level, and the rule becomes +that a cell and the two cells it tops contain three different items, +but the top cell "wins" over the two topped cells. + +If this heap invariant is protected at all time, index 0 is clearly +the overall winner. The simplest algorithmic way to remove it and +find the "next" winner is to move some loser (let's say cell 30 in the +diagram above) into the 0 position, and then percolate this new 0 down +the tree, exchanging values, until the invariant is re-established. +This is clearly logarithmic on the total number of items in the tree. +By iterating over all items, you get an O(n ln n) sort. + +A nice feature of this sort is that you can efficiently insert new +items while the sort is going on, provided that the inserted items are +not "better" than the last 0'th element you extracted. This is +especially useful in simulation contexts, where the tree holds all +incoming events, and the "win" condition means the smallest scheduled +time. When an event schedule other events for execution, they are +scheduled into the future, so they can easily go into the heap. So, a +heap is a good structure for implementing schedulers (this is what I +used for my MIDI sequencer :-). + +Various structures for implementing schedulers have been extensively +studied, and heaps are good for this, as they are reasonably speedy, +the speed is almost constant, and the worst case is not much different +than the average case. However, there are other representations which +are more efficient overall, yet the worst cases might be terrible. + +Heaps are also very useful in big disk sorts. You most probably all +know that a big sort implies producing "runs" (which are pre-sorted +sequences, which size is usually related to the amount of CPU memory), +followed by a merging passes for these runs, which merging is often +very cleverly organised[1]. It is very important that the initial +sort produces the longest runs possible. Tournaments are a good way +to that. If, using all the memory available to hold a tournament, you +replace and percolate items that happen to fit the current run, you'll +produce runs which are twice the size of the memory for random input, +and much better for input fuzzily ordered. + +Moreover, if you output the 0'th item on disk and get an input which +may not fit in the current tournament (because the value "wins" over +the last output value), it cannot fit in the heap, so the size of the +heap decreases. The freed memory could be cleverly reused immediately +for progressively building a second heap, which grows at exactly the +same rate the first heap is melting. When the first heap completely +vanishes, you switch heaps and start a new run. Clever and quite +effective! + +In a word, heaps are useful memory structures to know. I use them in +a few applications, and I think it is good to keep a `heap' module +around. :-) + +-------------------- +[1] The disk balancing algorithms which are current, nowadays, are +more annoying than clever, and this is a consequence of the seeking +capabilities of the disks. On devices which cannot seek, like big +tape drives, the story was quite different, and one had to be very +clever to ensure (far in advance) that each tape movement will be the +most effective possible (that is, will best participate at +"progressing" the merge). Some tapes were even able to read +backwards, and this was also used to avoid the rewinding time. +Believe me, real good tape sorts were quite spectacular to watch! +From all times, sorting has always been a Great Art! :-) +""" + +__all__ = ['heappush', 'heappop', 'heapify', 'heapreplace', 'merge', + 'nlargest', 'nsmallest', 'heappushpop'] + +def heappush(heap, item): + """Push item onto heap, maintaining the heap invariant.""" + heap.append(item) + _siftdown(heap, 0, len(heap)-1) + +def heappop(heap): + """Pop the smallest item off the heap, maintaining the heap invariant.""" + lastelt = heap.pop() # raises appropriate IndexError if heap is empty + if heap: + returnitem = heap[0] + heap[0] = lastelt + _siftup(heap, 0) + return returnitem + return lastelt + +def heapreplace(heap, item): + """Pop and return the current smallest value, and add the new item. + + This is more efficient than heappop() followed by heappush(), and can be + more appropriate when using a fixed-size heap. Note that the value + returned may be larger than item! That constrains reasonable uses of + this routine unless written as part of a conditional replacement: + + if item > heap[0]: + item = heapreplace(heap, item) + """ + returnitem = heap[0] # raises appropriate IndexError if heap is empty + heap[0] = item + _siftup(heap, 0) + return returnitem + +def heappushpop(heap, item): + """Fast version of a heappush followed by a heappop.""" + if heap and heap[0] < item: + item, heap[0] = heap[0], item + _siftup(heap, 0) + return item + +def heapify(x): + """Transform list into a heap, in-place, in O(len(x)) time.""" + n = len(x) + # Transform bottom-up. The largest index there's any point to looking at + # is the largest with a child index in-range, so must have 2*i + 1 < n, + # or i < (n-1)/2. If n is even = 2*j, this is (2*j-1)/2 = j-1/2 so + # j-1 is the largest, which is n//2 - 1. If n is odd = 2*j+1, this is + # (2*j+1-1)/2 = j so j-1 is the largest, and that's again n//2-1. + for i in reversed(range(n//2)): + _siftup(x, i) + +def _heappop_max(heap): + """Maxheap version of a heappop.""" + lastelt = heap.pop() # raises appropriate IndexError if heap is empty + if heap: + returnitem = heap[0] + heap[0] = lastelt + _siftup_max(heap, 0) + return returnitem + return lastelt + +def _heapreplace_max(heap, item): + """Maxheap version of a heappop followed by a heappush.""" + returnitem = heap[0] # raises appropriate IndexError if heap is empty + heap[0] = item + _siftup_max(heap, 0) + return returnitem + +def _heapify_max(x): + """Transform list into a maxheap, in-place, in O(len(x)) time.""" + n = len(x) + for i in reversed(range(n//2)): + _siftup_max(x, i) + +# 'heap' is a heap at all indices >= startpos, except possibly for pos. pos +# is the index of a leaf with a possibly out-of-order value. Restore the +# heap invariant. +def _siftdown(heap, startpos, pos): + newitem = heap[pos] + # Follow the path to the root, moving parents down until finding a place + # newitem fits. + while pos > startpos: + parentpos = (pos - 1) >> 1 + parent = heap[parentpos] + if newitem < parent: + heap[pos] = parent + pos = parentpos + continue + break + heap[pos] = newitem + +# The child indices of heap index pos are already heaps, and we want to make +# a heap at index pos too. We do this by bubbling the smaller child of +# pos up (and so on with that child's children, etc) until hitting a leaf, +# then using _siftdown to move the oddball originally at index pos into place. +# +# We *could* break out of the loop as soon as we find a pos where newitem <= +# both its children, but turns out that's not a good idea, and despite that +# many books write the algorithm that way. During a heap pop, the last array +# element is sifted in, and that tends to be large, so that comparing it +# against values starting from the root usually doesn't pay (= usually doesn't +# get us out of the loop early). See Knuth, Volume 3, where this is +# explained and quantified in an exercise. +# +# Cutting the # of comparisons is important, since these routines have no +# way to extract "the priority" from an array element, so that intelligence +# is likely to be hiding in custom comparison methods, or in array elements +# storing (priority, record) tuples. Comparisons are thus potentially +# expensive. +# +# On random arrays of length 1000, making this change cut the number of +# comparisons made by heapify() a little, and those made by exhaustive +# heappop() a lot, in accord with theory. Here are typical results from 3 +# runs (3 just to demonstrate how small the variance is): +# +# Compares needed by heapify Compares needed by 1000 heappops +# -------------------------- -------------------------------- +# 1837 cut to 1663 14996 cut to 8680 +# 1855 cut to 1659 14966 cut to 8678 +# 1847 cut to 1660 15024 cut to 8703 +# +# Building the heap by using heappush() 1000 times instead required +# 2198, 2148, and 2219 compares: heapify() is more efficient, when +# you can use it. +# +# The total compares needed by list.sort() on the same lists were 8627, +# 8627, and 8632 (this should be compared to the sum of heapify() and +# heappop() compares): list.sort() is (unsurprisingly!) more efficient +# for sorting. + +def _siftup(heap, pos): + endpos = len(heap) + startpos = pos + newitem = heap[pos] + # Bubble up the smaller child until hitting a leaf. + childpos = 2*pos + 1 # leftmost child position + while childpos < endpos: + # Set childpos to index of smaller child. + rightpos = childpos + 1 + if rightpos < endpos and not heap[childpos] < heap[rightpos]: + childpos = rightpos + # Move the smaller child up. + heap[pos] = heap[childpos] + pos = childpos + childpos = 2*pos + 1 + # The leaf at pos is empty now. Put newitem there, and bubble it up + # to its final resting place (by sifting its parents down). + heap[pos] = newitem + _siftdown(heap, startpos, pos) + +def _siftdown_max(heap, startpos, pos): + 'Maxheap variant of _siftdown' + newitem = heap[pos] + # Follow the path to the root, moving parents down until finding a place + # newitem fits. + while pos > startpos: + parentpos = (pos - 1) >> 1 + parent = heap[parentpos] + if parent < newitem: + heap[pos] = parent + pos = parentpos + continue + break + heap[pos] = newitem + +def _siftup_max(heap, pos): + 'Maxheap variant of _siftup' + endpos = len(heap) + startpos = pos + newitem = heap[pos] + # Bubble up the larger child until hitting a leaf. + childpos = 2*pos + 1 # leftmost child position + while childpos < endpos: + # Set childpos to index of larger child. + rightpos = childpos + 1 + if rightpos < endpos and not heap[rightpos] < heap[childpos]: + childpos = rightpos + # Move the larger child up. + heap[pos] = heap[childpos] + pos = childpos + childpos = 2*pos + 1 + # The leaf at pos is empty now. Put newitem there, and bubble it up + # to its final resting place (by sifting its parents down). + heap[pos] = newitem + _siftdown_max(heap, startpos, pos) + +def merge(*iterables, key=None, reverse=False): + '''Merge multiple sorted inputs into a single sorted output. + + Similar to sorted(itertools.chain(*iterables)) but returns a generator, + does not pull the data into memory all at once, and assumes that each of + the input streams is already sorted (smallest to largest). + + >>> list(merge([1,3,5,7], [0,2,4,8], [5,10,15,20], [], [25])) + [0, 1, 2, 3, 4, 5, 5, 7, 8, 10, 15, 20, 25] + + If *key* is not None, applies a key function to each element to determine + its sort order. + + >>> list(merge(['dog', 'horse'], ['cat', 'fish', 'kangaroo'], key=len)) + ['dog', 'cat', 'fish', 'horse', 'kangaroo'] + + ''' + + h = [] + h_append = h.append + + if reverse: + _heapify = _heapify_max + _heappop = _heappop_max + _heapreplace = _heapreplace_max + direction = -1 + else: + _heapify = heapify + _heappop = heappop + _heapreplace = heapreplace + direction = 1 + + if key is None: + for order, it in enumerate(map(iter, iterables)): + try: + next = it.__next__ + h_append([next(), order * direction, next]) + except StopIteration: + pass + _heapify(h) + while len(h) > 1: + try: + while True: + value, order, next = s = h[0] + yield value + s[0] = next() # raises StopIteration when exhausted + _heapreplace(h, s) # restore heap condition + except StopIteration: + _heappop(h) # remove empty iterator + if h: + # fast case when only a single iterator remains + value, order, next = h[0] + yield value + yield from next.__self__ + return + + for order, it in enumerate(map(iter, iterables)): + try: + next = it.__next__ + value = next() + h_append([key(value), order * direction, value, next]) + except StopIteration: + pass + _heapify(h) + while len(h) > 1: + try: + while True: + key_value, order, value, next = s = h[0] + yield value + value = next() + s[0] = key(value) + s[2] = value + _heapreplace(h, s) + except StopIteration: + _heappop(h) + if h: + key_value, order, value, next = h[0] + yield value + yield from next.__self__ + + +# Algorithm notes for nlargest() and nsmallest() +# ============================================== +# +# Make a single pass over the data while keeping the k most extreme values +# in a heap. Memory consumption is limited to keeping k values in a list. +# +# Measured performance for random inputs: +# +# number of comparisons +# n inputs k-extreme values (average of 5 trials) % more than min() +# ------------- ---------------- --------------------- ----------------- +# 1,000 100 3,317 231.7% +# 10,000 100 14,046 40.5% +# 100,000 100 105,749 5.7% +# 1,000,000 100 1,007,751 0.8% +# 10,000,000 100 10,009,401 0.1% +# +# Theoretical number of comparisons for k smallest of n random inputs: +# +# Step Comparisons Action +# ---- -------------------------- --------------------------- +# 1 1.66 * k heapify the first k-inputs +# 2 n - k compare remaining elements to top of heap +# 3 k * (1 + lg2(k)) * ln(n/k) replace the topmost value on the heap +# 4 k * lg2(k) - (k/2) final sort of the k most extreme values +# +# Combining and simplifying for a rough estimate gives: +# +# comparisons = n + k * (log(k, 2) * log(n/k) + log(k, 2) + log(n/k)) +# +# Computing the number of comparisons for step 3: +# ----------------------------------------------- +# * For the i-th new value from the iterable, the probability of being in the +# k most extreme values is k/i. For example, the probability of the 101st +# value seen being in the 100 most extreme values is 100/101. +# * If the value is a new extreme value, the cost of inserting it into the +# heap is 1 + log(k, 2). +# * The probability times the cost gives: +# (k/i) * (1 + log(k, 2)) +# * Summing across the remaining n-k elements gives: +# sum((k/i) * (1 + log(k, 2)) for i in range(k+1, n+1)) +# * This reduces to: +# (H(n) - H(k)) * k * (1 + log(k, 2)) +# * Where H(n) is the n-th harmonic number estimated by: +# gamma = 0.5772156649 +# H(n) = log(n, e) + gamma + 1 / (2 * n) +# http://en.wikipedia.org/wiki/Harmonic_series_(mathematics)#Rate_of_divergence +# * Substituting the H(n) formula: +# comparisons = k * (1 + log(k, 2)) * (log(n/k, e) + (1/n - 1/k) / 2) +# +# Worst-case for step 3: +# ---------------------- +# In the worst case, the input data is reversed sorted so that every new element +# must be inserted in the heap: +# +# comparisons = 1.66 * k + log(k, 2) * (n - k) +# +# Alternative Algorithms +# ---------------------- +# Other algorithms were not used because they: +# 1) Took much more auxiliary memory, +# 2) Made multiple passes over the data. +# 3) Made more comparisons in common cases (small k, large n, semi-random input). +# See the more detailed comparison of approach at: +# http://code.activestate.com/recipes/577573-compare-algorithms-for-heapqsmallest + +def nsmallest(n, iterable, key=None): + """Find the n smallest elements in a dataset. + + Equivalent to: sorted(iterable, key=key)[:n] + """ + + # Short-cut for n==1 is to use min() + if n == 1: + it = iter(iterable) + sentinel = object() + if key is None: + result = min(it, default=sentinel) + else: + result = min(it, default=sentinel, key=key) + return [] if result is sentinel else [result] + + # When n>=size, it's faster to use sorted() + try: + size = len(iterable) + except (TypeError, AttributeError): + pass + else: + if n >= size: + return sorted(iterable, key=key)[:n] + + # When key is none, use simpler decoration + if key is None: + it = iter(iterable) + # put the range(n) first so that zip() doesn't + # consume one too many elements from the iterator + result = [(elem, i) for i, elem in zip(range(n), it)] + if not result: + return result + _heapify_max(result) + top = result[0][0] + order = n + _heapreplace = _heapreplace_max + for elem in it: + if elem < top: + _heapreplace(result, (elem, order)) + top, _order = result[0] + order += 1 + result.sort() + return [elem for (elem, order) in result] + + # General case, slowest method + it = iter(iterable) + result = [(key(elem), i, elem) for i, elem in zip(range(n), it)] + if not result: + return result + _heapify_max(result) + top = result[0][0] + order = n + _heapreplace = _heapreplace_max + for elem in it: + k = key(elem) + if k < top: + _heapreplace(result, (k, order, elem)) + top, _order, _elem = result[0] + order += 1 + result.sort() + return [elem for (k, order, elem) in result] + +def nlargest(n, iterable, key=None): + """Find the n largest elements in a dataset. + + Equivalent to: sorted(iterable, key=key, reverse=True)[:n] + """ + + # Short-cut for n==1 is to use max() + if n == 1: + it = iter(iterable) + sentinel = object() + if key is None: + result = max(it, default=sentinel) + else: + result = max(it, default=sentinel, key=key) + return [] if result is sentinel else [result] + + # When n>=size, it's faster to use sorted() + try: + size = len(iterable) + except (TypeError, AttributeError): + pass + else: + if n >= size: + return sorted(iterable, key=key, reverse=True)[:n] + + # When key is none, use simpler decoration + if key is None: + it = iter(iterable) + result = [(elem, i) for i, elem in zip(range(0, -n, -1), it)] + if not result: + return result + heapify(result) + top = result[0][0] + order = -n + _heapreplace = heapreplace + for elem in it: + if top < elem: + _heapreplace(result, (elem, order)) + top, _order = result[0] + order -= 1 + result.sort(reverse=True) + return [elem for (elem, order) in result] + + # General case, slowest method + it = iter(iterable) + result = [(key(elem), i, elem) for i, elem in zip(range(0, -n, -1), it)] + if not result: + return result + heapify(result) + top = result[0][0] + order = -n + _heapreplace = heapreplace + for elem in it: + k = key(elem) + if top < k: + _heapreplace(result, (k, order, elem)) + top, _order, _elem = result[0] + order -= 1 + result.sort(reverse=True) + return [elem for (k, order, elem) in result] + +# If available, use C implementation +try: + from _heapq import * +except ImportError: + pass +try: + from _heapq import _heapreplace_max +except ImportError: + pass +try: + from _heapq import _heapify_max +except ImportError: + pass +try: + from _heapq import _heappop_max +except ImportError: + pass + + +if __name__ == "__main__": + + import doctest + print(doctest.testmod()) diff --git a/venv/Lib/hmac.py b/venv/Lib/hmac.py new file mode 100644 index 00000000..43b72129 --- /dev/null +++ b/venv/Lib/hmac.py @@ -0,0 +1,188 @@ +"""HMAC (Keyed-Hashing for Message Authentication) Python module. + +Implements the HMAC algorithm as described by RFC 2104. +""" + +import warnings as _warnings +from _operator import _compare_digest as compare_digest +try: + import _hashlib as _hashopenssl +except ImportError: + _hashopenssl = None + _openssl_md_meths = None +else: + _openssl_md_meths = frozenset(_hashopenssl.openssl_md_meth_names) +import hashlib as _hashlib + +trans_5C = bytes((x ^ 0x5C) for x in range(256)) +trans_36 = bytes((x ^ 0x36) for x in range(256)) + +# The size of the digests returned by HMAC depends on the underlying +# hashing module used. Use digest_size from the instance of HMAC instead. +digest_size = None + + + +class HMAC: + """RFC 2104 HMAC class. Also complies with RFC 4231. + + This supports the API for Cryptographic Hash Functions (PEP 247). + """ + blocksize = 64 # 512-bit HMAC; can be changed in subclasses. + + def __init__(self, key, msg = None, digestmod = None): + """Create a new HMAC object. + + key: key for the keyed hash object. + msg: Initial input for the hash, if provided. + digestmod: A module supporting PEP 247. *OR* + A hashlib constructor returning a new hash object. *OR* + A hash name suitable for hashlib.new(). + Defaults to hashlib.md5. + Implicit default to hashlib.md5 is deprecated since Python + 3.4 and will be removed in Python 3.8. + + Note: key and msg must be a bytes or bytearray objects. + """ + + if not isinstance(key, (bytes, bytearray)): + raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__) + + if digestmod is None: + _warnings.warn("HMAC() without an explicit digestmod argument " + "is deprecated since Python 3.4, and will be removed " + "in 3.8", + DeprecationWarning, 2) + digestmod = _hashlib.md5 + + if callable(digestmod): + self.digest_cons = digestmod + elif isinstance(digestmod, str): + self.digest_cons = lambda d=b'': _hashlib.new(digestmod, d) + else: + self.digest_cons = lambda d=b'': digestmod.new(d) + + self.outer = self.digest_cons() + self.inner = self.digest_cons() + self.digest_size = self.inner.digest_size + + if hasattr(self.inner, 'block_size'): + blocksize = self.inner.block_size + if blocksize < 16: + _warnings.warn('block_size of %d seems too small; using our ' + 'default of %d.' % (blocksize, self.blocksize), + RuntimeWarning, 2) + blocksize = self.blocksize + else: + _warnings.warn('No block_size attribute on given digest object; ' + 'Assuming %d.' % (self.blocksize), + RuntimeWarning, 2) + blocksize = self.blocksize + + # self.blocksize is the default blocksize. self.block_size is + # effective block size as well as the public API attribute. + self.block_size = blocksize + + if len(key) > blocksize: + key = self.digest_cons(key).digest() + + key = key.ljust(blocksize, b'\0') + self.outer.update(key.translate(trans_5C)) + self.inner.update(key.translate(trans_36)) + if msg is not None: + self.update(msg) + + @property + def name(self): + return "hmac-" + self.inner.name + + def update(self, msg): + """Update this hashing object with the string msg. + """ + self.inner.update(msg) + + def copy(self): + """Return a separate copy of this hashing object. + + An update to this copy won't affect the original object. + """ + # Call __new__ directly to avoid the expensive __init__. + other = self.__class__.__new__(self.__class__) + other.digest_cons = self.digest_cons + other.digest_size = self.digest_size + other.inner = self.inner.copy() + other.outer = self.outer.copy() + return other + + def _current(self): + """Return a hash object for the current state. + + To be used only internally with digest() and hexdigest(). + """ + h = self.outer.copy() + h.update(self.inner.digest()) + return h + + def digest(self): + """Return the hash value of this hashing object. + + This returns a string containing 8-bit data. The object is + not altered in any way by this function; you can continue + updating the object after calling this function. + """ + h = self._current() + return h.digest() + + def hexdigest(self): + """Like digest(), but returns a string of hexadecimal digits instead. + """ + h = self._current() + return h.hexdigest() + +def new(key, msg = None, digestmod = None): + """Create a new hashing object and return it. + + key: The starting key for the hash. + msg: if available, will immediately be hashed into the object's starting + state. + + You can now feed arbitrary strings into the object using its update() + method, and can ask for the hash value at any time by calling its digest() + method. + """ + return HMAC(key, msg, digestmod) + + +def digest(key, msg, digest): + """Fast inline implementation of HMAC + + key: key for the keyed hash object. + msg: input message + digest: A hash name suitable for hashlib.new() for best performance. *OR* + A hashlib constructor returning a new hash object. *OR* + A module supporting PEP 247. + + Note: key and msg must be a bytes or bytearray objects. + """ + if (_hashopenssl is not None and + isinstance(digest, str) and digest in _openssl_md_meths): + return _hashopenssl.hmac_digest(key, msg, digest) + + if callable(digest): + digest_cons = digest + elif isinstance(digest, str): + digest_cons = lambda d=b'': _hashlib.new(digest, d) + else: + digest_cons = lambda d=b'': digest.new(d) + + inner = digest_cons() + outer = digest_cons() + blocksize = getattr(inner, 'block_size', 64) + if len(key) > blocksize: + key = digest_cons(key).digest() + key = key + b'\x00' * (blocksize - len(key)) + inner.update(key.translate(trans_36)) + outer.update(key.translate(trans_5C)) + inner.update(msg) + outer.update(inner.digest()) + return outer.digest() diff --git a/venv/Lib/imp.py b/venv/Lib/imp.py new file mode 100644 index 00000000..866464b2 --- /dev/null +++ b/venv/Lib/imp.py @@ -0,0 +1,346 @@ +"""This module provides the components needed to build your own __import__ +function. Undocumented functions are obsolete. + +In most cases it is preferred you consider using the importlib module's +functionality over this module. + +""" +# (Probably) need to stay in _imp +from _imp import (lock_held, acquire_lock, release_lock, + get_frozen_object, is_frozen_package, + init_frozen, is_builtin, is_frozen, + _fix_co_filename) +try: + from _imp import create_dynamic +except ImportError: + # Platform doesn't support dynamic loading. + create_dynamic = None + +from importlib._bootstrap import _ERR_MSG, _exec, _load, _builtin_from_name +from importlib._bootstrap_external import SourcelessFileLoader + +from importlib import machinery +from importlib import util +import importlib +import os +import sys +import tokenize +import types +import warnings + +warnings.warn("the imp module is deprecated in favour of importlib; " + "see the module's documentation for alternative uses", + DeprecationWarning, stacklevel=2) + +# DEPRECATED +SEARCH_ERROR = 0 +PY_SOURCE = 1 +PY_COMPILED = 2 +C_EXTENSION = 3 +PY_RESOURCE = 4 +PKG_DIRECTORY = 5 +C_BUILTIN = 6 +PY_FROZEN = 7 +PY_CODERESOURCE = 8 +IMP_HOOK = 9 + + +def new_module(name): + """**DEPRECATED** + + Create a new module. + + The module is not entered into sys.modules. + + """ + return types.ModuleType(name) + + +def get_magic(): + """**DEPRECATED** + + Return the magic number for .pyc files. + """ + return util.MAGIC_NUMBER + + +def get_tag(): + """Return the magic tag for .pyc files.""" + return sys.implementation.cache_tag + + +def cache_from_source(path, debug_override=None): + """**DEPRECATED** + + Given the path to a .py file, return the path to its .pyc file. + + The .py file does not need to exist; this simply returns the path to the + .pyc file calculated as if the .py file were imported. + + If debug_override is not None, then it must be a boolean and is used in + place of sys.flags.optimize. + + If sys.implementation.cache_tag is None then NotImplementedError is raised. + + """ + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + return util.cache_from_source(path, debug_override) + + +def source_from_cache(path): + """**DEPRECATED** + + Given the path to a .pyc. file, return the path to its .py file. + + The .pyc file does not need to exist; this simply returns the path to + the .py file calculated to correspond to the .pyc file. If path does + not conform to PEP 3147 format, ValueError will be raised. If + sys.implementation.cache_tag is None then NotImplementedError is raised. + + """ + return util.source_from_cache(path) + + +def get_suffixes(): + """**DEPRECATED**""" + extensions = [(s, 'rb', C_EXTENSION) for s in machinery.EXTENSION_SUFFIXES] + source = [(s, 'r', PY_SOURCE) for s in machinery.SOURCE_SUFFIXES] + bytecode = [(s, 'rb', PY_COMPILED) for s in machinery.BYTECODE_SUFFIXES] + + return extensions + source + bytecode + + +class NullImporter: + + """**DEPRECATED** + + Null import object. + + """ + + def __init__(self, path): + if path == '': + raise ImportError('empty pathname', path='') + elif os.path.isdir(path): + raise ImportError('existing directory', path=path) + + def find_module(self, fullname): + """Always returns None.""" + return None + + +class _HackedGetData: + + """Compatibility support for 'file' arguments of various load_*() + functions.""" + + def __init__(self, fullname, path, file=None): + super().__init__(fullname, path) + self.file = file + + def get_data(self, path): + """Gross hack to contort loader to deal w/ load_*()'s bad API.""" + if self.file and path == self.path: + if not self.file.closed: + file = self.file + else: + self.file = file = open(self.path, 'r') + + with file: + # Technically should be returning bytes, but + # SourceLoader.get_code() just passed what is returned to + # compile() which can handle str. And converting to bytes would + # require figuring out the encoding to decode to and + # tokenize.detect_encoding() only accepts bytes. + return file.read() + else: + return super().get_data(path) + + +class _LoadSourceCompatibility(_HackedGetData, machinery.SourceFileLoader): + + """Compatibility support for implementing load_source().""" + + +def load_source(name, pathname, file=None): + loader = _LoadSourceCompatibility(name, pathname, file) + spec = util.spec_from_file_location(name, pathname, loader=loader) + if name in sys.modules: + module = _exec(spec, sys.modules[name]) + else: + module = _load(spec) + # To allow reloading to potentially work, use a non-hacked loader which + # won't rely on a now-closed file object. + module.__loader__ = machinery.SourceFileLoader(name, pathname) + module.__spec__.loader = module.__loader__ + return module + + +class _LoadCompiledCompatibility(_HackedGetData, SourcelessFileLoader): + + """Compatibility support for implementing load_compiled().""" + + +def load_compiled(name, pathname, file=None): + """**DEPRECATED**""" + loader = _LoadCompiledCompatibility(name, pathname, file) + spec = util.spec_from_file_location(name, pathname, loader=loader) + if name in sys.modules: + module = _exec(spec, sys.modules[name]) + else: + module = _load(spec) + # To allow reloading to potentially work, use a non-hacked loader which + # won't rely on a now-closed file object. + module.__loader__ = SourcelessFileLoader(name, pathname) + module.__spec__.loader = module.__loader__ + return module + + +def load_package(name, path): + """**DEPRECATED**""" + if os.path.isdir(path): + extensions = (machinery.SOURCE_SUFFIXES[:] + + machinery.BYTECODE_SUFFIXES[:]) + for extension in extensions: + init_path = os.path.join(path, '__init__' + extension) + if os.path.exists(init_path): + path = init_path + break + else: + raise ValueError('{!r} is not a package'.format(path)) + spec = util.spec_from_file_location(name, path, + submodule_search_locations=[]) + if name in sys.modules: + return _exec(spec, sys.modules[name]) + else: + return _load(spec) + + +def load_module(name, file, filename, details): + """**DEPRECATED** + + Load a module, given information returned by find_module(). + + The module name must include the full package name, if any. + + """ + suffix, mode, type_ = details + if mode and (not mode.startswith(('r', 'U')) or '+' in mode): + raise ValueError('invalid file open mode {!r}'.format(mode)) + elif file is None and type_ in {PY_SOURCE, PY_COMPILED}: + msg = 'file object required for import (type code {})'.format(type_) + raise ValueError(msg) + elif type_ == PY_SOURCE: + return load_source(name, filename, file) + elif type_ == PY_COMPILED: + return load_compiled(name, filename, file) + elif type_ == C_EXTENSION and load_dynamic is not None: + if file is None: + with open(filename, 'rb') as opened_file: + return load_dynamic(name, filename, opened_file) + else: + return load_dynamic(name, filename, file) + elif type_ == PKG_DIRECTORY: + return load_package(name, filename) + elif type_ == C_BUILTIN: + return init_builtin(name) + elif type_ == PY_FROZEN: + return init_frozen(name) + else: + msg = "Don't know how to import {} (type code {})".format(name, type_) + raise ImportError(msg, name=name) + + +def find_module(name, path=None): + """**DEPRECATED** + + Search for a module. + + If path is omitted or None, search for a built-in, frozen or special + module and continue search in sys.path. The module name cannot + contain '.'; to search for a submodule of a package, pass the + submodule name and the package's __path__. + + """ + if not isinstance(name, str): + raise TypeError("'name' must be a str, not {}".format(type(name))) + elif not isinstance(path, (type(None), list)): + # Backwards-compatibility + raise RuntimeError("'path' must be None or a list, " + "not {}".format(type(path))) + + if path is None: + if is_builtin(name): + return None, None, ('', '', C_BUILTIN) + elif is_frozen(name): + return None, None, ('', '', PY_FROZEN) + else: + path = sys.path + + for entry in path: + package_directory = os.path.join(entry, name) + for suffix in ['.py', machinery.BYTECODE_SUFFIXES[0]]: + package_file_name = '__init__' + suffix + file_path = os.path.join(package_directory, package_file_name) + if os.path.isfile(file_path): + return None, package_directory, ('', '', PKG_DIRECTORY) + for suffix, mode, type_ in get_suffixes(): + file_name = name + suffix + file_path = os.path.join(entry, file_name) + if os.path.isfile(file_path): + break + else: + continue + break # Break out of outer loop when breaking out of inner loop. + else: + raise ImportError(_ERR_MSG.format(name), name=name) + + encoding = None + if 'b' not in mode: + with open(file_path, 'rb') as file: + encoding = tokenize.detect_encoding(file.readline)[0] + file = open(file_path, mode, encoding=encoding) + return file, file_path, (suffix, mode, type_) + + +def reload(module): + """**DEPRECATED** + + Reload the module and return it. + + The module must have been successfully imported before. + + """ + return importlib.reload(module) + + +def init_builtin(name): + """**DEPRECATED** + + Load and return a built-in module by name, or None is such module doesn't + exist + """ + try: + return _builtin_from_name(name) + except ImportError: + return None + + +if create_dynamic: + def load_dynamic(name, path, file=None): + """**DEPRECATED** + + Load an extension module. + """ + import importlib.machinery + loader = importlib.machinery.ExtensionFileLoader(name, path) + + # Issue #24748: Skip the sys.modules check in _load_module_shim; + # always load new extension + spec = importlib.machinery.ModuleSpec( + name=name, loader=loader, origin=path) + return _load(spec) + +else: + load_dynamic = None diff --git a/venv/Lib/importlib/__init__.py b/venv/Lib/importlib/__init__.py new file mode 100644 index 00000000..cb37d246 --- /dev/null +++ b/venv/Lib/importlib/__init__.py @@ -0,0 +1,176 @@ +"""A pure Python implementation of import.""" +__all__ = ['__import__', 'import_module', 'invalidate_caches', 'reload'] + +# Bootstrap help ##################################################### + +# Until bootstrapping is complete, DO NOT import any modules that attempt +# to import importlib._bootstrap (directly or indirectly). Since this +# partially initialised package would be present in sys.modules, those +# modules would get an uninitialised copy of the source version, instead +# of a fully initialised version (either the frozen one or the one +# initialised below if the frozen one is not available). +import _imp # Just the builtin component, NOT the full Python module +import sys + +try: + import _frozen_importlib as _bootstrap +except ImportError: + from . import _bootstrap + _bootstrap._setup(sys, _imp) +else: + # importlib._bootstrap is the built-in import, ensure we don't create + # a second copy of the module. + _bootstrap.__name__ = 'importlib._bootstrap' + _bootstrap.__package__ = 'importlib' + try: + _bootstrap.__file__ = __file__.replace('__init__.py', '_bootstrap.py') + except NameError: + # __file__ is not guaranteed to be defined, e.g. if this code gets + # frozen by a tool like cx_Freeze. + pass + sys.modules['importlib._bootstrap'] = _bootstrap + +try: + import _frozen_importlib_external as _bootstrap_external +except ImportError: + from . import _bootstrap_external + _bootstrap_external._setup(_bootstrap) + _bootstrap._bootstrap_external = _bootstrap_external +else: + _bootstrap_external.__name__ = 'importlib._bootstrap_external' + _bootstrap_external.__package__ = 'importlib' + try: + _bootstrap_external.__file__ = __file__.replace('__init__.py', '_bootstrap_external.py') + except NameError: + # __file__ is not guaranteed to be defined, e.g. if this code gets + # frozen by a tool like cx_Freeze. + pass + sys.modules['importlib._bootstrap_external'] = _bootstrap_external + +# To simplify imports in test code +_w_long = _bootstrap_external._w_long +_r_long = _bootstrap_external._r_long + +# Fully bootstrapped at this point, import whatever you like, circular +# dependencies and startup overhead minimisation permitting :) + +import types +import warnings + + +# Public API ######################################################### + +from ._bootstrap import __import__ + + +def invalidate_caches(): + """Call the invalidate_caches() method on all meta path finders stored in + sys.meta_path (where implemented).""" + for finder in sys.meta_path: + if hasattr(finder, 'invalidate_caches'): + finder.invalidate_caches() + + +def find_loader(name, path=None): + """Return the loader for the specified module. + + This is a backward-compatible wrapper around find_spec(). + + This function is deprecated in favor of importlib.util.find_spec(). + + """ + warnings.warn('Deprecated since Python 3.4. ' + 'Use importlib.util.find_spec() instead.', + DeprecationWarning, stacklevel=2) + try: + loader = sys.modules[name].__loader__ + if loader is None: + raise ValueError('{}.__loader__ is None'.format(name)) + else: + return loader + except KeyError: + pass + except AttributeError: + raise ValueError('{}.__loader__ is not set'.format(name)) from None + + spec = _bootstrap._find_spec(name, path) + # We won't worry about malformed specs (missing attributes). + if spec is None: + return None + if spec.loader is None: + if spec.submodule_search_locations is None: + raise ImportError('spec for {} missing loader'.format(name), + name=name) + raise ImportError('namespace packages do not have loaders', + name=name) + return spec.loader + + +def import_module(name, package=None): + """Import a module. + + The 'package' argument is required when performing a relative import. It + specifies the package to use as the anchor point from which to resolve the + relative import to an absolute import. + + """ + level = 0 + if name.startswith('.'): + if not package: + msg = ("the 'package' argument is required to perform a relative " + "import for {!r}") + raise TypeError(msg.format(name)) + for character in name: + if character != '.': + break + level += 1 + return _bootstrap._gcd_import(name[level:], package, level) + + +_RELOADING = {} + + +def reload(module): + """Reload the module and return it. + + The module must have been successfully imported before. + + """ + if not module or not isinstance(module, types.ModuleType): + raise TypeError("reload() argument must be a module") + try: + name = module.__spec__.name + except AttributeError: + name = module.__name__ + + if sys.modules.get(name) is not module: + msg = "module {} not in sys.modules" + raise ImportError(msg.format(name), name=name) + if name in _RELOADING: + return _RELOADING[name] + _RELOADING[name] = module + try: + parent_name = name.rpartition('.')[0] + if parent_name: + try: + parent = sys.modules[parent_name] + except KeyError: + msg = "parent {!r} not in sys.modules" + raise ImportError(msg.format(parent_name), + name=parent_name) from None + else: + pkgpath = parent.__path__ + else: + pkgpath = None + target = module + spec = module.__spec__ = _bootstrap._find_spec(name, pkgpath, target) + if spec is None: + raise ModuleNotFoundError(f"spec not found for the module {name!r}", name=name) + _bootstrap._exec(spec, module) + # The module may have replaced itself in sys.modules! + return sys.modules[name] + finally: + try: + del _RELOADING[name] + except KeyError: + pass diff --git a/venv/Lib/importlib/__pycache__/__init__.cpython-37.pyc b/venv/Lib/importlib/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fe54db334b3c0bbf9652c282681eac33aff368c GIT binary patch literal 3772 zcmai0&yU;26`mm}O5$o|?az2OiOc+GY^AYa*hSJ7ZV@}{wr=c=VY{`fZb5K0vl4eD zQ67$LuS{L+prYVd%rHKms#QWRJ(z(7Ye`snEPFX-$uIuzYX{; z9dVLixdA&@;kzyy#&_cd->2ZaVSKOWzJJG+_bu-Y)RzM})S-^hjrT|sE8WVxAjria$QBD}5Q}kNW=qlVVc3sEsAbRz zJ3X0Xu9E#Y6wm2^x1ZxsS(C%WZXD}Gt8g?~%}w;9-PVaVtIoBP1^63AItW^$!^z^w z7<6H3*KD6}vEQyw znYL2o<}*uGQZ}=XF!({`9upQ~X-@{9h5f#-d(wX;Am^I?KqA7zM^tGPdZ9lGb!jcxn6Y&Xv(}xN6q`tRH4DC(hu|8<9Wh)YUQZb-fSUdDL=BNb_$+>hp&Zmho$y@&Gh~XY0*f3 z)^$E0D8X{Nem)^=6$L@#_Oi{VN0R8~Pyhp>=j4oTVa@kT*z_wrAQs!~?Y z4<;d+J6>(({VME_Z1rWt*5bCV*xjf7@^((+wv^&=M2vsIKUN8@D=H`a7&1Afr zn-3Bhs!k6ca7tK0k}X^}^lB_N9kon09D=-h+lUkm1KYegMal)^A~*gED3TA+u!?JW z+~PG};SH<8>)gS+Zq*<=fFJ!xs&Mr#M$ge$LWf?1#x?}OfjKq%2Mmd21eY;zw+%O z<6i=T^v@PYc@_!Z9a9OSY*F&TI3ijE0S@6FjVa4)y?Dpct=eY5$JZaWKgAa@+i{1ta|rwR3zO7KIfUY5Oh1D zDACPQo=N3m_gTrnF|!9rw_WY@LKSvUGha$9MF1Y)O;*vc3Z;$19jk6qhf=FUwUHj; zZz?7xYi>ZBGS$#%HQ%?MS;=W_qe_CO4{IsgcfjKuT)hcqrn}lta%RSt@{|{RT-mSA zJn%73*+Et932SQUh18nWjE!_v;szr| zSN}Y$YuHR}^d0!dJyD;6@4x51g*&%z!>3L5MVYF@gX}&_o&CnNG;~CHT1wf})l0Kw zWN|5Vk8FocQH260EsOF&1^2bOUJ;d)|K9q8l@{y7_|=qZ6>gqp6=t=E9Oa|vjLDC82rl~NIo>u@_0LdSWlY;$rC6JPgI~|!M zd*gopu*gw>XjcM0vY0%1H@~CdYBEQhv9b%86lN!H72ZL{M6W0-=3-**eMys>G*j;( z6HMw)&Wu7u$bEv;ea(dJ$r(fMWNI(3YDI-C+%(rRF9PMGgrEv#C5=P}C*L&wDC^aC z;VY{Irho-O?*Gj~M`ZyzB6PJ*I=d^i`VMsoCm`qB*KT}qW$XI(&oWP8sX8JSR-5z@ zHi>sJpNL$&MY@&T@pi0#N~_Izzl0m5>@+Kxn=d+FLlfiM3;Ff~T1e*RopyP2&?U>6 zs}W}`=pC|8=sDqZMVF$l@FrK$Ft-7oCcxEs&1wLI%jnb3GQ3VL@w-P%Zvmow74kC1 zdX`06-sIc#_hwcO0ugs`Wru)kCj^H$A}@MN0jO^xhXre(y61bRh-EBuQLglOq*~O) zb-W-G*g&lIqCR4sm6aUzQHZnZHuh`+l!t!v72ETRxT=!Da_|UsaM*>QjG(>;wOXNu zXvW+jO|3G#q%M$-!t_GuOb|^?tX$3y1Jr^b-azBSmx050>o?Q#lK buJ;hO<1Y>Rg4Zo!W~pXZD&BkEnq&VDn>P!< literal 0 HcmV?d00001 diff --git a/venv/Lib/importlib/__pycache__/abc.cpython-37.pyc b/venv/Lib/importlib/__pycache__/abc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98d29fda2de4a2e9a4ec1322c825b18b04618a67 GIT binary patch literal 13526 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 I6>q=sKMj^gcK`qY literal 0 HcmV?d00001 diff --git a/venv/Lib/importlib/__pycache__/machinery.cpython-37.pyc b/venv/Lib/importlib/__pycache__/machinery.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55c308832ac7d120ea40fe4c0fa0a18af39e6e24 GIT binary patch literal 1012 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/importlib/_bootstrap.py b/venv/Lib/importlib/_bootstrap.py new file mode 100644 index 00000000..2bdd1929 --- /dev/null +++ b/venv/Lib/importlib/_bootstrap.py @@ -0,0 +1,1164 @@ +"""Core implementation of import. + +This module is NOT meant to be directly imported! It has been designed such +that it can be bootstrapped into Python as the implementation of import. As +such it requires the injection of specific modules and attributes in order to +work. One should use importlib as the public-facing version of this module. + +""" +# +# IMPORTANT: Whenever making changes to this module, be sure to run +# a top-level make in order to get the frozen version of the module +# updated. Not doing so will result in the Makefile to fail for +# all others who don't have a ./python around to freeze the module +# in the early stages of compilation. +# + +# See importlib._setup() for what is injected into the global namespace. + +# When editing this code be aware that code executed at import time CANNOT +# reference any injected objects! This includes not only global code but also +# anything specified at the class level. + +# Bootstrap-related code ###################################################### + +_bootstrap_external = None + +def _wrap(new, old): + """Simple substitute for functools.update_wrapper.""" + for replace in ['__module__', '__name__', '__qualname__', '__doc__']: + if hasattr(old, replace): + setattr(new, replace, getattr(old, replace)) + new.__dict__.update(old.__dict__) + + +def _new_module(name): + return type(sys)(name) + + +# Module-level locking ######################################################## + +# A dict mapping module names to weakrefs of _ModuleLock instances +# Dictionary protected by the global import lock +_module_locks = {} +# A dict mapping thread ids to _ModuleLock instances +_blocking_on = {} + + +class _DeadlockError(RuntimeError): + pass + + +class _ModuleLock: + """A recursive lock implementation which is able to detect deadlocks + (e.g. thread 1 trying to take locks A then B, and thread 2 trying to + take locks B then A). + """ + + def __init__(self, name): + self.lock = _thread.allocate_lock() + self.wakeup = _thread.allocate_lock() + self.name = name + self.owner = None + self.count = 0 + self.waiters = 0 + + def has_deadlock(self): + # Deadlock avoidance for concurrent circular imports. + me = _thread.get_ident() + tid = self.owner + while True: + lock = _blocking_on.get(tid) + if lock is None: + return False + tid = lock.owner + if tid == me: + return True + + def acquire(self): + """ + Acquire the module lock. If a potential deadlock is detected, + a _DeadlockError is raised. + Otherwise, the lock is always acquired and True is returned. + """ + tid = _thread.get_ident() + _blocking_on[tid] = self + try: + while True: + with self.lock: + if self.count == 0 or self.owner == tid: + self.owner = tid + self.count += 1 + return True + if self.has_deadlock(): + raise _DeadlockError('deadlock detected by %r' % self) + if self.wakeup.acquire(False): + self.waiters += 1 + # Wait for a release() call + self.wakeup.acquire() + self.wakeup.release() + finally: + del _blocking_on[tid] + + def release(self): + tid = _thread.get_ident() + with self.lock: + if self.owner != tid: + raise RuntimeError('cannot release un-acquired lock') + assert self.count > 0 + self.count -= 1 + if self.count == 0: + self.owner = None + if self.waiters: + self.waiters -= 1 + self.wakeup.release() + + def __repr__(self): + return '_ModuleLock({!r}) at {}'.format(self.name, id(self)) + + +class _DummyModuleLock: + """A simple _ModuleLock equivalent for Python builds without + multi-threading support.""" + + def __init__(self, name): + self.name = name + self.count = 0 + + def acquire(self): + self.count += 1 + return True + + def release(self): + if self.count == 0: + raise RuntimeError('cannot release un-acquired lock') + self.count -= 1 + + def __repr__(self): + return '_DummyModuleLock({!r}) at {}'.format(self.name, id(self)) + + +class _ModuleLockManager: + + def __init__(self, name): + self._name = name + self._lock = None + + def __enter__(self): + self._lock = _get_module_lock(self._name) + self._lock.acquire() + + def __exit__(self, *args, **kwargs): + self._lock.release() + + +# The following two functions are for consumption by Python/import.c. + +def _get_module_lock(name): + """Get or create the module lock for a given module name. + + Acquire/release internally the global import lock to protect + _module_locks.""" + + _imp.acquire_lock() + try: + try: + lock = _module_locks[name]() + except KeyError: + lock = None + + if lock is None: + if _thread is None: + lock = _DummyModuleLock(name) + else: + lock = _ModuleLock(name) + + def cb(ref, name=name): + _imp.acquire_lock() + try: + # bpo-31070: Check if another thread created a new lock + # after the previous lock was destroyed + # but before the weakref callback was called. + if _module_locks.get(name) is ref: + del _module_locks[name] + finally: + _imp.release_lock() + + _module_locks[name] = _weakref.ref(lock, cb) + finally: + _imp.release_lock() + + return lock + + +def _lock_unlock_module(name): + """Acquires then releases the module lock for a given module name. + + This is used to ensure a module is completely initialized, in the + event it is being imported by another thread. + """ + lock = _get_module_lock(name) + try: + lock.acquire() + except _DeadlockError: + # Concurrent circular import, we'll accept a partially initialized + # module object. + pass + else: + lock.release() + +# Frame stripping magic ############################################### +def _call_with_frames_removed(f, *args, **kwds): + """remove_importlib_frames in import.c will always remove sequences + of importlib frames that end with a call to this function + + Use it instead of a normal call in places where including the importlib + frames introduces unwanted noise into the traceback (e.g. when executing + module code) + """ + return f(*args, **kwds) + + +def _verbose_message(message, *args, verbosity=1): + """Print the message to stderr if -v/PYTHONVERBOSE is turned on.""" + if sys.flags.verbose >= verbosity: + if not message.startswith(('#', 'import ')): + message = '# ' + message + print(message.format(*args), file=sys.stderr) + + +def _requires_builtin(fxn): + """Decorator to verify the named module is built-in.""" + def _requires_builtin_wrapper(self, fullname): + if fullname not in sys.builtin_module_names: + raise ImportError('{!r} is not a built-in module'.format(fullname), + name=fullname) + return fxn(self, fullname) + _wrap(_requires_builtin_wrapper, fxn) + return _requires_builtin_wrapper + + +def _requires_frozen(fxn): + """Decorator to verify the named module is frozen.""" + def _requires_frozen_wrapper(self, fullname): + if not _imp.is_frozen(fullname): + raise ImportError('{!r} is not a frozen module'.format(fullname), + name=fullname) + return fxn(self, fullname) + _wrap(_requires_frozen_wrapper, fxn) + return _requires_frozen_wrapper + + +# Typically used by loader classes as a method replacement. +def _load_module_shim(self, fullname): + """Load the specified module into sys.modules and return it. + + This method is deprecated. Use loader.exec_module instead. + + """ + spec = spec_from_loader(fullname, self) + if fullname in sys.modules: + module = sys.modules[fullname] + _exec(spec, module) + return sys.modules[fullname] + else: + return _load(spec) + +# Module specifications ####################################################### + +def _module_repr(module): + # The implementation of ModuleType.__repr__(). + loader = getattr(module, '__loader__', None) + if hasattr(loader, 'module_repr'): + # As soon as BuiltinImporter, FrozenImporter, and NamespaceLoader + # drop their implementations for module_repr. we can add a + # deprecation warning here. + try: + return loader.module_repr(module) + except Exception: + pass + try: + spec = module.__spec__ + except AttributeError: + pass + else: + if spec is not None: + return _module_repr_from_spec(spec) + + # We could use module.__class__.__name__ instead of 'module' in the + # various repr permutations. + try: + name = module.__name__ + except AttributeError: + name = '?' + try: + filename = module.__file__ + except AttributeError: + if loader is None: + return ''.format(name) + else: + return ''.format(name, loader) + else: + return ''.format(name, filename) + + +class _installed_safely: + + def __init__(self, module): + self._module = module + self._spec = module.__spec__ + + def __enter__(self): + # This must be done before putting the module in sys.modules + # (otherwise an optimization shortcut in import.c becomes + # wrong) + self._spec._initializing = True + sys.modules[self._spec.name] = self._module + + def __exit__(self, *args): + try: + spec = self._spec + if any(arg is not None for arg in args): + try: + del sys.modules[spec.name] + except KeyError: + pass + else: + _verbose_message('import {!r} # {!r}', spec.name, spec.loader) + finally: + self._spec._initializing = False + + +class ModuleSpec: + """The specification for a module, used for loading. + + A module's spec is the source for information about the module. For + data associated with the module, including source, use the spec's + loader. + + `name` is the absolute name of the module. `loader` is the loader + to use when loading the module. `parent` is the name of the + package the module is in. The parent is derived from the name. + + `is_package` determines if the module is considered a package or + not. On modules this is reflected by the `__path__` attribute. + + `origin` is the specific location used by the loader from which to + load the module, if that information is available. When filename is + set, origin will match. + + `has_location` indicates that a spec's "origin" reflects a location. + When this is True, `__file__` attribute of the module is set. + + `cached` is the location of the cached bytecode file, if any. It + corresponds to the `__cached__` attribute. + + `submodule_search_locations` is the sequence of path entries to + search when importing submodules. If set, is_package should be + True--and False otherwise. + + Packages are simply modules that (may) have submodules. If a spec + has a non-None value in `submodule_search_locations`, the import + system will consider modules loaded from the spec as packages. + + Only finders (see importlib.abc.MetaPathFinder and + importlib.abc.PathEntryFinder) should modify ModuleSpec instances. + + """ + + def __init__(self, name, loader, *, origin=None, loader_state=None, + is_package=None): + self.name = name + self.loader = loader + self.origin = origin + self.loader_state = loader_state + self.submodule_search_locations = [] if is_package else None + + # file-location attributes + self._set_fileattr = False + self._cached = None + + def __repr__(self): + args = ['name={!r}'.format(self.name), + 'loader={!r}'.format(self.loader)] + if self.origin is not None: + args.append('origin={!r}'.format(self.origin)) + if self.submodule_search_locations is not None: + args.append('submodule_search_locations={}' + .format(self.submodule_search_locations)) + return '{}({})'.format(self.__class__.__name__, ', '.join(args)) + + def __eq__(self, other): + smsl = self.submodule_search_locations + try: + return (self.name == other.name and + self.loader == other.loader and + self.origin == other.origin and + smsl == other.submodule_search_locations and + self.cached == other.cached and + self.has_location == other.has_location) + except AttributeError: + return False + + @property + def cached(self): + if self._cached is None: + if self.origin is not None and self._set_fileattr: + if _bootstrap_external is None: + raise NotImplementedError + self._cached = _bootstrap_external._get_cached(self.origin) + return self._cached + + @cached.setter + def cached(self, cached): + self._cached = cached + + @property + def parent(self): + """The name of the module's parent.""" + if self.submodule_search_locations is None: + return self.name.rpartition('.')[0] + else: + return self.name + + @property + def has_location(self): + return self._set_fileattr + + @has_location.setter + def has_location(self, value): + self._set_fileattr = bool(value) + + +def spec_from_loader(name, loader, *, origin=None, is_package=None): + """Return a module spec based on various loader methods.""" + if hasattr(loader, 'get_filename'): + if _bootstrap_external is None: + raise NotImplementedError + spec_from_file_location = _bootstrap_external.spec_from_file_location + + if is_package is None: + return spec_from_file_location(name, loader=loader) + search = [] if is_package else None + return spec_from_file_location(name, loader=loader, + submodule_search_locations=search) + + if is_package is None: + if hasattr(loader, 'is_package'): + try: + is_package = loader.is_package(name) + except ImportError: + is_package = None # aka, undefined + else: + # the default + is_package = False + + return ModuleSpec(name, loader, origin=origin, is_package=is_package) + + +def _spec_from_module(module, loader=None, origin=None): + # This function is meant for use in _setup(). + try: + spec = module.__spec__ + except AttributeError: + pass + else: + if spec is not None: + return spec + + name = module.__name__ + if loader is None: + try: + loader = module.__loader__ + except AttributeError: + # loader will stay None. + pass + try: + location = module.__file__ + except AttributeError: + location = None + if origin is None: + if location is None: + try: + origin = loader._ORIGIN + except AttributeError: + origin = None + else: + origin = location + try: + cached = module.__cached__ + except AttributeError: + cached = None + try: + submodule_search_locations = list(module.__path__) + except AttributeError: + submodule_search_locations = None + + spec = ModuleSpec(name, loader, origin=origin) + spec._set_fileattr = False if location is None else True + spec.cached = cached + spec.submodule_search_locations = submodule_search_locations + return spec + + +def _init_module_attrs(spec, module, *, override=False): + # The passed-in module may be not support attribute assignment, + # in which case we simply don't set the attributes. + # __name__ + if (override or getattr(module, '__name__', None) is None): + try: + module.__name__ = spec.name + except AttributeError: + pass + # __loader__ + if override or getattr(module, '__loader__', None) is None: + loader = spec.loader + if loader is None: + # A backward compatibility hack. + if spec.submodule_search_locations is not None: + if _bootstrap_external is None: + raise NotImplementedError + _NamespaceLoader = _bootstrap_external._NamespaceLoader + + loader = _NamespaceLoader.__new__(_NamespaceLoader) + loader._path = spec.submodule_search_locations + spec.loader = loader + # While the docs say that module.__file__ is not set for + # built-in modules, and the code below will avoid setting it if + # spec.has_location is false, this is incorrect for namespace + # packages. Namespace packages have no location, but their + # __spec__.origin is None, and thus their module.__file__ + # should also be None for consistency. While a bit of a hack, + # this is the best place to ensure this consistency. + # + # See # https://docs.python.org/3/library/importlib.html#importlib.abc.Loader.load_module + # and bpo-32305 + module.__file__ = None + try: + module.__loader__ = loader + except AttributeError: + pass + # __package__ + if override or getattr(module, '__package__', None) is None: + try: + module.__package__ = spec.parent + except AttributeError: + pass + # __spec__ + try: + module.__spec__ = spec + except AttributeError: + pass + # __path__ + if override or getattr(module, '__path__', None) is None: + if spec.submodule_search_locations is not None: + try: + module.__path__ = spec.submodule_search_locations + except AttributeError: + pass + # __file__/__cached__ + if spec.has_location: + if override or getattr(module, '__file__', None) is None: + try: + module.__file__ = spec.origin + except AttributeError: + pass + + if override or getattr(module, '__cached__', None) is None: + if spec.cached is not None: + try: + module.__cached__ = spec.cached + except AttributeError: + pass + return module + + +def module_from_spec(spec): + """Create a module based on the provided spec.""" + # Typically loaders will not implement create_module(). + module = None + if hasattr(spec.loader, 'create_module'): + # If create_module() returns `None` then it means default + # module creation should be used. + module = spec.loader.create_module(spec) + elif hasattr(spec.loader, 'exec_module'): + raise ImportError('loaders that define exec_module() ' + 'must also define create_module()') + if module is None: + module = _new_module(spec.name) + _init_module_attrs(spec, module) + return module + + +def _module_repr_from_spec(spec): + """Return the repr to use for the module.""" + # We mostly replicate _module_repr() using the spec attributes. + name = '?' if spec.name is None else spec.name + if spec.origin is None: + if spec.loader is None: + return ''.format(name) + else: + return ''.format(name, spec.loader) + else: + if spec.has_location: + return ''.format(name, spec.origin) + else: + return ''.format(spec.name, spec.origin) + + +# Used by importlib.reload() and _load_module_shim(). +def _exec(spec, module): + """Execute the spec's specified module in an existing module's namespace.""" + name = spec.name + with _ModuleLockManager(name): + if sys.modules.get(name) is not module: + msg = 'module {!r} not in sys.modules'.format(name) + raise ImportError(msg, name=name) + if spec.loader is None: + if spec.submodule_search_locations is None: + raise ImportError('missing loader', name=spec.name) + # namespace package + _init_module_attrs(spec, module, override=True) + return module + _init_module_attrs(spec, module, override=True) + if not hasattr(spec.loader, 'exec_module'): + # (issue19713) Once BuiltinImporter and ExtensionFileLoader + # have exec_module() implemented, we can add a deprecation + # warning here. + spec.loader.load_module(name) + else: + spec.loader.exec_module(module) + return sys.modules[name] + + +def _load_backward_compatible(spec): + # (issue19713) Once BuiltinImporter and ExtensionFileLoader + # have exec_module() implemented, we can add a deprecation + # warning here. + spec.loader.load_module(spec.name) + # The module must be in sys.modules at this point! + module = sys.modules[spec.name] + if getattr(module, '__loader__', None) is None: + try: + module.__loader__ = spec.loader + except AttributeError: + pass + if getattr(module, '__package__', None) is None: + try: + # Since module.__path__ may not line up with + # spec.submodule_search_paths, we can't necessarily rely + # on spec.parent here. + module.__package__ = module.__name__ + if not hasattr(module, '__path__'): + module.__package__ = spec.name.rpartition('.')[0] + except AttributeError: + pass + if getattr(module, '__spec__', None) is None: + try: + module.__spec__ = spec + except AttributeError: + pass + return module + +def _load_unlocked(spec): + # A helper for direct use by the import system. + if spec.loader is not None: + # not a namespace package + if not hasattr(spec.loader, 'exec_module'): + return _load_backward_compatible(spec) + + module = module_from_spec(spec) + with _installed_safely(module): + if spec.loader is None: + if spec.submodule_search_locations is None: + raise ImportError('missing loader', name=spec.name) + # A namespace package so do nothing. + else: + spec.loader.exec_module(module) + + # We don't ensure that the import-related module attributes get + # set in the sys.modules replacement case. Such modules are on + # their own. + return sys.modules[spec.name] + +# A method used during testing of _load_unlocked() and by +# _load_module_shim(). +def _load(spec): + """Return a new module object, loaded by the spec's loader. + + The module is not added to its parent. + + If a module is already in sys.modules, that existing module gets + clobbered. + + """ + with _ModuleLockManager(spec.name): + return _load_unlocked(spec) + + +# Loaders ##################################################################### + +class BuiltinImporter: + + """Meta path import for built-in modules. + + All methods are either class or static methods to avoid the need to + instantiate the class. + + """ + + @staticmethod + def module_repr(module): + """Return repr for the module. + + The method is deprecated. The import machinery does the job itself. + + """ + return ''.format(module.__name__) + + @classmethod + def find_spec(cls, fullname, path=None, target=None): + if path is not None: + return None + if _imp.is_builtin(fullname): + return spec_from_loader(fullname, cls, origin='built-in') + else: + return None + + @classmethod + def find_module(cls, fullname, path=None): + """Find the built-in module. + + If 'path' is ever specified then the search is considered a failure. + + This method is deprecated. Use find_spec() instead. + + """ + spec = cls.find_spec(fullname, path) + return spec.loader if spec is not None else None + + @classmethod + def create_module(self, spec): + """Create a built-in module""" + if spec.name not in sys.builtin_module_names: + raise ImportError('{!r} is not a built-in module'.format(spec.name), + name=spec.name) + return _call_with_frames_removed(_imp.create_builtin, spec) + + @classmethod + def exec_module(self, module): + """Exec a built-in module""" + _call_with_frames_removed(_imp.exec_builtin, module) + + @classmethod + @_requires_builtin + def get_code(cls, fullname): + """Return None as built-in modules do not have code objects.""" + return None + + @classmethod + @_requires_builtin + def get_source(cls, fullname): + """Return None as built-in modules do not have source code.""" + return None + + @classmethod + @_requires_builtin + def is_package(cls, fullname): + """Return False as built-in modules are never packages.""" + return False + + load_module = classmethod(_load_module_shim) + + +class FrozenImporter: + + """Meta path import for frozen modules. + + All methods are either class or static methods to avoid the need to + instantiate the class. + + """ + + @staticmethod + def module_repr(m): + """Return repr for the module. + + The method is deprecated. The import machinery does the job itself. + + """ + return ''.format(m.__name__) + + @classmethod + def find_spec(cls, fullname, path=None, target=None): + if _imp.is_frozen(fullname): + return spec_from_loader(fullname, cls, origin='frozen') + else: + return None + + @classmethod + def find_module(cls, fullname, path=None): + """Find a frozen module. + + This method is deprecated. Use find_spec() instead. + + """ + return cls if _imp.is_frozen(fullname) else None + + @classmethod + def create_module(cls, spec): + """Use default semantics for module creation.""" + + @staticmethod + def exec_module(module): + name = module.__spec__.name + if not _imp.is_frozen(name): + raise ImportError('{!r} is not a frozen module'.format(name), + name=name) + code = _call_with_frames_removed(_imp.get_frozen_object, name) + exec(code, module.__dict__) + + @classmethod + def load_module(cls, fullname): + """Load a frozen module. + + This method is deprecated. Use exec_module() instead. + + """ + return _load_module_shim(cls, fullname) + + @classmethod + @_requires_frozen + def get_code(cls, fullname): + """Return the code object for the frozen module.""" + return _imp.get_frozen_object(fullname) + + @classmethod + @_requires_frozen + def get_source(cls, fullname): + """Return None as frozen modules do not have source code.""" + return None + + @classmethod + @_requires_frozen + def is_package(cls, fullname): + """Return True if the frozen module is a package.""" + return _imp.is_frozen_package(fullname) + + +# Import itself ############################################################### + +class _ImportLockContext: + + """Context manager for the import lock.""" + + def __enter__(self): + """Acquire the import lock.""" + _imp.acquire_lock() + + def __exit__(self, exc_type, exc_value, exc_traceback): + """Release the import lock regardless of any raised exceptions.""" + _imp.release_lock() + + +def _resolve_name(name, package, level): + """Resolve a relative module name to an absolute one.""" + bits = package.rsplit('.', level - 1) + if len(bits) < level: + raise ValueError('attempted relative import beyond top-level package') + base = bits[0] + return '{}.{}'.format(base, name) if name else base + + +def _find_spec_legacy(finder, name, path): + # This would be a good place for a DeprecationWarning if + # we ended up going that route. + loader = finder.find_module(name, path) + if loader is None: + return None + return spec_from_loader(name, loader) + + +def _find_spec(name, path, target=None): + """Find a module's spec.""" + meta_path = sys.meta_path + if meta_path is None: + # PyImport_Cleanup() is running or has been called. + raise ImportError("sys.meta_path is None, Python is likely " + "shutting down") + + if not meta_path: + _warnings.warn('sys.meta_path is empty', ImportWarning) + + # We check sys.modules here for the reload case. While a passed-in + # target will usually indicate a reload there is no guarantee, whereas + # sys.modules provides one. + is_reload = name in sys.modules + for finder in meta_path: + with _ImportLockContext(): + try: + find_spec = finder.find_spec + except AttributeError: + spec = _find_spec_legacy(finder, name, path) + if spec is None: + continue + else: + spec = find_spec(name, path, target) + if spec is not None: + # The parent import may have already imported this module. + if not is_reload and name in sys.modules: + module = sys.modules[name] + try: + __spec__ = module.__spec__ + except AttributeError: + # We use the found spec since that is the one that + # we would have used if the parent module hadn't + # beaten us to the punch. + return spec + else: + if __spec__ is None: + return spec + else: + return __spec__ + else: + return spec + else: + return None + + +def _sanity_check(name, package, level): + """Verify arguments are "sane".""" + if not isinstance(name, str): + raise TypeError('module name must be str, not {}'.format(type(name))) + if level < 0: + raise ValueError('level must be >= 0') + if level > 0: + if not isinstance(package, str): + raise TypeError('__package__ not set to a string') + elif not package: + raise ImportError('attempted relative import with no known parent ' + 'package') + if not name and level == 0: + raise ValueError('Empty module name') + + +_ERR_MSG_PREFIX = 'No module named ' +_ERR_MSG = _ERR_MSG_PREFIX + '{!r}' + +def _find_and_load_unlocked(name, import_): + path = None + parent = name.rpartition('.')[0] + if parent: + if parent not in sys.modules: + _call_with_frames_removed(import_, parent) + # Crazy side-effects! + if name in sys.modules: + return sys.modules[name] + parent_module = sys.modules[parent] + try: + path = parent_module.__path__ + except AttributeError: + msg = (_ERR_MSG + '; {!r} is not a package').format(name, parent) + raise ModuleNotFoundError(msg, name=name) from None + spec = _find_spec(name, path) + if spec is None: + raise ModuleNotFoundError(_ERR_MSG.format(name), name=name) + else: + module = _load_unlocked(spec) + if parent: + # Set the module as an attribute on its parent. + parent_module = sys.modules[parent] + setattr(parent_module, name.rpartition('.')[2], module) + return module + + +_NEEDS_LOADING = object() + + +def _find_and_load(name, import_): + """Find and load the module.""" + with _ModuleLockManager(name): + module = sys.modules.get(name, _NEEDS_LOADING) + if module is _NEEDS_LOADING: + return _find_and_load_unlocked(name, import_) + + if module is None: + message = ('import of {} halted; ' + 'None in sys.modules'.format(name)) + raise ModuleNotFoundError(message, name=name) + + _lock_unlock_module(name) + return module + + +def _gcd_import(name, package=None, level=0): + """Import and return the module based on its name, the package the call is + being made from, and the level adjustment. + + This function represents the greatest common denominator of functionality + between import_module and __import__. This includes setting __package__ if + the loader did not. + + """ + _sanity_check(name, package, level) + if level > 0: + name = _resolve_name(name, package, level) + return _find_and_load(name, _gcd_import) + + +def _handle_fromlist(module, fromlist, import_, *, recursive=False): + """Figure out what __import__ should return. + + The import_ parameter is a callable which takes the name of module to + import. It is required to decouple the function from assuming importlib's + import implementation is desired. + + """ + # The hell that is fromlist ... + # If a package was imported, try to import stuff from fromlist. + if hasattr(module, '__path__'): + for x in fromlist: + if not isinstance(x, str): + if recursive: + where = module.__name__ + '.__all__' + else: + where = "``from list''" + raise TypeError(f"Item in {where} must be str, " + f"not {type(x).__name__}") + elif x == '*': + if not recursive and hasattr(module, '__all__'): + _handle_fromlist(module, module.__all__, import_, + recursive=True) + elif not hasattr(module, x): + from_name = '{}.{}'.format(module.__name__, x) + try: + _call_with_frames_removed(import_, from_name) + except ModuleNotFoundError as exc: + # Backwards-compatibility dictates we ignore failed + # imports triggered by fromlist for modules that don't + # exist. + if (exc.name == from_name and + sys.modules.get(from_name, _NEEDS_LOADING) is not None): + continue + raise + return module + + +def _calc___package__(globals): + """Calculate what __package__ should be. + + __package__ is not guaranteed to be defined or could be set to None + to represent that its proper value is unknown. + + """ + package = globals.get('__package__') + spec = globals.get('__spec__') + if package is not None: + if spec is not None and package != spec.parent: + _warnings.warn("__package__ != __spec__.parent " + f"({package!r} != {spec.parent!r})", + ImportWarning, stacklevel=3) + return package + elif spec is not None: + return spec.parent + else: + _warnings.warn("can't resolve package from __spec__ or __package__, " + "falling back on __name__ and __path__", + ImportWarning, stacklevel=3) + package = globals['__name__'] + if '__path__' not in globals: + package = package.rpartition('.')[0] + return package + + +def __import__(name, globals=None, locals=None, fromlist=(), level=0): + """Import a module. + + The 'globals' argument is used to infer where the import is occurring from + to handle relative imports. The 'locals' argument is ignored. The + 'fromlist' argument specifies what should exist as attributes on the module + being imported (e.g. ``from module import ``). The 'level' + argument represents the package location to import from in a relative + import (e.g. ``from ..pkg import mod`` would have a 'level' of 2). + + """ + if level == 0: + module = _gcd_import(name) + else: + globals_ = globals if globals is not None else {} + package = _calc___package__(globals_) + module = _gcd_import(name, package, level) + if not fromlist: + # Return up to the first dot in 'name'. This is complicated by the fact + # that 'name' may be relative. + if level == 0: + return _gcd_import(name.partition('.')[0]) + elif not name: + return module + else: + # Figure out where to slice the module's name up to the first dot + # in 'name'. + cut_off = len(name) - len(name.partition('.')[0]) + # Slice end needs to be positive to alleviate need to special-case + # when ``'.' not in name``. + return sys.modules[module.__name__[:len(module.__name__)-cut_off]] + else: + return _handle_fromlist(module, fromlist, _gcd_import) + + +def _builtin_from_name(name): + spec = BuiltinImporter.find_spec(name) + if spec is None: + raise ImportError('no built-in module named ' + name) + return _load_unlocked(spec) + + +def _setup(sys_module, _imp_module): + """Setup importlib by importing needed built-in modules and injecting them + into the global namespace. + + As sys is needed for sys.modules access and _imp is needed to load built-in + modules, those two modules must be explicitly passed in. + + """ + global _imp, sys + _imp = _imp_module + sys = sys_module + + # Set up the spec for existing builtin/frozen modules. + module_type = type(sys) + for name, module in sys.modules.items(): + if isinstance(module, module_type): + if name in sys.builtin_module_names: + loader = BuiltinImporter + elif _imp.is_frozen(name): + loader = FrozenImporter + else: + continue + spec = _spec_from_module(module, loader) + _init_module_attrs(spec, module) + + # Directly load built-in modules needed during bootstrap. + self_module = sys.modules[__name__] + for builtin_name in ('_thread', '_warnings', '_weakref'): + if builtin_name not in sys.modules: + builtin_module = _builtin_from_name(builtin_name) + else: + builtin_module = sys.modules[builtin_name] + setattr(self_module, builtin_name, builtin_module) + + +def _install(sys_module, _imp_module): + """Install importers for builtin and frozen modules""" + _setup(sys_module, _imp_module) + + sys.meta_path.append(BuiltinImporter) + sys.meta_path.append(FrozenImporter) + + +def _install_external_importers(): + """Install importers that require external filesystem access""" + global _bootstrap_external + import _frozen_importlib_external + _bootstrap_external = _frozen_importlib_external + _frozen_importlib_external._install(sys.modules[__name__]) diff --git a/venv/Lib/importlib/_bootstrap_external.py b/venv/Lib/importlib/_bootstrap_external.py new file mode 100644 index 00000000..53b24ff1 --- /dev/null +++ b/venv/Lib/importlib/_bootstrap_external.py @@ -0,0 +1,1562 @@ +"""Core implementation of path-based import. + +This module is NOT meant to be directly imported! It has been designed such +that it can be bootstrapped into Python as the implementation of import. As +such it requires the injection of specific modules and attributes in order to +work. One should use importlib as the public-facing version of this module. + +""" +# IMPORTANT: Whenever making changes to this module, be sure to run a top-level +# `make regen-importlib` followed by `make` in order to get the frozen version +# of the module updated. Not doing so will result in the Makefile to fail for +# all others who don't have a ./python around to freeze the module in the early +# stages of compilation. +# + +# See importlib._setup() for what is injected into the global namespace. + +# When editing this code be aware that code executed at import time CANNOT +# reference any injected objects! This includes not only global code but also +# anything specified at the class level. + +# Bootstrap-related code ###################################################### +_CASE_INSENSITIVE_PLATFORMS_STR_KEY = 'win', +_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY = 'cygwin', 'darwin' +_CASE_INSENSITIVE_PLATFORMS = (_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY + + _CASE_INSENSITIVE_PLATFORMS_STR_KEY) + + +def _make_relax_case(): + if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS): + if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS_STR_KEY): + key = 'PYTHONCASEOK' + else: + key = b'PYTHONCASEOK' + + def _relax_case(): + """True if filenames must be checked case-insensitively.""" + return key in _os.environ + else: + def _relax_case(): + """True if filenames must be checked case-insensitively.""" + return False + return _relax_case + + +def _w_long(x): + """Convert a 32-bit integer to little-endian.""" + return (int(x) & 0xFFFFFFFF).to_bytes(4, 'little') + + +def _r_long(int_bytes): + """Convert 4 bytes in little-endian to an integer.""" + return int.from_bytes(int_bytes, 'little') + + +def _path_join(*path_parts): + """Replacement for os.path.join().""" + return path_sep.join([part.rstrip(path_separators) + for part in path_parts if part]) + + +def _path_split(path): + """Replacement for os.path.split().""" + if len(path_separators) == 1: + front, _, tail = path.rpartition(path_sep) + return front, tail + for x in reversed(path): + if x in path_separators: + front, tail = path.rsplit(x, maxsplit=1) + return front, tail + return '', path + + +def _path_stat(path): + """Stat the path. + + Made a separate function to make it easier to override in experiments + (e.g. cache stat results). + + """ + return _os.stat(path) + + +def _path_is_mode_type(path, mode): + """Test whether the path is the specified mode type.""" + try: + stat_info = _path_stat(path) + except OSError: + return False + return (stat_info.st_mode & 0o170000) == mode + + +def _path_isfile(path): + """Replacement for os.path.isfile.""" + return _path_is_mode_type(path, 0o100000) + + +def _path_isdir(path): + """Replacement for os.path.isdir.""" + if not path: + path = _os.getcwd() + return _path_is_mode_type(path, 0o040000) + + +def _write_atomic(path, data, mode=0o666): + """Best-effort function to write data to a path atomically. + Be prepared to handle a FileExistsError if concurrent writing of the + temporary file is attempted.""" + # id() is used to generate a pseudo-random filename. + path_tmp = '{}.{}'.format(path, id(path)) + fd = _os.open(path_tmp, + _os.O_EXCL | _os.O_CREAT | _os.O_WRONLY, mode & 0o666) + try: + # We first write data to a temporary file, and then use os.replace() to + # perform an atomic rename. + with _io.FileIO(fd, 'wb') as file: + file.write(data) + _os.replace(path_tmp, path) + except OSError: + try: + _os.unlink(path_tmp) + except OSError: + pass + raise + + +_code_type = type(_write_atomic.__code__) + + +# Finder/loader utility code ############################################### + +# Magic word to reject .pyc files generated by other Python versions. +# It should change for each incompatible change to the bytecode. +# +# The value of CR and LF is incorporated so if you ever read or write +# a .pyc file in text mode the magic number will be wrong; also, the +# Apple MPW compiler swaps their values, botching string constants. +# +# There were a variety of old schemes for setting the magic number. +# The current working scheme is to increment the previous value by +# 10. +# +# Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic +# number also includes a new "magic tag", i.e. a human readable string used +# to represent the magic number in __pycache__ directories. When you change +# the magic number, you must also set a new unique magic tag. Generally this +# can be named after the Python major version of the magic number bump, but +# it can really be anything, as long as it's different than anything else +# that's come before. The tags are included in the following table, starting +# with Python 3.2a0. +# +# Known values: +# Python 1.5: 20121 +# Python 1.5.1: 20121 +# Python 1.5.2: 20121 +# Python 1.6: 50428 +# Python 2.0: 50823 +# Python 2.0.1: 50823 +# Python 2.1: 60202 +# Python 2.1.1: 60202 +# Python 2.1.2: 60202 +# Python 2.2: 60717 +# Python 2.3a0: 62011 +# Python 2.3a0: 62021 +# Python 2.3a0: 62011 (!) +# Python 2.4a0: 62041 +# Python 2.4a3: 62051 +# Python 2.4b1: 62061 +# Python 2.5a0: 62071 +# Python 2.5a0: 62081 (ast-branch) +# Python 2.5a0: 62091 (with) +# Python 2.5a0: 62092 (changed WITH_CLEANUP opcode) +# Python 2.5b3: 62101 (fix wrong code: for x, in ...) +# Python 2.5b3: 62111 (fix wrong code: x += yield) +# Python 2.5c1: 62121 (fix wrong lnotab with for loops and +# storing constants that should have been removed) +# Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp) +# Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode) +# Python 2.6a1: 62161 (WITH_CLEANUP optimization) +# Python 2.7a0: 62171 (optimize list comprehensions/change LIST_APPEND) +# Python 2.7a0: 62181 (optimize conditional branches: +# introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE) +# Python 2.7a0 62191 (introduce SETUP_WITH) +# Python 2.7a0 62201 (introduce BUILD_SET) +# Python 2.7a0 62211 (introduce MAP_ADD and SET_ADD) +# Python 3000: 3000 +# 3010 (removed UNARY_CONVERT) +# 3020 (added BUILD_SET) +# 3030 (added keyword-only parameters) +# 3040 (added signature annotations) +# 3050 (print becomes a function) +# 3060 (PEP 3115 metaclass syntax) +# 3061 (string literals become unicode) +# 3071 (PEP 3109 raise changes) +# 3081 (PEP 3137 make __file__ and __name__ unicode) +# 3091 (kill str8 interning) +# 3101 (merge from 2.6a0, see 62151) +# 3103 (__file__ points to source file) +# Python 3.0a4: 3111 (WITH_CLEANUP optimization). +# Python 3.0b1: 3131 (lexical exception stacking, including POP_EXCEPT + #3021) +# Python 3.1a1: 3141 (optimize list, set and dict comprehensions: +# change LIST_APPEND and SET_ADD, add MAP_ADD #2183) +# Python 3.1a1: 3151 (optimize conditional branches: +# introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE + #4715) +# Python 3.2a1: 3160 (add SETUP_WITH #6101) +# tag: cpython-32 +# Python 3.2a2: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR #9225) +# tag: cpython-32 +# Python 3.2a3 3180 (add DELETE_DEREF #4617) +# Python 3.3a1 3190 (__class__ super closure changed) +# Python 3.3a1 3200 (PEP 3155 __qualname__ added #13448) +# Python 3.3a1 3210 (added size modulo 2**32 to the pyc header #13645) +# Python 3.3a2 3220 (changed PEP 380 implementation #14230) +# Python 3.3a4 3230 (revert changes to implicit __class__ closure #14857) +# Python 3.4a1 3250 (evaluate positional default arguments before +# keyword-only defaults #16967) +# Python 3.4a1 3260 (add LOAD_CLASSDEREF; allow locals of class to override +# free vars #17853) +# Python 3.4a1 3270 (various tweaks to the __class__ closure #12370) +# Python 3.4a1 3280 (remove implicit class argument) +# Python 3.4a4 3290 (changes to __qualname__ computation #19301) +# Python 3.4a4 3300 (more changes to __qualname__ computation #19301) +# Python 3.4rc2 3310 (alter __qualname__ computation #20625) +# Python 3.5a1 3320 (PEP 465: Matrix multiplication operator #21176) +# Python 3.5b1 3330 (PEP 448: Additional Unpacking Generalizations #2292) +# Python 3.5b2 3340 (fix dictionary display evaluation order #11205) +# Python 3.5b3 3350 (add GET_YIELD_FROM_ITER opcode #24400) +# Python 3.5.2 3351 (fix BUILD_MAP_UNPACK_WITH_CALL opcode #27286) +# Python 3.6a0 3360 (add FORMAT_VALUE opcode #25483) +# Python 3.6a1 3361 (lineno delta of code.co_lnotab becomes signed #26107) +# Python 3.6a2 3370 (16 bit wordcode #26647) +# Python 3.6a2 3371 (add BUILD_CONST_KEY_MAP opcode #27140) +# Python 3.6a2 3372 (MAKE_FUNCTION simplification, remove MAKE_CLOSURE +# #27095) +# Python 3.6b1 3373 (add BUILD_STRING opcode #27078) +# Python 3.6b1 3375 (add SETUP_ANNOTATIONS and STORE_ANNOTATION opcodes +# #27985) +# Python 3.6b1 3376 (simplify CALL_FUNCTIONs & BUILD_MAP_UNPACK_WITH_CALL + #27213) +# Python 3.6b1 3377 (set __class__ cell from type.__new__ #23722) +# Python 3.6b2 3378 (add BUILD_TUPLE_UNPACK_WITH_CALL #28257) +# Python 3.6rc1 3379 (more thorough __class__ validation #23722) +# Python 3.7a1 3390 (add LOAD_METHOD and CALL_METHOD opcodes #26110) +# Python 3.7a2 3391 (update GET_AITER #31709) +# Python 3.7a4 3392 (PEP 552: Deterministic pycs #31650) +# Python 3.7b1 3393 (remove STORE_ANNOTATION opcode #32550) +# Python 3.7b5 3394 (restored docstring as the firts stmt in the body; +# this might affected the first line number #32911) +# +# MAGIC must change whenever the bytecode emitted by the compiler may no +# longer be understood by older implementations of the eval loop (usually +# due to the addition of new opcodes). +# +# Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array +# in PC/launcher.c must also be updated. + +MAGIC_NUMBER = (3394).to_bytes(2, 'little') + b'\r\n' +_RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c + +_PYCACHE = '__pycache__' +_OPT = 'opt-' + +SOURCE_SUFFIXES = ['.py'] # _setup() adds .pyw as needed. + +BYTECODE_SUFFIXES = ['.pyc'] +# Deprecated. +DEBUG_BYTECODE_SUFFIXES = OPTIMIZED_BYTECODE_SUFFIXES = BYTECODE_SUFFIXES + +def cache_from_source(path, debug_override=None, *, optimization=None): + """Given the path to a .py file, return the path to its .pyc file. + + The .py file does not need to exist; this simply returns the path to the + .pyc file calculated as if the .py file were imported. + + The 'optimization' parameter controls the presumed optimization level of + the bytecode file. If 'optimization' is not None, the string representation + of the argument is taken and verified to be alphanumeric (else ValueError + is raised). + + The debug_override parameter is deprecated. If debug_override is not None, + a True value is the same as setting 'optimization' to the empty string + while a False value is equivalent to setting 'optimization' to '1'. + + If sys.implementation.cache_tag is None then NotImplementedError is raised. + + """ + if debug_override is not None: + _warnings.warn('the debug_override parameter is deprecated; use ' + "'optimization' instead", DeprecationWarning) + if optimization is not None: + message = 'debug_override or optimization must be set to None' + raise TypeError(message) + optimization = '' if debug_override else 1 + path = _os.fspath(path) + head, tail = _path_split(path) + base, sep, rest = tail.rpartition('.') + tag = sys.implementation.cache_tag + if tag is None: + raise NotImplementedError('sys.implementation.cache_tag is None') + almost_filename = ''.join([(base if base else rest), sep, tag]) + if optimization is None: + if sys.flags.optimize == 0: + optimization = '' + else: + optimization = sys.flags.optimize + optimization = str(optimization) + if optimization != '': + if not optimization.isalnum(): + raise ValueError('{!r} is not alphanumeric'.format(optimization)) + almost_filename = '{}.{}{}'.format(almost_filename, _OPT, optimization) + return _path_join(head, _PYCACHE, almost_filename + BYTECODE_SUFFIXES[0]) + + +def source_from_cache(path): + """Given the path to a .pyc. file, return the path to its .py file. + + The .pyc file does not need to exist; this simply returns the path to + the .py file calculated to correspond to the .pyc file. If path does + not conform to PEP 3147/488 format, ValueError will be raised. If + sys.implementation.cache_tag is None then NotImplementedError is raised. + + """ + if sys.implementation.cache_tag is None: + raise NotImplementedError('sys.implementation.cache_tag is None') + path = _os.fspath(path) + head, pycache_filename = _path_split(path) + head, pycache = _path_split(head) + if pycache != _PYCACHE: + raise ValueError('{} not bottom-level directory in ' + '{!r}'.format(_PYCACHE, path)) + dot_count = pycache_filename.count('.') + if dot_count not in {2, 3}: + raise ValueError('expected only 2 or 3 dots in ' + '{!r}'.format(pycache_filename)) + elif dot_count == 3: + optimization = pycache_filename.rsplit('.', 2)[-2] + if not optimization.startswith(_OPT): + raise ValueError("optimization portion of filename does not start " + "with {!r}".format(_OPT)) + opt_level = optimization[len(_OPT):] + if not opt_level.isalnum(): + raise ValueError("optimization level {!r} is not an alphanumeric " + "value".format(optimization)) + base_filename = pycache_filename.partition('.')[0] + return _path_join(head, base_filename + SOURCE_SUFFIXES[0]) + + +def _get_sourcefile(bytecode_path): + """Convert a bytecode file path to a source path (if possible). + + This function exists purely for backwards-compatibility for + PyImport_ExecCodeModuleWithFilenames() in the C API. + + """ + if len(bytecode_path) == 0: + return None + rest, _, extension = bytecode_path.rpartition('.') + if not rest or extension.lower()[-3:-1] != 'py': + return bytecode_path + try: + source_path = source_from_cache(bytecode_path) + except (NotImplementedError, ValueError): + source_path = bytecode_path[:-1] + return source_path if _path_isfile(source_path) else bytecode_path + + +def _get_cached(filename): + if filename.endswith(tuple(SOURCE_SUFFIXES)): + try: + return cache_from_source(filename) + except NotImplementedError: + pass + elif filename.endswith(tuple(BYTECODE_SUFFIXES)): + return filename + else: + return None + + +def _calc_mode(path): + """Calculate the mode permissions for a bytecode file.""" + try: + mode = _path_stat(path).st_mode + except OSError: + mode = 0o666 + # We always ensure write access so we can update cached files + # later even when the source files are read-only on Windows (#6074) + mode |= 0o200 + return mode + + +def _check_name(method): + """Decorator to verify that the module being requested matches the one the + loader can handle. + + The first argument (self) must define _name which the second argument is + compared against. If the comparison fails then ImportError is raised. + + """ + def _check_name_wrapper(self, name=None, *args, **kwargs): + if name is None: + name = self.name + elif self.name != name: + raise ImportError('loader for %s cannot handle %s' % + (self.name, name), name=name) + return method(self, name, *args, **kwargs) + try: + _wrap = _bootstrap._wrap + except NameError: + # XXX yuck + def _wrap(new, old): + for replace in ['__module__', '__name__', '__qualname__', '__doc__']: + if hasattr(old, replace): + setattr(new, replace, getattr(old, replace)) + new.__dict__.update(old.__dict__) + _wrap(_check_name_wrapper, method) + return _check_name_wrapper + + +def _find_module_shim(self, fullname): + """Try to find a loader for the specified module by delegating to + self.find_loader(). + + This method is deprecated in favor of finder.find_spec(). + + """ + # Call find_loader(). If it returns a string (indicating this + # is a namespace package portion), generate a warning and + # return None. + loader, portions = self.find_loader(fullname) + if loader is None and len(portions): + msg = 'Not importing directory {}: missing __init__' + _warnings.warn(msg.format(portions[0]), ImportWarning) + return loader + + +def _classify_pyc(data, name, exc_details): + """Perform basic validity checking of a pyc header and return the flags field, + which determines how the pyc should be further validated against the source. + + *data* is the contents of the pyc file. (Only the first 16 bytes are + required, though.) + + *name* is the name of the module being imported. It is used for logging. + + *exc_details* is a dictionary passed to ImportError if it raised for + improved debugging. + + ImportError is raised when the magic number is incorrect or when the flags + field is invalid. EOFError is raised when the data is found to be truncated. + + """ + magic = data[:4] + if magic != MAGIC_NUMBER: + message = f'bad magic number in {name!r}: {magic!r}' + _bootstrap._verbose_message('{}', message) + raise ImportError(message, **exc_details) + if len(data) < 16: + message = f'reached EOF while reading pyc header of {name!r}' + _bootstrap._verbose_message('{}', message) + raise EOFError(message) + flags = _r_long(data[4:8]) + # Only the first two flags are defined. + if flags & ~0b11: + message = f'invalid flags {flags!r} in {name!r}' + raise ImportError(message, **exc_details) + return flags + + +def _validate_timestamp_pyc(data, source_mtime, source_size, name, + exc_details): + """Validate a pyc against the source last-modified time. + + *data* is the contents of the pyc file. (Only the first 16 bytes are + required.) + + *source_mtime* is the last modified timestamp of the source file. + + *source_size* is None or the size of the source file in bytes. + + *name* is the name of the module being imported. It is used for logging. + + *exc_details* is a dictionary passed to ImportError if it raised for + improved debugging. + + An ImportError is raised if the bytecode is stale. + + """ + if _r_long(data[8:12]) != (source_mtime & 0xFFFFFFFF): + message = f'bytecode is stale for {name!r}' + _bootstrap._verbose_message('{}', message) + raise ImportError(message, **exc_details) + if (source_size is not None and + _r_long(data[12:16]) != (source_size & 0xFFFFFFFF)): + raise ImportError(f'bytecode is stale for {name!r}', **exc_details) + + +def _validate_hash_pyc(data, source_hash, name, exc_details): + """Validate a hash-based pyc by checking the real source hash against the one in + the pyc header. + + *data* is the contents of the pyc file. (Only the first 16 bytes are + required.) + + *source_hash* is the importlib.util.source_hash() of the source file. + + *name* is the name of the module being imported. It is used for logging. + + *exc_details* is a dictionary passed to ImportError if it raised for + improved debugging. + + An ImportError is raised if the bytecode is stale. + + """ + if data[8:16] != source_hash: + raise ImportError( + f'hash in bytecode doesn\'t match hash of source {name!r}', + **exc_details, + ) + + +def _compile_bytecode(data, name=None, bytecode_path=None, source_path=None): + """Compile bytecode as found in a pyc.""" + code = marshal.loads(data) + if isinstance(code, _code_type): + _bootstrap._verbose_message('code object from {!r}', bytecode_path) + if source_path is not None: + _imp._fix_co_filename(code, source_path) + return code + else: + raise ImportError('Non-code object in {!r}'.format(bytecode_path), + name=name, path=bytecode_path) + + +def _code_to_timestamp_pyc(code, mtime=0, source_size=0): + "Produce the data for a timestamp-based pyc." + data = bytearray(MAGIC_NUMBER) + data.extend(_w_long(0)) + data.extend(_w_long(mtime)) + data.extend(_w_long(source_size)) + data.extend(marshal.dumps(code)) + return data + + +def _code_to_hash_pyc(code, source_hash, checked=True): + "Produce the data for a hash-based pyc." + data = bytearray(MAGIC_NUMBER) + flags = 0b1 | checked << 1 + data.extend(_w_long(flags)) + assert len(source_hash) == 8 + data.extend(source_hash) + data.extend(marshal.dumps(code)) + return data + + +def decode_source(source_bytes): + """Decode bytes representing source code and return the string. + + Universal newline support is used in the decoding. + """ + import tokenize # To avoid bootstrap issues. + source_bytes_readline = _io.BytesIO(source_bytes).readline + encoding = tokenize.detect_encoding(source_bytes_readline) + newline_decoder = _io.IncrementalNewlineDecoder(None, True) + return newline_decoder.decode(source_bytes.decode(encoding[0])) + + +# Module specifications ####################################################### + +_POPULATE = object() + + +def spec_from_file_location(name, location=None, *, loader=None, + submodule_search_locations=_POPULATE): + """Return a module spec based on a file location. + + To indicate that the module is a package, set + submodule_search_locations to a list of directory paths. An + empty list is sufficient, though its not otherwise useful to the + import system. + + The loader must take a spec as its only __init__() arg. + + """ + if location is None: + # The caller may simply want a partially populated location- + # oriented spec. So we set the location to a bogus value and + # fill in as much as we can. + location = '' + if hasattr(loader, 'get_filename'): + # ExecutionLoader + try: + location = loader.get_filename(name) + except ImportError: + pass + else: + location = _os.fspath(location) + + # If the location is on the filesystem, but doesn't actually exist, + # we could return None here, indicating that the location is not + # valid. However, we don't have a good way of testing since an + # indirect location (e.g. a zip file or URL) will look like a + # non-existent file relative to the filesystem. + + spec = _bootstrap.ModuleSpec(name, loader, origin=location) + spec._set_fileattr = True + + # Pick a loader if one wasn't provided. + if loader is None: + for loader_class, suffixes in _get_supported_file_loaders(): + if location.endswith(tuple(suffixes)): + loader = loader_class(name, location) + spec.loader = loader + break + else: + return None + + # Set submodule_search_paths appropriately. + if submodule_search_locations is _POPULATE: + # Check the loader. + if hasattr(loader, 'is_package'): + try: + is_package = loader.is_package(name) + except ImportError: + pass + else: + if is_package: + spec.submodule_search_locations = [] + else: + spec.submodule_search_locations = submodule_search_locations + if spec.submodule_search_locations == []: + if location: + dirname = _path_split(location)[0] + spec.submodule_search_locations.append(dirname) + + return spec + + +# Loaders ##################################################################### + +class WindowsRegistryFinder: + + """Meta path finder for modules declared in the Windows registry.""" + + REGISTRY_KEY = ( + 'Software\\Python\\PythonCore\\{sys_version}' + '\\Modules\\{fullname}') + REGISTRY_KEY_DEBUG = ( + 'Software\\Python\\PythonCore\\{sys_version}' + '\\Modules\\{fullname}\\Debug') + DEBUG_BUILD = False # Changed in _setup() + + @classmethod + def _open_registry(cls, key): + try: + return _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, key) + except OSError: + return _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key) + + @classmethod + def _search_registry(cls, fullname): + if cls.DEBUG_BUILD: + registry_key = cls.REGISTRY_KEY_DEBUG + else: + registry_key = cls.REGISTRY_KEY + key = registry_key.format(fullname=fullname, + sys_version='%d.%d' % sys.version_info[:2]) + try: + with cls._open_registry(key) as hkey: + filepath = _winreg.QueryValue(hkey, '') + except OSError: + return None + return filepath + + @classmethod + def find_spec(cls, fullname, path=None, target=None): + filepath = cls._search_registry(fullname) + if filepath is None: + return None + try: + _path_stat(filepath) + except OSError: + return None + for loader, suffixes in _get_supported_file_loaders(): + if filepath.endswith(tuple(suffixes)): + spec = _bootstrap.spec_from_loader(fullname, + loader(fullname, filepath), + origin=filepath) + return spec + + @classmethod + def find_module(cls, fullname, path=None): + """Find module named in the registry. + + This method is deprecated. Use exec_module() instead. + + """ + spec = cls.find_spec(fullname, path) + if spec is not None: + return spec.loader + else: + return None + + +class _LoaderBasics: + + """Base class of common code needed by both SourceLoader and + SourcelessFileLoader.""" + + def is_package(self, fullname): + """Concrete implementation of InspectLoader.is_package by checking if + the path returned by get_filename has a filename of '__init__.py'.""" + filename = _path_split(self.get_filename(fullname))[1] + filename_base = filename.rsplit('.', 1)[0] + tail_name = fullname.rpartition('.')[2] + return filename_base == '__init__' and tail_name != '__init__' + + def create_module(self, spec): + """Use default semantics for module creation.""" + + def exec_module(self, module): + """Execute the module.""" + code = self.get_code(module.__name__) + if code is None: + raise ImportError('cannot load module {!r} when get_code() ' + 'returns None'.format(module.__name__)) + _bootstrap._call_with_frames_removed(exec, code, module.__dict__) + + def load_module(self, fullname): + """This module is deprecated.""" + return _bootstrap._load_module_shim(self, fullname) + + +class SourceLoader(_LoaderBasics): + + def path_mtime(self, path): + """Optional method that returns the modification time (an int) for the + specified path, where path is a str. + + Raises OSError when the path cannot be handled. + """ + raise OSError + + def path_stats(self, path): + """Optional method returning a metadata dict for the specified path + to by the path (str). + Possible keys: + - 'mtime' (mandatory) is the numeric timestamp of last source + code modification; + - 'size' (optional) is the size in bytes of the source code. + + Implementing this method allows the loader to read bytecode files. + Raises OSError when the path cannot be handled. + """ + return {'mtime': self.path_mtime(path)} + + def _cache_bytecode(self, source_path, cache_path, data): + """Optional method which writes data (bytes) to a file path (a str). + + Implementing this method allows for the writing of bytecode files. + + The source path is needed in order to correctly transfer permissions + """ + # For backwards compatibility, we delegate to set_data() + return self.set_data(cache_path, data) + + def set_data(self, path, data): + """Optional method which writes data (bytes) to a file path (a str). + + Implementing this method allows for the writing of bytecode files. + """ + + + def get_source(self, fullname): + """Concrete implementation of InspectLoader.get_source.""" + path = self.get_filename(fullname) + try: + source_bytes = self.get_data(path) + except OSError as exc: + raise ImportError('source not available through get_data()', + name=fullname) from exc + return decode_source(source_bytes) + + def source_to_code(self, data, path, *, _optimize=-1): + """Return the code object compiled from source. + + The 'data' argument can be any object type that compile() supports. + """ + return _bootstrap._call_with_frames_removed(compile, data, path, 'exec', + dont_inherit=True, optimize=_optimize) + + def get_code(self, fullname): + """Concrete implementation of InspectLoader.get_code. + + Reading of bytecode requires path_stats to be implemented. To write + bytecode, set_data must also be implemented. + + """ + source_path = self.get_filename(fullname) + source_mtime = None + source_bytes = None + source_hash = None + hash_based = False + check_source = True + try: + bytecode_path = cache_from_source(source_path) + except NotImplementedError: + bytecode_path = None + else: + try: + st = self.path_stats(source_path) + except OSError: + pass + else: + source_mtime = int(st['mtime']) + try: + data = self.get_data(bytecode_path) + except OSError: + pass + else: + exc_details = { + 'name': fullname, + 'path': bytecode_path, + } + try: + flags = _classify_pyc(data, fullname, exc_details) + bytes_data = memoryview(data)[16:] + hash_based = flags & 0b1 != 0 + if hash_based: + check_source = flags & 0b10 != 0 + if (_imp.check_hash_based_pycs != 'never' and + (check_source or + _imp.check_hash_based_pycs == 'always')): + source_bytes = self.get_data(source_path) + source_hash = _imp.source_hash( + _RAW_MAGIC_NUMBER, + source_bytes, + ) + _validate_hash_pyc(data, source_hash, fullname, + exc_details) + else: + _validate_timestamp_pyc( + data, + source_mtime, + st['size'], + fullname, + exc_details, + ) + except (ImportError, EOFError): + pass + else: + _bootstrap._verbose_message('{} matches {}', bytecode_path, + source_path) + return _compile_bytecode(bytes_data, name=fullname, + bytecode_path=bytecode_path, + source_path=source_path) + if source_bytes is None: + source_bytes = self.get_data(source_path) + code_object = self.source_to_code(source_bytes, source_path) + _bootstrap._verbose_message('code object from {}', source_path) + if (not sys.dont_write_bytecode and bytecode_path is not None and + source_mtime is not None): + if hash_based: + if source_hash is None: + source_hash = _imp.source_hash(source_bytes) + data = _code_to_hash_pyc(code_object, source_hash, check_source) + else: + data = _code_to_timestamp_pyc(code_object, source_mtime, + len(source_bytes)) + try: + self._cache_bytecode(source_path, bytecode_path, data) + _bootstrap._verbose_message('wrote {!r}', bytecode_path) + except NotImplementedError: + pass + return code_object + + +class FileLoader: + + """Base file loader class which implements the loader protocol methods that + require file system usage.""" + + def __init__(self, fullname, path): + """Cache the module name and the path to the file found by the + finder.""" + self.name = fullname + self.path = path + + def __eq__(self, other): + return (self.__class__ == other.__class__ and + self.__dict__ == other.__dict__) + + def __hash__(self): + return hash(self.name) ^ hash(self.path) + + @_check_name + def load_module(self, fullname): + """Load a module from a file. + + This method is deprecated. Use exec_module() instead. + + """ + # The only reason for this method is for the name check. + # Issue #14857: Avoid the zero-argument form of super so the implementation + # of that form can be updated without breaking the frozen module + return super(FileLoader, self).load_module(fullname) + + @_check_name + def get_filename(self, fullname): + """Return the path to the source file as found by the finder.""" + return self.path + + def get_data(self, path): + """Return the data from path as raw bytes.""" + with _io.FileIO(path, 'r') as file: + return file.read() + + # ResourceReader ABC API. + + @_check_name + def get_resource_reader(self, module): + if self.is_package(module): + return self + return None + + def open_resource(self, resource): + path = _path_join(_path_split(self.path)[0], resource) + return _io.FileIO(path, 'r') + + def resource_path(self, resource): + if not self.is_resource(resource): + raise FileNotFoundError + path = _path_join(_path_split(self.path)[0], resource) + return path + + def is_resource(self, name): + if path_sep in name: + return False + path = _path_join(_path_split(self.path)[0], name) + return _path_isfile(path) + + def contents(self): + return iter(_os.listdir(_path_split(self.path)[0])) + + +class SourceFileLoader(FileLoader, SourceLoader): + + """Concrete implementation of SourceLoader using the file system.""" + + def path_stats(self, path): + """Return the metadata for the path.""" + st = _path_stat(path) + return {'mtime': st.st_mtime, 'size': st.st_size} + + def _cache_bytecode(self, source_path, bytecode_path, data): + # Adapt between the two APIs + mode = _calc_mode(source_path) + return self.set_data(bytecode_path, data, _mode=mode) + + def set_data(self, path, data, *, _mode=0o666): + """Write bytes data to a file.""" + parent, filename = _path_split(path) + path_parts = [] + # Figure out what directories are missing. + while parent and not _path_isdir(parent): + parent, part = _path_split(parent) + path_parts.append(part) + # Create needed directories. + for part in reversed(path_parts): + parent = _path_join(parent, part) + try: + _os.mkdir(parent) + except FileExistsError: + # Probably another Python process already created the dir. + continue + except OSError as exc: + # Could be a permission error, read-only filesystem: just forget + # about writing the data. + _bootstrap._verbose_message('could not create {!r}: {!r}', + parent, exc) + return + try: + _write_atomic(path, data, _mode) + _bootstrap._verbose_message('created {!r}', path) + except OSError as exc: + # Same as above: just don't write the bytecode. + _bootstrap._verbose_message('could not create {!r}: {!r}', path, + exc) + + +class SourcelessFileLoader(FileLoader, _LoaderBasics): + + """Loader which handles sourceless file imports.""" + + def get_code(self, fullname): + path = self.get_filename(fullname) + data = self.get_data(path) + # Call _classify_pyc to do basic validation of the pyc but ignore the + # result. There's no source to check against. + exc_details = { + 'name': fullname, + 'path': path, + } + _classify_pyc(data, fullname, exc_details) + return _compile_bytecode( + memoryview(data)[16:], + name=fullname, + bytecode_path=path, + ) + + def get_source(self, fullname): + """Return None as there is no source code.""" + return None + + +# Filled in by _setup(). +EXTENSION_SUFFIXES = [] + + +class ExtensionFileLoader(FileLoader, _LoaderBasics): + + """Loader for extension modules. + + The constructor is designed to work with FileFinder. + + """ + + def __init__(self, name, path): + self.name = name + self.path = path + + def __eq__(self, other): + return (self.__class__ == other.__class__ and + self.__dict__ == other.__dict__) + + def __hash__(self): + return hash(self.name) ^ hash(self.path) + + def create_module(self, spec): + """Create an unitialized extension module""" + module = _bootstrap._call_with_frames_removed( + _imp.create_dynamic, spec) + _bootstrap._verbose_message('extension module {!r} loaded from {!r}', + spec.name, self.path) + return module + + def exec_module(self, module): + """Initialize an extension module""" + _bootstrap._call_with_frames_removed(_imp.exec_dynamic, module) + _bootstrap._verbose_message('extension module {!r} executed from {!r}', + self.name, self.path) + + def is_package(self, fullname): + """Return True if the extension module is a package.""" + file_name = _path_split(self.path)[1] + return any(file_name == '__init__' + suffix + for suffix in EXTENSION_SUFFIXES) + + def get_code(self, fullname): + """Return None as an extension module cannot create a code object.""" + return None + + def get_source(self, fullname): + """Return None as extension modules have no source code.""" + return None + + @_check_name + def get_filename(self, fullname): + """Return the path to the source file as found by the finder.""" + return self.path + + +class _NamespacePath: + """Represents a namespace package's path. It uses the module name + to find its parent module, and from there it looks up the parent's + __path__. When this changes, the module's own path is recomputed, + using path_finder. For top-level modules, the parent module's path + is sys.path.""" + + def __init__(self, name, path, path_finder): + self._name = name + self._path = path + self._last_parent_path = tuple(self._get_parent_path()) + self._path_finder = path_finder + + def _find_parent_path_names(self): + """Returns a tuple of (parent-module-name, parent-path-attr-name)""" + parent, dot, me = self._name.rpartition('.') + if dot == '': + # This is a top-level module. sys.path contains the parent path. + return 'sys', 'path' + # Not a top-level module. parent-module.__path__ contains the + # parent path. + return parent, '__path__' + + def _get_parent_path(self): + parent_module_name, path_attr_name = self._find_parent_path_names() + return getattr(sys.modules[parent_module_name], path_attr_name) + + def _recalculate(self): + # If the parent's path has changed, recalculate _path + parent_path = tuple(self._get_parent_path()) # Make a copy + if parent_path != self._last_parent_path: + spec = self._path_finder(self._name, parent_path) + # Note that no changes are made if a loader is returned, but we + # do remember the new parent path + if spec is not None and spec.loader is None: + if spec.submodule_search_locations: + self._path = spec.submodule_search_locations + self._last_parent_path = parent_path # Save the copy + return self._path + + def __iter__(self): + return iter(self._recalculate()) + + def __setitem__(self, index, path): + self._path[index] = path + + def __len__(self): + return len(self._recalculate()) + + def __repr__(self): + return '_NamespacePath({!r})'.format(self._path) + + def __contains__(self, item): + return item in self._recalculate() + + def append(self, item): + self._path.append(item) + + +# We use this exclusively in module_from_spec() for backward-compatibility. +class _NamespaceLoader: + def __init__(self, name, path, path_finder): + self._path = _NamespacePath(name, path, path_finder) + + @classmethod + def module_repr(cls, module): + """Return repr for the module. + + The method is deprecated. The import machinery does the job itself. + + """ + return ''.format(module.__name__) + + def is_package(self, fullname): + return True + + def get_source(self, fullname): + return '' + + def get_code(self, fullname): + return compile('', '', 'exec', dont_inherit=True) + + def create_module(self, spec): + """Use default semantics for module creation.""" + + def exec_module(self, module): + pass + + def load_module(self, fullname): + """Load a namespace module. + + This method is deprecated. Use exec_module() instead. + + """ + # The import system never calls this method. + _bootstrap._verbose_message('namespace module loaded with path {!r}', + self._path) + return _bootstrap._load_module_shim(self, fullname) + + +# Finders ##################################################################### + +class PathFinder: + + """Meta path finder for sys.path and package __path__ attributes.""" + + @classmethod + def invalidate_caches(cls): + """Call the invalidate_caches() method on all path entry finders + stored in sys.path_importer_caches (where implemented).""" + for name, finder in list(sys.path_importer_cache.items()): + if finder is None: + del sys.path_importer_cache[name] + elif hasattr(finder, 'invalidate_caches'): + finder.invalidate_caches() + + @classmethod + def _path_hooks(cls, path): + """Search sys.path_hooks for a finder for 'path'.""" + if sys.path_hooks is not None and not sys.path_hooks: + _warnings.warn('sys.path_hooks is empty', ImportWarning) + for hook in sys.path_hooks: + try: + return hook(path) + except ImportError: + continue + else: + return None + + @classmethod + def _path_importer_cache(cls, path): + """Get the finder for the path entry from sys.path_importer_cache. + + If the path entry is not in the cache, find the appropriate finder + and cache it. If no finder is available, store None. + + """ + if path == '': + try: + path = _os.getcwd() + except FileNotFoundError: + # Don't cache the failure as the cwd can easily change to + # a valid directory later on. + return None + try: + finder = sys.path_importer_cache[path] + except KeyError: + finder = cls._path_hooks(path) + sys.path_importer_cache[path] = finder + return finder + + @classmethod + def _legacy_get_spec(cls, fullname, finder): + # This would be a good place for a DeprecationWarning if + # we ended up going that route. + if hasattr(finder, 'find_loader'): + loader, portions = finder.find_loader(fullname) + else: + loader = finder.find_module(fullname) + portions = [] + if loader is not None: + return _bootstrap.spec_from_loader(fullname, loader) + spec = _bootstrap.ModuleSpec(fullname, None) + spec.submodule_search_locations = portions + return spec + + @classmethod + def _get_spec(cls, fullname, path, target=None): + """Find the loader or namespace_path for this module/package name.""" + # If this ends up being a namespace package, namespace_path is + # the list of paths that will become its __path__ + namespace_path = [] + for entry in path: + if not isinstance(entry, (str, bytes)): + continue + finder = cls._path_importer_cache(entry) + if finder is not None: + if hasattr(finder, 'find_spec'): + spec = finder.find_spec(fullname, target) + else: + spec = cls._legacy_get_spec(fullname, finder) + if spec is None: + continue + if spec.loader is not None: + return spec + portions = spec.submodule_search_locations + if portions is None: + raise ImportError('spec missing loader') + # This is possibly part of a namespace package. + # Remember these path entries (if any) for when we + # create a namespace package, and continue iterating + # on path. + namespace_path.extend(portions) + else: + spec = _bootstrap.ModuleSpec(fullname, None) + spec.submodule_search_locations = namespace_path + return spec + + @classmethod + def find_spec(cls, fullname, path=None, target=None): + """Try to find a spec for 'fullname' on sys.path or 'path'. + + The search is based on sys.path_hooks and sys.path_importer_cache. + """ + if path is None: + path = sys.path + spec = cls._get_spec(fullname, path, target) + if spec is None: + return None + elif spec.loader is None: + namespace_path = spec.submodule_search_locations + if namespace_path: + # We found at least one namespace path. Return a spec which + # can create the namespace package. + spec.origin = None + spec.submodule_search_locations = _NamespacePath(fullname, namespace_path, cls._get_spec) + return spec + else: + return None + else: + return spec + + @classmethod + def find_module(cls, fullname, path=None): + """find the module on sys.path or 'path' based on sys.path_hooks and + sys.path_importer_cache. + + This method is deprecated. Use find_spec() instead. + + """ + spec = cls.find_spec(fullname, path) + if spec is None: + return None + return spec.loader + + +class FileFinder: + + """File-based finder. + + Interactions with the file system are cached for performance, being + refreshed when the directory the finder is handling has been modified. + + """ + + def __init__(self, path, *loader_details): + """Initialize with the path to search on and a variable number of + 2-tuples containing the loader and the file suffixes the loader + recognizes.""" + loaders = [] + for loader, suffixes in loader_details: + loaders.extend((suffix, loader) for suffix in suffixes) + self._loaders = loaders + # Base (directory) path + self.path = path or '.' + self._path_mtime = -1 + self._path_cache = set() + self._relaxed_path_cache = set() + + def invalidate_caches(self): + """Invalidate the directory mtime.""" + self._path_mtime = -1 + + find_module = _find_module_shim + + def find_loader(self, fullname): + """Try to find a loader for the specified module, or the namespace + package portions. Returns (loader, list-of-portions). + + This method is deprecated. Use find_spec() instead. + + """ + spec = self.find_spec(fullname) + if spec is None: + return None, [] + return spec.loader, spec.submodule_search_locations or [] + + def _get_spec(self, loader_class, fullname, path, smsl, target): + loader = loader_class(fullname, path) + return spec_from_file_location(fullname, path, loader=loader, + submodule_search_locations=smsl) + + def find_spec(self, fullname, target=None): + """Try to find a spec for the specified module. + + Returns the matching spec, or None if not found. + """ + is_namespace = False + tail_module = fullname.rpartition('.')[2] + try: + mtime = _path_stat(self.path or _os.getcwd()).st_mtime + except OSError: + mtime = -1 + if mtime != self._path_mtime: + self._fill_cache() + self._path_mtime = mtime + # tail_module keeps the original casing, for __file__ and friends + if _relax_case(): + cache = self._relaxed_path_cache + cache_module = tail_module.lower() + else: + cache = self._path_cache + cache_module = tail_module + # Check if the module is the name of a directory (and thus a package). + if cache_module in cache: + base_path = _path_join(self.path, tail_module) + for suffix, loader_class in self._loaders: + init_filename = '__init__' + suffix + full_path = _path_join(base_path, init_filename) + if _path_isfile(full_path): + return self._get_spec(loader_class, fullname, full_path, [base_path], target) + else: + # If a namespace package, return the path if we don't + # find a module in the next section. + is_namespace = _path_isdir(base_path) + # Check for a file w/ a proper suffix exists. + for suffix, loader_class in self._loaders: + full_path = _path_join(self.path, tail_module + suffix) + _bootstrap._verbose_message('trying {}', full_path, verbosity=2) + if cache_module + suffix in cache: + if _path_isfile(full_path): + return self._get_spec(loader_class, fullname, full_path, + None, target) + if is_namespace: + _bootstrap._verbose_message('possible namespace for {}', base_path) + spec = _bootstrap.ModuleSpec(fullname, None) + spec.submodule_search_locations = [base_path] + return spec + return None + + def _fill_cache(self): + """Fill the cache of potential modules and packages for this directory.""" + path = self.path + try: + contents = _os.listdir(path or _os.getcwd()) + except (FileNotFoundError, PermissionError, NotADirectoryError): + # Directory has either been removed, turned into a file, or made + # unreadable. + contents = [] + # We store two cached versions, to handle runtime changes of the + # PYTHONCASEOK environment variable. + if not sys.platform.startswith('win'): + self._path_cache = set(contents) + else: + # Windows users can import modules with case-insensitive file + # suffixes (for legacy reasons). Make the suffix lowercase here + # so it's done once instead of for every import. This is safe as + # the specified suffixes to check against are always specified in a + # case-sensitive manner. + lower_suffix_contents = set() + for item in contents: + name, dot, suffix = item.partition('.') + if dot: + new_name = '{}.{}'.format(name, suffix.lower()) + else: + new_name = name + lower_suffix_contents.add(new_name) + self._path_cache = lower_suffix_contents + if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS): + self._relaxed_path_cache = {fn.lower() for fn in contents} + + @classmethod + def path_hook(cls, *loader_details): + """A class method which returns a closure to use on sys.path_hook + which will return an instance using the specified loaders and the path + called on the closure. + + If the path called on the closure is not a directory, ImportError is + raised. + + """ + def path_hook_for_FileFinder(path): + """Path hook for importlib.machinery.FileFinder.""" + if not _path_isdir(path): + raise ImportError('only directories are supported', path=path) + return cls(path, *loader_details) + + return path_hook_for_FileFinder + + def __repr__(self): + return 'FileFinder({!r})'.format(self.path) + + +# Import setup ############################################################### + +def _fix_up_module(ns, name, pathname, cpathname=None): + # This function is used by PyImport_ExecCodeModuleObject(). + loader = ns.get('__loader__') + spec = ns.get('__spec__') + if not loader: + if spec: + loader = spec.loader + elif pathname == cpathname: + loader = SourcelessFileLoader(name, pathname) + else: + loader = SourceFileLoader(name, pathname) + if not spec: + spec = spec_from_file_location(name, pathname, loader=loader) + try: + ns['__spec__'] = spec + ns['__loader__'] = loader + ns['__file__'] = pathname + ns['__cached__'] = cpathname + except Exception: + # Not important enough to report. + pass + + +def _get_supported_file_loaders(): + """Returns a list of file-based module loaders. + + Each item is a tuple (loader, suffixes). + """ + extensions = ExtensionFileLoader, _imp.extension_suffixes() + source = SourceFileLoader, SOURCE_SUFFIXES + bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES + return [extensions, source, bytecode] + + +def _setup(_bootstrap_module): + """Setup the path-based importers for importlib by importing needed + built-in modules and injecting them into the global namespace. + + Other components are extracted from the core bootstrap module. + + """ + global sys, _imp, _bootstrap + _bootstrap = _bootstrap_module + sys = _bootstrap.sys + _imp = _bootstrap._imp + + # Directly load built-in modules needed during bootstrap. + self_module = sys.modules[__name__] + for builtin_name in ('_io', '_warnings', 'builtins', 'marshal'): + if builtin_name not in sys.modules: + builtin_module = _bootstrap._builtin_from_name(builtin_name) + else: + builtin_module = sys.modules[builtin_name] + setattr(self_module, builtin_name, builtin_module) + + # Directly load the os module (needed during bootstrap). + os_details = ('posix', ['/']), ('nt', ['\\', '/']) + for builtin_os, path_separators in os_details: + # Assumption made in _path_join() + assert all(len(sep) == 1 for sep in path_separators) + path_sep = path_separators[0] + if builtin_os in sys.modules: + os_module = sys.modules[builtin_os] + break + else: + try: + os_module = _bootstrap._builtin_from_name(builtin_os) + break + except ImportError: + continue + else: + raise ImportError('importlib requires posix or nt') + setattr(self_module, '_os', os_module) + setattr(self_module, 'path_sep', path_sep) + setattr(self_module, 'path_separators', ''.join(path_separators)) + + # Directly load the _thread module (needed during bootstrap). + thread_module = _bootstrap._builtin_from_name('_thread') + setattr(self_module, '_thread', thread_module) + + # Directly load the _weakref module (needed during bootstrap). + weakref_module = _bootstrap._builtin_from_name('_weakref') + setattr(self_module, '_weakref', weakref_module) + + # Directly load the winreg module (needed during bootstrap). + if builtin_os == 'nt': + winreg_module = _bootstrap._builtin_from_name('winreg') + setattr(self_module, '_winreg', winreg_module) + + # Constants + setattr(self_module, '_relax_case', _make_relax_case()) + EXTENSION_SUFFIXES.extend(_imp.extension_suffixes()) + if builtin_os == 'nt': + SOURCE_SUFFIXES.append('.pyw') + if '_d.pyd' in EXTENSION_SUFFIXES: + WindowsRegistryFinder.DEBUG_BUILD = True + + +def _install(_bootstrap_module): + """Install the path-based import components.""" + _setup(_bootstrap_module) + supported_loaders = _get_supported_file_loaders() + sys.path_hooks.extend([FileFinder.path_hook(*supported_loaders)]) + sys.meta_path.append(PathFinder) diff --git a/venv/Lib/importlib/abc.py b/venv/Lib/importlib/abc.py new file mode 100644 index 00000000..dbdd5bf6 --- /dev/null +++ b/venv/Lib/importlib/abc.py @@ -0,0 +1,388 @@ +"""Abstract base classes related to import.""" +from . import _bootstrap +from . import _bootstrap_external +from . import machinery +try: + import _frozen_importlib +except ImportError as exc: + if exc.name != '_frozen_importlib': + raise + _frozen_importlib = None +try: + import _frozen_importlib_external +except ImportError as exc: + _frozen_importlib_external = _bootstrap_external +import abc +import warnings + + +def _register(abstract_cls, *classes): + for cls in classes: + abstract_cls.register(cls) + if _frozen_importlib is not None: + try: + frozen_cls = getattr(_frozen_importlib, cls.__name__) + except AttributeError: + frozen_cls = getattr(_frozen_importlib_external, cls.__name__) + abstract_cls.register(frozen_cls) + + +class Finder(metaclass=abc.ABCMeta): + + """Legacy abstract base class for import finders. + + It may be subclassed for compatibility with legacy third party + reimplementations of the import system. Otherwise, finder + implementations should derive from the more specific MetaPathFinder + or PathEntryFinder ABCs. + + Deprecated since Python 3.3 + """ + + @abc.abstractmethod + def find_module(self, fullname, path=None): + """An abstract method that should find a module. + The fullname is a str and the optional path is a str or None. + Returns a Loader object or None. + """ + + +class MetaPathFinder(Finder): + + """Abstract base class for import finders on sys.meta_path.""" + + # We don't define find_spec() here since that would break + # hasattr checks we do to support backward compatibility. + + def find_module(self, fullname, path): + """Return a loader for the module. + + If no module is found, return None. The fullname is a str and + the path is a list of strings or None. + + This method is deprecated since Python 3.4 in favor of + finder.find_spec(). If find_spec() exists then backwards-compatible + functionality is provided for this method. + + """ + warnings.warn("MetaPathFinder.find_module() is deprecated since Python " + "3.4 in favor of MetaPathFinder.find_spec()" + "(available since 3.4)", + DeprecationWarning, + stacklevel=2) + if not hasattr(self, 'find_spec'): + return None + found = self.find_spec(fullname, path) + return found.loader if found is not None else None + + def invalidate_caches(self): + """An optional method for clearing the finder's cache, if any. + This method is used by importlib.invalidate_caches(). + """ + +_register(MetaPathFinder, machinery.BuiltinImporter, machinery.FrozenImporter, + machinery.PathFinder, machinery.WindowsRegistryFinder) + + +class PathEntryFinder(Finder): + + """Abstract base class for path entry finders used by PathFinder.""" + + # We don't define find_spec() here since that would break + # hasattr checks we do to support backward compatibility. + + def find_loader(self, fullname): + """Return (loader, namespace portion) for the path entry. + + The fullname is a str. The namespace portion is a sequence of + path entries contributing to part of a namespace package. The + sequence may be empty. If loader is not None, the portion will + be ignored. + + The portion will be discarded if another path entry finder + locates the module as a normal module or package. + + This method is deprecated since Python 3.4 in favor of + finder.find_spec(). If find_spec() is provided than backwards-compatible + functionality is provided. + """ + warnings.warn("PathEntryFinder.find_loader() is deprecated since Python " + "3.4 in favor of PathEntryFinder.find_spec() " + "(available since 3.4)", + DeprecationWarning, + stacklevel=2) + if not hasattr(self, 'find_spec'): + return None, [] + found = self.find_spec(fullname) + if found is not None: + if not found.submodule_search_locations: + portions = [] + else: + portions = found.submodule_search_locations + return found.loader, portions + else: + return None, [] + + find_module = _bootstrap_external._find_module_shim + + def invalidate_caches(self): + """An optional method for clearing the finder's cache, if any. + This method is used by PathFinder.invalidate_caches(). + """ + +_register(PathEntryFinder, machinery.FileFinder) + + +class Loader(metaclass=abc.ABCMeta): + + """Abstract base class for import loaders.""" + + def create_module(self, spec): + """Return a module to initialize and into which to load. + + This method should raise ImportError if anything prevents it + from creating a new module. It may return None to indicate + that the spec should create the new module. + """ + # By default, defer to default semantics for the new module. + return None + + # We don't define exec_module() here since that would break + # hasattr checks we do to support backward compatibility. + + def load_module(self, fullname): + """Return the loaded module. + + The module must be added to sys.modules and have import-related + attributes set properly. The fullname is a str. + + ImportError is raised on failure. + + This method is deprecated in favor of loader.exec_module(). If + exec_module() exists then it is used to provide a backwards-compatible + functionality for this method. + + """ + if not hasattr(self, 'exec_module'): + raise ImportError + return _bootstrap._load_module_shim(self, fullname) + + def module_repr(self, module): + """Return a module's repr. + + Used by the module type when the method does not raise + NotImplementedError. + + This method is deprecated. + + """ + # The exception will cause ModuleType.__repr__ to ignore this method. + raise NotImplementedError + + +class ResourceLoader(Loader): + + """Abstract base class for loaders which can return data from their + back-end storage. + + This ABC represents one of the optional protocols specified by PEP 302. + + """ + + @abc.abstractmethod + def get_data(self, path): + """Abstract method which when implemented should return the bytes for + the specified path. The path must be a str.""" + raise OSError + + +class InspectLoader(Loader): + + """Abstract base class for loaders which support inspection about the + modules they can load. + + This ABC represents one of the optional protocols specified by PEP 302. + + """ + + def is_package(self, fullname): + """Optional method which when implemented should return whether the + module is a package. The fullname is a str. Returns a bool. + + Raises ImportError if the module cannot be found. + """ + raise ImportError + + def get_code(self, fullname): + """Method which returns the code object for the module. + + The fullname is a str. Returns a types.CodeType if possible, else + returns None if a code object does not make sense + (e.g. built-in module). Raises ImportError if the module cannot be + found. + """ + source = self.get_source(fullname) + if source is None: + return None + return self.source_to_code(source) + + @abc.abstractmethod + def get_source(self, fullname): + """Abstract method which should return the source code for the + module. The fullname is a str. Returns a str. + + Raises ImportError if the module cannot be found. + """ + raise ImportError + + @staticmethod + def source_to_code(data, path=''): + """Compile 'data' into a code object. + + The 'data' argument can be anything that compile() can handle. The'path' + argument should be where the data was retrieved (when applicable).""" + return compile(data, path, 'exec', dont_inherit=True) + + exec_module = _bootstrap_external._LoaderBasics.exec_module + load_module = _bootstrap_external._LoaderBasics.load_module + +_register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter) + + +class ExecutionLoader(InspectLoader): + + """Abstract base class for loaders that wish to support the execution of + modules as scripts. + + This ABC represents one of the optional protocols specified in PEP 302. + + """ + + @abc.abstractmethod + def get_filename(self, fullname): + """Abstract method which should return the value that __file__ is to be + set to. + + Raises ImportError if the module cannot be found. + """ + raise ImportError + + def get_code(self, fullname): + """Method to return the code object for fullname. + + Should return None if not applicable (e.g. built-in module). + Raise ImportError if the module cannot be found. + """ + source = self.get_source(fullname) + if source is None: + return None + try: + path = self.get_filename(fullname) + except ImportError: + return self.source_to_code(source) + else: + return self.source_to_code(source, path) + +_register(ExecutionLoader, machinery.ExtensionFileLoader) + + +class FileLoader(_bootstrap_external.FileLoader, ResourceLoader, ExecutionLoader): + + """Abstract base class partially implementing the ResourceLoader and + ExecutionLoader ABCs.""" + +_register(FileLoader, machinery.SourceFileLoader, + machinery.SourcelessFileLoader) + + +class SourceLoader(_bootstrap_external.SourceLoader, ResourceLoader, ExecutionLoader): + + """Abstract base class for loading source code (and optionally any + corresponding bytecode). + + To support loading from source code, the abstractmethods inherited from + ResourceLoader and ExecutionLoader need to be implemented. To also support + loading from bytecode, the optional methods specified directly by this ABC + is required. + + Inherited abstractmethods not implemented in this ABC: + + * ResourceLoader.get_data + * ExecutionLoader.get_filename + + """ + + def path_mtime(self, path): + """Return the (int) modification time for the path (str).""" + if self.path_stats.__func__ is SourceLoader.path_stats: + raise OSError + return int(self.path_stats(path)['mtime']) + + def path_stats(self, path): + """Return a metadata dict for the source pointed to by the path (str). + Possible keys: + - 'mtime' (mandatory) is the numeric timestamp of last source + code modification; + - 'size' (optional) is the size in bytes of the source code. + """ + if self.path_mtime.__func__ is SourceLoader.path_mtime: + raise OSError + return {'mtime': self.path_mtime(path)} + + def set_data(self, path, data): + """Write the bytes to the path (if possible). + + Accepts a str path and data as bytes. + + Any needed intermediary directories are to be created. If for some + reason the file cannot be written because of permissions, fail + silently. + """ + +_register(SourceLoader, machinery.SourceFileLoader) + + +class ResourceReader(metaclass=abc.ABCMeta): + + """Abstract base class to provide resource-reading support. + + Loaders that support resource reading are expected to implement + the ``get_resource_reader(fullname)`` method and have it either return None + or an object compatible with this ABC. + """ + + @abc.abstractmethod + def open_resource(self, resource): + """Return an opened, file-like object for binary reading. + + The 'resource' argument is expected to represent only a file name + and thus not contain any subdirectory components. + + If the resource cannot be found, FileNotFoundError is raised. + """ + raise FileNotFoundError + + @abc.abstractmethod + def resource_path(self, resource): + """Return the file system path to the specified resource. + + The 'resource' argument is expected to represent only a file name + and thus not contain any subdirectory components. + + If the resource does not exist on the file system, raise + FileNotFoundError. + """ + raise FileNotFoundError + + @abc.abstractmethod + def is_resource(self, name): + """Return True if the named 'name' is consider a resource.""" + raise FileNotFoundError + + @abc.abstractmethod + def contents(self): + """Return an iterable of strings over the contents of the package.""" + return [] + + +_register(ResourceReader, machinery.SourceFileLoader) diff --git a/venv/Lib/importlib/machinery.py b/venv/Lib/importlib/machinery.py new file mode 100644 index 00000000..1b2b5c9b --- /dev/null +++ b/venv/Lib/importlib/machinery.py @@ -0,0 +1,21 @@ +"""The machinery of importlib: finders, loaders, hooks, etc.""" + +import _imp + +from ._bootstrap import ModuleSpec +from ._bootstrap import BuiltinImporter +from ._bootstrap import FrozenImporter +from ._bootstrap_external import (SOURCE_SUFFIXES, DEBUG_BYTECODE_SUFFIXES, + OPTIMIZED_BYTECODE_SUFFIXES, BYTECODE_SUFFIXES, + EXTENSION_SUFFIXES) +from ._bootstrap_external import WindowsRegistryFinder +from ._bootstrap_external import PathFinder +from ._bootstrap_external import FileFinder +from ._bootstrap_external import SourceFileLoader +from ._bootstrap_external import SourcelessFileLoader +from ._bootstrap_external import ExtensionFileLoader + + +def all_suffixes(): + """Returns a list of all recognized module suffixes for this process""" + return SOURCE_SUFFIXES + BYTECODE_SUFFIXES + EXTENSION_SUFFIXES diff --git a/venv/Lib/importlib/resources.py b/venv/Lib/importlib/resources.py new file mode 100644 index 00000000..cbefdd54 --- /dev/null +++ b/venv/Lib/importlib/resources.py @@ -0,0 +1,343 @@ +import os +import tempfile + +from . import abc as resources_abc +from contextlib import contextmanager, suppress +from importlib import import_module +from importlib.abc import ResourceLoader +from io import BytesIO, TextIOWrapper +from pathlib import Path +from types import ModuleType +from typing import Iterable, Iterator, Optional, Set, Union # noqa: F401 +from typing import cast +from typing.io import BinaryIO, TextIO +from zipimport import ZipImportError + + +__all__ = [ + 'Package', + 'Resource', + 'contents', + 'is_resource', + 'open_binary', + 'open_text', + 'path', + 'read_binary', + 'read_text', + ] + + +Package = Union[str, ModuleType] +Resource = Union[str, os.PathLike] + + +def _get_package(package) -> ModuleType: + """Take a package name or module object and return the module. + + If a name, the module is imported. If the passed or imported module + object is not a package, raise an exception. + """ + if hasattr(package, '__spec__'): + if package.__spec__.submodule_search_locations is None: + raise TypeError('{!r} is not a package'.format( + package.__spec__.name)) + else: + return package + else: + module = import_module(package) + if module.__spec__.submodule_search_locations is None: + raise TypeError('{!r} is not a package'.format(package)) + else: + return module + + +def _normalize_path(path) -> str: + """Normalize a path by ensuring it is a string. + + If the resulting string contains path separators, an exception is raised. + """ + parent, file_name = os.path.split(path) + if parent: + raise ValueError('{!r} must be only a file name'.format(path)) + else: + return file_name + + +def _get_resource_reader( + package: ModuleType) -> Optional[resources_abc.ResourceReader]: + # Return the package's loader if it's a ResourceReader. We can't use + # a issubclass() check here because apparently abc.'s __subclasscheck__() + # hook wants to create a weak reference to the object, but + # zipimport.zipimporter does not support weak references, resulting in a + # TypeError. That seems terrible. + spec = package.__spec__ + if hasattr(spec.loader, 'get_resource_reader'): + return cast(resources_abc.ResourceReader, + spec.loader.get_resource_reader(spec.name)) + return None + + +def _check_location(package): + if package.__spec__.origin is None or not package.__spec__.has_location: + raise FileNotFoundError(f'Package has no location {package!r}') + + +def open_binary(package: Package, resource: Resource) -> BinaryIO: + """Return a file-like object opened for binary reading of the resource.""" + resource = _normalize_path(resource) + package = _get_package(package) + reader = _get_resource_reader(package) + if reader is not None: + return reader.open_resource(resource) + _check_location(package) + absolute_package_path = os.path.abspath(package.__spec__.origin) + package_path = os.path.dirname(absolute_package_path) + full_path = os.path.join(package_path, resource) + try: + return open(full_path, mode='rb') + except OSError: + # Just assume the loader is a resource loader; all the relevant + # importlib.machinery loaders are and an AttributeError for + # get_data() will make it clear what is needed from the loader. + loader = cast(ResourceLoader, package.__spec__.loader) + data = None + if hasattr(package.__spec__.loader, 'get_data'): + with suppress(OSError): + data = loader.get_data(full_path) + if data is None: + package_name = package.__spec__.name + message = '{!r} resource not found in {!r}'.format( + resource, package_name) + raise FileNotFoundError(message) + else: + return BytesIO(data) + + +def open_text(package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict') -> TextIO: + """Return a file-like object opened for text reading of the resource.""" + resource = _normalize_path(resource) + package = _get_package(package) + reader = _get_resource_reader(package) + if reader is not None: + return TextIOWrapper(reader.open_resource(resource), encoding, errors) + _check_location(package) + absolute_package_path = os.path.abspath(package.__spec__.origin) + package_path = os.path.dirname(absolute_package_path) + full_path = os.path.join(package_path, resource) + try: + return open(full_path, mode='r', encoding=encoding, errors=errors) + except OSError: + # Just assume the loader is a resource loader; all the relevant + # importlib.machinery loaders are and an AttributeError for + # get_data() will make it clear what is needed from the loader. + loader = cast(ResourceLoader, package.__spec__.loader) + data = None + if hasattr(package.__spec__.loader, 'get_data'): + with suppress(OSError): + data = loader.get_data(full_path) + if data is None: + package_name = package.__spec__.name + message = '{!r} resource not found in {!r}'.format( + resource, package_name) + raise FileNotFoundError(message) + else: + return TextIOWrapper(BytesIO(data), encoding, errors) + + +def read_binary(package: Package, resource: Resource) -> bytes: + """Return the binary contents of the resource.""" + resource = _normalize_path(resource) + package = _get_package(package) + with open_binary(package, resource) as fp: + return fp.read() + + +def read_text(package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict') -> str: + """Return the decoded string of the resource. + + The decoding-related arguments have the same semantics as those of + bytes.decode(). + """ + resource = _normalize_path(resource) + package = _get_package(package) + with open_text(package, resource, encoding, errors) as fp: + return fp.read() + + +@contextmanager +def path(package: Package, resource: Resource) -> Iterator[Path]: + """A context manager providing a file path object to the resource. + + If the resource does not already exist on its own on the file system, + a temporary file will be created. If the file was created, the file + will be deleted upon exiting the context manager (no exception is + raised if the file was deleted prior to the context manager + exiting). + """ + resource = _normalize_path(resource) + package = _get_package(package) + reader = _get_resource_reader(package) + if reader is not None: + try: + yield Path(reader.resource_path(resource)) + return + except FileNotFoundError: + pass + else: + _check_location(package) + # Fall-through for both the lack of resource_path() *and* if + # resource_path() raises FileNotFoundError. + package_directory = Path(package.__spec__.origin).parent + file_path = package_directory / resource + if file_path.exists(): + yield file_path + else: + with open_binary(package, resource) as fp: + data = fp.read() + # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try' + # blocks due to the need to close the temporary file to work on + # Windows properly. + fd, raw_path = tempfile.mkstemp() + try: + os.write(fd, data) + os.close(fd) + yield Path(raw_path) + finally: + try: + os.remove(raw_path) + except FileNotFoundError: + pass + + +def is_resource(package: Package, name: str) -> bool: + """True if 'name' is a resource inside 'package'. + + Directories are *not* resources. + """ + package = _get_package(package) + _normalize_path(name) + reader = _get_resource_reader(package) + if reader is not None: + return reader.is_resource(name) + try: + package_contents = set(contents(package)) + except (NotADirectoryError, FileNotFoundError): + return False + if name not in package_contents: + return False + # Just because the given file_name lives as an entry in the package's + # contents doesn't necessarily mean it's a resource. Directories are not + # resources, so let's try to find out if it's a directory or not. + path = Path(package.__spec__.origin).parent / name + return path.is_file() + + +def contents(package: Package) -> Iterable[str]: + """Return an iterable of entries in 'package'. + + Note that not all entries are resources. Specifically, directories are + not considered resources. Use `is_resource()` on each entry returned here + to check if it is a resource or not. + """ + package = _get_package(package) + reader = _get_resource_reader(package) + if reader is not None: + return reader.contents() + # Is the package a namespace package? By definition, namespace packages + # cannot have resources. We could use _check_location() and catch the + # exception, but that's extra work, so just inline the check. + elif package.__spec__.origin is None or not package.__spec__.has_location: + return () + else: + package_directory = Path(package.__spec__.origin).parent + return os.listdir(package_directory) + + +# Private implementation of ResourceReader and get_resource_reader() called +# from zipimport.c. Don't use these directly! We're implementing these in +# Python because 1) it's easier, 2) zipimport may get rewritten in Python +# itself at some point, so doing this all in C would difficult and a waste of +# effort. + +class _ZipImportResourceReader(resources_abc.ResourceReader): + """Private class used to support ZipImport.get_resource_reader(). + + This class is allowed to reference all the innards and private parts of + the zipimporter. + """ + + def __init__(self, zipimporter, fullname): + self.zipimporter = zipimporter + self.fullname = fullname + + def open_resource(self, resource): + fullname_as_path = self.fullname.replace('.', '/') + path = f'{fullname_as_path}/{resource}' + try: + return BytesIO(self.zipimporter.get_data(path)) + except OSError: + raise FileNotFoundError(path) + + def resource_path(self, resource): + # All resources are in the zip file, so there is no path to the file. + # Raising FileNotFoundError tells the higher level API to extract the + # binary data and create a temporary file. + raise FileNotFoundError + + def is_resource(self, name): + # Maybe we could do better, but if we can get the data, it's a + # resource. Otherwise it isn't. + fullname_as_path = self.fullname.replace('.', '/') + path = f'{fullname_as_path}/{name}' + try: + self.zipimporter.get_data(path) + except OSError: + return False + return True + + def contents(self): + # This is a bit convoluted, because fullname will be a module path, + # but _files is a list of file names relative to the top of the + # archive's namespace. We want to compare file paths to find all the + # names of things inside the module represented by fullname. So we + # turn the module path of fullname into a file path relative to the + # top of the archive, and then we iterate through _files looking for + # names inside that "directory". + fullname_path = Path(self.zipimporter.get_filename(self.fullname)) + relative_path = fullname_path.relative_to(self.zipimporter.archive) + # Don't forget that fullname names a package, so its path will include + # __init__.py, which we want to ignore. + assert relative_path.name == '__init__.py' + package_path = relative_path.parent + subdirs_seen = set() + for filename in self.zipimporter._files: + try: + relative = Path(filename).relative_to(package_path) + except ValueError: + continue + # If the path of the file (which is relative to the top of the zip + # namespace), relative to the package given when the resource + # reader was created, has a parent, then it's a name in a + # subdirectory and thus we skip it. + parent_name = relative.parent.name + if len(parent_name) == 0: + yield relative.name + elif parent_name not in subdirs_seen: + subdirs_seen.add(parent_name) + yield parent_name + + +# Called from zipimport.c +def _zipimport_get_resource_reader(zipimporter, fullname): + try: + if not zipimporter.is_package(fullname): + return None + except ZipImportError: + return None + return _ZipImportResourceReader(zipimporter, fullname) diff --git a/venv/Lib/importlib/util.py b/venv/Lib/importlib/util.py new file mode 100644 index 00000000..201e0f4c --- /dev/null +++ b/venv/Lib/importlib/util.py @@ -0,0 +1,300 @@ +"""Utility code for constructing importers, etc.""" +from . import abc +from ._bootstrap import module_from_spec +from ._bootstrap import _resolve_name +from ._bootstrap import spec_from_loader +from ._bootstrap import _find_spec +from ._bootstrap_external import MAGIC_NUMBER +from ._bootstrap_external import _RAW_MAGIC_NUMBER +from ._bootstrap_external import cache_from_source +from ._bootstrap_external import decode_source +from ._bootstrap_external import source_from_cache +from ._bootstrap_external import spec_from_file_location + +from contextlib import contextmanager +import _imp +import functools +import sys +import types +import warnings + + +def source_hash(source_bytes): + "Return the hash of *source_bytes* as used in hash-based pyc files." + return _imp.source_hash(_RAW_MAGIC_NUMBER, source_bytes) + + +def resolve_name(name, package): + """Resolve a relative module name to an absolute one.""" + if not name.startswith('.'): + return name + elif not package: + raise ValueError(f'no package specified for {repr(name)} ' + '(required for relative module names)') + level = 0 + for character in name: + if character != '.': + break + level += 1 + return _resolve_name(name[level:], package, level) + + +def _find_spec_from_path(name, path=None): + """Return the spec for the specified module. + + First, sys.modules is checked to see if the module was already imported. If + so, then sys.modules[name].__spec__ is returned. If that happens to be + set to None, then ValueError is raised. If the module is not in + sys.modules, then sys.meta_path is searched for a suitable spec with the + value of 'path' given to the finders. None is returned if no spec could + be found. + + Dotted names do not have their parent packages implicitly imported. You will + most likely need to explicitly import all parent packages in the proper + order for a submodule to get the correct spec. + + """ + if name not in sys.modules: + return _find_spec(name, path) + else: + module = sys.modules[name] + if module is None: + return None + try: + spec = module.__spec__ + except AttributeError: + raise ValueError('{}.__spec__ is not set'.format(name)) from None + else: + if spec is None: + raise ValueError('{}.__spec__ is None'.format(name)) + return spec + + +def find_spec(name, package=None): + """Return the spec for the specified module. + + First, sys.modules is checked to see if the module was already imported. If + so, then sys.modules[name].__spec__ is returned. If that happens to be + set to None, then ValueError is raised. If the module is not in + sys.modules, then sys.meta_path is searched for a suitable spec with the + value of 'path' given to the finders. None is returned if no spec could + be found. + + If the name is for submodule (contains a dot), the parent module is + automatically imported. + + The name and package arguments work the same as importlib.import_module(). + In other words, relative module names (with leading dots) work. + + """ + fullname = resolve_name(name, package) if name.startswith('.') else name + if fullname not in sys.modules: + parent_name = fullname.rpartition('.')[0] + if parent_name: + parent = __import__(parent_name, fromlist=['__path__']) + try: + parent_path = parent.__path__ + except AttributeError as e: + raise ModuleNotFoundError( + f"__path__ attribute not found on {parent_name!r} " + f"while trying to find {fullname!r}", name=fullname) from e + else: + parent_path = None + return _find_spec(fullname, parent_path) + else: + module = sys.modules[fullname] + if module is None: + return None + try: + spec = module.__spec__ + except AttributeError: + raise ValueError('{}.__spec__ is not set'.format(name)) from None + else: + if spec is None: + raise ValueError('{}.__spec__ is None'.format(name)) + return spec + + +@contextmanager +def _module_to_load(name): + is_reload = name in sys.modules + + module = sys.modules.get(name) + if not is_reload: + # This must be done before open() is called as the 'io' module + # implicitly imports 'locale' and would otherwise trigger an + # infinite loop. + module = type(sys)(name) + # This must be done before putting the module in sys.modules + # (otherwise an optimization shortcut in import.c becomes wrong) + module.__initializing__ = True + sys.modules[name] = module + try: + yield module + except Exception: + if not is_reload: + try: + del sys.modules[name] + except KeyError: + pass + finally: + module.__initializing__ = False + + +def set_package(fxn): + """Set __package__ on the returned module. + + This function is deprecated. + + """ + @functools.wraps(fxn) + def set_package_wrapper(*args, **kwargs): + warnings.warn('The import system now takes care of this automatically.', + DeprecationWarning, stacklevel=2) + module = fxn(*args, **kwargs) + if getattr(module, '__package__', None) is None: + module.__package__ = module.__name__ + if not hasattr(module, '__path__'): + module.__package__ = module.__package__.rpartition('.')[0] + return module + return set_package_wrapper + + +def set_loader(fxn): + """Set __loader__ on the returned module. + + This function is deprecated. + + """ + @functools.wraps(fxn) + def set_loader_wrapper(self, *args, **kwargs): + warnings.warn('The import system now takes care of this automatically.', + DeprecationWarning, stacklevel=2) + module = fxn(self, *args, **kwargs) + if getattr(module, '__loader__', None) is None: + module.__loader__ = self + return module + return set_loader_wrapper + + +def module_for_loader(fxn): + """Decorator to handle selecting the proper module for loaders. + + The decorated function is passed the module to use instead of the module + name. The module passed in to the function is either from sys.modules if + it already exists or is a new module. If the module is new, then __name__ + is set the first argument to the method, __loader__ is set to self, and + __package__ is set accordingly (if self.is_package() is defined) will be set + before it is passed to the decorated function (if self.is_package() does + not work for the module it will be set post-load). + + If an exception is raised and the decorator created the module it is + subsequently removed from sys.modules. + + The decorator assumes that the decorated function takes the module name as + the second argument. + + """ + warnings.warn('The import system now takes care of this automatically.', + DeprecationWarning, stacklevel=2) + @functools.wraps(fxn) + def module_for_loader_wrapper(self, fullname, *args, **kwargs): + with _module_to_load(fullname) as module: + module.__loader__ = self + try: + is_package = self.is_package(fullname) + except (ImportError, AttributeError): + pass + else: + if is_package: + module.__package__ = fullname + else: + module.__package__ = fullname.rpartition('.')[0] + # If __package__ was not set above, __import__() will do it later. + return fxn(self, module, *args, **kwargs) + + return module_for_loader_wrapper + + +class _LazyModule(types.ModuleType): + + """A subclass of the module type which triggers loading upon attribute access.""" + + def __getattribute__(self, attr): + """Trigger the load of the module and return the attribute.""" + # All module metadata must be garnered from __spec__ in order to avoid + # using mutated values. + # Stop triggering this method. + self.__class__ = types.ModuleType + # Get the original name to make sure no object substitution occurred + # in sys.modules. + original_name = self.__spec__.name + # Figure out exactly what attributes were mutated between the creation + # of the module and now. + attrs_then = self.__spec__.loader_state['__dict__'] + original_type = self.__spec__.loader_state['__class__'] + attrs_now = self.__dict__ + attrs_updated = {} + for key, value in attrs_now.items(): + # Code that set the attribute may have kept a reference to the + # assigned object, making identity more important than equality. + if key not in attrs_then: + attrs_updated[key] = value + elif id(attrs_now[key]) != id(attrs_then[key]): + attrs_updated[key] = value + self.__spec__.loader.exec_module(self) + # If exec_module() was used directly there is no guarantee the module + # object was put into sys.modules. + if original_name in sys.modules: + if id(self) != id(sys.modules[original_name]): + raise ValueError(f"module object for {original_name!r} " + "substituted in sys.modules during a lazy " + "load") + # Update after loading since that's what would happen in an eager + # loading situation. + self.__dict__.update(attrs_updated) + return getattr(self, attr) + + def __delattr__(self, attr): + """Trigger the load and then perform the deletion.""" + # To trigger the load and raise an exception if the attribute + # doesn't exist. + self.__getattribute__(attr) + delattr(self, attr) + + +class LazyLoader(abc.Loader): + + """A loader that creates a module which defers loading until attribute access.""" + + @staticmethod + def __check_eager_loader(loader): + if not hasattr(loader, 'exec_module'): + raise TypeError('loader must define exec_module()') + + @classmethod + def factory(cls, loader): + """Construct a callable which returns the eager loader made lazy.""" + cls.__check_eager_loader(loader) + return lambda *args, **kwargs: cls(loader(*args, **kwargs)) + + def __init__(self, loader): + self.__check_eager_loader(loader) + self.loader = loader + + def create_module(self, spec): + return self.loader.create_module(spec) + + def exec_module(self, module): + """Make the module load lazily.""" + module.__spec__.loader = self.loader + module.__loader__ = self.loader + # Don't need to worry about deep-copying as trying to set an attribute + # on an object would have triggered the load, + # e.g. ``module.__spec__.loader = None`` would trigger a load from + # trying to access module.__spec__. + loader_state = {} + loader_state['__dict__'] = module.__dict__.copy() + loader_state['__class__'] = module.__class__ + module.__spec__.loader_state = loader_state + module.__class__ = _LazyModule diff --git a/venv/Lib/io.py b/venv/Lib/io.py new file mode 100644 index 00000000..968ee507 --- /dev/null +++ b/venv/Lib/io.py @@ -0,0 +1,99 @@ +"""The io module provides the Python interfaces to stream handling. The +builtin open function is defined in this module. + +At the top of the I/O hierarchy is the abstract base class IOBase. It +defines the basic interface to a stream. Note, however, that there is no +separation between reading and writing to streams; implementations are +allowed to raise an OSError if they do not support a given operation. + +Extending IOBase is RawIOBase which deals simply with the reading and +writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide +an interface to OS files. + +BufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its +subclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer +streams that are readable, writable, and both respectively. +BufferedRandom provides a buffered interface to random access +streams. BytesIO is a simple stream of in-memory bytes. + +Another IOBase subclass, TextIOBase, deals with the encoding and decoding +of streams into text. TextIOWrapper, which extends it, is a buffered text +interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO +is an in-memory stream for text. + +Argument names are not part of the specification, and only the arguments +of open() are intended to be used as keyword arguments. + +data: + +DEFAULT_BUFFER_SIZE + + An int containing the default buffer size used by the module's buffered + I/O classes. open() uses the file's blksize (as obtained by os.stat) if + possible. +""" +# New I/O library conforming to PEP 3116. + +__author__ = ("Guido van Rossum , " + "Mike Verdone , " + "Mark Russell , " + "Antoine Pitrou , " + "Amaury Forgeot d'Arc , " + "Benjamin Peterson ") + +__all__ = ["BlockingIOError", "open", "IOBase", "RawIOBase", "FileIO", + "BytesIO", "StringIO", "BufferedIOBase", + "BufferedReader", "BufferedWriter", "BufferedRWPair", + "BufferedRandom", "TextIOBase", "TextIOWrapper", + "UnsupportedOperation", "SEEK_SET", "SEEK_CUR", "SEEK_END"] + + +import _io +import abc + +from _io import (DEFAULT_BUFFER_SIZE, BlockingIOError, UnsupportedOperation, + open, FileIO, BytesIO, StringIO, BufferedReader, + BufferedWriter, BufferedRWPair, BufferedRandom, + IncrementalNewlineDecoder, TextIOWrapper) + +OpenWrapper = _io.open # for compatibility with _pyio + +# Pretend this exception was created here. +UnsupportedOperation.__module__ = "io" + +# for seek() +SEEK_SET = 0 +SEEK_CUR = 1 +SEEK_END = 2 + +# Declaring ABCs in C is tricky so we do it here. +# Method descriptions and default implementations are inherited from the C +# version however. +class IOBase(_io._IOBase, metaclass=abc.ABCMeta): + __doc__ = _io._IOBase.__doc__ + +class RawIOBase(_io._RawIOBase, IOBase): + __doc__ = _io._RawIOBase.__doc__ + +class BufferedIOBase(_io._BufferedIOBase, IOBase): + __doc__ = _io._BufferedIOBase.__doc__ + +class TextIOBase(_io._TextIOBase, IOBase): + __doc__ = _io._TextIOBase.__doc__ + +RawIOBase.register(FileIO) + +for klass in (BytesIO, BufferedReader, BufferedWriter, BufferedRandom, + BufferedRWPair): + BufferedIOBase.register(klass) + +for klass in (StringIO, TextIOWrapper): + TextIOBase.register(klass) +del klass + +try: + from _io import _WindowsConsoleIO +except ImportError: + pass +else: + RawIOBase.register(_WindowsConsoleIO) diff --git a/venv/Lib/keyword.py b/venv/Lib/keyword.py new file mode 100644 index 00000000..431991dc --- /dev/null +++ b/venv/Lib/keyword.py @@ -0,0 +1,96 @@ +#! /usr/bin/env python3 + +"""Keywords (from "graminit.c") + +This file is automatically generated; please don't muck it up! + +To update the symbols in this file, 'cd' to the top directory of +the python source tree after building the interpreter and run: + + ./python Lib/keyword.py +""" + +__all__ = ["iskeyword", "kwlist"] + +kwlist = [ +#--start keywords-- + 'False', + 'None', + 'True', + 'and', + 'as', + 'assert', + 'async', + 'await', + 'break', + 'class', + 'continue', + 'def', + 'del', + 'elif', + 'else', + 'except', + 'finally', + 'for', + 'from', + 'global', + 'if', + 'import', + 'in', + 'is', + 'lambda', + 'nonlocal', + 'not', + 'or', + 'pass', + 'raise', + 'return', + 'try', + 'while', + 'with', + 'yield', +#--end keywords-- + ] + +iskeyword = frozenset(kwlist).__contains__ + +def main(): + import sys, re + + args = sys.argv[1:] + iptfile = args and args[0] or "Python/graminit.c" + if len(args) > 1: optfile = args[1] + else: optfile = "Lib/keyword.py" + + # load the output skeleton from the target, taking care to preserve its + # newline convention. + with open(optfile, newline='') as fp: + format = fp.readlines() + nl = format[0][len(format[0].strip()):] if format else '\n' + + # scan the source file for keywords + with open(iptfile) as fp: + strprog = re.compile('"([^"]+)"') + lines = [] + for line in fp: + if '{1, "' in line: + match = strprog.search(line) + if match: + lines.append(" '" + match.group(1) + "'," + nl) + lines.sort() + + # insert the lines of keywords into the skeleton + try: + start = format.index("#--start keywords--" + nl) + 1 + end = format.index("#--end keywords--" + nl) + format[start:end] = lines + except ValueError: + sys.stderr.write("target does not contain format markers\n") + sys.exit(1) + + # write the output file + with open(optfile, 'w', newline='') as fp: + fp.writelines(format) + +if __name__ == "__main__": + main() diff --git a/venv/Lib/linecache.py b/venv/Lib/linecache.py new file mode 100644 index 00000000..3afcce1f --- /dev/null +++ b/venv/Lib/linecache.py @@ -0,0 +1,177 @@ +"""Cache lines from Python source files. + +This is intended to read lines from modules imported -- hence if a filename +is not found, it will look down the module search path for a file by +that name. +""" + +import functools +import sys +import os +import tokenize + +__all__ = ["getline", "clearcache", "checkcache"] + +def getline(filename, lineno, module_globals=None): + lines = getlines(filename, module_globals) + if 1 <= lineno <= len(lines): + return lines[lineno-1] + else: + return '' + + +# The cache + +# The cache. Maps filenames to either a thunk which will provide source code, +# or a tuple (size, mtime, lines, fullname) once loaded. +cache = {} + + +def clearcache(): + """Clear the cache entirely.""" + + global cache + cache = {} + + +def getlines(filename, module_globals=None): + """Get the lines for a Python source file from the cache. + Update the cache if it doesn't contain an entry for this file already.""" + + if filename in cache: + entry = cache[filename] + if len(entry) != 1: + return cache[filename][2] + + try: + return updatecache(filename, module_globals) + except MemoryError: + clearcache() + return [] + + +def checkcache(filename=None): + """Discard cache entries that are out of date. + (This is not checked upon each call!)""" + + if filename is None: + filenames = list(cache.keys()) + else: + if filename in cache: + filenames = [filename] + else: + return + + for filename in filenames: + entry = cache[filename] + if len(entry) == 1: + # lazy cache entry, leave it lazy. + continue + size, mtime, lines, fullname = entry + if mtime is None: + continue # no-op for files loaded via a __loader__ + try: + stat = os.stat(fullname) + except OSError: + del cache[filename] + continue + if size != stat.st_size or mtime != stat.st_mtime: + del cache[filename] + + +def updatecache(filename, module_globals=None): + """Update a cache entry and return its list of lines. + If something's wrong, print a message, discard the cache entry, + and return an empty list.""" + + if filename in cache: + if len(cache[filename]) != 1: + del cache[filename] + if not filename or (filename.startswith('<') and filename.endswith('>')): + return [] + + fullname = filename + try: + stat = os.stat(fullname) + except OSError: + basename = filename + + # Realise a lazy loader based lookup if there is one + # otherwise try to lookup right now. + if lazycache(filename, module_globals): + try: + data = cache[filename][0]() + except (ImportError, OSError): + pass + else: + if data is None: + # No luck, the PEP302 loader cannot find the source + # for this module. + return [] + cache[filename] = ( + len(data), None, + [line+'\n' for line in data.splitlines()], fullname + ) + return cache[filename][2] + + # Try looking through the module search path, which is only useful + # when handling a relative filename. + if os.path.isabs(filename): + return [] + + for dirname in sys.path: + try: + fullname = os.path.join(dirname, basename) + except (TypeError, AttributeError): + # Not sufficiently string-like to do anything useful with. + continue + try: + stat = os.stat(fullname) + break + except OSError: + pass + else: + return [] + try: + with tokenize.open(fullname) as fp: + lines = fp.readlines() + except OSError: + return [] + if lines and not lines[-1].endswith('\n'): + lines[-1] += '\n' + size, mtime = stat.st_size, stat.st_mtime + cache[filename] = size, mtime, lines, fullname + return lines + + +def lazycache(filename, module_globals): + """Seed the cache for filename with module_globals. + + The module loader will be asked for the source only when getlines is + called, not immediately. + + If there is an entry in the cache already, it is not altered. + + :return: True if a lazy load is registered in the cache, + otherwise False. To register such a load a module loader with a + get_source method must be found, the filename must be a cachable + filename, and the filename must not be already cached. + """ + if filename in cache: + if len(cache[filename]) == 1: + return True + else: + return False + if not filename or (filename.startswith('<') and filename.endswith('>')): + return False + # Try for a __loader__, if available + if module_globals and '__loader__' in module_globals: + name = module_globals.get('__name__') + loader = module_globals['__loader__'] + get_source = getattr(loader, 'get_source', None) + + if name and get_source: + get_lines = functools.partial(get_source, name) + cache[filename] = (get_lines,) + return True + return False diff --git a/venv/Lib/locale.py b/venv/Lib/locale.py new file mode 100644 index 00000000..f3d3973d --- /dev/null +++ b/venv/Lib/locale.py @@ -0,0 +1,1749 @@ +"""Locale support module. + +The module provides low-level access to the C lib's locale APIs and adds high +level number formatting APIs as well as a locale aliasing engine to complement +these. + +The aliasing engine includes support for many commonly used locale names and +maps them to values suitable for passing to the C lib's setlocale() function. It +also includes default encodings for all supported locale names. + +""" + +import sys +import encodings +import encodings.aliases +import re +import _collections_abc +from builtins import str as _builtin_str +import functools + +# Try importing the _locale module. +# +# If this fails, fall back on a basic 'C' locale emulation. + +# Yuck: LC_MESSAGES is non-standard: can't tell whether it exists before +# trying the import. So __all__ is also fiddled at the end of the file. +__all__ = ["getlocale", "getdefaultlocale", "getpreferredencoding", "Error", + "setlocale", "resetlocale", "localeconv", "strcoll", "strxfrm", + "str", "atof", "atoi", "format", "format_string", "currency", + "normalize", "LC_CTYPE", "LC_COLLATE", "LC_TIME", "LC_MONETARY", + "LC_NUMERIC", "LC_ALL", "CHAR_MAX"] + +def _strcoll(a,b): + """ strcoll(string,string) -> int. + Compares two strings according to the locale. + """ + return (a > b) - (a < b) + +def _strxfrm(s): + """ strxfrm(string) -> string. + Returns a string that behaves for cmp locale-aware. + """ + return s + +try: + + from _locale import * + +except ImportError: + + # Locale emulation + + CHAR_MAX = 127 + LC_ALL = 6 + LC_COLLATE = 3 + LC_CTYPE = 0 + LC_MESSAGES = 5 + LC_MONETARY = 4 + LC_NUMERIC = 1 + LC_TIME = 2 + Error = ValueError + + def localeconv(): + """ localeconv() -> dict. + Returns numeric and monetary locale-specific parameters. + """ + # 'C' locale default values + return {'grouping': [127], + 'currency_symbol': '', + 'n_sign_posn': 127, + 'p_cs_precedes': 127, + 'n_cs_precedes': 127, + 'mon_grouping': [], + 'n_sep_by_space': 127, + 'decimal_point': '.', + 'negative_sign': '', + 'positive_sign': '', + 'p_sep_by_space': 127, + 'int_curr_symbol': '', + 'p_sign_posn': 127, + 'thousands_sep': '', + 'mon_thousands_sep': '', + 'frac_digits': 127, + 'mon_decimal_point': '', + 'int_frac_digits': 127} + + def setlocale(category, value=None): + """ setlocale(integer,string=None) -> string. + Activates/queries locale processing. + """ + if value not in (None, '', 'C'): + raise Error('_locale emulation only supports "C" locale') + return 'C' + +# These may or may not exist in _locale, so be sure to set them. +if 'strxfrm' not in globals(): + strxfrm = _strxfrm +if 'strcoll' not in globals(): + strcoll = _strcoll + + +_localeconv = localeconv + +# With this dict, you can override some items of localeconv's return value. +# This is useful for testing purposes. +_override_localeconv = {} + +@functools.wraps(_localeconv) +def localeconv(): + d = _localeconv() + if _override_localeconv: + d.update(_override_localeconv) + return d + + +### Number formatting APIs + +# Author: Martin von Loewis +# improved by Georg Brandl + +# Iterate over grouping intervals +def _grouping_intervals(grouping): + last_interval = None + for interval in grouping: + # if grouping is -1, we are done + if interval == CHAR_MAX: + return + # 0: re-use last group ad infinitum + if interval == 0: + if last_interval is None: + raise ValueError("invalid grouping") + while True: + yield last_interval + yield interval + last_interval = interval + +#perform the grouping from right to left +def _group(s, monetary=False): + conv = localeconv() + thousands_sep = conv[monetary and 'mon_thousands_sep' or 'thousands_sep'] + grouping = conv[monetary and 'mon_grouping' or 'grouping'] + if not grouping: + return (s, 0) + if s[-1] == ' ': + stripped = s.rstrip() + right_spaces = s[len(stripped):] + s = stripped + else: + right_spaces = '' + left_spaces = '' + groups = [] + for interval in _grouping_intervals(grouping): + if not s or s[-1] not in "0123456789": + # only non-digit characters remain (sign, spaces) + left_spaces = s + s = '' + break + groups.append(s[-interval:]) + s = s[:-interval] + if s: + groups.append(s) + groups.reverse() + return ( + left_spaces + thousands_sep.join(groups) + right_spaces, + len(thousands_sep) * (len(groups) - 1) + ) + +# Strip a given amount of excess padding from the given string +def _strip_padding(s, amount): + lpos = 0 + while amount and s[lpos] == ' ': + lpos += 1 + amount -= 1 + rpos = len(s) - 1 + while amount and s[rpos] == ' ': + rpos -= 1 + amount -= 1 + return s[lpos:rpos+1] + +_percent_re = re.compile(r'%(?:\((?P.*?)\))?' + r'(?P[-#0-9 +*.hlL]*?)[eEfFgGdiouxXcrs%]') + +def _format(percent, value, grouping=False, monetary=False, *additional): + if additional: + formatted = percent % ((value,) + additional) + else: + formatted = percent % value + # floats and decimal ints need special action! + if percent[-1] in 'eEfFgG': + seps = 0 + parts = formatted.split('.') + if grouping: + parts[0], seps = _group(parts[0], monetary=monetary) + decimal_point = localeconv()[monetary and 'mon_decimal_point' + or 'decimal_point'] + formatted = decimal_point.join(parts) + if seps: + formatted = _strip_padding(formatted, seps) + elif percent[-1] in 'diu': + seps = 0 + if grouping: + formatted, seps = _group(formatted, monetary=monetary) + if seps: + formatted = _strip_padding(formatted, seps) + return formatted + +def format_string(f, val, grouping=False, monetary=False): + """Formats a string in the same way that the % formatting would use, + but takes the current locale into account. + + Grouping is applied if the third parameter is true. + Conversion uses monetary thousands separator and grouping strings if + forth parameter monetary is true.""" + percents = list(_percent_re.finditer(f)) + new_f = _percent_re.sub('%s', f) + + if isinstance(val, _collections_abc.Mapping): + new_val = [] + for perc in percents: + if perc.group()[-1]=='%': + new_val.append('%') + else: + new_val.append(_format(perc.group(), val, grouping, monetary)) + else: + if not isinstance(val, tuple): + val = (val,) + new_val = [] + i = 0 + for perc in percents: + if perc.group()[-1]=='%': + new_val.append('%') + else: + starcount = perc.group('modifiers').count('*') + new_val.append(_format(perc.group(), + val[i], + grouping, + monetary, + *val[i+1:i+1+starcount])) + i += (1 + starcount) + val = tuple(new_val) + + return new_f % val + +def format(percent, value, grouping=False, monetary=False, *additional): + """Deprecated, use format_string instead.""" + import warnings + warnings.warn( + "This method will be removed in a future version of Python. " + "Use 'locale.format_string()' instead.", + DeprecationWarning, stacklevel=2 + ) + + match = _percent_re.match(percent) + if not match or len(match.group())!= len(percent): + raise ValueError(("format() must be given exactly one %%char " + "format specifier, %s not valid") % repr(percent)) + return _format(percent, value, grouping, monetary, *additional) + +def currency(val, symbol=True, grouping=False, international=False): + """Formats val according to the currency settings + in the current locale.""" + conv = localeconv() + + # check for illegal values + digits = conv[international and 'int_frac_digits' or 'frac_digits'] + if digits == 127: + raise ValueError("Currency formatting is not possible using " + "the 'C' locale.") + + s = _format('%%.%if' % digits, abs(val), grouping, monetary=True) + # '<' and '>' are markers if the sign must be inserted between symbol and value + s = '<' + s + '>' + + if symbol: + smb = conv[international and 'int_curr_symbol' or 'currency_symbol'] + precedes = conv[val<0 and 'n_cs_precedes' or 'p_cs_precedes'] + separated = conv[val<0 and 'n_sep_by_space' or 'p_sep_by_space'] + + if precedes: + s = smb + (separated and ' ' or '') + s + else: + s = s + (separated and ' ' or '') + smb + + sign_pos = conv[val<0 and 'n_sign_posn' or 'p_sign_posn'] + sign = conv[val<0 and 'negative_sign' or 'positive_sign'] + + if sign_pos == 0: + s = '(' + s + ')' + elif sign_pos == 1: + s = sign + s + elif sign_pos == 2: + s = s + sign + elif sign_pos == 3: + s = s.replace('<', sign) + elif sign_pos == 4: + s = s.replace('>', sign) + else: + # the default if nothing specified; + # this should be the most fitting sign position + s = sign + s + + return s.replace('<', '').replace('>', '') + +def str(val): + """Convert float to string, taking the locale into account.""" + return _format("%.12g", val) + +def delocalize(string): + "Parses a string as a normalized number according to the locale settings." + + conv = localeconv() + + #First, get rid of the grouping + ts = conv['thousands_sep'] + if ts: + string = string.replace(ts, '') + + #next, replace the decimal point with a dot + dd = conv['decimal_point'] + if dd: + string = string.replace(dd, '.') + return string + +def atof(string, func=float): + "Parses a string as a float according to the locale settings." + return func(delocalize(string)) + +def atoi(string): + "Converts a string to an integer according to the locale settings." + return int(delocalize(string)) + +def _test(): + setlocale(LC_ALL, "") + #do grouping + s1 = format_string("%d", 123456789,1) + print(s1, "is", atoi(s1)) + #standard formatting + s1 = str(3.14) + print(s1, "is", atof(s1)) + +### Locale name aliasing engine + +# Author: Marc-Andre Lemburg, mal@lemburg.com +# Various tweaks by Fredrik Lundh + +# store away the low-level version of setlocale (it's +# overridden below) +_setlocale = setlocale + +def _replace_encoding(code, encoding): + if '.' in code: + langname = code[:code.index('.')] + else: + langname = code + # Convert the encoding to a C lib compatible encoding string + norm_encoding = encodings.normalize_encoding(encoding) + #print('norm encoding: %r' % norm_encoding) + norm_encoding = encodings.aliases.aliases.get(norm_encoding.lower(), + norm_encoding) + #print('aliased encoding: %r' % norm_encoding) + encoding = norm_encoding + norm_encoding = norm_encoding.lower() + if norm_encoding in locale_encoding_alias: + encoding = locale_encoding_alias[norm_encoding] + else: + norm_encoding = norm_encoding.replace('_', '') + norm_encoding = norm_encoding.replace('-', '') + if norm_encoding in locale_encoding_alias: + encoding = locale_encoding_alias[norm_encoding] + #print('found encoding %r' % encoding) + return langname + '.' + encoding + +def _append_modifier(code, modifier): + if modifier == 'euro': + if '.' not in code: + return code + '.ISO8859-15' + _, _, encoding = code.partition('.') + if encoding in ('ISO8859-15', 'UTF-8'): + return code + if encoding == 'ISO8859-1': + return _replace_encoding(code, 'ISO8859-15') + return code + '@' + modifier + +def normalize(localename): + + """ Returns a normalized locale code for the given locale + name. + + The returned locale code is formatted for use with + setlocale(). + + If normalization fails, the original name is returned + unchanged. + + If the given encoding is not known, the function defaults to + the default encoding for the locale code just like setlocale() + does. + + """ + # Normalize the locale name and extract the encoding and modifier + code = localename.lower() + if ':' in code: + # ':' is sometimes used as encoding delimiter. + code = code.replace(':', '.') + if '@' in code: + code, modifier = code.split('@', 1) + else: + modifier = '' + if '.' in code: + langname, encoding = code.split('.')[:2] + else: + langname = code + encoding = '' + + # First lookup: fullname (possibly with encoding and modifier) + lang_enc = langname + if encoding: + norm_encoding = encoding.replace('-', '') + norm_encoding = norm_encoding.replace('_', '') + lang_enc += '.' + norm_encoding + lookup_name = lang_enc + if modifier: + lookup_name += '@' + modifier + code = locale_alias.get(lookup_name, None) + if code is not None: + return code + #print('first lookup failed') + + if modifier: + # Second try: fullname without modifier (possibly with encoding) + code = locale_alias.get(lang_enc, None) + if code is not None: + #print('lookup without modifier succeeded') + if '@' not in code: + return _append_modifier(code, modifier) + if code.split('@', 1)[1].lower() == modifier: + return code + #print('second lookup failed') + + if encoding: + # Third try: langname (without encoding, possibly with modifier) + lookup_name = langname + if modifier: + lookup_name += '@' + modifier + code = locale_alias.get(lookup_name, None) + if code is not None: + #print('lookup without encoding succeeded') + if '@' not in code: + return _replace_encoding(code, encoding) + code, modifier = code.split('@', 1) + return _replace_encoding(code, encoding) + '@' + modifier + + if modifier: + # Fourth try: langname (without encoding and modifier) + code = locale_alias.get(langname, None) + if code is not None: + #print('lookup without modifier and encoding succeeded') + if '@' not in code: + code = _replace_encoding(code, encoding) + return _append_modifier(code, modifier) + code, defmod = code.split('@', 1) + if defmod.lower() == modifier: + return _replace_encoding(code, encoding) + '@' + defmod + + return localename + +def _parse_localename(localename): + + """ Parses the locale code for localename and returns the + result as tuple (language code, encoding). + + The localename is normalized and passed through the locale + alias engine. A ValueError is raised in case the locale name + cannot be parsed. + + The language code corresponds to RFC 1766. code and encoding + can be None in case the values cannot be determined or are + unknown to this implementation. + + """ + code = normalize(localename) + if '@' in code: + # Deal with locale modifiers + code, modifier = code.split('@', 1) + if modifier == 'euro' and '.' not in code: + # Assume Latin-9 for @euro locales. This is bogus, + # since some systems may use other encodings for these + # locales. Also, we ignore other modifiers. + return code, 'iso-8859-15' + + if '.' in code: + return tuple(code.split('.')[:2]) + elif code == 'C': + return None, None + raise ValueError('unknown locale: %s' % localename) + +def _build_localename(localetuple): + + """ Builds a locale code from the given tuple (language code, + encoding). + + No aliasing or normalizing takes place. + + """ + try: + language, encoding = localetuple + + if language is None: + language = 'C' + if encoding is None: + return language + else: + return language + '.' + encoding + except (TypeError, ValueError): + raise TypeError('Locale must be None, a string, or an iterable of ' + 'two strings -- language code, encoding.') from None + +def getdefaultlocale(envvars=('LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE')): + + """ Tries to determine the default locale settings and returns + them as tuple (language code, encoding). + + According to POSIX, a program which has not called + setlocale(LC_ALL, "") runs using the portable 'C' locale. + Calling setlocale(LC_ALL, "") lets it use the default locale as + defined by the LANG variable. Since we don't want to interfere + with the current locale setting we thus emulate the behavior + in the way described above. + + To maintain compatibility with other platforms, not only the + LANG variable is tested, but a list of variables given as + envvars parameter. The first found to be defined will be + used. envvars defaults to the search path used in GNU gettext; + it must always contain the variable name 'LANG'. + + Except for the code 'C', the language code corresponds to RFC + 1766. code and encoding can be None in case the values cannot + be determined. + + """ + + try: + # check if it's supported by the _locale module + import _locale + code, encoding = _locale._getdefaultlocale() + except (ImportError, AttributeError): + pass + else: + # make sure the code/encoding values are valid + if sys.platform == "win32" and code and code[:2] == "0x": + # map windows language identifier to language name + code = windows_locale.get(int(code, 0)) + # ...add other platform-specific processing here, if + # necessary... + return code, encoding + + # fall back on POSIX behaviour + import os + lookup = os.environ.get + for variable in envvars: + localename = lookup(variable,None) + if localename: + if variable == 'LANGUAGE': + localename = localename.split(':')[0] + break + else: + localename = 'C' + return _parse_localename(localename) + + +def getlocale(category=LC_CTYPE): + + """ Returns the current setting for the given locale category as + tuple (language code, encoding). + + category may be one of the LC_* value except LC_ALL. It + defaults to LC_CTYPE. + + Except for the code 'C', the language code corresponds to RFC + 1766. code and encoding can be None in case the values cannot + be determined. + + """ + localename = _setlocale(category) + if category == LC_ALL and ';' in localename: + raise TypeError('category LC_ALL is not supported') + return _parse_localename(localename) + +def setlocale(category, locale=None): + + """ Set the locale for the given category. The locale can be + a string, an iterable of two strings (language code and encoding), + or None. + + Iterables are converted to strings using the locale aliasing + engine. Locale strings are passed directly to the C lib. + + category may be given as one of the LC_* values. + + """ + if locale and not isinstance(locale, _builtin_str): + # convert to string + locale = normalize(_build_localename(locale)) + return _setlocale(category, locale) + +def resetlocale(category=LC_ALL): + + """ Sets the locale for category to the default setting. + + The default setting is determined by calling + getdefaultlocale(). category defaults to LC_ALL. + + """ + _setlocale(category, _build_localename(getdefaultlocale())) + +if sys.platform.startswith("win"): + # On Win32, this will return the ANSI code page + def getpreferredencoding(do_setlocale = True): + """Return the charset that the user is likely using.""" + if sys.flags.utf8_mode: + return 'UTF-8' + import _bootlocale + return _bootlocale.getpreferredencoding(False) +else: + # On Unix, if CODESET is available, use that. + try: + CODESET + except NameError: + if hasattr(sys, 'getandroidapilevel'): + # On Android langinfo.h and CODESET are missing, and UTF-8 is + # always used in mbstowcs() and wcstombs(). + def getpreferredencoding(do_setlocale = True): + return 'UTF-8' + else: + # Fall back to parsing environment variables :-( + def getpreferredencoding(do_setlocale = True): + """Return the charset that the user is likely using, + by looking at environment variables.""" + if sys.flags.utf8_mode: + return 'UTF-8' + res = getdefaultlocale()[1] + if res is None: + # LANG not set, default conservatively to ASCII + res = 'ascii' + return res + else: + def getpreferredencoding(do_setlocale = True): + """Return the charset that the user is likely using, + according to the system configuration.""" + if sys.flags.utf8_mode: + return 'UTF-8' + import _bootlocale + if do_setlocale: + oldloc = setlocale(LC_CTYPE) + try: + setlocale(LC_CTYPE, "") + except Error: + pass + result = _bootlocale.getpreferredencoding(False) + if do_setlocale: + setlocale(LC_CTYPE, oldloc) + return result + + +### Database +# +# The following data was extracted from the locale.alias file which +# comes with X11 and then hand edited removing the explicit encoding +# definitions and adding some more aliases. The file is usually +# available as /usr/lib/X11/locale/locale.alias. +# + +# +# The local_encoding_alias table maps lowercase encoding alias names +# to C locale encoding names (case-sensitive). Note that normalize() +# first looks up the encoding in the encodings.aliases dictionary and +# then applies this mapping to find the correct C lib name for the +# encoding. +# +locale_encoding_alias = { + + # Mappings for non-standard encoding names used in locale names + '437': 'C', + 'c': 'C', + 'en': 'ISO8859-1', + 'jis': 'JIS7', + 'jis7': 'JIS7', + 'ajec': 'eucJP', + 'koi8c': 'KOI8-C', + 'microsoftcp1251': 'CP1251', + 'microsoftcp1255': 'CP1255', + 'microsoftcp1256': 'CP1256', + '88591': 'ISO8859-1', + '88592': 'ISO8859-2', + '88595': 'ISO8859-5', + '885915': 'ISO8859-15', + + # Mappings from Python codec names to C lib encoding names + 'ascii': 'ISO8859-1', + 'latin_1': 'ISO8859-1', + 'iso8859_1': 'ISO8859-1', + 'iso8859_10': 'ISO8859-10', + 'iso8859_11': 'ISO8859-11', + 'iso8859_13': 'ISO8859-13', + 'iso8859_14': 'ISO8859-14', + 'iso8859_15': 'ISO8859-15', + 'iso8859_16': 'ISO8859-16', + 'iso8859_2': 'ISO8859-2', + 'iso8859_3': 'ISO8859-3', + 'iso8859_4': 'ISO8859-4', + 'iso8859_5': 'ISO8859-5', + 'iso8859_6': 'ISO8859-6', + 'iso8859_7': 'ISO8859-7', + 'iso8859_8': 'ISO8859-8', + 'iso8859_9': 'ISO8859-9', + 'iso2022_jp': 'JIS7', + 'shift_jis': 'SJIS', + 'tactis': 'TACTIS', + 'euc_jp': 'eucJP', + 'euc_kr': 'eucKR', + 'utf_8': 'UTF-8', + 'koi8_r': 'KOI8-R', + 'koi8_t': 'KOI8-T', + 'koi8_u': 'KOI8-U', + 'kz1048': 'RK1048', + 'cp1251': 'CP1251', + 'cp1255': 'CP1255', + 'cp1256': 'CP1256', + + # XXX This list is still incomplete. If you know more + # mappings, please file a bug report. Thanks. +} + +for k, v in sorted(locale_encoding_alias.items()): + k = k.replace('_', '') + locale_encoding_alias.setdefault(k, v) + +# +# The locale_alias table maps lowercase alias names to C locale names +# (case-sensitive). Encodings are always separated from the locale +# name using a dot ('.'); they should only be given in case the +# language name is needed to interpret the given encoding alias +# correctly (CJK codes often have this need). +# +# Note that the normalize() function which uses this tables +# removes '_' and '-' characters from the encoding part of the +# locale name before doing the lookup. This saves a lot of +# space in the table. +# +# MAL 2004-12-10: +# Updated alias mapping to most recent locale.alias file +# from X.org distribution using makelocalealias.py. +# +# These are the differences compared to the old mapping (Python 2.4 +# and older): +# +# updated 'bg' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251' +# updated 'bg_bg' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251' +# updated 'bulgarian' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251' +# updated 'cz' -> 'cz_CZ.ISO8859-2' to 'cs_CZ.ISO8859-2' +# updated 'cz_cz' -> 'cz_CZ.ISO8859-2' to 'cs_CZ.ISO8859-2' +# updated 'czech' -> 'cs_CS.ISO8859-2' to 'cs_CZ.ISO8859-2' +# updated 'dutch' -> 'nl_BE.ISO8859-1' to 'nl_NL.ISO8859-1' +# updated 'et' -> 'et_EE.ISO8859-4' to 'et_EE.ISO8859-15' +# updated 'et_ee' -> 'et_EE.ISO8859-4' to 'et_EE.ISO8859-15' +# updated 'fi' -> 'fi_FI.ISO8859-1' to 'fi_FI.ISO8859-15' +# updated 'fi_fi' -> 'fi_FI.ISO8859-1' to 'fi_FI.ISO8859-15' +# updated 'iw' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8' +# updated 'iw_il' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8' +# updated 'japanese' -> 'ja_JP.SJIS' to 'ja_JP.eucJP' +# updated 'lt' -> 'lt_LT.ISO8859-4' to 'lt_LT.ISO8859-13' +# updated 'lv' -> 'lv_LV.ISO8859-4' to 'lv_LV.ISO8859-13' +# updated 'sl' -> 'sl_CS.ISO8859-2' to 'sl_SI.ISO8859-2' +# updated 'slovene' -> 'sl_CS.ISO8859-2' to 'sl_SI.ISO8859-2' +# updated 'th_th' -> 'th_TH.TACTIS' to 'th_TH.ISO8859-11' +# updated 'zh_cn' -> 'zh_CN.eucCN' to 'zh_CN.gb2312' +# updated 'zh_cn.big5' -> 'zh_TW.eucTW' to 'zh_TW.big5' +# updated 'zh_tw' -> 'zh_TW.eucTW' to 'zh_TW.big5' +# +# MAL 2008-05-30: +# Updated alias mapping to most recent locale.alias file +# from X.org distribution using makelocalealias.py. +# +# These are the differences compared to the old mapping (Python 2.5 +# and older): +# +# updated 'cs_cs.iso88592' -> 'cs_CZ.ISO8859-2' to 'cs_CS.ISO8859-2' +# updated 'serbocroatian' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sh' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sh_hr.iso88592' -> 'sh_HR.ISO8859-2' to 'hr_HR.ISO8859-2' +# updated 'sh_sp' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sh_yu' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sp' -> 'sp_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sp_yu' -> 'sp_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr@cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr_sp' -> 'sr_SP.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sr_yu' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr_yu.cp1251@cyrillic' -> 'sr_YU.CP1251' to 'sr_CS.CP1251' +# updated 'sr_yu.iso88592' -> 'sr_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sr_yu.iso88595' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr_yu.iso88595@cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr_yu.microsoftcp1251@cyrillic' -> 'sr_YU.CP1251' to 'sr_CS.CP1251' +# updated 'sr_yu.utf8@cyrillic' -> 'sr_YU.UTF-8' to 'sr_CS.UTF-8' +# updated 'sr_yu@cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# +# AP 2010-04-12: +# Updated alias mapping to most recent locale.alias file +# from X.org distribution using makelocalealias.py. +# +# These are the differences compared to the old mapping (Python 2.6.5 +# and older): +# +# updated 'ru' -> 'ru_RU.ISO8859-5' to 'ru_RU.UTF-8' +# updated 'ru_ru' -> 'ru_RU.ISO8859-5' to 'ru_RU.UTF-8' +# updated 'serbocroatian' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' +# updated 'sh' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' +# updated 'sh_yu' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' +# updated 'sr' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8' +# updated 'sr@cyrillic' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8' +# updated 'sr@latn' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' +# updated 'sr_cs.utf8@latn' -> 'sr_CS.UTF-8' to 'sr_RS.UTF-8@latin' +# updated 'sr_cs@latn' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' +# updated 'sr_yu' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8@latin' +# updated 'sr_yu.utf8@cyrillic' -> 'sr_CS.UTF-8' to 'sr_RS.UTF-8' +# updated 'sr_yu@cyrillic' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8' +# +# SS 2013-12-20: +# Updated alias mapping to most recent locale.alias file +# from X.org distribution using makelocalealias.py. +# +# These are the differences compared to the old mapping (Python 3.3.3 +# and older): +# +# updated 'a3' -> 'a3_AZ.KOI8-C' to 'az_AZ.KOI8-C' +# updated 'a3_az' -> 'a3_AZ.KOI8-C' to 'az_AZ.KOI8-C' +# updated 'a3_az.koi8c' -> 'a3_AZ.KOI8-C' to 'az_AZ.KOI8-C' +# updated 'cs_cs.iso88592' -> 'cs_CS.ISO8859-2' to 'cs_CZ.ISO8859-2' +# updated 'hebrew' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8' +# updated 'hebrew.iso88598' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8' +# updated 'sd' -> 'sd_IN@devanagari.UTF-8' to 'sd_IN.UTF-8' +# updated 'sr@latn' -> 'sr_RS.UTF-8@latin' to 'sr_CS.UTF-8@latin' +# updated 'sr_cs' -> 'sr_RS.UTF-8' to 'sr_CS.UTF-8' +# updated 'sr_cs.utf8@latn' -> 'sr_RS.UTF-8@latin' to 'sr_CS.UTF-8@latin' +# updated 'sr_cs@latn' -> 'sr_RS.UTF-8@latin' to 'sr_CS.UTF-8@latin' +# +# SS 2014-10-01: +# Updated alias mapping with glibc 2.19 supported locales. +# +# SS 2018-05-05: +# Updated alias mapping with glibc 2.27 supported locales. +# +# These are the differences compared to the old mapping (Python 3.6.5 +# and older): +# +# updated 'ca_es@valencia' -> 'ca_ES.ISO8859-15@valencia' to 'ca_ES.UTF-8@valencia' +# updated 'kk_kz' -> 'kk_KZ.RK1048' to 'kk_KZ.ptcp154' +# updated 'russian' -> 'ru_RU.ISO8859-5' to 'ru_RU.KOI8-R' + +locale_alias = { + 'a3': 'az_AZ.KOI8-C', + 'a3_az': 'az_AZ.KOI8-C', + 'a3_az.koic': 'az_AZ.KOI8-C', + 'aa_dj': 'aa_DJ.ISO8859-1', + 'aa_er': 'aa_ER.UTF-8', + 'aa_et': 'aa_ET.UTF-8', + 'af': 'af_ZA.ISO8859-1', + 'af_za': 'af_ZA.ISO8859-1', + 'agr_pe': 'agr_PE.UTF-8', + 'ak_gh': 'ak_GH.UTF-8', + 'am': 'am_ET.UTF-8', + 'am_et': 'am_ET.UTF-8', + 'american': 'en_US.ISO8859-1', + 'an_es': 'an_ES.ISO8859-15', + 'anp_in': 'anp_IN.UTF-8', + 'ar': 'ar_AA.ISO8859-6', + 'ar_aa': 'ar_AA.ISO8859-6', + 'ar_ae': 'ar_AE.ISO8859-6', + 'ar_bh': 'ar_BH.ISO8859-6', + 'ar_dz': 'ar_DZ.ISO8859-6', + 'ar_eg': 'ar_EG.ISO8859-6', + 'ar_in': 'ar_IN.UTF-8', + 'ar_iq': 'ar_IQ.ISO8859-6', + 'ar_jo': 'ar_JO.ISO8859-6', + 'ar_kw': 'ar_KW.ISO8859-6', + 'ar_lb': 'ar_LB.ISO8859-6', + 'ar_ly': 'ar_LY.ISO8859-6', + 'ar_ma': 'ar_MA.ISO8859-6', + 'ar_om': 'ar_OM.ISO8859-6', + 'ar_qa': 'ar_QA.ISO8859-6', + 'ar_sa': 'ar_SA.ISO8859-6', + 'ar_sd': 'ar_SD.ISO8859-6', + 'ar_ss': 'ar_SS.UTF-8', + 'ar_sy': 'ar_SY.ISO8859-6', + 'ar_tn': 'ar_TN.ISO8859-6', + 'ar_ye': 'ar_YE.ISO8859-6', + 'arabic': 'ar_AA.ISO8859-6', + 'as': 'as_IN.UTF-8', + 'as_in': 'as_IN.UTF-8', + 'ast_es': 'ast_ES.ISO8859-15', + 'ayc_pe': 'ayc_PE.UTF-8', + 'az': 'az_AZ.ISO8859-9E', + 'az_az': 'az_AZ.ISO8859-9E', + 'az_az.iso88599e': 'az_AZ.ISO8859-9E', + 'az_ir': 'az_IR.UTF-8', + 'be': 'be_BY.CP1251', + 'be@latin': 'be_BY.UTF-8@latin', + 'be_bg.utf8': 'bg_BG.UTF-8', + 'be_by': 'be_BY.CP1251', + 'be_by@latin': 'be_BY.UTF-8@latin', + 'bem_zm': 'bem_ZM.UTF-8', + 'ber_dz': 'ber_DZ.UTF-8', + 'ber_ma': 'ber_MA.UTF-8', + 'bg': 'bg_BG.CP1251', + 'bg_bg': 'bg_BG.CP1251', + 'bhb_in.utf8': 'bhb_IN.UTF-8', + 'bho_in': 'bho_IN.UTF-8', + 'bho_np': 'bho_NP.UTF-8', + 'bi_vu': 'bi_VU.UTF-8', + 'bn_bd': 'bn_BD.UTF-8', + 'bn_in': 'bn_IN.UTF-8', + 'bo_cn': 'bo_CN.UTF-8', + 'bo_in': 'bo_IN.UTF-8', + 'bokmal': 'nb_NO.ISO8859-1', + 'bokm\xe5l': 'nb_NO.ISO8859-1', + 'br': 'br_FR.ISO8859-1', + 'br_fr': 'br_FR.ISO8859-1', + 'brx_in': 'brx_IN.UTF-8', + 'bs': 'bs_BA.ISO8859-2', + 'bs_ba': 'bs_BA.ISO8859-2', + 'bulgarian': 'bg_BG.CP1251', + 'byn_er': 'byn_ER.UTF-8', + 'c': 'C', + 'c-french': 'fr_CA.ISO8859-1', + 'c.ascii': 'C', + 'c.en': 'C', + 'c.iso88591': 'en_US.ISO8859-1', + 'c.utf8': 'en_US.UTF-8', + 'c_c': 'C', + 'c_c.c': 'C', + 'ca': 'ca_ES.ISO8859-1', + 'ca_ad': 'ca_AD.ISO8859-1', + 'ca_es': 'ca_ES.ISO8859-1', + 'ca_es@valencia': 'ca_ES.UTF-8@valencia', + 'ca_fr': 'ca_FR.ISO8859-1', + 'ca_it': 'ca_IT.ISO8859-1', + 'catalan': 'ca_ES.ISO8859-1', + 'ce_ru': 'ce_RU.UTF-8', + 'cextend': 'en_US.ISO8859-1', + 'chinese-s': 'zh_CN.eucCN', + 'chinese-t': 'zh_TW.eucTW', + 'chr_us': 'chr_US.UTF-8', + 'ckb_iq': 'ckb_IQ.UTF-8', + 'cmn_tw': 'cmn_TW.UTF-8', + 'crh_ua': 'crh_UA.UTF-8', + 'croatian': 'hr_HR.ISO8859-2', + 'cs': 'cs_CZ.ISO8859-2', + 'cs_cs': 'cs_CZ.ISO8859-2', + 'cs_cz': 'cs_CZ.ISO8859-2', + 'csb_pl': 'csb_PL.UTF-8', + 'cv_ru': 'cv_RU.UTF-8', + 'cy': 'cy_GB.ISO8859-1', + 'cy_gb': 'cy_GB.ISO8859-1', + 'cz': 'cs_CZ.ISO8859-2', + 'cz_cz': 'cs_CZ.ISO8859-2', + 'czech': 'cs_CZ.ISO8859-2', + 'da': 'da_DK.ISO8859-1', + 'da_dk': 'da_DK.ISO8859-1', + 'danish': 'da_DK.ISO8859-1', + 'dansk': 'da_DK.ISO8859-1', + 'de': 'de_DE.ISO8859-1', + 'de_at': 'de_AT.ISO8859-1', + 'de_be': 'de_BE.ISO8859-1', + 'de_ch': 'de_CH.ISO8859-1', + 'de_de': 'de_DE.ISO8859-1', + 'de_it': 'de_IT.ISO8859-1', + 'de_li.utf8': 'de_LI.UTF-8', + 'de_lu': 'de_LU.ISO8859-1', + 'deutsch': 'de_DE.ISO8859-1', + 'doi_in': 'doi_IN.UTF-8', + 'dutch': 'nl_NL.ISO8859-1', + 'dutch.iso88591': 'nl_BE.ISO8859-1', + 'dv_mv': 'dv_MV.UTF-8', + 'dz_bt': 'dz_BT.UTF-8', + 'ee': 'ee_EE.ISO8859-4', + 'ee_ee': 'ee_EE.ISO8859-4', + 'eesti': 'et_EE.ISO8859-1', + 'el': 'el_GR.ISO8859-7', + 'el_cy': 'el_CY.ISO8859-7', + 'el_gr': 'el_GR.ISO8859-7', + 'el_gr@euro': 'el_GR.ISO8859-15', + 'en': 'en_US.ISO8859-1', + 'en_ag': 'en_AG.UTF-8', + 'en_au': 'en_AU.ISO8859-1', + 'en_be': 'en_BE.ISO8859-1', + 'en_bw': 'en_BW.ISO8859-1', + 'en_ca': 'en_CA.ISO8859-1', + 'en_dk': 'en_DK.ISO8859-1', + 'en_dl.utf8': 'en_DL.UTF-8', + 'en_gb': 'en_GB.ISO8859-1', + 'en_hk': 'en_HK.ISO8859-1', + 'en_ie': 'en_IE.ISO8859-1', + 'en_il': 'en_IL.UTF-8', + 'en_in': 'en_IN.ISO8859-1', + 'en_ng': 'en_NG.UTF-8', + 'en_nz': 'en_NZ.ISO8859-1', + 'en_ph': 'en_PH.ISO8859-1', + 'en_sc.utf8': 'en_SC.UTF-8', + 'en_sg': 'en_SG.ISO8859-1', + 'en_uk': 'en_GB.ISO8859-1', + 'en_us': 'en_US.ISO8859-1', + 'en_us@euro@euro': 'en_US.ISO8859-15', + 'en_za': 'en_ZA.ISO8859-1', + 'en_zm': 'en_ZM.UTF-8', + 'en_zw': 'en_ZW.ISO8859-1', + 'en_zw.utf8': 'en_ZS.UTF-8', + 'eng_gb': 'en_GB.ISO8859-1', + 'english': 'en_EN.ISO8859-1', + 'english.iso88591': 'en_US.ISO8859-1', + 'english_uk': 'en_GB.ISO8859-1', + 'english_united-states': 'en_US.ISO8859-1', + 'english_united-states.437': 'C', + 'english_us': 'en_US.ISO8859-1', + 'eo': 'eo_XX.ISO8859-3', + 'eo.utf8': 'eo.UTF-8', + 'eo_eo': 'eo_EO.ISO8859-3', + 'eo_us.utf8': 'eo_US.UTF-8', + 'eo_xx': 'eo_XX.ISO8859-3', + 'es': 'es_ES.ISO8859-1', + 'es_ar': 'es_AR.ISO8859-1', + 'es_bo': 'es_BO.ISO8859-1', + 'es_cl': 'es_CL.ISO8859-1', + 'es_co': 'es_CO.ISO8859-1', + 'es_cr': 'es_CR.ISO8859-1', + 'es_cu': 'es_CU.UTF-8', + 'es_do': 'es_DO.ISO8859-1', + 'es_ec': 'es_EC.ISO8859-1', + 'es_es': 'es_ES.ISO8859-1', + 'es_gt': 'es_GT.ISO8859-1', + 'es_hn': 'es_HN.ISO8859-1', + 'es_mx': 'es_MX.ISO8859-1', + 'es_ni': 'es_NI.ISO8859-1', + 'es_pa': 'es_PA.ISO8859-1', + 'es_pe': 'es_PE.ISO8859-1', + 'es_pr': 'es_PR.ISO8859-1', + 'es_py': 'es_PY.ISO8859-1', + 'es_sv': 'es_SV.ISO8859-1', + 'es_us': 'es_US.ISO8859-1', + 'es_uy': 'es_UY.ISO8859-1', + 'es_ve': 'es_VE.ISO8859-1', + 'estonian': 'et_EE.ISO8859-1', + 'et': 'et_EE.ISO8859-15', + 'et_ee': 'et_EE.ISO8859-15', + 'eu': 'eu_ES.ISO8859-1', + 'eu_es': 'eu_ES.ISO8859-1', + 'eu_fr': 'eu_FR.ISO8859-1', + 'fa': 'fa_IR.UTF-8', + 'fa_ir': 'fa_IR.UTF-8', + 'fa_ir.isiri3342': 'fa_IR.ISIRI-3342', + 'ff_sn': 'ff_SN.UTF-8', + 'fi': 'fi_FI.ISO8859-15', + 'fi_fi': 'fi_FI.ISO8859-15', + 'fil_ph': 'fil_PH.UTF-8', + 'finnish': 'fi_FI.ISO8859-1', + 'fo': 'fo_FO.ISO8859-1', + 'fo_fo': 'fo_FO.ISO8859-1', + 'fr': 'fr_FR.ISO8859-1', + 'fr_be': 'fr_BE.ISO8859-1', + 'fr_ca': 'fr_CA.ISO8859-1', + 'fr_ch': 'fr_CH.ISO8859-1', + 'fr_fr': 'fr_FR.ISO8859-1', + 'fr_lu': 'fr_LU.ISO8859-1', + 'fran\xe7ais': 'fr_FR.ISO8859-1', + 'fre_fr': 'fr_FR.ISO8859-1', + 'french': 'fr_FR.ISO8859-1', + 'french.iso88591': 'fr_CH.ISO8859-1', + 'french_france': 'fr_FR.ISO8859-1', + 'fur_it': 'fur_IT.UTF-8', + 'fy_de': 'fy_DE.UTF-8', + 'fy_nl': 'fy_NL.UTF-8', + 'ga': 'ga_IE.ISO8859-1', + 'ga_ie': 'ga_IE.ISO8859-1', + 'galego': 'gl_ES.ISO8859-1', + 'galician': 'gl_ES.ISO8859-1', + 'gd': 'gd_GB.ISO8859-1', + 'gd_gb': 'gd_GB.ISO8859-1', + 'ger_de': 'de_DE.ISO8859-1', + 'german': 'de_DE.ISO8859-1', + 'german.iso88591': 'de_CH.ISO8859-1', + 'german_germany': 'de_DE.ISO8859-1', + 'gez_er': 'gez_ER.UTF-8', + 'gez_et': 'gez_ET.UTF-8', + 'gl': 'gl_ES.ISO8859-1', + 'gl_es': 'gl_ES.ISO8859-1', + 'greek': 'el_GR.ISO8859-7', + 'gu_in': 'gu_IN.UTF-8', + 'gv': 'gv_GB.ISO8859-1', + 'gv_gb': 'gv_GB.ISO8859-1', + 'ha_ng': 'ha_NG.UTF-8', + 'hak_tw': 'hak_TW.UTF-8', + 'he': 'he_IL.ISO8859-8', + 'he_il': 'he_IL.ISO8859-8', + 'hebrew': 'he_IL.ISO8859-8', + 'hi': 'hi_IN.ISCII-DEV', + 'hi_in': 'hi_IN.ISCII-DEV', + 'hi_in.isciidev': 'hi_IN.ISCII-DEV', + 'hif_fj': 'hif_FJ.UTF-8', + 'hne': 'hne_IN.UTF-8', + 'hne_in': 'hne_IN.UTF-8', + 'hr': 'hr_HR.ISO8859-2', + 'hr_hr': 'hr_HR.ISO8859-2', + 'hrvatski': 'hr_HR.ISO8859-2', + 'hsb_de': 'hsb_DE.ISO8859-2', + 'ht_ht': 'ht_HT.UTF-8', + 'hu': 'hu_HU.ISO8859-2', + 'hu_hu': 'hu_HU.ISO8859-2', + 'hungarian': 'hu_HU.ISO8859-2', + 'hy_am': 'hy_AM.UTF-8', + 'hy_am.armscii8': 'hy_AM.ARMSCII_8', + 'ia': 'ia.UTF-8', + 'ia_fr': 'ia_FR.UTF-8', + 'icelandic': 'is_IS.ISO8859-1', + 'id': 'id_ID.ISO8859-1', + 'id_id': 'id_ID.ISO8859-1', + 'ig_ng': 'ig_NG.UTF-8', + 'ik_ca': 'ik_CA.UTF-8', + 'in': 'id_ID.ISO8859-1', + 'in_id': 'id_ID.ISO8859-1', + 'is': 'is_IS.ISO8859-1', + 'is_is': 'is_IS.ISO8859-1', + 'iso-8859-1': 'en_US.ISO8859-1', + 'iso-8859-15': 'en_US.ISO8859-15', + 'iso8859-1': 'en_US.ISO8859-1', + 'iso8859-15': 'en_US.ISO8859-15', + 'iso_8859_1': 'en_US.ISO8859-1', + 'iso_8859_15': 'en_US.ISO8859-15', + 'it': 'it_IT.ISO8859-1', + 'it_ch': 'it_CH.ISO8859-1', + 'it_it': 'it_IT.ISO8859-1', + 'italian': 'it_IT.ISO8859-1', + 'iu': 'iu_CA.NUNACOM-8', + 'iu_ca': 'iu_CA.NUNACOM-8', + 'iu_ca.nunacom8': 'iu_CA.NUNACOM-8', + 'iw': 'he_IL.ISO8859-8', + 'iw_il': 'he_IL.ISO8859-8', + 'iw_il.utf8': 'iw_IL.UTF-8', + 'ja': 'ja_JP.eucJP', + 'ja_jp': 'ja_JP.eucJP', + 'ja_jp.euc': 'ja_JP.eucJP', + 'ja_jp.mscode': 'ja_JP.SJIS', + 'ja_jp.pck': 'ja_JP.SJIS', + 'japan': 'ja_JP.eucJP', + 'japanese': 'ja_JP.eucJP', + 'japanese-euc': 'ja_JP.eucJP', + 'japanese.euc': 'ja_JP.eucJP', + 'jp_jp': 'ja_JP.eucJP', + 'ka': 'ka_GE.GEORGIAN-ACADEMY', + 'ka_ge': 'ka_GE.GEORGIAN-ACADEMY', + 'ka_ge.georgianacademy': 'ka_GE.GEORGIAN-ACADEMY', + 'ka_ge.georgianps': 'ka_GE.GEORGIAN-PS', + 'ka_ge.georgianrs': 'ka_GE.GEORGIAN-ACADEMY', + 'kab_dz': 'kab_DZ.UTF-8', + 'kk_kz': 'kk_KZ.ptcp154', + 'kl': 'kl_GL.ISO8859-1', + 'kl_gl': 'kl_GL.ISO8859-1', + 'km_kh': 'km_KH.UTF-8', + 'kn': 'kn_IN.UTF-8', + 'kn_in': 'kn_IN.UTF-8', + 'ko': 'ko_KR.eucKR', + 'ko_kr': 'ko_KR.eucKR', + 'ko_kr.euc': 'ko_KR.eucKR', + 'kok_in': 'kok_IN.UTF-8', + 'korean': 'ko_KR.eucKR', + 'korean.euc': 'ko_KR.eucKR', + 'ks': 'ks_IN.UTF-8', + 'ks_in': 'ks_IN.UTF-8', + 'ks_in@devanagari.utf8': 'ks_IN.UTF-8@devanagari', + 'ku_tr': 'ku_TR.ISO8859-9', + 'kw': 'kw_GB.ISO8859-1', + 'kw_gb': 'kw_GB.ISO8859-1', + 'ky': 'ky_KG.UTF-8', + 'ky_kg': 'ky_KG.UTF-8', + 'lb_lu': 'lb_LU.UTF-8', + 'lg_ug': 'lg_UG.ISO8859-10', + 'li_be': 'li_BE.UTF-8', + 'li_nl': 'li_NL.UTF-8', + 'lij_it': 'lij_IT.UTF-8', + 'lithuanian': 'lt_LT.ISO8859-13', + 'ln_cd': 'ln_CD.UTF-8', + 'lo': 'lo_LA.MULELAO-1', + 'lo_la': 'lo_LA.MULELAO-1', + 'lo_la.cp1133': 'lo_LA.IBM-CP1133', + 'lo_la.ibmcp1133': 'lo_LA.IBM-CP1133', + 'lo_la.mulelao1': 'lo_LA.MULELAO-1', + 'lt': 'lt_LT.ISO8859-13', + 'lt_lt': 'lt_LT.ISO8859-13', + 'lv': 'lv_LV.ISO8859-13', + 'lv_lv': 'lv_LV.ISO8859-13', + 'lzh_tw': 'lzh_TW.UTF-8', + 'mag_in': 'mag_IN.UTF-8', + 'mai': 'mai_IN.UTF-8', + 'mai_in': 'mai_IN.UTF-8', + 'mai_np': 'mai_NP.UTF-8', + 'mfe_mu': 'mfe_MU.UTF-8', + 'mg_mg': 'mg_MG.ISO8859-15', + 'mhr_ru': 'mhr_RU.UTF-8', + 'mi': 'mi_NZ.ISO8859-1', + 'mi_nz': 'mi_NZ.ISO8859-1', + 'miq_ni': 'miq_NI.UTF-8', + 'mjw_in': 'mjw_IN.UTF-8', + 'mk': 'mk_MK.ISO8859-5', + 'mk_mk': 'mk_MK.ISO8859-5', + 'ml': 'ml_IN.UTF-8', + 'ml_in': 'ml_IN.UTF-8', + 'mn_mn': 'mn_MN.UTF-8', + 'mni_in': 'mni_IN.UTF-8', + 'mr': 'mr_IN.UTF-8', + 'mr_in': 'mr_IN.UTF-8', + 'ms': 'ms_MY.ISO8859-1', + 'ms_my': 'ms_MY.ISO8859-1', + 'mt': 'mt_MT.ISO8859-3', + 'mt_mt': 'mt_MT.ISO8859-3', + 'my_mm': 'my_MM.UTF-8', + 'nan_tw': 'nan_TW.UTF-8', + 'nb': 'nb_NO.ISO8859-1', + 'nb_no': 'nb_NO.ISO8859-1', + 'nds_de': 'nds_DE.UTF-8', + 'nds_nl': 'nds_NL.UTF-8', + 'ne_np': 'ne_NP.UTF-8', + 'nhn_mx': 'nhn_MX.UTF-8', + 'niu_nu': 'niu_NU.UTF-8', + 'niu_nz': 'niu_NZ.UTF-8', + 'nl': 'nl_NL.ISO8859-1', + 'nl_aw': 'nl_AW.UTF-8', + 'nl_be': 'nl_BE.ISO8859-1', + 'nl_nl': 'nl_NL.ISO8859-1', + 'nn': 'nn_NO.ISO8859-1', + 'nn_no': 'nn_NO.ISO8859-1', + 'no': 'no_NO.ISO8859-1', + 'no@nynorsk': 'ny_NO.ISO8859-1', + 'no_no': 'no_NO.ISO8859-1', + 'no_no.iso88591@bokmal': 'no_NO.ISO8859-1', + 'no_no.iso88591@nynorsk': 'no_NO.ISO8859-1', + 'norwegian': 'no_NO.ISO8859-1', + 'nr': 'nr_ZA.ISO8859-1', + 'nr_za': 'nr_ZA.ISO8859-1', + 'nso': 'nso_ZA.ISO8859-15', + 'nso_za': 'nso_ZA.ISO8859-15', + 'ny': 'ny_NO.ISO8859-1', + 'ny_no': 'ny_NO.ISO8859-1', + 'nynorsk': 'nn_NO.ISO8859-1', + 'oc': 'oc_FR.ISO8859-1', + 'oc_fr': 'oc_FR.ISO8859-1', + 'om_et': 'om_ET.UTF-8', + 'om_ke': 'om_KE.ISO8859-1', + 'or': 'or_IN.UTF-8', + 'or_in': 'or_IN.UTF-8', + 'os_ru': 'os_RU.UTF-8', + 'pa': 'pa_IN.UTF-8', + 'pa_in': 'pa_IN.UTF-8', + 'pa_pk': 'pa_PK.UTF-8', + 'pap_an': 'pap_AN.UTF-8', + 'pap_aw': 'pap_AW.UTF-8', + 'pap_cw': 'pap_CW.UTF-8', + 'pd': 'pd_US.ISO8859-1', + 'pd_de': 'pd_DE.ISO8859-1', + 'pd_us': 'pd_US.ISO8859-1', + 'ph': 'ph_PH.ISO8859-1', + 'ph_ph': 'ph_PH.ISO8859-1', + 'pl': 'pl_PL.ISO8859-2', + 'pl_pl': 'pl_PL.ISO8859-2', + 'polish': 'pl_PL.ISO8859-2', + 'portuguese': 'pt_PT.ISO8859-1', + 'portuguese_brazil': 'pt_BR.ISO8859-1', + 'posix': 'C', + 'posix-utf2': 'C', + 'pp': 'pp_AN.ISO8859-1', + 'pp_an': 'pp_AN.ISO8859-1', + 'ps_af': 'ps_AF.UTF-8', + 'pt': 'pt_PT.ISO8859-1', + 'pt_br': 'pt_BR.ISO8859-1', + 'pt_pt': 'pt_PT.ISO8859-1', + 'quz_pe': 'quz_PE.UTF-8', + 'raj_in': 'raj_IN.UTF-8', + 'ro': 'ro_RO.ISO8859-2', + 'ro_ro': 'ro_RO.ISO8859-2', + 'romanian': 'ro_RO.ISO8859-2', + 'ru': 'ru_RU.UTF-8', + 'ru_ru': 'ru_RU.UTF-8', + 'ru_ua': 'ru_UA.KOI8-U', + 'rumanian': 'ro_RO.ISO8859-2', + 'russian': 'ru_RU.KOI8-R', + 'rw': 'rw_RW.ISO8859-1', + 'rw_rw': 'rw_RW.ISO8859-1', + 'sa_in': 'sa_IN.UTF-8', + 'sat_in': 'sat_IN.UTF-8', + 'sc_it': 'sc_IT.UTF-8', + 'sd': 'sd_IN.UTF-8', + 'sd_in': 'sd_IN.UTF-8', + 'sd_in@devanagari.utf8': 'sd_IN.UTF-8@devanagari', + 'sd_pk': 'sd_PK.UTF-8', + 'se_no': 'se_NO.UTF-8', + 'serbocroatian': 'sr_RS.UTF-8@latin', + 'sgs_lt': 'sgs_LT.UTF-8', + 'sh': 'sr_RS.UTF-8@latin', + 'sh_ba.iso88592@bosnia': 'sr_CS.ISO8859-2', + 'sh_hr': 'sh_HR.ISO8859-2', + 'sh_hr.iso88592': 'hr_HR.ISO8859-2', + 'sh_sp': 'sr_CS.ISO8859-2', + 'sh_yu': 'sr_RS.UTF-8@latin', + 'shn_mm': 'shn_MM.UTF-8', + 'shs_ca': 'shs_CA.UTF-8', + 'si': 'si_LK.UTF-8', + 'si_lk': 'si_LK.UTF-8', + 'sid_et': 'sid_ET.UTF-8', + 'sinhala': 'si_LK.UTF-8', + 'sk': 'sk_SK.ISO8859-2', + 'sk_sk': 'sk_SK.ISO8859-2', + 'sl': 'sl_SI.ISO8859-2', + 'sl_cs': 'sl_CS.ISO8859-2', + 'sl_si': 'sl_SI.ISO8859-2', + 'slovak': 'sk_SK.ISO8859-2', + 'slovene': 'sl_SI.ISO8859-2', + 'slovenian': 'sl_SI.ISO8859-2', + 'sm_ws': 'sm_WS.UTF-8', + 'so_dj': 'so_DJ.ISO8859-1', + 'so_et': 'so_ET.UTF-8', + 'so_ke': 'so_KE.ISO8859-1', + 'so_so': 'so_SO.ISO8859-1', + 'sp': 'sr_CS.ISO8859-5', + 'sp_yu': 'sr_CS.ISO8859-5', + 'spanish': 'es_ES.ISO8859-1', + 'spanish_spain': 'es_ES.ISO8859-1', + 'sq': 'sq_AL.ISO8859-2', + 'sq_al': 'sq_AL.ISO8859-2', + 'sq_mk': 'sq_MK.UTF-8', + 'sr': 'sr_RS.UTF-8', + 'sr@cyrillic': 'sr_RS.UTF-8', + 'sr@latn': 'sr_CS.UTF-8@latin', + 'sr_cs': 'sr_CS.UTF-8', + 'sr_cs.iso88592@latn': 'sr_CS.ISO8859-2', + 'sr_cs@latn': 'sr_CS.UTF-8@latin', + 'sr_me': 'sr_ME.UTF-8', + 'sr_rs': 'sr_RS.UTF-8', + 'sr_rs@latn': 'sr_RS.UTF-8@latin', + 'sr_sp': 'sr_CS.ISO8859-2', + 'sr_yu': 'sr_RS.UTF-8@latin', + 'sr_yu.cp1251@cyrillic': 'sr_CS.CP1251', + 'sr_yu.iso88592': 'sr_CS.ISO8859-2', + 'sr_yu.iso88595': 'sr_CS.ISO8859-5', + 'sr_yu.iso88595@cyrillic': 'sr_CS.ISO8859-5', + 'sr_yu.microsoftcp1251@cyrillic': 'sr_CS.CP1251', + 'sr_yu.utf8': 'sr_RS.UTF-8', + 'sr_yu.utf8@cyrillic': 'sr_RS.UTF-8', + 'sr_yu@cyrillic': 'sr_RS.UTF-8', + 'ss': 'ss_ZA.ISO8859-1', + 'ss_za': 'ss_ZA.ISO8859-1', + 'st': 'st_ZA.ISO8859-1', + 'st_za': 'st_ZA.ISO8859-1', + 'sv': 'sv_SE.ISO8859-1', + 'sv_fi': 'sv_FI.ISO8859-1', + 'sv_se': 'sv_SE.ISO8859-1', + 'sw_ke': 'sw_KE.UTF-8', + 'sw_tz': 'sw_TZ.UTF-8', + 'swedish': 'sv_SE.ISO8859-1', + 'szl_pl': 'szl_PL.UTF-8', + 'ta': 'ta_IN.TSCII-0', + 'ta_in': 'ta_IN.TSCII-0', + 'ta_in.tscii': 'ta_IN.TSCII-0', + 'ta_in.tscii0': 'ta_IN.TSCII-0', + 'ta_lk': 'ta_LK.UTF-8', + 'tcy_in.utf8': 'tcy_IN.UTF-8', + 'te': 'te_IN.UTF-8', + 'te_in': 'te_IN.UTF-8', + 'tg': 'tg_TJ.KOI8-C', + 'tg_tj': 'tg_TJ.KOI8-C', + 'th': 'th_TH.ISO8859-11', + 'th_th': 'th_TH.ISO8859-11', + 'th_th.tactis': 'th_TH.TIS620', + 'th_th.tis620': 'th_TH.TIS620', + 'thai': 'th_TH.ISO8859-11', + 'the_np': 'the_NP.UTF-8', + 'ti_er': 'ti_ER.UTF-8', + 'ti_et': 'ti_ET.UTF-8', + 'tig_er': 'tig_ER.UTF-8', + 'tk_tm': 'tk_TM.UTF-8', + 'tl': 'tl_PH.ISO8859-1', + 'tl_ph': 'tl_PH.ISO8859-1', + 'tn': 'tn_ZA.ISO8859-15', + 'tn_za': 'tn_ZA.ISO8859-15', + 'to_to': 'to_TO.UTF-8', + 'tpi_pg': 'tpi_PG.UTF-8', + 'tr': 'tr_TR.ISO8859-9', + 'tr_cy': 'tr_CY.ISO8859-9', + 'tr_tr': 'tr_TR.ISO8859-9', + 'ts': 'ts_ZA.ISO8859-1', + 'ts_za': 'ts_ZA.ISO8859-1', + 'tt': 'tt_RU.TATAR-CYR', + 'tt_ru': 'tt_RU.TATAR-CYR', + 'tt_ru.tatarcyr': 'tt_RU.TATAR-CYR', + 'tt_ru@iqtelif': 'tt_RU.UTF-8@iqtelif', + 'turkish': 'tr_TR.ISO8859-9', + 'ug_cn': 'ug_CN.UTF-8', + 'uk': 'uk_UA.KOI8-U', + 'uk_ua': 'uk_UA.KOI8-U', + 'univ': 'en_US.utf', + 'universal': 'en_US.utf', + 'universal.utf8@ucs4': 'en_US.UTF-8', + 'unm_us': 'unm_US.UTF-8', + 'ur': 'ur_PK.CP1256', + 'ur_in': 'ur_IN.UTF-8', + 'ur_pk': 'ur_PK.CP1256', + 'uz': 'uz_UZ.UTF-8', + 'uz_uz': 'uz_UZ.UTF-8', + 'uz_uz@cyrillic': 'uz_UZ.UTF-8', + 've': 've_ZA.UTF-8', + 've_za': 've_ZA.UTF-8', + 'vi': 'vi_VN.TCVN', + 'vi_vn': 'vi_VN.TCVN', + 'vi_vn.tcvn': 'vi_VN.TCVN', + 'vi_vn.tcvn5712': 'vi_VN.TCVN', + 'vi_vn.viscii': 'vi_VN.VISCII', + 'vi_vn.viscii111': 'vi_VN.VISCII', + 'wa': 'wa_BE.ISO8859-1', + 'wa_be': 'wa_BE.ISO8859-1', + 'wae_ch': 'wae_CH.UTF-8', + 'wal_et': 'wal_ET.UTF-8', + 'wo_sn': 'wo_SN.UTF-8', + 'xh': 'xh_ZA.ISO8859-1', + 'xh_za': 'xh_ZA.ISO8859-1', + 'yi': 'yi_US.CP1255', + 'yi_us': 'yi_US.CP1255', + 'yo_ng': 'yo_NG.UTF-8', + 'yue_hk': 'yue_HK.UTF-8', + 'yuw_pg': 'yuw_PG.UTF-8', + 'zh': 'zh_CN.eucCN', + 'zh_cn': 'zh_CN.gb2312', + 'zh_cn.big5': 'zh_TW.big5', + 'zh_cn.euc': 'zh_CN.eucCN', + 'zh_hk': 'zh_HK.big5hkscs', + 'zh_hk.big5hk': 'zh_HK.big5hkscs', + 'zh_sg': 'zh_SG.GB2312', + 'zh_sg.gbk': 'zh_SG.GBK', + 'zh_tw': 'zh_TW.big5', + 'zh_tw.euc': 'zh_TW.eucTW', + 'zh_tw.euctw': 'zh_TW.eucTW', + 'zu': 'zu_ZA.ISO8859-1', + 'zu_za': 'zu_ZA.ISO8859-1', +} + +# +# This maps Windows language identifiers to locale strings. +# +# This list has been updated from +# http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_238z.asp +# to include every locale up to Windows Vista. +# +# NOTE: this mapping is incomplete. If your language is missing, please +# submit a bug report to the Python bug tracker at http://bugs.python.org/ +# Make sure you include the missing language identifier and the suggested +# locale code. +# + +windows_locale = { + 0x0436: "af_ZA", # Afrikaans + 0x041c: "sq_AL", # Albanian + 0x0484: "gsw_FR",# Alsatian - France + 0x045e: "am_ET", # Amharic - Ethiopia + 0x0401: "ar_SA", # Arabic - Saudi Arabia + 0x0801: "ar_IQ", # Arabic - Iraq + 0x0c01: "ar_EG", # Arabic - Egypt + 0x1001: "ar_LY", # Arabic - Libya + 0x1401: "ar_DZ", # Arabic - Algeria + 0x1801: "ar_MA", # Arabic - Morocco + 0x1c01: "ar_TN", # Arabic - Tunisia + 0x2001: "ar_OM", # Arabic - Oman + 0x2401: "ar_YE", # Arabic - Yemen + 0x2801: "ar_SY", # Arabic - Syria + 0x2c01: "ar_JO", # Arabic - Jordan + 0x3001: "ar_LB", # Arabic - Lebanon + 0x3401: "ar_KW", # Arabic - Kuwait + 0x3801: "ar_AE", # Arabic - United Arab Emirates + 0x3c01: "ar_BH", # Arabic - Bahrain + 0x4001: "ar_QA", # Arabic - Qatar + 0x042b: "hy_AM", # Armenian + 0x044d: "as_IN", # Assamese - India + 0x042c: "az_AZ", # Azeri - Latin + 0x082c: "az_AZ", # Azeri - Cyrillic + 0x046d: "ba_RU", # Bashkir + 0x042d: "eu_ES", # Basque - Russia + 0x0423: "be_BY", # Belarusian + 0x0445: "bn_IN", # Begali + 0x201a: "bs_BA", # Bosnian - Cyrillic + 0x141a: "bs_BA", # Bosnian - Latin + 0x047e: "br_FR", # Breton - France + 0x0402: "bg_BG", # Bulgarian +# 0x0455: "my_MM", # Burmese - Not supported + 0x0403: "ca_ES", # Catalan + 0x0004: "zh_CHS",# Chinese - Simplified + 0x0404: "zh_TW", # Chinese - Taiwan + 0x0804: "zh_CN", # Chinese - PRC + 0x0c04: "zh_HK", # Chinese - Hong Kong S.A.R. + 0x1004: "zh_SG", # Chinese - Singapore + 0x1404: "zh_MO", # Chinese - Macao S.A.R. + 0x7c04: "zh_CHT",# Chinese - Traditional + 0x0483: "co_FR", # Corsican - France + 0x041a: "hr_HR", # Croatian + 0x101a: "hr_BA", # Croatian - Bosnia + 0x0405: "cs_CZ", # Czech + 0x0406: "da_DK", # Danish + 0x048c: "gbz_AF",# Dari - Afghanistan + 0x0465: "div_MV",# Divehi - Maldives + 0x0413: "nl_NL", # Dutch - The Netherlands + 0x0813: "nl_BE", # Dutch - Belgium + 0x0409: "en_US", # English - United States + 0x0809: "en_GB", # English - United Kingdom + 0x0c09: "en_AU", # English - Australia + 0x1009: "en_CA", # English - Canada + 0x1409: "en_NZ", # English - New Zealand + 0x1809: "en_IE", # English - Ireland + 0x1c09: "en_ZA", # English - South Africa + 0x2009: "en_JA", # English - Jamaica + 0x2409: "en_CB", # English - Caribbean + 0x2809: "en_BZ", # English - Belize + 0x2c09: "en_TT", # English - Trinidad + 0x3009: "en_ZW", # English - Zimbabwe + 0x3409: "en_PH", # English - Philippines + 0x4009: "en_IN", # English - India + 0x4409: "en_MY", # English - Malaysia + 0x4809: "en_IN", # English - Singapore + 0x0425: "et_EE", # Estonian + 0x0438: "fo_FO", # Faroese + 0x0464: "fil_PH",# Filipino + 0x040b: "fi_FI", # Finnish + 0x040c: "fr_FR", # French - France + 0x080c: "fr_BE", # French - Belgium + 0x0c0c: "fr_CA", # French - Canada + 0x100c: "fr_CH", # French - Switzerland + 0x140c: "fr_LU", # French - Luxembourg + 0x180c: "fr_MC", # French - Monaco + 0x0462: "fy_NL", # Frisian - Netherlands + 0x0456: "gl_ES", # Galician + 0x0437: "ka_GE", # Georgian + 0x0407: "de_DE", # German - Germany + 0x0807: "de_CH", # German - Switzerland + 0x0c07: "de_AT", # German - Austria + 0x1007: "de_LU", # German - Luxembourg + 0x1407: "de_LI", # German - Liechtenstein + 0x0408: "el_GR", # Greek + 0x046f: "kl_GL", # Greenlandic - Greenland + 0x0447: "gu_IN", # Gujarati + 0x0468: "ha_NG", # Hausa - Latin + 0x040d: "he_IL", # Hebrew + 0x0439: "hi_IN", # Hindi + 0x040e: "hu_HU", # Hungarian + 0x040f: "is_IS", # Icelandic + 0x0421: "id_ID", # Indonesian + 0x045d: "iu_CA", # Inuktitut - Syllabics + 0x085d: "iu_CA", # Inuktitut - Latin + 0x083c: "ga_IE", # Irish - Ireland + 0x0410: "it_IT", # Italian - Italy + 0x0810: "it_CH", # Italian - Switzerland + 0x0411: "ja_JP", # Japanese + 0x044b: "kn_IN", # Kannada - India + 0x043f: "kk_KZ", # Kazakh + 0x0453: "kh_KH", # Khmer - Cambodia + 0x0486: "qut_GT",# K'iche - Guatemala + 0x0487: "rw_RW", # Kinyarwanda - Rwanda + 0x0457: "kok_IN",# Konkani + 0x0412: "ko_KR", # Korean + 0x0440: "ky_KG", # Kyrgyz + 0x0454: "lo_LA", # Lao - Lao PDR + 0x0426: "lv_LV", # Latvian + 0x0427: "lt_LT", # Lithuanian + 0x082e: "dsb_DE",# Lower Sorbian - Germany + 0x046e: "lb_LU", # Luxembourgish + 0x042f: "mk_MK", # FYROM Macedonian + 0x043e: "ms_MY", # Malay - Malaysia + 0x083e: "ms_BN", # Malay - Brunei Darussalam + 0x044c: "ml_IN", # Malayalam - India + 0x043a: "mt_MT", # Maltese + 0x0481: "mi_NZ", # Maori + 0x047a: "arn_CL",# Mapudungun + 0x044e: "mr_IN", # Marathi + 0x047c: "moh_CA",# Mohawk - Canada + 0x0450: "mn_MN", # Mongolian - Cyrillic + 0x0850: "mn_CN", # Mongolian - PRC + 0x0461: "ne_NP", # Nepali + 0x0414: "nb_NO", # Norwegian - Bokmal + 0x0814: "nn_NO", # Norwegian - Nynorsk + 0x0482: "oc_FR", # Occitan - France + 0x0448: "or_IN", # Oriya - India + 0x0463: "ps_AF", # Pashto - Afghanistan + 0x0429: "fa_IR", # Persian + 0x0415: "pl_PL", # Polish + 0x0416: "pt_BR", # Portuguese - Brazil + 0x0816: "pt_PT", # Portuguese - Portugal + 0x0446: "pa_IN", # Punjabi + 0x046b: "quz_BO",# Quechua (Bolivia) + 0x086b: "quz_EC",# Quechua (Ecuador) + 0x0c6b: "quz_PE",# Quechua (Peru) + 0x0418: "ro_RO", # Romanian - Romania + 0x0417: "rm_CH", # Romansh + 0x0419: "ru_RU", # Russian + 0x243b: "smn_FI",# Sami Finland + 0x103b: "smj_NO",# Sami Norway + 0x143b: "smj_SE",# Sami Sweden + 0x043b: "se_NO", # Sami Northern Norway + 0x083b: "se_SE", # Sami Northern Sweden + 0x0c3b: "se_FI", # Sami Northern Finland + 0x203b: "sms_FI",# Sami Skolt + 0x183b: "sma_NO",# Sami Southern Norway + 0x1c3b: "sma_SE",# Sami Southern Sweden + 0x044f: "sa_IN", # Sanskrit + 0x0c1a: "sr_SP", # Serbian - Cyrillic + 0x1c1a: "sr_BA", # Serbian - Bosnia Cyrillic + 0x081a: "sr_SP", # Serbian - Latin + 0x181a: "sr_BA", # Serbian - Bosnia Latin + 0x045b: "si_LK", # Sinhala - Sri Lanka + 0x046c: "ns_ZA", # Northern Sotho + 0x0432: "tn_ZA", # Setswana - Southern Africa + 0x041b: "sk_SK", # Slovak + 0x0424: "sl_SI", # Slovenian + 0x040a: "es_ES", # Spanish - Spain + 0x080a: "es_MX", # Spanish - Mexico + 0x0c0a: "es_ES", # Spanish - Spain (Modern) + 0x100a: "es_GT", # Spanish - Guatemala + 0x140a: "es_CR", # Spanish - Costa Rica + 0x180a: "es_PA", # Spanish - Panama + 0x1c0a: "es_DO", # Spanish - Dominican Republic + 0x200a: "es_VE", # Spanish - Venezuela + 0x240a: "es_CO", # Spanish - Colombia + 0x280a: "es_PE", # Spanish - Peru + 0x2c0a: "es_AR", # Spanish - Argentina + 0x300a: "es_EC", # Spanish - Ecuador + 0x340a: "es_CL", # Spanish - Chile + 0x380a: "es_UR", # Spanish - Uruguay + 0x3c0a: "es_PY", # Spanish - Paraguay + 0x400a: "es_BO", # Spanish - Bolivia + 0x440a: "es_SV", # Spanish - El Salvador + 0x480a: "es_HN", # Spanish - Honduras + 0x4c0a: "es_NI", # Spanish - Nicaragua + 0x500a: "es_PR", # Spanish - Puerto Rico + 0x540a: "es_US", # Spanish - United States +# 0x0430: "", # Sutu - Not supported + 0x0441: "sw_KE", # Swahili + 0x041d: "sv_SE", # Swedish - Sweden + 0x081d: "sv_FI", # Swedish - Finland + 0x045a: "syr_SY",# Syriac + 0x0428: "tg_TJ", # Tajik - Cyrillic + 0x085f: "tmz_DZ",# Tamazight - Latin + 0x0449: "ta_IN", # Tamil + 0x0444: "tt_RU", # Tatar + 0x044a: "te_IN", # Telugu + 0x041e: "th_TH", # Thai + 0x0851: "bo_BT", # Tibetan - Bhutan + 0x0451: "bo_CN", # Tibetan - PRC + 0x041f: "tr_TR", # Turkish + 0x0442: "tk_TM", # Turkmen - Cyrillic + 0x0480: "ug_CN", # Uighur - Arabic + 0x0422: "uk_UA", # Ukrainian + 0x042e: "wen_DE",# Upper Sorbian - Germany + 0x0420: "ur_PK", # Urdu + 0x0820: "ur_IN", # Urdu - India + 0x0443: "uz_UZ", # Uzbek - Latin + 0x0843: "uz_UZ", # Uzbek - Cyrillic + 0x042a: "vi_VN", # Vietnamese + 0x0452: "cy_GB", # Welsh + 0x0488: "wo_SN", # Wolof - Senegal + 0x0434: "xh_ZA", # Xhosa - South Africa + 0x0485: "sah_RU",# Yakut - Cyrillic + 0x0478: "ii_CN", # Yi - PRC + 0x046a: "yo_NG", # Yoruba - Nigeria + 0x0435: "zu_ZA", # Zulu +} + +def _print_locale(): + + """ Test function. + """ + categories = {} + def _init_categories(categories=categories): + for k,v in globals().items(): + if k[:3] == 'LC_': + categories[k] = v + _init_categories() + del categories['LC_ALL'] + + print('Locale defaults as determined by getdefaultlocale():') + print('-'*72) + lang, enc = getdefaultlocale() + print('Language: ', lang or '(undefined)') + print('Encoding: ', enc or '(undefined)') + print() + + print('Locale settings on startup:') + print('-'*72) + for name,category in categories.items(): + print(name, '...') + lang, enc = getlocale(category) + print(' Language: ', lang or '(undefined)') + print(' Encoding: ', enc or '(undefined)') + print() + + print() + print('Locale settings after calling resetlocale():') + print('-'*72) + resetlocale() + for name,category in categories.items(): + print(name, '...') + lang, enc = getlocale(category) + print(' Language: ', lang or '(undefined)') + print(' Encoding: ', enc or '(undefined)') + print() + + try: + setlocale(LC_ALL, "") + except: + print('NOTE:') + print('setlocale(LC_ALL, "") does not support the default locale') + print('given in the OS environment variables.') + else: + print() + print('Locale settings after calling setlocale(LC_ALL, ""):') + print('-'*72) + for name,category in categories.items(): + print(name, '...') + lang, enc = getlocale(category) + print(' Language: ', lang or '(undefined)') + print(' Encoding: ', enc or '(undefined)') + print() + +### + +try: + LC_MESSAGES +except NameError: + pass +else: + __all__.append("LC_MESSAGES") + +if __name__=='__main__': + print('Locale aliasing:') + print() + _print_locale() + print() + print('Number formatting:') + print() + _test() diff --git a/venv/Lib/no-global-site-packages.txt b/venv/Lib/no-global-site-packages.txt new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/ntpath.py b/venv/Lib/ntpath.py new file mode 100644 index 00000000..2182ec77 --- /dev/null +++ b/venv/Lib/ntpath.py @@ -0,0 +1,671 @@ +# Module 'ntpath' -- common operations on WinNT/Win95 pathnames +"""Common pathname manipulations, WindowsNT/95 version. + +Instead of importing this module directly, import os and refer to this +module as os.path. +""" + +# strings representing various path-related bits and pieces +# These are primarily for export; internally, they are hardcoded. +# Should be set before imports for resolving cyclic dependency. +curdir = '.' +pardir = '..' +extsep = '.' +sep = '\\' +pathsep = ';' +altsep = '/' +defpath = '.;C:\\bin' +devnull = 'nul' + +import os +import sys +import stat +import genericpath +from genericpath import * + +__all__ = ["normcase","isabs","join","splitdrive","split","splitext", + "basename","dirname","commonprefix","getsize","getmtime", + "getatime","getctime", "islink","exists","lexists","isdir","isfile", + "ismount", "expanduser","expandvars","normpath","abspath", + "curdir","pardir","sep","pathsep","defpath","altsep", + "extsep","devnull","realpath","supports_unicode_filenames","relpath", + "samefile", "sameopenfile", "samestat", "commonpath"] + +def _get_bothseps(path): + if isinstance(path, bytes): + return b'\\/' + else: + return '\\/' + +# Normalize the case of a pathname and map slashes to backslashes. +# Other normalizations (such as optimizing '../' away) are not done +# (this is done by normpath). + +def normcase(s): + """Normalize case of pathname. + + Makes all characters lowercase and all slashes into backslashes.""" + s = os.fspath(s) + try: + if isinstance(s, bytes): + return s.replace(b'/', b'\\').lower() + else: + return s.replace('/', '\\').lower() + except (TypeError, AttributeError): + if not isinstance(s, (bytes, str)): + raise TypeError("normcase() argument must be str or bytes, " + "not %r" % s.__class__.__name__) from None + raise + + +# Return whether a path is absolute. +# Trivial in Posix, harder on Windows. +# For Windows it is absolute if it starts with a slash or backslash (current +# volume), or if a pathname after the volume-letter-and-colon or UNC-resource +# starts with a slash or backslash. + +def isabs(s): + """Test whether a path is absolute""" + s = os.fspath(s) + s = splitdrive(s)[1] + return len(s) > 0 and s[0] in _get_bothseps(s) + + +# Join two (or more) paths. +def join(path, *paths): + path = os.fspath(path) + if isinstance(path, bytes): + sep = b'\\' + seps = b'\\/' + colon = b':' + else: + sep = '\\' + seps = '\\/' + colon = ':' + try: + if not paths: + path[:0] + sep #23780: Ensure compatible data type even if p is null. + result_drive, result_path = splitdrive(path) + for p in map(os.fspath, paths): + p_drive, p_path = splitdrive(p) + if p_path and p_path[0] in seps: + # Second path is absolute + if p_drive or not result_drive: + result_drive = p_drive + result_path = p_path + continue + elif p_drive and p_drive != result_drive: + if p_drive.lower() != result_drive.lower(): + # Different drives => ignore the first path entirely + result_drive = p_drive + result_path = p_path + continue + # Same drive in different case + result_drive = p_drive + # Second path is relative to the first + if result_path and result_path[-1] not in seps: + result_path = result_path + sep + result_path = result_path + p_path + ## add separator between UNC and non-absolute path + if (result_path and result_path[0] not in seps and + result_drive and result_drive[-1:] != colon): + return result_drive + sep + result_path + return result_drive + result_path + except (TypeError, AttributeError, BytesWarning): + genericpath._check_arg_types('join', path, *paths) + raise + + +# Split a path in a drive specification (a drive letter followed by a +# colon) and the path specification. +# It is always true that drivespec + pathspec == p +def splitdrive(p): + """Split a pathname into drive/UNC sharepoint and relative path specifiers. + Returns a 2-tuple (drive_or_unc, path); either part may be empty. + + If you assign + result = splitdrive(p) + It is always true that: + result[0] + result[1] == p + + If the path contained a drive letter, drive_or_unc will contain everything + up to and including the colon. e.g. splitdrive("c:/dir") returns ("c:", "/dir") + + If the path contained a UNC path, the drive_or_unc will contain the host name + and share up to but not including the fourth directory separator character. + e.g. splitdrive("//host/computer/dir") returns ("//host/computer", "/dir") + + Paths cannot contain both a drive letter and a UNC path. + + """ + p = os.fspath(p) + if len(p) >= 2: + if isinstance(p, bytes): + sep = b'\\' + altsep = b'/' + colon = b':' + else: + sep = '\\' + altsep = '/' + colon = ':' + normp = p.replace(altsep, sep) + if (normp[0:2] == sep*2) and (normp[2:3] != sep): + # is a UNC path: + # vvvvvvvvvvvvvvvvvvvv drive letter or UNC path + # \\machine\mountpoint\directory\etc\... + # directory ^^^^^^^^^^^^^^^ + index = normp.find(sep, 2) + if index == -1: + return p[:0], p + index2 = normp.find(sep, index + 1) + # a UNC path can't have two slashes in a row + # (after the initial two) + if index2 == index + 1: + return p[:0], p + if index2 == -1: + index2 = len(p) + return p[:index2], p[index2:] + if normp[1:2] == colon: + return p[:2], p[2:] + return p[:0], p + + +# Split a path in head (everything up to the last '/') and tail (the +# rest). After the trailing '/' is stripped, the invariant +# join(head, tail) == p holds. +# The resulting head won't end in '/' unless it is the root. + +def split(p): + """Split a pathname. + + Return tuple (head, tail) where tail is everything after the final slash. + Either part may be empty.""" + p = os.fspath(p) + seps = _get_bothseps(p) + d, p = splitdrive(p) + # set i to index beyond p's last slash + i = len(p) + while i and p[i-1] not in seps: + i -= 1 + head, tail = p[:i], p[i:] # now tail has no slashes + # remove trailing slashes from head, unless it's all slashes + head = head.rstrip(seps) or head + return d + head, tail + + +# Split a path in root and extension. +# The extension is everything starting at the last dot in the last +# pathname component; the root is everything before that. +# It is always true that root + ext == p. + +def splitext(p): + p = os.fspath(p) + if isinstance(p, bytes): + return genericpath._splitext(p, b'\\', b'/', b'.') + else: + return genericpath._splitext(p, '\\', '/', '.') +splitext.__doc__ = genericpath._splitext.__doc__ + + +# Return the tail (basename) part of a path. + +def basename(p): + """Returns the final component of a pathname""" + return split(p)[1] + + +# Return the head (dirname) part of a path. + +def dirname(p): + """Returns the directory component of a pathname""" + return split(p)[0] + +# Is a path a symbolic link? +# This will always return false on systems where os.lstat doesn't exist. + +def islink(path): + """Test whether a path is a symbolic link. + This will always return false for Windows prior to 6.0. + """ + try: + st = os.lstat(path) + except (OSError, AttributeError): + return False + return stat.S_ISLNK(st.st_mode) + +# Being true for dangling symbolic links is also useful. + +def lexists(path): + """Test whether a path exists. Returns True for broken symbolic links""" + try: + st = os.lstat(path) + except OSError: + return False + return True + +# Is a path a mount point? +# Any drive letter root (eg c:\) +# Any share UNC (eg \\server\share) +# Any volume mounted on a filesystem folder +# +# No one method detects all three situations. Historically we've lexically +# detected drive letter roots and share UNCs. The canonical approach to +# detecting mounted volumes (querying the reparse tag) fails for the most +# common case: drive letter roots. The alternative which uses GetVolumePathName +# fails if the drive letter is the result of a SUBST. +try: + from nt import _getvolumepathname +except ImportError: + _getvolumepathname = None +def ismount(path): + """Test whether a path is a mount point (a drive root, the root of a + share, or a mounted volume)""" + path = os.fspath(path) + seps = _get_bothseps(path) + path = abspath(path) + root, rest = splitdrive(path) + if root and root[0] in seps: + return (not rest) or (rest in seps) + if rest in seps: + return True + + if _getvolumepathname: + return path.rstrip(seps) == _getvolumepathname(path).rstrip(seps) + else: + return False + + +# Expand paths beginning with '~' or '~user'. +# '~' means $HOME; '~user' means that user's home directory. +# If the path doesn't begin with '~', or if the user or $HOME is unknown, +# the path is returned unchanged (leaving error reporting to whatever +# function is called with the expanded path as argument). +# See also module 'glob' for expansion of *, ? and [...] in pathnames. +# (A function should also be defined to do full *sh-style environment +# variable expansion.) + +def expanduser(path): + """Expand ~ and ~user constructs. + + If user or $HOME is unknown, do nothing.""" + path = os.fspath(path) + if isinstance(path, bytes): + tilde = b'~' + else: + tilde = '~' + if not path.startswith(tilde): + return path + i, n = 1, len(path) + while i < n and path[i] not in _get_bothseps(path): + i += 1 + + if 'HOME' in os.environ: + userhome = os.environ['HOME'] + elif 'USERPROFILE' in os.environ: + userhome = os.environ['USERPROFILE'] + elif not 'HOMEPATH' in os.environ: + return path + else: + try: + drive = os.environ['HOMEDRIVE'] + except KeyError: + drive = '' + userhome = join(drive, os.environ['HOMEPATH']) + + if isinstance(path, bytes): + userhome = os.fsencode(userhome) + + if i != 1: #~user + userhome = join(dirname(userhome), path[1:i]) + + return userhome + path[i:] + + +# Expand paths containing shell variable substitutions. +# The following rules apply: +# - no expansion within single quotes +# - '$$' is translated into '$' +# - '%%' is translated into '%' if '%%' are not seen in %var1%%var2% +# - ${varname} is accepted. +# - $varname is accepted. +# - %varname% is accepted. +# - varnames can be made out of letters, digits and the characters '_-' +# (though is not verified in the ${varname} and %varname% cases) +# XXX With COMMAND.COM you can use any characters in a variable name, +# XXX except '^|<>='. + +def expandvars(path): + """Expand shell variables of the forms $var, ${var} and %var%. + + Unknown variables are left unchanged.""" + path = os.fspath(path) + if isinstance(path, bytes): + if b'$' not in path and b'%' not in path: + return path + import string + varchars = bytes(string.ascii_letters + string.digits + '_-', 'ascii') + quote = b'\'' + percent = b'%' + brace = b'{' + rbrace = b'}' + dollar = b'$' + environ = getattr(os, 'environb', None) + else: + if '$' not in path and '%' not in path: + return path + import string + varchars = string.ascii_letters + string.digits + '_-' + quote = '\'' + percent = '%' + brace = '{' + rbrace = '}' + dollar = '$' + environ = os.environ + res = path[:0] + index = 0 + pathlen = len(path) + while index < pathlen: + c = path[index:index+1] + if c == quote: # no expansion within single quotes + path = path[index + 1:] + pathlen = len(path) + try: + index = path.index(c) + res += c + path[:index + 1] + except ValueError: + res += c + path + index = pathlen - 1 + elif c == percent: # variable or '%' + if path[index + 1:index + 2] == percent: + res += c + index += 1 + else: + path = path[index+1:] + pathlen = len(path) + try: + index = path.index(percent) + except ValueError: + res += percent + path + index = pathlen - 1 + else: + var = path[:index] + try: + if environ is None: + value = os.fsencode(os.environ[os.fsdecode(var)]) + else: + value = environ[var] + except KeyError: + value = percent + var + percent + res += value + elif c == dollar: # variable or '$$' + if path[index + 1:index + 2] == dollar: + res += c + index += 1 + elif path[index + 1:index + 2] == brace: + path = path[index+2:] + pathlen = len(path) + try: + index = path.index(rbrace) + except ValueError: + res += dollar + brace + path + index = pathlen - 1 + else: + var = path[:index] + try: + if environ is None: + value = os.fsencode(os.environ[os.fsdecode(var)]) + else: + value = environ[var] + except KeyError: + value = dollar + brace + var + rbrace + res += value + else: + var = path[:0] + index += 1 + c = path[index:index + 1] + while c and c in varchars: + var += c + index += 1 + c = path[index:index + 1] + try: + if environ is None: + value = os.fsencode(os.environ[os.fsdecode(var)]) + else: + value = environ[var] + except KeyError: + value = dollar + var + res += value + if c: + index -= 1 + else: + res += c + index += 1 + return res + + +# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A\B. +# Previously, this function also truncated pathnames to 8+3 format, +# but as this module is called "ntpath", that's obviously wrong! + +def normpath(path): + """Normalize path, eliminating double slashes, etc.""" + path = os.fspath(path) + if isinstance(path, bytes): + sep = b'\\' + altsep = b'/' + curdir = b'.' + pardir = b'..' + special_prefixes = (b'\\\\.\\', b'\\\\?\\') + else: + sep = '\\' + altsep = '/' + curdir = '.' + pardir = '..' + special_prefixes = ('\\\\.\\', '\\\\?\\') + if path.startswith(special_prefixes): + # in the case of paths with these prefixes: + # \\.\ -> device names + # \\?\ -> literal paths + # do not do any normalization, but return the path unchanged + return path + path = path.replace(altsep, sep) + prefix, path = splitdrive(path) + + # collapse initial backslashes + if path.startswith(sep): + prefix += sep + path = path.lstrip(sep) + + comps = path.split(sep) + i = 0 + while i < len(comps): + if not comps[i] or comps[i] == curdir: + del comps[i] + elif comps[i] == pardir: + if i > 0 and comps[i-1] != pardir: + del comps[i-1:i+1] + i -= 1 + elif i == 0 and prefix.endswith(sep): + del comps[i] + else: + i += 1 + else: + i += 1 + # If the path is now empty, substitute '.' + if not prefix and not comps: + comps.append(curdir) + return prefix + sep.join(comps) + + +# Return an absolute path. +try: + from nt import _getfullpathname + +except ImportError: # not running on Windows - mock up something sensible + def abspath(path): + """Return the absolute version of a path.""" + path = os.fspath(path) + if not isabs(path): + if isinstance(path, bytes): + cwd = os.getcwdb() + else: + cwd = os.getcwd() + path = join(cwd, path) + return normpath(path) + +else: # use native Windows method on Windows + def abspath(path): + """Return the absolute version of a path.""" + + if path: # Empty path must return current working directory. + path = os.fspath(path) + try: + path = _getfullpathname(path) + except OSError: + pass # Bad path - return unchanged. + elif isinstance(path, bytes): + path = os.getcwdb() + else: + path = os.getcwd() + return normpath(path) + +# realpath is a no-op on systems without islink support +realpath = abspath +# Win9x family and earlier have no Unicode filename support. +supports_unicode_filenames = (hasattr(sys, "getwindowsversion") and + sys.getwindowsversion()[3] >= 2) + +def relpath(path, start=None): + """Return a relative version of a path""" + path = os.fspath(path) + if isinstance(path, bytes): + sep = b'\\' + curdir = b'.' + pardir = b'..' + else: + sep = '\\' + curdir = '.' + pardir = '..' + + if start is None: + start = curdir + + if not path: + raise ValueError("no path specified") + + start = os.fspath(start) + try: + start_abs = abspath(normpath(start)) + path_abs = abspath(normpath(path)) + start_drive, start_rest = splitdrive(start_abs) + path_drive, path_rest = splitdrive(path_abs) + if normcase(start_drive) != normcase(path_drive): + raise ValueError("path is on mount %r, start on mount %r" % ( + path_drive, start_drive)) + + start_list = [x for x in start_rest.split(sep) if x] + path_list = [x for x in path_rest.split(sep) if x] + # Work out how much of the filepath is shared by start and path. + i = 0 + for e1, e2 in zip(start_list, path_list): + if normcase(e1) != normcase(e2): + break + i += 1 + + rel_list = [pardir] * (len(start_list)-i) + path_list[i:] + if not rel_list: + return curdir + return join(*rel_list) + except (TypeError, ValueError, AttributeError, BytesWarning, DeprecationWarning): + genericpath._check_arg_types('relpath', path, start) + raise + + +# Return the longest common sub-path of the sequence of paths given as input. +# The function is case-insensitive and 'separator-insensitive', i.e. if the +# only difference between two paths is the use of '\' versus '/' as separator, +# they are deemed to be equal. +# +# However, the returned path will have the standard '\' separator (even if the +# given paths had the alternative '/' separator) and will have the case of the +# first path given in the sequence. Additionally, any trailing separator is +# stripped from the returned path. + +def commonpath(paths): + """Given a sequence of path names, returns the longest common sub-path.""" + + if not paths: + raise ValueError('commonpath() arg is an empty sequence') + + paths = tuple(map(os.fspath, paths)) + if isinstance(paths[0], bytes): + sep = b'\\' + altsep = b'/' + curdir = b'.' + else: + sep = '\\' + altsep = '/' + curdir = '.' + + try: + drivesplits = [splitdrive(p.replace(altsep, sep).lower()) for p in paths] + split_paths = [p.split(sep) for d, p in drivesplits] + + try: + isabs, = set(p[:1] == sep for d, p in drivesplits) + except ValueError: + raise ValueError("Can't mix absolute and relative paths") from None + + # Check that all drive letters or UNC paths match. The check is made only + # now otherwise type errors for mixing strings and bytes would not be + # caught. + if len(set(d for d, p in drivesplits)) != 1: + raise ValueError("Paths don't have the same drive") + + drive, path = splitdrive(paths[0].replace(altsep, sep)) + common = path.split(sep) + common = [c for c in common if c and c != curdir] + + split_paths = [[c for c in s if c and c != curdir] for s in split_paths] + s1 = min(split_paths) + s2 = max(split_paths) + for i, c in enumerate(s1): + if c != s2[i]: + common = common[:i] + break + else: + common = common[:len(s1)] + + prefix = drive + sep if isabs else drive + return prefix + sep.join(common) + except (TypeError, AttributeError): + genericpath._check_arg_types('commonpath', *paths) + raise + + +# determine if two files are in fact the same file +try: + # GetFinalPathNameByHandle is available starting with Windows 6.0. + # Windows XP and non-Windows OS'es will mock _getfinalpathname. + if sys.getwindowsversion()[:2] >= (6, 0): + from nt import _getfinalpathname + else: + raise ImportError +except (AttributeError, ImportError): + # On Windows XP and earlier, two files are the same if their absolute + # pathnames are the same. + # Non-Windows operating systems fake this method with an XP + # approximation. + def _getfinalpathname(f): + return normcase(abspath(f)) + + +try: + # The genericpath.isdir implementation uses os.stat and checks the mode + # attribute to tell whether or not the path is a directory. + # This is overkill on Windows - just pass the path to GetFileAttributes + # and check the attribute from there. + from nt import _isdir as isdir +except ImportError: + # Use genericpath.isdir as imported above. + pass diff --git a/venv/Lib/operator.py b/venv/Lib/operator.py new file mode 100644 index 00000000..0e2e53ef --- /dev/null +++ b/venv/Lib/operator.py @@ -0,0 +1,464 @@ +""" +Operator Interface + +This module exports a set of functions corresponding to the intrinsic +operators of Python. For example, operator.add(x, y) is equivalent +to the expression x+y. The function names are those used for special +methods; variants without leading and trailing '__' are also provided +for convenience. + +This is the pure Python implementation of the module. +""" + +__all__ = ['abs', 'add', 'and_', 'attrgetter', 'concat', 'contains', 'countOf', + 'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand', + 'iconcat', 'ifloordiv', 'ilshift', 'imatmul', 'imod', 'imul', + 'index', 'indexOf', 'inv', 'invert', 'ior', 'ipow', 'irshift', + 'is_', 'is_not', 'isub', 'itemgetter', 'itruediv', 'ixor', 'le', + 'length_hint', 'lshift', 'lt', 'matmul', 'methodcaller', 'mod', + 'mul', 'ne', 'neg', 'not_', 'or_', 'pos', 'pow', 'rshift', + 'setitem', 'sub', 'truediv', 'truth', 'xor'] + +from builtins import abs as _abs + + +# Comparison Operations *******************************************************# + +def lt(a, b): + "Same as a < b." + return a < b + +def le(a, b): + "Same as a <= b." + return a <= b + +def eq(a, b): + "Same as a == b." + return a == b + +def ne(a, b): + "Same as a != b." + return a != b + +def ge(a, b): + "Same as a >= b." + return a >= b + +def gt(a, b): + "Same as a > b." + return a > b + +# Logical Operations **********************************************************# + +def not_(a): + "Same as not a." + return not a + +def truth(a): + "Return True if a is true, False otherwise." + return True if a else False + +def is_(a, b): + "Same as a is b." + return a is b + +def is_not(a, b): + "Same as a is not b." + return a is not b + +# Mathematical/Bitwise Operations *********************************************# + +def abs(a): + "Same as abs(a)." + return _abs(a) + +def add(a, b): + "Same as a + b." + return a + b + +def and_(a, b): + "Same as a & b." + return a & b + +def floordiv(a, b): + "Same as a // b." + return a // b + +def index(a): + "Same as a.__index__()." + return a.__index__() + +def inv(a): + "Same as ~a." + return ~a +invert = inv + +def lshift(a, b): + "Same as a << b." + return a << b + +def mod(a, b): + "Same as a % b." + return a % b + +def mul(a, b): + "Same as a * b." + return a * b + +def matmul(a, b): + "Same as a @ b." + return a @ b + +def neg(a): + "Same as -a." + return -a + +def or_(a, b): + "Same as a | b." + return a | b + +def pos(a): + "Same as +a." + return +a + +def pow(a, b): + "Same as a ** b." + return a ** b + +def rshift(a, b): + "Same as a >> b." + return a >> b + +def sub(a, b): + "Same as a - b." + return a - b + +def truediv(a, b): + "Same as a / b." + return a / b + +def xor(a, b): + "Same as a ^ b." + return a ^ b + +# Sequence Operations *********************************************************# + +def concat(a, b): + "Same as a + b, for a and b sequences." + if not hasattr(a, '__getitem__'): + msg = "'%s' object can't be concatenated" % type(a).__name__ + raise TypeError(msg) + return a + b + +def contains(a, b): + "Same as b in a (note reversed operands)." + return b in a + +def countOf(a, b): + "Return the number of times b occurs in a." + count = 0 + for i in a: + if i == b: + count += 1 + return count + +def delitem(a, b): + "Same as del a[b]." + del a[b] + +def getitem(a, b): + "Same as a[b]." + return a[b] + +def indexOf(a, b): + "Return the first index of b in a." + for i, j in enumerate(a): + if j == b: + return i + else: + raise ValueError('sequence.index(x): x not in sequence') + +def setitem(a, b, c): + "Same as a[b] = c." + a[b] = c + +def length_hint(obj, default=0): + """ + Return an estimate of the number of items in obj. + This is useful for presizing containers when building from an iterable. + + If the object supports len(), the result will be exact. Otherwise, it may + over- or under-estimate by an arbitrary amount. The result will be an + integer >= 0. + """ + if not isinstance(default, int): + msg = ("'%s' object cannot be interpreted as an integer" % + type(default).__name__) + raise TypeError(msg) + + try: + return len(obj) + except TypeError: + pass + + try: + hint = type(obj).__length_hint__ + except AttributeError: + return default + + try: + val = hint(obj) + except TypeError: + return default + if val is NotImplemented: + return default + if not isinstance(val, int): + msg = ('__length_hint__ must be integer, not %s' % + type(val).__name__) + raise TypeError(msg) + if val < 0: + msg = '__length_hint__() should return >= 0' + raise ValueError(msg) + return val + +# Generalized Lookup Objects **************************************************# + +class attrgetter: + """ + Return a callable object that fetches the given attribute(s) from its operand. + After f = attrgetter('name'), the call f(r) returns r.name. + After g = attrgetter('name', 'date'), the call g(r) returns (r.name, r.date). + After h = attrgetter('name.first', 'name.last'), the call h(r) returns + (r.name.first, r.name.last). + """ + __slots__ = ('_attrs', '_call') + + def __init__(self, attr, *attrs): + if not attrs: + if not isinstance(attr, str): + raise TypeError('attribute name must be a string') + self._attrs = (attr,) + names = attr.split('.') + def func(obj): + for name in names: + obj = getattr(obj, name) + return obj + self._call = func + else: + self._attrs = (attr,) + attrs + getters = tuple(map(attrgetter, self._attrs)) + def func(obj): + return tuple(getter(obj) for getter in getters) + self._call = func + + def __call__(self, obj): + return self._call(obj) + + def __repr__(self): + return '%s.%s(%s)' % (self.__class__.__module__, + self.__class__.__qualname__, + ', '.join(map(repr, self._attrs))) + + def __reduce__(self): + return self.__class__, self._attrs + +class itemgetter: + """ + Return a callable object that fetches the given item(s) from its operand. + After f = itemgetter(2), the call f(r) returns r[2]. + After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3]) + """ + __slots__ = ('_items', '_call') + + def __init__(self, item, *items): + if not items: + self._items = (item,) + def func(obj): + return obj[item] + self._call = func + else: + self._items = items = (item,) + items + def func(obj): + return tuple(obj[i] for i in items) + self._call = func + + def __call__(self, obj): + return self._call(obj) + + def __repr__(self): + return '%s.%s(%s)' % (self.__class__.__module__, + self.__class__.__name__, + ', '.join(map(repr, self._items))) + + def __reduce__(self): + return self.__class__, self._items + +class methodcaller: + """ + Return a callable object that calls the given method on its operand. + After f = methodcaller('name'), the call f(r) returns r.name(). + After g = methodcaller('name', 'date', foo=1), the call g(r) returns + r.name('date', foo=1). + """ + __slots__ = ('_name', '_args', '_kwargs') + + def __init__(*args, **kwargs): + if len(args) < 2: + msg = "methodcaller needs at least one argument, the method name" + raise TypeError(msg) + self = args[0] + self._name = args[1] + if not isinstance(self._name, str): + raise TypeError('method name must be a string') + self._args = args[2:] + self._kwargs = kwargs + + def __call__(self, obj): + return getattr(obj, self._name)(*self._args, **self._kwargs) + + def __repr__(self): + args = [repr(self._name)] + args.extend(map(repr, self._args)) + args.extend('%s=%r' % (k, v) for k, v in self._kwargs.items()) + return '%s.%s(%s)' % (self.__class__.__module__, + self.__class__.__name__, + ', '.join(args)) + + def __reduce__(self): + if not self._kwargs: + return self.__class__, (self._name,) + self._args + else: + from functools import partial + return partial(self.__class__, self._name, **self._kwargs), self._args + + +# In-place Operations *********************************************************# + +def iadd(a, b): + "Same as a += b." + a += b + return a + +def iand(a, b): + "Same as a &= b." + a &= b + return a + +def iconcat(a, b): + "Same as a += b, for a and b sequences." + if not hasattr(a, '__getitem__'): + msg = "'%s' object can't be concatenated" % type(a).__name__ + raise TypeError(msg) + a += b + return a + +def ifloordiv(a, b): + "Same as a //= b." + a //= b + return a + +def ilshift(a, b): + "Same as a <<= b." + a <<= b + return a + +def imod(a, b): + "Same as a %= b." + a %= b + return a + +def imul(a, b): + "Same as a *= b." + a *= b + return a + +def imatmul(a, b): + "Same as a @= b." + a @= b + return a + +def ior(a, b): + "Same as a |= b." + a |= b + return a + +def ipow(a, b): + "Same as a **= b." + a **=b + return a + +def irshift(a, b): + "Same as a >>= b." + a >>= b + return a + +def isub(a, b): + "Same as a -= b." + a -= b + return a + +def itruediv(a, b): + "Same as a /= b." + a /= b + return a + +def ixor(a, b): + "Same as a ^= b." + a ^= b + return a + + +try: + from _operator import * +except ImportError: + pass +else: + from _operator import __doc__ + +# All of these "__func__ = func" assignments have to happen after importing +# from _operator to make sure they're set to the right function +__lt__ = lt +__le__ = le +__eq__ = eq +__ne__ = ne +__ge__ = ge +__gt__ = gt +__not__ = not_ +__abs__ = abs +__add__ = add +__and__ = and_ +__floordiv__ = floordiv +__index__ = index +__inv__ = inv +__invert__ = invert +__lshift__ = lshift +__mod__ = mod +__mul__ = mul +__matmul__ = matmul +__neg__ = neg +__or__ = or_ +__pos__ = pos +__pow__ = pow +__rshift__ = rshift +__sub__ = sub +__truediv__ = truediv +__xor__ = xor +__concat__ = concat +__contains__ = contains +__delitem__ = delitem +__getitem__ = getitem +__setitem__ = setitem +__iadd__ = iadd +__iand__ = iand +__iconcat__ = iconcat +__ifloordiv__ = ifloordiv +__ilshift__ = ilshift +__imod__ = imod +__imul__ = imul +__imatmul__ = imatmul +__ior__ = ior +__ipow__ = ipow +__irshift__ = irshift +__isub__ = isub +__itruediv__ = itruediv +__ixor__ = ixor diff --git a/venv/Lib/orig-prefix.txt b/venv/Lib/orig-prefix.txt new file mode 100644 index 00000000..594badac --- /dev/null +++ b/venv/Lib/orig-prefix.txt @@ -0,0 +1 @@ +c:\users\maggi.desktop-90m23nt\appdata\local\programs\python\python37-32 \ No newline at end of file diff --git a/venv/Lib/os.py b/venv/Lib/os.py new file mode 100644 index 00000000..499e6285 --- /dev/null +++ b/venv/Lib/os.py @@ -0,0 +1,1078 @@ +r"""OS routines for NT or Posix depending on what system we're on. + +This exports: + - all functions from posix or nt, e.g. unlink, stat, etc. + - os.path is either posixpath or ntpath + - os.name is either 'posix' or 'nt' + - os.curdir is a string representing the current directory (always '.') + - os.pardir is a string representing the parent directory (always '..') + - os.sep is the (or a most common) pathname separator ('/' or '\\') + - os.extsep is the extension separator (always '.') + - os.altsep is the alternate pathname separator (None or '/') + - os.pathsep is the component separator used in $PATH etc + - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n') + - os.defpath is the default search path for executables + - os.devnull is the file path of the null device ('/dev/null', etc.) + +Programs that import and use 'os' stand a better chance of being +portable between different platforms. Of course, they must then +only use functions that are defined by all platforms (e.g., unlink +and opendir), and leave all pathname manipulation to os.path +(e.g., split and join). +""" + +#' +import abc +import sys +import stat as st + +_names = sys.builtin_module_names + +# Note: more names are added to __all__ later. +__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep", + "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR", + "SEEK_END", "fsencode", "fsdecode", "get_exec_path", "fdopen", + "popen", "extsep"] + +def _exists(name): + return name in globals() + +def _get_exports_list(module): + try: + return list(module.__all__) + except AttributeError: + return [n for n in dir(module) if n[0] != '_'] + +# Any new dependencies of the os module and/or changes in path separator +# requires updating importlib as well. +if 'posix' in _names: + name = 'posix' + linesep = '\n' + from posix import * + try: + from posix import _exit + __all__.append('_exit') + except ImportError: + pass + import posixpath as path + + try: + from posix import _have_functions + except ImportError: + pass + + import posix + __all__.extend(_get_exports_list(posix)) + del posix + +elif 'nt' in _names: + name = 'nt' + linesep = '\r\n' + from nt import * + try: + from nt import _exit + __all__.append('_exit') + except ImportError: + pass + import ntpath as path + + import nt + __all__.extend(_get_exports_list(nt)) + del nt + + try: + from nt import _have_functions + except ImportError: + pass + +else: + raise ImportError('no os specific module found') + +sys.modules['os.path'] = path +from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep, + devnull) + +del _names + + +if _exists("_have_functions"): + _globals = globals() + def _add(str, fn): + if (fn in _globals) and (str in _have_functions): + _set.add(_globals[fn]) + + _set = set() + _add("HAVE_FACCESSAT", "access") + _add("HAVE_FCHMODAT", "chmod") + _add("HAVE_FCHOWNAT", "chown") + _add("HAVE_FSTATAT", "stat") + _add("HAVE_FUTIMESAT", "utime") + _add("HAVE_LINKAT", "link") + _add("HAVE_MKDIRAT", "mkdir") + _add("HAVE_MKFIFOAT", "mkfifo") + _add("HAVE_MKNODAT", "mknod") + _add("HAVE_OPENAT", "open") + _add("HAVE_READLINKAT", "readlink") + _add("HAVE_RENAMEAT", "rename") + _add("HAVE_SYMLINKAT", "symlink") + _add("HAVE_UNLINKAT", "unlink") + _add("HAVE_UNLINKAT", "rmdir") + _add("HAVE_UTIMENSAT", "utime") + supports_dir_fd = _set + + _set = set() + _add("HAVE_FACCESSAT", "access") + supports_effective_ids = _set + + _set = set() + _add("HAVE_FCHDIR", "chdir") + _add("HAVE_FCHMOD", "chmod") + _add("HAVE_FCHOWN", "chown") + _add("HAVE_FDOPENDIR", "listdir") + _add("HAVE_FDOPENDIR", "scandir") + _add("HAVE_FEXECVE", "execve") + _set.add(stat) # fstat always works + _add("HAVE_FTRUNCATE", "truncate") + _add("HAVE_FUTIMENS", "utime") + _add("HAVE_FUTIMES", "utime") + _add("HAVE_FPATHCONF", "pathconf") + if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3 + _add("HAVE_FSTATVFS", "statvfs") + supports_fd = _set + + _set = set() + _add("HAVE_FACCESSAT", "access") + # Some platforms don't support lchmod(). Often the function exists + # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP. + # (No, I don't know why that's a good design.) ./configure will detect + # this and reject it--so HAVE_LCHMOD still won't be defined on such + # platforms. This is Very Helpful. + # + # However, sometimes platforms without a working lchmod() *do* have + # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15, + # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes + # it behave like lchmod(). So in theory it would be a suitable + # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s + # flag doesn't work *either*. Sadly ./configure isn't sophisticated + # enough to detect this condition--it only determines whether or not + # fchmodat() minimally works. + # + # Therefore we simply ignore fchmodat() when deciding whether or not + # os.chmod supports follow_symlinks. Just checking lchmod() is + # sufficient. After all--if you have a working fchmodat(), your + # lchmod() almost certainly works too. + # + # _add("HAVE_FCHMODAT", "chmod") + _add("HAVE_FCHOWNAT", "chown") + _add("HAVE_FSTATAT", "stat") + _add("HAVE_LCHFLAGS", "chflags") + _add("HAVE_LCHMOD", "chmod") + if _exists("lchown"): # mac os x10.3 + _add("HAVE_LCHOWN", "chown") + _add("HAVE_LINKAT", "link") + _add("HAVE_LUTIMES", "utime") + _add("HAVE_LSTAT", "stat") + _add("HAVE_FSTATAT", "stat") + _add("HAVE_UTIMENSAT", "utime") + _add("MS_WINDOWS", "stat") + supports_follow_symlinks = _set + + del _set + del _have_functions + del _globals + del _add + + +# Python uses fixed values for the SEEK_ constants; they are mapped +# to native constants if necessary in posixmodule.c +# Other possible SEEK values are directly imported from posixmodule.c +SEEK_SET = 0 +SEEK_CUR = 1 +SEEK_END = 2 + +# Super directory utilities. +# (Inspired by Eric Raymond; the doc strings are mostly his) + +def makedirs(name, mode=0o777, exist_ok=False): + """makedirs(name [, mode=0o777][, exist_ok=False]) + + Super-mkdir; create a leaf directory and all intermediate ones. Works like + mkdir, except that any intermediate path segment (not just the rightmost) + will be created if it does not exist. If the target directory already + exists, raise an OSError if exist_ok is False. Otherwise no exception is + raised. This is recursive. + + """ + head, tail = path.split(name) + if not tail: + head, tail = path.split(head) + if head and tail and not path.exists(head): + try: + makedirs(head, exist_ok=exist_ok) + except FileExistsError: + # Defeats race condition when another thread created the path + pass + cdir = curdir + if isinstance(tail, bytes): + cdir = bytes(curdir, 'ASCII') + if tail == cdir: # xxx/newdir/. exists if xxx/newdir exists + return + try: + mkdir(name, mode) + except OSError: + # Cannot rely on checking for EEXIST, since the operating system + # could give priority to other errors like EACCES or EROFS + if not exist_ok or not path.isdir(name): + raise + +def removedirs(name): + """removedirs(name) + + Super-rmdir; remove a leaf directory and all empty intermediate + ones. Works like rmdir except that, if the leaf directory is + successfully removed, directories corresponding to rightmost path + segments will be pruned away until either the whole path is + consumed or an error occurs. Errors during this latter phase are + ignored -- they generally mean that a directory was not empty. + + """ + rmdir(name) + head, tail = path.split(name) + if not tail: + head, tail = path.split(head) + while head and tail: + try: + rmdir(head) + except OSError: + break + head, tail = path.split(head) + +def renames(old, new): + """renames(old, new) + + Super-rename; create directories as necessary and delete any left + empty. Works like rename, except creation of any intermediate + directories needed to make the new pathname good is attempted + first. After the rename, directories corresponding to rightmost + path segments of the old name will be pruned until either the + whole path is consumed or a nonempty directory is found. + + Note: this function can fail with the new directory structure made + if you lack permissions needed to unlink the leaf directory or + file. + + """ + head, tail = path.split(new) + if head and tail and not path.exists(head): + makedirs(head) + rename(old, new) + head, tail = path.split(old) + if head and tail: + try: + removedirs(head) + except OSError: + pass + +__all__.extend(["makedirs", "removedirs", "renames"]) + +def walk(top, topdown=True, onerror=None, followlinks=False): + """Directory tree generator. + + For each directory in the directory tree rooted at top (including top + itself, but excluding '.' and '..'), yields a 3-tuple + + dirpath, dirnames, filenames + + dirpath is a string, the path to the directory. dirnames is a list of + the names of the subdirectories in dirpath (excluding '.' and '..'). + filenames is a list of the names of the non-directory files in dirpath. + Note that the names in the lists are just names, with no path components. + To get a full path (which begins with top) to a file or directory in + dirpath, do os.path.join(dirpath, name). + + If optional arg 'topdown' is true or not specified, the triple for a + directory is generated before the triples for any of its subdirectories + (directories are generated top down). If topdown is false, the triple + for a directory is generated after the triples for all of its + subdirectories (directories are generated bottom up). + + When topdown is true, the caller can modify the dirnames list in-place + (e.g., via del or slice assignment), and walk will only recurse into the + subdirectories whose names remain in dirnames; this can be used to prune the + search, or to impose a specific order of visiting. Modifying dirnames when + topdown is false is ineffective, since the directories in dirnames have + already been generated by the time dirnames itself is generated. No matter + the value of topdown, the list of subdirectories is retrieved before the + tuples for the directory and its subdirectories are generated. + + By default errors from the os.scandir() call are ignored. If + optional arg 'onerror' is specified, it should be a function; it + will be called with one argument, an OSError instance. It can + report the error to continue with the walk, or raise the exception + to abort the walk. Note that the filename is available as the + filename attribute of the exception object. + + By default, os.walk does not follow symbolic links to subdirectories on + systems that support them. In order to get this functionality, set the + optional argument 'followlinks' to true. + + Caution: if you pass a relative pathname for top, don't change the + current working directory between resumptions of walk. walk never + changes the current directory, and assumes that the client doesn't + either. + + Example: + + import os + from os.path import join, getsize + for root, dirs, files in os.walk('python/Lib/email'): + print(root, "consumes", end="") + print(sum([getsize(join(root, name)) for name in files]), end="") + print("bytes in", len(files), "non-directory files") + if 'CVS' in dirs: + dirs.remove('CVS') # don't visit CVS directories + + """ + top = fspath(top) + dirs = [] + nondirs = [] + walk_dirs = [] + + # We may not have read permission for top, in which case we can't + # get a list of the files the directory contains. os.walk + # always suppressed the exception then, rather than blow up for a + # minor reason when (say) a thousand readable directories are still + # left to visit. That logic is copied here. + try: + # Note that scandir is global in this module due + # to earlier import-*. + scandir_it = scandir(top) + except OSError as error: + if onerror is not None: + onerror(error) + return + + with scandir_it: + while True: + try: + try: + entry = next(scandir_it) + except StopIteration: + break + except OSError as error: + if onerror is not None: + onerror(error) + return + + try: + is_dir = entry.is_dir() + except OSError: + # If is_dir() raises an OSError, consider that the entry is not + # a directory, same behaviour than os.path.isdir(). + is_dir = False + + if is_dir: + dirs.append(entry.name) + else: + nondirs.append(entry.name) + + if not topdown and is_dir: + # Bottom-up: recurse into sub-directory, but exclude symlinks to + # directories if followlinks is False + if followlinks: + walk_into = True + else: + try: + is_symlink = entry.is_symlink() + except OSError: + # If is_symlink() raises an OSError, consider that the + # entry is not a symbolic link, same behaviour than + # os.path.islink(). + is_symlink = False + walk_into = not is_symlink + + if walk_into: + walk_dirs.append(entry.path) + + # Yield before recursion if going top down + if topdown: + yield top, dirs, nondirs + + # Recurse into sub-directories + islink, join = path.islink, path.join + for dirname in dirs: + new_path = join(top, dirname) + # Issue #23605: os.path.islink() is used instead of caching + # entry.is_symlink() result during the loop on os.scandir() because + # the caller can replace the directory entry during the "yield" + # above. + if followlinks or not islink(new_path): + yield from walk(new_path, topdown, onerror, followlinks) + else: + # Recurse into sub-directories + for new_path in walk_dirs: + yield from walk(new_path, topdown, onerror, followlinks) + # Yield after recursion if going bottom up + yield top, dirs, nondirs + +__all__.append("walk") + +if {open, stat} <= supports_dir_fd and {scandir, stat} <= supports_fd: + + def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None): + """Directory tree generator. + + This behaves exactly like walk(), except that it yields a 4-tuple + + dirpath, dirnames, filenames, dirfd + + `dirpath`, `dirnames` and `filenames` are identical to walk() output, + and `dirfd` is a file descriptor referring to the directory `dirpath`. + + The advantage of fwalk() over walk() is that it's safe against symlink + races (when follow_symlinks is False). + + If dir_fd is not None, it should be a file descriptor open to a directory, + and top should be relative; top will then be relative to that directory. + (dir_fd is always supported for fwalk.) + + Caution: + Since fwalk() yields file descriptors, those are only valid until the + next iteration step, so you should dup() them if you want to keep them + for a longer period. + + Example: + + import os + for root, dirs, files, rootfd in os.fwalk('python/Lib/email'): + print(root, "consumes", end="") + print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]), + end="") + print("bytes in", len(files), "non-directory files") + if 'CVS' in dirs: + dirs.remove('CVS') # don't visit CVS directories + """ + if not isinstance(top, int) or not hasattr(top, '__index__'): + top = fspath(top) + # Note: To guard against symlink races, we use the standard + # lstat()/open()/fstat() trick. + if not follow_symlinks: + orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd) + topfd = open(top, O_RDONLY, dir_fd=dir_fd) + try: + if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and + path.samestat(orig_st, stat(topfd)))): + yield from _fwalk(topfd, top, isinstance(top, bytes), + topdown, onerror, follow_symlinks) + finally: + close(topfd) + + def _fwalk(topfd, toppath, isbytes, topdown, onerror, follow_symlinks): + # Note: This uses O(depth of the directory tree) file descriptors: if + # necessary, it can be adapted to only require O(1) FDs, see issue + # #13734. + + scandir_it = scandir(topfd) + dirs = [] + nondirs = [] + entries = None if topdown or follow_symlinks else [] + for entry in scandir_it: + name = entry.name + if isbytes: + name = fsencode(name) + try: + if entry.is_dir(): + dirs.append(name) + if entries is not None: + entries.append(entry) + else: + nondirs.append(name) + except OSError: + try: + # Add dangling symlinks, ignore disappeared files + if entry.is_symlink(): + nondirs.append(name) + except OSError: + pass + + if topdown: + yield toppath, dirs, nondirs, topfd + + for name in dirs if entries is None else zip(dirs, entries): + try: + if not follow_symlinks: + if topdown: + orig_st = stat(name, dir_fd=topfd, follow_symlinks=False) + else: + assert entries is not None + name, entry = name + orig_st = entry.stat(follow_symlinks=False) + dirfd = open(name, O_RDONLY, dir_fd=topfd) + except OSError as err: + if onerror is not None: + onerror(err) + continue + try: + if follow_symlinks or path.samestat(orig_st, stat(dirfd)): + dirpath = path.join(toppath, name) + yield from _fwalk(dirfd, dirpath, isbytes, + topdown, onerror, follow_symlinks) + finally: + close(dirfd) + + if not topdown: + yield toppath, dirs, nondirs, topfd + + __all__.append("fwalk") + +# Make sure os.environ exists, at least +try: + environ +except NameError: + environ = {} + +def execl(file, *args): + """execl(file, *args) + + Execute the executable file with argument list args, replacing the + current process. """ + execv(file, args) + +def execle(file, *args): + """execle(file, *args, env) + + Execute the executable file with argument list args and + environment env, replacing the current process. """ + env = args[-1] + execve(file, args[:-1], env) + +def execlp(file, *args): + """execlp(file, *args) + + Execute the executable file (which is searched for along $PATH) + with argument list args, replacing the current process. """ + execvp(file, args) + +def execlpe(file, *args): + """execlpe(file, *args, env) + + Execute the executable file (which is searched for along $PATH) + with argument list args and environment env, replacing the current + process. """ + env = args[-1] + execvpe(file, args[:-1], env) + +def execvp(file, args): + """execvp(file, args) + + Execute the executable file (which is searched for along $PATH) + with argument list args, replacing the current process. + args may be a list or tuple of strings. """ + _execvpe(file, args) + +def execvpe(file, args, env): + """execvpe(file, args, env) + + Execute the executable file (which is searched for along $PATH) + with argument list args and environment env , replacing the + current process. + args may be a list or tuple of strings. """ + _execvpe(file, args, env) + +__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"]) + +def _execvpe(file, args, env=None): + if env is not None: + exec_func = execve + argrest = (args, env) + else: + exec_func = execv + argrest = (args,) + env = environ + + if path.dirname(file): + exec_func(file, *argrest) + return + saved_exc = None + path_list = get_exec_path(env) + if name != 'nt': + file = fsencode(file) + path_list = map(fsencode, path_list) + for dir in path_list: + fullname = path.join(dir, file) + try: + exec_func(fullname, *argrest) + except (FileNotFoundError, NotADirectoryError) as e: + last_exc = e + except OSError as e: + last_exc = e + if saved_exc is None: + saved_exc = e + if saved_exc is not None: + raise saved_exc + raise last_exc + + +def get_exec_path(env=None): + """Returns the sequence of directories that will be searched for the + named executable (similar to a shell) when launching a process. + + *env* must be an environment variable dict or None. If *env* is None, + os.environ will be used. + """ + # Use a local import instead of a global import to limit the number of + # modules loaded at startup: the os module is always loaded at startup by + # Python. It may also avoid a bootstrap issue. + import warnings + + if env is None: + env = environ + + # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a + # BytesWarning when using python -b or python -bb: ignore the warning + with warnings.catch_warnings(): + warnings.simplefilter("ignore", BytesWarning) + + try: + path_list = env.get('PATH') + except TypeError: + path_list = None + + if supports_bytes_environ: + try: + path_listb = env[b'PATH'] + except (KeyError, TypeError): + pass + else: + if path_list is not None: + raise ValueError( + "env cannot contain 'PATH' and b'PATH' keys") + path_list = path_listb + + if path_list is not None and isinstance(path_list, bytes): + path_list = fsdecode(path_list) + + if path_list is None: + path_list = defpath + return path_list.split(pathsep) + + +# Change environ to automatically call putenv(), unsetenv if they exist. +from _collections_abc import MutableMapping + +class _Environ(MutableMapping): + def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv): + self.encodekey = encodekey + self.decodekey = decodekey + self.encodevalue = encodevalue + self.decodevalue = decodevalue + self.putenv = putenv + self.unsetenv = unsetenv + self._data = data + + def __getitem__(self, key): + try: + value = self._data[self.encodekey(key)] + except KeyError: + # raise KeyError with the original key value + raise KeyError(key) from None + return self.decodevalue(value) + + def __setitem__(self, key, value): + key = self.encodekey(key) + value = self.encodevalue(value) + self.putenv(key, value) + self._data[key] = value + + def __delitem__(self, key): + encodedkey = self.encodekey(key) + self.unsetenv(encodedkey) + try: + del self._data[encodedkey] + except KeyError: + # raise KeyError with the original key value + raise KeyError(key) from None + + def __iter__(self): + # list() from dict object is an atomic operation + keys = list(self._data) + for key in keys: + yield self.decodekey(key) + + def __len__(self): + return len(self._data) + + def __repr__(self): + return 'environ({{{}}})'.format(', '.join( + ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value)) + for key, value in self._data.items()))) + + def copy(self): + return dict(self) + + def setdefault(self, key, value): + if key not in self: + self[key] = value + return self[key] + +try: + _putenv = putenv +except NameError: + _putenv = lambda key, value: None +else: + if "putenv" not in __all__: + __all__.append("putenv") + +try: + _unsetenv = unsetenv +except NameError: + _unsetenv = lambda key: _putenv(key, "") +else: + if "unsetenv" not in __all__: + __all__.append("unsetenv") + +def _createenviron(): + if name == 'nt': + # Where Env Var Names Must Be UPPERCASE + def check_str(value): + if not isinstance(value, str): + raise TypeError("str expected, not %s" % type(value).__name__) + return value + encode = check_str + decode = str + def encodekey(key): + return encode(key).upper() + data = {} + for key, value in environ.items(): + data[encodekey(key)] = value + else: + # Where Env Var Names Can Be Mixed Case + encoding = sys.getfilesystemencoding() + def encode(value): + if not isinstance(value, str): + raise TypeError("str expected, not %s" % type(value).__name__) + return value.encode(encoding, 'surrogateescape') + def decode(value): + return value.decode(encoding, 'surrogateescape') + encodekey = encode + data = environ + return _Environ(data, + encodekey, decode, + encode, decode, + _putenv, _unsetenv) + +# unicode environ +environ = _createenviron() +del _createenviron + + +def getenv(key, default=None): + """Get an environment variable, return None if it doesn't exist. + The optional second argument can specify an alternate default. + key, default and the result are str.""" + return environ.get(key, default) + +supports_bytes_environ = (name != 'nt') +__all__.extend(("getenv", "supports_bytes_environ")) + +if supports_bytes_environ: + def _check_bytes(value): + if not isinstance(value, bytes): + raise TypeError("bytes expected, not %s" % type(value).__name__) + return value + + # bytes environ + environb = _Environ(environ._data, + _check_bytes, bytes, + _check_bytes, bytes, + _putenv, _unsetenv) + del _check_bytes + + def getenvb(key, default=None): + """Get an environment variable, return None if it doesn't exist. + The optional second argument can specify an alternate default. + key, default and the result are bytes.""" + return environb.get(key, default) + + __all__.extend(("environb", "getenvb")) + +def _fscodec(): + encoding = sys.getfilesystemencoding() + errors = sys.getfilesystemencodeerrors() + + def fsencode(filename): + """Encode filename (an os.PathLike, bytes, or str) to the filesystem + encoding with 'surrogateescape' error handler, return bytes unchanged. + On Windows, use 'strict' error handler if the file system encoding is + 'mbcs' (which is the default encoding). + """ + filename = fspath(filename) # Does type-checking of `filename`. + if isinstance(filename, str): + return filename.encode(encoding, errors) + else: + return filename + + def fsdecode(filename): + """Decode filename (an os.PathLike, bytes, or str) from the filesystem + encoding with 'surrogateescape' error handler, return str unchanged. On + Windows, use 'strict' error handler if the file system encoding is + 'mbcs' (which is the default encoding). + """ + filename = fspath(filename) # Does type-checking of `filename`. + if isinstance(filename, bytes): + return filename.decode(encoding, errors) + else: + return filename + + return fsencode, fsdecode + +fsencode, fsdecode = _fscodec() +del _fscodec + +# Supply spawn*() (probably only for Unix) +if _exists("fork") and not _exists("spawnv") and _exists("execv"): + + P_WAIT = 0 + P_NOWAIT = P_NOWAITO = 1 + + __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"]) + + # XXX Should we support P_DETACH? I suppose it could fork()**2 + # and close the std I/O streams. Also, P_OVERLAY is the same + # as execv*()? + + def _spawnvef(mode, file, args, env, func): + # Internal helper; func is the exec*() function to use + if not isinstance(args, (tuple, list)): + raise TypeError('argv must be a tuple or a list') + if not args or not args[0]: + raise ValueError('argv first element cannot be empty') + pid = fork() + if not pid: + # Child + try: + if env is None: + func(file, args) + else: + func(file, args, env) + except: + _exit(127) + else: + # Parent + if mode == P_NOWAIT: + return pid # Caller is responsible for waiting! + while 1: + wpid, sts = waitpid(pid, 0) + if WIFSTOPPED(sts): + continue + elif WIFSIGNALED(sts): + return -WTERMSIG(sts) + elif WIFEXITED(sts): + return WEXITSTATUS(sts) + else: + raise OSError("Not stopped, signaled or exited???") + + def spawnv(mode, file, args): + """spawnv(mode, file, args) -> integer + +Execute file with arguments from args in a subprocess. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return _spawnvef(mode, file, args, None, execv) + + def spawnve(mode, file, args, env): + """spawnve(mode, file, args, env) -> integer + +Execute file with arguments from args in a subprocess with the +specified environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return _spawnvef(mode, file, args, env, execve) + + # Note: spawnvp[e] isn't currently supported on Windows + + def spawnvp(mode, file, args): + """spawnvp(mode, file, args) -> integer + +Execute file (which is looked for along $PATH) with arguments from +args in a subprocess. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return _spawnvef(mode, file, args, None, execvp) + + def spawnvpe(mode, file, args, env): + """spawnvpe(mode, file, args, env) -> integer + +Execute file (which is looked for along $PATH) with arguments from +args in a subprocess with the supplied environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return _spawnvef(mode, file, args, env, execvpe) + + + __all__.extend(["spawnv", "spawnve", "spawnvp", "spawnvpe"]) + + +if _exists("spawnv"): + # These aren't supplied by the basic Windows code + # but can be easily implemented in Python + + def spawnl(mode, file, *args): + """spawnl(mode, file, *args) -> integer + +Execute file with arguments from args in a subprocess. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return spawnv(mode, file, args) + + def spawnle(mode, file, *args): + """spawnle(mode, file, *args, env) -> integer + +Execute file with arguments from args in a subprocess with the +supplied environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + env = args[-1] + return spawnve(mode, file, args[:-1], env) + + + __all__.extend(["spawnl", "spawnle"]) + + +if _exists("spawnvp"): + # At the moment, Windows doesn't implement spawnvp[e], + # so it won't have spawnlp[e] either. + def spawnlp(mode, file, *args): + """spawnlp(mode, file, *args) -> integer + +Execute file (which is looked for along $PATH) with arguments from +args in a subprocess with the supplied environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return spawnvp(mode, file, args) + + def spawnlpe(mode, file, *args): + """spawnlpe(mode, file, *args, env) -> integer + +Execute file (which is looked for along $PATH) with arguments from +args in a subprocess with the supplied environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + env = args[-1] + return spawnvpe(mode, file, args[:-1], env) + + + __all__.extend(["spawnlp", "spawnlpe"]) + + +# Supply os.popen() +def popen(cmd, mode="r", buffering=-1): + if not isinstance(cmd, str): + raise TypeError("invalid cmd type (%s, expected string)" % type(cmd)) + if mode not in ("r", "w"): + raise ValueError("invalid mode %r" % mode) + if buffering == 0 or buffering is None: + raise ValueError("popen() does not support unbuffered streams") + import subprocess, io + if mode == "r": + proc = subprocess.Popen(cmd, + shell=True, + stdout=subprocess.PIPE, + bufsize=buffering) + return _wrap_close(io.TextIOWrapper(proc.stdout), proc) + else: + proc = subprocess.Popen(cmd, + shell=True, + stdin=subprocess.PIPE, + bufsize=buffering) + return _wrap_close(io.TextIOWrapper(proc.stdin), proc) + +# Helper for popen() -- a proxy for a file whose close waits for the process +class _wrap_close: + def __init__(self, stream, proc): + self._stream = stream + self._proc = proc + def close(self): + self._stream.close() + returncode = self._proc.wait() + if returncode == 0: + return None + if name == 'nt': + return returncode + else: + return returncode << 8 # Shift left to match old behavior + def __enter__(self): + return self + def __exit__(self, *args): + self.close() + def __getattr__(self, name): + return getattr(self._stream, name) + def __iter__(self): + return iter(self._stream) + +# Supply os.fdopen() +def fdopen(fd, *args, **kwargs): + if not isinstance(fd, int): + raise TypeError("invalid fd type (%s, expected integer)" % type(fd)) + import io + return io.open(fd, *args, **kwargs) + + +# For testing purposes, make sure the function is available when the C +# implementation exists. +def _fspath(path): + """Return the path representation of a path-like object. + + If str or bytes is passed in, it is returned unchanged. Otherwise the + os.PathLike interface is used to get the path representation. If the + path representation is not str or bytes, TypeError is raised. If the + provided path is not str, bytes, or os.PathLike, TypeError is raised. + """ + if isinstance(path, (str, bytes)): + return path + + # Work from the object's type to match method resolution of other magic + # methods. + path_type = type(path) + try: + path_repr = path_type.__fspath__(path) + except AttributeError: + if hasattr(path_type, '__fspath__'): + raise + else: + raise TypeError("expected str, bytes or os.PathLike object, " + "not " + path_type.__name__) + if isinstance(path_repr, (str, bytes)): + return path_repr + else: + raise TypeError("expected {}.__fspath__() to return str or bytes, " + "not {}".format(path_type.__name__, + type(path_repr).__name__)) + +# If there is no C implementation, make the pure Python version the +# implementation as transparently as possible. +if not _exists('fspath'): + fspath = _fspath + fspath.__name__ = "fspath" + + +class PathLike(abc.ABC): + + """Abstract base class for implementing the file system path protocol.""" + + @abc.abstractmethod + def __fspath__(self): + """Return the file system path representation of the object.""" + raise NotImplementedError + + @classmethod + def __subclasshook__(cls, subclass): + return hasattr(subclass, '__fspath__') diff --git a/venv/Lib/posixpath.py b/venv/Lib/posixpath.py new file mode 100644 index 00000000..e92186c6 --- /dev/null +++ b/venv/Lib/posixpath.py @@ -0,0 +1,522 @@ +"""Common operations on Posix pathnames. + +Instead of importing this module directly, import os and refer to +this module as os.path. The "os.path" name is an alias for this +module on Posix systems; on other systems (e.g. Mac, Windows), +os.path provides the same operations in a manner specific to that +platform, and is an alias to another module (e.g. macpath, ntpath). + +Some of this can actually be useful on non-Posix systems too, e.g. +for manipulation of the pathname component of URLs. +""" + +# Strings representing various path-related bits and pieces. +# These are primarily for export; internally, they are hardcoded. +# Should be set before imports for resolving cyclic dependency. +curdir = '.' +pardir = '..' +extsep = '.' +sep = '/' +pathsep = ':' +defpath = ':/bin:/usr/bin' +altsep = None +devnull = '/dev/null' + +import os +import sys +import stat +import genericpath +from genericpath import * + +__all__ = ["normcase","isabs","join","splitdrive","split","splitext", + "basename","dirname","commonprefix","getsize","getmtime", + "getatime","getctime","islink","exists","lexists","isdir","isfile", + "ismount", "expanduser","expandvars","normpath","abspath", + "samefile","sameopenfile","samestat", + "curdir","pardir","sep","pathsep","defpath","altsep","extsep", + "devnull","realpath","supports_unicode_filenames","relpath", + "commonpath"] + + +def _get_sep(path): + if isinstance(path, bytes): + return b'/' + else: + return '/' + +# Normalize the case of a pathname. Trivial in Posix, string.lower on Mac. +# On MS-DOS this may also turn slashes into backslashes; however, other +# normalizations (such as optimizing '../' away) are not allowed +# (another function should be defined to do that). + +def normcase(s): + """Normalize case of pathname. Has no effect under Posix""" + s = os.fspath(s) + if not isinstance(s, (bytes, str)): + raise TypeError("normcase() argument must be str or bytes, " + "not '{}'".format(s.__class__.__name__)) + return s + + +# Return whether a path is absolute. +# Trivial in Posix, harder on the Mac or MS-DOS. + +def isabs(s): + """Test whether a path is absolute""" + s = os.fspath(s) + sep = _get_sep(s) + return s.startswith(sep) + + +# Join pathnames. +# Ignore the previous parts if a part is absolute. +# Insert a '/' unless the first part is empty or already ends in '/'. + +def join(a, *p): + """Join two or more pathname components, inserting '/' as needed. + If any component is an absolute path, all previous path components + will be discarded. An empty last part will result in a path that + ends with a separator.""" + a = os.fspath(a) + sep = _get_sep(a) + path = a + try: + if not p: + path[:0] + sep #23780: Ensure compatible data type even if p is null. + for b in map(os.fspath, p): + if b.startswith(sep): + path = b + elif not path or path.endswith(sep): + path += b + else: + path += sep + b + except (TypeError, AttributeError, BytesWarning): + genericpath._check_arg_types('join', a, *p) + raise + return path + + +# Split a path in head (everything up to the last '/') and tail (the +# rest). If the path ends in '/', tail will be empty. If there is no +# '/' in the path, head will be empty. +# Trailing '/'es are stripped from head unless it is the root. + +def split(p): + """Split a pathname. Returns tuple "(head, tail)" where "tail" is + everything after the final slash. Either part may be empty.""" + p = os.fspath(p) + sep = _get_sep(p) + i = p.rfind(sep) + 1 + head, tail = p[:i], p[i:] + if head and head != sep*len(head): + head = head.rstrip(sep) + return head, tail + + +# Split a path in root and extension. +# The extension is everything starting at the last dot in the last +# pathname component; the root is everything before that. +# It is always true that root + ext == p. + +def splitext(p): + p = os.fspath(p) + if isinstance(p, bytes): + sep = b'/' + extsep = b'.' + else: + sep = '/' + extsep = '.' + return genericpath._splitext(p, sep, None, extsep) +splitext.__doc__ = genericpath._splitext.__doc__ + +# Split a pathname into a drive specification and the rest of the +# path. Useful on DOS/Windows/NT; on Unix, the drive is always empty. + +def splitdrive(p): + """Split a pathname into drive and path. On Posix, drive is always + empty.""" + p = os.fspath(p) + return p[:0], p + + +# Return the tail (basename) part of a path, same as split(path)[1]. + +def basename(p): + """Returns the final component of a pathname""" + p = os.fspath(p) + sep = _get_sep(p) + i = p.rfind(sep) + 1 + return p[i:] + + +# Return the head (dirname) part of a path, same as split(path)[0]. + +def dirname(p): + """Returns the directory component of a pathname""" + p = os.fspath(p) + sep = _get_sep(p) + i = p.rfind(sep) + 1 + head = p[:i] + if head and head != sep*len(head): + head = head.rstrip(sep) + return head + + +# Is a path a symbolic link? +# This will always return false on systems where os.lstat doesn't exist. + +def islink(path): + """Test whether a path is a symbolic link""" + try: + st = os.lstat(path) + except (OSError, AttributeError): + return False + return stat.S_ISLNK(st.st_mode) + +# Being true for dangling symbolic links is also useful. + +def lexists(path): + """Test whether a path exists. Returns True for broken symbolic links""" + try: + os.lstat(path) + except OSError: + return False + return True + + +# Is a path a mount point? +# (Does this work for all UNIXes? Is it even guaranteed to work by Posix?) + +def ismount(path): + """Test whether a path is a mount point""" + try: + s1 = os.lstat(path) + except OSError: + # It doesn't exist -- so not a mount point. :-) + return False + else: + # A symlink can never be a mount point + if stat.S_ISLNK(s1.st_mode): + return False + + if isinstance(path, bytes): + parent = join(path, b'..') + else: + parent = join(path, '..') + parent = realpath(parent) + try: + s2 = os.lstat(parent) + except OSError: + return False + + dev1 = s1.st_dev + dev2 = s2.st_dev + if dev1 != dev2: + return True # path/.. on a different device as path + ino1 = s1.st_ino + ino2 = s2.st_ino + if ino1 == ino2: + return True # path/.. is the same i-node as path + return False + + +# Expand paths beginning with '~' or '~user'. +# '~' means $HOME; '~user' means that user's home directory. +# If the path doesn't begin with '~', or if the user or $HOME is unknown, +# the path is returned unchanged (leaving error reporting to whatever +# function is called with the expanded path as argument). +# See also module 'glob' for expansion of *, ? and [...] in pathnames. +# (A function should also be defined to do full *sh-style environment +# variable expansion.) + +def expanduser(path): + """Expand ~ and ~user constructions. If user or $HOME is unknown, + do nothing.""" + path = os.fspath(path) + if isinstance(path, bytes): + tilde = b'~' + else: + tilde = '~' + if not path.startswith(tilde): + return path + sep = _get_sep(path) + i = path.find(sep, 1) + if i < 0: + i = len(path) + if i == 1: + if 'HOME' not in os.environ: + import pwd + userhome = pwd.getpwuid(os.getuid()).pw_dir + else: + userhome = os.environ['HOME'] + else: + import pwd + name = path[1:i] + if isinstance(name, bytes): + name = str(name, 'ASCII') + try: + pwent = pwd.getpwnam(name) + except KeyError: + return path + userhome = pwent.pw_dir + if isinstance(path, bytes): + userhome = os.fsencode(userhome) + root = b'/' + else: + root = '/' + userhome = userhome.rstrip(root) + return (userhome + path[i:]) or root + + +# Expand paths containing shell variable substitutions. +# This expands the forms $variable and ${variable} only. +# Non-existent variables are left unchanged. + +_varprog = None +_varprogb = None + +def expandvars(path): + """Expand shell variables of form $var and ${var}. Unknown variables + are left unchanged.""" + path = os.fspath(path) + global _varprog, _varprogb + if isinstance(path, bytes): + if b'$' not in path: + return path + if not _varprogb: + import re + _varprogb = re.compile(br'\$(\w+|\{[^}]*\})', re.ASCII) + search = _varprogb.search + start = b'{' + end = b'}' + environ = getattr(os, 'environb', None) + else: + if '$' not in path: + return path + if not _varprog: + import re + _varprog = re.compile(r'\$(\w+|\{[^}]*\})', re.ASCII) + search = _varprog.search + start = '{' + end = '}' + environ = os.environ + i = 0 + while True: + m = search(path, i) + if not m: + break + i, j = m.span(0) + name = m.group(1) + if name.startswith(start) and name.endswith(end): + name = name[1:-1] + try: + if environ is None: + value = os.fsencode(os.environ[os.fsdecode(name)]) + else: + value = environ[name] + except KeyError: + i = j + else: + tail = path[j:] + path = path[:i] + value + i = len(path) + path += tail + return path + + +# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B. +# It should be understood that this may change the meaning of the path +# if it contains symbolic links! + +def normpath(path): + """Normalize path, eliminating double slashes, etc.""" + path = os.fspath(path) + if isinstance(path, bytes): + sep = b'/' + empty = b'' + dot = b'.' + dotdot = b'..' + else: + sep = '/' + empty = '' + dot = '.' + dotdot = '..' + if path == empty: + return dot + initial_slashes = path.startswith(sep) + # POSIX allows one or two initial slashes, but treats three or more + # as single slash. + if (initial_slashes and + path.startswith(sep*2) and not path.startswith(sep*3)): + initial_slashes = 2 + comps = path.split(sep) + new_comps = [] + for comp in comps: + if comp in (empty, dot): + continue + if (comp != dotdot or (not initial_slashes and not new_comps) or + (new_comps and new_comps[-1] == dotdot)): + new_comps.append(comp) + elif new_comps: + new_comps.pop() + comps = new_comps + path = sep.join(comps) + if initial_slashes: + path = sep*initial_slashes + path + return path or dot + + +def abspath(path): + """Return an absolute path.""" + path = os.fspath(path) + if not isabs(path): + if isinstance(path, bytes): + cwd = os.getcwdb() + else: + cwd = os.getcwd() + path = join(cwd, path) + return normpath(path) + + +# Return a canonical path (i.e. the absolute location of a file on the +# filesystem). + +def realpath(filename): + """Return the canonical path of the specified filename, eliminating any +symbolic links encountered in the path.""" + filename = os.fspath(filename) + path, ok = _joinrealpath(filename[:0], filename, {}) + return abspath(path) + +# Join two paths, normalizing and eliminating any symbolic links +# encountered in the second path. +def _joinrealpath(path, rest, seen): + if isinstance(path, bytes): + sep = b'/' + curdir = b'.' + pardir = b'..' + else: + sep = '/' + curdir = '.' + pardir = '..' + + if isabs(rest): + rest = rest[1:] + path = sep + + while rest: + name, _, rest = rest.partition(sep) + if not name or name == curdir: + # current dir + continue + if name == pardir: + # parent dir + if path: + path, name = split(path) + if name == pardir: + path = join(path, pardir, pardir) + else: + path = pardir + continue + newpath = join(path, name) + if not islink(newpath): + path = newpath + continue + # Resolve the symbolic link + if newpath in seen: + # Already seen this path + path = seen[newpath] + if path is not None: + # use cached value + continue + # The symlink is not resolved, so we must have a symlink loop. + # Return already resolved part + rest of the path unchanged. + return join(newpath, rest), False + seen[newpath] = None # not resolved symlink + path, ok = _joinrealpath(path, os.readlink(newpath), seen) + if not ok: + return join(path, rest), False + seen[newpath] = path # resolved symlink + + return path, True + + +supports_unicode_filenames = (sys.platform == 'darwin') + +def relpath(path, start=None): + """Return a relative version of a path""" + + if not path: + raise ValueError("no path specified") + + path = os.fspath(path) + if isinstance(path, bytes): + curdir = b'.' + sep = b'/' + pardir = b'..' + else: + curdir = '.' + sep = '/' + pardir = '..' + + if start is None: + start = curdir + else: + start = os.fspath(start) + + try: + start_list = [x for x in abspath(start).split(sep) if x] + path_list = [x for x in abspath(path).split(sep) if x] + # Work out how much of the filepath is shared by start and path. + i = len(commonprefix([start_list, path_list])) + + rel_list = [pardir] * (len(start_list)-i) + path_list[i:] + if not rel_list: + return curdir + return join(*rel_list) + except (TypeError, AttributeError, BytesWarning, DeprecationWarning): + genericpath._check_arg_types('relpath', path, start) + raise + + +# Return the longest common sub-path of the sequence of paths given as input. +# The paths are not normalized before comparing them (this is the +# responsibility of the caller). Any trailing separator is stripped from the +# returned path. + +def commonpath(paths): + """Given a sequence of path names, returns the longest common sub-path.""" + + if not paths: + raise ValueError('commonpath() arg is an empty sequence') + + paths = tuple(map(os.fspath, paths)) + if isinstance(paths[0], bytes): + sep = b'/' + curdir = b'.' + else: + sep = '/' + curdir = '.' + + try: + split_paths = [path.split(sep) for path in paths] + + try: + isabs, = set(p[:1] == sep for p in paths) + except ValueError: + raise ValueError("Can't mix absolute and relative paths") from None + + split_paths = [[c for c in s if c and c != curdir] for s in split_paths] + s1 = min(split_paths) + s2 = max(split_paths) + common = s1 + for i, c in enumerate(s1): + if c != s2[i]: + common = s1[:i] + break + + prefix = sep if isabs else sep[:0] + return prefix + sep.join(common) + except (TypeError, AttributeError): + genericpath._check_arg_types('commonpath', *paths) + raise diff --git a/venv/Lib/random.py b/venv/Lib/random.py new file mode 100644 index 00000000..0bc24174 --- /dev/null +++ b/venv/Lib/random.py @@ -0,0 +1,775 @@ +"""Random variable generators. + + integers + -------- + uniform within range + + sequences + --------- + pick random element + pick random sample + pick weighted random sample + generate random permutation + + distributions on the real line: + ------------------------------ + uniform + triangular + normal (Gaussian) + lognormal + negative exponential + gamma + beta + pareto + Weibull + + distributions on the circle (angles 0 to 2pi) + --------------------------------------------- + circular uniform + von Mises + +General notes on the underlying Mersenne Twister core generator: + +* The period is 2**19937-1. +* It is one of the most extensively tested generators in existence. +* The random() method is implemented in C, executes in a single Python step, + and is, therefore, threadsafe. + +""" + +from warnings import warn as _warn +from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethodType +from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil +from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin +from os import urandom as _urandom +from _collections_abc import Set as _Set, Sequence as _Sequence +from hashlib import sha512 as _sha512 +import itertools as _itertools +import bisect as _bisect +import os as _os + +__all__ = ["Random","seed","random","uniform","randint","choice","sample", + "randrange","shuffle","normalvariate","lognormvariate", + "expovariate","vonmisesvariate","gammavariate","triangular", + "gauss","betavariate","paretovariate","weibullvariate", + "getstate","setstate", "getrandbits", "choices", + "SystemRandom"] + +NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0) +TWOPI = 2.0*_pi +LOG4 = _log(4.0) +SG_MAGICCONST = 1.0 + _log(4.5) +BPF = 53 # Number of bits in a float +RECIP_BPF = 2**-BPF + + +# Translated by Guido van Rossum from C source provided by +# Adrian Baddeley. Adapted by Raymond Hettinger for use with +# the Mersenne Twister and os.urandom() core generators. + +import _random + +class Random(_random.Random): + """Random number generator base class used by bound module functions. + + Used to instantiate instances of Random to get generators that don't + share state. + + Class Random can also be subclassed if you want to use a different basic + generator of your own devising: in that case, override the following + methods: random(), seed(), getstate(), and setstate(). + Optionally, implement a getrandbits() method so that randrange() + can cover arbitrarily large ranges. + + """ + + VERSION = 3 # used by getstate/setstate + + def __init__(self, x=None): + """Initialize an instance. + + Optional argument x controls seeding, as for Random.seed(). + """ + + self.seed(x) + self.gauss_next = None + + def seed(self, a=None, version=2): + """Initialize internal state from hashable object. + + None or no argument seeds from current time or from an operating + system specific randomness source if available. + + If *a* is an int, all bits are used. + + For version 2 (the default), all of the bits are used if *a* is a str, + bytes, or bytearray. For version 1 (provided for reproducing random + sequences from older versions of Python), the algorithm for str and + bytes generates a narrower range of seeds. + + """ + + if version == 1 and isinstance(a, (str, bytes)): + a = a.decode('latin-1') if isinstance(a, bytes) else a + x = ord(a[0]) << 7 if a else 0 + for c in map(ord, a): + x = ((1000003 * x) ^ c) & 0xFFFFFFFFFFFFFFFF + x ^= len(a) + a = -2 if x == -1 else x + + if version == 2 and isinstance(a, (str, bytes, bytearray)): + if isinstance(a, str): + a = a.encode() + a += _sha512(a).digest() + a = int.from_bytes(a, 'big') + + super().seed(a) + self.gauss_next = None + + def getstate(self): + """Return internal state; can be passed to setstate() later.""" + return self.VERSION, super().getstate(), self.gauss_next + + def setstate(self, state): + """Restore internal state from object returned by getstate().""" + version = state[0] + if version == 3: + version, internalstate, self.gauss_next = state + super().setstate(internalstate) + elif version == 2: + version, internalstate, self.gauss_next = state + # In version 2, the state was saved as signed ints, which causes + # inconsistencies between 32/64-bit systems. The state is + # really unsigned 32-bit ints, so we convert negative ints from + # version 2 to positive longs for version 3. + try: + internalstate = tuple(x % (2**32) for x in internalstate) + except ValueError as e: + raise TypeError from e + super().setstate(internalstate) + else: + raise ValueError("state with version %s passed to " + "Random.setstate() of version %s" % + (version, self.VERSION)) + +## ---- Methods below this point do not need to be overridden when +## ---- subclassing for the purpose of using a different core generator. + +## -------------------- pickle support ------------------- + + # Issue 17489: Since __reduce__ was defined to fix #759889 this is no + # longer called; we leave it here because it has been here since random was + # rewritten back in 2001 and why risk breaking something. + def __getstate__(self): # for pickle + return self.getstate() + + def __setstate__(self, state): # for pickle + self.setstate(state) + + def __reduce__(self): + return self.__class__, (), self.getstate() + +## -------------------- integer methods ------------------- + + def randrange(self, start, stop=None, step=1, _int=int): + """Choose a random item from range(start, stop[, step]). + + This fixes the problem with randint() which includes the + endpoint; in Python this is usually not what you want. + + """ + + # This code is a bit messy to make it fast for the + # common case while still doing adequate error checking. + istart = _int(start) + if istart != start: + raise ValueError("non-integer arg 1 for randrange()") + if stop is None: + if istart > 0: + return self._randbelow(istart) + raise ValueError("empty range for randrange()") + + # stop argument supplied. + istop = _int(stop) + if istop != stop: + raise ValueError("non-integer stop for randrange()") + width = istop - istart + if step == 1 and width > 0: + return istart + self._randbelow(width) + if step == 1: + raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width)) + + # Non-unit step argument supplied. + istep = _int(step) + if istep != step: + raise ValueError("non-integer step for randrange()") + if istep > 0: + n = (width + istep - 1) // istep + elif istep < 0: + n = (width + istep + 1) // istep + else: + raise ValueError("zero step for randrange()") + + if n <= 0: + raise ValueError("empty range for randrange()") + + return istart + istep*self._randbelow(n) + + def randint(self, a, b): + """Return random integer in range [a, b], including both end points. + """ + + return self.randrange(a, b+1) + + def _randbelow(self, n, int=int, maxsize=1<= n: + r = getrandbits(k) + return r + # There's an overridden random() method but no new getrandbits() method, + # so we can only use random() from here. + if n >= maxsize: + _warn("Underlying random() generator does not supply \n" + "enough bits to choose from a population range this large.\n" + "To remove the range limitation, add a getrandbits() method.") + return int(random() * n) + if n == 0: + raise ValueError("Boundary cannot be zero") + rem = maxsize % n + limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0 + r = random() + while r >= limit: + r = random() + return int(r*maxsize) % n + +## -------------------- sequence methods ------------------- + + def choice(self, seq): + """Choose a random element from a non-empty sequence.""" + try: + i = self._randbelow(len(seq)) + except ValueError: + raise IndexError('Cannot choose from an empty sequence') from None + return seq[i] + + def shuffle(self, x, random=None): + """Shuffle list x in place, and return None. + + Optional argument random is a 0-argument function returning a + random float in [0.0, 1.0); if it is the default None, the + standard random.random will be used. + + """ + + if random is None: + randbelow = self._randbelow + for i in reversed(range(1, len(x))): + # pick an element in x[:i+1] with which to exchange x[i] + j = randbelow(i+1) + x[i], x[j] = x[j], x[i] + else: + _int = int + for i in reversed(range(1, len(x))): + # pick an element in x[:i+1] with which to exchange x[i] + j = _int(random() * (i+1)) + x[i], x[j] = x[j], x[i] + + def sample(self, population, k): + """Chooses k unique random elements from a population sequence or set. + + Returns a new list containing elements from the population while + leaving the original population unchanged. The resulting list is + in selection order so that all sub-slices will also be valid random + samples. This allows raffle winners (the sample) to be partitioned + into grand prize and second place winners (the subslices). + + Members of the population need not be hashable or unique. If the + population contains repeats, then each occurrence is a possible + selection in the sample. + + To choose a sample in a range of integers, use range as an argument. + This is especially fast and space efficient for sampling from a + large population: sample(range(10000000), 60) + """ + + # Sampling without replacement entails tracking either potential + # selections (the pool) in a list or previous selections in a set. + + # When the number of selections is small compared to the + # population, then tracking selections is efficient, requiring + # only a small set and an occasional reselection. For + # a larger number of selections, the pool tracking method is + # preferred since the list takes less space than the + # set and it doesn't suffer from frequent reselections. + + if isinstance(population, _Set): + population = tuple(population) + if not isinstance(population, _Sequence): + raise TypeError("Population must be a sequence or set. For dicts, use list(d).") + randbelow = self._randbelow + n = len(population) + if not 0 <= k <= n: + raise ValueError("Sample larger than population or is negative") + result = [None] * k + setsize = 21 # size of a small set minus size of an empty list + if k > 5: + setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets + if n <= setsize: + # An n-length list is smaller than a k-length set + pool = list(population) + for i in range(k): # invariant: non-selected at [0,n-i) + j = randbelow(n-i) + result[i] = pool[j] + pool[j] = pool[n-i-1] # move non-selected item into vacancy + else: + selected = set() + selected_add = selected.add + for i in range(k): + j = randbelow(n) + while j in selected: + j = randbelow(n) + selected_add(j) + result[i] = population[j] + return result + + def choices(self, population, weights=None, *, cum_weights=None, k=1): + """Return a k sized list of population elements chosen with replacement. + + If the relative weights or cumulative weights are not specified, + the selections are made with equal probability. + + """ + random = self.random + if cum_weights is None: + if weights is None: + _int = int + total = len(population) + return [population[_int(random() * total)] for i in range(k)] + cum_weights = list(_itertools.accumulate(weights)) + elif weights is not None: + raise TypeError('Cannot specify both weights and cumulative weights') + if len(cum_weights) != len(population): + raise ValueError('The number of weights does not match the population') + bisect = _bisect.bisect + total = cum_weights[-1] + return [population[bisect(cum_weights, random() * total)] for i in range(k)] + +## -------------------- real-valued distributions ------------------- + +## -------------------- uniform distribution ------------------- + + def uniform(self, a, b): + "Get a random number in the range [a, b) or [a, b] depending on rounding." + return a + (b-a) * self.random() + +## -------------------- triangular -------------------- + + def triangular(self, low=0.0, high=1.0, mode=None): + """Triangular distribution. + + Continuous distribution bounded by given lower and upper limits, + and having a given mode value in-between. + + http://en.wikipedia.org/wiki/Triangular_distribution + + """ + u = self.random() + try: + c = 0.5 if mode is None else (mode - low) / (high - low) + except ZeroDivisionError: + return low + if u > c: + u = 1.0 - u + c = 1.0 - c + low, high = high, low + return low + (high - low) * _sqrt(u * c) + +## -------------------- normal distribution -------------------- + + def normalvariate(self, mu, sigma): + """Normal distribution. + + mu is the mean, and sigma is the standard deviation. + + """ + # mu = mean, sigma = standard deviation + + # Uses Kinderman and Monahan method. Reference: Kinderman, + # A.J. and Monahan, J.F., "Computer generation of random + # variables using the ratio of uniform deviates", ACM Trans + # Math Software, 3, (1977), pp257-260. + + random = self.random + while 1: + u1 = random() + u2 = 1.0 - random() + z = NV_MAGICCONST*(u1-0.5)/u2 + zz = z*z/4.0 + if zz <= -_log(u2): + break + return mu + z*sigma + +## -------------------- lognormal distribution -------------------- + + def lognormvariate(self, mu, sigma): + """Log normal distribution. + + If you take the natural logarithm of this distribution, you'll get a + normal distribution with mean mu and standard deviation sigma. + mu can have any value, and sigma must be greater than zero. + + """ + return _exp(self.normalvariate(mu, sigma)) + +## -------------------- exponential distribution -------------------- + + def expovariate(self, lambd): + """Exponential distribution. + + lambd is 1.0 divided by the desired mean. It should be + nonzero. (The parameter would be called "lambda", but that is + a reserved word in Python.) Returned values range from 0 to + positive infinity if lambd is positive, and from negative + infinity to 0 if lambd is negative. + + """ + # lambd: rate lambd = 1/mean + # ('lambda' is a Python reserved word) + + # we use 1-random() instead of random() to preclude the + # possibility of taking the log of zero. + return -_log(1.0 - self.random())/lambd + +## -------------------- von Mises distribution -------------------- + + def vonmisesvariate(self, mu, kappa): + """Circular data distribution. + + mu is the mean angle, expressed in radians between 0 and 2*pi, and + kappa is the concentration parameter, which must be greater than or + equal to zero. If kappa is equal to zero, this distribution reduces + to a uniform random angle over the range 0 to 2*pi. + + """ + # mu: mean angle (in radians between 0 and 2*pi) + # kappa: concentration parameter kappa (>= 0) + # if kappa = 0 generate uniform random angle + + # Based upon an algorithm published in: Fisher, N.I., + # "Statistical Analysis of Circular Data", Cambridge + # University Press, 1993. + + # Thanks to Magnus Kessler for a correction to the + # implementation of step 4. + + random = self.random + if kappa <= 1e-6: + return TWOPI * random() + + s = 0.5 / kappa + r = s + _sqrt(1.0 + s * s) + + while 1: + u1 = random() + z = _cos(_pi * u1) + + d = z / (r + z) + u2 = random() + if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d): + break + + q = 1.0 / r + f = (q + z) / (1.0 + q * z) + u3 = random() + if u3 > 0.5: + theta = (mu + _acos(f)) % TWOPI + else: + theta = (mu - _acos(f)) % TWOPI + + return theta + +## -------------------- gamma distribution -------------------- + + def gammavariate(self, alpha, beta): + """Gamma distribution. Not the gamma function! + + Conditions on the parameters are alpha > 0 and beta > 0. + + The probability distribution function is: + + x ** (alpha - 1) * math.exp(-x / beta) + pdf(x) = -------------------------------------- + math.gamma(alpha) * beta ** alpha + + """ + + # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2 + + # Warning: a few older sources define the gamma distribution in terms + # of alpha > -1.0 + if alpha <= 0.0 or beta <= 0.0: + raise ValueError('gammavariate: alpha and beta must be > 0.0') + + random = self.random + if alpha > 1.0: + + # Uses R.C.H. Cheng, "The generation of Gamma + # variables with non-integral shape parameters", + # Applied Statistics, (1977), 26, No. 1, p71-74 + + ainv = _sqrt(2.0 * alpha - 1.0) + bbb = alpha - LOG4 + ccc = alpha + ainv + + while 1: + u1 = random() + if not 1e-7 < u1 < .9999999: + continue + u2 = 1.0 - random() + v = _log(u1/(1.0-u1))/ainv + x = alpha*_exp(v) + z = u1*u1*u2 + r = bbb+ccc*v-x + if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z): + return x * beta + + elif alpha == 1.0: + # expovariate(1/beta) + u = random() + while u <= 1e-7: + u = random() + return -_log(u) * beta + + else: # alpha is between 0 and 1 (exclusive) + + # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle + + while 1: + u = random() + b = (_e + alpha)/_e + p = b*u + if p <= 1.0: + x = p ** (1.0/alpha) + else: + x = -_log((b-p)/alpha) + u1 = random() + if p > 1.0: + if u1 <= x ** (alpha - 1.0): + break + elif u1 <= _exp(-x): + break + return x * beta + +## -------------------- Gauss (faster alternative) -------------------- + + def gauss(self, mu, sigma): + """Gaussian distribution. + + mu is the mean, and sigma is the standard deviation. This is + slightly faster than the normalvariate() function. + + Not thread-safe without a lock around calls. + + """ + + # When x and y are two variables from [0, 1), uniformly + # distributed, then + # + # cos(2*pi*x)*sqrt(-2*log(1-y)) + # sin(2*pi*x)*sqrt(-2*log(1-y)) + # + # are two *independent* variables with normal distribution + # (mu = 0, sigma = 1). + # (Lambert Meertens) + # (corrected version; bug discovered by Mike Miller, fixed by LM) + + # Multithreading note: When two threads call this function + # simultaneously, it is possible that they will receive the + # same return value. The window is very small though. To + # avoid this, you have to use a lock around all calls. (I + # didn't want to slow this down in the serial case by using a + # lock here.) + + random = self.random + z = self.gauss_next + self.gauss_next = None + if z is None: + x2pi = random() * TWOPI + g2rad = _sqrt(-2.0 * _log(1.0 - random())) + z = _cos(x2pi) * g2rad + self.gauss_next = _sin(x2pi) * g2rad + + return mu + z*sigma + +## -------------------- beta -------------------- +## See +## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html +## for Ivan Frohne's insightful analysis of why the original implementation: +## +## def betavariate(self, alpha, beta): +## # Discrete Event Simulation in C, pp 87-88. +## +## y = self.expovariate(alpha) +## z = self.expovariate(1.0/beta) +## return z/(y+z) +## +## was dead wrong, and how it probably got that way. + + def betavariate(self, alpha, beta): + """Beta distribution. + + Conditions on the parameters are alpha > 0 and beta > 0. + Returned values range between 0 and 1. + + """ + + # This version due to Janne Sinkkonen, and matches all the std + # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution"). + y = self.gammavariate(alpha, 1.0) + if y == 0: + return 0.0 + else: + return y / (y + self.gammavariate(beta, 1.0)) + +## -------------------- Pareto -------------------- + + def paretovariate(self, alpha): + """Pareto distribution. alpha is the shape parameter.""" + # Jain, pg. 495 + + u = 1.0 - self.random() + return 1.0 / u ** (1.0/alpha) + +## -------------------- Weibull -------------------- + + def weibullvariate(self, alpha, beta): + """Weibull distribution. + + alpha is the scale parameter and beta is the shape parameter. + + """ + # Jain, pg. 499; bug fix courtesy Bill Arms + + u = 1.0 - self.random() + return alpha * (-_log(u)) ** (1.0/beta) + +## --------------- Operating System Random Source ------------------ + +class SystemRandom(Random): + """Alternate random number generator using sources provided + by the operating system (such as /dev/urandom on Unix or + CryptGenRandom on Windows). + + Not available on all systems (see os.urandom() for details). + """ + + def random(self): + """Get the next random number in the range [0.0, 1.0).""" + return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF + + def getrandbits(self, k): + """getrandbits(k) -> x. Generates an int with k random bits.""" + if k <= 0: + raise ValueError('number of bits must be greater than zero') + if k != int(k): + raise TypeError('number of bits should be an integer') + numbytes = (k + 7) // 8 # bits / 8 and rounded up + x = int.from_bytes(_urandom(numbytes), 'big') + return x >> (numbytes * 8 - k) # trim excess bits + + def seed(self, *args, **kwds): + "Stub method. Not used for a system random number generator." + return None + + def _notimplemented(self, *args, **kwds): + "Method should not be called for a system random number generator." + raise NotImplementedError('System entropy source does not have state.') + getstate = setstate = _notimplemented + +## -------------------- test program -------------------- + +def _test_generator(n, func, args): + import time + print(n, 'times', func.__name__) + total = 0.0 + sqsum = 0.0 + smallest = 1e10 + largest = -1e10 + t0 = time.time() + for i in range(n): + x = func(*args) + total += x + sqsum = sqsum + x*x + smallest = min(x, smallest) + largest = max(x, largest) + t1 = time.time() + print(round(t1-t0, 3), 'sec,', end=' ') + avg = total/n + stddev = _sqrt(sqsum/n - avg*avg) + print('avg %g, stddev %g, min %g, max %g\n' % \ + (avg, stddev, smallest, largest)) + + +def _test(N=2000): + _test_generator(N, random, ()) + _test_generator(N, normalvariate, (0.0, 1.0)) + _test_generator(N, lognormvariate, (0.0, 1.0)) + _test_generator(N, vonmisesvariate, (0.0, 1.0)) + _test_generator(N, gammavariate, (0.01, 1.0)) + _test_generator(N, gammavariate, (0.1, 1.0)) + _test_generator(N, gammavariate, (0.1, 2.0)) + _test_generator(N, gammavariate, (0.5, 1.0)) + _test_generator(N, gammavariate, (0.9, 1.0)) + _test_generator(N, gammavariate, (1.0, 1.0)) + _test_generator(N, gammavariate, (2.0, 1.0)) + _test_generator(N, gammavariate, (20.0, 1.0)) + _test_generator(N, gammavariate, (200.0, 1.0)) + _test_generator(N, gauss, (0.0, 1.0)) + _test_generator(N, betavariate, (3.0, 3.0)) + _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0)) + +# Create one instance, seeded from current time, and export its methods +# as module-level functions. The functions share state across all uses +#(both in the user's code and in the Python libraries), but that's fine +# for most programs and is easier for the casual user than making them +# instantiate their own Random() instance. + +_inst = Random() +seed = _inst.seed +random = _inst.random +uniform = _inst.uniform +triangular = _inst.triangular +randint = _inst.randint +choice = _inst.choice +randrange = _inst.randrange +sample = _inst.sample +shuffle = _inst.shuffle +choices = _inst.choices +normalvariate = _inst.normalvariate +lognormvariate = _inst.lognormvariate +expovariate = _inst.expovariate +vonmisesvariate = _inst.vonmisesvariate +gammavariate = _inst.gammavariate +gauss = _inst.gauss +betavariate = _inst.betavariate +paretovariate = _inst.paretovariate +weibullvariate = _inst.weibullvariate +getstate = _inst.getstate +setstate = _inst.setstate +getrandbits = _inst.getrandbits + +if hasattr(_os, "fork"): + _os.register_at_fork(after_in_child=_inst.seed) + + +if __name__ == '__main__': + _test() diff --git a/venv/Lib/re.py b/venv/Lib/re.py new file mode 100644 index 00000000..94d48657 --- /dev/null +++ b/venv/Lib/re.py @@ -0,0 +1,366 @@ +# +# Secret Labs' Regular Expression Engine +# +# re-compatible interface for the sre matching engine +# +# Copyright (c) 1998-2001 by Secret Labs AB. All rights reserved. +# +# This version of the SRE library can be redistributed under CNRI's +# Python 1.6 license. For any other use, please contact Secret Labs +# AB (info@pythonware.com). +# +# Portions of this engine have been developed in cooperation with +# CNRI. Hewlett-Packard provided funding for 1.6 integration and +# other compatibility work. +# + +r"""Support for regular expressions (RE). + +This module provides regular expression matching operations similar to +those found in Perl. It supports both 8-bit and Unicode strings; both +the pattern and the strings being processed can contain null bytes and +characters outside the US ASCII range. + +Regular expressions can contain both special and ordinary characters. +Most ordinary characters, like "A", "a", or "0", are the simplest +regular expressions; they simply match themselves. You can +concatenate ordinary characters, so last matches the string 'last'. + +The special characters are: + "." Matches any character except a newline. + "^" Matches the start of the string. + "$" Matches the end of the string or just before the newline at + the end of the string. + "*" Matches 0 or more (greedy) repetitions of the preceding RE. + Greedy means that it will match as many repetitions as possible. + "+" Matches 1 or more (greedy) repetitions of the preceding RE. + "?" Matches 0 or 1 (greedy) of the preceding RE. + *?,+?,?? Non-greedy versions of the previous three special characters. + {m,n} Matches from m to n repetitions of the preceding RE. + {m,n}? Non-greedy version of the above. + "\\" Either escapes special characters or signals a special sequence. + [] Indicates a set of characters. + A "^" as the first character indicates a complementing set. + "|" A|B, creates an RE that will match either A or B. + (...) Matches the RE inside the parentheses. + The contents can be retrieved or matched later in the string. + (?aiLmsux) Set the A, I, L, M, S, U, or X flag for the RE (see below). + (?:...) Non-grouping version of regular parentheses. + (?P...) The substring matched by the group is accessible by name. + (?P=name) Matches the text matched earlier by the group named name. + (?#...) A comment; ignored. + (?=...) Matches if ... matches next, but doesn't consume the string. + (?!...) Matches if ... doesn't match next. + (?<=...) Matches if preceded by ... (must be fixed length). + (?= _MAXCACHE: + # Drop the oldest item + try: + del _cache[next(iter(_cache))] + except (StopIteration, RuntimeError, KeyError): + pass + _cache[type(pattern), pattern, flags] = p + return p + +@functools.lru_cache(_MAXCACHE) +def _compile_repl(repl, pattern): + # internal: compile replacement pattern + return sre_parse.parse_template(repl, pattern) + +def _expand(pattern, match, template): + # internal: Match.expand implementation hook + template = sre_parse.parse_template(template, pattern) + return sre_parse.expand_template(template, match) + +def _subx(pattern, template): + # internal: Pattern.sub/subn implementation helper + template = _compile_repl(template, pattern) + if not template[0] and len(template[1]) == 1: + # literal replacement + return template[1][0] + def filter(match, template=template): + return sre_parse.expand_template(template, match) + return filter + +# register myself for pickling + +import copyreg + +def _pickle(p): + return _compile, (p.pattern, p.flags) + +copyreg.pickle(Pattern, _pickle, _compile) + +# -------------------------------------------------------------------- +# experimental stuff (see python-dev discussions for details) + +class Scanner: + def __init__(self, lexicon, flags=0): + from sre_constants import BRANCH, SUBPATTERN + if isinstance(flags, RegexFlag): + flags = flags.value + self.lexicon = lexicon + # combine phrases into a compound pattern + p = [] + s = sre_parse.Pattern() + s.flags = flags + for phrase, action in lexicon: + gid = s.opengroup() + p.append(sre_parse.SubPattern(s, [ + (SUBPATTERN, (gid, 0, 0, sre_parse.parse(phrase, flags))), + ])) + s.closegroup(gid, p[-1]) + p = sre_parse.SubPattern(s, [(BRANCH, (None, p))]) + self.scanner = sre_compile.compile(p) + def scan(self, string): + result = [] + append = result.append + match = self.scanner.scanner(string).match + i = 0 + while True: + m = match() + if not m: + break + j = m.end() + if i == j: + break + action = self.lexicon[m.lastindex-1][1] + if callable(action): + self.match = m + action = action(self, m.group()) + if action is not None: + append(action) + i = j + return result, string[i:] diff --git a/venv/Lib/reprlib.py b/venv/Lib/reprlib.py new file mode 100644 index 00000000..616b3439 --- /dev/null +++ b/venv/Lib/reprlib.py @@ -0,0 +1,161 @@ +"""Redo the builtin repr() (representation) but with limits on most sizes.""" + +__all__ = ["Repr", "repr", "recursive_repr"] + +import builtins +from itertools import islice +from _thread import get_ident + +def recursive_repr(fillvalue='...'): + 'Decorator to make a repr function return fillvalue for a recursive call' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__qualname__ = getattr(user_function, '__qualname__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + +class Repr: + + def __init__(self): + self.maxlevel = 6 + self.maxtuple = 6 + self.maxlist = 6 + self.maxarray = 5 + self.maxdict = 4 + self.maxset = 6 + self.maxfrozenset = 6 + self.maxdeque = 6 + self.maxstring = 30 + self.maxlong = 40 + self.maxother = 30 + + def repr(self, x): + return self.repr1(x, self.maxlevel) + + def repr1(self, x, level): + typename = type(x).__name__ + if ' ' in typename: + parts = typename.split() + typename = '_'.join(parts) + if hasattr(self, 'repr_' + typename): + return getattr(self, 'repr_' + typename)(x, level) + else: + return self.repr_instance(x, level) + + def _repr_iterable(self, x, level, left, right, maxiter, trail=''): + n = len(x) + if level <= 0 and n: + s = '...' + else: + newlevel = level - 1 + repr1 = self.repr1 + pieces = [repr1(elem, newlevel) for elem in islice(x, maxiter)] + if n > maxiter: pieces.append('...') + s = ', '.join(pieces) + if n == 1 and trail: right = trail + right + return '%s%s%s' % (left, s, right) + + def repr_tuple(self, x, level): + return self._repr_iterable(x, level, '(', ')', self.maxtuple, ',') + + def repr_list(self, x, level): + return self._repr_iterable(x, level, '[', ']', self.maxlist) + + def repr_array(self, x, level): + if not x: + return "array('%s')" % x.typecode + header = "array('%s', [" % x.typecode + return self._repr_iterable(x, level, header, '])', self.maxarray) + + def repr_set(self, x, level): + if not x: + return 'set()' + x = _possibly_sorted(x) + return self._repr_iterable(x, level, '{', '}', self.maxset) + + def repr_frozenset(self, x, level): + if not x: + return 'frozenset()' + x = _possibly_sorted(x) + return self._repr_iterable(x, level, 'frozenset({', '})', + self.maxfrozenset) + + def repr_deque(self, x, level): + return self._repr_iterable(x, level, 'deque([', '])', self.maxdeque) + + def repr_dict(self, x, level): + n = len(x) + if n == 0: return '{}' + if level <= 0: return '{...}' + newlevel = level - 1 + repr1 = self.repr1 + pieces = [] + for key in islice(_possibly_sorted(x), self.maxdict): + keyrepr = repr1(key, newlevel) + valrepr = repr1(x[key], newlevel) + pieces.append('%s: %s' % (keyrepr, valrepr)) + if n > self.maxdict: pieces.append('...') + s = ', '.join(pieces) + return '{%s}' % (s,) + + def repr_str(self, x, level): + s = builtins.repr(x[:self.maxstring]) + if len(s) > self.maxstring: + i = max(0, (self.maxstring-3)//2) + j = max(0, self.maxstring-3-i) + s = builtins.repr(x[:i] + x[len(x)-j:]) + s = s[:i] + '...' + s[len(s)-j:] + return s + + def repr_int(self, x, level): + s = builtins.repr(x) # XXX Hope this isn't too slow... + if len(s) > self.maxlong: + i = max(0, (self.maxlong-3)//2) + j = max(0, self.maxlong-3-i) + s = s[:i] + '...' + s[len(s)-j:] + return s + + def repr_instance(self, x, level): + try: + s = builtins.repr(x) + # Bugs in x.__repr__() can cause arbitrary + # exceptions -- then make up something + except Exception: + return '<%s instance at %#x>' % (x.__class__.__name__, id(x)) + if len(s) > self.maxother: + i = max(0, (self.maxother-3)//2) + j = max(0, self.maxother-3-i) + s = s[:i] + '...' + s[len(s)-j:] + return s + + +def _possibly_sorted(x): + # Since not all sequences of items can be sorted and comparison + # functions may raise arbitrary exceptions, return an unsorted + # sequence in that case. + try: + return sorted(x) + except Exception: + return list(x) + +aRepr = Repr() +repr = aRepr.repr diff --git a/venv/Lib/rlcompleter.py b/venv/Lib/rlcompleter.py new file mode 100644 index 00000000..bca4a7bc --- /dev/null +++ b/venv/Lib/rlcompleter.py @@ -0,0 +1,205 @@ +"""Word completion for GNU readline. + +The completer completes keywords, built-ins and globals in a selectable +namespace (which defaults to __main__); when completing NAME.NAME..., it +evaluates (!) the expression up to the last dot and completes its attributes. + +It's very cool to do "import sys" type "sys.", hit the completion key (twice), +and see the list of names defined by the sys module! + +Tip: to use the tab key as the completion key, call + + readline.parse_and_bind("tab: complete") + +Notes: + +- Exceptions raised by the completer function are *ignored* (and generally cause + the completion to fail). This is a feature -- since readline sets the tty + device in raw (or cbreak) mode, printing a traceback wouldn't work well + without some complicated hoopla to save, reset and restore the tty state. + +- The evaluation of the NAME.NAME... form may cause arbitrary application + defined code to be executed if an object with a __getattr__ hook is found. + Since it is the responsibility of the application (or the user) to enable this + feature, I consider this an acceptable risk. More complicated expressions + (e.g. function calls or indexing operations) are *not* evaluated. + +- When the original stdin is not a tty device, GNU readline is never + used, and this module (and the readline module) are silently inactive. + +""" + +import atexit +import builtins +import __main__ + +__all__ = ["Completer"] + +class Completer: + def __init__(self, namespace = None): + """Create a new completer for the command line. + + Completer([namespace]) -> completer instance. + + If unspecified, the default namespace where completions are performed + is __main__ (technically, __main__.__dict__). Namespaces should be + given as dictionaries. + + Completer instances should be used as the completion mechanism of + readline via the set_completer() call: + + readline.set_completer(Completer(my_namespace).complete) + """ + + if namespace and not isinstance(namespace, dict): + raise TypeError('namespace must be a dictionary') + + # Don't bind to namespace quite yet, but flag whether the user wants a + # specific namespace or to use __main__.__dict__. This will allow us + # to bind to __main__.__dict__ at completion time, not now. + if namespace is None: + self.use_main_ns = 1 + else: + self.use_main_ns = 0 + self.namespace = namespace + + def complete(self, text, state): + """Return the next possible completion for 'text'. + + This is called successively with state == 0, 1, 2, ... until it + returns None. The completion should begin with 'text'. + + """ + if self.use_main_ns: + self.namespace = __main__.__dict__ + + if not text.strip(): + if state == 0: + if _readline_available: + readline.insert_text('\t') + readline.redisplay() + return '' + else: + return '\t' + else: + return None + + if state == 0: + if "." in text: + self.matches = self.attr_matches(text) + else: + self.matches = self.global_matches(text) + try: + return self.matches[state] + except IndexError: + return None + + def _callable_postfix(self, val, word): + if callable(val): + word = word + "(" + return word + + def global_matches(self, text): + """Compute matches when text is a simple name. + + Return a list of all keywords, built-in functions and names currently + defined in self.namespace that match. + + """ + import keyword + matches = [] + seen = {"__builtins__"} + n = len(text) + for word in keyword.kwlist: + if word[:n] == text: + seen.add(word) + if word in {'finally', 'try'}: + word = word + ':' + elif word not in {'False', 'None', 'True', + 'break', 'continue', 'pass', + 'else'}: + word = word + ' ' + matches.append(word) + for nspace in [self.namespace, builtins.__dict__]: + for word, val in nspace.items(): + if word[:n] == text and word not in seen: + seen.add(word) + matches.append(self._callable_postfix(val, word)) + return matches + + def attr_matches(self, text): + """Compute matches when text contains a dot. + + Assuming the text is of the form NAME.NAME....[NAME], and is + evaluable in self.namespace, it will be evaluated and its attributes + (as revealed by dir()) are used as possible completions. (For class + instances, class members are also considered.) + + WARNING: this can still invoke arbitrary C code, if an object + with a __getattr__ hook is evaluated. + + """ + import re + m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text) + if not m: + return [] + expr, attr = m.group(1, 3) + try: + thisobject = eval(expr, self.namespace) + except Exception: + return [] + + # get the content of the object, except __builtins__ + words = set(dir(thisobject)) + words.discard("__builtins__") + + if hasattr(thisobject, '__class__'): + words.add('__class__') + words.update(get_class_members(thisobject.__class__)) + matches = [] + n = len(attr) + if attr == '': + noprefix = '_' + elif attr == '_': + noprefix = '__' + else: + noprefix = None + while True: + for word in words: + if (word[:n] == attr and + not (noprefix and word[:n+1] == noprefix)): + match = "%s.%s" % (expr, word) + try: + val = getattr(thisobject, word) + except Exception: + pass # Include even if attribute not set + else: + match = self._callable_postfix(val, match) + matches.append(match) + if matches or not noprefix: + break + if noprefix == '_': + noprefix = '__' + else: + noprefix = None + matches.sort() + return matches + +def get_class_members(klass): + ret = dir(klass) + if hasattr(klass,'__bases__'): + for base in klass.__bases__: + ret = ret + get_class_members(base) + return ret + +try: + import readline +except ImportError: + _readline_available = False +else: + readline.set_completer(Completer().complete) + # Release references early at shutdown (the readline module's + # contents are quasi-immortal, and the completer function holds a + # reference to globals). + atexit.register(lambda: readline.set_completer(None)) + _readline_available = True diff --git a/venv/Lib/shutil.py b/venv/Lib/shutil.py new file mode 100644 index 00000000..3c02776a --- /dev/null +++ b/venv/Lib/shutil.py @@ -0,0 +1,1169 @@ +"""Utility functions for copying and archiving files and directory trees. + +XXX The functions here don't copy the resource fork or other metadata on Mac. + +""" + +import os +import sys +import stat +import fnmatch +import collections +import errno + +try: + import zlib + del zlib + _ZLIB_SUPPORTED = True +except ImportError: + _ZLIB_SUPPORTED = False + +try: + import bz2 + del bz2 + _BZ2_SUPPORTED = True +except ImportError: + _BZ2_SUPPORTED = False + +try: + import lzma + del lzma + _LZMA_SUPPORTED = True +except ImportError: + _LZMA_SUPPORTED = False + +try: + from pwd import getpwnam +except ImportError: + getpwnam = None + +try: + from grp import getgrnam +except ImportError: + getgrnam = None + +__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", + "copytree", "move", "rmtree", "Error", "SpecialFileError", + "ExecError", "make_archive", "get_archive_formats", + "register_archive_format", "unregister_archive_format", + "get_unpack_formats", "register_unpack_format", + "unregister_unpack_format", "unpack_archive", + "ignore_patterns", "chown", "which", "get_terminal_size", + "SameFileError"] + # disk_usage is added later, if available on the platform + +class Error(OSError): + pass + +class SameFileError(Error): + """Raised when source and destination are the same file.""" + +class SpecialFileError(OSError): + """Raised when trying to do a kind of operation (e.g. copying) which is + not supported on a special file (e.g. a named pipe)""" + +class ExecError(OSError): + """Raised when a command could not be executed""" + +class ReadError(OSError): + """Raised when an archive cannot be read""" + +class RegistryError(Exception): + """Raised when a registry operation with the archiving + and unpacking registries fails""" + + +def copyfileobj(fsrc, fdst, length=16*1024): + """copy data from file-like object fsrc to file-like object fdst""" + while 1: + buf = fsrc.read(length) + if not buf: + break + fdst.write(buf) + +def _samefile(src, dst): + # Macintosh, Unix. + if hasattr(os.path, 'samefile'): + try: + return os.path.samefile(src, dst) + except OSError: + return False + + # All other platforms: check for same pathname. + return (os.path.normcase(os.path.abspath(src)) == + os.path.normcase(os.path.abspath(dst))) + +def copyfile(src, dst, *, follow_symlinks=True): + """Copy data from src to dst. + + If follow_symlinks is not set and src is a symbolic link, a new + symlink will be created instead of copying the file it points to. + + """ + if _samefile(src, dst): + raise SameFileError("{!r} and {!r} are the same file".format(src, dst)) + + for fn in [src, dst]: + try: + st = os.stat(fn) + except OSError: + # File most likely does not exist + pass + else: + # XXX What about other special files? (sockets, devices...) + if stat.S_ISFIFO(st.st_mode): + raise SpecialFileError("`%s` is a named pipe" % fn) + + if not follow_symlinks and os.path.islink(src): + os.symlink(os.readlink(src), dst) + else: + with open(src, 'rb') as fsrc: + with open(dst, 'wb') as fdst: + copyfileobj(fsrc, fdst) + return dst + +def copymode(src, dst, *, follow_symlinks=True): + """Copy mode bits from src to dst. + + If follow_symlinks is not set, symlinks aren't followed if and only + if both `src` and `dst` are symlinks. If `lchmod` isn't available + (e.g. Linux) this method does nothing. + + """ + if not follow_symlinks and os.path.islink(src) and os.path.islink(dst): + if hasattr(os, 'lchmod'): + stat_func, chmod_func = os.lstat, os.lchmod + else: + return + elif hasattr(os, 'chmod'): + stat_func, chmod_func = os.stat, os.chmod + else: + return + + st = stat_func(src) + chmod_func(dst, stat.S_IMODE(st.st_mode)) + +if hasattr(os, 'listxattr'): + def _copyxattr(src, dst, *, follow_symlinks=True): + """Copy extended filesystem attributes from `src` to `dst`. + + Overwrite existing attributes. + + If `follow_symlinks` is false, symlinks won't be followed. + + """ + + try: + names = os.listxattr(src, follow_symlinks=follow_symlinks) + except OSError as e: + if e.errno not in (errno.ENOTSUP, errno.ENODATA): + raise + return + for name in names: + try: + value = os.getxattr(src, name, follow_symlinks=follow_symlinks) + os.setxattr(dst, name, value, follow_symlinks=follow_symlinks) + except OSError as e: + if e.errno not in (errno.EPERM, errno.ENOTSUP, errno.ENODATA): + raise +else: + def _copyxattr(*args, **kwargs): + pass + +def copystat(src, dst, *, follow_symlinks=True): + """Copy all stat info (mode bits, atime, mtime, flags) from src to dst. + + If the optional flag `follow_symlinks` is not set, symlinks aren't followed if and + only if both `src` and `dst` are symlinks. + + """ + def _nop(*args, ns=None, follow_symlinks=None): + pass + + # follow symlinks (aka don't not follow symlinks) + follow = follow_symlinks or not (os.path.islink(src) and os.path.islink(dst)) + if follow: + # use the real function if it exists + def lookup(name): + return getattr(os, name, _nop) + else: + # use the real function only if it exists + # *and* it supports follow_symlinks + def lookup(name): + fn = getattr(os, name, _nop) + if fn in os.supports_follow_symlinks: + return fn + return _nop + + st = lookup("stat")(src, follow_symlinks=follow) + mode = stat.S_IMODE(st.st_mode) + lookup("utime")(dst, ns=(st.st_atime_ns, st.st_mtime_ns), + follow_symlinks=follow) + try: + lookup("chmod")(dst, mode, follow_symlinks=follow) + except NotImplementedError: + # if we got a NotImplementedError, it's because + # * follow_symlinks=False, + # * lchown() is unavailable, and + # * either + # * fchownat() is unavailable or + # * fchownat() doesn't implement AT_SYMLINK_NOFOLLOW. + # (it returned ENOSUP.) + # therefore we're out of options--we simply cannot chown the + # symlink. give up, suppress the error. + # (which is what shutil always did in this circumstance.) + pass + if hasattr(st, 'st_flags'): + try: + lookup("chflags")(dst, st.st_flags, follow_symlinks=follow) + except OSError as why: + for err in 'EOPNOTSUPP', 'ENOTSUP': + if hasattr(errno, err) and why.errno == getattr(errno, err): + break + else: + raise + _copyxattr(src, dst, follow_symlinks=follow) + +def copy(src, dst, *, follow_symlinks=True): + """Copy data and mode bits ("cp src dst"). Return the file's destination. + + The destination may be a directory. + + If follow_symlinks is false, symlinks won't be followed. This + resembles GNU's "cp -P src dst". + + If source and destination are the same file, a SameFileError will be + raised. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst, follow_symlinks=follow_symlinks) + copymode(src, dst, follow_symlinks=follow_symlinks) + return dst + +def copy2(src, dst, *, follow_symlinks=True): + """Copy data and all stat info ("cp -p src dst"). Return the file's + destination." + + The destination may be a directory. + + If follow_symlinks is false, symlinks won't be followed. This + resembles GNU's "cp -P src dst". + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst, follow_symlinks=follow_symlinks) + copystat(src, dst, follow_symlinks=follow_symlinks) + return dst + +def ignore_patterns(*patterns): + """Function that can be used as copytree() ignore parameter. + + Patterns is a sequence of glob-style patterns + that are used to exclude files""" + def _ignore_patterns(path, names): + ignored_names = [] + for pattern in patterns: + ignored_names.extend(fnmatch.filter(names, pattern)) + return set(ignored_names) + return _ignore_patterns + +def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, + ignore_dangling_symlinks=False): + """Recursively copy a directory tree. + + The destination directory must not already exist. + If exception(s) occur, an Error is raised with a list of reasons. + + If the optional symlinks flag is true, symbolic links in the + source tree result in symbolic links in the destination tree; if + it is false, the contents of the files pointed to by symbolic + links are copied. If the file pointed by the symlink doesn't + exist, an exception will be added in the list of errors raised in + an Error exception at the end of the copy process. + + You can set the optional ignore_dangling_symlinks flag to true if you + want to silence this exception. Notice that this has no effect on + platforms that don't support os.symlink. + + The optional ignore argument is a callable. If given, it + is called with the `src` parameter, which is the directory + being visited by copytree(), and `names` which is the list of + `src` contents, as returned by os.listdir(): + + callable(src, names) -> ignored_names + + Since copytree() is called recursively, the callable will be + called once for each directory that is copied. It returns a + list of names relative to the `src` directory that should + not be copied. + + The optional copy_function argument is a callable that will be used + to copy each file. It will be called with the source path and the + destination path as arguments. By default, copy2() is used, but any + function that supports the same signature (like copy()) can be used. + + """ + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.islink(srcname): + linkto = os.readlink(srcname) + if symlinks: + # We can't just leave it to `copy_function` because legacy + # code with a custom `copy_function` may rely on copytree + # doing the right thing. + os.symlink(linkto, dstname) + copystat(srcname, dstname, follow_symlinks=not symlinks) + else: + # ignore dangling symlink if the flag is on + if not os.path.exists(linkto) and ignore_dangling_symlinks: + continue + # otherwise let the copy occurs. copy2 will raise an error + if os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, + copy_function) + else: + copy_function(srcname, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, copy_function) + else: + # Will raise a SpecialFileError for unsupported file types + copy_function(srcname, dstname) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error as err: + errors.extend(err.args[0]) + except OSError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + # Copying file access times may fail on Windows + if getattr(why, 'winerror', None) is None: + errors.append((src, dst, str(why))) + if errors: + raise Error(errors) + return dst + +# version vulnerable to race conditions +def _rmtree_unsafe(path, onerror): + try: + with os.scandir(path) as scandir_it: + entries = list(scandir_it) + except OSError: + onerror(os.scandir, path, sys.exc_info()) + entries = [] + for entry in entries: + fullname = entry.path + try: + is_dir = entry.is_dir(follow_symlinks=False) + except OSError: + is_dir = False + if is_dir: + try: + if entry.is_symlink(): + # This can only happen if someone replaces + # a directory with a symlink after the call to + # os.scandir or entry.is_dir above. + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, fullname, sys.exc_info()) + continue + _rmtree_unsafe(fullname, onerror) + else: + try: + os.unlink(fullname) + except OSError: + onerror(os.unlink, fullname, sys.exc_info()) + try: + os.rmdir(path) + except OSError: + onerror(os.rmdir, path, sys.exc_info()) + +# Version using fd-based APIs to protect against races +def _rmtree_safe_fd(topfd, path, onerror): + try: + with os.scandir(topfd) as scandir_it: + entries = list(scandir_it) + except OSError as err: + err.filename = path + onerror(os.scandir, path, sys.exc_info()) + return + for entry in entries: + fullname = os.path.join(path, entry.name) + try: + is_dir = entry.is_dir(follow_symlinks=False) + if is_dir: + orig_st = entry.stat(follow_symlinks=False) + is_dir = stat.S_ISDIR(orig_st.st_mode) + except OSError: + is_dir = False + if is_dir: + try: + dirfd = os.open(entry.name, os.O_RDONLY, dir_fd=topfd) + except OSError: + onerror(os.open, fullname, sys.exc_info()) + else: + try: + if os.path.samestat(orig_st, os.fstat(dirfd)): + _rmtree_safe_fd(dirfd, fullname, onerror) + try: + os.rmdir(entry.name, dir_fd=topfd) + except OSError: + onerror(os.rmdir, fullname, sys.exc_info()) + else: + try: + # This can only happen if someone replaces + # a directory with a symlink after the call to + # os.scandir or stat.S_ISDIR above. + raise OSError("Cannot call rmtree on a symbolic " + "link") + except OSError: + onerror(os.path.islink, fullname, sys.exc_info()) + finally: + os.close(dirfd) + else: + try: + os.unlink(entry.name, dir_fd=topfd) + except OSError: + onerror(os.unlink, fullname, sys.exc_info()) + +_use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= + os.supports_dir_fd and + os.scandir in os.supports_fd and + os.stat in os.supports_follow_symlinks) + +def rmtree(path, ignore_errors=False, onerror=None): + """Recursively delete a directory tree. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is platform and implementation dependent; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is false and onerror is None, an exception is raised. + + """ + if ignore_errors: + def onerror(*args): + pass + elif onerror is None: + def onerror(*args): + raise + if _use_fd_functions: + # While the unsafe rmtree works fine on bytes, the fd based does not. + if isinstance(path, bytes): + path = os.fsdecode(path) + # Note: To guard against symlink races, we use the standard + # lstat()/open()/fstat() trick. + try: + orig_st = os.lstat(path) + except Exception: + onerror(os.lstat, path, sys.exc_info()) + return + try: + fd = os.open(path, os.O_RDONLY) + except Exception: + onerror(os.lstat, path, sys.exc_info()) + return + try: + if os.path.samestat(orig_st, os.fstat(fd)): + _rmtree_safe_fd(fd, path, onerror) + try: + os.rmdir(path) + except OSError: + onerror(os.rmdir, path, sys.exc_info()) + else: + try: + # symlinks to directories are forbidden, see bug #1669 + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, path, sys.exc_info()) + finally: + os.close(fd) + else: + try: + if os.path.islink(path): + # symlinks to directories are forbidden, see bug #1669 + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, path, sys.exc_info()) + # can't continue even if onerror hook returns + return + return _rmtree_unsafe(path, onerror) + +# Allow introspection of whether or not the hardening against symlink +# attacks is supported on the current platform +rmtree.avoids_symlink_attacks = _use_fd_functions + +def _basename(path): + # A basename() variant which first strips the trailing slash, if present. + # Thus we always get the last component of the path, even for directories. + sep = os.path.sep + (os.path.altsep or '') + return os.path.basename(path.rstrip(sep)) + +def move(src, dst, copy_function=copy2): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. Return the file or directory's + destination. + + If the destination is a directory or a symlink to a directory, the source + is moved inside the directory. The destination path must not already + exist. + + If the destination already exists but is not a directory, it may be + overwritten depending on os.rename() semantics. + + If the destination is on our current filesystem, then rename() is used. + Otherwise, src is copied to the destination and then removed. Symlinks are + recreated under the new name if os.rename() fails because of cross + filesystem renames. + + The optional `copy_function` argument is a callable that will be used + to copy the source or it will be delegated to `copytree`. + By default, copy2() is used, but any function that supports the same + signature (like copy()) can be used. + + A lot more could be done here... A look at a mv.c shows a lot of + the issues this implementation glosses over. + + """ + real_dst = dst + if os.path.isdir(dst): + if _samefile(src, dst): + # We might be on a case insensitive filesystem, + # perform the rename anyway. + os.rename(src, dst) + return + + real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): + raise Error("Destination path '%s' already exists" % real_dst) + try: + os.rename(src, real_dst) + except OSError: + if os.path.islink(src): + linkto = os.readlink(src) + os.symlink(linkto, real_dst) + os.unlink(src) + elif os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself" + " '%s'." % (src, dst)) + copytree(src, real_dst, copy_function=copy_function, + symlinks=True) + rmtree(src) + else: + copy_function(src, real_dst) + os.unlink(src) + return real_dst + +def _destinsrc(src, dst): + src = os.path.abspath(src) + dst = os.path.abspath(dst) + if not src.endswith(os.path.sep): + src += os.path.sep + if not dst.endswith(os.path.sep): + dst += os.path.sep + return dst.startswith(src) + +def _get_gid(name): + """Returns a gid, given a group name.""" + if getgrnam is None or name is None: + return None + try: + result = getgrnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _get_uid(name): + """Returns an uid, given a user name.""" + if getpwnam is None or name is None: + return None + try: + result = getpwnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, + owner=None, group=None, logger=None): + """Create a (possibly compressed) tar file from all the files under + 'base_dir'. + + 'compress' must be "gzip" (the default), "bzip2", "xz", or None. + + 'owner' and 'group' can be used to define an owner and a group for the + archive that is being built. If not provided, the current owner and group + will be used. + + The output tar file will be named 'base_name' + ".tar", possibly plus + the appropriate compression extension (".gz", ".bz2", or ".xz"). + + Returns the output filename. + """ + if compress is None: + tar_compression = '' + elif _ZLIB_SUPPORTED and compress == 'gzip': + tar_compression = 'gz' + elif _BZ2_SUPPORTED and compress == 'bzip2': + tar_compression = 'bz2' + elif _LZMA_SUPPORTED and compress == 'xz': + tar_compression = 'xz' + else: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + import tarfile # late import for breaking circular dependency + + compress_ext = '.' + tar_compression if compress else '' + archive_name = base_name + '.tar' + compress_ext + archive_dir = os.path.dirname(archive_name) + + if archive_dir and not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # creating the tarball + if logger is not None: + logger.info('Creating tar archive') + + uid = _get_uid(owner) + gid = _get_gid(group) + + def _set_uid_gid(tarinfo): + if gid is not None: + tarinfo.gid = gid + tarinfo.gname = group + if uid is not None: + tarinfo.uid = uid + tarinfo.uname = owner + return tarinfo + + if not dry_run: + tar = tarfile.open(archive_name, 'w|%s' % tar_compression) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): + """Create a zip file from all the files under 'base_dir'. + + The output zip file will be named 'base_name' + ".zip". Returns the + name of the output zip file. + """ + import zipfile # late import for breaking circular dependency + + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if archive_dir and not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + if logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + with zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) as zf: + path = os.path.normpath(base_dir) + if path != os.curdir: + zf.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in sorted(dirnames): + path = os.path.normpath(os.path.join(dirpath, name)) + zf.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zf.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + + return zip_filename + +_ARCHIVE_FORMATS = { + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), +} + +if _ZLIB_SUPPORTED: + _ARCHIVE_FORMATS['gztar'] = (_make_tarball, [('compress', 'gzip')], + "gzip'ed tar-file") + _ARCHIVE_FORMATS['zip'] = (_make_zipfile, [], "ZIP file") + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +if _LZMA_SUPPORTED: + _ARCHIVE_FORMATS['xztar'] = (_make_tarball, [('compress', 'xz')], + "xz'ed tar-file") + +def get_archive_formats(): + """Returns a list of supported formats for archiving and unarchiving. + + Each element of the returned sequence is a tuple (name, description) + """ + formats = [(name, registry[2]) for name, registry in + _ARCHIVE_FORMATS.items()] + formats.sort() + return formats + +def register_archive_format(name, function, extra_args=None, description=''): + """Registers an archive format. + + name is the name of the format. function is the callable that will be + used to create archives. If provided, extra_args is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_archive_formats() function. + """ + if extra_args is None: + extra_args = [] + if not callable(function): + raise TypeError('The %s object is not callable' % function) + if not isinstance(extra_args, (tuple, list)): + raise TypeError('extra_args needs to be a sequence') + for element in extra_args: + if not isinstance(element, (tuple, list)) or len(element) !=2: + raise TypeError('extra_args elements are : (arg_name, value)') + + _ARCHIVE_FORMATS[name] = (function, extra_args, description) + +def unregister_archive_format(name): + del _ARCHIVE_FORMATS[name] + +def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, + dry_run=0, owner=None, group=None, logger=None): + """Create an archive file (eg. zip or tar). + + 'base_name' is the name of the file to create, minus any format-specific + extension; 'format' is the archive format: one of "zip", "tar", "gztar", + "bztar", or "xztar". Or any other registered format. + + 'root_dir' is a directory that will be the root directory of the + archive; ie. we typically chdir into 'root_dir' before creating the + archive. 'base_dir' is the directory where we start archiving from; + ie. 'base_dir' will be the common prefix of all files and + directories in the archive. 'root_dir' and 'base_dir' both default + to the current directory. Returns the name of the archive file. + + 'owner' and 'group' are used when creating a tar archive. By default, + uses the current owner and group. + """ + save_cwd = os.getcwd() + if root_dir is not None: + if logger is not None: + logger.debug("changing into '%s'", root_dir) + base_name = os.path.abspath(base_name) + if not dry_run: + os.chdir(root_dir) + + if base_dir is None: + base_dir = os.curdir + + kwargs = {'dry_run': dry_run, 'logger': logger} + + try: + format_info = _ARCHIVE_FORMATS[format] + except KeyError: + raise ValueError("unknown archive format '%s'" % format) from None + + func = format_info[0] + for arg, val in format_info[1]: + kwargs[arg] = val + + if format != 'zip': + kwargs['owner'] = owner + kwargs['group'] = group + + try: + filename = func(base_name, base_dir, **kwargs) + finally: + if root_dir is not None: + if logger is not None: + logger.debug("changing back to '%s'", save_cwd) + os.chdir(save_cwd) + + return filename + + +def get_unpack_formats(): + """Returns a list of supported formats for unpacking. + + Each element of the returned sequence is a tuple + (name, extensions, description) + """ + formats = [(name, info[0], info[3]) for name, info in + _UNPACK_FORMATS.items()] + formats.sort() + return formats + +def _check_unpack_options(extensions, function, extra_args): + """Checks what gets registered as an unpacker.""" + # first make sure no other unpacker is registered for this extension + existing_extensions = {} + for name, info in _UNPACK_FORMATS.items(): + for ext in info[0]: + existing_extensions[ext] = name + + for extension in extensions: + if extension in existing_extensions: + msg = '%s is already registered for "%s"' + raise RegistryError(msg % (extension, + existing_extensions[extension])) + + if not callable(function): + raise TypeError('The registered function must be a callable') + + +def register_unpack_format(name, extensions, function, extra_args=None, + description=''): + """Registers an unpack format. + + `name` is the name of the format. `extensions` is a list of extensions + corresponding to the format. + + `function` is the callable that will be + used to unpack archives. The callable will receive archives to unpack. + If it's unable to handle an archive, it needs to raise a ReadError + exception. + + If provided, `extra_args` is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_unpack_formats() function. + """ + if extra_args is None: + extra_args = [] + _check_unpack_options(extensions, function, extra_args) + _UNPACK_FORMATS[name] = extensions, function, extra_args, description + +def unregister_unpack_format(name): + """Removes the pack format from the registry.""" + del _UNPACK_FORMATS[name] + +def _ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + +def _unpack_zipfile(filename, extract_dir): + """Unpack zip `filename` to `extract_dir` + """ + import zipfile # late import for breaking circular dependency + + if not zipfile.is_zipfile(filename): + raise ReadError("%s is not a zip file" % filename) + + zip = zipfile.ZipFile(filename) + try: + for info in zip.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name: + continue + + target = os.path.join(extract_dir, *name.split('/')) + if not target: + continue + + _ensure_directory(target) + if not name.endswith('/'): + # file + data = zip.read(info.filename) + f = open(target, 'wb') + try: + f.write(data) + finally: + f.close() + del data + finally: + zip.close() + +def _unpack_tarfile(filename, extract_dir): + """Unpack tar/tar.gz/tar.bz2/tar.xz `filename` to `extract_dir` + """ + import tarfile # late import for breaking circular dependency + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise ReadError( + "%s is not a compressed or uncompressed tar file" % filename) + try: + tarobj.extractall(extract_dir) + finally: + tarobj.close() + +_UNPACK_FORMATS = { + 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), + 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file"), +} + +if _ZLIB_SUPPORTED: + _UNPACK_FORMATS['gztar'] = (['.tar.gz', '.tgz'], _unpack_tarfile, [], + "gzip'ed tar-file") + +if _BZ2_SUPPORTED: + _UNPACK_FORMATS['bztar'] = (['.tar.bz2', '.tbz2'], _unpack_tarfile, [], + "bzip2'ed tar-file") + +if _LZMA_SUPPORTED: + _UNPACK_FORMATS['xztar'] = (['.tar.xz', '.txz'], _unpack_tarfile, [], + "xz'ed tar-file") + +def _find_unpack_format(filename): + for name, info in _UNPACK_FORMATS.items(): + for extension in info[0]: + if filename.endswith(extension): + return name + return None + +def unpack_archive(filename, extract_dir=None, format=None): + """Unpack an archive. + + `filename` is the name of the archive. + + `extract_dir` is the name of the target directory, where the archive + is unpacked. If not provided, the current working directory is used. + + `format` is the archive format: one of "zip", "tar", "gztar", "bztar", + or "xztar". Or any other registered format. If not provided, + unpack_archive will use the filename extension and see if an unpacker + was registered for that extension. + + In case none is found, a ValueError is raised. + """ + if extract_dir is None: + extract_dir = os.getcwd() + + extract_dir = os.fspath(extract_dir) + filename = os.fspath(filename) + + if format is not None: + try: + format_info = _UNPACK_FORMATS[format] + except KeyError: + raise ValueError("Unknown unpack format '{0}'".format(format)) from None + + func = format_info[1] + func(filename, extract_dir, **dict(format_info[2])) + else: + # we need to look at the registered unpackers supported extensions + format = _find_unpack_format(filename) + if format is None: + raise ReadError("Unknown archive format '{0}'".format(filename)) + + func = _UNPACK_FORMATS[format][1] + kwargs = dict(_UNPACK_FORMATS[format][2]) + func(filename, extract_dir, **kwargs) + + +if hasattr(os, 'statvfs'): + + __all__.append('disk_usage') + _ntuple_diskusage = collections.namedtuple('usage', 'total used free') + _ntuple_diskusage.total.__doc__ = 'Total space in bytes' + _ntuple_diskusage.used.__doc__ = 'Used space in bytes' + _ntuple_diskusage.free.__doc__ = 'Free space in bytes' + + def disk_usage(path): + """Return disk usage statistics about the given path. + + Returned value is a named tuple with attributes 'total', 'used' and + 'free', which are the amount of total, used and free space, in bytes. + """ + st = os.statvfs(path) + free = st.f_bavail * st.f_frsize + total = st.f_blocks * st.f_frsize + used = (st.f_blocks - st.f_bfree) * st.f_frsize + return _ntuple_diskusage(total, used, free) + +elif os.name == 'nt': + + import nt + __all__.append('disk_usage') + _ntuple_diskusage = collections.namedtuple('usage', 'total used free') + + def disk_usage(path): + """Return disk usage statistics about the given path. + + Returned values is a named tuple with attributes 'total', 'used' and + 'free', which are the amount of total, used and free space, in bytes. + """ + total, free = nt._getdiskusage(path) + used = total - free + return _ntuple_diskusage(total, used, free) + + +def chown(path, user=None, group=None): + """Change owner user and group of the given path. + + user and group can be the uid/gid or the user/group names, and in that case, + they are converted to their respective uid/gid. + """ + + if user is None and group is None: + raise ValueError("user and/or group must be set") + + _user = user + _group = group + + # -1 means don't change it + if user is None: + _user = -1 + # user can either be an int (the uid) or a string (the system username) + elif isinstance(user, str): + _user = _get_uid(user) + if _user is None: + raise LookupError("no such user: {!r}".format(user)) + + if group is None: + _group = -1 + elif not isinstance(group, int): + _group = _get_gid(group) + if _group is None: + raise LookupError("no such group: {!r}".format(group)) + + os.chown(path, _user, _group) + +def get_terminal_size(fallback=(80, 24)): + """Get the size of the terminal window. + + For each of the two dimensions, the environment variable, COLUMNS + and LINES respectively, is checked. If the variable is defined and + the value is a positive integer, it is used. + + When COLUMNS or LINES is not defined, which is the common case, + the terminal connected to sys.__stdout__ is queried + by invoking os.get_terminal_size. + + If the terminal size cannot be successfully queried, either because + the system doesn't support querying, or because we are not + connected to a terminal, the value given in fallback parameter + is used. Fallback defaults to (80, 24) which is the default + size used by many terminal emulators. + + The value returned is a named tuple of type os.terminal_size. + """ + # columns, lines are the working values + try: + columns = int(os.environ['COLUMNS']) + except (KeyError, ValueError): + columns = 0 + + try: + lines = int(os.environ['LINES']) + except (KeyError, ValueError): + lines = 0 + + # only query if necessary + if columns <= 0 or lines <= 0: + try: + size = os.get_terminal_size(sys.__stdout__.fileno()) + except (AttributeError, ValueError, OSError): + # stdout is None, closed, detached, or not a terminal, or + # os.get_terminal_size() is unsupported + size = os.terminal_size(fallback) + if columns <= 0: + columns = size.columns + if lines <= 0: + lines = size.lines + + return os.terminal_size((columns, lines)) + +def which(cmd, mode=os.F_OK | os.X_OK, path=None): + """Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result + of os.environ.get("PATH"), or can be overridden with a custom search + path. + + """ + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return (os.path.exists(fn) and os.access(fn, mode) + and not os.path.isdir(fn)) + + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get("PATH", os.defpath) + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == "win32": + # The current directory takes precedence on Windows. + if not os.curdir in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given "python.exe". + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don't have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if not normdir in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None diff --git a/venv/Lib/site-packages/Click-7.0.dist-info/INSTALLER b/venv/Lib/site-packages/Click-7.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/Lib/site-packages/Click-7.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/Click-7.0.dist-info/LICENSE.txt b/venv/Lib/site-packages/Click-7.0.dist-info/LICENSE.txt new file mode 100644 index 00000000..87ce152a --- /dev/null +++ b/venv/Lib/site-packages/Click-7.0.dist-info/LICENSE.txt @@ -0,0 +1,39 @@ +Copyright © 2014 by the Pallets team. + +Some rights reserved. + +Redistribution and use in source and binary forms of the software as +well as documentation, with or without modification, are permitted +provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +- Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +---- + +Click uses parts of optparse written by Gregory P. Ward and maintained +by the Python Software Foundation. This is limited to code in parser.py. + +Copyright © 2001-2006 Gregory P. Ward. All rights reserved. +Copyright © 2002-2006 Python Software Foundation. All rights reserved. diff --git a/venv/Lib/site-packages/Click-7.0.dist-info/METADATA b/venv/Lib/site-packages/Click-7.0.dist-info/METADATA new file mode 100644 index 00000000..625bdadd --- /dev/null +++ b/venv/Lib/site-packages/Click-7.0.dist-info/METADATA @@ -0,0 +1,121 @@ +Metadata-Version: 2.1 +Name: Click +Version: 7.0 +Summary: Composable command line interface toolkit +Home-page: https://palletsprojects.com/p/click/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets Team +Maintainer-email: contact@palletsprojects.com +License: BSD +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/click +Project-URL: Issue tracker, https://github.com/pallets/click/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD 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.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* + +\$ click\_ +========== + +Click is a Python package for creating beautiful command line interfaces +in a composable way with as little code as necessary. It's the "Command +Line Interface Creation Kit". It's highly configurable but comes with +sensible defaults out of the box. + +It aims to make the process of writing command line tools quick and fun +while also preventing any frustration caused by the inability to +implement an intended CLI API. + +Click in three points: + +- Arbitrary nesting of commands +- Automatic help page generation +- Supports lazy loading of subcommands at runtime + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install click + +Click supports Python 3.4 and newer, Python 2.7, and PyPy. + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +A Simple Example +---------------- + +What does it look like? Here is an example of a simple Click program: + +.. code-block:: python + + import click + + @click.command() + @click.option("--count", default=1, help="Number of greetings.") + @click.option("--name", prompt="Your name", + help="The person to greet.") + def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for _ in range(count): + click.echo("Hello, %s!" % name) + + if __name__ == '__main__': + hello() + +And what it looks like when run: + +.. code-block:: text + + $ python hello.py --count=3 + Your name: Click + Hello, Click! + Hello, Click! + Hello, Click! + + +Donate +------ + +The Pallets organization develops and supports Click and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +* Website: https://palletsprojects.com/p/click/ +* Documentation: https://click.palletsprojects.com/ +* License: `BSD `_ +* Releases: https://pypi.org/project/click/ +* Code: https://github.com/pallets/click +* Issue tracker: https://github.com/pallets/click/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/click + * Windows: https://ci.appveyor.com/project/pallets/click + +* Test coverage: https://codecov.io/gh/pallets/click + + diff --git a/venv/Lib/site-packages/Click-7.0.dist-info/RECORD b/venv/Lib/site-packages/Click-7.0.dist-info/RECORD new file mode 100644 index 00000000..ecf17c15 --- /dev/null +++ b/venv/Lib/site-packages/Click-7.0.dist-info/RECORD @@ -0,0 +1,40 @@ +Click-7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Click-7.0.dist-info/LICENSE.txt,sha256=4hIxn676T0Wcisk3_chVcECjyrivKTZsoqSNI5AlIlw,1876 +Click-7.0.dist-info/METADATA,sha256=-r8jeke3Zer4diRvT1MjFZuiJ6yTT_qFP39svLqdaLI,3516 +Click-7.0.dist-info/RECORD,, +Click-7.0.dist-info/WHEEL,sha256=gduuPyBvFJQSQ0zdyxF7k0zynDXbIbvg5ZBHoXum5uk,110 +Click-7.0.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__init__.py,sha256=HjGThQ7tef9kkwCV371TBnrf0SAi6fKfU_jtEnbYTvQ,2789 +click/__pycache__/__init__.cpython-37.pyc,, +click/__pycache__/_bashcomplete.cpython-37.pyc,, +click/__pycache__/_compat.cpython-37.pyc,, +click/__pycache__/_termui_impl.cpython-37.pyc,, +click/__pycache__/_textwrap.cpython-37.pyc,, +click/__pycache__/_unicodefun.cpython-37.pyc,, +click/__pycache__/_winconsole.cpython-37.pyc,, +click/__pycache__/core.cpython-37.pyc,, +click/__pycache__/decorators.cpython-37.pyc,, +click/__pycache__/exceptions.cpython-37.pyc,, +click/__pycache__/formatting.cpython-37.pyc,, +click/__pycache__/globals.cpython-37.pyc,, +click/__pycache__/parser.cpython-37.pyc,, +click/__pycache__/termui.cpython-37.pyc,, +click/__pycache__/testing.cpython-37.pyc,, +click/__pycache__/types.cpython-37.pyc,, +click/__pycache__/utils.cpython-37.pyc,, +click/_bashcomplete.py,sha256=iaNUmtxag0YPfxba3TDYCNietiTMQIrvhRLj-H8okFU,11014 +click/_compat.py,sha256=vYmvoj4opPxo-c-2GMQQjYT_r_QkOKybkfGoeVrt0dA,23399 +click/_termui_impl.py,sha256=xHmLtOJhKUCVD6168yucJ9fknUJPAMs0eUTPgVUO-GQ,19611 +click/_textwrap.py,sha256=gwS4m7bdQiJnzaDG8osFcRb-5vn4t4l2qSCy-5csCEc,1198 +click/_unicodefun.py,sha256=QHy2_5jYlX-36O-JVrTHNnHOqg8tquUR0HmQFev7Ics,4364 +click/_winconsole.py,sha256=PPWVak8Iikm_gAPsxMrzwsVFCvHgaW3jPaDWZ1JBl3U,8965 +click/core.py,sha256=q8FLcDZsagBGSRe5Y9Hi_FGvAeZvusNfoO5EkhkSQ8Y,75305 +click/decorators.py,sha256=idKt6duLUUfAFftrHoREi8MJSd39XW36pUVHthdglwk,11226 +click/exceptions.py,sha256=CNpAjBAE7qjaV4WChxQeak95e5yUOau8AsvT-8m6wss,7663 +click/formatting.py,sha256=eh-cypTUAhpI3HD-K4ZpR3vCiURIO62xXvKkR3tNUTM,8889 +click/globals.py,sha256=oQkou3ZQ5DgrbVM6BwIBirwiqozbjfirzsLGAlLRRdg,1514 +click/parser.py,sha256=m-nGZz4VwprM42_qtFlWFGo7yRJQxkBlRcZodoH593Y,15510 +click/termui.py,sha256=o_ZXB2jyvL2Rce7P_bFGq452iyBq9ykJyRApIPMCZO0,23207 +click/testing.py,sha256=aYGqY_iWLu2p4k7lkuJ6t3fqpf6aPGqTsyLzNY_ngKg,13062 +click/types.py,sha256=2Q929p-aBP_ZYuMFJqJR-Ipucofv3fmDc5JzBDPmzJU,23287 +click/utils.py,sha256=6-D0WkAxvv9FkgHXSHwDIv0l9Gdx9Mm6Z5vuKNLIfZI,15763 diff --git a/venv/Lib/site-packages/Click-7.0.dist-info/WHEEL b/venv/Lib/site-packages/Click-7.0.dist-info/WHEEL new file mode 100644 index 00000000..1316c41d --- /dev/null +++ b/venv/Lib/site-packages/Click-7.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/Click-7.0.dist-info/top_level.txt b/venv/Lib/site-packages/Click-7.0.dist-info/top_level.txt new file mode 100644 index 00000000..dca9a909 --- /dev/null +++ b/venv/Lib/site-packages/Click-7.0.dist-info/top_level.txt @@ -0,0 +1 @@ +click diff --git a/venv/Lib/site-packages/Flask-1.0.2.dist-info/INSTALLER b/venv/Lib/site-packages/Flask-1.0.2.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/Lib/site-packages/Flask-1.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/Flask-1.0.2.dist-info/LICENSE.txt b/venv/Lib/site-packages/Flask-1.0.2.dist-info/LICENSE.txt new file mode 100644 index 00000000..8f9252f4 --- /dev/null +++ b/venv/Lib/site-packages/Flask-1.0.2.dist-info/LICENSE.txt @@ -0,0 +1,31 @@ +Copyright © 2010 by the Pallets team. + +Some rights reserved. + +Redistribution and use in source and binary forms of the software as +well as documentation, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/venv/Lib/site-packages/Flask-1.0.2.dist-info/METADATA b/venv/Lib/site-packages/Flask-1.0.2.dist-info/METADATA new file mode 100644 index 00000000..c600e730 --- /dev/null +++ b/venv/Lib/site-packages/Flask-1.0.2.dist-info/METADATA @@ -0,0 +1,130 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 1.0.2 +Summary: A simple framework for building complex web applications. +Home-page: https://www.palletsprojects.com/p/flask/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets team +Maintainer-email: contact@palletsprojects.com +License: BSD +Project-URL: Documentation, http://flask.pocoo.org/docs/ +Project-URL: Code, https://github.com/pallets/flask +Project-URL: Issue tracker, https://github.com/pallets/flask/issues +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD 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.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Provides-Extra: dev +Provides-Extra: docs +Provides-Extra: dotenv +Requires-Dist: Werkzeug (>=0.14) +Requires-Dist: Jinja2 (>=2.10) +Requires-Dist: itsdangerous (>=0.24) +Requires-Dist: click (>=5.1) +Provides-Extra: dev +Requires-Dist: pytest (>=3); extra == 'dev' +Requires-Dist: coverage; extra == 'dev' +Requires-Dist: tox; extra == 'dev' +Requires-Dist: sphinx; extra == 'dev' +Requires-Dist: pallets-sphinx-themes; extra == 'dev' +Requires-Dist: sphinxcontrib-log-cabinet; extra == 'dev' +Provides-Extra: docs +Requires-Dist: sphinx; extra == 'docs' +Requires-Dist: pallets-sphinx-themes; extra == 'docs' +Requires-Dist: sphinxcontrib-log-cabinet; extra == 'docs' +Provides-Extra: dotenv +Requires-Dist: python-dotenv; extra == 'dotenv' + +Flask +===== + +Flask is a lightweight `WSGI`_ web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around `Werkzeug`_ +and `Jinja`_ and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Flask + + +A Simple Example +---------------- + +.. code-block:: python + + from flask import Flask + + app = Flask(__name__) + + @app.route('/') + def hello(): + return 'Hello, World!' + +.. code-block:: text + + $ FLASK_APP=hello.py flask run + * Serving Flask app "hello" + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + + +Donate +------ + +The Pallets organization develops and supports Flask and the libraries +it uses. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://psfmember.org/civicrm/contribute/transact?reset=1&id=20 + + +Links +----- + +* Website: https://www.palletsprojects.com/p/flask/ +* Documentation: http://flask.pocoo.org/docs/ +* License: `BSD `_ +* Releases: https://pypi.org/project/Flask/ +* Code: https://github.com/pallets/flask +* Issue tracker: https://github.com/pallets/flask/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/flask + * Windows: https://ci.appveyor.com/project/pallets/flask + +* Test coverage: https://codecov.io/gh/pallets/flask + +.. _WSGI: https://wsgi.readthedocs.io +.. _Werkzeug: https://www.palletsprojects.com/p/werkzeug/ +.. _Jinja: https://www.palletsprojects.com/p/jinja/ +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + diff --git a/venv/Lib/site-packages/Flask-1.0.2.dist-info/RECORD b/venv/Lib/site-packages/Flask-1.0.2.dist-info/RECORD new file mode 100644 index 00000000..41e514a9 --- /dev/null +++ b/venv/Lib/site-packages/Flask-1.0.2.dist-info/RECORD @@ -0,0 +1,48 @@ +../../Scripts/flask.exe,sha256=tqH8wxuXaPTRmkrEnuDgyhFRY6j5C-jTXCi6XtUvzHw,93038 +Flask-1.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask-1.0.2.dist-info/LICENSE.txt,sha256=ziEXA3AIuaiUn1qe4cd1XxCESWTYrk4TjN7Qb06J3l8,1575 +Flask-1.0.2.dist-info/METADATA,sha256=iA5tiNWzTtgCVe80aTZGNWsckj853fJyfvHs9U-WZRk,4182 +Flask-1.0.2.dist-info/RECORD,, +Flask-1.0.2.dist-info/WHEEL,sha256=J3CsTk7Mf2JNUyhImI-mjX-fmI4oDjyiXgWT4qgZiCE,110 +Flask-1.0.2.dist-info/entry_points.txt,sha256=gBLA1aKg0OYR8AhbAfg8lnburHtKcgJLDU52BBctN0k,42 +Flask-1.0.2.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 +flask/__init__.py,sha256=qq8lK6QQbxJALf1igz7qsvUwOTAoKvFGfdLm7jPNsso,1673 +flask/__main__.py,sha256=pgIXrHhxM5MAMvgzAqWpw_t6AXZ1zG38us4JRgJKtxk,291 +flask/__pycache__/__init__.cpython-37.pyc,, +flask/__pycache__/__main__.cpython-37.pyc,, +flask/__pycache__/_compat.cpython-37.pyc,, +flask/__pycache__/app.cpython-37.pyc,, +flask/__pycache__/blueprints.cpython-37.pyc,, +flask/__pycache__/cli.cpython-37.pyc,, +flask/__pycache__/config.cpython-37.pyc,, +flask/__pycache__/ctx.cpython-37.pyc,, +flask/__pycache__/debughelpers.cpython-37.pyc,, +flask/__pycache__/globals.cpython-37.pyc,, +flask/__pycache__/helpers.cpython-37.pyc,, +flask/__pycache__/logging.cpython-37.pyc,, +flask/__pycache__/sessions.cpython-37.pyc,, +flask/__pycache__/signals.cpython-37.pyc,, +flask/__pycache__/templating.cpython-37.pyc,, +flask/__pycache__/testing.cpython-37.pyc,, +flask/__pycache__/views.cpython-37.pyc,, +flask/__pycache__/wrappers.cpython-37.pyc,, +flask/_compat.py,sha256=UDFGhosh6mOdNB-4evKPuneHum1OpcAlwTNJCRm0irQ,2892 +flask/app.py,sha256=ahpe3T8w98rQd_Er5d7uDxK57S1nnqGQx3V3hirBovU,94147 +flask/blueprints.py,sha256=Cyhl_x99tgwqEZPtNDJUFneAfVJxWfEU4bQA7zWS6VU,18331 +flask/cli.py,sha256=30QYAO10Do9LbZYCLgfI_xhKjASdLopL8wKKVUGS2oA,29442 +flask/config.py,sha256=kznUhj4DLYxsTF_4kfDG8GEHto1oZG_kqblyrLFtpqQ,9951 +flask/ctx.py,sha256=leFzS9fzmo0uaLCdxpHc5_iiJZ1H0X_Ig4yPCOvT--g,16224 +flask/debughelpers.py,sha256=1ceC-UyqZTd4KsJkf0OObHPsVt5R3T6vnmYhiWBjV-w,6479 +flask/globals.py,sha256=pGg72QW_-4xUfsI33I5L_y76c21AeqfSqXDcbd8wvXU,1649 +flask/helpers.py,sha256=YCl8D1plTO1evEYP4KIgaY3H8Izww5j4EdgRJ89oHTw,40106 +flask/json/__init__.py,sha256=Ns1Hj805XIxuBMh2z0dYnMVfb_KUgLzDmP3WoUYaPhw,10729 +flask/json/__pycache__/__init__.cpython-37.pyc,, +flask/json/__pycache__/tag.cpython-37.pyc,, +flask/json/tag.py,sha256=9ehzrmt5k7hxf7ZEK0NOs3swvQyU9fWNe-pnYe69N60,8223 +flask/logging.py,sha256=qV9h0vt7NIRkKM9OHDWndzO61E5CeBMlqPJyTt-W2Wc,2231 +flask/sessions.py,sha256=2XHV4ASREhSEZ8bsPQW6pNVNuFtbR-04BzfKg0AfvHo,14452 +flask/signals.py,sha256=BGQbVyCYXnzKK2DVCzppKFyWN1qmrtW1QMAYUs-1Nr8,2211 +flask/templating.py,sha256=FDfWMbpgpC3qObW8GGXRAVrkHFF8K4CHOJymB1wvULI,4914 +flask/testing.py,sha256=XD3gWNvLUV8dqVHwKd9tZzsj81fSHtjOphQ1wTNtlMs,9379 +flask/views.py,sha256=Wy-_WkUVtCfE2zCXYeJehNgHuEtviE4v3HYfJ--MpbY,5733 +flask/wrappers.py,sha256=1Z9hF5-hXQajn_58XITQFRY8efv3Vy3uZ0avBfZu6XI,7511 diff --git a/venv/Lib/site-packages/Flask-1.0.2.dist-info/WHEEL b/venv/Lib/site-packages/Flask-1.0.2.dist-info/WHEEL new file mode 100644 index 00000000..f21b51cd --- /dev/null +++ b/venv/Lib/site-packages/Flask-1.0.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/Flask-1.0.2.dist-info/entry_points.txt b/venv/Lib/site-packages/Flask-1.0.2.dist-info/entry_points.txt new file mode 100644 index 00000000..1eb02520 --- /dev/null +++ b/venv/Lib/site-packages/Flask-1.0.2.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +flask = flask.cli:main + diff --git a/venv/Lib/site-packages/Flask-1.0.2.dist-info/top_level.txt b/venv/Lib/site-packages/Flask-1.0.2.dist-info/top_level.txt new file mode 100644 index 00000000..7e106024 --- /dev/null +++ b/venv/Lib/site-packages/Flask-1.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +flask diff --git a/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/DESCRIPTION.rst b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/DESCRIPTION.rst new file mode 100644 index 00000000..e1187231 --- /dev/null +++ b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/DESCRIPTION.rst @@ -0,0 +1,3 @@ +UNKNOWN + + diff --git a/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/INSTALLER b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/METADATA b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/METADATA new file mode 100644 index 00000000..529c46e1 --- /dev/null +++ b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/METADATA @@ -0,0 +1,31 @@ +Metadata-Version: 2.0 +Name: Flask-RESTful +Version: 0.3.6 +Summary: Simple framework for creating REST APIs +Home-page: https://www.github.com/flask-restful/flask-restful/ +Author: Twilio API Team +Author-email: help@twilio.com +License: BSD +Platform: any +Classifier: Framework :: Flask +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: License :: OSI Approved :: BSD License +Requires-Dist: Flask (>=0.8) +Requires-Dist: aniso8601 (>=0.82) +Requires-Dist: pytz +Requires-Dist: six (>=1.3.0) +Provides-Extra: docs +Requires-Dist: sphinx; extra == 'docs' +Provides-Extra: paging +Requires-Dist: pycrypto (>=2.6); extra == 'paging' + +UNKNOWN + + diff --git a/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/RECORD b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/RECORD new file mode 100644 index 00000000..b698a54a --- /dev/null +++ b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/RECORD @@ -0,0 +1,29 @@ +Flask_RESTful-0.3.6.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 +Flask_RESTful-0.3.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_RESTful-0.3.6.dist-info/METADATA,sha256=THyvrIu4SUuC9fqpfDBP-m6kdZcesFu2-Gm2oxgJnWM,985 +Flask_RESTful-0.3.6.dist-info/RECORD,, +Flask_RESTful-0.3.6.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +Flask_RESTful-0.3.6.dist-info/metadata.json,sha256=1zKAyvYdpplkpX_NJU8vKCZ9nvy0Y_paxRiMJXCNiXU,1178 +Flask_RESTful-0.3.6.dist-info/top_level.txt,sha256=lNpWPlejgBAtMhCUwz_FTyJH12ul1mBZ-Uv3ZK1HiGg,14 +flask_restful/__init__.py,sha256=dpZuahv5GMo2Rof4OWkGpQvIhnJIeOakL_1EHkkzUA4,28510 +flask_restful/__pycache__/__init__.cpython-37.pyc,, +flask_restful/__pycache__/__version__.cpython-37.pyc,, +flask_restful/__pycache__/fields.cpython-37.pyc,, +flask_restful/__pycache__/inputs.cpython-37.pyc,, +flask_restful/__pycache__/paging.cpython-37.pyc,, +flask_restful/__pycache__/reqparse.cpython-37.pyc,, +flask_restful/__version__.py,sha256=-RHjzBqfdsudCsVzQ9u-AoX7n-_90gcO1RlvPEVk7d4,45 +flask_restful/fields.py,sha256=9cbc0vXaGzt1Ur8gUf3sHlMjNSy1qOSV_qvi-3YQAL8,13051 +flask_restful/inputs.py,sha256=AOBF_1BpB8snY3XJT_vca_uWYzkCP2nla01lFU7xqLE,9114 +flask_restful/paging.py,sha256=H_nL-UlViLSHJhS7NbHJurHMwzxv7IsaAnuTC4L5Kec,1207 +flask_restful/representations/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +flask_restful/representations/__pycache__/__init__.cpython-37.pyc,, +flask_restful/representations/__pycache__/json.cpython-37.pyc,, +flask_restful/representations/json.py,sha256=swKwnbt7v2ioHfHkqhqbzIu_yrcP0ComlSl49IGFJOo,873 +flask_restful/reqparse.py,sha256=I9qxtSqjVzrDTxQtfSHM4yGx3XsiVoa-wMPlA1mod9s,13475 +flask_restful/utils/__init__.py,sha256=Qh5pyCIT2dfHmrUdS6lsMbBLjZmAhz1fl7vWyJ_n4XQ,719 +flask_restful/utils/__pycache__/__init__.cpython-37.pyc,, +flask_restful/utils/__pycache__/cors.cpython-37.pyc,, +flask_restful/utils/__pycache__/crypto.cpython-37.pyc,, +flask_restful/utils/cors.py,sha256=cZiqaHhIn0w66spRoSIdC-jIn4X_b6OlVms5eGF4Ess,2084 +flask_restful/utils/crypto.py,sha256=q3PBvAYMJYybbqqQlKNF_Pqeyo9h3x5jFJuVqtEA5bA,996 diff --git a/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/WHEEL b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/WHEEL new file mode 100644 index 00000000..8b6dd1b5 --- /dev/null +++ b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/metadata.json b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/metadata.json new file mode 100644 index 00000000..fd1720a5 --- /dev/null +++ b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Framework :: Flask", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "License :: OSI Approved :: BSD License"], "extensions": {"python.details": {"contacts": [{"email": "help@twilio.com", "name": "Twilio API Team", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://www.github.com/flask-restful/flask-restful/"}}}, "extras": ["docs", "paging"], "generator": "bdist_wheel (0.29.0)", "license": "BSD", "metadata_version": "2.0", "name": "Flask-RESTful", "platform": "any", "run_requires": [{"requires": ["Flask (>=0.8)", "aniso8601 (>=0.82)", "pytz", "six (>=1.3.0)"]}, {"extra": "paging", "requires": ["pycrypto (>=2.6)"]}, {"extra": "docs", "requires": ["sphinx"]}], "summary": "Simple framework for creating REST APIs", "test_requires": [{"requires": ["Flask-RESTful[paging]", "blinker", "mock (>=0.8)"]}], "version": "0.3.6"} \ No newline at end of file diff --git a/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/top_level.txt b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/top_level.txt new file mode 100644 index 00000000..f7b85270 --- /dev/null +++ b/venv/Lib/site-packages/Flask_RESTful-0.3.6.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_restful diff --git a/venv/Lib/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst b/venv/Lib/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst new file mode 100644 index 00000000..1594da5c --- /dev/null +++ b/venv/Lib/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst @@ -0,0 +1,37 @@ + +Jinja2 +~~~~~~ + +Jinja2 is a template engine written in pure Python. It provides a +`Django`_ inspired non-XML syntax but supports inline expressions and +an optional `sandboxed`_ environment. + +Nutshell +-------- + +Here a small example of a Jinja template:: + + {% extends 'base.html' %} + {% block title %}Memberlist{% endblock %} + {% block content %} +

+ {% endblock %} + +Philosophy +---------- + +Application logic is for the controller but don't try to make the life +for the template designer too hard by giving him too few functionality. + +For more informations visit the new `Jinja2 webpage`_ and `documentation`_. + +.. _sandboxed: https://en.wikipedia.org/wiki/Sandbox_(computer_security) +.. _Django: https://www.djangoproject.com/ +.. _Jinja2 webpage: http://jinja.pocoo.org/ +.. _documentation: http://jinja.pocoo.org/2/documentation/ + + diff --git a/venv/Lib/site-packages/Jinja2-2.10.dist-info/INSTALLER b/venv/Lib/site-packages/Jinja2-2.10.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/Lib/site-packages/Jinja2-2.10.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/Jinja2-2.10.dist-info/LICENSE.txt b/venv/Lib/site-packages/Jinja2-2.10.dist-info/LICENSE.txt new file mode 100644 index 00000000..31bf900e --- /dev/null +++ b/venv/Lib/site-packages/Jinja2-2.10.dist-info/LICENSE.txt @@ -0,0 +1,31 @@ +Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/Lib/site-packages/Jinja2-2.10.dist-info/METADATA b/venv/Lib/site-packages/Jinja2-2.10.dist-info/METADATA new file mode 100644 index 00000000..40f2b46b --- /dev/null +++ b/venv/Lib/site-packages/Jinja2-2.10.dist-info/METADATA @@ -0,0 +1,68 @@ +Metadata-Version: 2.0 +Name: Jinja2 +Version: 2.10 +Summary: A small but fast and easy to use stand-alone template engine written in pure python. +Home-page: http://jinja.pocoo.org/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: BSD +Description-Content-Type: UNKNOWN +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Dist: MarkupSafe (>=0.23) +Provides-Extra: i18n +Requires-Dist: Babel (>=0.8); extra == 'i18n' + + +Jinja2 +~~~~~~ + +Jinja2 is a template engine written in pure Python. It provides a +`Django`_ inspired non-XML syntax but supports inline expressions and +an optional `sandboxed`_ environment. + +Nutshell +-------- + +Here a small example of a Jinja template:: + + {% extends 'base.html' %} + {% block title %}Memberlist{% endblock %} + {% block content %} + + {% endblock %} + +Philosophy +---------- + +Application logic is for the controller but don't try to make the life +for the template designer too hard by giving him too few functionality. + +For more informations visit the new `Jinja2 webpage`_ and `documentation`_. + +.. _sandboxed: https://en.wikipedia.org/wiki/Sandbox_(computer_security) +.. _Django: https://www.djangoproject.com/ +.. _Jinja2 webpage: http://jinja.pocoo.org/ +.. _documentation: http://jinja.pocoo.org/2/documentation/ + + diff --git a/venv/Lib/site-packages/Jinja2-2.10.dist-info/RECORD b/venv/Lib/site-packages/Jinja2-2.10.dist-info/RECORD new file mode 100644 index 00000000..50b16fa5 --- /dev/null +++ b/venv/Lib/site-packages/Jinja2-2.10.dist-info/RECORD @@ -0,0 +1,63 @@ +Jinja2-2.10.dist-info/DESCRIPTION.rst,sha256=b5ckFDoM7vVtz_mAsJD4OPteFKCqE7beu353g4COoYI,978 +Jinja2-2.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-2.10.dist-info/LICENSE.txt,sha256=JvzUNv3Io51EiWrAPm8d_SXjhJnEjyDYvB3Tvwqqils,1554 +Jinja2-2.10.dist-info/METADATA,sha256=18EgU8zR6-av-0-5y_gXebzK4GnBB_76lALUsl-6QHM,2258 +Jinja2-2.10.dist-info/RECORD,, +Jinja2-2.10.dist-info/WHEEL,sha256=kdsN-5OJAZIiHN-iO4Rhl82KyS0bDWf4uBwMbkNafr8,110 +Jinja2-2.10.dist-info/entry_points.txt,sha256=NdzVcOrqyNyKDxD09aERj__3bFx2paZhizFDsKmVhiA,72 +Jinja2-2.10.dist-info/metadata.json,sha256=NPUJ9TMBxVQAv_kTJzvU8HwmP-4XZvbK9mz6_4YUVl4,1473 +Jinja2-2.10.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=xJHjaMoy51_KXn1wf0cysH6tUUifUxZCwSOfcJGEYZw,2614 +jinja2/__pycache__/__init__.cpython-37.pyc,, +jinja2/__pycache__/_compat.cpython-37.pyc,, +jinja2/__pycache__/_identifier.cpython-37.pyc,, +jinja2/__pycache__/asyncfilters.cpython-37.pyc,, +jinja2/__pycache__/asyncsupport.cpython-37.pyc,, +jinja2/__pycache__/bccache.cpython-37.pyc,, +jinja2/__pycache__/compiler.cpython-37.pyc,, +jinja2/__pycache__/constants.cpython-37.pyc,, +jinja2/__pycache__/debug.cpython-37.pyc,, +jinja2/__pycache__/defaults.cpython-37.pyc,, +jinja2/__pycache__/environment.cpython-37.pyc,, +jinja2/__pycache__/exceptions.cpython-37.pyc,, +jinja2/__pycache__/ext.cpython-37.pyc,, +jinja2/__pycache__/filters.cpython-37.pyc,, +jinja2/__pycache__/idtracking.cpython-37.pyc,, +jinja2/__pycache__/lexer.cpython-37.pyc,, +jinja2/__pycache__/loaders.cpython-37.pyc,, +jinja2/__pycache__/meta.cpython-37.pyc,, +jinja2/__pycache__/nativetypes.cpython-37.pyc,, +jinja2/__pycache__/nodes.cpython-37.pyc,, +jinja2/__pycache__/optimizer.cpython-37.pyc,, +jinja2/__pycache__/parser.cpython-37.pyc,, +jinja2/__pycache__/runtime.cpython-37.pyc,, +jinja2/__pycache__/sandbox.cpython-37.pyc,, +jinja2/__pycache__/tests.cpython-37.pyc,, +jinja2/__pycache__/utils.cpython-37.pyc,, +jinja2/__pycache__/visitor.cpython-37.pyc,, +jinja2/_compat.py,sha256=xP60CE5Qr8FTYcDE1f54tbZLKGvMwYml4-8T7Q4KG9k,2596 +jinja2/_identifier.py,sha256=W1QBSY-iJsyt6oR_nKSuNNCzV95vLIOYgUNPUI1d5gU,1726 +jinja2/asyncfilters.py,sha256=cTDPvrS8Hp_IkwsZ1m9af_lr5nHysw7uTa5gV0NmZVE,4144 +jinja2/asyncsupport.py,sha256=UErQ3YlTLaSjFb94P4MVn08-aVD9jJxty2JVfMRb-1M,7878 +jinja2/bccache.py,sha256=nQldx0ZRYANMyfvOihRoYFKSlUdd5vJkS7BjxNwlOZM,12794 +jinja2/compiler.py,sha256=BqC5U6JxObSRhblyT_a6Tp5GtEU5z3US1a4jLQaxxgo,65386 +jinja2/constants.py,sha256=uwwV8ZUhHhacAuz5PTwckfsbqBaqM7aKfyJL7kGX5YQ,1626 +jinja2/debug.py,sha256=WTVeUFGUa4v6ReCsYv-iVPa3pkNB75OinJt3PfxNdXs,12045 +jinja2/defaults.py,sha256=Em-95hmsJxIenDCZFB1YSvf9CNhe9rBmytN3yUrBcWA,1400 +jinja2/environment.py,sha256=VnkAkqw8JbjZct4tAyHlpBrka2vqB-Z58RAP-32P1ZY,50849 +jinja2/exceptions.py,sha256=_Rj-NVi98Q6AiEjYQOsP8dEIdu5AlmRHzcSNOPdWix4,4428 +jinja2/ext.py,sha256=atMQydEC86tN1zUsdQiHw5L5cF62nDbqGue25Yiu3N4,24500 +jinja2/filters.py,sha256=yOAJk0MsH-_gEC0i0U6NweVQhbtYaC-uE8xswHFLF4w,36528 +jinja2/idtracking.py,sha256=2GbDSzIvGArEBGLkovLkqEfmYxmWsEf8c3QZwM4uNsw,9197 +jinja2/lexer.py,sha256=ySEPoXd1g7wRjsuw23uimS6nkGN5aqrYwcOKxCaVMBQ,28559 +jinja2/loaders.py,sha256=xiTuURKAEObyym0nU8PCIXu_Qp8fn0AJ5oIADUUm-5Q,17382 +jinja2/meta.py,sha256=fmKHxkmZYAOm9QyWWy8EMd6eefAIh234rkBMW2X4ZR8,4340 +jinja2/nativetypes.py,sha256=_sJhS8f-8Q0QMIC0dm1YEdLyxEyoO-kch8qOL5xUDfE,7308 +jinja2/nodes.py,sha256=L10L_nQDfubLhO3XjpF9qz46FSh2clL-3e49ogVlMmA,30853 +jinja2/optimizer.py,sha256=MsdlFACJ0FRdPtjmCAdt7JQ9SGrXFaDNUaslsWQaG3M,1722 +jinja2/parser.py,sha256=lPzTEbcpTRBLw8ii6OYyExHeAhaZLMA05Hpv4ll3ULk,35875 +jinja2/runtime.py,sha256=DHdD38Pq8gj7uWQC5usJyWFoNWL317A9AvXOW_CLB34,27755 +jinja2/sandbox.py,sha256=TVyZHlNqqTzsv9fv2NvJNmSdWRHTguhyMHdxjWms32U,16708 +jinja2/tests.py,sha256=iJQLwbapZr-EKquTG_fVOVdwHUUKf3SX9eNkjQDF8oU,4237 +jinja2/utils.py,sha256=q24VupGZotQ-uOyrJxCaXtDWhZC1RgsQG7kcdmjck2Q,20629 +jinja2/visitor.py,sha256=JD1H1cANA29JcntFfN5fPyqQxB4bI4wC00BzZa-XHks,3316 diff --git a/venv/Lib/site-packages/Jinja2-2.10.dist-info/WHEEL b/venv/Lib/site-packages/Jinja2-2.10.dist-info/WHEEL new file mode 100644 index 00000000..7332a419 --- /dev/null +++ b/venv/Lib/site-packages/Jinja2-2.10.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/Jinja2-2.10.dist-info/entry_points.txt b/venv/Lib/site-packages/Jinja2-2.10.dist-info/entry_points.txt new file mode 100644 index 00000000..32e6b753 --- /dev/null +++ b/venv/Lib/site-packages/Jinja2-2.10.dist-info/entry_points.txt @@ -0,0 +1,4 @@ + + [babel.extractors] + jinja2 = jinja2.ext:babel_extract[i18n] + \ No newline at end of file diff --git a/venv/Lib/site-packages/Jinja2-2.10.dist-info/metadata.json b/venv/Lib/site-packages/Jinja2-2.10.dist-info/metadata.json new file mode 100644 index 00000000..7f5dc387 --- /dev/null +++ b/venv/Lib/site-packages/Jinja2-2.10.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup :: HTML"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://jinja.pocoo.org/"}}, "python.exports": {"babel.extractors": {"jinja2": "jinja2.ext:babel_extract [i18n]"}}}, "extras": ["i18n"], "generator": "bdist_wheel (0.30.0)", "license": "BSD", "metadata_version": "2.0", "name": "Jinja2", "run_requires": [{"extra": "i18n", "requires": ["Babel (>=0.8)"]}, {"requires": ["MarkupSafe (>=0.23)"]}], "summary": "A small but fast and easy to use stand-alone template engine written in pure python.", "version": "2.10"} \ No newline at end of file diff --git a/venv/Lib/site-packages/Jinja2-2.10.dist-info/top_level.txt b/venv/Lib/site-packages/Jinja2-2.10.dist-info/top_level.txt new file mode 100644 index 00000000..7f7afbf3 --- /dev/null +++ b/venv/Lib/site-packages/Jinja2-2.10.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/PKG-INFO b/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/PKG-INFO new file mode 100644 index 00000000..6f2568f6 --- /dev/null +++ b/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/PKG-INFO @@ -0,0 +1,133 @@ +Metadata-Version: 1.1 +Name: MarkupSafe +Version: 1.0 +Summary: Implements a XML/HTML/XHTML Markup safe string for Python +Home-page: http://github.com/pallets/markupsafe +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: BSD +Description: MarkupSafe + ========== + + Implements a unicode subclass that supports HTML strings: + + .. code-block:: python + + >>> from markupsafe import Markup, escape + >>> escape("") + Markup(u'<script>alert(document.cookie);</script>') + >>> tmpl = Markup("%s") + >>> tmpl % "Peter > Lustig" + Markup(u'Peter > Lustig') + + If you want to make an object unicode that is not yet unicode + but don't want to lose the taint information, you can use the + ``soft_unicode`` function. (On Python 3 you can also use ``soft_str`` which + is a different name for the same function). + + .. code-block:: python + + >>> from markupsafe import soft_unicode + >>> soft_unicode(42) + u'42' + >>> soft_unicode(Markup('foo')) + Markup(u'foo') + + HTML Representations + -------------------- + + Objects can customize their HTML markup equivalent by overriding + the ``__html__`` function: + + .. code-block:: python + + >>> class Foo(object): + ... def __html__(self): + ... return 'Nice' + ... + >>> escape(Foo()) + Markup(u'Nice') + >>> Markup(Foo()) + Markup(u'Nice') + + Silent Escapes + -------------- + + Since MarkupSafe 0.10 there is now also a separate escape function + called ``escape_silent`` that returns an empty string for ``None`` for + consistency with other systems that return empty strings for ``None`` + when escaping (for instance Pylons' webhelpers). + + If you also want to use this for the escape method of the Markup + object, you can create your own subclass that does that: + + .. code-block:: python + + from markupsafe import Markup, escape_silent as escape + + class SilentMarkup(Markup): + __slots__ = () + + @classmethod + def escape(cls, s): + return cls(escape(s)) + + New-Style String Formatting + --------------------------- + + Starting with MarkupSafe 0.21 new style string formats from Python 2.6 and + 3.x are now fully supported. Previously the escape behavior of those + functions was spotty at best. The new implementations operates under the + following algorithm: + + 1. if an object has an ``__html_format__`` method it is called as + replacement for ``__format__`` with the format specifier. It either + has to return a string or markup object. + 2. if an object has an ``__html__`` method it is called. + 3. otherwise the default format system of Python kicks in and the result + is HTML escaped. + + Here is how you can implement your own formatting: + + .. code-block:: python + + class User(object): + + def __init__(self, id, username): + self.id = id + self.username = username + + def __html_format__(self, format_spec): + if format_spec == 'link': + return Markup('{1}').format( + self.id, + self.__html__(), + ) + elif format_spec: + raise ValueError('Invalid format spec') + return self.__html__() + + def __html__(self): + return Markup('{0}').format(self.username) + + And to format that user: + + .. code-block:: python + + >>> user = User(1, 'foo') + >>> Markup('

User: {0:link}').format(user) + Markup(u'

User: foo') + + Markupsafe supports Python 2.6, 2.7 and Python 3.3 and higher. + +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML diff --git a/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/SOURCES.txt b/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/SOURCES.txt new file mode 100644 index 00000000..210b339c --- /dev/null +++ b/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/SOURCES.txt @@ -0,0 +1,18 @@ +AUTHORS +CHANGES +LICENSE +MANIFEST.in +README.rst +setup.cfg +setup.py +tests.py +MarkupSafe.egg-info/PKG-INFO +MarkupSafe.egg-info/SOURCES.txt +MarkupSafe.egg-info/dependency_links.txt +MarkupSafe.egg-info/not-zip-safe +MarkupSafe.egg-info/top_level.txt +markupsafe/__init__.py +markupsafe/_compat.py +markupsafe/_constants.py +markupsafe/_native.py +markupsafe/_speedups.c \ No newline at end of file diff --git a/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/dependency_links.txt b/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/installed-files.txt b/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/installed-files.txt new file mode 100644 index 00000000..316db21c --- /dev/null +++ b/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/installed-files.txt @@ -0,0 +1,14 @@ +..\markupsafe\__init__.py +..\markupsafe\__pycache__\__init__.cpython-37.pyc +..\markupsafe\__pycache__\_compat.cpython-37.pyc +..\markupsafe\__pycache__\_constants.cpython-37.pyc +..\markupsafe\__pycache__\_native.cpython-37.pyc +..\markupsafe\_compat.py +..\markupsafe\_constants.py +..\markupsafe\_native.py +..\markupsafe\_speedups.c +PKG-INFO +SOURCES.txt +dependency_links.txt +not-zip-safe +top_level.txt diff --git a/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/not-zip-safe b/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/not-zip-safe new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/top_level.txt b/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/top_level.txt new file mode 100644 index 00000000..75bf7292 --- /dev/null +++ b/venv/Lib/site-packages/MarkupSafe-1.0-py3.7.egg-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst new file mode 100644 index 00000000..675f08d1 --- /dev/null +++ b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst @@ -0,0 +1,80 @@ +Werkzeug +======== + +Werkzeug is a comprehensive `WSGI`_ web application library. It began as +a simple collection of various utilities for WSGI applications and has +become one of the most advanced WSGI utility libraries. + +It includes: + +* An interactive debugger that allows inspecting stack traces and source + code in the browser with an interactive interpreter for any frame in + the stack. +* A full-featured request object with objects to interact with headers, + query args, form data, files, and cookies. +* A response object that can wrap other WSGI applications and handle + streaming data. +* A routing system for matching URLs to endpoints and generating URLs + for endpoints, with an extensible system for capturing variables from + URLs. +* HTTP utilities to handle entity tags, cache control, dates, user + agents, cookies, files, and more. +* A threaded WSGI server for use while developing applications locally. +* A test client for simulating HTTP requests during testing without + requiring running a server. + +Werkzeug is Unicode aware and doesn't enforce any dependencies. It is up +to the developer to choose a template engine, database adapter, and even +how to handle requests. It can be used to build all sorts of end user +applications such as blogs, wikis, or bulletin boards. + +`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while +providing more structure and patterns for defining powerful +applications. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Werkzeug + + +A Simple Example +---------------- + +.. code-block:: python + + from werkzeug.wrappers import Request, Response + + @Request.application + def application(request): + return Response('Hello, World!') + + if __name__ == '__main__': + from werkzeug.serving import run_simple + run_simple('localhost', 4000, application) + + +Links +----- + +* Website: https://www.palletsprojects.com/p/werkzeug/ +* Releases: https://pypi.org/project/Werkzeug/ +* Code: https://github.com/pallets/werkzeug +* Issue tracker: https://github.com/pallets/werkzeug/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/werkzeug + * Windows: https://ci.appveyor.com/project/davidism/werkzeug + +* Test coverage: https://codecov.io/gh/pallets/werkzeug + +.. _WSGI: https://wsgi.readthedocs.io/en/latest/ +.. _Flask: https://www.palletsprojects.com/p/flask/ +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + diff --git a/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt new file mode 100644 index 00000000..1cc75bb0 --- /dev/null +++ b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt @@ -0,0 +1,31 @@ +Copyright © 2007 by the Pallets team. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/METADATA b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/METADATA new file mode 100644 index 00000000..bfc3c4e8 --- /dev/null +++ b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/METADATA @@ -0,0 +1,116 @@ +Metadata-Version: 2.0 +Name: Werkzeug +Version: 0.14.1 +Summary: The comprehensive WSGI web application library. +Home-page: https://www.palletsprojects.org/p/werkzeug/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: BSD +Description-Content-Type: UNKNOWN +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Provides-Extra: dev +Requires-Dist: coverage; extra == 'dev' +Requires-Dist: pytest; extra == 'dev' +Requires-Dist: sphinx; extra == 'dev' +Requires-Dist: tox; extra == 'dev' +Provides-Extra: termcolor +Requires-Dist: termcolor; extra == 'termcolor' +Provides-Extra: watchdog +Requires-Dist: watchdog; extra == 'watchdog' + +Werkzeug +======== + +Werkzeug is a comprehensive `WSGI`_ web application library. It began as +a simple collection of various utilities for WSGI applications and has +become one of the most advanced WSGI utility libraries. + +It includes: + +* An interactive debugger that allows inspecting stack traces and source + code in the browser with an interactive interpreter for any frame in + the stack. +* A full-featured request object with objects to interact with headers, + query args, form data, files, and cookies. +* A response object that can wrap other WSGI applications and handle + streaming data. +* A routing system for matching URLs to endpoints and generating URLs + for endpoints, with an extensible system for capturing variables from + URLs. +* HTTP utilities to handle entity tags, cache control, dates, user + agents, cookies, files, and more. +* A threaded WSGI server for use while developing applications locally. +* A test client for simulating HTTP requests during testing without + requiring running a server. + +Werkzeug is Unicode aware and doesn't enforce any dependencies. It is up +to the developer to choose a template engine, database adapter, and even +how to handle requests. It can be used to build all sorts of end user +applications such as blogs, wikis, or bulletin boards. + +`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while +providing more structure and patterns for defining powerful +applications. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Werkzeug + + +A Simple Example +---------------- + +.. code-block:: python + + from werkzeug.wrappers import Request, Response + + @Request.application + def application(request): + return Response('Hello, World!') + + if __name__ == '__main__': + from werkzeug.serving import run_simple + run_simple('localhost', 4000, application) + + +Links +----- + +* Website: https://www.palletsprojects.com/p/werkzeug/ +* Releases: https://pypi.org/project/Werkzeug/ +* Code: https://github.com/pallets/werkzeug +* Issue tracker: https://github.com/pallets/werkzeug/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/werkzeug + * Windows: https://ci.appveyor.com/project/davidism/werkzeug + +* Test coverage: https://codecov.io/gh/pallets/werkzeug + +.. _WSGI: https://wsgi.readthedocs.io/en/latest/ +.. _Flask: https://www.palletsprojects.com/p/flask/ +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + diff --git a/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/RECORD b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/RECORD new file mode 100644 index 00000000..247ea821 --- /dev/null +++ b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/RECORD @@ -0,0 +1,97 @@ +Werkzeug-0.14.1.dist-info/DESCRIPTION.rst,sha256=rOCN36jwsWtWsTpqPG96z7FMilB5qI1CIARSKRuUmz8,2452 +Werkzeug-0.14.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Werkzeug-0.14.1.dist-info/LICENSE.txt,sha256=xndz_dD4m269AF9l_Xbl5V3tM1N3C1LoZC2PEPxWO-8,1534 +Werkzeug-0.14.1.dist-info/METADATA,sha256=FbfadrPdJNUWAxMOKxGUtHe5R3IDSBKYYmAz3FvI3uY,3872 +Werkzeug-0.14.1.dist-info/RECORD,, +Werkzeug-0.14.1.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110 +Werkzeug-0.14.1.dist-info/metadata.json,sha256=4489UTt6HBp2NQil95-pBkjU4Je93SMHvMxZ_rjOpqA,1452 +Werkzeug-0.14.1.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 +werkzeug/__init__.py,sha256=NR0d4n_-U9BLVKlOISean3zUt2vBwhvK-AZE6M0sC0k,6842 +werkzeug/__pycache__/__init__.cpython-37.pyc,, +werkzeug/__pycache__/_compat.cpython-37.pyc,, +werkzeug/__pycache__/_internal.cpython-37.pyc,, +werkzeug/__pycache__/_reloader.cpython-37.pyc,, +werkzeug/__pycache__/datastructures.cpython-37.pyc,, +werkzeug/__pycache__/exceptions.cpython-37.pyc,, +werkzeug/__pycache__/filesystem.cpython-37.pyc,, +werkzeug/__pycache__/formparser.cpython-37.pyc,, +werkzeug/__pycache__/http.cpython-37.pyc,, +werkzeug/__pycache__/local.cpython-37.pyc,, +werkzeug/__pycache__/posixemulation.cpython-37.pyc,, +werkzeug/__pycache__/routing.cpython-37.pyc,, +werkzeug/__pycache__/script.cpython-37.pyc,, +werkzeug/__pycache__/security.cpython-37.pyc,, +werkzeug/__pycache__/serving.cpython-37.pyc,, +werkzeug/__pycache__/test.cpython-37.pyc,, +werkzeug/__pycache__/testapp.cpython-37.pyc,, +werkzeug/__pycache__/urls.cpython-37.pyc,, +werkzeug/__pycache__/useragents.cpython-37.pyc,, +werkzeug/__pycache__/utils.cpython-37.pyc,, +werkzeug/__pycache__/websocket.cpython-37.pyc,, +werkzeug/__pycache__/wrappers.cpython-37.pyc,, +werkzeug/__pycache__/wsgi.cpython-37.pyc,, +werkzeug/_compat.py,sha256=8c4U9o6A_TR9nKCcTbpZNxpqCXcXDVIbFawwKM2s92c,6311 +werkzeug/_internal.py,sha256=GhEyGMlsSz_tYjsDWO9TG35VN7304MM8gjKDrXLEdVc,13873 +werkzeug/_reloader.py,sha256=AyPphcOHPbu6qzW0UbrVvTDJdre5WgpxbhIJN_TqzUc,9264 +werkzeug/contrib/__init__.py,sha256=f7PfttZhbrImqpr5Ezre8CXgwvcGUJK7zWNpO34WWrw,623 +werkzeug/contrib/__pycache__/__init__.cpython-37.pyc,, +werkzeug/contrib/__pycache__/atom.cpython-37.pyc,, +werkzeug/contrib/__pycache__/cache.cpython-37.pyc,, +werkzeug/contrib/__pycache__/fixers.cpython-37.pyc,, +werkzeug/contrib/__pycache__/iterio.cpython-37.pyc,, +werkzeug/contrib/__pycache__/jsrouting.cpython-37.pyc,, +werkzeug/contrib/__pycache__/limiter.cpython-37.pyc,, +werkzeug/contrib/__pycache__/lint.cpython-37.pyc,, +werkzeug/contrib/__pycache__/profiler.cpython-37.pyc,, +werkzeug/contrib/__pycache__/securecookie.cpython-37.pyc,, +werkzeug/contrib/__pycache__/sessions.cpython-37.pyc,, +werkzeug/contrib/__pycache__/testtools.cpython-37.pyc,, +werkzeug/contrib/__pycache__/wrappers.cpython-37.pyc,, +werkzeug/contrib/atom.py,sha256=qqfJcfIn2RYY-3hO3Oz0aLq9YuNubcPQ_KZcNsDwVJo,15575 +werkzeug/contrib/cache.py,sha256=xBImHNj09BmX_7kC5NUCx8f_l4L8_O7zi0jCL21UZKE,32163 +werkzeug/contrib/fixers.py,sha256=gR06T-w71ur-tHQ_31kP_4jpOncPJ4Wc1dOqTvYusr8,10179 +werkzeug/contrib/iterio.py,sha256=RlqDvGhz0RneTpzE8dVc-yWCUv4nkPl1jEc_EDp2fH0,10814 +werkzeug/contrib/jsrouting.py,sha256=QTmgeDoKXvNK02KzXgx9lr3cAH6fAzpwF5bBdPNvJPs,8564 +werkzeug/contrib/limiter.py,sha256=iS8-ahPZ-JLRnmfIBzxpm7O_s3lPsiDMVWv7llAIDCI,1334 +werkzeug/contrib/lint.py,sha256=Mj9NeUN7s4zIUWeQOAVjrmtZIcl3Mm2yDe9BSIr9YGE,12558 +werkzeug/contrib/profiler.py,sha256=ISwCWvwVyGpDLRBRpLjo_qUWma6GXYBrTAco4PEQSHY,5151 +werkzeug/contrib/securecookie.py,sha256=uWMyHDHY3lkeBRiCSayGqWkAIy4a7xAbSE_Hln9ecqc,12196 +werkzeug/contrib/sessions.py,sha256=39LVNvLbm5JWpbxM79WC2l87MJFbqeISARjwYbkJatw,12577 +werkzeug/contrib/testtools.py,sha256=G9xN-qeihJlhExrIZMCahvQOIDxdL9NiX874jiiHFMs,2453 +werkzeug/contrib/wrappers.py,sha256=v7OYlz7wQtDlS9fey75UiRZ1IkUWqCpzbhsLy4k14Hw,10398 +werkzeug/datastructures.py,sha256=3IgNKNqrz-ZjmAG7y3YgEYK-enDiMT_b652PsypWcYg,90080 +werkzeug/debug/__init__.py,sha256=uSn9BqCZ5E3ySgpoZtundpROGsn-uYvZtSFiTfAX24M,17452 +werkzeug/debug/__pycache__/__init__.cpython-37.pyc,, +werkzeug/debug/__pycache__/console.cpython-37.pyc,, +werkzeug/debug/__pycache__/repr.cpython-37.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-37.pyc,, +werkzeug/debug/console.py,sha256=n3-dsKk1TsjnN-u4ZgmuWCU_HO0qw5IA7ttjhyyMM6I,5607 +werkzeug/debug/repr.py,sha256=bKqstDYGfECpeLerd48s_hxuqK4b6UWnjMu3d_DHO8I,9340 +werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/debugger.js,sha256=PKPVYuyO4SX1hkqLOwCLvmIEO5154WatFYaXE-zIfKI,6264 +werkzeug/debug/shared/jquery.js,sha256=7LkWEzqTdpEfELxcZZlS6wAx5Ff13zZ83lYO2_ujj7g,95957 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 +werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818 +werkzeug/debug/shared/style.css,sha256=IEO0PC2pWmh2aEyGCaN--txuWsRCliuhlbEhPDFwh0A,6270 +werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 +werkzeug/debug/tbtools.py,sha256=rBudXCmkVdAKIcdhxANxgf09g6kQjJWW9_5bjSpr4OY,18451 +werkzeug/exceptions.py,sha256=3wp95Hqj9FqV8MdikV99JRcHse_fSMn27V8tgP5Hw2c,20505 +werkzeug/filesystem.py,sha256=hHWeWo_gqLMzTRfYt8-7n2wWcWUNTnDyudQDLOBEICE,2175 +werkzeug/formparser.py,sha256=mUuCwjzjb8_E4RzrAT2AioLuZSYpqR1KXTK6LScRYzA,21722 +werkzeug/http.py,sha256=RQg4MJuhRv2isNRiEh__Phh09ebpfT3Kuu_GfrZ54_c,40079 +werkzeug/local.py,sha256=QdQhWV5L8p1Y1CJ1CDStwxaUs24SuN5aebHwjVD08C8,14553 +werkzeug/posixemulation.py,sha256=xEF2Bxc-vUCPkiu4IbfWVd3LW7DROYAT-ExW6THqyzw,3519 +werkzeug/routing.py,sha256=2JVtdSgxKGeANy4Z_FP-dKESvKtkYGCZ1J2fARCLGCY,67214 +werkzeug/script.py,sha256=DwaVDcXdaOTffdNvlBdLitxWXjKaRVT32VbhDtljFPY,11365 +werkzeug/security.py,sha256=0m107exslz4QJLWQCpfQJ04z3re4eGHVggRvrQVAdWc,9193 +werkzeug/serving.py,sha256=A0flnIJHufdn2QJ9oeuHfrXwP3LzP8fn3rNW6hbxKUg,31926 +werkzeug/test.py,sha256=XmECSmnpASiYQTct4oMiWr0LT5jHWCtKqnpYKZd2ui8,36100 +werkzeug/testapp.py,sha256=3HQRW1sHZKXuAjCvFMet4KXtQG3loYTFnvn6LWt-4zI,9396 +werkzeug/urls.py,sha256=dUeLg2IeTm0WLmSvFeD4hBZWGdOs-uHudR5-t8n9zPo,36771 +werkzeug/useragents.py,sha256=BhYMf4cBTHyN4U0WsQedePIocmNlH_34C-UwqSThGCc,5865 +werkzeug/utils.py,sha256=BrY1j0DHQ8RTb0K1StIobKuMJhN9SQQkWEARbrh2qpk,22972 +werkzeug/websocket.py,sha256=PpSeDxXD_0UsPAa5hQhQNM6mxibeUgn8lA8eRqiS0vM,11344 +werkzeug/wrappers.py,sha256=kbyL_aFjxELwPgMwfNCYjKu-CR6kNkh-oO8wv3GXbk8,84511 +werkzeug/wsgi.py,sha256=1Nob-aeChWQf7MsiicO8RZt6J90iRzEcik44ev9Qu8s,49347 diff --git a/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/WHEEL b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/WHEEL new file mode 100644 index 00000000..0de529b1 --- /dev/null +++ b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.26.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/metadata.json b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/metadata.json new file mode 100644 index 00000000..bca8d126 --- /dev/null +++ b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/metadata.json @@ -0,0 +1 @@ +{"generator": "bdist_wheel (0.26.0)", "summary": "The comprehensive WSGI web application library.", "classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"project_urls": {"Home": "https://www.palletsprojects.org/p/werkzeug/"}, "contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}}}, "license": "BSD", "metadata_version": "2.0", "name": "Werkzeug", "platform": "any", "extras": ["dev", "termcolor", "watchdog"], "run_requires": [{"requires": ["coverage", "pytest", "sphinx", "tox"], "extra": "dev"}, {"requires": ["termcolor"], "extra": "termcolor"}, {"requires": ["watchdog"], "extra": "watchdog"}], "version": "0.14.1"} \ No newline at end of file diff --git a/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt new file mode 100644 index 00000000..6fe8da84 --- /dev/null +++ b/venv/Lib/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt @@ -0,0 +1 @@ +werkzeug diff --git a/venv/Lib/site-packages/__pycache__/easy_install.cpython-37.pyc b/venv/Lib/site-packages/__pycache__/easy_install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4ed2208801fc2ca1932f49c777f63c989eb617d GIT binary patch literal 316 zcmZ?b<>g`kf*Jb9qw9e5V-N=hn1BoiATCw{5-AK(45^GMjM+>@aw$wH%sEWC%u&pY z45`e`42%pZEWr$#tX0xMrFjY^8L0}ciN%$kdBr7(IXMc+`MJ4?c`3Iz;^T7@GxOr( zUjmI|&}6*D0^<5@ySn4%!vs} z%`J#2$Slx>nxb2rS7DT%VUZJqur3DK8oh$bTO2mI`6;D2sdkJ&yNW>;vM_Nl@-PAb Dnmk(k literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/__pycache__/itsdangerous.cpython-37.pyc b/venv/Lib/site-packages/__pycache__/itsdangerous.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bb43651207ab5ecae537b413c78230bfc5d02b2 GIT binary patch literal 29306 zcmdsgTZ|l6dR|p^bx%*vg~O{zU8oYZ5;+n%5-Ez(jxI}z6fNyiBSoZEQm-~WHC;6` z&FSf$t*Rk8?H<_?ymo-tiE}~h1hxSq34#R4OXa~p5(Cyl z9)bn@uzpCs??2~MRX2O6-8GB=X|hh;Po49h|Nj5y%u7>KH4DEN-+B7-V&Ag<2T#ne zii5M*;x9Uu6yx-URi6%b)n~%p;hu2sa;d(r^BC?|+WXfJ)DPhP zJ@v`(Af6e!bto7Ms=@f}l03b4*{Sc_nv^fzTfgsZt8>3=h4-)3qJM8&{3mzrtKavo z)p6dje#{DL!NiAFFcCg*vs6DE9=>VS9}FhzUhq<|E13Dvu0Is)4)%O#)sKV^hfc6J zaPZt`f_=e$TzdrX9|-Qj`}c&8;`&jX9}EuR{7`rl=f`k@!&}CFurpl_)PE!_H)6b!BOm=2#y7_*guKq z9}6DG^N&mWPvZP|a02Hi!jpLa6wc>@Cvg6RoIi#0CxeqXKPk_j#`&q>DV#qQp2qV} z|QsJDmU>@~{oj9ELUb=kYxEF_^cj?vhFE3nvSsJn4#XCWm_^oz4SNnwYxG-y{ zRa6lst@ZE|(4&P5ZmZYYz`hcN!Dcf|t4X)9w3USMCxEGymX=y8O}=b?eC;f@*h3Lo zAY_X~3<7q7641&G+@OqoIjCT0#?r~g`R@9L-%LJ#`Spd~nYSZAhP}iHp`)?D|7zUr zsNsl{sI?J$*H>F;0p1E#Uz_|Yf83X_oyQiF>m=4KyKmpN@hy8{)=6E~m6qFGKZto6 zhwbHbY{TE;mG4;5G~W6C*}|yVP2GFGdSa zpapBV6~9-+t2vC~1gd$0ZIFi9y*VrsZIBeS>F{JS%mVu1YUdu?yFtJt$6L8{HatePOneRvV3u zzaBOkX|2&vM1bSTM&m1+ep}xeYczsxv(bypjvsB!&6Xl|SAp|B9D&|2(B{SA7Vl}r4e4$Eh~SRkniCyC z1@-ABsVWK^K@0eqWXLv#n^`Z~I7uM2*2bef>`foAz6^->t(!JV`=-6-Y&(4?dNOdf zOMPqG?Noyjj_hss#$$<-l=?27#Q9CUdBOVfzW1E%@^+

X-YKbJpwDcIhjZ-nRN6 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/__pycache__/mccabe.cpython-37.pyc b/venv/Lib/site-packages/__pycache__/mccabe.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75a858b1cdebecad481e9cbf4ec8b771e1d8c6ff GIT binary patch literal 11139 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 b*fU3Gre~g>`JR!VSu7sF-thk7v7-6EB5kW% literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/__pycache__/pep8.cpython-37.pyc b/venv/Lib/site-packages/__pycache__/pep8.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f983244e445376882ac5a1d1ce218afb972c1baf GIT binary patch literal 60921 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 Ke2+JfZ~8xI#(szZ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/__pycache__/pytest.cpython-37.pyc b/venv/Lib/site-packages/__pycache__/pytest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43709823f854e6548ea36fad9a02a9ceac053867 GIT binary patch literal 1965 zcmb_c%~Bgj5Z3=65(3OW*a!o*WsD348=Kg!V89fW;BuL`Qq@t_)MjTSZ#1*JHM`=+ zhaBQOK+ZWO$2>xwAWx9XTyx4RQe`MxJ0~k@ z1V-#QFRQ8sH9IcIQB{Y!9T(-88ixrxF3D?Z5+>CYOj)}ur_~J1s9Bg*b1P#UU*nT} zicj+yKFjC$JYV38{5rqEmw1CO^P7Byuktm1i{IvVc$44d>--+y;4OZiZ}KhvfN%31 z{;<0SkHr)IsF(REt$)OB?#eyb6Q7B_UoyX@KBRw0`x7|(SUy$H;2G}!>_ZB(+dWG) zpS*ui39n)i#e0pu@5K$r=Z#L^cVjQ`9oZm{=XVHeE9*zwUTlMfy3DBPlW zCL-FenKikSSSV9I2&5D)MliXTo}@&p9Z$+ZNl~+4imx5FhpjP%(}4G-F!=+C)tS(?Hq2~d9u7*xyoR2c zH$nyHf}i-wlAWPrF|m&>L!mt-{MeEEp*QgA5hT>qkPj>XQ*v}S(#trfuM^}5W(h_K zCJ5>Ta|C$wQ<`o9y+qI;C=lcc#tCi^%n)P{NH@Bt7s*~Am?BsuxJ9r+aFd`+Kv#*L zMlj__#4Og1EA$vmW(jHp*9b}oro#P-Ig2p9j|M1Ok&%@Z5dP$j13nKNlt2~ePMj)OZ1DB*z93?I6qKv)DKB`wqZ~l zIBowwh2Y}bez%K6>neptwI>Opz@a{jhvL3KIVANHFQ3v2`mq}*5hWzqR#_S>anvfP z4x?BmCUHvNAs{CH>-2ovd8iH7`vIQ7gi0$2tAKg>^frC^v6YxGUKI(wmS`&^tAmd! zfr(+%WHoa_FHs$l4^u-gm5I$@@l}X>TXk5mSYcSjG;uxgiRYX#l7R0hfy@??zM0C| z72YlC2v7N^6tP926YF*S_P3PY#FvGCP7n6lZ}AR_+Nb-+$0y%!wGNNY+WTR6=)_L@ z%K&ea_E$oM?a&K1JUYr!Zfy0=&z}VSop!S0;MEGROzCN&xaTCMC`QQT7t>?u>fjkm cC)Om|4V<4X7P6W2|ML{Gm24?9nyqI31xni$9{>OV literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/__pycache__/six.cpython-37.pyc b/venv/Lib/site-packages/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ce0e67efe447b18066fc3bf9591e1156b5feb85 GIT binary patch literal 24974 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 C6H@^I literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/_argcomplete.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/_argcomplete.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0ded5adc3daa6a748fe1823a35a1121d6a65f33 GIT binary patch literal 3936 zcmb7HO>^7E83qUvq##*#Jeg$NW->cUQi~pmit09*dLk#XB)b|rvL}`&HKP^-VV5K< z5I}YplIWp(v3qN0`U85fZ|zU$wU_>aUU2Qne<7Flc^4o>D@kVx4uHij@P0n;voCL5 zxZqhh{(k+R-}sA`^>2EZ94!pKz^VR%3%9x!w|OnLhqZ2P=yaW7y<4|w&WRh{hPk_4 z7x#MH95%a6+qz@%26tar+!d|oPIpeYPrR4&y!pzOe;h5CFBZBNzP6J0>y}tN^5j$7 zqMvBIyvSRxY}O0XIuEV(Lhvsb8^m#X!VUv9 zSPj!*77HDv3G1bj1+t$7QVDhv=>a`e>w-l+79~pKQ^CDN2(D(AZ*F|t`DN!5BO@E> z0mNPJ{Cw?t=Q>+XV=g2+7E(crV!a@WJ)N>%lyIg8f(?Uy6f&h{l=N4aN}0d;)t#;T zUp~0Ev%kYca@=9ZfnH3^w9`D74iHcE4tD2GrnVkbspju<0IBtA=3L`DX&2Vq8oDjn%XVL&S@ z2t7+Bg%M`-g=R~zGYN)bZHWavjd?Ti+5YCOn@b+$Nd%mwJtLosUXaIU->{_{p2rwV zGhK$E6L3y`7}d*LY0``O9iM#hQ|Uv~3QNe%jjPwL(ue=+Xm_UWZ@d`|&$|zAAuGtT zxN>aj<_a=qfC!XKlG0DfZHf>H@^}h-n8#UjP2K=SMJuBc1c(t5YM{`I017OgS>**9 zNIT3mV1tDd5yu_2yxW^av%wl5H3j@iX~q;y192t>`HK<_{V9qjjtv%}9tq|Ii-!+( zcD5fq@HWcBz@#q{A%S@Wb>cQtp^P$Z3g}#6ddq7-gM+Z{p*+i=`DA0)2;fQ5X*6|(#vSE-=6fui8&orY% zhr-|*FNcF5>6eK?F;-4MRg{Er&IRD|0ekRx|JV2TW~+6j?r+|^x3;}=>(QM%yL)#g39a&qo3}r88(vW~@+?aw!3bJYI0}B9!M;&H00u#5 zdDh8BsBGYZ(%_Z8svF)a1KLfHV&v_HDZd|!C*&l_Ro` zzM(2J&iJ6B$H9z;68TlP4*;Lx+2;)6dHObeln~G z&O{7I%$tNlxi{#U@+TEk$)8v0lQT|hdnj<^BFD{Ok< zfM|K9q);@6dEY?X?1{@k4CD?(ob~dUoeV?*i4?IA&ZI+_IVowW+GXU#sfiN`V9Pi7 z*;t1*nJ4A)|Aqb!mrn)}j0BK~|Jw!-A{?ab!_P4`3}hZZrX8EYQ*N(>9!6k06tK9L z<_TY6>+}wgNxq||bu~2+dRzFohH#DniN>^qecWTbe#w(;MrwaZf#*SV%@0 zi>s|x4Btf7@_qNSQEF5eE6zD-;I)?^cVdWGhylA27iFb+v& z30C_3dS`p*;lXB>Z3j9yxR;{p4)(<`I{>Fod362g`1n_8{)+zy9c4+ox zeQdw7%k_7y=k_xvsdML<)3=`0aW**CkDBt7H_H3imcN4>_ev%6s3x;<<7Gp;m~D~- z>V`3{e`-CmCoARb=_k55ZalZQt>0dI<{Is-v5Ox2uVa_D@V+~)znmMpW2dx|Bz^nm zudQ*N(){$JGyxu~J`v@R;4C?6Qu4r)LTB?eA z7U)6YD3KLTERv#Gb#sL)PPIt5Y|z)P!sa1((TEh*3l}AiwRTg|-;Kh}r07Mbg?n^@ zys55NK2y6^cxRh+w@Cm$gc$qOV5Ynf+9<)~jqh*cNxhGYReRh1Nv&?v?-ItB?UucW z--6w$z4K$qFJ%C)`)!wG5-<6F;raeBF(m2o3OEM#@=cAiq>ak k`fq*;N$NdZ>h{~fQ_Eg(F1@#4*MO=;`;zU}Jh$ci7xs9tPXGV_ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/_version.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/_version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..362f330cc1e5900508256e128c92bdf1efbbe849 GIT binary patch literal 191 zcmZ?b<>g`kf}O_4qf3DFV-N=h7=a82ATH(r5-AK(3@MDk44O<;tj2nldWL?QjJMd! zQj3Z+^Yd0R6fptSfQet>&Q>v@#XyM|Uq^R$&pJar7uVnz$ASWv#FE4qpZw&+oS2Z* z+=7^b%mUrayyB9?oE%-l?6NY;{8E#cg36NA;*ywn7!9>Sub}c4hfQvNN@-529Sg`& HK+FIDMb0ze literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/cacheprovider.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/cacheprovider.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..328b378c5a9294ffbaee1744b741dd5b3ca0cb84 GIT binary patch literal 12577 zcmd5?+jAUOUhdn>v_>OYc4WtK5~p*|1WQh`A+>8vD!X=)&F)4Ci4rHX4&%|B9%-bR z?(yj!%bJXqCC);4@Lr&xxD+52Ra{=FEef9CjiQPdc0ScN$LL zZMc1};n{3+d!>H4QI@*bt28QT^Ll>6m*2U@ocvZBRr#H7%&U?r_iFux#v;a)RHb*K zztmXjpKP4$pK6>!o8P!6oZDW0)lze+`mv>|;psc>9lLP`E%T~|mKs|c_u_p)E#iGq z-p{HNYUyLEai2P=PT}`lSlzx~-J_Q8+Um4A^Rb0F9zffJ>RxqL-p;H0)H(EgNZqd< zz;B?ux2^hvqr269s5e6ubo+x|*bk$$m3HGOh&w^L6$b5A8|6U9x4J6S)hgSfR)6wg zx0M7@oCfW!I0>U5je{^sh8iP!!_CdTpfyb6J|=9pdcD1BcQcB0n8?K8?KIR;s}~IR z(lAL^WTEO$fdH%SW+z%3N!%NzVH4Ymb(;CAd#jsZW7*M(3QiT;n~o5)YA zx;kv9vEB*+6p+EoW>mD$z%dAoW2`fsP1lc+glUpnRDM* zS?P6d1g%H~sCH0|2Ruh|Apk6Q!(NZS1oI66$&H}Xy`2K2tJUh$PhX7*?x&v)+Ht?% zP02daW@genmjN2}E~ku&*oQF#eZ(nAqi4O>|aCv>+x(7tomZj`3# z<*=e$Qz-yK4@{?P=BLlXuh#vXuYwRQ~8OU%9qqVpxNcDbcIy;3bCxi zfo?n40{^%t56=}m$t4tH>%bb@hxWcRwhwHDnto>N95{!TekOItj&hWH*Rd_Md50E$ zQ5)NL9IWE4WmN%5yBD_fI@T%y6z#BH%1%pr6GUOi2|(|3H?z6TFg3W$%Hi#9k|vrW zCoA=L&=sWUwtGod&U^bZ2|oOlrO%+-r`NAsy8ccAJYIkOtFONL+IOB^z54Ro*S|U# zTm_|F|5gkZy1pLv2iFJP!3roa1xu|wyL0Q-SK{IG*9}UqH}hYae8RQBcUHybn`Y_9 z2^|rJPSrkT*KFS&EnOi*SC2Zi$wvI+ZvoR&cu5IWf#ulRb_7<=S~gd}r0(iDbZe9W zj&9V=Dmso+0>IYGXqUs9;$FU@>83$kAesW3&o?>nG71u1&+6Oz zZZ4=Hxc4En$L`o0JNm-d-u5~`?)UA82)42H(j6dPS%PYv3ysswZjubc98k^OmX5m7 zCUC#-rbwx4c|*CeltX$o?~~~Jv5m&*ndWA?HwY8`0KR2q!%A5tpB|LtC1J0Vxt)HR zc`dzZCXwDVV9GqM1HEM>J_-w1t2vH6sv2nVV*#9FT<{7y17kSyzMa|tgL4PC+wt`I z)K#c|L{NAKCFO!o9Po*=T~;3cOXQ2Rvh5$tjh#aqU@Eu%0bmMr2x$}rttp{6fQSv^ zjcrKHV7H4p<<4gJ7Bm8N#cB||CfcMLTY-of)ISP z(MrN%tQz(QNziKRIDrs_3=EPmp%_gdKPOwgG-&BoU(RtU=nv5e+iGEMXrWD``;1E9 zYb&^M9B6VLT?R#rRz-(HcM$XtB=IgR0L(`H z0reILMvGGnG1bA%L0`?pof{hf^JC-g;n+KMM$qj z{Erq4C**w!W}sA|q_~17;ldzy5nrjufkTRVh%fsV*01BUewqc(RCmmV+?{Z5b}I`_ z2)A22CQtAU^fuzl9^GTMaqN5BMF;+IBNV){8ICISle-s;T_aV0P}}!X=Kz9>T=y&1 zTh@ElH7h#jS*e$n(sIY$sp_jX1T*#4+xV(@2)Fh9Dei1joU1^#DBAppBXJzVkP*xV z9-$x&8gpdBd@zWRqs$y&J(3D&9~`MJ$d_agwn>Ppm_db|*07fbAS@#$z`CDdC2U}t zla6uBWY4R?JIRnXqb$_v>g0&!g_0-qTksL=)fos+`jVQq!^{v-MiNqQ3-8XI?x2i+I}!OjxfMx0HU0 z&6U^QFq~3(<87(bOG0+~Ir*AzQD5Mj-I=9B7i9Q4J{fkHui6e2!!rIybA}G_{TTI8 zGYj?oH7Zlow>);Yp&Ot^X}v-6gW{e5#kr~1ai-`EY7?3QwjBGY5~*+R3@EppR`j|m zM~o;kzK zeZKW3sXS>xo*Tl1Qk_yaB<}ye1SdN_A~#Z3v`15ZqZ^5&C&58Qb=$|uETDg~1@m64 z2`I>@-5V;=KhRo~+_W-g$50jKny^P}l#?sCNYE%PXv8U<0NJh|13~D=QH&mG$HSg7 zs!h~yPTryuK4iHMTaFaDmN~l{nY}xDSVRU+G8wq5yD6MN^bO32pHdJ*g_OGy^;b5R zz^iKlT}gf3Fi6>`6wwa)%iIkGy?%tnFQUj?ICT02);wzN>}=Ecn$2W5ppOW6G{p!w z#zG|lx@=ef66d0^Z3^0-nVW=Z6P4r~3Tuumv<$0w(JrHQ2DN3UjB>(I=v|n`6zhd) zd=)Q7x4^l0i8W>4Z|%e6qPvkifnPAwp$)d7nMExGRywq|>4xOymMVk9E2B5A7_c9m zD>rT+mMHHGu%QX@)`I$mpGMh?K@^x&!pFS#)zRErFMsvw>o2eN)#$lLCpJ~EfxcqZ z9{18Oz+*JX-)cphVfE=zb#=3w8sB|XdT0HWl`q30_QR+hlLpu7Wzn2KZ9<&!U92`pL|1HmNL{&8*sN_G2~dv0iI7Z$iQ3U%Xa|kbu+OFgCz>td-5v zqDuN97*FZ5Y^lNLLMS6|qT^zy^BLACNbNH>Os+z~I zuWD)mzjJC4^mQWhzxB$S5}+7e4ooF5fr=soWC9S3R0L1yVH5xo=}M>7?E&BQJYW$N zHr9j>_?ytI`2?KM1pV(jsr{Q)2Py^o^vBLsgr(?vHJwkaZTA5C?plZ7g=R@{L|M3^ zqDqJCU$W2G)vDYB8 zme7OKtv(~_^_WLWd*l;qt-xD1XqzPQTWarCP4U@4R!98KRc z;xb=T6}0*Lj+)!{*prbM*aGgptLDe<8H^W1*4DBLqFoz^H;UIT{!F7nCL7hUA3pm|3I8bx2B{05kYdfVdxg7y+33A11>N;%xhf(v;*wRyHm0NAP{LjIk>P z7hs`F!Q%<^%(tL8Lj(FL z0{*~59UOTG6E8Z2dRbpm)K~}+Y?m$@G`MS-$Dru;|Ap#;iJn^i`=Ge19IXgKLh#clkvlnlgj=zry^Y8~1GpO_7&wyce zOaXw2kP-mAbp(JiV;=fzI2x(Z*(vKa{=)x43)Qu}c}CO{02E?uk7|l^3M$>UbD)$U ztn@bK);lN)Mj`CEe8T5QN?{;i*>Q3y#Sn|LPBGO-KTLEDKbZ$Rsy_oE{T{yj87IpH z)HAbS$O*}S?Q?|HdcEAJ#KRP(XDG`FvUHCtmWKmGNet{rk3G>nrLmX1n~S6J0a7>+KHou<&{e?3 z_ngacs<-Kmlo-awJU_;_(!GczPQFKvVYR9VvLEMtp^4ddbE=mJD{oD|gZ(pjOgtu( zCQ%5BSL6m6M4%5P0FH^2eu6C`L?l!y65iX2V8pE6IM!siRo~=_GZ=mFI7T6kXg75`dvb=qz=-5A6c#v;LdkFLb%kZi}X5*kMJamD17VyCh5Fi_UB-d@>?5E@khb) z5}xE46#qAqlwN%1uT4zQulyVnG|ElTDBN8UUH)17(@4QwUXU`!v>&PApwm#JC})V< z-Za)`S*XET8!d>Pm*G!last56&Q~ z06?eAD>#~lgZm@rCNj%HVs$U8B5BK9Rn&$?F>x_7QzS{ieOkTDm<9CH z;KhIAio|i*8eJ-2_k}WQO63*P0KFo0c?hHP?w|$(8Zk1Mz|1sYtDDW3$z+5Dy0@`; zkPWZA_`y9mO|L%N+ zxFlE#8=T>7V#A=48P~fmxUF=AM8wW44iO|)Q6YUD*oSDS!$U%Nrjv*lUh1daeh6FS z^Ynv%x!3A%sMd@Bff;DjSfgi(eSa=Er}1HiGUQ}JoXlV71Z%(p$7~8{}-=Yz{$m!LalIJ9{lI4l^OM+Kg38qMlmZo%17!#@3WIg3n~arDw`Nl zN7OSTC&=qR!IPV}W!m|$mx|Nn)IKBr{TcDEe~k;?U?H-e(E8Z||GW75Pk1C3ECRpe zpYUDH_G4^c1dV?WUl=r|&BVyows`i8UNQ1;w*+IEZHPXg4Y7x*HbfxM#)SS+za_Nb z`U+YY@a4#R(6WpRET#pF)p_-h3e>}QE4gleWUW!5@2*?D zk;lNrXaVIUYyr2VD%rqhs)wQ2WTUSehcJ%vBm;d7#yt>GGj2+N8pCazC7|#46w`9Z zOLjYmk44Bh8gB+Zqd4&l?87`mDt9aF4Y-R=XS9e?x*6qVywcm8jWd}wH-={ZVlj?j zpujk<$kxaulzwXuF}@X%Px(mRB1yM~NP8lJ#{3;Deo2^Oq+A+7CNdokE~dD`pyJ(# zn~FN4d6W}%sy_l!M{jUPW;b%D1)uYnqi8_M_n6=#wpD}|%>cu-3@0+`7l`B-)mF@n zo)y|!!Z)KASj~f%%ri27$Y5jiWEu=Y&FnZL$P*8kIZ&COh!lmpA~!Mg0{4roZa+p2 zfIyUwlDXuJ#2WNX9s}iOakN!^A4e_ZH(yLra%Apt%;d3GA%1vuME?#)lu1f}*nP){ zX(fsUtHe=O62j8&qdNqsiyi4(9RIr^Zj)@}5@hfA!9-!`SYp+pe;Ny>i@6|y47?6EVN``$?0J#%lThFp4wQn{SAkx0VF+aY zL~%kytWVkckJ0Pcp?EMsjE{;z3~h?mCO$}F>aEGO5yP(eZ4nW-yw(8$kYI0QT_lb+ z!gM#}eM0arY_i#V88XEx==UikkRU=#*10b0m~Rk!=9^e=b(0eOCbCUaS2#X5@qB^Y ziG&InNl<6ieI?Y`}Q8fg$NMRtwwksdET?g5|@!7{&Jq2egey;@jw^%R zWYBBv(OR83VK#BFP57(11>G3xU*?hN+FHmR`JRLDHUk#=04;@?D6TIWM&3sQIBN9BP+xh{ol-z(As9v2uEalN!k|IPH?FCns2LT0dx zKJ&Dj$kw+%N^2%-GcF%2sOq6@awUjxb@nUc%E2O|TKhidI5;u(;mtYwbK|+Ox8v)- zk=5qM{u$ZF&5z{0HhI7O2tw&|ckF|uLkshr+ONv@g>lvF`{uu1vu=I_PqCyHv9I~@ z{K4Fz^+Q{)r!~}NH@H4l%lCUi_Iqhu!(7kpFN_xsPD=0ds4b337D({}K1&Cuu+N2q zdk(GbRv?sxZ^Z$0@uvTr>v*s| zprt0ZVP+3z@k0OW8^p^CsNfQ$Q$=E=CKgATY>oPPyzx@l5+Z1)>@yA$#dt>_muchk zw&?u&!{RD2BitGCay24mBqB{J(p1n${}!fbq9tZP;OgIE@g|G!vEV*m;*571zJJEm1o}#SRS^F*v+B#x6G<-&UnTr)Qi`A{t(0SfqM3H7}^@40|bYw6XcNBrmg%5r6K$zS*% D4{gnk literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/capture.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/capture.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4bbcad1ace2960c6fbb02274761a82dca17d35e1 GIT binary patch literal 26350 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/debugging.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/debugging.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29bf5188639e26961d13290ec84359ec9c5dc427 GIT binary patch literal 6134 zcmZ`-%W@mX6`dCbg9l0QA&IgcnbPc{uVOsgoeSph#tUkn7|F6@@cG@c z_|i1!&q_hqEIw1ZQq*VsJj^SXW-^#!(w z`l7C%VN2{3#x1kc>^!@G=Xqw|G3plwulwypauGFUdyo5! zZ}qpg+sU^7pe=X&_3PJO_T>)u*AL`Qn)uiCYc5v&$B>m#x7A#)lV>Ynl$RBTD+U^{T^>h&Ti~Cd5_xB?4^C#OuIaz@=luWVy+nF z@|NJyZZE|&8#kLKEs39n5eordx{4V6axFI|#A4_5{K7}VFgUC!E(s^mzwE2G8jN;7=-tBGn+PzEd1OkfVORw(k?Y)`y zf4<&DRCSi*XlkIXR3rej+A?^)B5Jt>J(=re^T!O}spk+N@) zO`s{>n3P5U=#jZ;9h!%hw1(zG(=?Cu@XRs>a%x>Oos7U%ocyew*X z1|Aee13;9hT0*s*?4`RrsI7mx@$T)$wU2JR{oeZRwZ?`rn&>k9k*w%?v!5XQ%Gk7| z5t`BpZDt^Mq|qth>B^#bL3*8%^un^IzutG%skU|D$~Mv{7|b9e5puiyS?<4$(fhfKh(8R7yp%{+N>Pw?$_2HjR3j=qr# z3Z*rDLE=X=#7Z+&Y7tKe+%?7P==%ibNJm$ZvX_x@BQTi}Sj-G;W(5vXfkXcS zkC&KBrsNT{G$=C*xG!qC4C?-R#``QK3khQoNm$Mnn8}x^whgdbv5zCK_>GMw87%ru z*x?|vTVTZoc)%Q4M@GjcjqhOn-I9o@G%7G?KWQ-d!|CX~d<_j8TAkv^Lyr>P z7KVjU`3Noqo)zr3nDax&=~O#2)Q5R`j48eVYs?-Qqq!kwg&xy+N`osf9i*uGC{s;3 z_5@z`nMiv*;_fIp@Yinp&8R2)u*zcsH8UL*+}Py5o^ z?Mu_~KBh@H^V3$Vjyr!1bJc64xSFb0@*B@lUJ8N9mLOEQt#B)9?rKD;5}I?gtJ7IO zBP52~ak>@7;doDa+Te5(R{}3(V&TFEqK&dfv~uEh!lCQD2SW_~4kno6WU+}UH0ZT9 z0OvN*h9(^iUNB3(VO1D!5Gz9x%90OqE+9;6FzXraqLz`e8ny@AmO%>+65+OLE)YE| z=JP>vD^tnU%?E7@knsDK+HEThV$6Grp6u zT*dVck26v{4fF=>wTcY11?%USu4S3}%@g`W2w$bHL=eaN#4I?PHo0SXLXUtqS6o7u zCMh8Oibzz}DzSkA{57KkbOblg!fH%a5NOR$#S z(1e1NhW0~yY^stv1Q)P4Js*`s!%J?M$L6ce26&$IyX)y#5!s~`qtB@S{m<6p9L{uk&M}_o+^84CyBHwWDEk#76UeB0;!xW1EsTfcJ-}yi{D2nI0<<8&a}c05=Mxy5==nX;BV`l6 zrtJHqM~B^`>FH3ODX2bmY-veK8bn{A0JqG{rAE$Z2kxx2JI>GuEf|@?ks+>27wts= z%^F%GkJ&?0yQd`rANm!ORfhhZa;LKEihHuk3J=ZSB7#F3VzVoT9*?&K)uBC_h2u-w zO?pjz%3(!|*lpZ|TGPI?Em96ibMVSIDuJy^UX=b8_YqLBJgANQR(l_ohxFVeQ4I_cm!2K%XAGI8PYm|m+%L=bmI0jPj6z> zAyP&jn*oj>C)3k*1zym&R5k_mo3et3$~1`n1{H{OO1#<=v59K+<-!B+xQEVu!f=(H zVhd!9r-!FQMBB1j_I2a)Mo!B^XINl`mW4}Q9a6GKW%5dfg)@fsOk4!x#_z1N_~e18 zgRk6D*6B?*0heYvf~s{0d85miRM9R>^Lz0@&E8sW?7YVbU|b| zsA}#fZwTgjV=(_=zbz$ICn0lv{weDc*dZK&U+NX}2v=3Io%F$YnSj>I4a}s7O$9Dm zu`jWTaY0$8(<9uYh7vg?G)W>pMP1NUDu?g4W!)1WQH$nfn<)AgRa0a^CBvr|d~P5p zsv_JgiNlD1-XAl9#?)=J{Shhmvz;0|>M|@p;cCgM!Pl+X@dI zg(2LAA;=w&Me0~1?a~}sXhp9#j6?JO65whAY=wqqp~rOiU_LxHqC0H{ukB{tQFb@l z2jqC7yjGY;ec}~#hy5+!u&}pg`>AuNb6^uVw)prX!z4{Y%*J>UYIpOm7@Ltg8*m=a z<2nS9!SsZ51=AA}&)|C@c8%|a2(&xqLz}*uJwy-!mPQalN`v#^QgXHHI5?HvXky^> zM?zag$_OeGBbrZ2-W~=xgXI%G!*Os6do^Vsx=KoSXeKf?w4D*m2f1%YHrT{Q{A6NRZ*Wc X%eHsMd#-l2HdiZp^WH_TJq(MiSEQ}-dcRu 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/fixtures.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/fixtures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02593df04363038f50a95eec0f8e267e11585aab GIT binary patch literal 38668 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

LrM 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/freeze_support.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/freeze_support.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44852c0b3398d0adb4390559ef3a91a2d9c47d10 GIT binary patch literal 1396 zcmZ`(O^@6(7`Bs4CNu1Iw^GrTn{P{`?ue?DfC^QVZd)org=nE@npNb+p4sf?tF|-D ztP(D}SFW7fBjO+M2lx-Za^f#=;(e2B1*)**H+KBw{dykfi|y?xf${sTKVJOi5%MQ) zE{6+?&td8r7(wPlP~l`Wcjiv+&fVObdz1)Qco$?o5)DjaCH>zBv zLTbj@qAn7XmIX58c^^P*qEf zW88+E({tK7jnnO5eNI0nxQCkDGd^W7zLlm{1(ubi+OTplq|XYTLk+c-g1y|ZK4oT( zxncUatTT8kI|pfzWVPr~$vW;zm9y?hQON8`=vk-Q*m2zZupS1oSK}1g6+`3Vp&*O06jJ*4(fvEocUmePeSPoIqsKqpoE<)R8r`d^LvDEVRhjTCdM5KK zs?zEpEwll@2RBbwt53`NcGL%sh6JKM#aP!Bc6$c7?F_GmT66$0b*H6KKm%us?ozdd zX_3T%2aX9$%oHinzknGSaC%*}u5qyc#yy>=+YLGK1pR=(b0pk7;*i#BY2h{ST>sFx zul>eb(l_*w9DNzN?WpzJaWhsI>rc$MaZZBQlg4ZOH%{Z@*TVbR0pyi7XlN7ck?#p5 zud3(d)kE0(!~WrOB9P}1-v<^tIvzvAIVg{nE2)4=IdBY|qkb=C+i{%m0tf~P*M$IO zcj#rhl11mK;>jsr${Qg6q*fZY zI8(c5uAeKZ zs%;$4MSm1rj!GZ~H018|_h z%&2?73ku9bsEw2dRqgXWq`<0Fs`3j`wXa*X`yb|YpY|{8(|)IW07`N~2|Y7?Io*9O z-}$;fSzT>t`1_9^{P))fS2gW_=wtC`;pJoe#GgKzJsTg)W)vwR&8~^F54P@15Z0y88`i=uHDs`!)i}8R*RaaroYNuR)4Dbt;iXz zu?Aatp|d7ieX5=6ew($}8rm+fHoJi5I$Iy={zZ0?ZQyHzU1FPfUSj40t#f($Bkv&M zBF<7TP6yeRw;v_BH;#k|hmqLw3Lf_3bm;Z7bPx|GJS@<)=Xw8&J!&1ZTnitGESVHh z5RdbW7p2SMgP7!%t(?bc5ez12p9bx8^s;`Rs(y+o@ZsE&^?j1G_#++CpV&eXX}-=h z-(b3LGWVG_fUcPRwC-E1F14Zi_A|}WdV*I0&6D`DF92vl%z)5#e-u}MB_V0aiJ#M z`K)hCgK8Q*UHnY^gomQg3Vo)X8Y5$-&tT-4$&8uB%oh$qL4!%Hom~z)Y8|I+so4Wj zz=4LMv>5hR+VDy|YEVQtN${OQTWBOBz&C9%$s^8d5K+285T|hw1RcAyM3f9Tt%cXA zSfOGS1$k%?^b^=F2>z`7-!DJi-uqG@JobKe>+appe{-{U`_6;CTX}vvEW*8eSwBqn zcB65=m&bWG#!|v0>E3*NaPUvrUa9L9aCt6=6|ur3k{dvNlvzWi621I48?>Y~H3;N7a?}Gz3WGVLvLJgD{yy!e4#G zMtmLJRdJC9!T?ZL5(IDKOE@Sry=}Ji*LJJ=V6~qCFLpXL8b?zFLD>j`amFSIy*Gp4 z$s|mwmRb<7tRDnYs~otjm8+E<`w`7~zL<{AFQA>%nxtnm@gkSw)-0pdkad0XI{Gv4 zBR`SK{vBRs+8hvmrl06gGE~e=f}|HvJH8D9r2pqIptmS`WQ%u|ppfuD~RvUiNq2_-Jeh?pAP{i&l6KvldW z_OruRvINkRy_z4S#E!|o4UH+!qUeIG9K!QFN||5FlgSVvQ(9!hX&Qw*IqoJ|$h=_; zp!8I`_s$rB9e3e5*Rw z!=9{ylMpUG?7^GQ*GA!A*2eJqgOICDu6DbW_@YX^t?IL@zCW9OSGLloMT{&VRVQdA z)Pbfzh9Py&U~g(?00q3Sk1ozPp6jDp^?hl+ ziFpi+xeQtMOjkXhY0va$#=w-k$UQNhYx6f|kXZqSyE9#T&2viqaQedvHNaOSW9VKN zTX?M=#eSCJwb4IhAL2o|m7a}K?@hmR$YaS{UXuEXuY$|aP$+2mM`??2SGpjtWD5omOmQ zz{)%<_RAV5w|ucOKq>E1tD|NqSAw82DUzg-AD7lBi__8^hdGpiJpVoF-CXn`%3nH| z5+?TRLB``DS(*3Hi@!_7_o@G?0@!hw;!wbG=t#pyNW%+d5LfqC5YV7bQJ7A^z5H4> zDf-zs;y)%S?^8j90HAP_-pK>_52%nz-1uus`U=hB8Vb#DpiNhAssJ}Fgn3(c^rqQH zP1|TY{8RK=W^M8_;w)4tev1Os2w}TZYO~8sOfjc2F}Som6d-U)y`i{ooBt3yC~K9;_y_osN-b^aLwuW>!IH>J!F0&L zoGc<8ga3qDH(+69!b%F+U8V_t70fA6-ag?`=~8wlrs`h|qEw(N!11j*`$b4KWW7?) z%Z8FC9mpcbRv{rtpET*k*GxJN<8*?-;!PA39W7X}ZMd*yL*GD27N&pvXJ}vAlF}xT zMQO|1;AN!oxxVCJ23cxuqShMObLUK22Q@X){>x7$!EjM?ZNv zu}R)mhjUmz(=H>30*=27eOLPDf-_X4)I1Sw;B7^j%CLB3wfpfLO_i#vy-iVNCAPIr8|aewB(nC`lkK{ps-=6TL1?wo7B%}$du>U8~RmU zN+Y+gkhSve>6=Nc?xj?PCwIT_`6ZCjEyxl`AK_!D;Sejq^h}fK?$Zb&VfUA*>A7FA|0v5qe^Ex%<1RJ!oK=p-Z3J^{hoG1aOyA#m2DCcD} z=h-Og7xJEf-$4V$%RFThUqr+Hq+gr{K8AikaSLdza7Hqfkd}+ul4?*7BoqnkYRtdO zF^ih|ya6kjM<2{g0Q~!~3(^#*3T$y|@Y&2BHBX$>EmmhX$P3xSggs!91+97V=-eh( zCUjS~fEChwevGRDyiC{V?0>KTI#JnY)x#g)`}<-W7D9*;C6Tn$Uy(#wF$859;vFS!cdlH+h5S_TIr!MFG=fB@hef8wY*)e?n_{G2Y(JJi?Q!B_sf~%<_qS5?~SdW z2v;6756P92=3(;)uG|%_JZc`3E2qrk=8L#;w~5RXINlTPIBlMkJLbZfr_7h+%)RDm z^9=62&&-jt`icIfLVa;mPOB^YY|F;mix>MLF|uIP;QuSmIc?rC z=Wu+|e9gRz<5TAA<~)vHGCyU$f#cKR$@k0!dGZ-^(Y%i<^Wn-R^G&(3U_LOHab?l0 znGbP%*8H^j2*)M!vH2E`%Vyntf@95GG2h1VjQNhK<{sbOLn>3OqZnz-_UTp`C8 zlgO19!6q{0_?oeo#}CX{MWLGw!B&Rz#b*jXJyCr07PSR&OiKilr#cuIJYh6K&eO9kt^$t95pxI5W{k zFKumyq90Q_7RLAQ`Z~tu&=+EREwMiy*VA`j`qtXH%WL(Es~65)zO;Jw-1;f!puh3BoTBkHE@BRJF4uP9yBYYYSU2Z$h;;qEi@JOBb;Tnqhc5ZsDq@LS) zvlSOWNyjFe>5YX(qc%G$&#!c18@HpnE~nPav(0p?c1bXKNf3EKM|Q|^^Q;Ua8`zcU zb)mK2(N5ak#v%yvj*UB=#C~PX_7Vcf2QU7B zR5>}YMtc+(m9PK!=+=(|3`Q(3fLlv-TLi7bffx z9M(_l#5SwvSv_rcT1{T}pJDWGPU3kk%O>5P%_5UFyHUOwWpO)Mely>=n&59xeqGZ~<}op=iH;i3~a6Ofc+58!$MfAaOYV>>@<7UCRtZ-E9i+fds&mpB5tMK-Kf~kdo4qOfCPxlwbLy~p^BfZgA)bp za!?SW+3g8M@|~;%&RQN7y-p{$ARp$|kuX)1b_-nD+JaufYCzhqP4Sln%fI8+j@v#` zY!!`$=rLu4LTBvsy1)XT+)e^i4krP)5-6)#1Z~vWiaSv|iHn}DExw+om>;k?%0v)E z4BF1KYsoHzvAHc*p-u$dfJAl25|m{(y4r(Y1=-3l_*?4%3Oqz%!Ce^K;TN|QI5?u#DMX$%3-Nc4<#~7&7v3bX)LMa<(MM|1RP#kG)oYLrP zh|;eaNap_CPObyYkKn8d_5+qaQ&WT-KX@D>!+ZaRbxh46~7NU{OWCWwQWSn%K^{F z>dva|imu14UQ#Rx1)TcJ zfnZu(^8W_RZARTh#Y>h1XWO0^=Dr#XJSY0p>y8pzQ{yLXs2B)#oZs2*Yirtpw7MLXYrC2NmxtBAbJaObV3JyAy6@B|dCVUQJ=@s);2izc)r zRG*?7DzIm{GT1rW?RBCz^n7kjV&A06r$$==G7s2$A{P#n99ANzGZ?-IW*THRQ7g>? z&X>gd=mXN(T_J8(8u~2#52en0tyWuz-l#ejGDH6^LPenXakG-3M3N(hZQk1wWvJM~#Ns=x2tCuS14}w9F4LQh zNY(Zd^Z=c&ZhAdw?XD=!m!tjyoQt)UKueR2=c$VhVoHath1)QJbNR%5uxWA~+yRCb zephB5LNG`4;Q$bWqh=S>(Nw@^kx3o8V>hu)V&`E4pSalxBPr*C<*%ewMk#dZ2rZmR0X@%^JJ2357_%}$VxRcJjmJC9rXmLt{SZ$U>2=2saR^d+A1 z$@PgIQ{4hu!5ShUYLgz_6zEh8^fbr_WC0n(UgPK#C8H?t6?Bhk4)Mv#gM?`W7BS8k z{GghMwqvlTczJ>mZxUB&&cU{EcS)Fc$ox6z4Vn(FNhu2d%c`Y>@`bY%EbSd4rAqt| z{diVn+@UeVK8jVxtMcr{zz2HmW_+Mm!HOG!4^G*;@q1x>{rF~T5f3Isuhkvpjl{nM zws66OBU8Euu^NC3Q6ID}?E)pq#mypnTZQ9=%g{w|(7KQi%#G+RTfUe>=_?dVbm1bk zIVIp4s@rabdvWIx3sO8wELO3Nm=!j0Nv$YZut0d!>E?MW@VSHY@D7sl?+7=Ea_@$0 zAqM{hX#X~Sjba5h4|t%5V7GcS@*Q5&e;QC%2$N#3D}M5fg@qs+ zGFt5KI1ilyBiMWR6>=R`;+F@iEF|G;k^D-Di|!>Cfl1`UBmbSnzj7+7hm&QIbQZ&F z31-VG+$6Dc4e5mhys;TWI|+S*8>|T|k$6qKiMmlu#E?$%D8fr{w@L6iCu!w*$8qB4 zN$=ZHc*B*@VR^-y2rD$MkoVpSd5NK4BjqG2J#O#A@8%@F_~CIFX@8TX4P;SQh!W>w zo}uO(%6}V@ClrO&8)DKcYUA@H)-4g9#J067N+jL7g=M}|B03zFOM~$fJg}R^Pi0#% zi7H14dV3NC9V+#YIkp(CH-8(C`P}6F_&rMY_kMWExrg)znmO{(BHPG?<=q^AOA?CL zwh+T0orK5;amsDE3d8NU-CffTfVWbSg73OUTyl(utvO3-`q)%Mx-6t%=7Ji7)28mpiR~p0>hCp9L3{ zAyn7a4y%dW)9=yq@nL$Fo200n2fW`_sQaD}7vbZw0WP**08T}n?H`eqRw?4yx6f*I z^;hKXKP^$`AyS7rjUOKQuVT9Pe!<(VLy$)7jZBt?V4;Gw&w}`%#AWFfCGK-zrR8oy z=@#36iN&a(PT7a?d!(y(o_y%sdsamlh9hAOq3qHr5m!wuwnWsZq|kfr&#SqW!GZuD zgXxBY$6JxgR_9yr&{r;yUJ|+m1Pe;%$17E`VsNLBB1nFpwsN^9>u*-F6B9 zzc@YWO0C_!Tct-2%kGY56Z=z~WvKbR->HstE5k}*R7B|iCXj8`K6(hU?fs5tQ0I4} zxF`8+L|}0#y*EfJrNifmPLB}F9JpjIz*kk-tuS-l^T_Ux0#>H&V_Iqf=%M1Z*@qdTC|F!5VP&nOTvO#k{GF6NP>a4_XAqwdypTM8^`8Pdj@T~}9iz0^<6cg&YRT6k3F9nQwpEL~hS@*n z&gOOm7&6Ge1~A6$6NdpKigpq$@3?uG7|^UZwQ~uODgIrB!H2ZG76$nD5)e-w4v4Tw zhyhh4pm3+4drCkYMZAN=&&|Ma&*)A6SpwrrhXJGJ=x56LnKruPQ!87^@|F)e<*WZ>fHf^;i*!b2`@p&3L} z`^iiVv zpw_gVC$%Q=#Sf3TcEIuaUeMqu2cxBi(s3qmraBa?RBa(ta(y+ zbAO8Ei~UK=Ru#a9hOV3-KNQwIWuL_|N2=;8q8B0*DiXw+ft!3y@Q$o!e0{dF%Ml4- zbuDvYExe;nCXY&sSUSuiUXQktERhC>`8GVj6xGWG2K7K7>L!vk#<*fzodF07^u}m? z2KUB1U4_tlPJWKMWb~d1K#tpG0y%=i;veCG54=KSSI6=uYEGF!brpu2n1`Z4QW{2H z(@n@#^j(HV1GO-yMV1%PSfrgKlw463P~C4U9&2qhchyQu7y1^p$W1NY2!x#@OM$}V zNs&F%jjm;E%G$`$5#i=4sS(8_B0#bvOI-b?9aJwG4WwgvrO`lR+9uZV-5v_PKG*q^ z%SX9r2$=JZcZnmUwkX(hx6yra3(?!-9y9@H(e$k35rAZZ={414D%#85)uhIYlbB$C z+6`FcsR2V%qEdm4j7F~ei8Qq-40 z#jRqG0s~xi7{=|3hkz+Q1E8z9O%IAxjm}Uxo-9N_7E! zui`=ZLQ$zM&nlNTm{tbr_c1t|84P&!!{2Gwb+r#-p~%o4&H**W+n)A+YEv%O<8#ViUiD2hiUGWsfFZ zQjd(zQX)o{zM~jdvn}|cflV9--PE03T+~bgnj{AcX&zW%eHfPESIN5)EC?Eh-xJ6; z$kU>BX?rCCPt6Kw2fK=1LT7o&r8=zM+CtAQyINM@_rYSr$>5!h#ymY@+P@`fC(3#d zJFcIn5X#69J|VGxl*%JD`!jyDQN;3Es2+$lV_!WCvEHf>3xyAW43A!w{q2%XY{>r; zs@Ye7aQkI`-6SFExfRq>^jot-Kf6IqQ{yU3*rK;s#h|pbT&3E_&b3|63Cr`4) z-HZOXn4~IHK6T-t5*cDy)ElG~Og<8#r@do=TxD`2X|g4WQZKUIXb_Z6UH?5HKm3ADk|o1A3QwFkCBclRDzB8Nd%u!$O>fnT*YoP;o+ zXxG-0Wgq#VKZdLGib?tCC6J@aOjYaQf&JM)#%cS;A;`G*BOhbO(lY2;551oV4nYi8 zTZ7`%Jdf`>6fg%9sI=7XaToTS2Q&8D7scn~DRdU1i%do+JyV(TERb_P+sr-t+!13u zMU+=j=>vB!4NO?5$MwqrnMduLhY?PAt2Sq2Cyfz(vSBWwjt#V<8I=6wc#%Tf@8pa+ zDEo;iQz7S#I%Y}BJT-(deE!_82D(ot{ME3S3H#O|I3wPnfIE>ul1W<`bwy6|^oz9U z)q)#Kr%P7B-~B#Ou1t6xDvQ7UP@d^;$J^3p4>kv!*J!#rm1Fio3IJ#T12|}j_l?!g zA}Fn7Z~A`h&_`6z~gc3L0{t!7K?>P4njiOQvhaW)c^4_M%GUd+MXHrHc5DF6Gj zZUJb3*`HXZ4en0=w`uH(REoA-ydBIs_<JLcG9$FLVV z+7oYHAa|U@p(A8xmg9;KG+P@AxbO{| zS{*2j>@@pM3KQz)jitj@2nijm$z5b%#bCL=LJIe4j&510y`dD$&ROgqL<*K02K)&b zXfe&Oi_i@go=yrRbwC-oaoCiq9w0qE4x!qSEzcZQ9+8n?LsDe>Wp7W>qRg~*wPBq* z6kuzR9|6t1!=+u*G6eV(4+DrEn&R#5aM}56{4k|C(}}#ZKh;V$yZc8(nyc*Y{U>g) zK&2GD_*fyPW497|#cI8vv2mN9%~Q3$ndfR2j1{qn(bT`Bhufme>(3*?naeDT90t{u=R ze}t2QNH~9P_a=HE6SJ}sy;yreQ66OfQ?Qb380p(>Y%HPk>v{x=p6uIVPRfg#(9koc zF9MZV(``VJyj*4wQbwoU=pgRLTJb-P{i#KP{q#RU9wh<2y@U}iZAoy}k*Nh{brH}) zwy^_M47sQumxwU0<1*Bgh^ymfw;7|~5?5jrEy~#UK;5A|4UhYjuZXa(m_rvTJ^s1G zG8Zw%NZ0P?y>3yzbD0~#x3KXM`%Si?Banw2euBs+aO#VWCqNZ&w+uN1wt2tJqKpv*227>CSkK=uE{Z&FJq(^slP)1Az+|@>dio z3A7+JUf4_LFS`lwfGS6kR?lKXT(SX&uv}7g^S~mvJz?dq>I0~?l3t8Z&{OgGxiecGs+*z@qpJ|{e3T@ zxn9*(QA$L!_zi2KSqf~MB2QkU=t--C+Yy6g0`}f}^}&ao(84`x^u%EbBdwrtzrE7%&ijA^ zQsXNDw3(=K8`JPb?IOPQ9&GJ_=OlVY-n-yUCEmlJablPcJ2De%;VRIF)LlXjCw|MB zcb#JocBzpMrFwLYs0v0DkB%U;393%lecjlCFBJk&4x5E96GZbHNFgw&*EoW0+3?2b zoC;)8ARBlE0@Yy`t-(ZNOm;*iyVr`f+;PT_>npwo^BMy@@fmiEPGKj#u5*8itCS@A z`fPtmRi5{KWymABH#wXN+&+gF31P&@}L^?SG==(rS;WB#QOTK*K)8Pp*@ zB6BaQaN9!%&7&KnsC}e&UC@Pj`qte-%Ws8YB8ml9%;=ux1|!G={ui%}trX6c1H*)d zf_@b;ObX-C+^+jSQ46Ep0H1fUg{Gek4uggb#K;ZmTtOEVWS}84z$opw@qHFFxStjr zmt_5=ozL)Y7nn1?p#)nfIIVjWM{c*(Ro9|RIl?Kv*hN|`3b$XJ8efeHV_xj~hwa1It56O0@4)tX#C z^QWP}R=nsNIr05B5MQ5hOE0dM3C9%M|5-O2%=ar-fb ztHR);a{nNpN9Mwb&S07G7l232ST}WId3v zz%w+4Y6m$tYHIR|3PeJ zn2j1T^>yskXeRRue9eixR6@#=@JIX`R_N`bAf?Vq+!EM{Nem%{NS_^qhJo^8C#*>} z_yQ=rSbSx~{@EPs{Y0lphdODLYFL6>>~M4#9G*4womT=w9gF==K-Up_1sJ-x zu(Cg0uS0a}b$!dv)~>}p$gK7~VoOJQeMY*T@QM?86Pmm=NnYtAFS3xg7|2F;doOO5 z9jlhR5@qL|HC*~fUyKCky z{F|Gbotfo%9FNaT>3_Imc5ZrZdS+_w-Z`9|o5MA|Iy-l4W_Ior{^IAv%sn$4XL{!N O-2HQp&7F|vkNpoXHMa8H-=g@zWmhG3Ke$}U6IA6? z9`eLWqI}W;~KcDqn7$hBB6%C%H4$On!`S4JE zAv|0^@);v=gYw%(P!5ZmM>ik1W7i)HD)nQ*RQ;i#8ce@!gb!Ub?wIxCK}}l6*b0vy zHtNSicl+URA(%mXA(*{mZhPVJ9dp6hG3$@KaqNwU-jE)_0kls9bHTy4jryaQZ$3DL z`3{9AG1sYZYV)yRAvpXt=lGDcjs!=gby`{v1P@AUF*p`Hgb_X*91kAG^&^27Jc8?) z;6(5!u4ggw$>0=5J|!bB1@>iQ@iG5H*z}5rKNa?SD)!=-q6^8{P|H_gbqPd44zWRtK$ifcN5XUHNgV*Y%=M-3V2* zRH;;+^`kKGaIb|iTYlSX_JYt`Q@xINsTW1wi~h}axP_iC4dVVF#^Ww0jl8($ZNzau zI=8&Mju{85OU+(qc~j5ZY%Sj!aFPA?V7=8{UTybQmpgtGhibVJsV3^U3y^vP)eNKM zo?74Ys(vZbLoCNzee~#HS?%RpQLwxz13&Tj5*n3z#MnhUnekVnUV9LSjaG+ymbgLd zMk@laNv*E{dt+_TZ4&sEMKdXMFGi{IlLKdeI1fz@ zRa8QwZU#o(3QQc9l@wm!dRDLox6zQH8cC(mzqq~E^_KD1sQ>RD>AGR!{*PvjCbxlq+$VB~=kSZ3M6qs+j4yxqignw( zZH>&>*fc@GPHY9Bkk}rXQd)P+HEY56CF{C_jWdUZQ_gHIzBOm*q4;D zN|BWfg}t?w9#8Cc?`Gm`wAMFvH&N9v{ri>k?N$^6|N0lsa7_-1qFFT6F;wzpb2s=z zmOYP(EW3Ie3+58_!er=0QyszcMN1vUB{6SJOeo_%jz_Y?MPpca<7ZAqUrtcDf&(}? zHl>SxGUZ8Bz}2j`4NkdfZd+5!42M(@IPzZ{+7J^dX;#v&KK?T=RFcnmBb%W`k zhHDwjdNw%lwg~~I1;UgT2lc8J0`=)Y*nhni2;;BMq-=jSW%~zGwm%ol;5;5prW-53 z@=LY|%itw5bZH7WZ+&;SRCBXGun76VD8ufXb5+zKOAU@w;}r3s0U6#O_=5s<`*!uDEH zB*RR{nmih?J<5(o<9Q4b&7v?Y5?=*B{cpH12Juq%LX+U~Z;Uce;0C}2md9Wwcg#(D z$257z0g;%j3y|i@Vo_jIOL!r1C?*uSn+B!m_rb*jknmITm;g+yTzw2rUdAuQq&agq zKfX{s#@GpQpX7wdTJ|mzd`>vr-UT{}BrEd((_r zCevIPaig^gVfz|-WGj2{{*~qZa&|_v%$Me&!5vh`Vsks?jBH;7b0Z%VZO9oudnt?u zs_XflNLr64Ni`&f3eoDWd(A-HbBAoM|glG27B zku20tahl?wANX+yM#kf;S2(=Z`Jtj>rBS^W-hyTWG#8?a>XjUdNKZXMp9fUfgjkn_ z>XFtkazq3&z>&$5DYs`W7xkJ|Gi&MH;ltxNao;#&G?XL6MT|?jS;N8O5UdtU`ZO))71@UNpX3qmGCt&~;4X`qFEVa}bNx3Rrln6E2p7$mAH*GDg>6 zl2xluu^6z1M37yFsL^%C-R6rvJw|Y|+zsY6W(E}q(y*aW~oyWB4 zK!3DQx6~_vwOs&h76a%-I~D*f2Bo}ZuNQXA+lA{tGXjNnade>5f_gJ9#W3>kShtJV zkn*S)S4M?9kl5T9%=Pt=qkf3F{xF@(#aw@gd%r7lmGjY^edqc?I+r7J{ZQs|_n%8B zzOpi`z>tW;&e`4|PRz>ifcKo=hvt(^{f(Z!r)z3pT|r|u^GbZR!M0+gz5#V=K%?3XicD` z(W9s-wLV3uhBq2m>u!V7ZDV*a6Qw{91r)ME5}HxEEKqck+jo*C14YK$R;WF z!IQ%P@{CFxNJqrlmrDA;;FH z9axl2-3>kgRoHm;Bx{sfx2^7pxWrcM#^p5&&t6~)_bZTMs8Ip}_n~9qYHdz|dYrqY zI(xf{`_e;b!q~3vkx_+}#J%Z9x7Petdw5DNXFI;S27IL;@MLcyZ_o{I^}}Wy2JNk+ z3{+7~e<{aq;owsnpW_PG9{#=833r8bF>|s|waNYr3eDiOrhBW8>&E{&Id^ z#2fNH!5d00;!OX#(<)15umt58Bma$G;!=)mW%ymd%!Bh z+dpyn3lpnJ2l`V2klGR__dSga-t>hW08(-e05wrfMR4(edcfHi0viHp(@MXSZtRZj#ACL>nL0iIw z)L~*$c@H3gxdZth$2^E%MDMS5+`S8x7D_985VksryV?=)7;99>!F#@#)wSL1o^Sh| z)xf{-H@F|+XADn|liyma>$h9OF#}M)0^+~K(GH`alR0QL;cZC@%{IsgQ$59pd#9zW zO>ic9z#pQO>XNhA+(~Cl){Vd%)DDy>4oG0tKVTuc_j%Sn$wIVnDpGn?LXcP4TxGGz zqRpbi;yQ}~iy;fHa!xT zs8wzCCa$^AAX@VG9DZVglNq&*4%9>#NKk0DVNpUrnsjdxS%;6Dz6gCSgtGuju|)GG zW?RypT{Ec!yB!NjDGdXuuV5;%E+J}t)vX`A^!#%#UAou+nl)a&^wP`EUwY+B;8|Rz z22x(wB})PEU^*$i`q_3O-kWj}yK2=e^;L|J(;=lJw?F_TL&yOY&;(HMTx}V~^wtz; zXWoH?gsxnGr{||e);6rjO>46ROB0&&rV9rkY)}MCAVEOd(7lFJ0Cf%#>=efg_cUKM30?RST-We@ zz@^#t)^a>3@g7^a7kmAOc#J}u=I|r?Eol#F zq@G@RZ?RlIl;YSD5epzSBrvP)aANVn{48r!(qQ)r+e@bD(QIUlPdm&gL!dkeLCL$P z_}V)xzQ$q#7w7j|WQ|ae-y6lMH4Cqfi(e5!L%oZ8Ia(49(B9 z0!$JZ{vC?oG>T6osGL2U#c79AY5gpYIVr$}jWaKy-uL5;#9>LNQm-GA@eiM9LYay~ zPhRIMUKDRZ)TA7a@sqm-zBNeO)4M?wJt zs$si7oK9DxeVD^qwm97uD{=TZ8jPtxHqy~aF}LfDWM0DV;y86c~zQN*` zP$aX`uMrLCs1WG9SFk`&Zg{*Q6f9W|DS&Vk2sJ_5;W){(9wK$N3}1YWP7lb;)ZK&o zUh0k$#;|v&b4YdwDaX6L(XPKJtJ1$>b$g4&x(lC;#766ko#7nlzAcN8?Dg7FQldV9 zgb77cwO&LYgd-5bgiAv~fT>3a?*uZ>YAEQw(*r(AL|#HqI%gg6#n2yPiSp~hIMFSZ zY*qCgOMMG(jG=jMn|u~efT9qwL~__15VZ7lL>Fm2%M)?R!sCG!eSSOU9o%V<`Yt!kEGI<`fckmf`vQuj_+oDzVx~SNXQOeXUc@e9 zU)0;|F|89j;7f;}R3)wo*Wug_6$I|rIgE_;0b7T zf+@_*a97?p-xylw&JC^8iz3a`Ggz1SOx34R!|9g=`Gq73QNP`a6ZkMYy&GXtd6n_Z z=OtJhEPzaITmymP=mx%eu2FX^^tYdf)?Fi7EWVT z`ORw~hR1|{CsHq=&jeK|qWr7eW#)7kupa5SWMrdgEx@9jH>F3D53@fTl~3arQ4z`$ z1UxYdO{56u)Bx;|qy`ky)PQ1|8c<4816;}hNfCf7z_k)U4&XWkS+Ia>H8>m`!F4(~ z8a#k&EqE|EhU-l5P;eaA+2CR9_ao}tScLi&7XK7Qle@(~UddbpHDXlKq!Fsmg0vK5 za?g=cqT{4$&@!mLQG!pwXdv2#vK&{onRq86Z(aNNjYd_H2BsyApeE&vl(PY&Y6nD= z6<4&U#m55F28)md_S;yTORQd`cy37rP6;HNQFqVkkTu9Q=ptK8WLgO+TDk)EOo637 zCok^G0afP>hxRSZSEQi9q=+aRnYK_H(3xzs!3H) zNsG!TIn;!Q9pM1t7=0%aD~mFJ#;;=uvM}`-^bm=21==a!%hKDjcg2k&uZoPc`5a5h~F z7^lwZ$=5-?#-Ff^BdAcCP`=U7Ld;Sm-N?c=!rr#D*8MWNWdT*el6|%ZIZLD=`U#jG z^vhfhk6g!;^UWFSlrM@MiS}Gr^cG$XupGJp)Q3@mC&7FCS6C?SVWEtg*sLKQ^ILfC zsNa`fHhTSHTzD6G0?=pdpR=TnVoIH;kQ ztksJD6=3WJ_%+Q2qyxjzzD&Q-a_)-PoZ*bO9(F^fi_t>{^BVpVxM|@jeNz7VK4pb_TuoI7YxKPmge?q7uc-;`rjE03_EzE*SqF*{4IF1#QB9N z7)%OgEi38}K|Y)?dhPy7S-MVF?qPjOvV)=}F(6XM)E-~gAVMatjPA)OChudSDAl`DPD+Pt|AzNd=}{2PuU?cq`YE$zRDro+1mmfCBl(9~CQJ z{E1)E?_!V@^*boR2cO18G=9{X(S=;q zu#Zk;hZ1sykZiPCNkt=E<0eueMSjp-_I~+1iR4yaUHCrvBDHxKZXz;=Po}IowF}fh zcxa>DV_+7e?z&s@K}0V6zk*!-9#)@1uKqph>OZi^fmOec=3h^Oxj3(UcI&eEcPv&> zBt@!MVW53N4z?&(-{r$0i|?`6WFhed2^55EGFp%v(V0=An^EF4vZPgYm3{sZ3u;g5 zS5fSh_4R7A-9vx9y&~%ClCVd=LcL7xwVQEyKcGC&gQQ zk!}mts9Qor(LrXFJY$BHJWqR~KfG0Qh=(&Wp7n>e`0!7_l3bKhgytr}Ni-lJa`_Ii zCMkJT^Y7Rq-r#fvwmZZ3{AP2|8MMK+=@6lxG22jKm1Iw?K=V=UL(=;v!3}*BQO><6 z2VUSu4@;Ropt&*ccf*_M_{_mIBrK)G^RSW(U*s zbFT_7v8AX9OF8uyb~ZDUF>yCGSId!nYh%q=;Xo=pTD2JSxTZ$kED9`gsr zk7RGRd{u;ku~S*qf0b3qryd|qU=;M(9jfEnZWoI^I)il=HGUyO06nywewPNJyY226 z)QNGwd_?EfR_NkETk>QN>ss-sk=9CSZ3?}SSFl|TT(O-{i>Ehhz>k?7d^*Q(9Wcf$ zwPaim$ar`+8&|Fv6d zN2rXNN_L$FOxYMdcK%b;82JGj_V|-0o>+SPgqOYX$rCcjiBDa~Hx&CXw$)`^qj?mP zvyIPo;2FblkAJpv3C~j@t{y^t(wI7idq=Vp#fLk~`<^Jw+g7x(M>gl57Y&_LOHZwV z5J(^RaD`+M)!j4)gU$-%J>Wvl7%3uO8V^!8P=}oSSG*-2lTy%96iVvXc#D3Aq|l0R zGr?ClNCIoANKu#2qx>hS|J#M0{vt<+QMA>B0a5nk-q-R_{HAsn}&bK*`ZL+_)*{XUJM4R}g) zeh0FTOG_}W=?^VJS~_qp@E;xDmHSxV*l0QHBVOdJkFFTv14##{%P%^?@-iREm+*AB zkeV_uEQo*fKruN6Up`@S+r{bxSnoT3iw`DWuM&rO%kuMi-*krxl_o6IA+ zw@7hn3tCzKW7eorssG602Q2=C#b2=aOBM+WE^QA(-8BlnjRzq`I1v}LU2|P`4rx3E z_f;hAxVYNx!}!_a>Rwz%z5+b3O(ZelOWCynxCSrEI_KVxx{1$ky-A!2Zd zEn%tx=38u%XzH~rHm$=h5|c}+sfd9sxz=M$ItZJZr6xAMDwR(>b^fdHLmOHKJ_TXU z>?w{}UIBB4#~Seqo>{%x&|fY#H{jQ!md3N2g?bm7U&Y@hujNXsK-$pJl;q-f#aC_q_hx_yTbzdI5!l zz=vk3SqYQFMo>gpu4B)a!Fu7ScI`Ry7}zfUSryxzn*EA#wl-g@)DGdmrg3;P{}*61 Bh*SUo literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/logging.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/logging.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..482aad2a22e88964ab4d61eab49d56733d79b0d6 GIT binary patch literal 17878 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/main.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/main.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9bd02c45abad853f3f076cb8b1c916f729b7e92 GIT binary patch literal 17559 zcmb_@dyHIHn%8~Rtw+DxZM*HnPQ~%79d{-1c$19db>jGuWGBE_M{nPh8@eJeN^Ctaska-Ee zK$(W249`%evKnU7@~o!q*-giDOqSV=jF*wC>$!5xdRe*VyqsL~US6&RuOQbEZv

rlpSC*w>u#W+b0&>~9|M4lwT>R5@=} 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 QZhHLmrAiad^N?j&RnyEyC_ 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/nodes.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/nodes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f5470b0d6b92e19a2e898ae1b0d98f1827cbfdb GIT binary patch literal 16932 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/outcomes.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/outcomes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46ccef6772a32225aaf35acede639d951031aa1c GIT binary patch literal 5682 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 S%T=fGB<^O_S#uk!Rp&poJG!s{ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/pastebin.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/pastebin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a71e0ed13f296f8cbbfdcc41bde1124f6045c3e0 GIT binary patch literal 3299 zcma)8O_SS58CFZOBx`KXWHL!efJI~zShLIwA%TLaBt2ZE@$Z)n1!E zjMQX*l$KF1NwbL*Q6ZyJs4`MQskF$WH18F1l$6vjiztc4i7Lf@nq!1KOuJ$$dIi_5 zwxd^*eN|+WQgqVMxR9j|czT%9D!Mh6X!OupiqdY`W-$6CA=GgBU zJ7qIA#945McE>H+SKp?6z4UP+7Q7F4r|YGVqcl&lNDBI7n)j#S=H}8z?T!jAbWN3o z6goIJd$e1@wUcDo^o|laH~SZS27}o$?RDRb-^xY#zngA*+8>EBIZUMX60<4oavYrY zx#%U644v+v!1*Zc4n#I?+i}nrWnUJPaU6CM&WkY}McdZiIFUF^T{AELYRPq+!xv8< z?(F>vX0`Xr2OoU!v)|v^di4I|y$9p*qohpseo=IjZ10H}jrYdscr(pa3D-Ao9ULD1 zxR~788=p`V_d1Jqx$~{@iC(L0uU#N?D*C3yLgq62{O>Wj0qc`Ci~UlbWQhEE;0UVktv?L@$Ue0`Wj))#H#oIt zHrYFY39h#*2^V^88R06xLQb8dclXcTApDRUUqw;hNA-futRArQC&sK2Xe!yzerC(- zz?EZgMUKLinRSK{=2Q0Wv^FVwn?FKOL*SLpGVcoQsPtIZOL1Iw%9F9sp2)idr)Fn) zoIRjO*N$Xb3dE5q?HwE?vacwp-6HR$eH|1THv>#mrJ__uh9gEH zxEZAB)E?DN9cJZUfu)vtWHDmpWq$RhN;!&zw`2H%@EF`P$5x zxzE@<;LS6}TQ3n=pa2{(5BciMLrmAs*qMFm&wM%O7ckzRH~9J)nBy{JfM1+>SE#ii z2^-VDgb{uZ&7rC&iEyqJdq)#wcK^$yjtCh63(b@roK`9FQtd3pFQ21CMTQ=tD*t)3 zPvlxnlA@f*9CHu|(u{H-s_8sh&Nl-M0(aZ?D+fnv9>5VkCKY3m>pD8s;%z2>fDveZ zNCWSnihTrhP~^8E6s8l`ZXE$@P+ZsWQ7se4LdKpr9;fnTx;`k&vD(?*eyv}+mZ)x; zwiz@E>M^}AkfL|*`nF7tw%^%1dbfRj!GP27rrK76;%NJ(dPPYyZS5x<;;P0)uEb8% zZfYA+>ZlW?8;4LQNLYvN2-?FQvUK0LZ=Bby%CaTJClgY}#^Sk>yQ{Q60;cwqNMv`Q zJuYZJ@&b(QKnKeMl=o;T9ZR(?>18rf+QE7{So)^f=#5N}-@}xer@)~K!%sK^qftK6@PyPcM z1Bv4G1>)jf!rQhzkPn{oNUY-qOT!{>#8*jPu-_h{+4T%D+i%GW}rI|o;`2O zi0a&rt=#^#MR%ZKlfG;2bv6>lnYU&&LzuPU>U@n-rMxino-y@#x&8-MA{{`6K33Y` z!OWfclqNL(llPuhdRO1A_>fXvwo(0mWccde_~9;~16ATS*H4RS{icdGH}8WF+n3_j z;58%)Ss7}ySsbj1E*gB1lk@KQS?)sJncC?QPJ{o@S`>MIL2UVgfx zCZiEl_+yM!H&9t5nLwcnQf>f`gv}OPV;*Y&uVe#7Kf$>6s`jBEMHd1Rc5s&l^N3DI z(iKP=S|OEP!ruv+8<&E$;OqYZI<|tP literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/pathlib.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/pathlib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e2b2e2888172ba24c9e83fb4ca4dbdbb922e749 GIT binary patch literal 7735 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/pytester.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/pytester.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f785e277181836c7c80a6bbba9596c240ed49163 GIT binary patch literal 47534 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 aaSuO2u6%T=GBwHX8#B?rmCD%E^#23Y6iQP7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/python.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/python.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b101d4dd2ac67c8f5d2fdfeefe27a1c51927a7f GIT binary patch literal 41943 zcmdVD3y@sbdEeRZ>FIf3FnAIK$>swD1_Fjpi4;Uppzt6ekt2v0kyP{1Xw2;adeGA| zIJZH}G<#%8pe#@c6f5^;;r)T%3g0)RZeWD;yBK3;%wrM*R@sFX03hX zu^Zc3)o#4M|99@a-8}$hyDGI+J3!yQeeSvEp7WjWeDCkvk4{XKQvChWV}JkEo4=7t z{hofre+5pC^9lcTCY1_Ol~j-pGR^dIrjl9CRyVCCTQp~|7U~o@R=KEN1Z*U*q zAF`VFQ}cn~fYp2|crAD^IQVwD^5JJw!J%O0?Nl&RfBJg1@)3R?4&KM__tihb@8kSF z5*+3C(faZFo~385=PDniY&Lj^vWF-+QU54qCnL`$P5PT>luqp9((A?+@2MX3zL| z@O1DIT6#V>9z4VM3)J{%aDo~qtnYLDJ{g?i_o@2srBBet+2C~WEHytFJQtkd`^Dg6 z!N>VN7rYTXAG|>C=7YK56O?=^I2(MD@0WrXgL8bp9Lxuw;`^20rQl`0KTX@O1fQnu zPt%({OBH)UzVa&NmEcv%U#-8&6JHCm=TbA(&Iik9*V~s?TIF^aHV;*U9UElS65uSR}30& zHbN@(CRbgf)vm@j&CR5Hg`ghPTW!w9PM>>jW##f&x3ad*&*CM1&_a{*sl`UKU3b;C zt1Z+o)D|x5`eI|Pebv=N&hxF6z)ng*ebv<$YVCS3Gu0cR_sv=u_DYQ~er9jH5mqnO zTXk1!uejbsEnH|cs`YT8wptH*r58^J>W!b9fAP%Rv-aa$uQ<2Ts?V>l z)_aAyPt2b?HQ$@KSZ`Ndz1Fnx^v3wP7&aTNdTXUO9@ZA?Jf>Z1w_UGjze3JbskuV` z1dUw1b#=M7OU(rJ#oEtF78{J?xEA+*nqx8DDO()@TCSDFDz47lFib&0Vg$ zus5x{ueMf!Nj)7^9ct?Xv5=fI-e zT+#?6)Ee2rclaQOF1NMQ?M#rqp1zT~p1GOcu$wQBy8F86C6F*k(L`phQdqTa&g2Xh zt2GCj^hOx3!L(G3(5qVQWmhgNF~D3{Z!Y$7!Ue%haQvCn4?cC`*lV8(fz@j-JoD_c zXFl`D?8#H-UVCPB^<=GGd+m89qxsr=eR=h@)yC@4Mk{RBn$4q+Tz>P-53XE&{59W) z*Q(JsU#yMU)%9MMjy$G8iCv`9JJZE<=g!r2dQx3=E30+aUY~tRQ{4=oo~3T*DSvPI zKv0)LP{W^|H`zW|qqk5U#EIi%9#`Am8|;~wICXsUGe1fOt|gQhA- z`w3cN-h*tA3-UoB7zv8+7SbuED;>eoFL)l)+?ug3tjD2tlcm;RECxUzQ97B@wTm^j4Qf_uiM~}t? z!OmGYEGCwI$TF`(Ij+`Om6uko#kEd%8v0qTy~*0DU1-+J@fBztWQ&QouwGtmUcK08 zm20c3^%`q$p#U0FL$ZlT|yIlF71wW+wXF>hixYVYKqvb~s97_(ch)3c!8dS~M3QP0V?EYw3M0%Q|3ldTjXG8f&-)z!*qEeKXt#bPQ2P8+QTx?CKNzJD$TX+Polnzpc$PydT}tQDndDzF+y7O}#OLu@AswIP2G62<3bf)x zUJ{xkULzJ^H0KB>P>a-3+UIjQv={@!H?HH!cX@Bl_6Oy zth5#z7q<>|M>N!hSiwQ&*;5POUvid49=LQ{BIF zBS*I2tPo#$FkVez`_iAG{RSJCDEh@J9I(9Od9! zk8B()OHzQMt=5|i_o7JC)h48^UOt#K(WxIi4Zuc#j0CJ+zwr*7)ELT4sW(EKUYv;+ zh}#bwdIgsEat$%BYN8AL7%6NKtTPN8Z%A;9#1;1(H@GM4uFKa%qGs~FB7>@_$;w0x z5h(6y2o00)lwA%l_6oj%t#i36n#)L@gUo}(VVCy9Ne-!O3G5wbKKH|*-8o8<`4r;h z_}F}E9G=?+%#wJPIA4&}xnWvvt~U~mq4vAnIsm#u48!Qs5$ONLH*3wSNTSEeF#cw_ zHY_BUmyz)rtB^iKJILB9vZ>|-1`{+E5$lj})X3FkPC^wU;I?M_?Uo~M2a9Rd>wysm zX0ld}>AZh@xv{8wJhcR#3ysBwsHj*I;)Ib=(bWEZi1rY6af%<>LehV0dbWIOt%iVJ zKUO|I2#|w3`;mi3%CA0h%GV6x#3x0|+SgVLHukXgCAdI+VFg(nMr0%~#;qgP zQ)97e?!%85HLkT*xW{>(W#x~~hV^>+QoFqx9((8^#30D4(X!bUck!Wm>!BuXhwX<3 zIyif&z1%b|vW#c|m={;9@wy*PINSN=04t68y@veAk(h((*P}11z$5L?&lKDN zn(j?k8{vAR-b5{oQK6TYUKFD7#X{Y9EEZ|*dPS}pLPAVRtLv%-(OIsHYvSWZ+$*$R zDXPdC%W~WbsOgBD_%^Cq!avSk;WUR-2Hu9uT!5NPrl+7Q?sZBR#J%(<00~e=Pv$u> zAZ5ClAbmOG&PrC^gn!*khaYIe5%`_k%tLLUG8fZ(P=vw{h|*ZSg6eH#yIHsaB|+}p zOr#d&=Q>&N+kKD+bjDDDpt98}B~pJRRv4d`K3(i(>uU&_VI3NSvWW_;%2sEWj?m=x z!limx<%fxBhC96iVgwa?<9tg4MVm}yt zN+f=5)jj=-{0#kLI)`pMVSW8Fxrs+*Yb~(B+C^E6=Qh#}?P+?DTj22R_z|g${T_n1 zU~R~JHzz`7Lu3=oy6Nj6q{K0Q#`+yb#%!;6p%&J)D0?Gku}#!2VmEogql@pGM;9A- zGJ3bjqyB4k$}834-c|-x8WT!ga}uQ8g8HUEsjI50!GyohAxOOh?Lp|mGy&Dg1u5(b z`!o*-l$q;k_dHaKMadjx+;=(8nu43>j$Ah{N)}|^Wl=)QzRuNrT(ezZA!lg;>ee1n zOW{wqN7_Z5+4-o>UdwD0Hb&Z|rLp#Skn3U^xsF++J<%;(Pj^Rx{GJrzA1ZO{DQgck z`g+!Vw>_zQ-LJQ|#n0c!wWiurJbybS2qf3jj72@nsb_{&qjSCd3E8$lAuT*fUm|tY zYUd#=2e8T5pin;GkoFd8FpqMhT{e>gQbsu@jI-Y}89Il61F6tN6=grWxZ>7jV{7_Z zEJTJa9%F={IzKaADM2H!fQ3jkPSSI440RJS;f-$FWdB;YivGQ91(k6G#f5rwLvPa8 zjl1FQrvW#i!%iJ`sl6gHqD)j_Z$f8P7DlrHad-FXY8H!{lbqKZeKs-Z<+N&h6Eg9| zO@|P}(THxXIBy>juc?fzTx~C`fTLLk;T%Qonht9^45Mc6j@wc|@tI$yb~wwyvk26O z42%NQ-3hxG&vArhWKf6TwCTyrIBaAxGnIB<;En{7h0&Ua6MRCEx`=jIH!$^_qNtaJ z)%QjsZnw3A`=SntFhkQ#SCFbuZ3N#{qsFMxPP~7CPx7bo<9xygIMh=WFt(DZvo0{q z=lBNuDtW%Md=~(NAHkM2PDv3<)Fj`dUxfEmN(_9e zSF(Y>&{%7<<`Z6^hw8IU5BA*2)Yr@sbf%jzDMvO{qg8JU0Zx4ge3dHyPS5aD+1b(W%xv6J0u9y4^Esg#M8eH-o7zapiuX3+ zn{-vP+UCt>TNt+43I(Mvg->%(Rc=o~{k*NV=#D|1kp6O9sb(Y#E@f3Fp$6K98hafs zC=(&$&dl|4Rq$n|Xp6izBErCL_chw?O;(?I{`pV5Tz%o07e9XL#dEzeOlPsa*eifv z7*(7GVDcfHO^~wl0W>iqMsAUI|A4EJY-=kmTS!l*JNpMf#gqG-Q@0GUJ;BWeUgAUq zxf(A;D6Kji^`MtGx%<{W;3xTG^&y(1_kJ=JJA1FTg1T$2OJ899%I`w=WP?k)qyAz4 z319B7>0p@9M+cFxf6pgkmc>#r+nF35XM&<4EkaSl2FY9AQUQW8abo5|&YY*gCda99 zulT1uz_&d7uW%g`a5Bv4fd@y^dpaR*V$(t>d-|6+0eQrr#i&7|bm}6^dhMld7G+^> zBadK_Z__Jx_{zR+ekr$6u#!9_Z?p?bBb&u;0l7JSM{1+cMS|*P+-u$3=BP^3sk5p6 z`IUXB8ae-rAhTH#1Kk+uj%VWf1;KfN;1Xe~6a29XHf%loJ1q5JL79gLsTONU#q zrYD|F8ye)O=I=i0reIjIdP&|AlPaO#(-Pzo4+o`1-bAT9&B}m28AGVkZ8TC; ztil~oC_}%ZR4{kEo5g*V{XzzmLdrw_8gGvx+e)I#$}G280$qieIkgjBYL9(BEp4`& zUzFPv^Uy8?34mH%SV6IIVcW|~ogBK^!uS4|znO7QwC<;i?k0y`7GEer%zB9EWo$5X ze@^8R<&eAJm_=w`C>w}}-_Pjkd6IG1Tmu6k{#hui^FE zD`B<9$ziq+L0fD~^2>O-l$m70$I}HbsSHnj|E`(L{OOr7WAfH(_vdNAeO(9fDL+Bo{F}*gmYD@4Vbsd>4$}BLr?`_fZ%_DGFm4i^3SjgI&z@ z?%vqh^%Gu$MVi%v^{4Ly2_*`P!Udq9(U{Df`w(UD^}G98xA``zE3PW_vg+;EF?Tye z?X3%UQsS&+C+`a<-XbBs`v$r+J6!GdJ&ZVj76>X$kiA?K5_c|^pGV0u%b3*WSky1e z4%@hZNB;<3i^jqwDG?}Q&4%}pQMXi%{*Jd+!uo7`Wu+O;dI3K+@U6I{l3Qndr?E9T zpw&Vv=OR7DHZQe20YT)JviWgmD>;YcGGdpro&0cjvs$Jm~S)1r4RI{lRn_= z9qhxFdI{&t@_+;{BoGTPQ0da)PR@iMX?GH`lJ@+rjne4n1OldWiQn0kkGAuha5{Ki zN;4J2)}Y*+3u*JTD29wx)hc55e?^J=B^_>Zz~_m-ys_ZjSO#x5s`4q(TW^f?hV4iO z^$Yhlz;H6FKO+DLpz?T^GUzwy$!uo`|Ay7NAxH=sC-{WY@M1`;PREb{2aQ+A0$?Nf z6T8%*<_iOJ0<%cgW`uq=Gf6Kr7kNI`i?f`peN61a&jixPF_C`^1X<>#EYoDb`Q<|R zB+9@4MiIYUaFcEMbyP3oh~GMwx-yBUCeH{8oiM?3%xepmvEvU~p@d9{@ky)9J0)Wm z=TV5Yta0)HV$ltfwr~a@en<|%r*##BISgPnxjNrVAO1o5Bkm^{(rE;_Q+&ICgZ$r; z35h!Bn6*$( z4BO!U8=QDK!Q*^5eG$<+D#hB&kG`Ce!P#WU zOXi6?zmZ?7V5Z4$7H?vL;hv9q(@eKuv$u9-QS;g@JS8kdZtRZS%xo09MXfLQwJVG5 zQn%P1fzkg|w@4rG$8C;vi;^y{EWVt&GB2re2@{X>NK87EccmDQ%o$~y*Ln;Z3s`28 zfdfMmz)iIf`4#%#M70Rgk~+9KGxt4l5s0GLB)lRgwWqIXR;ZZj z92lI3$js4KaN_zjn7v$IpPBGN{sHbJKB^_pMB9wM%Lo(3fF*;vzpKONR4K1+5RYUQ zU+dCMUHgWviocPw~VwXBaL9$(NNX7l!mc$a2Rowp>ZU%Ynod`x$rhiOU(r7 zcO{5sFfq96T8E6~dYj)FHLRof2(1+9RJhn2OPznR@AB8iW5 zi_|RXE~YHMG0I{uwa54+HSzP^(&jkMk_jzPO7m9w4J*aOeZ^7MPGJGwL-{;Teo^{vQ4&&safns4vegnf6VaB2+2&0SJr z*Pc>+h|QxL5}U^g#+QM2g29q5eoWkV%%*u zwd&nJQER_t%|IBgt+*iUjjy-{@lM`IH?zmxr#fce6T$E%(z|q4(|y}wH{5cqh2hxs zrsMvcOacIUlYK$Md+T0^-2I+Ool$E>ax^eQ)k?{P8JQMq#7jX{+*^8F!GxU905}I`#cvvua)#sP6)Vz zSWSv-pm+CaWs~O! zRZt+Z=1$m8@bM6%74bU3CoFRCjFwiBEz`a2QPik33a@mtmP~;jCeco+>n~{VYAluR zOuk?$`fOy}8hV~atxve01H=TX?0vnEqb%eO@9t*)rkFf^DA?L@|AMN-y(uVbkdH;SfH zx}0)<2kYO|=JxjV&2%?kozgG&n;fHlv;a^=~R zpW?}drQJ(=E|=eLdL7A~JsIP?|L+n2gmJ(H5&OT`pp;QaI4YQ@ziaq6;!i$M3BK9W2 zj_Cg9&dkjp!_cXqaCCj_R5cWqYPI}OSw<_n+t%4bgbK-fSSw#`HLl=RkA1tgD%V%8 z`T*2uP?04|7|7r!POUA}Ef(>NLN!J(ie5mWH~FgbD`tTj1n?S4k^=7|8WjGSX=q;OQGB{N-%y^bcj_a=N8cO<4%w$X^@ zkhny{*2u)}KB5O^DeI;EsNDaqM_9jYZ1P~UWC>QQwl56uOk295KUn=3Kk`&#NeJ?H>b+eeXMWy`}MCT2~CrRg>i^_6I*{C}YP2{?0o;joQ zbCoenai3cC{ll`PjGzdFl}Rwuoy2z+UEQYNf%)=0jI+Hv#5=2N5D}t0?cTVK8J&9L zh;$e|EOW)hs>=V#@Z7)GVVFTfR@KD66~HB*NW}7bp*LLXS7$r|rBy{w9Tt;7>esfqc!BbIiQQ!Y<;u`e?dVLH$Z*U?x5W5lnMr0rG+MM%vKLJn1 z-6xys+TE;}917e{l-D$lBGk)w)9$dYT{(=+$6AQ)#vY4PoX9*@huQt)<xwmkN6S(Tbiou5KWL#vrp#2%63NTORAo5 zlg1MVNE02R4v{#6t6~t9Dw);g%JlMja__R2L@Hxm#1WwidwGjz+yWt+mYo8Qp;%TP zPY8Bqk~54lUYt-8m!4@2B*4iI0_Ot;9HE&ZNn}d$iNfXiEbs{*h6=1b=~^gQN<^r?rw3hGE z=%)O*EPet2JmO|CsR0b27-?B*KxBZ7R8*k(H)Bg@Te>`xf)Iom$g) z6P3)NkcF?24mkpPrn`wFof_YBZU~$CrBo7e)w@}GkSakmoIG>)`Yo=dM@(s~!t!}FZqzN<> z9cXjxen4gS%Q_g{FZhLKMBe>BD*j0w{#XaipE)FqN#gacw~3%(!rPANNx2nW|C=1J zH;2$S!dQdAk?5C-g)`xIWmGDWB9<>z#w>KoFLE+qE@K6X(#5bmBMVka{jy$qZR?Vk z4t+#OILk>YzZ=PHHx?Mt!YO380#aKpy*r)B;N`+%V`)v9yYYEpr`;AKY_zagz5LxG zUwB8j4bK*@M&nno9zM_^TOWs2CKmr6sAfJk$WW;`R-7!3;Pcj%#O^9`EXt!#_!5U3 z_z{S79lwFX+D*MB7?F~9(UM3$`U9MU3hNVlQfDp+hiMVVsU6lG~vXv2KE;LN^XD(E5b^KMpO3Wle#WmKQT+nK;U*Of@YYnn4 zE~uO+37>E>@L21ICEn>?Ss864w54!l+GyJo1|KDLeQ|}rFF(jRTagP)V)7@txPy<`uWl$!T9c8U>!S>DQ60yGvrQXeT3BjK~Gn0-yNdDf#wBI7iTTLZN>S1?NmFBDTo zV0QZ&DV-5Yz|-$%U}oud-{Fjc11c~&n-jqMxZpuJ1u!oOgp!U@d0CL1%5Fid<6I8Q z91?v*nn+}xjYDGt@%9n3_jm5Pof$SVgl{pt=4tkX+HY})R7wjmiCnu1HzcaceE`0N zVHBsjICWle^5W9w{uLKjok~;(tz~N+t`JSnBvUsSc{g)W%cB@MUppV&68~-n7&9Ah z35A!5t%l{x$KcAfPC)rp3D%uw{;X}Z>esNG4K!iFex1yr8L(ZmW||JXOc5_$-BmuN z9_{{H72T_Y^wVB}a+))rM`QxtI@#hMS2fvpb7Edn){276iPy`@vCu#7Oq@`f02UQf zE)v0tyG^jl@@-*LZOA_M0+>c*L%^-8$Q10Vh*!FHohfQ(trk{;>)Ch2c9dZ8N;@MO z#qabc7XCgf8L%DnWIMoIU=!i31!f(v-?t#CQ9p^PH`J?`{s9eJ1)hlXMllxn_698Y zMo&ck{-WT+cdB!jhk!l*b_CDXiEsH%>ieblhn&SiEPLvBc1^(@IyceQo+MMjm-M75 zPP`2Qx`i+y`qdd5c(N@2!}bUFeQxn)2eUXB`R*UAeWxmFU(4D|4ZCbr4na(FsK4-G z4!2v@xAVG~w`D{N$58cjf*B03FYs#)Sb(T9vH!w*8Vy|Uft|9Z{J8qeNAmsDnJ6pZ zKdSS@eV4|)$K*>o)0&7n#Mf;+CO@GriE(Jb40LMi$`~5IrWJBSs0PLoDL$SPg9sYs z4}n5&j5RESt)BdB0rQMmpW1tGtumwB5t_RptOkCV2#QV0&5)_HYX_z7)d`-`h z$^@q5ix{PBYHz`n-un|btnjBA%HC+`q z@>elc1iJbSo*ZX;U+<1MTO|et#6D8g+Y5Qb`@{U+5#H7f1ex$9+rKC{me1vGOTV zifI=NKoZFOq;3u;dd0?y{TZ5 z)KXC*h1vN?&08vEP;{8|^wOB@P)mf1kQ_+#k16GO6!kZ|1(nJaFj%%Z(VnCoRQK@B zZeHJ;6Chr?Iu<>3Tae@K?+{Qz+ob#DFX!BM*2?-Nv#x@>P|hbU>tK7}W5~W0spg|| zaYl)h+aAFiN#HnhZDqOIRpgPs$7NF!+_!Z0KXI6u_DFC_1t&RFMi;L(NyH;%!2Pc( z{NGfVJ0TB^4CJ1{sZpo+diOnD&MsVSyMLoH!M8WkzF^MEUY4{!!$?ertFCH=ks{uc z6UHJra^|Jk(qak4Aljs>mj~_L`WDncy|B=Xq}s0uP0Bo8F{RVcX0qfAU8DejCYe%} zm32~9y+23N!-3=gnx#mjiBJ=gHco25FpXbY4=QJzs9;#HPJQ%f$7cNU& zU9sWzUR^EtCs+epfi-UMk8b>zf>eoC6)onKqt3ozm<(3;w$?3N#bgexPWOPY;6WV{ zhT_k}8Qh&*_-Q@Q*hz+*#(l+IRyxE^sF6C($3h?a>||@?J>V?3&r&ZT{ThZoC-{W_ z3kOBxHB-w-n`ucL-lB}H-hL4zCT9gE;N~D!?Z4-Ga`d2+_Yz0xwVO7UDYy=(2dx z_QdAo&D39D7e`v$wlS)e{K?ddDWU{2n*^0{KLKIH9u(irsqa^gncsj!-X)?KxJ#JD zx(B+FRuo3qxd(TDwB-R>W2pX z$?E*6bMxm2`w_D+n7DtWv)|y*OE=tvko1s#}Ks0p)(TGC8T@iBfH){jQ*YNeOV$aicy ze{8CGOfXQ63QJDl?`5UKZ|TS$uJ7K`5tS{dU-2K;Q^)y)&vAHfk{S#pGu20YIul9S z#VDa^G|FEt1>2xGQ@zm>OyfBsKOaqmDvev86MCG&7UbKh5>78==c0~~TaFgQR#oIK zo?|P46mwp*^U)|*odv9@RNH9<_%zsGi&T7VJXTu{om6_F$d&D+h#Y17*{NM7D+~mC zl;BIkHQ5w1FUuKuag7$?pWt=mO|s^r5xZ?mLMAx&3ME z0=JESl@lSL3?1fC@@WS?=u6wRn1EnJJoYx3W&mj)v1|CAAn@s>qWv;akJx46mf8Iw zT`h4&B(VvO_;sp$m=@fj6YdH6GXT26)ztus>^`XC59{y^y5^qN*;6`vPCuX2*)bhH z#36!EFSBq<#wTLh>iQu;$j3>@#S#BglmwFZWFJPVJcJ(!d_kU3&LdBw{yxV&4xCS6% zAt|wQPrt*rtvxgXNia6UPja%Zd0-sMxgaPoO*kUqfci%{S)!PYk0|vj5))z9ulVp6 zW-4!^=oLR+U-v9dkT=908k7;yY8>M>4ka)s*OCbsK+?EkLY#O;Y9t=Q zUQUAaCLM3nS$14SX1xykxhZ7I%>5vJlwSTMm55`it-2rK%**#e7X%LDu)}?Gze}a# z>Xw#6D$^P71Gf<@2zvUH*dPvQkZf|Y_Ayoq-0FG;1?MS5u;K>TPAZjQKKM~247Ai8 zl?LA}T_^VasT7g?=oRuDRebL|mJR)%!1?X@c2s5RhWogFDr0b9 z{%kdv%qTj%Up<(lE`)K6VE0_HNNiWhX!HWb$shGn$N7Yki27_AU&@sEQQ19(3}S6A z!u~1m8QGPokJd*Qv)U||dL>1MpxOURnyekAH|8pOAxfBte4{um2zwoNa2}I2=2#T{ ziTloL2Yx%m@>6karNUQ~`ayWF)P^nfo<3hzg~au`Ue?~UvgKjMRGL`1HXO_vhoQ!g zi*%9N0vr0-4tSBP%hVV}^dyOkau2hh*eP*fYdmdtD6g#C6{_G}``Ra!;noZi){=%Q zx!>#JmL(av&4yy*G(RUaKW}i5RNls}81DBj4TXJO)~_5(LoyG+UXpFdFtV69w%|-v z&2Yr`7bOZfn1ilM^4W$_i5;4%+arEgne3;$ys*Ls<2$GbBpY|3j7y87{TLVl5oX&FyEz_DTSNKikrjS$9x7Oo8(@RWri6Kr987y!iX@o z7Ercr^(VE<*7fv75!$mG<8U;R4b%oKRb@}omkBi)vlj6-9zu^cPc%)3xKs&GO`qsG$fv zq<9RHQc5H8$}{@Ay!tZV+T87$!H^_kD{9|h%UER^BrPqolbgaK`pwN9HJF7*hMMy9 zx=t<$yVqi?I9hMkwV!R$s(NHSF|2K1y#j^AU%;lJmZGt3g@24pw}9WKR5N;k?I-Fr zHqL#e5HA{nnddH1D@(0^i#{GHmWf2cuKj{42= zJ0&Q@Amo0hk*=^9wA!@kY+M&a@NOh6aj>D;9BLJ?NBo{?c6D-aNb4|(O3e&|FljR4 z0YeQXyfYNhVfC>T33Z5R0z8-L@2_oJ>sY)K`Y_a(rvyeO40Il=qm@nTj4s)QPz2?6 z%Nr(kESaQeJyRAf%mpB=_$kldm zZt)9~Bpx23NG=h~h^Vq!1C29U9Sc_Xh^XceROGNBM}#oRCfhB?vQeO$y|WOYfD)d> z#Nld+HM(Vx@#v3emZE*T+sb=Vzmg^n)yiTJQy>U$z$x%O1hk7D<4hPB=Vaq9lnE*Uga_Iu%Ui=1`Gua)}cU+g=jR9j38Dj zDn;tF=6Fcv?vF2WJ`j;3rT0-&b%_WbKO2wbT%Ekd%8s~W%BPlDl{HKXt@{;(yUyMS zaN1$=(2Th(M8n?NP{JdxxZrIhd*uW78EDZ^Lw62&ureMO%gE>ERWxOK^+1~@5PL~g zf@^Ot$=$7Ba9_)yYTb7)N*dl@1sxi)npGQ%RfC4)V2eQvxmiL=^Ub=I8RB?*IXxV_ z0)kpnnU~c~);81JAs*qL)!`W(KCZ(*qF3HHC%ePUc5hiR^Mb-1J$7nKOE3Ab*_W~p ze3u0U8#mik$1o4s&YKSV`+V=*8R}Jv$cv%`q2-&qk6D@Bh6YfHqCg?V6$PAFMR@6e zdTW~PbM$c|i%_rpjnsqWePHKTxR^X5es^vqH>$SoD z%q>k>56{M^4EcDy-(d6*6Ko*5(O4mv9@Tj@g?yDE&rz`L`SbA@Z`0#5?3e;IuP;aa z)=!gS`ndus;zbnN*Dsz0HZXh|>NtSQPfP zEi;RqAIXPkEmA70|HDx!+k#ShR)k8MH^{f^K0A1g*S(1798nAz**hby-NsVkvyb%Z z7GCp`#r^tX9)+h^%Sbcpn(-(elGCp36vK*^=zjm9#zxf=iJ1yT7p+y;DILOz; z5wl-!0chi;GWu|dx*6(T2y!h&n-*H^_2gFLU$juL7O+Pmd?an)cCo0^n&Ji$EIXl` zUm+JlUyNK{ak@|!no1jCC9k8@*h?c5Mhc(u!e(>*p?JYG*Z+UEXluOCs{B$CMP#ZR z6D!$XHUve&4QN=M6A>QABo3hQO3q-tEJYcpnT5qmNQT+QbSnmyj_1Gfg4>L-Nf{S|RjSCgeeW{upE=8SY&7M1N$hx$s3 zyPy_qr5sY-EmrzhxH_JTmrK#_(i|_7f`v>@+ZGfomjnIf5<&8ITGEgwQta~tpYYc? z+_GODMtuB=56Vs6W>;>`3UZ^E1U|oZ$d=MRV~?2PSxS$$3By*Toia$SJpOX3m4h8? z*E%uYOYPABS1&DO+9iH>kkT>cvph4T|=dXg=qb!!1H6v#D3$p>&vSo4q`_Dg9n^2 z{gE51j>DE^`r-`PV4#!60B-3i@7{$%uyssAX&@5O_GoQPRT3z?c4PO~*Vwy3YYuzy zr?LM>?9HsuEP`^aPfB@wy!tt{K^5Hi+3j)^MUt>WpX8 zt(sf+h8h1NMH$j>F_ti?TbN|95s`g>9;9|o**-nW5!dd03Y_vOs@g0}d|S?3Mm~4ND@4e=DNYASWrviMIQ(1;ZWdM=B^l;8iG@k5niSBfqcoVzFGj zt9X|M4bGQk;S$fEL6q`+Lokd-HQ7@+Oi@y>BJ zbkvx8omPnPTjDk!r(KG=j#xu26aN$B{Xyv|nJ@Idgr_fQbqPNeuGu;AUPj)*tj+jV z6Sh!FUeX$=>u^(#|C|mcX^AlOa`FYbe?Vcc7`>7sAdy8qs%!%#24g2o6tku(`tg@V?M0Tyi7mlHBO0$sS=Us+P_E?goyO< zEZfY8l4Pu25=Bu`RX!*9gd%qA($FPpys)m+C0lcdQ57N>Q$#Sf*wBy&gw9iFDvD>3 zWkcIpXEq5FR1yR+cOy45Po%6gYu~xe94p?^q|zw`fYJKMXGW4u4-2l#`e$23_NvK~ z3720Q!McHVgrJurgAS7`rK9Ikig9gYaCP6JK0S*{cn4aWXqiPt!T%aNsr0W*QPNZ0 zrR`RG+LDO>(At?^+QHR7OzN{m<@NMe(qXC1rj9yu``f#_P?PH!ozn(lo!*>=aTihW zIB(?RqE22CEgC%1w4oUV}n~O+#=6^v8j(e?j#;A}) zcUgx!IP`L-usGUV+x$z{&QORhlXOQ8i#1nM8^5BPtg}C@v;RW}GwF>eUJNh9R^C~l zOv<>BUfoZjy32ew&NjC~du?}DrbLT?SB`Lmfl+2j8D{L$^+MXM@c0F(@A?~JWg<0% zT7$G${gr#iwA<_cis8dIGN|}$4RkplKHSaSAOp{`eJaXK|6=Bg*~Ofg;M+x(h86|} zK4W4df%dQ>h#Q1rn>5`g^t1r4+}seM)XFqM`2Z(IDEE6psW`K4=0=81JF-fSf42~m zN&>VKI6@vYvY28fFefX_z-&-wO-Gzaox41sF)iPgLY~q?3O@4D z#3b`!ndj;!X~573VyGwahWFTfPivlHTQ|(WoAjKQ!)gPbXv*KCzlUj?NPoit8vBMi ztcXf&IaNrP$upT^R~>hS#}3guDV<_N;nz9Dll8^iBK8-XE?_I^;(Gd>tiqpfAZxJd zfwZ}c{t^>wFU)wmcq8kj676;4)0s)(99cWg76)EFd7Rl&v@+>hu(j848Rd~zMm6Dk zs1rphkLF=^LE#BHg$?($m$@Pv?l3Ayay3+VkP}0NyN6IA1v0Q_!VOY>-W?f02AgQX z6=V=3B4ns2R9Sl2np;(A-cLmzE&B5@j21s5C`V{-_Hi zJ4{(LIaq!=?sU9!RNi)S0iU%7dj%<2jet>D&xSkob4jOC3sg@27#Zu84s#ue6sYow z92E{w5^Jg7+^=%=KT~sjr#g4sW`zE|2)>sEXFgj)`XUW$JzSUpr5Ix zCA(<{38@^~Dexv+R1rXHPLrGIcd+iTp$m4Lcl>)AO}%(09Z_rZ_P$+wCuhG&jkA3T zio9Z)2>GQV>c%)K3Q2QjU6QIH5g^L3biYq0ZULj=ydbZ9AM_m}PI+@Ll9Q!T5C)%d zd%4;hy8v?YDmZO8rZ+50#U(d-WdQ&e*x3@*!UIUKu~+I;bq8K4yX9B=fFgSRk@o<1 zf0b(6rNR4?ehaJuxb<6LMef0Xb|Zs7OHvS0pTOt#Yv@**b5Gq+Ei<3N*x1n0q{3{A z6}_QNTmYG9qkjPgR`9&(d5i7B4KYt_+^tE~B7!}qJ$CSB39Rh016GigS?v@Nl#U)n z2I56dz5GRX*Kc+9mHERuDmSs^C6;S%VzE^W7nRs$F2MF_(#|i_it7r)9 z5T&>6n#0GdomqVoGxz{y24l&t|;bEJ^^k!D;MLX(ft&`nBi1f|$O(r5LV=D}sV#Ir2&en*8N-t$L zM{mN&SQih%iS#0ltfZvy^X-!IK*AeWS~p1B33ws9t(aD{V)AoN0z+rVklHC7@~w?d z?hv6pw)+5vj88KZ-a{9^73`G6TlY!L<#j=v&HYxr?0Sfbrl<7^dQ(h2Fip&CImiyb zqGm|gMBo3cZeHRL&6@k73U26-uz+64Ls^Vf2$du(LW^OPkFm0!8xViB15A^IByqWDMJqwL99T)V;6 z9i`1N*`i+Wfbyecos|sb&$q`x`BJ!e<@vQYx+Si^v@wQLVQgtqd21WvoDtc-NNyT( z;Ge(JB-m&wF0*8+5xstZk{#r5a@W#MURk=UJI)IUbm!QjWq@9367T;!KK_x--CDG0 z(i3aH*&X3|zxG;Q*#jF>^h$4m*>*XL-g|Hb4q3@#`+u7ZDZi@T)rei#q%ZU68zIQGtD8W8Bn&^9R;-aMTde;hHQ59)=6tq~f#-T6ac)ru z8A2-)$Pn5a$fr8Fuj#_OddwGe_MgN_&_%CtckF>((xtKzYj!A%MU?CH~aa?3U z?~x&fh8jxT$)%@qIw~ut!|y}(}K3u__< z2HU!qLBQz@D-e%*i!7ZW7wu_~-OSvC5wM0?)2twV?eSZCU|C)}gd-8*&C4*XncbG< zgGara-$M+IuX*K-giUpF!kb>YWU{{d%k*`oz$Tay7gmX})XQ}B)(w97=~L%>d85my z!!}O>Yp-x-?&PVtd2J*YZM@UV5f9q-cWnW>W`35IBDyPP0{~HEbreVqHx_6&`71_e z;b%A*N)gPE9GE37Pyq#*dcl7OnZ;tVQ`;!pzxy|n7we-weURM#QnWSv7-hCOJZ0mS zJP0z8c(|SI;wP<*>0k%%*x6>gyiFmv?X;~oI>Zq6x8^#d06Gj;jG3&2uz{3j(QYX1 zmQO>TkBr=rClE85PhvUiUsS!tv!*$jJG~%%Sbs`!7UE?2gulzd2VPvy_?Mz9$%>uV za}YTt-VuMvTW3by5$&HsG9I!HQJ+fN^2x-ub+h?}@e~_j&buF#F|s<&Cdm1v3D9N= z0xQpPL4+EG{k-MMvgI>|L25+zjkvExt^0I+HZQ>EtUaWrmbNdkb+n$!X9vi-^CrV! zm#CbX3R2Zwyx!~%WV z-+!;OkAPYJg?oQhKfj^F-8%d;9X_n9hjgZlW>?d}=v+@{md5vz&Lot%IaQXI41Ldb z!tl8w?w@m!ZNp@v@NHFfX8VFzpY2KiL}k_^d&qC;r*7=!6sXORwrr{=-_^5P5$auP zVy}@HZ6hMGQpk;G{h3^2MZ_`@pkkr3{WJo*`IY0HH*YViEYhZJFTspRchp7$7=E=m z+)HG>qu6{t-Fm!V#+>DB+XgmCXlE6Vpn0q+;uy1#?xF;os*d=L;$Y#aDq;d_gZHQk z0G-F;U3g+wW>`Mdcj7C`y(N#Py;dexJIsxUOswg4HW6oZ_VYRzRE7Jzx{MH2IE?um zCH+(;PkS%Ii++Y|lYYzV0gY^$?B*>rXp@?ETckUmEf64~ zD)}>&9hmjFv7|qu5c-_p6F$m;-Y7am41u+-=nwYj%DM-bN2~^Z3mwh7qQ)@^Ms|;% z;7+fgy%)0;>9dP2JL@*si3L2`J&gS64|ZkymKo&3@n4&uFvA`$!(`rA?$3QnM@dR09lUzNA)Fa<<-csXHLL@ivN-y4dOkTw$-nBuj zOuNw}6P4sS!UKFrlIaxQKc_d+B=5qC(iNrQFrF zHX^KQYhgTzItT~toi%>b(4W)KZ|cw%?rd<@D=M)}c4fztB3dF;%{ z!An6RlL|Hz_MwzO>^C(RdG#;R9k9AAV`m+3NlvPcxjM~vDF>(bXByVa{NZ-#uv>>c zI*2Wrd(($wib;`L7IlGybSN@!S(M$VvL`Np8CI`l=3ppu?2zaXR~w4tMJ3XLYt)XM1#bfIEz|a#yX1( zvM>X4KbqUg+ze*JH?xtGsm8QF(`G6;sR(}4K4Dm&aP(1+S5kZR^=TgMjs9puCi6+| z)4y@vqa!ZrcYoDOhsM*-O^>H{=BM;N(f9LS(edKW=}C_HVqyCJQf{g+bz%+ap1I3Bb6eW-Id7?PAH~4=6)*3-B literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/python_api.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/python_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4339ad72a6428e1a20eccbe0376622c4e1d528a8 GIT binary patch literal 23758 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 O`=y1_FEX!|vi}cZq&l+z literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/recwarn.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/recwarn.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fadd8c565d01791218622f48463b8ce6487d0e9 GIT binary patch literal 7818 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 afy)-{GLA{~A9^)bb855IrSf+!uKq6xFz2%X literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/reports.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/reports.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74595d759346adcbc6bb0681b36729289d5a35be GIT binary patch literal 5941 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 Dy~c(= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/setuponly.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/setuponly.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43f8419ceba0d9b5fc95fb59f29b983df8fb987e GIT binary patch literal 2451 zcmZuz&2k$>5Z;+xtyX`w;wVl61*IDZViyS%RisibLhMRW1%e_@pf*Zv)|#=r^8RIJ zH@4*!7w5`5NJsJrJOI4ITsegU50DexqqP7htD3)_p5E@BufNq-tybND=eJM)c+6n- zCoaw(6DD6mlLyc-gOSjPh)W{s(#Uj8f-)LfuBFF{TVW=%UKp;;t#OrAnEeZ3Rpz`f z&WP)<8mq%zjWt*k#(JsK0-Y7Ms&yKSJ}`RiSMWBYXR1|yPbOiWaW9C{L}bcg!Sg@{ zNvu{<5yY9dpU1-t*8L&DGw@JoHne-t+esIqE7+ZLlDcsw|DQ~|N7^f zo7+1N26xkR+t2*LH_6Zs2fI8<2WgOQ1hLHgFxDJoG2t{l|Xp%w4j7NsP zL1Rh_IwoT(o@Qo27&)WjQDKZN(a$P4o)NJHD6rtR?Kvq7ulh{y!`itH`0%Q+gL^p3 zY6U?0jFw0+`>FzI^CMMxu(SK{`(9ny3s5L~kyusJLE{~%>VYr)EECEMm{bm=F7)?8 zE?VHOY7YJ30cV~z=Qi}<1u^5ts^j5tuf&YE00!W{UP>6>S5?8E<&bN!3dZ!+ExHEU z?v$xMx1e3R3Olj`ok4A46Nl7I8xr59ZR!wl9pwKj8cgmzX!3LDGDwR~zI&i(0OX>!m;{ps|*vcpNE<2?C#wCVf(uu`{D|i?N!AZ3~Kc}*2s_j z5f_V~+OQ=qVTT}D9H0Wjcx%w_T?jf&BoIOn`(ZHQq6fz$A_~FgVD#`4@4|WsDF+sa zNgegyFo9ShS`8;UGc{?Lg(+?n=FFNS*vwgFZVc$unpO%rv**UtF6>!V@7XhlQLs?! z7;^%;xHiZ2g3KDsLfDO)ta9C$wdVMq6`&ha>j6U^Qt>id1sbZoz`gc1@Z}kqR*R~5 zsqNHfb=H_&DynlJGCY;7!7Vf)_rL4?)~pWaE-&`L?BnQiweDJpV*}M}XdC9HK<(WyR`(f#+?BcTxxQGy)-jN7kuB*z$rd8F+9L_~h3D&aVXa(^FuQI#CIP*ou#u^(||OZXacrkqkBl{HR+SQnQL z#l3>{7x4?;DN~+EIGwR1&-4hj*K>4@DKnCzMbtI~10gFDwMQm*DKPr9MXaLI<1p6V0_fmXMygWOq}coLS{?gAjI%$bzvfd z0l1+sMVnz686MT}rTyKWDUdYW1qb8jSMx`Yyp=F6mxM8l7^dEf{2=}Tj!O$V14$7h z=`~f|gFhBn7M>^24}sh$P|LL!HpIs$L3(i={93{PlTcHtW|#$kp|Ss@3%|BPv$b<4 YN?0E9EsRrQ$#gJXrqk}MIW?#I4_&K$ga7~l literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/setupplan.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/setupplan.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e38228767f1f1cfeba49fcb157866a37b4955db7 GIT binary patch literal 1022 zcmYjQ&2H2%5VoB(o89fU{8R`KhulyOTd4vGfe@m!r~<(XsYOB|Qk2Ht-E5QC*iN@w zEnMi8cYq_WzzgsWxpLwaI5AGrRUOUPGoIMrH#2@Q81xW~Uk`qNd}JZ?#~7CbZ1fyN zy#qxN#Tm+RfO8U%+zKpgd?d32n_ASqK*1WbXAWJX&Noau)V)AoanQNq>(XBBb16AQ ze*Z6=ihQfujE@!1O3k7)7hLMfrRiy^QeIRWLZ*d|#$}Ocuty0t|G*$14#*ye@<1)o zcL4YUf5uBZ!;~0EH5A*xgzGw^pikLxIZ1diPABL6;ZQMM3X#Rd`Fd*%jaBuO=8{EP zmhAksn)10fpT^o7r)Rp9OnGrZJ-kg^i^^Tdx&R7BrU|njD^5VX}bV2k&Pt#(u z?UTxhYaW$7Wts3v;7*vHNM4Gd8&k@KA!))yEESX0TD|uZNmHYLANHPv@4>CYx4Q=i zufFVT@4q|@cZJxGbsWCoNt}g8EEl0j#V{?Djq6n3oSju`rOssGV2bx5c8m z);OaT29sK~4hrEOwlS$cX&gsB4qPo4<5Vi0m@=4QW+Qbu?!p3!fM$3`>>C-7vlnp6Gvm0Rok>$JE}b56^QJu_^T3u=qFmfPQQ{{w_y B34;It literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/__pycache__/skipping.cpython-37.pyc b/venv/Lib/site-packages/_pytest/__pycache__/skipping.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0980108fda72b6314bd27c884d03c876119a16e7 GIT binary patch literal 7711 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/_argcomplete.py b/venv/Lib/site-packages/_pytest/_argcomplete.py new file mode 100644 index 00000000..0d1c2da6 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/_argcomplete.py @@ -0,0 +1,106 @@ +"""allow bash-completion for argparse with argcomplete if installed +needs argcomplete>=0.5.6 for python 3.2/3.3 (older versions fail +to find the magic string, so _ARGCOMPLETE env. var is never set, and +this does not need special code. + +Function try_argcomplete(parser) should be called directly before +the call to ArgumentParser.parse_args(). + +The filescompleter is what you normally would use on the positional +arguments specification, in order to get "dirname/" after "dirn" +instead of the default "dirname ": + + optparser.add_argument(Config._file_or_dir, nargs='*' + ).completer=filescompleter + +Other, application specific, completers should go in the file +doing the add_argument calls as they need to be specified as .completer +attributes as well. (If argcomplete is not installed, the function the +attribute points to will not be used). + +SPEEDUP +======= +The generic argcomplete script for bash-completion +(/etc/bash_completion.d/python-argcomplete.sh ) +uses a python program to determine startup script generated by pip. +You can speed up completion somewhat by changing this script to include + # PYTHON_ARGCOMPLETE_OK +so the the python-argcomplete-check-easy-install-script does not +need to be called to find the entry point of the code and see if that is +marked with PYTHON_ARGCOMPLETE_OK + +INSTALL/DEBUGGING +================= +To include this support in another application that has setup.py generated +scripts: +- add the line: + # PYTHON_ARGCOMPLETE_OK + near the top of the main python entry point +- include in the file calling parse_args(): + from _argcomplete import try_argcomplete, filescompleter + , call try_argcomplete just before parse_args(), and optionally add + filescompleter to the positional arguments' add_argument() +If things do not work right away: +- switch on argcomplete debugging with (also helpful when doing custom + completers): + export _ARC_DEBUG=1 +- run: + python-argcomplete-check-easy-install-script $(which appname) + echo $? + will echo 0 if the magic line has been found, 1 if not +- sometimes it helps to find early on errors using: + _ARGCOMPLETE=1 _ARC_DEBUG=1 appname + which should throw a KeyError: 'COMPLINE' (which is properly set by the + global argcomplete script). +""" +from __future__ import absolute_import, division, print_function +import sys +import os +from glob import glob + + +class FastFilesCompleter(object): + "Fast file completer class" + + def __init__(self, directories=True): + self.directories = directories + + def __call__(self, prefix, **kwargs): + """only called on non option completions""" + if os.path.sep in prefix[1:]: + prefix_dir = len(os.path.dirname(prefix) + os.path.sep) + else: + prefix_dir = 0 + completion = [] + globbed = [] + if "*" not in prefix and "?" not in prefix: + # we are on unix, otherwise no bash + if not prefix or prefix[-1] == os.path.sep: + globbed.extend(glob(prefix + ".*")) + prefix += "*" + globbed.extend(glob(prefix)) + for x in sorted(globbed): + if os.path.isdir(x): + x += "/" + # append stripping the prefix (like bash, not like compgen) + completion.append(x[prefix_dir:]) + return completion + + +if os.environ.get("_ARGCOMPLETE"): + try: + import argcomplete.completers + except ImportError: + sys.exit(-1) + filescompleter = FastFilesCompleter() + + def try_argcomplete(parser): + argcomplete.autocomplete(parser, always_complete_options=False) + + +else: + + def try_argcomplete(parser): + pass + + filescompleter = None diff --git a/venv/Lib/site-packages/_pytest/_code/__init__.py b/venv/Lib/site-packages/_pytest/_code/__init__.py new file mode 100644 index 00000000..7885d51d --- /dev/null +++ b/venv/Lib/site-packages/_pytest/_code/__init__.py @@ -0,0 +1,11 @@ +""" python inspection/code generation API """ +from __future__ import absolute_import, division, print_function +from .code import Code # noqa +from .code import ExceptionInfo # noqa +from .code import Frame # noqa +from .code import Traceback # noqa +from .code import filter_traceback # noqa +from .code import getrawcode # noqa +from .source import Source # noqa +from .source import compile_ as compile # noqa +from .source import getfslineno # noqa diff --git a/venv/Lib/site-packages/_pytest/_code/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/_pytest/_code/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdac1accd1522fc0723127a5d9791f75d64fd8ae GIT binary patch literal 647 zcmZ9J&2H2%5XX~EHlLgABJ}}sLwjgZ1s4#iSlUvp1PE!%#ROSt;w@Gk+p?X7a^TFX z@Cw`!?~p5}z5*v^A}S#qC_D=S7iuaK1nM`R<4BdB4!OI}?Cs@Y}B-tw+4p zZzsatwc1}SM&r@3GhIER?66=5iExFz>N)2wo1SlcM5Mo9Xp&g?nC@Bgq(&QjRWXEb|hModF@!zUu4%Ro% z?Bff{@AoH9s<)OITfJJHpRd0h9iE>MC zf3c#b7SvkvhByU zxDIn8_TvW3LChYLR`4%KBQ4jQ3%e>$`&x98UXe>}{5UyGRFY?Ap^!()hjD z&ypyQMJG+PkYTDeThuhPIMy9KC`5#o;)A~UFz&!mE0hpTN}}mArrxn{Y~R865_~!E zVa+YcGpfAE14>oWXKQ_k%X8+_qbJRjsO5 z{?{a1a*3Wh2;@(c;O`rf{r;4cUh!+pDz9`#&Da^umtI*LvoWQl^udb8Z&WUUZN6T3 z#^hh6KRSo#jalVejv8?Iqs1{9Q_EAI^1$jVaeYioD1b{zb7)S;7y$2#Q5+qi}_)g_61k{Xpe`A?!= z_V8@Qa;;e{Qs}HY~t0pouq|B~b;UWYLB8%aRCmEc|#8H}L;?&+vbT3T@ zE7ndcA<8oyCK*apz?FiPR@g^;FFz88Lay+gTv{!U2XOTGo|L(Kfet85G@nUP$P%Vt zT_zN00Whx~?TO3^u!$|=7LOBEq~UQ6qB!N^h+cXW4$wTo5&D-fMAYmupgRR^=&w&O z*%)5r{5}}Wubfm@R;-i!qzZ;!U+=8mG<7M!tw;>(m>jTSXb?dm+6T+jfuV4`0i-0~ zEkiQW5g8MCzNE!cOumBB`GLhyhAsA-a;)@vqErDwTg_a3)DEsDFL4%?sSQJA*3M6YNUNwEqM))4vC>j#I2ALjiV?P8#X z((TT4#twsD@4d+JV(`4NzAG|uT*!?LG#h4ftlagbN=y?!ZvjfI$DH&@Z9K+k0WDWQxaZL`&$pm6KuLhWC;|S9VJ5l>oIwyw7CJ=Fq|Fsh?E0uv#F)8y%HHI016`I@s27 zqtC{epUD?%*BIT+UaEqEFDcsD+Sf`j{u z!u@r7a(@jLHN*9h6Vn)cpY5;D?l<-nZ#kfVkgGjByAIUk@5$Ev)tj;oDu$QV z`FJD7~9YMZ{1Ra-4NG<_sQS1F#Z{LNjFJY)fAOv#2 zha6yZ5h(bKyRA7Bbl_hE+#66I5=&QN|B)Dd=^?oQ1nMg}p4fqTV&Ss%Bbgr(y&7Ez*}U8y){+Kll%sAd=w# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/_code/__pycache__/code.cpython-37.pyc b/venv/Lib/site-packages/_pytest/_code/__pycache__/code.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76575add35d2c3d68c872192d17631eeec212dfe GIT binary patch literal 31201 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/_code/__pycache__/source.cpython-37.pyc b/venv/Lib/site-packages/_pytest/_code/__pycache__/source.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28b6060d43d02aab46d9185f6b6a95fe6273791f GIT binary patch literal 9462 zcmbVS&5s<%b?@r0>6x9KT`s?tvLZJr@nd9?mSjb;8HOMwiV|&k<%F~-k5_8o*4JkTC zS2RS|Y?xiEVF{`;J9fjy+3MI`r{Qv)-6?gwhF3fd-r({ho;Cxyx z%40Y$%O!an=QDCyo|LEX#xv5qXVlMpj#(IWD_;oLl745HMnT*i^i`UBGJY5*ale<> z1}g5QL2KA+rnq0Ji+uijqc`sa@2$N1gW%S^`>3d{#Yxmm0~N1tq)qB``g3q`6G!q1 zipXdPX*5hJ8kRI6BTL#Cm7{0XaAm1c;u#qYub5G}m{CQZUo}xfUHi)lX!n# zo|30=u3>g(a9)rv$gjv}G0R2y8}d2S9FymzFVCW8NtQ703%Pr*KUB?V-0;JmA9uUM zG+gUMet)fvdH5Usj*NTje&{FM%y0H( zz4ucyb5d)^RM#`7O*OZ<#!j7fy0?03Ft{D2;p)5nX4qN1A9V+-gLrTy?j>p1>0Ehv^Wnp9^@p#n4n}E|q^rU7 zOpCLs7wYO@^rUjV6DMi2-yPgIOT(lwyT?cRFz|N^)yGO7jY=fdJNwHZ{7gAfAJK|%JIy=V1)GgXBo|k@No-r~rFf*DK8G^M^H&;F< zGajF9hP_@t^^;EAjQr5oWAPuw=?3nSG#b>sVwQkREd-mY^U7Vo!?qTK)*h%5U=~mN zgSw@~VQogEyxfZ(75YM^a$v>hf&jV{r%^WuUd5w?^nezLnTitmqCo_5dthN9sT0b$b8<~aa+2ap=6{SPf^C8|Ts25<* z%a^J!hMld?pq&st>`A{9h3pE}I$>|qXH!I1-TuQ!YM7^n4E5>-OmhXwe+6f~_zuG# z;|1zjrkC(Aw}1e-`_yGtUq^#mI1+*a!>);CX#cY~TwIN-g}k}r+<0Qs=bI#H`nfo) z;z(}df~)`lPqK%;Pt4SStn5EBTI_Hhdn7e>8xC||WX@@{YYUWiATk1SYaC4_7s3k; zMt;BL!)l)*!$YFGxE8hgD!Rxryco99NL} zc$yXH~Q9v#OQ zu#8qR@lo)qnO|Hr;1sNgSE=)BtrFa7q0(AxSevyGFYkK%Faj}RQgcQ7wS9G;S^2NG zSc=eVDk}y#5*RPkN4S_S)Y(EndJtc_N*Y8DEDQBK{R)48*5(KF0WuTAcEu?%^C$Wv zvn3!6B=IwRk=yzeT=BYv}+ai)}sPca+ka4D*_kw z5*0^$NA=*VAsQqM89D@jCCf5Yq*gBYa3OYLM>}R-!zhQJrm3T(9JFt zpbelmS1pp%#LleDZfPa`y{ViovG=>|6A|*6M-`Gv2B8*{-vvwShMhy=noS=4tRogV zEMDT?giHs7+TWKSL-hE#7L?x~rUYbKh?Yj|id4${eSi-k+%lDG_zcgQi(i7()^9 z1PYM}^&IG;v1{#7U}E(=x}&SnBAJi0PUB7(4~*U=kW3pS^Ic6cKZcq1mQm-R?jv0% z;f+8s9k4PN(=UzJrpk0*4I@8pO+8Ya_#n+mMDg5Ze#z~HcW(C3Sb!={~qhniVk|r+-~>dFXMmE{2=%f8Vo`IA^yjY zay#0NnoR~+JSX2f(~ngQ1UdoOXp3Ed#2&M8X?`kHmO0Ye^wf)~z3WID;VQ!4HbPjG z9vGuLDM<%IE}t?c#91mfuBH7t*g{awMAFVY>1J+LYMG~u)8LQ2CDfDvL{w+#I_V+E zHQLoZAw9GykCxK;3~!Sz?%0zG^zbosuC`hEsZi&NaL3+V*fXSk#+dNC(#q!Aiv;|W zDz1*H|H!JlOR`MYCk$CRjSv``Pjz#dIK_8qjlYcVLigvXWi}riqkeE+#Q8YRI6fB8 z`qw@HV@*%oG%$u&vI?}FGdeVG=4myFtVveOM9WT3wohdO43}CF%dL(7c4`w8{l*>m z5l&oaqI;E$q=njE*oDC){z|`h*d4_^IQ^6|B8W}mR@{uk&i)(Pmr1BtCmbb*Y-yhm zew_f;M_wc*ou86LvOah>Bv8815lDu4*)*sXrqAQ*_4D!y4SF5)W9*(!uAP@R#^v+M z*O#oUPlW$Od^CO$-V$k3tj~;L%2+soagbgj@_^<{ z(--_1&FM73RAe|uER-3`-=TiWSk4tFUySCdl;w184n`E+ryIyGPzEA*7zGd+kCMDh zF&@h)cUu9?FQ04ngXyy6UMtWpEMLG=p0uV63ajMZ1waP?X?goAVR*}Z1!_A+HQE=WSu^f zG#tcf(KgTFh}82^G4Ibv^5kxf(lWek1%8$eTP&GNIGcjXDo~P~SPg$fzR?cRvW+L8 z;M3r>=n#(b74)WyZ{P~-QJ?PDofUPPo)MUGu~I)yIT*5~Ajm60fVmGlbX^UCtzpB%SdUgiY?mDSD`&hd$WK@!doDiz1`97J>aieGqkEnG0fl>D;-?{*{;O{93Wlx&0oDY9UlC%nu{g!8yi@8AV> zmx^!GtCbc)QQa;t-F=TcY0R}^WYRV8bAnNwr?$0Q2@sT~&&`liwlGs3g4&`ULu%!= zz$4QQ4Z0#Ys!?+^5M(qFgZBRk?UM^Ah-T`ntBI@=QOpwnO&g#}q_c{+fQYA}#NJHZ zY~0Mq-hJGFU>UnmGLD+HqMaiJYFlk0`8kHV~5Be(jG|+lkkUwb;ViK z%fM~UpyTBtUOQJWYhC>@My+K@I~w`oUCuqRakF-7y+2E>wy7Yo77|s@QU!I;a1n+8 zIghR?b@@LybW#-xjQ9x(Oq&W&V|qFhC3$%Ahm4xU5J`yS4$HKOs zt8Q~kS0V$iTTkEEy8Xb|T7Cd@-}Uxr_0nh$b zKhs#UeJyhl%09#2cBRc*IExr(IVCt&NKyf@6$|7+NT8g(+aGxIZi#nQ=+>k ztS^-&d)GT*cTI*jUZnw0XXA@s_W9zCC*t|~l1@z#;bb-3-Y&F9_#d)mB1 zCZO_CoPZ`YK}@ugO8{GcGwQ|TC|{sCDKOxGtCGCJXX3;vue{Zh@3puq^#}MAwqhtj zdXp~Q4z6Nse{!D*?X(p(%FEd(BV5%4rcuI6WVRIEf#d^5FQErcW;d#9G*AS=JW>lE z-*?>r*UzXS2~7PKim#HauHpiwiNBgzb13MmS{^veGGKohepCm9u0^DI2~SL1V3<+lFcj@A>> raise string1, string2 # deprecated + # + # Clear these out first because issubtype(string1, SyntaxError) + # would throw another exception and mask the original problem. + if ( + isinstance(etype, BaseException) + or isinstance(etype, types.InstanceType) + or etype is None + or type(etype) is str + ): + return [_format_final_exc_line(etype, value)] + + stype = etype.__name__ + + if not issubclass(etype, SyntaxError): + return [_format_final_exc_line(stype, value)] + + # It was a syntax error; show exactly where the problem was found. + lines = [] + try: + msg, (filename, lineno, offset, badline) = value.args + except Exception: + pass + else: + filename = filename or "" + lines.append(' File "{}", line {}\n'.format(filename, lineno)) + if badline is not None: + if isinstance(badline, bytes): # python 2 only + badline = badline.decode("utf-8", "replace") + lines.append(" {}\n".format(badline.strip())) + if offset is not None: + caretspace = badline.rstrip("\n")[:offset].lstrip() + # non-space whitespace (likes tabs) must be kept for alignment + caretspace = ((c.isspace() and c or " ") for c in caretspace) + # only three spaces to account for offset1 == pos 0 + lines.append(" {}^\n".format("".join(caretspace))) + value = msg + + lines.append(_format_final_exc_line(stype, value)) + return lines + + +def _format_final_exc_line(etype, value): + """Return a list of a single line -- normal case for format_exception_only""" + valuestr = _some_str(value) + if value is None or not valuestr: + line = "{}\n".format(etype) + else: + line = "{}: {}\n".format(etype, valuestr) + return line + + +def _some_str(value): + try: + return text_type(value) + except Exception: + try: + return bytes(value).decode("UTF-8", "replace") + except Exception: + pass + return "".format(type(value).__name__) diff --git a/venv/Lib/site-packages/_pytest/_code/code.py b/venv/Lib/site-packages/_pytest/_code/code.py new file mode 100644 index 00000000..c0f6d21a --- /dev/null +++ b/venv/Lib/site-packages/_pytest/_code/code.py @@ -0,0 +1,1044 @@ +from __future__ import absolute_import, division, print_function +import inspect +import pprint +import sys +import traceback +from inspect import CO_VARARGS, CO_VARKEYWORDS + +import attr +import pluggy +import re +from weakref import ref +import _pytest +from _pytest.compat import _PY2, _PY3, PY35, safe_str +from six import text_type +import py +import six + +builtin_repr = repr + +if _PY3: + from traceback import format_exception_only +else: + from ._py2traceback import format_exception_only + + +class Code(object): + """ wrapper around Python code objects """ + + def __init__(self, rawcode): + if not hasattr(rawcode, "co_filename"): + rawcode = getrawcode(rawcode) + try: + self.filename = rawcode.co_filename + self.firstlineno = rawcode.co_firstlineno - 1 + self.name = rawcode.co_name + except AttributeError: + raise TypeError("not a code object: %r" % (rawcode,)) + self.raw = rawcode + + def __eq__(self, other): + return self.raw == other.raw + + __hash__ = None + + def __ne__(self, other): + return not self == other + + @property + def path(self): + """ return a path object pointing to source code (note that it + might not point to an actually existing file). """ + try: + p = py.path.local(self.raw.co_filename) + # maybe don't try this checking + if not p.check(): + raise OSError("py.path check failed.") + except OSError: + # XXX maybe try harder like the weird logic + # in the standard lib [linecache.updatecache] does? + p = self.raw.co_filename + + return p + + @property + def fullsource(self): + """ return a _pytest._code.Source object for the full source file of the code + """ + from _pytest._code import source + + full, _ = source.findsource(self.raw) + return full + + def source(self): + """ return a _pytest._code.Source object for the code object's source only + """ + # return source only for that part of code + import _pytest._code + + return _pytest._code.Source(self.raw) + + def getargs(self, var=False): + """ return a tuple with the argument names for the code object + + if 'var' is set True also return the names of the variable and + keyword arguments when present + """ + # handfull shortcut for getting args + raw = self.raw + argcount = raw.co_argcount + if var: + argcount += raw.co_flags & CO_VARARGS + argcount += raw.co_flags & CO_VARKEYWORDS + return raw.co_varnames[:argcount] + + +class Frame(object): + """Wrapper around a Python frame holding f_locals and f_globals + in which expressions can be evaluated.""" + + def __init__(self, frame): + self.lineno = frame.f_lineno - 1 + self.f_globals = frame.f_globals + self.f_locals = frame.f_locals + self.raw = frame + self.code = Code(frame.f_code) + + @property + def statement(self): + """ statement this frame is at """ + import _pytest._code + + if self.code.fullsource is None: + return _pytest._code.Source("") + return self.code.fullsource.getstatement(self.lineno) + + def eval(self, code, **vars): + """ evaluate 'code' in the frame + + 'vars' are optional additional local variables + + returns the result of the evaluation + """ + f_locals = self.f_locals.copy() + f_locals.update(vars) + return eval(code, self.f_globals, f_locals) + + def exec_(self, code, **vars): + """ exec 'code' in the frame + + 'vars' are optiona; additional local variables + """ + f_locals = self.f_locals.copy() + f_locals.update(vars) + six.exec_(code, self.f_globals, f_locals) + + def repr(self, object): + """ return a 'safe' (non-recursive, one-line) string repr for 'object' + """ + return py.io.saferepr(object) + + def is_true(self, object): + return object + + def getargs(self, var=False): + """ return a list of tuples (name, value) for all arguments + + if 'var' is set True also include the variable and keyword + arguments when present + """ + retval = [] + for arg in self.code.getargs(var): + try: + retval.append((arg, self.f_locals[arg])) + except KeyError: + pass # this can occur when using Psyco + return retval + + +class TracebackEntry(object): + """ a single entry in a traceback """ + + _repr_style = None + exprinfo = None + + def __init__(self, rawentry, excinfo=None): + self._excinfo = excinfo + self._rawentry = rawentry + self.lineno = rawentry.tb_lineno - 1 + + def set_repr_style(self, mode): + assert mode in ("short", "long") + self._repr_style = mode + + @property + def frame(self): + import _pytest._code + + return _pytest._code.Frame(self._rawentry.tb_frame) + + @property + def relline(self): + return self.lineno - self.frame.code.firstlineno + + def __repr__(self): + return "" % (self.frame.code.path, self.lineno + 1) + + @property + def statement(self): + """ _pytest._code.Source object for the current statement """ + source = self.frame.code.fullsource + return source.getstatement(self.lineno) + + @property + def path(self): + """ path to the source code """ + return self.frame.code.path + + def getlocals(self): + return self.frame.f_locals + + locals = property(getlocals, None, None, "locals of underlaying frame") + + def getfirstlinesource(self): + # on Jython this firstlineno can be -1 apparently + return max(self.frame.code.firstlineno, 0) + + def getsource(self, astcache=None): + """ return failing source code. """ + # we use the passed in astcache to not reparse asttrees + # within exception info printing + from _pytest._code.source import getstatementrange_ast + + source = self.frame.code.fullsource + if source is None: + return None + key = astnode = None + if astcache is not None: + key = self.frame.code.path + if key is not None: + astnode = astcache.get(key, None) + start = self.getfirstlinesource() + try: + astnode, _, end = getstatementrange_ast( + self.lineno, source, astnode=astnode + ) + except SyntaxError: + end = self.lineno + 1 + else: + if key is not None: + astcache[key] = astnode + return source[start:end] + + source = property(getsource) + + def ishidden(self): + """ return True if the current frame has a var __tracebackhide__ + resolving to True + + If __tracebackhide__ is a callable, it gets called with the + ExceptionInfo instance and can decide whether to hide the traceback. + + mostly for internal use + """ + try: + tbh = self.frame.f_locals["__tracebackhide__"] + except KeyError: + try: + tbh = self.frame.f_globals["__tracebackhide__"] + except KeyError: + return False + + if callable(tbh): + return tbh(None if self._excinfo is None else self._excinfo()) + else: + return tbh + + def __str__(self): + try: + fn = str(self.path) + except py.error.Error: + fn = "???" + name = self.frame.code.name + try: + line = str(self.statement).lstrip() + except KeyboardInterrupt: + raise + except: # noqa + line = "???" + return " File %r:%d in %s\n %s\n" % (fn, self.lineno + 1, name, line) + + def name(self): + return self.frame.code.raw.co_name + + name = property(name, None, None, "co_name of underlaying code") + + +class Traceback(list): + """ Traceback objects encapsulate and offer higher level + access to Traceback entries. + """ + + Entry = TracebackEntry + + def __init__(self, tb, excinfo=None): + """ initialize from given python traceback object and ExceptionInfo """ + self._excinfo = excinfo + if hasattr(tb, "tb_next"): + + def f(cur): + while cur is not None: + yield self.Entry(cur, excinfo=excinfo) + cur = cur.tb_next + + list.__init__(self, f(tb)) + else: + list.__init__(self, tb) + + def cut(self, path=None, lineno=None, firstlineno=None, excludepath=None): + """ return a Traceback instance wrapping part of this Traceback + + by provding any combination of path, lineno and firstlineno, the + first frame to start the to-be-returned traceback is determined + + this allows cutting the first part of a Traceback instance e.g. + for formatting reasons (removing some uninteresting bits that deal + with handling of the exception/traceback) + """ + for x in self: + code = x.frame.code + codepath = code.path + if ( + (path is None or codepath == path) + and ( + excludepath is None + or not hasattr(codepath, "relto") + or not codepath.relto(excludepath) + ) + and (lineno is None or x.lineno == lineno) + and (firstlineno is None or x.frame.code.firstlineno == firstlineno) + ): + return Traceback(x._rawentry, self._excinfo) + return self + + def __getitem__(self, key): + val = super(Traceback, self).__getitem__(key) + if isinstance(key, type(slice(0))): + val = self.__class__(val) + return val + + def filter(self, fn=lambda x: not x.ishidden()): + """ return a Traceback instance with certain items removed + + fn is a function that gets a single argument, a TracebackEntry + instance, and should return True when the item should be added + to the Traceback, False when not + + by default this removes all the TracebackEntries which are hidden + (see ishidden() above) + """ + return Traceback(filter(fn, self), self._excinfo) + + def getcrashentry(self): + """ return last non-hidden traceback entry that lead + to the exception of a traceback. + """ + for i in range(-1, -len(self) - 1, -1): + entry = self[i] + if not entry.ishidden(): + return entry + return self[-1] + + def recursionindex(self): + """ return the index of the frame/TracebackEntry where recursion + originates if appropriate, None if no recursion occurred + """ + cache = {} + for i, entry in enumerate(self): + # id for the code.raw is needed to work around + # the strange metaprogramming in the decorator lib from pypi + # which generates code objects that have hash/value equality + # XXX needs a test + key = entry.frame.code.path, id(entry.frame.code.raw), entry.lineno + # print "checking for recursion at", key + values = cache.setdefault(key, []) + if values: + f = entry.frame + loc = f.f_locals + for otherloc in values: + if f.is_true( + f.eval( + co_equal, + __recursioncache_locals_1=loc, + __recursioncache_locals_2=otherloc, + ) + ): + return i + values.append(entry.frame.f_locals) + return None + + +co_equal = compile( + "__recursioncache_locals_1 == __recursioncache_locals_2", "?", "eval" +) + + +class ExceptionInfo(object): + """ wraps sys.exc_info() objects and offers + help for navigating the traceback. + """ + + _striptext = "" + _assert_start_repr = ( + "AssertionError(u'assert " if _PY2 else "AssertionError('assert " + ) + + def __init__(self, tup=None, exprinfo=None): + import _pytest._code + + if tup is None: + tup = sys.exc_info() + if exprinfo is None and isinstance(tup[1], AssertionError): + exprinfo = getattr(tup[1], "msg", None) + if exprinfo is None: + exprinfo = py.io.saferepr(tup[1]) + if exprinfo and exprinfo.startswith(self._assert_start_repr): + self._striptext = "AssertionError: " + self._excinfo = tup + #: the exception class + self.type = tup[0] + #: the exception instance + self.value = tup[1] + #: the exception raw traceback + self.tb = tup[2] + #: the exception type name + self.typename = self.type.__name__ + #: the exception traceback (_pytest._code.Traceback instance) + self.traceback = _pytest._code.Traceback(self.tb, excinfo=ref(self)) + + def __repr__(self): + return "" % (self.typename, len(self.traceback)) + + def exconly(self, tryshort=False): + """ return the exception as a string + + when 'tryshort' resolves to True, and the exception is a + _pytest._code._AssertionError, only the actual exception part of + the exception representation is returned (so 'AssertionError: ' is + removed from the beginning) + """ + lines = format_exception_only(self.type, self.value) + text = "".join(lines) + text = text.rstrip() + if tryshort: + if text.startswith(self._striptext): + text = text[len(self._striptext) :] + return text + + def errisinstance(self, exc): + """ return True if the exception is an instance of exc """ + return isinstance(self.value, exc) + + def _getreprcrash(self): + exconly = self.exconly(tryshort=True) + entry = self.traceback.getcrashentry() + path, lineno = entry.frame.code.raw.co_filename, entry.lineno + return ReprFileLocation(path, lineno + 1, exconly) + + def getrepr( + self, + showlocals=False, + style="long", + abspath=False, + tbfilter=True, + funcargs=False, + truncate_locals=True, + chain=True, + ): + """ + Return str()able representation of this exception info. + + :param bool showlocals: + Show locals per traceback entry. + Ignored if ``style=="native"``. + + :param str style: long|short|no|native traceback style + + :param bool abspath: + If paths should be changed to absolute or left unchanged. + + :param bool tbfilter: + Hide entries that contain a local variable ``__tracebackhide__==True``. + Ignored if ``style=="native"``. + + :param bool funcargs: + Show fixtures ("funcargs" for legacy purposes) per traceback entry. + + :param bool truncate_locals: + With ``showlocals==True``, make sure locals can be safely represented as strings. + + :param bool chain: if chained exceptions in Python 3 should be shown. + + .. versionchanged:: 3.9 + + Added the ``chain`` parameter. + """ + if style == "native": + return ReprExceptionInfo( + ReprTracebackNative( + traceback.format_exception( + self.type, self.value, self.traceback[0]._rawentry + ) + ), + self._getreprcrash(), + ) + + fmt = FormattedExcinfo( + showlocals=showlocals, + style=style, + abspath=abspath, + tbfilter=tbfilter, + funcargs=funcargs, + truncate_locals=truncate_locals, + chain=chain, + ) + return fmt.repr_excinfo(self) + + def __str__(self): + entry = self.traceback[-1] + loc = ReprFileLocation(entry.path, entry.lineno + 1, self.exconly()) + return str(loc) + + def __unicode__(self): + entry = self.traceback[-1] + loc = ReprFileLocation(entry.path, entry.lineno + 1, self.exconly()) + return text_type(loc) + + def match(self, regexp): + """ + Match the regular expression 'regexp' on the string representation of + the exception. If it matches then True is returned (so that it is + possible to write 'assert excinfo.match()'). If it doesn't match an + AssertionError is raised. + """ + __tracebackhide__ = True + if not re.search(regexp, str(self.value)): + assert 0, "Pattern '{!s}' not found in '{!s}'".format(regexp, self.value) + return True + + +@attr.s +class FormattedExcinfo(object): + """ presenting information about failing Functions and Generators. """ + + # for traceback entries + flow_marker = ">" + fail_marker = "E" + + showlocals = attr.ib(default=False) + style = attr.ib(default="long") + abspath = attr.ib(default=True) + tbfilter = attr.ib(default=True) + funcargs = attr.ib(default=False) + truncate_locals = attr.ib(default=True) + chain = attr.ib(default=True) + astcache = attr.ib(default=attr.Factory(dict), init=False, repr=False) + + def _getindent(self, source): + # figure out indent for given source + try: + s = str(source.getstatement(len(source) - 1)) + except KeyboardInterrupt: + raise + except: # noqa + try: + s = str(source[-1]) + except KeyboardInterrupt: + raise + except: # noqa + return 0 + return 4 + (len(s) - len(s.lstrip())) + + def _getentrysource(self, entry): + source = entry.getsource(self.astcache) + if source is not None: + source = source.deindent() + return source + + def _saferepr(self, obj): + return py.io.saferepr(obj) + + def repr_args(self, entry): + if self.funcargs: + args = [] + for argname, argvalue in entry.frame.getargs(var=True): + args.append((argname, self._saferepr(argvalue))) + return ReprFuncArgs(args) + + def get_source(self, source, line_index=-1, excinfo=None, short=False): + """ return formatted and marked up source lines. """ + import _pytest._code + + lines = [] + if source is None or line_index >= len(source.lines): + source = _pytest._code.Source("???") + line_index = 0 + if line_index < 0: + line_index += len(source) + space_prefix = " " + if short: + lines.append(space_prefix + source.lines[line_index].strip()) + else: + for line in source.lines[:line_index]: + lines.append(space_prefix + line) + lines.append(self.flow_marker + " " + source.lines[line_index]) + for line in source.lines[line_index + 1 :]: + lines.append(space_prefix + line) + if excinfo is not None: + indent = 4 if short else self._getindent(source) + lines.extend(self.get_exconly(excinfo, indent=indent, markall=True)) + return lines + + def get_exconly(self, excinfo, indent=4, markall=False): + lines = [] + indent = " " * indent + # get the real exception information out + exlines = excinfo.exconly(tryshort=True).split("\n") + failindent = self.fail_marker + indent[1:] + for line in exlines: + lines.append(failindent + line) + if not markall: + failindent = indent + return lines + + def repr_locals(self, locals): + if self.showlocals: + lines = [] + keys = [loc for loc in locals if loc[0] != "@"] + keys.sort() + for name in keys: + value = locals[name] + if name == "__builtins__": + lines.append("__builtins__ = ") + else: + # This formatting could all be handled by the + # _repr() function, which is only reprlib.Repr in + # disguise, so is very configurable. + if self.truncate_locals: + str_repr = self._saferepr(value) + else: + str_repr = pprint.pformat(value) + # if len(str_repr) < 70 or not isinstance(value, + # (list, tuple, dict)): + lines.append("%-10s = %s" % (name, str_repr)) + # else: + # self._line("%-10s =\\" % (name,)) + # # XXX + # pprint.pprint(value, stream=self.excinfowriter) + return ReprLocals(lines) + + def repr_traceback_entry(self, entry, excinfo=None): + import _pytest._code + + source = self._getentrysource(entry) + if source is None: + source = _pytest._code.Source("???") + line_index = 0 + else: + # entry.getfirstlinesource() can be -1, should be 0 on jython + line_index = entry.lineno - max(entry.getfirstlinesource(), 0) + + lines = [] + style = entry._repr_style + if style is None: + style = self.style + if style in ("short", "long"): + short = style == "short" + reprargs = self.repr_args(entry) if not short else None + s = self.get_source(source, line_index, excinfo, short=short) + lines.extend(s) + if short: + message = "in %s" % (entry.name) + else: + message = excinfo and excinfo.typename or "" + path = self._makepath(entry.path) + filelocrepr = ReprFileLocation(path, entry.lineno + 1, message) + localsrepr = None + if not short: + localsrepr = self.repr_locals(entry.locals) + return ReprEntry(lines, reprargs, localsrepr, filelocrepr, style) + if excinfo: + lines.extend(self.get_exconly(excinfo, indent=4)) + return ReprEntry(lines, None, None, None, style) + + def _makepath(self, path): + if not self.abspath: + try: + np = py.path.local().bestrelpath(path) + except OSError: + return path + if len(np) < len(str(path)): + path = np + return path + + def repr_traceback(self, excinfo): + traceback = excinfo.traceback + if self.tbfilter: + traceback = traceback.filter() + + if is_recursion_error(excinfo): + traceback, extraline = self._truncate_recursive_traceback(traceback) + else: + extraline = None + + last = traceback[-1] + entries = [] + for index, entry in enumerate(traceback): + einfo = (last == entry) and excinfo or None + reprentry = self.repr_traceback_entry(entry, einfo) + entries.append(reprentry) + return ReprTraceback(entries, extraline, style=self.style) + + def _truncate_recursive_traceback(self, traceback): + """ + Truncate the given recursive traceback trying to find the starting point + of the recursion. + + The detection is done by going through each traceback entry and finding the + point in which the locals of the frame are equal to the locals of a previous frame (see ``recursionindex()``. + + Handle the situation where the recursion process might raise an exception (for example + comparing numpy arrays using equality raises a TypeError), in which case we do our best to + warn the user of the error and show a limited traceback. + """ + try: + recursionindex = traceback.recursionindex() + except Exception as e: + max_frames = 10 + extraline = ( + "!!! Recursion error detected, but an error occurred locating the origin of recursion.\n" + " The following exception happened when comparing locals in the stack frame:\n" + " {exc_type}: {exc_msg}\n" + " Displaying first and last {max_frames} stack frames out of {total}." + ).format( + exc_type=type(e).__name__, + exc_msg=safe_str(e), + max_frames=max_frames, + total=len(traceback), + ) + traceback = traceback[:max_frames] + traceback[-max_frames:] + else: + if recursionindex is not None: + extraline = "!!! Recursion detected (same locals & position)" + traceback = traceback[: recursionindex + 1] + else: + extraline = None + + return traceback, extraline + + def repr_excinfo(self, excinfo): + if _PY2: + reprtraceback = self.repr_traceback(excinfo) + reprcrash = excinfo._getreprcrash() + + return ReprExceptionInfo(reprtraceback, reprcrash) + else: + repr_chain = [] + e = excinfo.value + descr = None + seen = set() + while e is not None and id(e) not in seen: + seen.add(id(e)) + if excinfo: + reprtraceback = self.repr_traceback(excinfo) + reprcrash = excinfo._getreprcrash() + else: + # fallback to native repr if the exception doesn't have a traceback: + # ExceptionInfo objects require a full traceback to work + reprtraceback = ReprTracebackNative( + traceback.format_exception(type(e), e, None) + ) + reprcrash = None + + repr_chain += [(reprtraceback, reprcrash, descr)] + if e.__cause__ is not None and self.chain: + e = e.__cause__ + excinfo = ( + ExceptionInfo((type(e), e, e.__traceback__)) + if e.__traceback__ + else None + ) + descr = "The above exception was the direct cause of the following exception:" + elif ( + e.__context__ is not None + and not e.__suppress_context__ + and self.chain + ): + e = e.__context__ + excinfo = ( + ExceptionInfo((type(e), e, e.__traceback__)) + if e.__traceback__ + else None + ) + descr = "During handling of the above exception, another exception occurred:" + else: + e = None + repr_chain.reverse() + return ExceptionChainRepr(repr_chain) + + +class TerminalRepr(object): + def __str__(self): + s = self.__unicode__() + if _PY2: + s = s.encode("utf-8") + return s + + def __unicode__(self): + # FYI this is called from pytest-xdist's serialization of exception + # information. + io = py.io.TextIO() + tw = py.io.TerminalWriter(file=io) + self.toterminal(tw) + return io.getvalue().strip() + + def __repr__(self): + return "<%s instance at %0x>" % (self.__class__, id(self)) + + +class ExceptionRepr(TerminalRepr): + def __init__(self): + self.sections = [] + + def addsection(self, name, content, sep="-"): + self.sections.append((name, content, sep)) + + def toterminal(self, tw): + for name, content, sep in self.sections: + tw.sep(sep, name) + tw.line(content) + + +class ExceptionChainRepr(ExceptionRepr): + def __init__(self, chain): + super(ExceptionChainRepr, self).__init__() + self.chain = chain + # reprcrash and reprtraceback of the outermost (the newest) exception + # in the chain + self.reprtraceback = chain[-1][0] + self.reprcrash = chain[-1][1] + + def toterminal(self, tw): + for element in self.chain: + element[0].toterminal(tw) + if element[2] is not None: + tw.line("") + tw.line(element[2], yellow=True) + super(ExceptionChainRepr, self).toterminal(tw) + + +class ReprExceptionInfo(ExceptionRepr): + def __init__(self, reprtraceback, reprcrash): + super(ReprExceptionInfo, self).__init__() + self.reprtraceback = reprtraceback + self.reprcrash = reprcrash + + def toterminal(self, tw): + self.reprtraceback.toterminal(tw) + super(ReprExceptionInfo, self).toterminal(tw) + + +class ReprTraceback(TerminalRepr): + entrysep = "_ " + + def __init__(self, reprentries, extraline, style): + self.reprentries = reprentries + self.extraline = extraline + self.style = style + + def toterminal(self, tw): + # the entries might have different styles + for i, entry in enumerate(self.reprentries): + if entry.style == "long": + tw.line("") + entry.toterminal(tw) + if i < len(self.reprentries) - 1: + next_entry = self.reprentries[i + 1] + if ( + entry.style == "long" + or entry.style == "short" + and next_entry.style == "long" + ): + tw.sep(self.entrysep) + + if self.extraline: + tw.line(self.extraline) + + +class ReprTracebackNative(ReprTraceback): + def __init__(self, tblines): + self.style = "native" + self.reprentries = [ReprEntryNative(tblines)] + self.extraline = None + + +class ReprEntryNative(TerminalRepr): + style = "native" + + def __init__(self, tblines): + self.lines = tblines + + def toterminal(self, tw): + tw.write("".join(self.lines)) + + +class ReprEntry(TerminalRepr): + localssep = "_ " + + def __init__(self, lines, reprfuncargs, reprlocals, filelocrepr, style): + self.lines = lines + self.reprfuncargs = reprfuncargs + self.reprlocals = reprlocals + self.reprfileloc = filelocrepr + self.style = style + + def toterminal(self, tw): + if self.style == "short": + self.reprfileloc.toterminal(tw) + for line in self.lines: + red = line.startswith("E ") + tw.line(line, bold=True, red=red) + # tw.line("") + return + if self.reprfuncargs: + self.reprfuncargs.toterminal(tw) + for line in self.lines: + red = line.startswith("E ") + tw.line(line, bold=True, red=red) + if self.reprlocals: + # tw.sep(self.localssep, "Locals") + tw.line("") + self.reprlocals.toterminal(tw) + if self.reprfileloc: + if self.lines: + tw.line("") + self.reprfileloc.toterminal(tw) + + def __str__(self): + return "%s\n%s\n%s" % ("\n".join(self.lines), self.reprlocals, self.reprfileloc) + + +class ReprFileLocation(TerminalRepr): + def __init__(self, path, lineno, message): + self.path = str(path) + self.lineno = lineno + self.message = message + + def toterminal(self, tw): + # filename and lineno output for each entry, + # using an output format that most editors unterstand + msg = self.message + i = msg.find("\n") + if i != -1: + msg = msg[:i] + tw.write(self.path, bold=True, red=True) + tw.line(":%s: %s" % (self.lineno, msg)) + + +class ReprLocals(TerminalRepr): + def __init__(self, lines): + self.lines = lines + + def toterminal(self, tw): + for line in self.lines: + tw.line(line) + + +class ReprFuncArgs(TerminalRepr): + def __init__(self, args): + self.args = args + + def toterminal(self, tw): + if self.args: + linesofar = "" + for name, value in self.args: + ns = "%s = %s" % (safe_str(name), safe_str(value)) + if len(ns) + len(linesofar) + 2 > tw.fullwidth: + if linesofar: + tw.line(linesofar) + linesofar = ns + else: + if linesofar: + linesofar += ", " + ns + else: + linesofar = ns + if linesofar: + tw.line(linesofar) + tw.line("") + + +def getrawcode(obj, trycall=True): + """ return code object for given function. """ + try: + return obj.__code__ + except AttributeError: + obj = getattr(obj, "im_func", obj) + obj = getattr(obj, "func_code", obj) + obj = getattr(obj, "f_code", obj) + obj = getattr(obj, "__code__", obj) + if trycall and not hasattr(obj, "co_firstlineno"): + if hasattr(obj, "__call__") and not inspect.isclass(obj): + x = getrawcode(obj.__call__, trycall=False) + if hasattr(x, "co_firstlineno"): + return x + return obj + + +if PY35: # RecursionError introduced in 3.5 + + def is_recursion_error(excinfo): + return excinfo.errisinstance(RecursionError) # noqa + + +else: + + def is_recursion_error(excinfo): + if not excinfo.errisinstance(RuntimeError): + return False + try: + return "maximum recursion depth exceeded" in str(excinfo.value) + except UnicodeError: + return False + + +# relative paths that we use to filter traceback entries from appearing to the user; +# see filter_traceback +# note: if we need to add more paths than what we have now we should probably use a list +# for better maintenance + +_PLUGGY_DIR = py.path.local(pluggy.__file__.rstrip("oc")) +# pluggy is either a package or a single module depending on the version +if _PLUGGY_DIR.basename == "__init__.py": + _PLUGGY_DIR = _PLUGGY_DIR.dirpath() +_PYTEST_DIR = py.path.local(_pytest.__file__).dirpath() +_PY_DIR = py.path.local(py.__file__).dirpath() + + +def filter_traceback(entry): + """Return True if a TracebackEntry instance should be removed from tracebacks: + * dynamically generated code (no code to show up for it); + * internal traceback from pytest or its internal libraries, py and pluggy. + """ + # entry.path might sometimes return a str object when the entry + # points to dynamically generated code + # see https://bitbucket.org/pytest-dev/py/issues/71 + raw_filename = entry.frame.code.raw.co_filename + is_generated = "<" in raw_filename and ">" in raw_filename + if is_generated: + return False + # entry.path might point to a non-existing file, in which case it will + # also return a str object. see #1133 + p = py.path.local(entry.path) + return ( + not p.relto(_PLUGGY_DIR) and not p.relto(_PYTEST_DIR) and not p.relto(_PY_DIR) + ) diff --git a/venv/Lib/site-packages/_pytest/_code/source.py b/venv/Lib/site-packages/_pytest/_code/source.py new file mode 100644 index 00000000..f78d8bef --- /dev/null +++ b/venv/Lib/site-packages/_pytest/_code/source.py @@ -0,0 +1,322 @@ +from __future__ import absolute_import, division, print_function + +import ast +from ast import PyCF_ONLY_AST as _AST_FLAG +from bisect import bisect_right +import linecache +import sys +import six +import inspect +import textwrap +import tokenize +import py + +cpy_compile = compile + + +class Source(object): + """ an immutable object holding a source code fragment, + possibly deindenting it. + """ + + _compilecounter = 0 + + def __init__(self, *parts, **kwargs): + self.lines = lines = [] + de = kwargs.get("deindent", True) + for part in parts: + if not part: + partlines = [] + elif isinstance(part, Source): + partlines = part.lines + elif isinstance(part, (tuple, list)): + partlines = [x.rstrip("\n") for x in part] + elif isinstance(part, six.string_types): + partlines = part.split("\n") + else: + partlines = getsource(part, deindent=de).lines + if de: + partlines = deindent(partlines) + lines.extend(partlines) + + def __eq__(self, other): + try: + return self.lines == other.lines + except AttributeError: + if isinstance(other, str): + return str(self) == other + return False + + __hash__ = None + + def __getitem__(self, key): + if isinstance(key, int): + return self.lines[key] + else: + if key.step not in (None, 1): + raise IndexError("cannot slice a Source with a step") + newsource = Source() + newsource.lines = self.lines[key.start : key.stop] + return newsource + + def __len__(self): + return len(self.lines) + + def strip(self): + """ return new source object with trailing + and leading blank lines removed. + """ + start, end = 0, len(self) + while start < end and not self.lines[start].strip(): + start += 1 + while end > start and not self.lines[end - 1].strip(): + end -= 1 + source = Source() + source.lines[:] = self.lines[start:end] + return source + + def putaround(self, before="", after="", indent=" " * 4): + """ return a copy of the source object with + 'before' and 'after' wrapped around it. + """ + before = Source(before) + after = Source(after) + newsource = Source() + lines = [(indent + line) for line in self.lines] + newsource.lines = before.lines + lines + after.lines + return newsource + + def indent(self, indent=" " * 4): + """ return a copy of the source object with + all lines indented by the given indent-string. + """ + newsource = Source() + newsource.lines = [(indent + line) for line in self.lines] + return newsource + + def getstatement(self, lineno): + """ return Source statement which contains the + given linenumber (counted from 0). + """ + start, end = self.getstatementrange(lineno) + return self[start:end] + + def getstatementrange(self, lineno): + """ return (start, end) tuple which spans the minimal + statement region which containing the given lineno. + """ + if not (0 <= lineno < len(self)): + raise IndexError("lineno out of range") + ast, start, end = getstatementrange_ast(lineno, self) + return start, end + + def deindent(self): + """return a new source object deindented.""" + newsource = Source() + newsource.lines[:] = deindent(self.lines) + return newsource + + def isparseable(self, deindent=True): + """ return True if source is parseable, heuristically + deindenting it by default. + """ + from parser import suite as syntax_checker + + if deindent: + source = str(self.deindent()) + else: + source = str(self) + try: + # compile(source+'\n', "x", "exec") + syntax_checker(source + "\n") + except KeyboardInterrupt: + raise + except Exception: + return False + else: + return True + + def __str__(self): + return "\n".join(self.lines) + + def compile( + self, filename=None, mode="exec", flag=0, dont_inherit=0, _genframe=None + ): + """ return compiled code object. if filename is None + invent an artificial filename which displays + the source/line position of the caller frame. + """ + if not filename or py.path.local(filename).check(file=0): + if _genframe is None: + _genframe = sys._getframe(1) # the caller + fn, lineno = _genframe.f_code.co_filename, _genframe.f_lineno + base = "<%d-codegen " % self._compilecounter + self.__class__._compilecounter += 1 + if not filename: + filename = base + "%s:%d>" % (fn, lineno) + else: + filename = base + "%r %s:%d>" % (filename, fn, lineno) + source = "\n".join(self.lines) + "\n" + try: + co = cpy_compile(source, filename, mode, flag) + except SyntaxError: + ex = sys.exc_info()[1] + # re-represent syntax errors from parsing python strings + msglines = self.lines[: ex.lineno] + if ex.offset: + msglines.append(" " * ex.offset + "^") + msglines.append("(code was compiled probably from here: %s)" % filename) + newex = SyntaxError("\n".join(msglines)) + newex.offset = ex.offset + newex.lineno = ex.lineno + newex.text = ex.text + raise newex + else: + if flag & _AST_FLAG: + return co + lines = [(x + "\n") for x in self.lines] + linecache.cache[filename] = (1, None, lines, filename) + return co + + +# +# public API shortcut functions +# + + +def compile_(source, filename=None, mode="exec", flags=0, dont_inherit=0): + """ compile the given source to a raw code object, + and maintain an internal cache which allows later + retrieval of the source code for the code object + and any recursively created code objects. + """ + if isinstance(source, ast.AST): + # XXX should Source support having AST? + return cpy_compile(source, filename, mode, flags, dont_inherit) + _genframe = sys._getframe(1) # the caller + s = Source(source) + co = s.compile(filename, mode, flags, _genframe=_genframe) + return co + + +def getfslineno(obj): + """ Return source location (path, lineno) for the given object. + If the source cannot be determined return ("", -1) + """ + from .code import Code + + try: + code = Code(obj) + except TypeError: + try: + fn = inspect.getsourcefile(obj) or inspect.getfile(obj) + except TypeError: + return "", -1 + + fspath = fn and py.path.local(fn) or None + lineno = -1 + if fspath: + try: + _, lineno = findsource(obj) + except IOError: + pass + else: + fspath = code.path + lineno = code.firstlineno + assert isinstance(lineno, int) + return fspath, lineno + + +# +# helper functions +# + + +def findsource(obj): + try: + sourcelines, lineno = inspect.findsource(obj) + except py.builtin._sysex: + raise + except: # noqa + return None, -1 + source = Source() + source.lines = [line.rstrip() for line in sourcelines] + return source, lineno + + +def getsource(obj, **kwargs): + from .code import getrawcode + + obj = getrawcode(obj) + try: + strsrc = inspect.getsource(obj) + except IndentationError: + strsrc = '"Buggy python version consider upgrading, cannot get source"' + assert isinstance(strsrc, str) + return Source(strsrc, **kwargs) + + +def deindent(lines): + return textwrap.dedent("\n".join(lines)).splitlines() + + +def get_statement_startend2(lineno, node): + import ast + + # flatten all statements and except handlers into one lineno-list + # AST's line numbers start indexing at 1 + values = [] + for x in ast.walk(node): + if isinstance(x, (ast.stmt, ast.ExceptHandler)): + values.append(x.lineno - 1) + for name in ("finalbody", "orelse"): + val = getattr(x, name, None) + if val: + # treat the finally/orelse part as its own statement + values.append(val[0].lineno - 1 - 1) + values.sort() + insert_index = bisect_right(values, lineno) + start = values[insert_index - 1] + if insert_index >= len(values): + end = None + else: + end = values[insert_index] + return start, end + + +def getstatementrange_ast(lineno, source, assertion=False, astnode=None): + if astnode is None: + content = str(source) + astnode = compile(content, "source", "exec", 1024) # 1024 for AST + + start, end = get_statement_startend2(lineno, astnode) + # we need to correct the end: + # - ast-parsing strips comments + # - there might be empty lines + # - we might have lesser indented code blocks at the end + if end is None: + end = len(source.lines) + + if end > start + 1: + # make sure we don't span differently indented code blocks + # by using the BlockFinder helper used which inspect.getsource() uses itself + block_finder = inspect.BlockFinder() + # if we start with an indented line, put blockfinder to "started" mode + block_finder.started = source.lines[start][0].isspace() + it = ((x + "\n") for x in source.lines[start:end]) + try: + for tok in tokenize.generate_tokens(lambda: next(it)): + block_finder.tokeneater(*tok) + except (inspect.EndOfBlock, IndentationError): + end = block_finder.last + start + except Exception: + pass + + # the end might still point to a comment or empty line, correct it + while end: + line = source.lines[end - 1].lstrip() + if line.startswith("#") or not line: + end -= 1 + else: + break + return astnode, start, end diff --git a/venv/Lib/site-packages/_pytest/_version.py b/venv/Lib/site-packages/_pytest/_version.py new file mode 100644 index 00000000..de6fd8ad --- /dev/null +++ b/venv/Lib/site-packages/_pytest/_version.py @@ -0,0 +1,4 @@ +# coding: utf-8 +# file generated by setuptools_scm +# don't change, don't track in version control +version = '3.9.1' diff --git a/venv/Lib/site-packages/_pytest/assertion/__init__.py b/venv/Lib/site-packages/_pytest/assertion/__init__.py new file mode 100644 index 00000000..2c9a8890 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/assertion/__init__.py @@ -0,0 +1,151 @@ +""" +support for presenting detailed information in failing assertions. +""" +from __future__ import absolute_import, division, print_function +import sys +import six + +from _pytest.assertion import util +from _pytest.assertion import rewrite +from _pytest.assertion import truncate + + +def pytest_addoption(parser): + group = parser.getgroup("debugconfig") + group.addoption( + "--assert", + action="store", + dest="assertmode", + choices=("rewrite", "plain"), + default="rewrite", + metavar="MODE", + help="""Control assertion debugging tools. 'plain' + performs no assertion debugging. 'rewrite' + (the default) rewrites assert statements in + test modules on import to provide assert + expression information.""", + ) + + +def register_assert_rewrite(*names): + """Register one or more module names to be rewritten on import. + + This function will make sure that this module or all modules inside + the package will get their assert statements rewritten. + Thus you should make sure to call this before the module is + actually imported, usually in your __init__.py if you are a plugin + using a package. + + :raise TypeError: if the given module names are not strings. + """ + for name in names: + if not isinstance(name, str): + msg = "expected module names as *args, got {0} instead" + raise TypeError(msg.format(repr(names))) + for hook in sys.meta_path: + if isinstance(hook, rewrite.AssertionRewritingHook): + importhook = hook + break + else: + importhook = DummyRewriteHook() + importhook.mark_rewrite(*names) + + +class DummyRewriteHook(object): + """A no-op import hook for when rewriting is disabled.""" + + def mark_rewrite(self, *names): + pass + + +class AssertionState(object): + """State for the assertion plugin.""" + + def __init__(self, config, mode): + self.mode = mode + self.trace = config.trace.root.get("assertion") + self.hook = None + + +def install_importhook(config): + """Try to install the rewrite hook, raise SystemError if it fails.""" + # Jython has an AST bug that make the assertion rewriting hook malfunction. + if sys.platform.startswith("java"): + raise SystemError("rewrite not supported") + + config._assertstate = AssertionState(config, "rewrite") + config._assertstate.hook = hook = rewrite.AssertionRewritingHook(config) + sys.meta_path.insert(0, hook) + config._assertstate.trace("installed rewrite import hook") + + def undo(): + hook = config._assertstate.hook + if hook is not None and hook in sys.meta_path: + sys.meta_path.remove(hook) + + config.add_cleanup(undo) + return hook + + +def pytest_collection(session): + # this hook is only called when test modules are collected + # so for example not in the master process of pytest-xdist + # (which does not collect test modules) + assertstate = getattr(session.config, "_assertstate", None) + if assertstate: + if assertstate.hook is not None: + assertstate.hook.set_session(session) + + +def pytest_runtest_setup(item): + """Setup the pytest_assertrepr_compare hook + + The newinterpret and rewrite modules will use util._reprcompare if + it exists to use custom reporting via the + pytest_assertrepr_compare hook. This sets up this custom + comparison for the test. + """ + + def callbinrepr(op, left, right): + """Call the pytest_assertrepr_compare hook and prepare the result + + This uses the first result from the hook and then ensures the + following: + * Overly verbose explanations are truncated unless configured otherwise + (eg. if running in verbose mode). + * Embedded newlines are escaped to help util.format_explanation() + later. + * If the rewrite mode is used embedded %-characters are replaced + to protect later % formatting. + + The result can be formatted by util.format_explanation() for + pretty printing. + """ + hook_result = item.ihook.pytest_assertrepr_compare( + config=item.config, op=op, left=left, right=right + ) + for new_expl in hook_result: + if new_expl: + new_expl = truncate.truncate_if_required(new_expl, item) + new_expl = [line.replace("\n", "\\n") for line in new_expl] + res = six.text_type("\n~").join(new_expl) + if item.config.getvalue("assertmode") == "rewrite": + res = res.replace("%", "%%") + return res + + util._reprcompare = callbinrepr + + +def pytest_runtest_teardown(item): + util._reprcompare = None + + +def pytest_sessionfinish(session): + assertstate = getattr(session.config, "_assertstate", None) + if assertstate: + if assertstate.hook is not None: + assertstate.hook.set_session(None) + + +# Expose this plugin's implementation for the pytest_assertrepr_compare hook +pytest_assertrepr_compare = util.assertrepr_compare diff --git a/venv/Lib/site-packages/_pytest/assertion/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/_pytest/assertion/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54e832e0e03b2da5f3843c4b210a37726a592e71 GIT binary patch literal 5534 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/assertion/__pycache__/truncate.cpython-37.pyc b/venv/Lib/site-packages/_pytest/assertion/__pycache__/truncate.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88d1238602b6fb03181d3623d97e59dec14b91c2 GIT binary patch literal 2713 zcmZuzTW{mW6`mm}ilS|;>}(QmnzWOojVmB4Y%XY%U}4m2J6i+0MjEf1f>l7!nvpbX zisa4=wYEY91-u3F6Z+_V>}wwT2m0PezV@N;U&u>)4rR;oq9gFkjhxGO&i5TXSXuE2 zlz)8k&p+EMg!~&jSH*_L@8HoK3?~8Mlv^kakwUY6 zs+duE(u<5t1}xHAC?nH^rMby+)A9Z7Tq%(l#zjBMW5bTbFdEA=S4?VV(yOn~9?oEs6!QI;xGdR&gBhK1o2 zH}JrEm_F|z?pUyfSI9Oz`ZgFt3VKFW%g}H4*;4>&sW=IKUhH&|7uof=N zWFKY)8_2Op;M&?SX~YP@60sb}qgZsRwc1wsdI)F9V;)|50B!}Z!tlJmuyETBmKM6D zQ@!htqLVNd$-oT%P87!3Pto=l-9vDr?mpgn_;Bz0k2*WM2i>hK+lfrneU$d1xcfwm zvTi1`yE4%xisQQ<9goMKr}?Md>=e)34KM5Y9lKX&>SU+o?W;~G`=Juga;XGgLkL|k z#PO&{)iSht6#GyR<2lZ6L8l;3$y55&n$m)DdQ8%FW1o>_MBAEdR|tJG6o90{a7a=! z!~FjOdLxR{WQOkrZr657x0fb;IVjyU!?-BxW1)^xEy`wi8DwFaggx1|6h@3{p+O*L zW(iw(tDnK69Wcc4X*JTr4i>y522vG7csV5Tz?woZahp3Y;IcaqOc+k>+T`B$Q1p&5 zPM(VmC0K7pu=sQ_=pzVwrcX7*LnpAd_k!gIhkK89!u`X?4|c!40W0pT@mU8`kZ)TE zsR3}0-9N(7o>{yK;e7}=E7fIPBx9-41iPJkr9F<+E7$$0aep8Zh&8qO0j`TcI%M+h zO}skyV+sOXmtFYGlxM+o>1!00Cb2`?cgJ4%k{tFsa zaCmCj5V(~Ef#RukL#LLpxOHw9jE$A^-n}uCiRSmZ;z!L@it96G=9pe;E zVVzl1sJVTIaOX{et@~v5HCX42u9Io4sPWowq2}(?#rCnK{#LlWehxD)Da^P@6Z+nD zA9{`RnsH~dg>zmv-g$#tFDcdqj1QnqVLylffAXK3VltD8Sb|ifeWnfQ*Z`z;7#TK- zjzOgJtdf*D7ukXifI=@SQzgklR=oM_N^F5ZzxnhY>kT6n^+1U=yUU&rWp5~e3)Rvx z0kLOFL@=hS1^ZHI(_v3Q%9I#IvXbdayxDUZ$B+hK9Av&HI6FFJ5zBQn5Nrgh4)u(J z`z5*fFO-Sh>2xlTC6je%eVN1ev-~p89(=OOe*N9FIx!nc&PCFmtj&k?e9ZZfeK&3U zF#xo~AM>-@I1Uqtg(v2zzOsn9_wD zIEqZ!I6T;TxEnq`cv!mP#E68Kww5Pl!$2=Ir-=Ye?=^=Hopt2$3Dqj5n4NxX}4k-@#Q}N~vOmy6uS|=aR_^?C1{h(`2ZQzRq zNfEdKe4)pV+Wd-KjQ|&{XTSUgc}5Dm;#sYL7Vyn2Ts0|xv%si2@PicfY91H`yah%8 z8*0D?dtae$DU6P`qu#;x&%u-pk>n$xA|pyS$}(_A+f%>7=?yT!YmokMk}tS2XwC;^ z!o^A8UwbQPT{}Su4gX{UzmNY&D(r(h*X`>#$slgbtG@UJ?EV!z`fV`8S_3~gbd9#C zMO*grr5C^_RN6>U}hrZ4~aH z-bI7Cw8}Y^TvooVmR~qrm9j8fmEL{$7nR3i6O~lI0mgwq@hlGx3P0O#c%J9_8~+33 CG268O literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/assertion/__pycache__/util.cpython-37.pyc b/venv/Lib/site-packages/_pytest/assertion/__pycache__/util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b0bed8fc4d2734c622e191d3a45ba4f29f776ec GIT binary patch literal 9997 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/assertion/rewrite.py b/venv/Lib/site-packages/_pytest/assertion/rewrite.py new file mode 100644 index 00000000..5e76563d --- /dev/null +++ b/venv/Lib/site-packages/_pytest/assertion/rewrite.py @@ -0,0 +1,1033 @@ +"""Rewrite assertion AST to produce nice error messages""" +from __future__ import absolute_import, division, print_function +import ast +import errno +import itertools +import imp +import marshal +import os +import re +import six +import string +import struct +import sys +import types + +import atomicwrites +import py + +from _pytest.assertion import util +from _pytest.pathlib import PurePath +from _pytest.compat import spec_from_file_location +from _pytest.pathlib import fnmatch_ex + +# pytest caches rewritten pycs in __pycache__. +if hasattr(imp, "get_tag"): + PYTEST_TAG = imp.get_tag() + "-PYTEST" +else: + if hasattr(sys, "pypy_version_info"): + impl = "pypy" + elif sys.platform == "java": + impl = "jython" + else: + impl = "cpython" + ver = sys.version_info + PYTEST_TAG = "%s-%s%s-PYTEST" % (impl, ver[0], ver[1]) + del ver, impl + +PYC_EXT = ".py" + (__debug__ and "c" or "o") +PYC_TAIL = "." + PYTEST_TAG + PYC_EXT + +ASCII_IS_DEFAULT_ENCODING = sys.version_info[0] < 3 + +if sys.version_info >= (3, 5): + ast_Call = ast.Call +else: + + def ast_Call(a, b, c): + return ast.Call(a, b, c, None, None) + + +class AssertionRewritingHook(object): + """PEP302 Import hook which rewrites asserts.""" + + def __init__(self, config): + self.config = config + self.fnpats = config.getini("python_files") + self.session = None + self.modules = {} + self._rewritten_names = set() + self._register_with_pkg_resources() + self._must_rewrite = set() + # flag to guard against trying to rewrite a pyc file while we are already writing another pyc file, + # which might result in infinite recursion (#3506) + self._writing_pyc = False + self._basenames_to_check_rewrite = {"conftest"} + self._marked_for_rewrite_cache = {} + self._session_paths_checked = False + + def set_session(self, session): + self.session = session + self._session_paths_checked = False + + def _imp_find_module(self, name, path=None): + """Indirection so we can mock calls to find_module originated from the hook during testing""" + return imp.find_module(name, path) + + def find_module(self, name, path=None): + if self._writing_pyc: + return None + state = self.config._assertstate + if self._early_rewrite_bailout(name, state): + return None + state.trace("find_module called for: %s" % name) + names = name.rsplit(".", 1) + lastname = names[-1] + pth = None + if path is not None: + # Starting with Python 3.3, path is a _NamespacePath(), which + # causes problems if not converted to list. + path = list(path) + if len(path) == 1: + pth = path[0] + if pth is None: + try: + fd, fn, desc = self._imp_find_module(lastname, path) + except ImportError: + return None + if fd is not None: + fd.close() + tp = desc[2] + if tp == imp.PY_COMPILED: + if hasattr(imp, "source_from_cache"): + try: + fn = imp.source_from_cache(fn) + except ValueError: + # Python 3 doesn't like orphaned but still-importable + # .pyc files. + fn = fn[:-1] + else: + fn = fn[:-1] + elif tp != imp.PY_SOURCE: + # Don't know what this is. + return None + else: + fn = os.path.join(pth, name.rpartition(".")[2] + ".py") + + fn_pypath = py.path.local(fn) + if not self._should_rewrite(name, fn_pypath, state): + return None + + self._rewritten_names.add(name) + + # The requested module looks like a test file, so rewrite it. This is + # the most magical part of the process: load the source, rewrite the + # asserts, and load the rewritten source. We also cache the rewritten + # module code in a special pyc. We must be aware of the possibility of + # concurrent pytest processes rewriting and loading pycs. To avoid + # tricky race conditions, we maintain the following invariant: The + # cached pyc is always a complete, valid pyc. Operations on it must be + # atomic. POSIX's atomic rename comes in handy. + write = not sys.dont_write_bytecode + cache_dir = os.path.join(fn_pypath.dirname, "__pycache__") + if write: + try: + os.mkdir(cache_dir) + except OSError: + e = sys.exc_info()[1].errno + if e == errno.EEXIST: + # Either the __pycache__ directory already exists (the + # common case) or it's blocked by a non-dir node. In the + # latter case, we'll ignore it in _write_pyc. + pass + elif e in [errno.ENOENT, errno.ENOTDIR]: + # One of the path components was not a directory, likely + # because we're in a zip file. + write = False + elif e in [errno.EACCES, errno.EROFS, errno.EPERM]: + state.trace("read only directory: %r" % fn_pypath.dirname) + write = False + else: + raise + cache_name = fn_pypath.basename[:-3] + PYC_TAIL + pyc = os.path.join(cache_dir, cache_name) + # Notice that even if we're in a read-only directory, I'm going + # to check for a cached pyc. This may not be optimal... + co = _read_pyc(fn_pypath, pyc, state.trace) + if co is None: + state.trace("rewriting %r" % (fn,)) + source_stat, co = _rewrite_test(self.config, fn_pypath) + if co is None: + # Probably a SyntaxError in the test. + return None + if write: + self._writing_pyc = True + try: + _write_pyc(state, co, source_stat, pyc) + finally: + self._writing_pyc = False + else: + state.trace("found cached rewritten pyc for %r" % (fn,)) + self.modules[name] = co, pyc + return self + + def _early_rewrite_bailout(self, name, state): + """ + This is a fast way to get out of rewriting modules. Profiling has + shown that the call to imp.find_module (inside of the find_module + from this class) is a major slowdown, so, this method tries to + filter what we're sure won't be rewritten before getting to it. + """ + if self.session is not None and not self._session_paths_checked: + self._session_paths_checked = True + for path in self.session._initialpaths: + # Make something as c:/projects/my_project/path.py -> + # ['c:', 'projects', 'my_project', 'path.py'] + parts = str(path).split(os.path.sep) + # add 'path' to basenames to be checked. + self._basenames_to_check_rewrite.add(os.path.splitext(parts[-1])[0]) + + # Note: conftest already by default in _basenames_to_check_rewrite. + parts = name.split(".") + if parts[-1] in self._basenames_to_check_rewrite: + return False + + # For matching the name it must be as if it was a filename. + path = PurePath(os.path.sep.join(parts) + ".py") + + for pat in self.fnpats: + # if the pattern contains subdirectories ("tests/**.py" for example) we can't bail out based + # on the name alone because we need to match against the full path + if os.path.dirname(pat): + return False + if fnmatch_ex(pat, path): + return False + + if self._is_marked_for_rewrite(name, state): + return False + + state.trace("early skip of rewriting module: %s" % (name,)) + return True + + def _should_rewrite(self, name, fn_pypath, state): + # always rewrite conftest files + fn = str(fn_pypath) + if fn_pypath.basename == "conftest.py": + state.trace("rewriting conftest file: %r" % (fn,)) + return True + + if self.session is not None: + if self.session.isinitpath(fn): + state.trace("matched test file (was specified on cmdline): %r" % (fn,)) + return True + + # modules not passed explicitly on the command line are only + # rewritten if they match the naming convention for test files + for pat in self.fnpats: + if fn_pypath.fnmatch(pat): + state.trace("matched test file %r" % (fn,)) + return True + + return self._is_marked_for_rewrite(name, state) + + def _is_marked_for_rewrite(self, name, state): + try: + return self._marked_for_rewrite_cache[name] + except KeyError: + for marked in self._must_rewrite: + if name == marked or name.startswith(marked + "."): + state.trace("matched marked file %r (from %r)" % (name, marked)) + self._marked_for_rewrite_cache[name] = True + return True + + self._marked_for_rewrite_cache[name] = False + return False + + def mark_rewrite(self, *names): + """Mark import names as needing to be rewritten. + + The named module or package as well as any nested modules will + be rewritten on import. + """ + already_imported = ( + set(names).intersection(sys.modules).difference(self._rewritten_names) + ) + for name in already_imported: + if not AssertionRewriter.is_rewrite_disabled( + sys.modules[name].__doc__ or "" + ): + self._warn_already_imported(name) + self._must_rewrite.update(names) + self._marked_for_rewrite_cache.clear() + + def _warn_already_imported(self, name): + from _pytest.warning_types import PytestWarning + from _pytest.warnings import _issue_config_warning + + _issue_config_warning( + PytestWarning("Module already imported so cannot be rewritten: %s" % name), + self.config, + ) + + def load_module(self, name): + co, pyc = self.modules.pop(name) + if name in sys.modules: + # If there is an existing module object named 'fullname' in + # sys.modules, the loader must use that existing module. (Otherwise, + # the reload() builtin will not work correctly.) + mod = sys.modules[name] + else: + # I wish I could just call imp.load_compiled here, but __file__ has to + # be set properly. In Python 3.2+, this all would be handled correctly + # by load_compiled. + mod = sys.modules[name] = imp.new_module(name) + try: + mod.__file__ = co.co_filename + # Normally, this attribute is 3.2+. + mod.__cached__ = pyc + mod.__loader__ = self + # Normally, this attribute is 3.4+ + mod.__spec__ = spec_from_file_location(name, co.co_filename, loader=self) + six.exec_(co, mod.__dict__) + except: # noqa + if name in sys.modules: + del sys.modules[name] + raise + return sys.modules[name] + + def is_package(self, name): + try: + fd, fn, desc = self._imp_find_module(name) + except ImportError: + return False + if fd is not None: + fd.close() + tp = desc[2] + return tp == imp.PKG_DIRECTORY + + @classmethod + def _register_with_pkg_resources(cls): + """ + Ensure package resources can be loaded from this loader. May be called + multiple times, as the operation is idempotent. + """ + try: + import pkg_resources + + # access an attribute in case a deferred importer is present + pkg_resources.__name__ + except ImportError: + return + + # Since pytest tests are always located in the file system, the + # DefaultProvider is appropriate. + pkg_resources.register_loader_type(cls, pkg_resources.DefaultProvider) + + def get_data(self, pathname): + """Optional PEP302 get_data API. + """ + with open(pathname, "rb") as f: + return f.read() + + +def _write_pyc(state, co, source_stat, pyc): + # Technically, we don't have to have the same pyc format as + # (C)Python, since these "pycs" should never be seen by builtin + # import. However, there's little reason deviate, and I hope + # sometime to be able to use imp.load_compiled to load them. (See + # the comment in load_module above.) + try: + with atomicwrites.atomic_write(pyc, mode="wb", overwrite=True) as fp: + fp.write(imp.get_magic()) + mtime = int(source_stat.mtime) + size = source_stat.size & 0xFFFFFFFF + fp.write(struct.pack(">", + ast.Add: "+", + ast.Sub: "-", + ast.Mult: "*", + ast.Div: "/", + ast.FloorDiv: "//", + ast.Mod: "%%", # escaped for string formatting + ast.Eq: "==", + ast.NotEq: "!=", + ast.Lt: "<", + ast.LtE: "<=", + ast.Gt: ">", + ast.GtE: ">=", + ast.Pow: "**", + ast.Is: "is", + ast.IsNot: "is not", + ast.In: "in", + ast.NotIn: "not in", +} +# Python 3.5+ compatibility +try: + binop_map[ast.MatMult] = "@" +except AttributeError: + pass + +# Python 3.4+ compatibility +if hasattr(ast, "NameConstant"): + _NameConstant = ast.NameConstant +else: + + def _NameConstant(c): + return ast.Name(str(c), ast.Load()) + + +def set_location(node, lineno, col_offset): + """Set node location information recursively.""" + + def _fix(node, lineno, col_offset): + if "lineno" in node._attributes: + node.lineno = lineno + if "col_offset" in node._attributes: + node.col_offset = col_offset + for child in ast.iter_child_nodes(node): + _fix(child, lineno, col_offset) + + _fix(node, lineno, col_offset) + return node + + +class AssertionRewriter(ast.NodeVisitor): + """Assertion rewriting implementation. + + The main entrypoint is to call .run() with an ast.Module instance, + this will then find all the assert statements and rewrite them to + provide intermediate values and a detailed assertion error. See + http://pybites.blogspot.be/2011/07/behind-scenes-of-pytests-new-assertion.html + for an overview of how this works. + + The entry point here is .run() which will iterate over all the + statements in an ast.Module and for each ast.Assert statement it + finds call .visit() with it. Then .visit_Assert() takes over and + is responsible for creating new ast statements to replace the + original assert statement: it rewrites the test of an assertion + to provide intermediate values and replace it with an if statement + which raises an assertion error with a detailed explanation in + case the expression is false. + + For this .visit_Assert() uses the visitor pattern to visit all the + AST nodes of the ast.Assert.test field, each visit call returning + an AST node and the corresponding explanation string. During this + state is kept in several instance attributes: + + :statements: All the AST statements which will replace the assert + statement. + + :variables: This is populated by .variable() with each variable + used by the statements so that they can all be set to None at + the end of the statements. + + :variable_counter: Counter to create new unique variables needed + by statements. Variables are created using .variable() and + have the form of "@py_assert0". + + :on_failure: The AST statements which will be executed if the + assertion test fails. This is the code which will construct + the failure message and raises the AssertionError. + + :explanation_specifiers: A dict filled by .explanation_param() + with %-formatting placeholders and their corresponding + expressions to use in the building of an assertion message. + This is used by .pop_format_context() to build a message. + + :stack: A stack of the explanation_specifiers dicts maintained by + .push_format_context() and .pop_format_context() which allows + to build another %-formatted string while already building one. + + This state is reset on every new assert statement visited and used + by the other visitors. + + """ + + def __init__(self, module_path, config): + super(AssertionRewriter, self).__init__() + self.module_path = module_path + self.config = config + + def run(self, mod): + """Find all assert statements in *mod* and rewrite them.""" + if not mod.body: + # Nothing to do. + return + # Insert some special imports at the top of the module but after any + # docstrings and __future__ imports. + aliases = [ + ast.alias(py.builtin.builtins.__name__, "@py_builtins"), + ast.alias("_pytest.assertion.rewrite", "@pytest_ar"), + ] + doc = getattr(mod, "docstring", None) + expect_docstring = doc is None + if doc is not None and self.is_rewrite_disabled(doc): + return + pos = 0 + lineno = 1 + for item in mod.body: + if ( + expect_docstring + and isinstance(item, ast.Expr) + and isinstance(item.value, ast.Str) + ): + doc = item.value.s + if self.is_rewrite_disabled(doc): + return + expect_docstring = False + elif ( + not isinstance(item, ast.ImportFrom) + or item.level > 0 + or item.module != "__future__" + ): + lineno = item.lineno + break + pos += 1 + else: + lineno = item.lineno + imports = [ + ast.Import([alias], lineno=lineno, col_offset=0) for alias in aliases + ] + mod.body[pos:pos] = imports + # Collect asserts. + nodes = [mod] + while nodes: + node = nodes.pop() + for name, field in ast.iter_fields(node): + if isinstance(field, list): + new = [] + for i, child in enumerate(field): + if isinstance(child, ast.Assert): + # Transform assert. + new.extend(self.visit(child)) + else: + new.append(child) + if isinstance(child, ast.AST): + nodes.append(child) + setattr(node, name, new) + elif ( + isinstance(field, ast.AST) + and + # Don't recurse into expressions as they can't contain + # asserts. + not isinstance(field, ast.expr) + ): + nodes.append(field) + + @staticmethod + def is_rewrite_disabled(docstring): + return "PYTEST_DONT_REWRITE" in docstring + + def variable(self): + """Get a new variable.""" + # Use a character invalid in python identifiers to avoid clashing. + name = "@py_assert" + str(next(self.variable_counter)) + self.variables.append(name) + return name + + def assign(self, expr): + """Give *expr* a name.""" + name = self.variable() + self.statements.append(ast.Assign([ast.Name(name, ast.Store())], expr)) + return ast.Name(name, ast.Load()) + + def display(self, expr): + """Call py.io.saferepr on the expression.""" + return self.helper("saferepr", expr) + + def helper(self, name, *args): + """Call a helper in this module.""" + py_name = ast.Name("@pytest_ar", ast.Load()) + attr = ast.Attribute(py_name, "_" + name, ast.Load()) + return ast_Call(attr, list(args), []) + + def builtin(self, name): + """Return the builtin called *name*.""" + builtin_name = ast.Name("@py_builtins", ast.Load()) + return ast.Attribute(builtin_name, name, ast.Load()) + + def explanation_param(self, expr): + """Return a new named %-formatting placeholder for expr. + + This creates a %-formatting placeholder for expr in the + current formatting context, e.g. ``%(py0)s``. The placeholder + and expr are placed in the current format context so that it + can be used on the next call to .pop_format_context(). + + """ + specifier = "py" + str(next(self.variable_counter)) + self.explanation_specifiers[specifier] = expr + return "%(" + specifier + ")s" + + def push_format_context(self): + """Create a new formatting context. + + The format context is used for when an explanation wants to + have a variable value formatted in the assertion message. In + this case the value required can be added using + .explanation_param(). Finally .pop_format_context() is used + to format a string of %-formatted values as added by + .explanation_param(). + + """ + self.explanation_specifiers = {} + self.stack.append(self.explanation_specifiers) + + def pop_format_context(self, expl_expr): + """Format the %-formatted string with current format context. + + The expl_expr should be an ast.Str instance constructed from + the %-placeholders created by .explanation_param(). This will + add the required code to format said string to .on_failure and + return the ast.Name instance of the formatted string. + + """ + current = self.stack.pop() + if self.stack: + self.explanation_specifiers = self.stack[-1] + keys = [ast.Str(key) for key in current.keys()] + format_dict = ast.Dict(keys, list(current.values())) + form = ast.BinOp(expl_expr, ast.Mod(), format_dict) + name = "@py_format" + str(next(self.variable_counter)) + self.on_failure.append(ast.Assign([ast.Name(name, ast.Store())], form)) + return ast.Name(name, ast.Load()) + + def generic_visit(self, node): + """Handle expressions we don't have custom code for.""" + assert isinstance(node, ast.expr) + res = self.assign(node) + return res, self.explanation_param(self.display(res)) + + def visit_Assert(self, assert_): + """Return the AST statements to replace the ast.Assert instance. + + This rewrites the test of an assertion to provide + intermediate values and replace it with an if statement which + raises an assertion error with a detailed explanation in case + the expression is false. + + """ + if isinstance(assert_.test, ast.Tuple) and len(assert_.test.elts) >= 1: + from _pytest.warning_types import PytestWarning + import warnings + + warnings.warn_explicit( + PytestWarning("assertion is always true, perhaps remove parentheses?"), + category=None, + filename=str(self.module_path), + lineno=assert_.lineno, + ) + + self.statements = [] + self.variables = [] + self.variable_counter = itertools.count() + self.stack = [] + self.on_failure = [] + self.push_format_context() + # Rewrite assert into a bunch of statements. + top_condition, explanation = self.visit(assert_.test) + # Create failure message. + body = self.on_failure + negation = ast.UnaryOp(ast.Not(), top_condition) + self.statements.append(ast.If(negation, body, [])) + if assert_.msg: + assertmsg = self.helper("format_assertmsg", assert_.msg) + explanation = "\n>assert " + explanation + else: + assertmsg = ast.Str("") + explanation = "assert " + explanation + template = ast.BinOp(assertmsg, ast.Add(), ast.Str(explanation)) + msg = self.pop_format_context(template) + fmt = self.helper("format_explanation", msg) + err_name = ast.Name("AssertionError", ast.Load()) + exc = ast_Call(err_name, [fmt], []) + if sys.version_info[0] >= 3: + raise_ = ast.Raise(exc, None) + else: + raise_ = ast.Raise(exc, None, None) + body.append(raise_) + # Clear temporary variables by setting them to None. + if self.variables: + variables = [ast.Name(name, ast.Store()) for name in self.variables] + clear = ast.Assign(variables, _NameConstant(None)) + self.statements.append(clear) + # Fix line numbers. + for stmt in self.statements: + set_location(stmt, assert_.lineno, assert_.col_offset) + return self.statements + + def visit_Name(self, name): + # Display the repr of the name if it's a local variable or + # _should_repr_global_name() thinks it's acceptable. + locs = ast_Call(self.builtin("locals"), [], []) + inlocs = ast.Compare(ast.Str(name.id), [ast.In()], [locs]) + dorepr = self.helper("should_repr_global_name", name) + test = ast.BoolOp(ast.Or(), [inlocs, dorepr]) + expr = ast.IfExp(test, self.display(name), ast.Str(name.id)) + return name, self.explanation_param(expr) + + def visit_BoolOp(self, boolop): + res_var = self.variable() + expl_list = self.assign(ast.List([], ast.Load())) + app = ast.Attribute(expl_list, "append", ast.Load()) + is_or = int(isinstance(boolop.op, ast.Or)) + body = save = self.statements + fail_save = self.on_failure + levels = len(boolop.values) - 1 + self.push_format_context() + # Process each operand, short-circuting if needed. + for i, v in enumerate(boolop.values): + if i: + fail_inner = [] + # cond is set in a prior loop iteration below + self.on_failure.append(ast.If(cond, fail_inner, [])) # noqa + self.on_failure = fail_inner + self.push_format_context() + res, expl = self.visit(v) + body.append(ast.Assign([ast.Name(res_var, ast.Store())], res)) + expl_format = self.pop_format_context(ast.Str(expl)) + call = ast_Call(app, [expl_format], []) + self.on_failure.append(ast.Expr(call)) + if i < levels: + cond = res + if is_or: + cond = ast.UnaryOp(ast.Not(), cond) + inner = [] + self.statements.append(ast.If(cond, inner, [])) + self.statements = body = inner + self.statements = save + self.on_failure = fail_save + expl_template = self.helper("format_boolop", expl_list, ast.Num(is_or)) + expl = self.pop_format_context(expl_template) + return ast.Name(res_var, ast.Load()), self.explanation_param(expl) + + def visit_UnaryOp(self, unary): + pattern = unary_map[unary.op.__class__] + operand_res, operand_expl = self.visit(unary.operand) + res = self.assign(ast.UnaryOp(unary.op, operand_res)) + return res, pattern % (operand_expl,) + + def visit_BinOp(self, binop): + symbol = binop_map[binop.op.__class__] + left_expr, left_expl = self.visit(binop.left) + right_expr, right_expl = self.visit(binop.right) + explanation = "(%s %s %s)" % (left_expl, symbol, right_expl) + res = self.assign(ast.BinOp(left_expr, binop.op, right_expr)) + return res, explanation + + def visit_Call_35(self, call): + """ + visit `ast.Call` nodes on Python3.5 and after + """ + new_func, func_expl = self.visit(call.func) + arg_expls = [] + new_args = [] + new_kwargs = [] + for arg in call.args: + res, expl = self.visit(arg) + arg_expls.append(expl) + new_args.append(res) + for keyword in call.keywords: + res, expl = self.visit(keyword.value) + new_kwargs.append(ast.keyword(keyword.arg, res)) + if keyword.arg: + arg_expls.append(keyword.arg + "=" + expl) + else: # **args have `arg` keywords with an .arg of None + arg_expls.append("**" + expl) + + expl = "%s(%s)" % (func_expl, ", ".join(arg_expls)) + new_call = ast.Call(new_func, new_args, new_kwargs) + res = self.assign(new_call) + res_expl = self.explanation_param(self.display(res)) + outer_expl = "%s\n{%s = %s\n}" % (res_expl, res_expl, expl) + return res, outer_expl + + def visit_Starred(self, starred): + # From Python 3.5, a Starred node can appear in a function call + res, expl = self.visit(starred.value) + return starred, "*" + expl + + def visit_Call_legacy(self, call): + """ + visit `ast.Call nodes on 3.4 and below` + """ + new_func, func_expl = self.visit(call.func) + arg_expls = [] + new_args = [] + new_kwargs = [] + new_star = new_kwarg = None + for arg in call.args: + res, expl = self.visit(arg) + new_args.append(res) + arg_expls.append(expl) + for keyword in call.keywords: + res, expl = self.visit(keyword.value) + new_kwargs.append(ast.keyword(keyword.arg, res)) + arg_expls.append(keyword.arg + "=" + expl) + if call.starargs: + new_star, expl = self.visit(call.starargs) + arg_expls.append("*" + expl) + if call.kwargs: + new_kwarg, expl = self.visit(call.kwargs) + arg_expls.append("**" + expl) + expl = "%s(%s)" % (func_expl, ", ".join(arg_expls)) + new_call = ast.Call(new_func, new_args, new_kwargs, new_star, new_kwarg) + res = self.assign(new_call) + res_expl = self.explanation_param(self.display(res)) + outer_expl = "%s\n{%s = %s\n}" % (res_expl, res_expl, expl) + return res, outer_expl + + # ast.Call signature changed on 3.5, + # conditionally change which methods is named + # visit_Call depending on Python version + if sys.version_info >= (3, 5): + visit_Call = visit_Call_35 + else: + visit_Call = visit_Call_legacy + + def visit_Attribute(self, attr): + if not isinstance(attr.ctx, ast.Load): + return self.generic_visit(attr) + value, value_expl = self.visit(attr.value) + res = self.assign(ast.Attribute(value, attr.attr, ast.Load())) + res_expl = self.explanation_param(self.display(res)) + pat = "%s\n{%s = %s.%s\n}" + expl = pat % (res_expl, res_expl, value_expl, attr.attr) + return res, expl + + def visit_Compare(self, comp): + self.push_format_context() + left_res, left_expl = self.visit(comp.left) + if isinstance(comp.left, (ast.Compare, ast.BoolOp)): + left_expl = "({})".format(left_expl) + res_variables = [self.variable() for i in range(len(comp.ops))] + load_names = [ast.Name(v, ast.Load()) for v in res_variables] + store_names = [ast.Name(v, ast.Store()) for v in res_variables] + it = zip(range(len(comp.ops)), comp.ops, comp.comparators) + expls = [] + syms = [] + results = [left_res] + for i, op, next_operand in it: + next_res, next_expl = self.visit(next_operand) + if isinstance(next_operand, (ast.Compare, ast.BoolOp)): + next_expl = "({})".format(next_expl) + results.append(next_res) + sym = binop_map[op.__class__] + syms.append(ast.Str(sym)) + expl = "%s %s %s" % (left_expl, sym, next_expl) + expls.append(ast.Str(expl)) + res_expr = ast.Compare(left_res, [op], [next_res]) + self.statements.append(ast.Assign([store_names[i]], res_expr)) + left_res, left_expl = next_res, next_expl + # Use pytest.assertion.util._reprcompare if that's available. + expl_call = self.helper( + "call_reprcompare", + ast.Tuple(syms, ast.Load()), + ast.Tuple(load_names, ast.Load()), + ast.Tuple(expls, ast.Load()), + ast.Tuple(results, ast.Load()), + ) + if len(comp.ops) > 1: + res = ast.BoolOp(ast.And(), load_names) + else: + res = load_names[0] + return res, self.explanation_param(self.pop_format_context(expl_call)) diff --git a/venv/Lib/site-packages/_pytest/assertion/truncate.py b/venv/Lib/site-packages/_pytest/assertion/truncate.py new file mode 100644 index 00000000..79adeca6 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/assertion/truncate.py @@ -0,0 +1,99 @@ +""" +Utilities for truncating assertion output. + +Current default behaviour is to truncate assertion explanations at +~8 terminal lines, unless running in "-vv" mode or running on CI. +""" +from __future__ import absolute_import, division, print_function +import os + +import six + + +DEFAULT_MAX_LINES = 8 +DEFAULT_MAX_CHARS = 8 * 80 +USAGE_MSG = "use '-vv' to show" + + +def truncate_if_required(explanation, item, max_length=None): + """ + Truncate this assertion explanation if the given test item is eligible. + """ + if _should_truncate_item(item): + return _truncate_explanation(explanation) + return explanation + + +def _should_truncate_item(item): + """ + Whether or not this test item is eligible for truncation. + """ + verbose = item.config.option.verbose + return verbose < 2 and not _running_on_ci() + + +def _running_on_ci(): + """Check if we're currently running on a CI system.""" + env_vars = ["CI", "BUILD_NUMBER"] + return any(var in os.environ for var in env_vars) + + +def _truncate_explanation(input_lines, max_lines=None, max_chars=None): + """ + Truncate given list of strings that makes up the assertion explanation. + + Truncates to either 8 lines, or 640 characters - whichever the input reaches + first. The remaining lines will be replaced by a usage message. + """ + + if max_lines is None: + max_lines = DEFAULT_MAX_LINES + if max_chars is None: + max_chars = DEFAULT_MAX_CHARS + + # Check if truncation required + input_char_count = len("".join(input_lines)) + if len(input_lines) <= max_lines and input_char_count <= max_chars: + return input_lines + + # Truncate first to max_lines, and then truncate to max_chars if max_chars + # is exceeded. + truncated_explanation = input_lines[:max_lines] + truncated_explanation = _truncate_by_char_count(truncated_explanation, max_chars) + + # Add ellipsis to final line + truncated_explanation[-1] = truncated_explanation[-1] + "..." + + # Append useful message to explanation + truncated_line_count = len(input_lines) - len(truncated_explanation) + truncated_line_count += 1 # Account for the part-truncated final line + msg = "...Full output truncated" + if truncated_line_count == 1: + msg += " ({} line hidden)".format(truncated_line_count) + else: + msg += " ({} lines hidden)".format(truncated_line_count) + msg += ", {}".format(USAGE_MSG) + truncated_explanation.extend([six.text_type(""), six.text_type(msg)]) + return truncated_explanation + + +def _truncate_by_char_count(input_lines, max_chars): + # Check if truncation required + if len("".join(input_lines)) <= max_chars: + return input_lines + + # Find point at which input length exceeds total allowed length + iterated_char_count = 0 + for iterated_index, input_line in enumerate(input_lines): + if iterated_char_count + len(input_line) > max_chars: + break + iterated_char_count += len(input_line) + + # Create truncated explanation with modified final line + truncated_result = input_lines[:iterated_index] + final_line = input_lines[iterated_index] + if final_line: + final_line_truncate_point = max_chars - iterated_char_count + final_line = final_line[:final_line_truncate_point] + truncated_result.append(final_line) + return truncated_result diff --git a/venv/Lib/site-packages/_pytest/assertion/util.py b/venv/Lib/site-packages/_pytest/assertion/util.py new file mode 100644 index 00000000..15724ed3 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/assertion/util.py @@ -0,0 +1,338 @@ +"""Utilities for assertion debugging""" +from __future__ import absolute_import, division, print_function +import pprint + +import _pytest._code +import py +import six +from ..compat import Sequence + +u = six.text_type + +# The _reprcompare attribute on the util module is used by the new assertion +# interpretation code and assertion rewriter to detect this plugin was +# loaded and in turn call the hooks defined here as part of the +# DebugInterpreter. +_reprcompare = None + + +# the re-encoding is needed for python2 repr +# with non-ascii characters (see issue 877 and 1379) +def ecu(s): + try: + return u(s, "utf-8", "replace") + except TypeError: + return s + + +def format_explanation(explanation): + """This formats an explanation + + Normally all embedded newlines are escaped, however there are + three exceptions: \n{, \n} and \n~. The first two are intended + cover nested explanations, see function and attribute explanations + for examples (.visit_Call(), visit_Attribute()). The last one is + for when one explanation needs to span multiple lines, e.g. when + displaying diffs. + """ + explanation = ecu(explanation) + lines = _split_explanation(explanation) + result = _format_lines(lines) + return u("\n").join(result) + + +def _split_explanation(explanation): + """Return a list of individual lines in the explanation + + This will return a list of lines split on '\n{', '\n}' and '\n~'. + Any other newlines will be escaped and appear in the line as the + literal '\n' characters. + """ + raw_lines = (explanation or u("")).split("\n") + lines = [raw_lines[0]] + for values in raw_lines[1:]: + if values and values[0] in ["{", "}", "~", ">"]: + lines.append(values) + else: + lines[-1] += "\\n" + values + return lines + + +def _format_lines(lines): + """Format the individual lines + + This will replace the '{', '}' and '~' characters of our mini + formatting language with the proper 'where ...', 'and ...' and ' + + ...' text, taking care of indentation along the way. + + Return a list of formatted lines. + """ + result = lines[:1] + stack = [0] + stackcnt = [0] + for line in lines[1:]: + if line.startswith("{"): + if stackcnt[-1]: + s = u("and ") + else: + s = u("where ") + stack.append(len(result)) + stackcnt[-1] += 1 + stackcnt.append(0) + result.append(u(" +") + u(" ") * (len(stack) - 1) + s + line[1:]) + elif line.startswith("}"): + stack.pop() + stackcnt.pop() + result[stack[-1]] += line[1:] + else: + assert line[0] in ["~", ">"] + stack[-1] += 1 + indent = len(stack) if line.startswith("~") else len(stack) - 1 + result.append(u(" ") * indent + line[1:]) + assert len(stack) == 1 + return result + + +# Provide basestring in python3 +try: + basestring = basestring +except NameError: + basestring = str + + +def assertrepr_compare(config, op, left, right): + """Return specialised explanations for some operators/operands""" + width = 80 - 15 - len(op) - 2 # 15 chars indentation, 1 space around op + left_repr = py.io.saferepr(left, maxsize=int(width // 2)) + right_repr = py.io.saferepr(right, maxsize=width - len(left_repr)) + + summary = u("%s %s %s") % (ecu(left_repr), op, ecu(right_repr)) + + def issequence(x): + return isinstance(x, Sequence) and not isinstance(x, basestring) + + def istext(x): + return isinstance(x, basestring) + + def isdict(x): + return isinstance(x, dict) + + def isset(x): + return isinstance(x, (set, frozenset)) + + def isiterable(obj): + try: + iter(obj) + return not istext(obj) + except TypeError: + return False + + verbose = config.getoption("verbose") + explanation = None + try: + if op == "==": + if istext(left) and istext(right): + explanation = _diff_text(left, right, verbose) + else: + if issequence(left) and issequence(right): + explanation = _compare_eq_sequence(left, right, verbose) + elif isset(left) and isset(right): + explanation = _compare_eq_set(left, right, verbose) + elif isdict(left) and isdict(right): + explanation = _compare_eq_dict(left, right, verbose) + if isiterable(left) and isiterable(right): + expl = _compare_eq_iterable(left, right, verbose) + if explanation is not None: + explanation.extend(expl) + else: + explanation = expl + elif op == "not in": + if istext(left) and istext(right): + explanation = _notin_text(left, right, verbose) + except Exception: + explanation = [ + u( + "(pytest_assertion plugin: representation of details failed. " + "Probably an object has a faulty __repr__.)" + ), + u(_pytest._code.ExceptionInfo()), + ] + + if not explanation: + return None + + return [summary] + explanation + + +def _diff_text(left, right, verbose=False): + """Return the explanation for the diff between text or bytes + + Unless --verbose is used this will skip leading and trailing + characters which are identical to keep the diff minimal. + + If the input are bytes they will be safely converted to text. + """ + from difflib import ndiff + + explanation = [] + + def escape_for_readable_diff(binary_text): + """ + Ensures that the internal string is always valid unicode, converting any bytes safely to valid unicode. + This is done using repr() which then needs post-processing to fix the encompassing quotes and un-escape + newlines and carriage returns (#429). + """ + r = six.text_type(repr(binary_text)[1:-1]) + r = r.replace(r"\n", "\n") + r = r.replace(r"\r", "\r") + return r + + if isinstance(left, bytes): + left = escape_for_readable_diff(left) + if isinstance(right, bytes): + right = escape_for_readable_diff(right) + if not verbose: + i = 0 # just in case left or right has zero length + for i in range(min(len(left), len(right))): + if left[i] != right[i]: + break + if i > 42: + i -= 10 # Provide some context + explanation = [ + u("Skipping %s identical leading characters in diff, use -v to show") + % i + ] + left = left[i:] + right = right[i:] + if len(left) == len(right): + for i in range(len(left)): + if left[-i] != right[-i]: + break + if i > 42: + i -= 10 # Provide some context + explanation += [ + u( + "Skipping %s identical trailing " + "characters in diff, use -v to show" + ) + % i + ] + left = left[:-i] + right = right[:-i] + keepends = True + if left.isspace() or right.isspace(): + left = repr(str(left)) + right = repr(str(right)) + explanation += [u"Strings contain only whitespace, escaping them using repr()"] + explanation += [ + line.strip("\n") + for line in ndiff(left.splitlines(keepends), right.splitlines(keepends)) + ] + return explanation + + +def _compare_eq_iterable(left, right, verbose=False): + if not verbose: + return [u("Use -v to get the full diff")] + # dynamic import to speedup pytest + import difflib + + try: + left_formatting = pprint.pformat(left).splitlines() + right_formatting = pprint.pformat(right).splitlines() + explanation = [u("Full diff:")] + except Exception: + # hack: PrettyPrinter.pformat() in python 2 fails when formatting items that can't be sorted(), ie, calling + # sorted() on a list would raise. See issue #718. + # As a workaround, the full diff is generated by using the repr() string of each item of each container. + left_formatting = sorted(repr(x) for x in left) + right_formatting = sorted(repr(x) for x in right) + explanation = [u("Full diff (fallback to calling repr on each item):")] + explanation.extend( + line.strip() for line in difflib.ndiff(left_formatting, right_formatting) + ) + return explanation + + +def _compare_eq_sequence(left, right, verbose=False): + explanation = [] + for i in range(min(len(left), len(right))): + if left[i] != right[i]: + explanation += [u("At index %s diff: %r != %r") % (i, left[i], right[i])] + break + if len(left) > len(right): + explanation += [ + u("Left contains more items, first extra item: %s") + % py.io.saferepr(left[len(right)]) + ] + elif len(left) < len(right): + explanation += [ + u("Right contains more items, first extra item: %s") + % py.io.saferepr(right[len(left)]) + ] + return explanation + + +def _compare_eq_set(left, right, verbose=False): + explanation = [] + diff_left = left - right + diff_right = right - left + if diff_left: + explanation.append(u("Extra items in the left set:")) + for item in diff_left: + explanation.append(py.io.saferepr(item)) + if diff_right: + explanation.append(u("Extra items in the right set:")) + for item in diff_right: + explanation.append(py.io.saferepr(item)) + return explanation + + +def _compare_eq_dict(left, right, verbose=False): + explanation = [] + common = set(left).intersection(set(right)) + same = {k: left[k] for k in common if left[k] == right[k]} + if same and verbose < 2: + explanation += [u("Omitting %s identical items, use -vv to show") % len(same)] + elif same: + explanation += [u("Common items:")] + explanation += pprint.pformat(same).splitlines() + diff = {k for k in common if left[k] != right[k]} + if diff: + explanation += [u("Differing items:")] + for k in diff: + explanation += [ + py.io.saferepr({k: left[k]}) + " != " + py.io.saferepr({k: right[k]}) + ] + extra_left = set(left) - set(right) + if extra_left: + explanation.append(u("Left contains more items:")) + explanation.extend( + pprint.pformat({k: left[k] for k in extra_left}).splitlines() + ) + extra_right = set(right) - set(left) + if extra_right: + explanation.append(u("Right contains more items:")) + explanation.extend( + pprint.pformat({k: right[k] for k in extra_right}).splitlines() + ) + return explanation + + +def _notin_text(term, text, verbose=False): + index = text.find(term) + head = text[:index] + tail = text[index + len(term) :] + correct_text = head + tail + diff = _diff_text(correct_text, text, verbose) + newdiff = [u("%s is contained here:") % py.io.saferepr(term, maxsize=42)] + for line in diff: + if line.startswith(u("Skipping")): + continue + if line.startswith(u("- ")): + continue + if line.startswith(u("+ ")): + newdiff.append(u(" ") + line[2:]) + else: + newdiff.append(line) + return newdiff diff --git a/venv/Lib/site-packages/_pytest/cacheprovider.py b/venv/Lib/site-packages/_pytest/cacheprovider.py new file mode 100644 index 00000000..94f42e8c --- /dev/null +++ b/venv/Lib/site-packages/_pytest/cacheprovider.py @@ -0,0 +1,362 @@ +""" +merged implementation of the cache provider + +the name cache was not chosen to ensure pluggy automatically +ignores the external pytest-cache +""" +from __future__ import absolute_import, division, print_function +from collections import OrderedDict + +import py +import six +import attr + +import pytest +import json + +from .compat import _PY2 as PY2 +from .pathlib import Path, resolve_from_str, rmtree + +README_CONTENT = u"""\ +# pytest cache directory # + +This directory contains data from the pytest's cache plugin, +which provides the `--lf` and `--ff` options, as well as the `cache` fixture. + +**Do not** commit this to version control. + +See [the docs](https://docs.pytest.org/en/latest/cache.html) for more information. +""" + + +@attr.s +class Cache(object): + _cachedir = attr.ib(repr=False) + _config = attr.ib(repr=False) + + @classmethod + def for_config(cls, config): + cachedir = cls.cache_dir_from_config(config) + if config.getoption("cacheclear") and cachedir.exists(): + rmtree(cachedir, force=True) + cachedir.mkdir() + return cls(cachedir, config) + + @staticmethod + def cache_dir_from_config(config): + return resolve_from_str(config.getini("cache_dir"), config.rootdir) + + def warn(self, fmt, **args): + from _pytest.warnings import _issue_config_warning + from _pytest.warning_types import PytestWarning + + _issue_config_warning( + PytestWarning(fmt.format(**args) if args else fmt), self._config + ) + + def makedir(self, name): + """ return a directory path object with the given name. If the + directory does not yet exist, it will be created. You can use it + to manage files likes e. g. store/retrieve database + dumps across test sessions. + + :param name: must be a string not containing a ``/`` separator. + Make sure the name contains your plugin or application + identifiers to prevent clashes with other cache users. + """ + name = Path(name) + if len(name.parts) > 1: + raise ValueError("name is not allowed to contain path separators") + res = self._cachedir.joinpath("d", name) + res.mkdir(exist_ok=True, parents=True) + return py.path.local(res) + + def _getvaluepath(self, key): + return self._cachedir.joinpath("v", Path(key)) + + def get(self, key, default): + """ return cached value for the given key. If no value + was yet cached or the value cannot be read, the specified + default is returned. + + :param key: must be a ``/`` separated value. Usually the first + name is the name of your plugin or your application. + :param default: must be provided in case of a cache-miss or + invalid cache values. + + """ + path = self._getvaluepath(key) + try: + with path.open("r") as f: + return json.load(f) + except (ValueError, IOError, OSError): + return default + + def set(self, key, value): + """ save value for the given key. + + :param key: must be a ``/`` separated value. Usually the first + name is the name of your plugin or your application. + :param value: must be of any combination of basic + python types, including nested types + like e. g. lists of dictionaries. + """ + path = self._getvaluepath(key) + try: + path.parent.mkdir(exist_ok=True, parents=True) + except (IOError, OSError): + self.warn("could not create cache path {path}", path=path) + return + try: + f = path.open("wb" if PY2 else "w") + except (IOError, OSError): + self.warn("cache could not write path {path}", path=path) + else: + with f: + json.dump(value, f, indent=2, sort_keys=True) + self._ensure_supporting_files() + + def _ensure_supporting_files(self): + """Create supporting files in the cache dir that are not really part of the cache.""" + if self._cachedir.is_dir(): + readme_path = self._cachedir / "README.md" + if not readme_path.is_file(): + readme_path.write_text(README_CONTENT) + + msg = u"# created by pytest automatically, do not change\n*" + self._cachedir.joinpath(".gitignore").write_text(msg, encoding="UTF-8") + + +class LFPlugin(object): + """ Plugin which implements the --lf (run last-failing) option """ + + def __init__(self, config): + self.config = config + active_keys = "lf", "failedfirst" + self.active = any(config.getoption(key) for key in active_keys) + self.lastfailed = config.cache.get("cache/lastfailed", {}) + self._previously_failed_count = None + self._no_failures_behavior = self.config.getoption("last_failed_no_failures") + + def pytest_report_collectionfinish(self): + if self.active and self.config.getoption("verbose") >= 0: + if not self._previously_failed_count: + return None + noun = "failure" if self._previously_failed_count == 1 else "failures" + suffix = " first" if self.config.getoption("failedfirst") else "" + mode = "rerun previous {count} {noun}{suffix}".format( + count=self._previously_failed_count, suffix=suffix, noun=noun + ) + return "run-last-failure: %s" % mode + + def pytest_runtest_logreport(self, report): + if (report.when == "call" and report.passed) or report.skipped: + self.lastfailed.pop(report.nodeid, None) + elif report.failed: + self.lastfailed[report.nodeid] = True + + def pytest_collectreport(self, report): + passed = report.outcome in ("passed", "skipped") + if passed: + if report.nodeid in self.lastfailed: + self.lastfailed.pop(report.nodeid) + self.lastfailed.update((item.nodeid, True) for item in report.result) + else: + self.lastfailed[report.nodeid] = True + + def pytest_collection_modifyitems(self, session, config, items): + if self.active: + if self.lastfailed: + previously_failed = [] + previously_passed = [] + for item in items: + if item.nodeid in self.lastfailed: + previously_failed.append(item) + else: + previously_passed.append(item) + self._previously_failed_count = len(previously_failed) + if not previously_failed: + # running a subset of all tests with recorded failures outside + # of the set of tests currently executing + return + if self.config.getoption("lf"): + items[:] = previously_failed + config.hook.pytest_deselected(items=previously_passed) + else: + items[:] = previously_failed + previously_passed + elif self._no_failures_behavior == "none": + config.hook.pytest_deselected(items=items) + items[:] = [] + + def pytest_sessionfinish(self, session): + config = self.config + if config.getoption("cacheshow") or hasattr(config, "slaveinput"): + return + + saved_lastfailed = config.cache.get("cache/lastfailed", {}) + if saved_lastfailed != self.lastfailed: + config.cache.set("cache/lastfailed", self.lastfailed) + + +class NFPlugin(object): + """ Plugin which implements the --nf (run new-first) option """ + + def __init__(self, config): + self.config = config + self.active = config.option.newfirst + self.cached_nodeids = config.cache.get("cache/nodeids", []) + + def pytest_collection_modifyitems(self, session, config, items): + if self.active: + new_items = OrderedDict() + other_items = OrderedDict() + for item in items: + if item.nodeid not in self.cached_nodeids: + new_items[item.nodeid] = item + else: + other_items[item.nodeid] = item + + items[:] = self._get_increasing_order( + six.itervalues(new_items) + ) + self._get_increasing_order(six.itervalues(other_items)) + self.cached_nodeids = [x.nodeid for x in items if isinstance(x, pytest.Item)] + + def _get_increasing_order(self, items): + return sorted(items, key=lambda item: item.fspath.mtime(), reverse=True) + + def pytest_sessionfinish(self, session): + config = self.config + if config.getoption("cacheshow") or hasattr(config, "slaveinput"): + return + + config.cache.set("cache/nodeids", self.cached_nodeids) + + +def pytest_addoption(parser): + group = parser.getgroup("general") + group.addoption( + "--lf", + "--last-failed", + action="store_true", + dest="lf", + help="rerun only the tests that failed " + "at the last run (or all if none failed)", + ) + group.addoption( + "--ff", + "--failed-first", + action="store_true", + dest="failedfirst", + help="run all tests but run the last failures first. " + "This may re-order tests and thus lead to " + "repeated fixture setup/teardown", + ) + group.addoption( + "--nf", + "--new-first", + action="store_true", + dest="newfirst", + help="run tests from new files first, then the rest of the tests " + "sorted by file mtime", + ) + group.addoption( + "--cache-show", + action="store_true", + dest="cacheshow", + help="show cache contents, don't perform collection or tests", + ) + group.addoption( + "--cache-clear", + action="store_true", + dest="cacheclear", + help="remove all cache contents at start of test run.", + ) + parser.addini("cache_dir", default=".pytest_cache", help="cache directory path.") + group.addoption( + "--lfnf", + "--last-failed-no-failures", + action="store", + dest="last_failed_no_failures", + choices=("all", "none"), + default="all", + help="change the behavior when no test failed in the last run or no " + "information about the last failures was found in the cache", + ) + + +def pytest_cmdline_main(config): + if config.option.cacheshow: + from _pytest.main import wrap_session + + return wrap_session(config, cacheshow) + + +@pytest.hookimpl(tryfirst=True) +def pytest_configure(config): + config.cache = Cache.for_config(config) + config.pluginmanager.register(LFPlugin(config), "lfplugin") + config.pluginmanager.register(NFPlugin(config), "nfplugin") + + +@pytest.fixture +def cache(request): + """ + Return a cache object that can persist state between testing sessions. + + cache.get(key, default) + cache.set(key, value) + + Keys must be a ``/`` separated value, where the first part is usually the + name of your plugin or application to avoid clashes with other cache users. + + Values can be any object handled by the json stdlib module. + """ + return request.config.cache + + +def pytest_report_header(config): + if config.option.verbose: + cachedir = config.cache._cachedir + # TODO: evaluate generating upward relative paths + # starting with .., ../.. if sensible + + try: + displaypath = cachedir.relative_to(config.rootdir) + except ValueError: + displaypath = cachedir + return "cachedir: {}".format(displaypath) + + +def cacheshow(config, session): + from pprint import pformat + + tw = py.io.TerminalWriter() + tw.line("cachedir: " + str(config.cache._cachedir)) + if not config.cache._cachedir.is_dir(): + tw.line("cache is empty") + return 0 + dummy = object() + basedir = config.cache._cachedir + vdir = basedir / "v" + tw.sep("-", "cache values") + for valpath in sorted(x for x in vdir.rglob("*") if x.is_file()): + key = valpath.relative_to(vdir) + val = config.cache.get(key, dummy) + if val is dummy: + tw.line("%s contains unreadable content, will be ignored" % key) + else: + tw.line("%s contains:" % key) + for line in pformat(val).splitlines(): + tw.line(" " + line) + + ddir = basedir / "d" + if ddir.is_dir(): + contents = sorted(ddir.rglob("*")) + tw.sep("-", "cache directories") + for p in contents: + # if p.check(dir=1): + # print("%s/" % p.relto(basedir)) + if p.is_file(): + key = p.relative_to(basedir) + tw.line("{} is a file of length {:d}".format(key, p.stat().st_size)) + return 0 diff --git a/venv/Lib/site-packages/_pytest/capture.py b/venv/Lib/site-packages/_pytest/capture.py new file mode 100644 index 00000000..dfb48896 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/capture.py @@ -0,0 +1,780 @@ +""" +per-test stdout/stderr capturing mechanism. + +""" +from __future__ import absolute_import, division, print_function + +import collections +import contextlib +import sys +import os +import io +from io import UnsupportedOperation +from tempfile import TemporaryFile + +import six +import pytest +from _pytest.compat import CaptureIO + +patchsysdict = {0: "stdin", 1: "stdout", 2: "stderr"} + + +def pytest_addoption(parser): + group = parser.getgroup("general") + group._addoption( + "--capture", + action="store", + default="fd" if hasattr(os, "dup") else "sys", + metavar="method", + choices=["fd", "sys", "no"], + help="per-test capturing method: one of fd|sys|no.", + ) + group._addoption( + "-s", + action="store_const", + const="no", + dest="capture", + help="shortcut for --capture=no.", + ) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_load_initial_conftests(early_config, parser, args): + ns = early_config.known_args_namespace + if ns.capture == "fd": + _py36_windowsconsoleio_workaround(sys.stdout) + _colorama_workaround() + _readline_workaround() + pluginmanager = early_config.pluginmanager + capman = CaptureManager(ns.capture) + pluginmanager.register(capman, "capturemanager") + + # make sure that capturemanager is properly reset at final shutdown + early_config.add_cleanup(capman.stop_global_capturing) + + # make sure logging does not raise exceptions at the end + def silence_logging_at_shutdown(): + if "logging" in sys.modules: + sys.modules["logging"].raiseExceptions = False + + early_config.add_cleanup(silence_logging_at_shutdown) + + # finally trigger conftest loading but while capturing (issue93) + capman.start_global_capturing() + outcome = yield + capman.suspend_global_capture() + if outcome.excinfo is not None: + out, err = capman.read_global_capture() + sys.stdout.write(out) + sys.stderr.write(err) + + +class CaptureManager(object): + """ + Capture plugin, manages that the appropriate capture method is enabled/disabled during collection and each + test phase (setup, call, teardown). After each of those points, the captured output is obtained and + attached to the collection/runtest report. + + There are two levels of capture: + * global: which is enabled by default and can be suppressed by the ``-s`` option. This is always enabled/disabled + during collection and each test phase. + * fixture: when a test function or one of its fixture depend on the ``capsys`` or ``capfd`` fixtures. In this + case special handling is needed to ensure the fixtures take precedence over the global capture. + """ + + def __init__(self, method): + self._method = method + self._global_capturing = None + self._current_item = None + + def _getcapture(self, method): + if method == "fd": + return MultiCapture(out=True, err=True, Capture=FDCapture) + elif method == "sys": + return MultiCapture(out=True, err=True, Capture=SysCapture) + elif method == "no": + return MultiCapture(out=False, err=False, in_=False) + else: + raise ValueError("unknown capturing method: %r" % method) + + # Global capturing control + + def start_global_capturing(self): + assert self._global_capturing is None + self._global_capturing = self._getcapture(self._method) + self._global_capturing.start_capturing() + + def stop_global_capturing(self): + if self._global_capturing is not None: + self._global_capturing.pop_outerr_to_orig() + self._global_capturing.stop_capturing() + self._global_capturing = None + + def resume_global_capture(self): + self._global_capturing.resume_capturing() + + def suspend_global_capture(self, in_=False): + cap = getattr(self, "_global_capturing", None) + if cap is not None: + cap.suspend_capturing(in_=in_) + + def read_global_capture(self): + return self._global_capturing.readouterr() + + # Fixture Control (its just forwarding, think about removing this later) + + def activate_fixture(self, item): + """If the current item is using ``capsys`` or ``capfd``, activate them so they take precedence over + the global capture. + """ + fixture = getattr(item, "_capture_fixture", None) + if fixture is not None: + fixture._start() + + def deactivate_fixture(self, item): + """Deactivates the ``capsys`` or ``capfd`` fixture of this item, if any.""" + fixture = getattr(item, "_capture_fixture", None) + if fixture is not None: + fixture.close() + + def suspend_fixture(self, item): + fixture = getattr(item, "_capture_fixture", None) + if fixture is not None: + fixture._suspend() + + def resume_fixture(self, item): + fixture = getattr(item, "_capture_fixture", None) + if fixture is not None: + fixture._resume() + + # Helper context managers + + @contextlib.contextmanager + def global_and_fixture_disabled(self): + """Context manager to temporarily disables global and current fixture capturing.""" + # Need to undo local capsys-et-al if exists before disabling global capture + self.suspend_fixture(self._current_item) + self.suspend_global_capture(in_=False) + try: + yield + finally: + self.resume_global_capture() + self.resume_fixture(self._current_item) + + @contextlib.contextmanager + def item_capture(self, when, item): + self.resume_global_capture() + self.activate_fixture(item) + try: + yield + finally: + self.deactivate_fixture(item) + self.suspend_global_capture(in_=False) + + out, err = self.read_global_capture() + item.add_report_section(when, "stdout", out) + item.add_report_section(when, "stderr", err) + + # Hooks + + @pytest.hookimpl(hookwrapper=True) + def pytest_make_collect_report(self, collector): + if isinstance(collector, pytest.File): + self.resume_global_capture() + outcome = yield + self.suspend_global_capture() + out, err = self.read_global_capture() + rep = outcome.get_result() + if out: + rep.sections.append(("Captured stdout", out)) + if err: + rep.sections.append(("Captured stderr", err)) + else: + yield + + @pytest.hookimpl(hookwrapper=True) + def pytest_runtest_protocol(self, item): + self._current_item = item + yield + self._current_item = None + + @pytest.hookimpl(hookwrapper=True) + def pytest_runtest_setup(self, item): + with self.item_capture("setup", item): + yield + + @pytest.hookimpl(hookwrapper=True) + def pytest_runtest_call(self, item): + with self.item_capture("call", item): + yield + + @pytest.hookimpl(hookwrapper=True) + def pytest_runtest_teardown(self, item): + with self.item_capture("teardown", item): + yield + + @pytest.hookimpl(tryfirst=True) + def pytest_keyboard_interrupt(self, excinfo): + self.stop_global_capturing() + + @pytest.hookimpl(tryfirst=True) + def pytest_internalerror(self, excinfo): + self.stop_global_capturing() + + +capture_fixtures = {"capfd", "capfdbinary", "capsys", "capsysbinary"} + + +def _ensure_only_one_capture_fixture(request, name): + fixtures = set(request.fixturenames) & capture_fixtures - {name} + if fixtures: + fixtures = sorted(fixtures) + fixtures = fixtures[0] if len(fixtures) == 1 else fixtures + raise request.raiseerror( + "cannot use {} and {} at the same time".format(fixtures, name) + ) + + +@pytest.fixture +def capsys(request): + """Enable capturing of writes to ``sys.stdout`` and ``sys.stderr`` and make + captured output available via ``capsys.readouterr()`` method calls + which return a ``(out, err)`` namedtuple. ``out`` and ``err`` will be ``text`` + objects. + """ + _ensure_only_one_capture_fixture(request, "capsys") + with _install_capture_fixture_on_item(request, SysCapture) as fixture: + yield fixture + + +@pytest.fixture +def capsysbinary(request): + """Enable capturing of writes to ``sys.stdout`` and ``sys.stderr`` and make + captured output available via ``capsys.readouterr()`` method calls + which return a ``(out, err)`` tuple. ``out`` and ``err`` will be ``bytes`` + objects. + """ + _ensure_only_one_capture_fixture(request, "capsysbinary") + # Currently, the implementation uses the python3 specific `.buffer` + # property of CaptureIO. + if sys.version_info < (3,): + raise request.raiseerror("capsysbinary is only supported on python 3") + with _install_capture_fixture_on_item(request, SysCaptureBinary) as fixture: + yield fixture + + +@pytest.fixture +def capfd(request): + """Enable capturing of writes to file descriptors ``1`` and ``2`` and make + captured output available via ``capfd.readouterr()`` method calls + which return a ``(out, err)`` tuple. ``out`` and ``err`` will be ``text`` + objects. + """ + _ensure_only_one_capture_fixture(request, "capfd") + if not hasattr(os, "dup"): + pytest.skip( + "capfd fixture needs os.dup function which is not available in this system" + ) + with _install_capture_fixture_on_item(request, FDCapture) as fixture: + yield fixture + + +@pytest.fixture +def capfdbinary(request): + """Enable capturing of write to file descriptors 1 and 2 and make + captured output available via ``capfdbinary.readouterr`` method calls + which return a ``(out, err)`` tuple. ``out`` and ``err`` will be + ``bytes`` objects. + """ + _ensure_only_one_capture_fixture(request, "capfdbinary") + if not hasattr(os, "dup"): + pytest.skip( + "capfdbinary fixture needs os.dup function which is not available in this system" + ) + with _install_capture_fixture_on_item(request, FDCaptureBinary) as fixture: + yield fixture + + +@contextlib.contextmanager +def _install_capture_fixture_on_item(request, capture_class): + """ + Context manager which creates a ``CaptureFixture`` instance and "installs" it on + the item/node of the given request. Used by ``capsys`` and ``capfd``. + + The CaptureFixture is added as attribute of the item because it needs to accessed + by ``CaptureManager`` during its ``pytest_runtest_*`` hooks. + """ + request.node._capture_fixture = fixture = CaptureFixture(capture_class, request) + capmanager = request.config.pluginmanager.getplugin("capturemanager") + # need to active this fixture right away in case it is being used by another fixture (setup phase) + # if this fixture is being used only by a test function (call phase), then we wouldn't need this + # activation, but it doesn't hurt + capmanager.activate_fixture(request.node) + yield fixture + fixture.close() + del request.node._capture_fixture + + +class CaptureFixture(object): + """ + Object returned by :py:func:`capsys`, :py:func:`capsysbinary`, :py:func:`capfd` and :py:func:`capfdbinary` + fixtures. + """ + + def __init__(self, captureclass, request): + self.captureclass = captureclass + self.request = request + self._capture = None + self._captured_out = self.captureclass.EMPTY_BUFFER + self._captured_err = self.captureclass.EMPTY_BUFFER + + def _start(self): + # Start if not started yet + if getattr(self, "_capture", None) is None: + self._capture = MultiCapture( + out=True, err=True, in_=False, Capture=self.captureclass + ) + self._capture.start_capturing() + + def close(self): + if self._capture is not None: + out, err = self._capture.pop_outerr_to_orig() + self._captured_out += out + self._captured_err += err + self._capture.stop_capturing() + self._capture = None + + def readouterr(self): + """Read and return the captured output so far, resetting the internal buffer. + + :return: captured content as a namedtuple with ``out`` and ``err`` string attributes + """ + captured_out, captured_err = self._captured_out, self._captured_err + if self._capture is not None: + out, err = self._capture.readouterr() + captured_out += out + captured_err += err + self._captured_out = self.captureclass.EMPTY_BUFFER + self._captured_err = self.captureclass.EMPTY_BUFFER + return CaptureResult(captured_out, captured_err) + + def _suspend(self): + """Suspends this fixture's own capturing temporarily.""" + self._capture.suspend_capturing() + + def _resume(self): + """Resumes this fixture's own capturing temporarily.""" + self._capture.resume_capturing() + + @contextlib.contextmanager + def disabled(self): + """Temporarily disables capture while inside the 'with' block.""" + capmanager = self.request.config.pluginmanager.getplugin("capturemanager") + with capmanager.global_and_fixture_disabled(): + yield + + +def safe_text_dupfile(f, mode, default_encoding="UTF8"): + """ return an open text file object that's a duplicate of f on the + FD-level if possible. + """ + encoding = getattr(f, "encoding", None) + try: + fd = f.fileno() + except Exception: + if "b" not in getattr(f, "mode", "") and hasattr(f, "encoding"): + # we seem to have a text stream, let's just use it + return f + else: + newfd = os.dup(fd) + if "b" not in mode: + mode += "b" + f = os.fdopen(newfd, mode, 0) # no buffering + return EncodedFile(f, encoding or default_encoding) + + +class EncodedFile(object): + errors = "strict" # possibly needed by py3 code (issue555) + + def __init__(self, buffer, encoding): + self.buffer = buffer + self.encoding = encoding + + def write(self, obj): + if isinstance(obj, six.text_type): + obj = obj.encode(self.encoding, "replace") + self.buffer.write(obj) + + def writelines(self, linelist): + data = "".join(linelist) + self.write(data) + + @property + def name(self): + """Ensure that file.name is a string.""" + return repr(self.buffer) + + def __getattr__(self, name): + return getattr(object.__getattribute__(self, "buffer"), name) + + +CaptureResult = collections.namedtuple("CaptureResult", ["out", "err"]) + + +class MultiCapture(object): + out = err = in_ = None + + def __init__(self, out=True, err=True, in_=True, Capture=None): + if in_: + self.in_ = Capture(0) + if out: + self.out = Capture(1) + if err: + self.err = Capture(2) + + def start_capturing(self): + if self.in_: + self.in_.start() + if self.out: + self.out.start() + if self.err: + self.err.start() + + def pop_outerr_to_orig(self): + """ pop current snapshot out/err capture and flush to orig streams. """ + out, err = self.readouterr() + if out: + self.out.writeorg(out) + if err: + self.err.writeorg(err) + return out, err + + def suspend_capturing(self, in_=False): + if self.out: + self.out.suspend() + if self.err: + self.err.suspend() + if in_ and self.in_: + self.in_.suspend() + self._in_suspended = True + + def resume_capturing(self): + if self.out: + self.out.resume() + if self.err: + self.err.resume() + if hasattr(self, "_in_suspended"): + self.in_.resume() + del self._in_suspended + + def stop_capturing(self): + """ stop capturing and reset capturing streams """ + if hasattr(self, "_reset"): + raise ValueError("was already stopped") + self._reset = True + if self.out: + self.out.done() + if self.err: + self.err.done() + if self.in_: + self.in_.done() + + def readouterr(self): + """ return snapshot unicode value of stdout/stderr capturings. """ + return CaptureResult( + self.out.snap() if self.out is not None else "", + self.err.snap() if self.err is not None else "", + ) + + +class NoCapture(object): + EMPTY_BUFFER = None + __init__ = start = done = suspend = resume = lambda *args: None + + +class FDCaptureBinary(object): + """Capture IO to/from a given os-level filedescriptor. + + snap() produces `bytes` + """ + + EMPTY_BUFFER = bytes() + + def __init__(self, targetfd, tmpfile=None): + self.targetfd = targetfd + try: + self.targetfd_save = os.dup(self.targetfd) + except OSError: + self.start = lambda: None + self.done = lambda: None + else: + if targetfd == 0: + assert not tmpfile, "cannot set tmpfile with stdin" + tmpfile = open(os.devnull, "r") + self.syscapture = SysCapture(targetfd) + else: + if tmpfile is None: + f = TemporaryFile() + with f: + tmpfile = safe_text_dupfile(f, mode="wb+") + if targetfd in patchsysdict: + self.syscapture = SysCapture(targetfd, tmpfile) + else: + self.syscapture = NoCapture() + self.tmpfile = tmpfile + self.tmpfile_fd = tmpfile.fileno() + + def __repr__(self): + return "" % (self.targetfd, self.targetfd_save) + + def start(self): + """ Start capturing on targetfd using memorized tmpfile. """ + try: + os.fstat(self.targetfd_save) + except (AttributeError, OSError): + raise ValueError("saved filedescriptor not valid anymore") + os.dup2(self.tmpfile_fd, self.targetfd) + self.syscapture.start() + + def snap(self): + self.tmpfile.seek(0) + res = self.tmpfile.read() + self.tmpfile.seek(0) + self.tmpfile.truncate() + return res + + def done(self): + """ stop capturing, restore streams, return original capture file, + seeked to position zero. """ + targetfd_save = self.__dict__.pop("targetfd_save") + os.dup2(targetfd_save, self.targetfd) + os.close(targetfd_save) + self.syscapture.done() + _attempt_to_close_capture_file(self.tmpfile) + + def suspend(self): + self.syscapture.suspend() + os.dup2(self.targetfd_save, self.targetfd) + + def resume(self): + self.syscapture.resume() + os.dup2(self.tmpfile_fd, self.targetfd) + + def writeorg(self, data): + """ write to original file descriptor. """ + if isinstance(data, six.text_type): + data = data.encode("utf8") # XXX use encoding of original stream + os.write(self.targetfd_save, data) + + +class FDCapture(FDCaptureBinary): + """Capture IO to/from a given os-level filedescriptor. + + snap() produces text + """ + + EMPTY_BUFFER = str() + + def snap(self): + res = FDCaptureBinary.snap(self) + enc = getattr(self.tmpfile, "encoding", None) + if enc and isinstance(res, bytes): + res = six.text_type(res, enc, "replace") + return res + + +class SysCapture(object): + + EMPTY_BUFFER = str() + + def __init__(self, fd, tmpfile=None): + name = patchsysdict[fd] + self._old = getattr(sys, name) + self.name = name + if tmpfile is None: + if name == "stdin": + tmpfile = DontReadFromInput() + else: + tmpfile = CaptureIO() + self.tmpfile = tmpfile + + def start(self): + setattr(sys, self.name, self.tmpfile) + + def snap(self): + res = self.tmpfile.getvalue() + self.tmpfile.seek(0) + self.tmpfile.truncate() + return res + + def done(self): + setattr(sys, self.name, self._old) + del self._old + _attempt_to_close_capture_file(self.tmpfile) + + def suspend(self): + setattr(sys, self.name, self._old) + + def resume(self): + setattr(sys, self.name, self.tmpfile) + + def writeorg(self, data): + self._old.write(data) + self._old.flush() + + +class SysCaptureBinary(SysCapture): + EMPTY_BUFFER = bytes() + + def snap(self): + res = self.tmpfile.buffer.getvalue() + self.tmpfile.seek(0) + self.tmpfile.truncate() + return res + + +class DontReadFromInput(six.Iterator): + """Temporary stub class. Ideally when stdin is accessed, the + capturing should be turned off, with possibly all data captured + so far sent to the screen. This should be configurable, though, + because in automated test runs it is better to crash than + hang indefinitely. + """ + + encoding = None + + def read(self, *args): + raise IOError("reading from stdin while output is captured") + + readline = read + readlines = read + __next__ = read + + def __iter__(self): + return self + + def fileno(self): + raise UnsupportedOperation("redirected stdin is pseudofile, has no fileno()") + + def isatty(self): + return False + + def close(self): + pass + + @property + def buffer(self): + if sys.version_info >= (3, 0): + return self + else: + raise AttributeError("redirected stdin has no attribute buffer") + + +def _colorama_workaround(): + """ + Ensure colorama is imported so that it attaches to the correct stdio + handles on Windows. + + colorama uses the terminal on import time. So if something does the + first import of colorama while I/O capture is active, colorama will + fail in various ways. + """ + + if not sys.platform.startswith("win32"): + return + try: + import colorama # noqa + except ImportError: + pass + + +def _readline_workaround(): + """ + Ensure readline is imported so that it attaches to the correct stdio + handles on Windows. + + Pdb uses readline support where available--when not running from the Python + prompt, the readline module is not imported until running the pdb REPL. If + running pytest with the --pdb option this means the readline module is not + imported until after I/O capture has been started. + + This is a problem for pyreadline, which is often used to implement readline + support on Windows, as it does not attach to the correct handles for stdout + and/or stdin if they have been redirected by the FDCapture mechanism. This + workaround ensures that readline is imported before I/O capture is setup so + that it can attach to the actual stdin/out for the console. + + See https://github.com/pytest-dev/pytest/pull/1281 + """ + + if not sys.platform.startswith("win32"): + return + try: + import readline # noqa + except ImportError: + pass + + +def _py36_windowsconsoleio_workaround(stream): + """ + Python 3.6 implemented unicode console handling for Windows. This works + by reading/writing to the raw console handle using + ``{Read,Write}ConsoleW``. + + The problem is that we are going to ``dup2`` over the stdio file + descriptors when doing ``FDCapture`` and this will ``CloseHandle`` the + handles used by Python to write to the console. Though there is still some + weirdness and the console handle seems to only be closed randomly and not + on the first call to ``CloseHandle``, or maybe it gets reopened with the + same handle value when we suspend capturing. + + The workaround in this case will reopen stdio with a different fd which + also means a different handle by replicating the logic in + "Py_lifecycle.c:initstdio/create_stdio". + + :param stream: in practice ``sys.stdout`` or ``sys.stderr``, but given + here as parameter for unittesting purposes. + + See https://github.com/pytest-dev/py/issues/103 + """ + if not sys.platform.startswith("win32") or sys.version_info[:2] < (3, 6): + return + + # bail out if ``stream`` doesn't seem like a proper ``io`` stream (#2666) + if not hasattr(stream, "buffer"): + return + + buffered = hasattr(stream.buffer, "raw") + raw_stdout = stream.buffer.raw if buffered else stream.buffer + + if not isinstance(raw_stdout, io._WindowsConsoleIO): + return + + def _reopen_stdio(f, mode): + if not buffered and mode[0] == "w": + buffering = 0 + else: + buffering = -1 + + return io.TextIOWrapper( + open(os.dup(f.fileno()), mode, buffering), + f.encoding, + f.errors, + f.newlines, + f.line_buffering, + ) + + sys.__stdin__ = sys.stdin = _reopen_stdio(sys.stdin, "rb") + sys.__stdout__ = sys.stdout = _reopen_stdio(sys.stdout, "wb") + sys.__stderr__ = sys.stderr = _reopen_stdio(sys.stderr, "wb") + + +def _attempt_to_close_capture_file(f): + """Suppress IOError when closing the temporary file used for capturing streams in py27 (#2370)""" + if six.PY2: + try: + f.close() + except IOError: + pass + else: + f.close() diff --git a/venv/Lib/site-packages/_pytest/compat.py b/venv/Lib/site-packages/_pytest/compat.py new file mode 100644 index 00000000..0cf0e41c --- /dev/null +++ b/venv/Lib/site-packages/_pytest/compat.py @@ -0,0 +1,411 @@ +""" +python version compatibility code +""" +from __future__ import absolute_import, division, print_function + +import codecs +import functools +import inspect +import re +import sys +from contextlib import contextmanager + +import py + +import _pytest +from _pytest.outcomes import TEST_OUTCOME +from six import text_type +import six + +try: + import enum +except ImportError: # pragma: no cover + # Only available in Python 3.4+ or as a backport + enum = None + +_PY3 = sys.version_info > (3, 0) +_PY2 = not _PY3 + + +if _PY3: + from inspect import signature, Parameter as Parameter +else: + from funcsigs import signature, Parameter as Parameter + +NoneType = type(None) +NOTSET = object() + +PY35 = sys.version_info[:2] >= (3, 5) +PY36 = sys.version_info[:2] >= (3, 6) +MODULE_NOT_FOUND_ERROR = "ModuleNotFoundError" if PY36 else "ImportError" + + +if _PY3: + from collections.abc import MutableMapping as MappingMixin + from collections.abc import Mapping, Sequence +else: + # those raise DeprecationWarnings in Python >=3.7 + from collections import MutableMapping as MappingMixin # noqa + from collections import Mapping, Sequence # noqa + + +if sys.version_info >= (3, 4): + from importlib.util import spec_from_file_location +else: + + def spec_from_file_location(*_, **__): + return None + + +def _format_args(func): + return str(signature(func)) + + +isfunction = inspect.isfunction +isclass = inspect.isclass +# used to work around a python2 exception info leak +exc_clear = getattr(sys, "exc_clear", lambda: None) +# The type of re.compile objects is not exposed in Python. +REGEX_TYPE = type(re.compile("")) + + +def is_generator(func): + genfunc = inspect.isgeneratorfunction(func) + return genfunc and not iscoroutinefunction(func) + + +def iscoroutinefunction(func): + """Return True if func is a decorated coroutine function. + + Note: copied and modified from Python 3.5's builtin couroutines.py to avoid import asyncio directly, + which in turns also initializes the "logging" module as side-effect (see issue #8). + """ + return getattr(func, "_is_coroutine", False) or ( + hasattr(inspect, "iscoroutinefunction") and inspect.iscoroutinefunction(func) + ) + + +def getlocation(function, curdir): + function = get_real_func(function) + fn = py.path.local(inspect.getfile(function)) + lineno = function.__code__.co_firstlineno + if fn.relto(curdir): + fn = fn.relto(curdir) + return "%s:%d" % (fn, lineno + 1) + + +def num_mock_patch_args(function): + """ return number of arguments used up by mock arguments (if any) """ + patchings = getattr(function, "patchings", None) + if not patchings: + return 0 + mock_modules = [sys.modules.get("mock"), sys.modules.get("unittest.mock")] + if any(mock_modules): + sentinels = [m.DEFAULT for m in mock_modules if m is not None] + return len( + [p for p in patchings if not p.attribute_name and p.new in sentinels] + ) + return len(patchings) + + +def getfuncargnames(function, is_method=False, cls=None): + """Returns the names of a function's mandatory arguments. + + This should return the names of all function arguments that: + * Aren't bound to an instance or type as in instance or class methods. + * Don't have default values. + * Aren't bound with functools.partial. + * Aren't replaced with mocks. + + The is_method and cls arguments indicate that the function should + be treated as a bound method even though it's not unless, only in + the case of cls, the function is a static method. + + @RonnyPfannschmidt: This function should be refactored when we + revisit fixtures. The fixture mechanism should ask the node for + the fixture names, and not try to obtain directly from the + function object well after collection has occurred. + + """ + # The parameters attribute of a Signature object contains an + # ordered mapping of parameter names to Parameter instances. This + # creates a tuple of the names of the parameters that don't have + # defaults. + arg_names = tuple( + p.name + for p in signature(function).parameters.values() + if ( + p.kind is Parameter.POSITIONAL_OR_KEYWORD + or p.kind is Parameter.KEYWORD_ONLY + ) + and p.default is Parameter.empty + ) + # If this function should be treated as a bound method even though + # it's passed as an unbound method or function, remove the first + # parameter name. + if is_method or ( + cls and not isinstance(cls.__dict__.get(function.__name__, None), staticmethod) + ): + arg_names = arg_names[1:] + # Remove any names that will be replaced with mocks. + if hasattr(function, "__wrapped__"): + arg_names = arg_names[num_mock_patch_args(function) :] + return arg_names + + +@contextmanager +def dummy_context_manager(): + """Context manager that does nothing, useful in situations where you might need an actual context manager or not + depending on some condition. Using this allow to keep the same code""" + yield + + +def get_default_arg_names(function): + # Note: this code intentionally mirrors the code at the beginning of getfuncargnames, + # to get the arguments which were excluded from its result because they had default values + return tuple( + p.name + for p in signature(function).parameters.values() + if p.kind in (Parameter.POSITIONAL_OR_KEYWORD, Parameter.KEYWORD_ONLY) + and p.default is not Parameter.empty + ) + + +if _PY3: + STRING_TYPES = bytes, str + UNICODE_TYPES = six.text_type + + if PY35: + + def _bytes_to_ascii(val): + return val.decode("ascii", "backslashreplace") + + else: + + def _bytes_to_ascii(val): + if val: + # source: http://goo.gl/bGsnwC + encoded_bytes, _ = codecs.escape_encode(val) + return encoded_bytes.decode("ascii") + else: + # empty bytes crashes codecs.escape_encode (#1087) + return "" + + def ascii_escaped(val): + """If val is pure ascii, returns it as a str(). Otherwise, escapes + bytes objects into a sequence of escaped bytes: + + b'\xc3\xb4\xc5\xd6' -> u'\\xc3\\xb4\\xc5\\xd6' + + and escapes unicode objects into a sequence of escaped unicode + ids, e.g.: + + '4\\nV\\U00043efa\\x0eMXWB\\x1e\\u3028\\u15fd\\xcd\\U0007d944' + + note: + the obvious "v.decode('unicode-escape')" will return + valid utf-8 unicode if it finds them in bytes, but we + want to return escaped bytes for any byte, even if they match + a utf-8 string. + + """ + if isinstance(val, bytes): + return _bytes_to_ascii(val) + else: + return val.encode("unicode_escape").decode("ascii") + + +else: + STRING_TYPES = six.string_types + UNICODE_TYPES = six.text_type + + def ascii_escaped(val): + """In py2 bytes and str are the same type, so return if it's a bytes + object, return it unchanged if it is a full ascii string, + otherwise escape it into its binary form. + + If it's a unicode string, change the unicode characters into + unicode escapes. + + """ + if isinstance(val, bytes): + try: + return val.encode("ascii") + except UnicodeDecodeError: + return val.encode("string-escape") + else: + return val.encode("unicode-escape") + + +class _PytestWrapper(object): + """Dummy wrapper around a function object for internal use only. + + Used to correctly unwrap the underlying function object + when we are creating fixtures, because we wrap the function object ourselves with a decorator + to issue warnings when the fixture function is called directly. + """ + + def __init__(self, obj): + self.obj = obj + + +def get_real_func(obj): + """ gets the real function object of the (possibly) wrapped object by + functools.wraps or functools.partial. + """ + start_obj = obj + for i in range(100): + # __pytest_wrapped__ is set by @pytest.fixture when wrapping the fixture function + # to trigger a warning if it gets called directly instead of by pytest: we don't + # want to unwrap further than this otherwise we lose useful wrappings like @mock.patch (#3774) + new_obj = getattr(obj, "__pytest_wrapped__", None) + if isinstance(new_obj, _PytestWrapper): + obj = new_obj.obj + break + new_obj = getattr(obj, "__wrapped__", None) + if new_obj is None: + break + obj = new_obj + else: + raise ValueError( + ("could not find real function of {start}\nstopped at {current}").format( + start=py.io.saferepr(start_obj), current=py.io.saferepr(obj) + ) + ) + if isinstance(obj, functools.partial): + obj = obj.func + return obj + + +def get_real_method(obj, holder): + """ + Attempts to obtain the real function object that might be wrapping ``obj``, while at the same time + returning a bound method to ``holder`` if the original object was a bound method. + """ + try: + is_method = hasattr(obj, "__func__") + obj = get_real_func(obj) + except Exception: + return obj + if is_method and hasattr(obj, "__get__") and callable(obj.__get__): + obj = obj.__get__(holder) + return obj + + +def getfslineno(obj): + # xxx let decorators etc specify a sane ordering + obj = get_real_func(obj) + if hasattr(obj, "place_as"): + obj = obj.place_as + fslineno = _pytest._code.getfslineno(obj) + assert isinstance(fslineno[1], int), obj + return fslineno + + +def getimfunc(func): + try: + return func.__func__ + except AttributeError: + return func + + +def safe_getattr(object, name, default): + """ Like getattr but return default upon any Exception or any OutcomeException. + + Attribute access can potentially fail for 'evil' Python objects. + See issue #214. + It catches OutcomeException because of #2490 (issue #580), new outcomes are derived from BaseException + instead of Exception (for more details check #2707) + """ + try: + return getattr(object, name, default) + except TEST_OUTCOME: + return default + + +def _is_unittest_unexpected_success_a_failure(): + """Return if the test suite should fail if an @expectedFailure unittest test PASSES. + + From https://docs.python.org/3/library/unittest.html?highlight=unittest#unittest.TestResult.wasSuccessful: + Changed in version 3.4: Returns False if there were any + unexpectedSuccesses from tests marked with the expectedFailure() decorator. + """ + return sys.version_info >= (3, 4) + + +if _PY3: + + def safe_str(v): + """returns v as string""" + return str(v) + + +else: + + def safe_str(v): + """returns v as string, converting to ascii if necessary""" + try: + return str(v) + except UnicodeError: + if not isinstance(v, text_type): + v = text_type(v) + errors = "replace" + return v.encode("utf-8", errors) + + +COLLECT_FAKEMODULE_ATTRIBUTES = ( + "Collector", + "Module", + "Generator", + "Function", + "Instance", + "Session", + "Item", + "Class", + "File", + "_fillfuncargs", +) + + +def _setup_collect_fakemodule(): + from types import ModuleType + import pytest + + pytest.collect = ModuleType("pytest.collect") + pytest.collect.__all__ = [] # used for setns + for attr in COLLECT_FAKEMODULE_ATTRIBUTES: + setattr(pytest.collect, attr, getattr(pytest, attr)) + + +if _PY2: + # Without this the test_dupfile_on_textio will fail, otherwise CaptureIO could directly inherit from StringIO. + from py.io import TextIO + + class CaptureIO(TextIO): + @property + def encoding(self): + return getattr(self, "_encoding", "UTF-8") + + +else: + import io + + class CaptureIO(io.TextIOWrapper): + def __init__(self): + super(CaptureIO, self).__init__( + io.BytesIO(), encoding="UTF-8", newline="", write_through=True + ) + + def getvalue(self): + return self.buffer.getvalue().decode("UTF-8") + + +class FuncargnamesCompatAttr(object): + """ helper class so that Metafunc, Function and FixtureRequest + don't need to each define the "funcargnames" compatibility attribute. + """ + + @property + def funcargnames(self): + """ alias attribute for ``fixturenames`` for pre-2.3 compatibility""" + return self.fixturenames diff --git a/venv/Lib/site-packages/_pytest/config/__init__.py b/venv/Lib/site-packages/_pytest/config/__init__.py new file mode 100644 index 00000000..88cbf14b --- /dev/null +++ b/venv/Lib/site-packages/_pytest/config/__init__.py @@ -0,0 +1,1035 @@ +""" command line options, ini-file and conftest.py processing. """ +from __future__ import absolute_import, division, print_function +import argparse +import inspect +import shlex +import types +import warnings +import copy +import six +import py + +# DON't import pytest here because it causes import cycle troubles +import sys +import os +from _pytest.outcomes import Skipped + +import _pytest._code +import _pytest.hookspec # the extension point definitions +import _pytest.assertion +from pluggy import PluginManager, HookimplMarker, HookspecMarker +from _pytest._code import ExceptionInfo, filter_traceback +from _pytest.compat import safe_str +from .exceptions import UsageError, PrintHelp +from .findpaths import determine_setup, exists + +hookimpl = HookimplMarker("pytest") +hookspec = HookspecMarker("pytest") + + +class ConftestImportFailure(Exception): + def __init__(self, path, excinfo): + Exception.__init__(self, path, excinfo) + self.path = path + self.excinfo = excinfo + + +def main(args=None, plugins=None): + """ return exit code, after performing an in-process test run. + + :arg args: list of command line arguments. + + :arg plugins: list of plugin objects to be auto-registered during + initialization. + """ + from _pytest.main import EXIT_USAGEERROR + + try: + try: + config = _prepareconfig(args, plugins) + except ConftestImportFailure as e: + exc_info = ExceptionInfo(e.excinfo) + tw = py.io.TerminalWriter(sys.stderr) + tw.line( + "ImportError while loading conftest '{e.path}'.".format(e=e), red=True + ) + exc_info.traceback = exc_info.traceback.filter(filter_traceback) + exc_repr = ( + exc_info.getrepr(style="short", chain=False) + if exc_info.traceback + else exc_info.exconly() + ) + formatted_tb = safe_str(exc_repr) + for line in formatted_tb.splitlines(): + tw.line(line.rstrip(), red=True) + return 4 + else: + try: + return config.hook.pytest_cmdline_main(config=config) + finally: + config._ensure_unconfigure() + except UsageError as e: + tw = py.io.TerminalWriter(sys.stderr) + for msg in e.args: + tw.line("ERROR: {}\n".format(msg), red=True) + return EXIT_USAGEERROR + + +class cmdline(object): # compatibility namespace + main = staticmethod(main) + + +def filename_arg(path, optname): + """ Argparse type validator for filename arguments. + + :path: path of filename + :optname: name of the option + """ + if os.path.isdir(path): + raise UsageError("{} must be a filename, given: {}".format(optname, path)) + return path + + +def directory_arg(path, optname): + """Argparse type validator for directory arguments. + + :path: path of directory + :optname: name of the option + """ + if not os.path.isdir(path): + raise UsageError("{} must be a directory, given: {}".format(optname, path)) + return path + + +default_plugins = ( + "mark", + "main", + "terminal", + "runner", + "python", + "fixtures", + "debugging", + "unittest", + "capture", + "skipping", + "tmpdir", + "monkeypatch", + "recwarn", + "pastebin", + "helpconfig", + "nose", + "assertion", + "junitxml", + "resultlog", + "doctest", + "cacheprovider", + "freeze_support", + "setuponly", + "setupplan", + "warnings", + "logging", +) + + +builtin_plugins = set(default_plugins) +builtin_plugins.add("pytester") + + +def get_config(): + # subsequent calls to main will create a fresh instance + pluginmanager = PytestPluginManager() + config = Config(pluginmanager) + for spec in default_plugins: + pluginmanager.import_plugin(spec) + return config + + +def get_plugin_manager(): + """ + Obtain a new instance of the + :py:class:`_pytest.config.PytestPluginManager`, with default plugins + already loaded. + + This function can be used by integration with other tools, like hooking + into pytest to run tests into an IDE. + """ + return get_config().pluginmanager + + +def _prepareconfig(args=None, plugins=None): + warning = None + if args is None: + args = sys.argv[1:] + elif isinstance(args, py.path.local): + args = [str(args)] + elif not isinstance(args, (tuple, list)): + if not isinstance(args, str): + raise ValueError("not a string or argument list: %r" % (args,)) + args = shlex.split(args, posix=sys.platform != "win32") + from _pytest import deprecated + + warning = deprecated.MAIN_STR_ARGS + config = get_config() + pluginmanager = config.pluginmanager + try: + if plugins: + for plugin in plugins: + if isinstance(plugin, six.string_types): + pluginmanager.consider_pluginarg(plugin) + else: + pluginmanager.register(plugin) + if warning: + from _pytest.warnings import _issue_config_warning + + _issue_config_warning(warning, config=config) + return pluginmanager.hook.pytest_cmdline_parse( + pluginmanager=pluginmanager, args=args + ) + except BaseException: + config._ensure_unconfigure() + raise + + +class PytestPluginManager(PluginManager): + """ + Overwrites :py:class:`pluggy.PluginManager ` to add pytest-specific + functionality: + + * loading plugins from the command line, ``PYTEST_PLUGINS`` env variable and + ``pytest_plugins`` global variables found in plugins being loaded; + * ``conftest.py`` loading during start-up; + """ + + def __init__(self): + super(PytestPluginManager, self).__init__("pytest") + self._conftest_plugins = set() + + # state related to local conftest plugins + self._path2confmods = {} + self._conftestpath2mod = {} + self._confcutdir = None + self._noconftest = False + self._duplicatepaths = set() + + self.add_hookspecs(_pytest.hookspec) + self.register(self) + if os.environ.get("PYTEST_DEBUG"): + err = sys.stderr + encoding = getattr(err, "encoding", "utf8") + try: + err = py.io.dupfile(err, encoding=encoding) + except Exception: + pass + self.trace.root.setwriter(err.write) + self.enable_tracing() + + # Config._consider_importhook will set a real object if required. + self.rewrite_hook = _pytest.assertion.DummyRewriteHook() + # Used to know when we are importing conftests after the pytest_configure stage + self._configured = False + + def addhooks(self, module_or_class): + """ + .. deprecated:: 2.8 + + Use :py:meth:`pluggy.PluginManager.add_hookspecs ` + instead. + """ + warning = dict( + code="I2", + fslocation=_pytest._code.getfslineno(sys._getframe(1)), + nodeid=None, + message="use pluginmanager.add_hookspecs instead of " + "deprecated addhooks() method.", + ) + self._warn(warning) + return self.add_hookspecs(module_or_class) + + def parse_hookimpl_opts(self, plugin, name): + # pytest hooks are always prefixed with pytest_ + # so we avoid accessing possibly non-readable attributes + # (see issue #1073) + if not name.startswith("pytest_"): + return + # ignore some historic special names which can not be hooks anyway + if name == "pytest_plugins" or name.startswith("pytest_funcarg__"): + return + + method = getattr(plugin, name) + opts = super(PytestPluginManager, self).parse_hookimpl_opts(plugin, name) + + # consider only actual functions for hooks (#3775) + if not inspect.isroutine(method): + return + + # collect unmarked hooks as long as they have the `pytest_' prefix + if opts is None and name.startswith("pytest_"): + opts = {} + + if opts is not None: + for name in ("tryfirst", "trylast", "optionalhook", "hookwrapper"): + opts.setdefault(name, hasattr(method, name)) + return opts + + def parse_hookspec_opts(self, module_or_class, name): + opts = super(PytestPluginManager, self).parse_hookspec_opts( + module_or_class, name + ) + if opts is None: + method = getattr(module_or_class, name) + if name.startswith("pytest_"): + opts = { + "firstresult": hasattr(method, "firstresult"), + "historic": hasattr(method, "historic"), + } + return opts + + def register(self, plugin, name=None): + if name in ["pytest_catchlog", "pytest_capturelog"]: + self._warn( + "{} plugin has been merged into the core, " + "please remove it from your requirements.".format( + name.replace("_", "-") + ) + ) + return + ret = super(PytestPluginManager, self).register(plugin, name) + if ret: + self.hook.pytest_plugin_registered.call_historic( + kwargs=dict(plugin=plugin, manager=self) + ) + + if isinstance(plugin, types.ModuleType): + self.consider_module(plugin) + return ret + + def getplugin(self, name): + # support deprecated naming because plugins (xdist e.g.) use it + return self.get_plugin(name) + + def hasplugin(self, name): + """Return True if the plugin with the given name is registered.""" + return bool(self.get_plugin(name)) + + def pytest_configure(self, config): + # XXX now that the pluginmanager exposes hookimpl(tryfirst...) + # we should remove tryfirst/trylast as markers + config.addinivalue_line( + "markers", + "tryfirst: mark a hook implementation function such that the " + "plugin machinery will try to call it first/as early as possible.", + ) + config.addinivalue_line( + "markers", + "trylast: mark a hook implementation function such that the " + "plugin machinery will try to call it last/as late as possible.", + ) + self._configured = True + + def _warn(self, message): + kwargs = ( + message + if isinstance(message, dict) + else {"code": "I1", "message": message, "fslocation": None, "nodeid": None} + ) + self.hook.pytest_logwarning.call_historic(kwargs=kwargs) + + # + # internal API for local conftest plugin handling + # + def _set_initial_conftests(self, namespace): + """ load initial conftest files given a preparsed "namespace". + As conftest files may add their own command line options + which have arguments ('--my-opt somepath') we might get some + false positives. All builtin and 3rd party plugins will have + been loaded, however, so common options will not confuse our logic + here. + """ + current = py.path.local() + self._confcutdir = ( + current.join(namespace.confcutdir, abs=True) + if namespace.confcutdir + else None + ) + self._noconftest = namespace.noconftest + self._using_pyargs = namespace.pyargs + testpaths = namespace.file_or_dir + foundanchor = False + for path in testpaths: + path = str(path) + # remove node-id syntax + i = path.find("::") + if i != -1: + path = path[:i] + anchor = current.join(path, abs=1) + if exists(anchor): # we found some file object + self._try_load_conftest(anchor) + foundanchor = True + if not foundanchor: + self._try_load_conftest(current) + + def _try_load_conftest(self, anchor): + self._getconftestmodules(anchor) + # let's also consider test* subdirs + if anchor.check(dir=1): + for x in anchor.listdir("test*"): + if x.check(dir=1): + self._getconftestmodules(x) + + def _getconftestmodules(self, path): + if self._noconftest: + return [] + + if path.isfile(): + directory = path.dirpath() + else: + directory = path + try: + return self._path2confmods[directory] + except KeyError: + # XXX these days we may rather want to use config.rootdir + # and allow users to opt into looking into the rootdir parent + # directories instead of requiring to specify confcutdir + clist = [] + for parent in directory.parts(): + if self._confcutdir and self._confcutdir.relto(parent): + continue + conftestpath = parent.join("conftest.py") + if conftestpath.isfile(): + mod = self._importconftest(conftestpath) + clist.append(mod) + + self._path2confmods[directory] = clist + return clist + + def _rget_with_confmod(self, name, path): + modules = self._getconftestmodules(path) + for mod in reversed(modules): + try: + return mod, getattr(mod, name) + except AttributeError: + continue + raise KeyError(name) + + def _importconftest(self, conftestpath): + try: + return self._conftestpath2mod[conftestpath] + except KeyError: + pkgpath = conftestpath.pypkgpath() + if pkgpath is None: + _ensure_removed_sysmodule(conftestpath.purebasename) + try: + mod = conftestpath.pyimport() + if ( + hasattr(mod, "pytest_plugins") + and self._configured + and not self._using_pyargs + ): + from _pytest.deprecated import ( + PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST + ) + + warnings.warn_explicit( + PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST, + category=None, + filename=str(conftestpath), + lineno=0, + ) + except Exception: + raise ConftestImportFailure(conftestpath, sys.exc_info()) + + self._conftest_plugins.add(mod) + self._conftestpath2mod[conftestpath] = mod + dirpath = conftestpath.dirpath() + if dirpath in self._path2confmods: + for path, mods in self._path2confmods.items(): + if path and path.relto(dirpath) or path == dirpath: + assert mod not in mods + mods.append(mod) + self.trace("loaded conftestmodule %r" % (mod)) + self.consider_conftest(mod) + return mod + + # + # API for bootstrapping plugin loading + # + # + + def consider_preparse(self, args): + for opt1, opt2 in zip(args, args[1:]): + if opt1 == "-p": + self.consider_pluginarg(opt2) + + def consider_pluginarg(self, arg): + if arg.startswith("no:"): + name = arg[3:] + self.set_blocked(name) + if not name.startswith("pytest_"): + self.set_blocked("pytest_" + name) + else: + self.import_plugin(arg) + + def consider_conftest(self, conftestmodule): + self.register(conftestmodule, name=conftestmodule.__file__) + + def consider_env(self): + self._import_plugin_specs(os.environ.get("PYTEST_PLUGINS")) + + def consider_module(self, mod): + self._import_plugin_specs(getattr(mod, "pytest_plugins", [])) + + def _import_plugin_specs(self, spec): + plugins = _get_plugin_specs_as_list(spec) + for import_spec in plugins: + self.import_plugin(import_spec) + + def import_plugin(self, modname): + # most often modname refers to builtin modules, e.g. "pytester", + # "terminal" or "capture". Those plugins are registered under their + # basename for historic purposes but must be imported with the + # _pytest prefix. + assert isinstance(modname, (six.text_type, str)), ( + "module name as text required, got %r" % modname + ) + modname = str(modname) + if self.is_blocked(modname) or self.get_plugin(modname) is not None: + return + if modname in builtin_plugins: + importspec = "_pytest." + modname + else: + importspec = modname + self.rewrite_hook.mark_rewrite(importspec) + try: + __import__(importspec) + except ImportError as e: + new_exc_type = ImportError + new_exc_message = 'Error importing plugin "%s": %s' % ( + modname, + safe_str(e.args[0]), + ) + new_exc = new_exc_type(new_exc_message) + + six.reraise(new_exc_type, new_exc, sys.exc_info()[2]) + + except Skipped as e: + self._warn("skipped plugin %r: %s" % ((modname, e.msg))) + else: + mod = sys.modules[importspec] + self.register(mod, modname) + + +def _get_plugin_specs_as_list(specs): + """ + Parses a list of "plugin specs" and returns a list of plugin names. + + Plugin specs can be given as a list of strings separated by "," or already as a list/tuple in + which case it is returned as a list. Specs can also be `None` in which case an + empty list is returned. + """ + if specs is not None: + if isinstance(specs, str): + specs = specs.split(",") if specs else [] + if not isinstance(specs, (list, tuple)): + raise UsageError( + "Plugin specs must be a ','-separated string or a " + "list/tuple of strings for plugin names. Given: %r" % specs + ) + return list(specs) + return [] + + +def _ensure_removed_sysmodule(modname): + try: + del sys.modules[modname] + except KeyError: + pass + + +class Notset(object): + def __repr__(self): + return "" + + +notset = Notset() + + +def _iter_rewritable_modules(package_files): + for fn in package_files: + is_simple_module = "/" not in fn and fn.endswith(".py") + is_package = fn.count("/") == 1 and fn.endswith("__init__.py") + if is_simple_module: + module_name, _ = os.path.splitext(fn) + yield module_name + elif is_package: + package_name = os.path.dirname(fn) + yield package_name + + +class Config(object): + """ access to configuration values, pluginmanager and plugin hooks. """ + + def __init__(self, pluginmanager): + #: access to command line option as attributes. + #: (deprecated), use :py:func:`getoption() <_pytest.config.Config.getoption>` instead + self.option = argparse.Namespace() + from .argparsing import Parser, FILE_OR_DIR + + _a = FILE_OR_DIR + self._parser = Parser( + usage="%%(prog)s [options] [%s] [%s] [...]" % (_a, _a), + processopt=self._processopt, + ) + #: a pluginmanager instance + self.pluginmanager = pluginmanager + self.trace = self.pluginmanager.trace.root.get("config") + self.hook = self.pluginmanager.hook + self._inicache = {} + self._override_ini = () + self._opt2dest = {} + self._cleanup = [] + self._warn = self.pluginmanager._warn + self.pluginmanager.register(self, "pytestconfig") + self._configured = False + + def do_setns(dic): + import pytest + + setns(pytest, dic) + + self.hook.pytest_namespace.call_historic(do_setns, {}) + self.hook.pytest_addoption.call_historic(kwargs=dict(parser=self._parser)) + + def add_cleanup(self, func): + """ Add a function to be called when the config object gets out of + use (usually coninciding with pytest_unconfigure).""" + self._cleanup.append(func) + + def _do_configure(self): + assert not self._configured + self._configured = True + self.hook.pytest_configure.call_historic(kwargs=dict(config=self)) + + def _ensure_unconfigure(self): + if self._configured: + self._configured = False + self.hook.pytest_unconfigure(config=self) + self.hook.pytest_configure._call_history = [] + while self._cleanup: + fin = self._cleanup.pop() + fin() + + def warn(self, code, message, fslocation=None, nodeid=None): + """ + .. deprecated:: 3.8 + + Use :py:func:`warnings.warn` or :py:func:`warnings.warn_explicit` directly instead. + + Generate a warning for this test session. + """ + from _pytest.warning_types import RemovedInPytest4Warning + + if isinstance(fslocation, (tuple, list)) and len(fslocation) > 2: + filename, lineno = fslocation[:2] + else: + filename = "unknown file" + lineno = 0 + msg = "config.warn has been deprecated, use warnings.warn instead" + if nodeid: + msg = "{}: {}".format(nodeid, msg) + warnings.warn_explicit( + RemovedInPytest4Warning(msg), + category=None, + filename=filename, + lineno=lineno, + ) + self.hook.pytest_logwarning.call_historic( + kwargs=dict( + code=code, message=message, fslocation=fslocation, nodeid=nodeid + ) + ) + + def get_terminal_writer(self): + return self.pluginmanager.get_plugin("terminalreporter")._tw + + def pytest_cmdline_parse(self, pluginmanager, args): + # REF1 assert self == pluginmanager.config, (self, pluginmanager.config) + self.parse(args) + return self + + def notify_exception(self, excinfo, option=None): + if option and option.fulltrace: + style = "long" + else: + style = "native" + excrepr = excinfo.getrepr( + funcargs=True, showlocals=getattr(option, "showlocals", False), style=style + ) + res = self.hook.pytest_internalerror(excrepr=excrepr, excinfo=excinfo) + if not any(res): + for line in str(excrepr).split("\n"): + sys.stderr.write("INTERNALERROR> %s\n" % line) + sys.stderr.flush() + + def cwd_relative_nodeid(self, nodeid): + # nodeid's are relative to the rootpath, compute relative to cwd + if self.invocation_dir != self.rootdir: + fullpath = self.rootdir.join(nodeid) + nodeid = self.invocation_dir.bestrelpath(fullpath) + return nodeid + + @classmethod + def fromdictargs(cls, option_dict, args): + """ constructor useable for subprocesses. """ + config = get_config() + config.option.__dict__.update(option_dict) + config.parse(args, addopts=False) + for x in config.option.plugins: + config.pluginmanager.consider_pluginarg(x) + return config + + def _processopt(self, opt): + for name in opt._short_opts + opt._long_opts: + self._opt2dest[name] = opt.dest + + if hasattr(opt, "default") and opt.dest: + if not hasattr(self.option, opt.dest): + setattr(self.option, opt.dest, opt.default) + + @hookimpl(trylast=True) + def pytest_load_initial_conftests(self, early_config): + self.pluginmanager._set_initial_conftests(early_config.known_args_namespace) + + def _initini(self, args): + ns, unknown_args = self._parser.parse_known_and_unknown_args( + args, namespace=copy.copy(self.option) + ) + r = determine_setup( + ns.inifilename, + ns.file_or_dir + unknown_args, + rootdir_cmd_arg=ns.rootdir or None, + config=self, + ) + self.rootdir, self.inifile, self.inicfg = r + self._parser.extra_info["rootdir"] = self.rootdir + self._parser.extra_info["inifile"] = self.inifile + self.invocation_dir = py.path.local() + self._parser.addini("addopts", "extra command line options", "args") + self._parser.addini("minversion", "minimally required pytest version") + self._override_ini = ns.override_ini or () + + def _consider_importhook(self, args): + """Install the PEP 302 import hook if using assertion rewriting. + + Needs to parse the --assert= option from the commandline + and find all the installed plugins to mark them for rewriting + by the importhook. + """ + ns, unknown_args = self._parser.parse_known_and_unknown_args(args) + mode = ns.assertmode + if mode == "rewrite": + try: + hook = _pytest.assertion.install_importhook(self) + except SystemError: + mode = "plain" + else: + self._mark_plugins_for_rewrite(hook) + _warn_about_missing_assertion(mode) + + def _mark_plugins_for_rewrite(self, hook): + """ + Given an importhook, mark for rewrite any top-level + modules or packages in the distribution package for + all pytest plugins. + """ + import pkg_resources + + self.pluginmanager.rewrite_hook = hook + + if os.environ.get("PYTEST_DISABLE_PLUGIN_AUTOLOAD"): + # We don't autoload from setuptools entry points, no need to continue. + return + + # 'RECORD' available for plugins installed normally (pip install) + # 'SOURCES.txt' available for plugins installed in dev mode (pip install -e) + # for installed plugins 'SOURCES.txt' returns an empty list, and vice-versa + # so it shouldn't be an issue + metadata_files = "RECORD", "SOURCES.txt" + + package_files = ( + entry.split(",")[0] + for entrypoint in pkg_resources.iter_entry_points("pytest11") + for metadata in metadata_files + for entry in entrypoint.dist._get_metadata(metadata) + ) + + for name in _iter_rewritable_modules(package_files): + hook.mark_rewrite(name) + + def _preparse(self, args, addopts=True): + if addopts: + args[:] = shlex.split(os.environ.get("PYTEST_ADDOPTS", "")) + args + self._initini(args) + if addopts: + args[:] = self.getini("addopts") + args + self._checkversion() + self._consider_importhook(args) + self.pluginmanager.consider_preparse(args) + if not os.environ.get("PYTEST_DISABLE_PLUGIN_AUTOLOAD"): + # Don't autoload from setuptools entry point. Only explicitly specified + # plugins are going to be loaded. + self.pluginmanager.load_setuptools_entrypoints("pytest11") + self.pluginmanager.consider_env() + self.known_args_namespace = ns = self._parser.parse_known_args( + args, namespace=copy.copy(self.option) + ) + if self.known_args_namespace.confcutdir is None and self.inifile: + confcutdir = py.path.local(self.inifile).dirname + self.known_args_namespace.confcutdir = confcutdir + try: + self.hook.pytest_load_initial_conftests( + early_config=self, args=args, parser=self._parser + ) + except ConftestImportFailure: + e = sys.exc_info()[1] + if ns.help or ns.version: + # we don't want to prevent --help/--version to work + # so just let is pass and print a warning at the end + self._warn("could not load initial conftests (%s)\n" % e.path) + else: + raise + + def _checkversion(self): + import pytest + + minver = self.inicfg.get("minversion", None) + if minver: + ver = minver.split(".") + myver = pytest.__version__.split(".") + if myver < ver: + raise pytest.UsageError( + "%s:%d: requires pytest-%s, actual pytest-%s'" + % ( + self.inicfg.config.path, + self.inicfg.lineof("minversion"), + minver, + pytest.__version__, + ) + ) + + def parse(self, args, addopts=True): + # parse given cmdline arguments into this config object. + assert not hasattr( + self, "args" + ), "can only parse cmdline args at most once per Config object" + self._origargs = args + self.hook.pytest_addhooks.call_historic( + kwargs=dict(pluginmanager=self.pluginmanager) + ) + self._preparse(args, addopts=addopts) + # XXX deprecated hook: + self.hook.pytest_cmdline_preparse(config=self, args=args) + self._parser.after_preparse = True + try: + args = self._parser.parse_setoption( + args, self.option, namespace=self.option + ) + if not args: + cwd = os.getcwd() + if cwd == self.rootdir: + args = self.getini("testpaths") + if not args: + args = [cwd] + self.args = args + except PrintHelp: + pass + + def addinivalue_line(self, name, line): + """ add a line to an ini-file option. The option must have been + declared but might not yet be set in which case the line becomes the + the first line in its value. """ + x = self.getini(name) + assert isinstance(x, list) + x.append(line) # modifies the cached list inline + + def getini(self, name): + """ return configuration value from an :ref:`ini file `. If the + specified name hasn't been registered through a prior + :py:func:`parser.addini <_pytest.config.Parser.addini>` + call (usually from a plugin), a ValueError is raised. """ + try: + return self._inicache[name] + except KeyError: + self._inicache[name] = val = self._getini(name) + return val + + def _getini(self, name): + try: + description, type, default = self._parser._inidict[name] + except KeyError: + raise ValueError("unknown configuration value: %r" % (name,)) + value = self._get_override_ini_value(name) + if value is None: + try: + value = self.inicfg[name] + except KeyError: + if default is not None: + return default + if type is None: + return "" + return [] + if type == "pathlist": + dp = py.path.local(self.inicfg.config.path).dirpath() + values = [] + for relpath in shlex.split(value): + values.append(dp.join(relpath, abs=True)) + return values + elif type == "args": + return shlex.split(value) + elif type == "linelist": + return [t for t in map(lambda x: x.strip(), value.split("\n")) if t] + elif type == "bool": + return bool(_strtobool(value.strip())) + else: + assert type is None + return value + + def _getconftest_pathlist(self, name, path): + try: + mod, relroots = self.pluginmanager._rget_with_confmod(name, path) + except KeyError: + return None + modpath = py.path.local(mod.__file__).dirpath() + values = [] + for relroot in relroots: + if not isinstance(relroot, py.path.local): + relroot = relroot.replace("/", py.path.local.sep) + relroot = modpath.join(relroot, abs=True) + values.append(relroot) + return values + + def _get_override_ini_value(self, name): + value = None + # override_ini is a list of "ini=value" options + # always use the last item if multiple values are set for same ini-name, + # e.g. -o foo=bar1 -o foo=bar2 will set foo to bar2 + for ini_config in self._override_ini: + try: + key, user_ini_value = ini_config.split("=", 1) + except ValueError: + raise UsageError("-o/--override-ini expects option=value style.") + else: + if key == name: + value = user_ini_value + return value + + def getoption(self, name, default=notset, skip=False): + """ return command line option value. + + :arg name: name of the option. You may also specify + the literal ``--OPT`` option instead of the "dest" option name. + :arg default: default value if no option of that name exists. + :arg skip: if True raise pytest.skip if option does not exists + or has a None value. + """ + name = self._opt2dest.get(name, name) + try: + val = getattr(self.option, name) + if val is None and skip: + raise AttributeError(name) + return val + except AttributeError: + if default is not notset: + return default + if skip: + import pytest + + pytest.skip("no %r option found" % (name,)) + raise ValueError("no option named %r" % (name,)) + + def getvalue(self, name, path=None): + """ (deprecated, use getoption()) """ + return self.getoption(name) + + def getvalueorskip(self, name, path=None): + """ (deprecated, use getoption(skip=True)) """ + return self.getoption(name, skip=True) + + +def _assertion_supported(): + try: + assert False + except AssertionError: + return True + else: + return False + + +def _warn_about_missing_assertion(mode): + if not _assertion_supported(): + if mode == "plain": + sys.stderr.write( + "WARNING: ASSERTIONS ARE NOT EXECUTED" + " and FAILING TESTS WILL PASS. Are you" + " using python -O?" + ) + else: + sys.stderr.write( + "WARNING: assertions not in test modules or" + " plugins will be ignored" + " because assert statements are not executed " + "by the underlying Python interpreter " + "(are you using python -O?)\n" + ) + + +def setns(obj, dic): + import pytest + + for name, value in dic.items(): + if isinstance(value, dict): + mod = getattr(obj, name, None) + if mod is None: + modname = "pytest.%s" % name + mod = types.ModuleType(modname) + sys.modules[modname] = mod + mod.__all__ = [] + setattr(obj, name, mod) + obj.__all__.append(name) + setns(mod, value) + else: + setattr(obj, name, value) + obj.__all__.append(name) + # if obj != pytest: + # pytest.__all__.append(name) + setattr(pytest, name, value) + + +def create_terminal_writer(config, *args, **kwargs): + """Create a TerminalWriter instance configured according to the options + in the config object. Every code which requires a TerminalWriter object + and has access to a config object should use this function. + """ + tw = py.io.TerminalWriter(*args, **kwargs) + if config.option.color == "yes": + tw.hasmarkup = True + if config.option.color == "no": + tw.hasmarkup = False + return tw + + +def _strtobool(val): + """Convert a string representation of truth to true (1) or false (0). + + True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values + are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if + 'val' is anything else. + + .. note:: copied from distutils.util + """ + val = val.lower() + if val in ("y", "yes", "t", "true", "on", "1"): + return 1 + elif val in ("n", "no", "f", "false", "off", "0"): + return 0 + else: + raise ValueError("invalid truth value %r" % (val,)) diff --git a/venv/Lib/site-packages/_pytest/config/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/_pytest/config/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fddaf0c6a1489882cdd140e8f4f2c91a8a96f99 GIT binary patch literal 29491 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%0A?!O_YrhM_vn_5e`4&ChSO!EfRcuP83!;j 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/config/__pycache__/findpaths.cpython-37.pyc b/venv/Lib/site-packages/_pytest/config/__pycache__/findpaths.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9600c10688dbe34d340ba94e8b6eb385faf27b0 GIT binary patch literal 4070 zcmai1&2JmW6`$E%E|<$s%ko#6rrWf!!^To$#|RwN5Sq%4;WlN2%CQ|*21{{P)Jo(o zHM3GAcG*K^z-a*+F3@8S6wph1>al2nUVAgp>!ODOy)>8n0Y3HjW+};0V|R)9p7-X> zoA>eK56Wei;rr`5fB$Li6l4FU!NF&u^L-Sxh)OWQd#stYyvctn#y3SMgW7Y2ZH>8YY z$DkE_)H)~&DC%`oyH3K!Y@aPLizR%+m9KI}KVo*mVlV^==TC;2@tS3v2E z3rQYxj&Kua-QBR|KNDNzHVpYR;i9-vkWV39saNcmMg>y1DEG?!%E;v`DI{)UtXHwW z@`&$o?5{q;4U$}vPr&aSTQ!$h#_b80Ow_Uys6W|LJKSU9#1)ziG}Y$HUAB1-W$rE$ zC-A&e!+*FQz9qjcJ8NFN=6gM;+KX1bw(M^8{V-PEY9zh3x83dq!VAJ+W;N*fdNO;m zi<(0_6rS|sEg52OyfwfUFnLo(Q7i&^kqC+IqSsmN&WNBB*JoW#7)G%_=Vj0C1Hl>2_=B#=`AeA2o(|SZk%>NY zuaTNNQGYOhhK``~Y&LwQ>&Fmd_F9jeM$Myhux>roJDr%VgbaK7e=bN4P$fN8t3+LW>^EYz0c&Y(dKC; zp|rspbw|HgGbjCC9FaZr`%x&*LRS68@*H{y`HGAt&BK`~F4rx3bj0UoH6v)X!w%wj zBsEdfR%>kubD;!rWcTSws2HY7Cma%7#TNB#R1BIX{ZeqZjVV2{p;<@&O1hTc!M;Q7 zlG~V*qUO<|kpF=F3dvMhXt~G<8!dat9~!HM$P4EIa-I(T{2@b{EeIDg2DNaB{Y(Zrp{%R`p52E2vjQzYLxi3t1~`)gERqU zs@AHE`Yp2PBey@K_-b*cz~^~!gmI2?wb>XNb8}hv%fw1^3NbQ%fnXGETJ)+da^Fmj zFcN+%5c<}nT}b-w%OrgKVuT0Sw6GP?$u<{ccRF$06;SbRA1|L%bUj;IgCKS%}d5WDkQ{QIws_-F8+J+6$H zt@E+*nNAD){0`95rlFA&Jj*JUG&H8VTuNF$_-bn1WEe?+H~$Kg>;{PGA3mb{E{ zhwe)s2}xJcA@}$2<1A;7tc1zG9M~IzW-i7IJUT}n4IF37%Y?$aMrff1p4-_@^1yiE z$k|;4hH}oaQ31Oi1BDT;dOQibj|o}!?0%lm8~S$7=@&*tAhu%SuDjVOBL9dd<{og| zA_M-Kw^&>R;Qr$TaD($Fn7xN`m&K*T0yZs$znk>RaXBe>K`)#~#&33@p(p4w+P$Dp(0lNe7! z_R=1-BTDC(C~p{}N>ZT{lQPaQ(EDvhr+1&C)C5gd_2@Kct3>;Rt0(apQ5m~QbssMC zOP*9o!URb72_K9zWLmE_h897vF98urk#2(LbgG9*l1Zb%zbk481OOVz6KIEk7X;)0 zPRMDW@$U|=UJn3Vkd=153qK!S@BlV}T(?3o>n+e<8gDn+lHP@xnF&t4FoB=5^|RWj zG6&YM;p)cKLWtN(oIe5E0Qq|hh7Mip7-bGg-s z6hI>dY9WJdKXu{%0KeO9spKqer94!xHS<6-6s|Krs!l|1b^3zRhgL;uA&4oBa{zu+ z3kuZ{UJ`~)^Aq^hw805Wndl^SGe6iP480Te}SLLeoxly~29&N!$43rm^UJ^%m! literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/config/argparsing.py b/venv/Lib/site-packages/_pytest/config/argparsing.py new file mode 100644 index 00000000..784b2b21 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/config/argparsing.py @@ -0,0 +1,410 @@ +import six +import warnings +import argparse + +from gettext import gettext as _ +import sys as _sys + +import py + +from ..main import EXIT_USAGEERROR + +FILE_OR_DIR = "file_or_dir" + + +class Parser(object): + """ Parser for command line arguments and ini-file values. + + :ivar extra_info: dict of generic param -> value to display in case + there's an error processing the command line arguments. + """ + + def __init__(self, usage=None, processopt=None): + self._anonymous = OptionGroup("custom options", parser=self) + self._groups = [] + self._processopt = processopt + self._usage = usage + self._inidict = {} + self._ininames = [] + self.extra_info = {} + + def processoption(self, option): + if self._processopt: + if option.dest: + self._processopt(option) + + def getgroup(self, name, description="", after=None): + """ get (or create) a named option Group. + + :name: name of the option group. + :description: long description for --help output. + :after: name of other group, used for ordering --help output. + + The returned group object has an ``addoption`` method with the same + signature as :py:func:`parser.addoption + <_pytest.config.Parser.addoption>` but will be shown in the + respective group in the output of ``pytest. --help``. + """ + for group in self._groups: + if group.name == name: + return group + group = OptionGroup(name, description, parser=self) + i = 0 + for i, grp in enumerate(self._groups): + if grp.name == after: + break + self._groups.insert(i + 1, group) + return group + + def addoption(self, *opts, **attrs): + """ register a command line option. + + :opts: option names, can be short or long options. + :attrs: same attributes which the ``add_option()`` function of the + `argparse library + `_ + accepts. + + After command line parsing options are available on the pytest config + object via ``config.option.NAME`` where ``NAME`` is usually set + by passing a ``dest`` attribute, for example + ``addoption("--long", dest="NAME", ...)``. + """ + self._anonymous.addoption(*opts, **attrs) + + def parse(self, args, namespace=None): + from _pytest._argcomplete import try_argcomplete + + self.optparser = self._getparser() + try_argcomplete(self.optparser) + args = [str(x) if isinstance(x, py.path.local) else x for x in args] + return self.optparser.parse_args(args, namespace=namespace) + + def _getparser(self): + from _pytest._argcomplete import filescompleter + + optparser = MyOptionParser(self, self.extra_info) + groups = self._groups + [self._anonymous] + for group in groups: + if group.options: + desc = group.description or group.name + arggroup = optparser.add_argument_group(desc) + for option in group.options: + n = option.names() + a = option.attrs() + arggroup.add_argument(*n, **a) + # bash like autocompletion for dirs (appending '/') + optparser.add_argument(FILE_OR_DIR, nargs="*").completer = filescompleter + return optparser + + def parse_setoption(self, args, option, namespace=None): + parsedoption = self.parse(args, namespace=namespace) + for name, value in parsedoption.__dict__.items(): + setattr(option, name, value) + return getattr(parsedoption, FILE_OR_DIR) + + def parse_known_args(self, args, namespace=None): + """parses and returns a namespace object with known arguments at this + point. + """ + return self.parse_known_and_unknown_args(args, namespace=namespace)[0] + + def parse_known_and_unknown_args(self, args, namespace=None): + """parses and returns a namespace object with known arguments, and + the remaining arguments unknown at this point. + """ + optparser = self._getparser() + args = [str(x) if isinstance(x, py.path.local) else x for x in args] + return optparser.parse_known_args(args, namespace=namespace) + + def addini(self, name, help, type=None, default=None): + """ register an ini-file option. + + :name: name of the ini-variable + :type: type of the variable, can be ``pathlist``, ``args``, ``linelist`` + or ``bool``. + :default: default value if no ini-file option exists but is queried. + + The value of ini-variables can be retrieved via a call to + :py:func:`config.getini(name) <_pytest.config.Config.getini>`. + """ + assert type in (None, "pathlist", "args", "linelist", "bool") + self._inidict[name] = (help, type, default) + self._ininames.append(name) + + +class ArgumentError(Exception): + """ + Raised if an Argument instance is created with invalid or + inconsistent arguments. + """ + + def __init__(self, msg, option): + self.msg = msg + self.option_id = str(option) + + def __str__(self): + if self.option_id: + return "option %s: %s" % (self.option_id, self.msg) + else: + return self.msg + + +class Argument(object): + """class that mimics the necessary behaviour of optparse.Option + + its currently a least effort implementation + and ignoring choices and integer prefixes + https://docs.python.org/3/library/optparse.html#optparse-standard-option-types + """ + + _typ_map = {"int": int, "string": str, "float": float, "complex": complex} + + def __init__(self, *names, **attrs): + """store parms in private vars for use in add_argument""" + self._attrs = attrs + self._short_opts = [] + self._long_opts = [] + self.dest = attrs.get("dest") + if "%default" in (attrs.get("help") or ""): + warnings.warn( + 'pytest now uses argparse. "%default" should be' + ' changed to "%(default)s" ', + DeprecationWarning, + stacklevel=3, + ) + try: + typ = attrs["type"] + except KeyError: + pass + else: + # this might raise a keyerror as well, don't want to catch that + if isinstance(typ, six.string_types): + if typ == "choice": + warnings.warn( + "`type` argument to addoption() is the string %r." + " For choices this is optional and can be omitted, " + " but when supplied should be a type (for example `str` or `int`)." + " (options: %s)" % (typ, names), + DeprecationWarning, + stacklevel=4, + ) + # argparse expects a type here take it from + # the type of the first element + attrs["type"] = type(attrs["choices"][0]) + else: + warnings.warn( + "`type` argument to addoption() is the string %r, " + " but when supplied should be a type (for example `str` or `int`)." + " (options: %s)" % (typ, names), + DeprecationWarning, + stacklevel=4, + ) + attrs["type"] = Argument._typ_map[typ] + # used in test_parseopt -> test_parse_defaultgetter + self.type = attrs["type"] + else: + self.type = typ + try: + # attribute existence is tested in Config._processopt + self.default = attrs["default"] + except KeyError: + pass + self._set_opt_strings(names) + if not self.dest: + if self._long_opts: + self.dest = self._long_opts[0][2:].replace("-", "_") + else: + try: + self.dest = self._short_opts[0][1:] + except IndexError: + raise ArgumentError("need a long or short option", self) + + def names(self): + return self._short_opts + self._long_opts + + def attrs(self): + # update any attributes set by processopt + attrs = "default dest help".split() + if self.dest: + attrs.append(self.dest) + for attr in attrs: + try: + self._attrs[attr] = getattr(self, attr) + except AttributeError: + pass + if self._attrs.get("help"): + a = self._attrs["help"] + a = a.replace("%default", "%(default)s") + # a = a.replace('%prog', '%(prog)s') + self._attrs["help"] = a + return self._attrs + + def _set_opt_strings(self, opts): + """directly from optparse + + might not be necessary as this is passed to argparse later on""" + for opt in opts: + if len(opt) < 2: + raise ArgumentError( + "invalid option string %r: " + "must be at least two characters long" % opt, + self, + ) + elif len(opt) == 2: + if not (opt[0] == "-" and opt[1] != "-"): + raise ArgumentError( + "invalid short option string %r: " + "must be of the form -x, (x any non-dash char)" % opt, + self, + ) + self._short_opts.append(opt) + else: + if not (opt[0:2] == "--" and opt[2] != "-"): + raise ArgumentError( + "invalid long option string %r: " + "must start with --, followed by non-dash" % opt, + self, + ) + self._long_opts.append(opt) + + def __repr__(self): + args = [] + if self._short_opts: + args += ["_short_opts: " + repr(self._short_opts)] + if self._long_opts: + args += ["_long_opts: " + repr(self._long_opts)] + args += ["dest: " + repr(self.dest)] + if hasattr(self, "type"): + args += ["type: " + repr(self.type)] + if hasattr(self, "default"): + args += ["default: " + repr(self.default)] + return "Argument({})".format(", ".join(args)) + + +class OptionGroup(object): + def __init__(self, name, description="", parser=None): + self.name = name + self.description = description + self.options = [] + self.parser = parser + + def addoption(self, *optnames, **attrs): + """ add an option to this group. + + if a shortened version of a long option is specified it will + be suppressed in the help. addoption('--twowords', '--two-words') + results in help showing '--two-words' only, but --twowords gets + accepted **and** the automatic destination is in args.twowords + """ + conflict = set(optnames).intersection( + name for opt in self.options for name in opt.names() + ) + if conflict: + raise ValueError("option names %s already added" % conflict) + option = Argument(*optnames, **attrs) + self._addoption_instance(option, shortupper=False) + + def _addoption(self, *optnames, **attrs): + option = Argument(*optnames, **attrs) + self._addoption_instance(option, shortupper=True) + + def _addoption_instance(self, option, shortupper=False): + if not shortupper: + for opt in option._short_opts: + if opt[0] == "-" and opt[1].islower(): + raise ValueError("lowercase shortoptions reserved") + if self.parser: + self.parser.processoption(option) + self.options.append(option) + + +class MyOptionParser(argparse.ArgumentParser): + def __init__(self, parser, extra_info=None): + if not extra_info: + extra_info = {} + self._parser = parser + argparse.ArgumentParser.__init__( + self, + usage=parser._usage, + add_help=False, + formatter_class=DropShorterLongHelpFormatter, + ) + # extra_info is a dict of (param -> value) to display if there's + # an usage error to provide more contextual information to the user + self.extra_info = extra_info + + def error(self, message): + """error(message: string) + + Prints a usage message incorporating the message to stderr and + exits. + Overrides the method in parent class to change exit code""" + self.print_usage(_sys.stderr) + args = {"prog": self.prog, "message": message} + self.exit(EXIT_USAGEERROR, _("%(prog)s: error: %(message)s\n") % args) + + def parse_args(self, args=None, namespace=None): + """allow splitting of positional arguments""" + args, argv = self.parse_known_args(args, namespace) + if argv: + for arg in argv: + if arg and arg[0] == "-": + lines = ["unrecognized arguments: %s" % (" ".join(argv))] + for k, v in sorted(self.extra_info.items()): + lines.append(" %s: %s" % (k, v)) + self.error("\n".join(lines)) + getattr(args, FILE_OR_DIR).extend(argv) + return args + + +class DropShorterLongHelpFormatter(argparse.HelpFormatter): + """shorten help for long options that differ only in extra hyphens + + - collapse **long** options that are the same except for extra hyphens + - special action attribute map_long_option allows surpressing additional + long options + - shortcut if there are only two options and one of them is a short one + - cache result on action object as this is called at least 2 times + """ + + def _format_action_invocation(self, action): + orgstr = argparse.HelpFormatter._format_action_invocation(self, action) + if orgstr and orgstr[0] != "-": # only optional arguments + return orgstr + res = getattr(action, "_formatted_action_invocation", None) + if res: + return res + options = orgstr.split(", ") + if len(options) == 2 and (len(options[0]) == 2 or len(options[1]) == 2): + # a shortcut for '-h, --help' or '--abc', '-a' + action._formatted_action_invocation = orgstr + return orgstr + return_list = [] + option_map = getattr(action, "map_long_option", {}) + if option_map is None: + option_map = {} + short_long = {} + for option in options: + if len(option) == 2 or option[2] == " ": + continue + if not option.startswith("--"): + raise ArgumentError( + 'long optional argument without "--": [%s]' % (option), self + ) + xxoption = option[2:] + if xxoption.split()[0] not in option_map: + shortened = xxoption.replace("-", "") + if shortened not in short_long or len(short_long[shortened]) < len( + xxoption + ): + short_long[shortened] = xxoption + # now short_long has been filled out to the longest with dashes + # **and** we keep the right option ordering from add_argument + for option in options: + if len(option) == 2 or option[2] == " ": + return_list.append(option) + if option[2:] == short_long.get(option.replace("-", "")): + return_list.append(option.replace(" ", "=", 1)) + action._formatted_action_invocation = ", ".join(return_list) + return action._formatted_action_invocation diff --git a/venv/Lib/site-packages/_pytest/config/exceptions.py b/venv/Lib/site-packages/_pytest/config/exceptions.py new file mode 100644 index 00000000..19fe5cb0 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/config/exceptions.py @@ -0,0 +1,9 @@ +class UsageError(Exception): + """ error in pytest usage or invocation""" + + +class PrintHelp(Exception): + """Raised when pytest should print it's help to skip the rest of the + argument parsing and validation.""" + + pass diff --git a/venv/Lib/site-packages/_pytest/config/findpaths.py b/venv/Lib/site-packages/_pytest/config/findpaths.py new file mode 100644 index 00000000..f9943019 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/config/findpaths.py @@ -0,0 +1,146 @@ +import py +import os +from .exceptions import UsageError + + +def exists(path, ignore=EnvironmentError): + try: + return path.check() + except ignore: + return False + + +def getcfg(args, config=None): + """ + Search the list of arguments for a valid ini-file for pytest, + and return a tuple of (rootdir, inifile, cfg-dict). + + note: config is optional and used only to issue warnings explicitly (#2891). + """ + from _pytest.deprecated import CFG_PYTEST_SECTION + + inibasenames = ["pytest.ini", "tox.ini", "setup.cfg"] + args = [x for x in args if not str(x).startswith("-")] + if not args: + args = [py.path.local()] + for arg in args: + arg = py.path.local(arg) + for base in arg.parts(reverse=True): + for inibasename in inibasenames: + p = base.join(inibasename) + if exists(p): + iniconfig = py.iniconfig.IniConfig(p) + if "pytest" in iniconfig.sections: + if inibasename == "setup.cfg" and config is not None: + from _pytest.warnings import _issue_config_warning + from _pytest.warning_types import RemovedInPytest4Warning + + _issue_config_warning( + RemovedInPytest4Warning( + CFG_PYTEST_SECTION.format(filename=inibasename) + ), + config=config, + ) + return base, p, iniconfig["pytest"] + if ( + inibasename == "setup.cfg" + and "tool:pytest" in iniconfig.sections + ): + return base, p, iniconfig["tool:pytest"] + elif inibasename == "pytest.ini": + # allowed to be empty + return base, p, {} + return None, None, None + + +def get_common_ancestor(paths): + common_ancestor = None + for path in paths: + if not path.exists(): + continue + if common_ancestor is None: + common_ancestor = path + else: + if path.relto(common_ancestor) or path == common_ancestor: + continue + elif common_ancestor.relto(path): + common_ancestor = path + else: + shared = path.common(common_ancestor) + if shared is not None: + common_ancestor = shared + if common_ancestor is None: + common_ancestor = py.path.local() + elif common_ancestor.isfile(): + common_ancestor = common_ancestor.dirpath() + return common_ancestor + + +def get_dirs_from_args(args): + def is_option(x): + return str(x).startswith("-") + + def get_file_part_from_node_id(x): + return str(x).split("::")[0] + + def get_dir_from_path(path): + if path.isdir(): + return path + return py.path.local(path.dirname) + + # These look like paths but may not exist + possible_paths = ( + py.path.local(get_file_part_from_node_id(arg)) + for arg in args + if not is_option(arg) + ) + + return [get_dir_from_path(path) for path in possible_paths if path.exists()] + + +def determine_setup(inifile, args, rootdir_cmd_arg=None, config=None): + dirs = get_dirs_from_args(args) + if inifile: + iniconfig = py.iniconfig.IniConfig(inifile) + is_cfg_file = str(inifile).endswith(".cfg") + sections = ["tool:pytest", "pytest"] if is_cfg_file else ["pytest"] + for section in sections: + try: + inicfg = iniconfig[section] + if is_cfg_file and section == "pytest" and config is not None: + from _pytest.deprecated import CFG_PYTEST_SECTION + from _pytest.warnings import _issue_config_warning + + # TODO: [pytest] section in *.cfg files is deprecated. Need refactoring once + # the deprecation expires. + _issue_config_warning( + CFG_PYTEST_SECTION.format(filename=str(inifile)), config + ) + break + except KeyError: + inicfg = None + rootdir = get_common_ancestor(dirs) + else: + ancestor = get_common_ancestor(dirs) + rootdir, inifile, inicfg = getcfg([ancestor], config=config) + if rootdir is None: + for rootdir in ancestor.parts(reverse=True): + if rootdir.join("setup.py").exists(): + break + else: + rootdir, inifile, inicfg = getcfg(dirs, config=config) + if rootdir is None: + rootdir = get_common_ancestor([py.path.local(), ancestor]) + is_fs_root = os.path.splitdrive(str(rootdir))[1] == "/" + if is_fs_root: + rootdir = ancestor + if rootdir_cmd_arg: + rootdir_abs_path = py.path.local(os.path.expandvars(rootdir_cmd_arg)) + if not os.path.isdir(str(rootdir_abs_path)): + raise UsageError( + "Directory '{}' not found. Check your '--rootdir' option.".format( + rootdir_abs_path + ) + ) + rootdir = rootdir_abs_path + return rootdir, inifile, inicfg or {} diff --git a/venv/Lib/site-packages/_pytest/debugging.py b/venv/Lib/site-packages/_pytest/debugging.py new file mode 100644 index 00000000..cc9bf5c2 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/debugging.py @@ -0,0 +1,199 @@ +""" interactive debugging with PDB, the Python Debugger. """ +from __future__ import absolute_import, division, print_function + +import os +import pdb +import sys +from doctest import UnexpectedException + +from _pytest import outcomes +from _pytest.config import hookimpl + +try: + from builtins import breakpoint # noqa + + SUPPORTS_BREAKPOINT_BUILTIN = True +except ImportError: + SUPPORTS_BREAKPOINT_BUILTIN = False + + +def pytest_addoption(parser): + group = parser.getgroup("general") + group._addoption( + "--pdb", + dest="usepdb", + action="store_true", + help="start the interactive Python debugger on errors or KeyboardInterrupt.", + ) + group._addoption( + "--pdbcls", + dest="usepdb_cls", + metavar="modulename:classname", + help="start a custom interactive Python debugger on errors. " + "For example: --pdbcls=IPython.terminal.debugger:TerminalPdb", + ) + group._addoption( + "--trace", + dest="trace", + action="store_true", + help="Immediately break when running each test.", + ) + + +def pytest_configure(config): + if config.getvalue("usepdb_cls"): + modname, classname = config.getvalue("usepdb_cls").split(":") + __import__(modname) + pdb_cls = getattr(sys.modules[modname], classname) + else: + pdb_cls = pdb.Pdb + + if config.getvalue("trace"): + config.pluginmanager.register(PdbTrace(), "pdbtrace") + if config.getvalue("usepdb"): + config.pluginmanager.register(PdbInvoke(), "pdbinvoke") + + # Use custom Pdb class set_trace instead of default Pdb on breakpoint() call + if SUPPORTS_BREAKPOINT_BUILTIN: + _environ_pythonbreakpoint = os.environ.get("PYTHONBREAKPOINT", "") + if _environ_pythonbreakpoint == "": + sys.breakpointhook = pytestPDB.set_trace + + old = (pdb.set_trace, pytestPDB._pluginmanager) + + def fin(): + pdb.set_trace, pytestPDB._pluginmanager = old + pytestPDB._config = None + pytestPDB._pdb_cls = pdb.Pdb + if SUPPORTS_BREAKPOINT_BUILTIN: + sys.breakpointhook = sys.__breakpointhook__ + + pdb.set_trace = pytestPDB.set_trace + pytestPDB._pluginmanager = config.pluginmanager + pytestPDB._config = config + pytestPDB._pdb_cls = pdb_cls + config._cleanup.append(fin) + + +class pytestPDB(object): + """ Pseudo PDB that defers to the real pdb. """ + + _pluginmanager = None + _config = None + _pdb_cls = pdb.Pdb + + @classmethod + def set_trace(cls, set_break=True): + """ invoke PDB set_trace debugging, dropping any IO capturing. """ + import _pytest.config + + frame = sys._getframe().f_back + if cls._pluginmanager is not None: + capman = cls._pluginmanager.getplugin("capturemanager") + if capman: + capman.suspend_global_capture(in_=True) + tw = _pytest.config.create_terminal_writer(cls._config) + tw.line() + tw.sep(">", "PDB set_trace (IO-capturing turned off)") + cls._pluginmanager.hook.pytest_enter_pdb(config=cls._config) + if set_break: + cls._pdb_cls().set_trace(frame) + + +class PdbInvoke(object): + def pytest_exception_interact(self, node, call, report): + capman = node.config.pluginmanager.getplugin("capturemanager") + if capman: + capman.suspend_global_capture(in_=True) + out, err = capman.read_global_capture() + sys.stdout.write(out) + sys.stdout.write(err) + _enter_pdb(node, call.excinfo, report) + + def pytest_internalerror(self, excrepr, excinfo): + tb = _postmortem_traceback(excinfo) + post_mortem(tb) + + +class PdbTrace(object): + @hookimpl(hookwrapper=True) + def pytest_pyfunc_call(self, pyfuncitem): + _test_pytest_function(pyfuncitem) + yield + + +def _test_pytest_function(pyfuncitem): + pytestPDB.set_trace(set_break=False) + testfunction = pyfuncitem.obj + pyfuncitem.obj = pdb.runcall + if pyfuncitem._isyieldedfunction(): + arg_list = list(pyfuncitem._args) + arg_list.insert(0, testfunction) + pyfuncitem._args = tuple(arg_list) + else: + if "func" in pyfuncitem._fixtureinfo.argnames: + raise ValueError("--trace can't be used with a fixture named func!") + pyfuncitem.funcargs["func"] = testfunction + new_list = list(pyfuncitem._fixtureinfo.argnames) + new_list.append("func") + pyfuncitem._fixtureinfo.argnames = tuple(new_list) + + +def _enter_pdb(node, excinfo, rep): + # XXX we re-use the TerminalReporter's terminalwriter + # because this seems to avoid some encoding related troubles + # for not completely clear reasons. + tw = node.config.pluginmanager.getplugin("terminalreporter")._tw + tw.line() + + showcapture = node.config.option.showcapture + + for sectionname, content in ( + ("stdout", rep.capstdout), + ("stderr", rep.capstderr), + ("log", rep.caplog), + ): + if showcapture in (sectionname, "all") and content: + tw.sep(">", "captured " + sectionname) + if content[-1:] == "\n": + content = content[:-1] + tw.line(content) + + tw.sep(">", "traceback") + rep.toterminal(tw) + tw.sep(">", "entering PDB") + tb = _postmortem_traceback(excinfo) + rep._pdbshown = True + if post_mortem(tb): + outcomes.exit("Quitting debugger") + return rep + + +def _postmortem_traceback(excinfo): + if isinstance(excinfo.value, UnexpectedException): + # A doctest.UnexpectedException is not useful for post_mortem. + # Use the underlying exception instead: + return excinfo.value.exc_info[2] + else: + return excinfo._excinfo[2] + + +def _find_last_non_hidden_frame(stack): + i = max(0, len(stack) - 1) + while i and stack[i][0].f_locals.get("__tracebackhide__", False): + i -= 1 + return i + + +def post_mortem(t): + class Pdb(pytestPDB._pdb_cls): + def get_stack(self, f, t): + stack, i = pdb.Pdb.get_stack(self, f, t) + if f is None: + i = _find_last_non_hidden_frame(stack) + return stack, i + + p = Pdb() + p.reset() + p.interaction(None, t) + return p.quitting diff --git a/venv/Lib/site-packages/_pytest/deprecated.py b/venv/Lib/site-packages/_pytest/deprecated.py new file mode 100644 index 00000000..54886c99 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/deprecated.py @@ -0,0 +1,116 @@ +""" +This module contains deprecation messages and bits of code used elsewhere in the codebase +that is planned to be removed in the next pytest release. + +Keeping it in a central location makes it easy to track what is deprecated and should +be removed when the time comes. + +All constants defined in this module should be either PytestWarning instances or UnformattedWarning +in case of warnings which need to format their messages. +""" +from __future__ import absolute_import, division, print_function + + +from _pytest.warning_types import UnformattedWarning, RemovedInPytest4Warning + + +MAIN_STR_ARGS = RemovedInPytest4Warning( + "passing a string to pytest.main() is deprecated, " + "pass a list of arguments instead." +) + +YIELD_TESTS = RemovedInPytest4Warning( + "yield tests are deprecated, and scheduled to be removed in pytest 4.0" +) + +CACHED_SETUP = RemovedInPytest4Warning( + "cached_setup is deprecated and will be removed in a future release. " + "Use standard fixture functions instead." +) + +COMPAT_PROPERTY = UnformattedWarning( + RemovedInPytest4Warning, + "usage of {owner}.{name} is deprecated, please use pytest.{name} instead", +) + +CUSTOM_CLASS = UnformattedWarning( + RemovedInPytest4Warning, + 'use of special named "{name}" objects in collectors of type "{type_name}" to ' + "customize the created nodes is deprecated. " + "Use pytest_pycollect_makeitem(...) to create custom " + "collection nodes instead.", +) + +FUNCARG_PREFIX = UnformattedWarning( + RemovedInPytest4Warning, + '{name}: declaring fixtures using "pytest_funcarg__" prefix is deprecated ' + "and scheduled to be removed in pytest 4.0. " + "Please remove the prefix and use the @pytest.fixture decorator instead.", +) + +FIXTURE_FUNCTION_CALL = UnformattedWarning( + RemovedInPytest4Warning, + 'Fixture "{name}" called directly. Fixtures are not meant to be called directly, ' + "are created automatically when test functions request them as parameters. " + "See https://docs.pytest.org/en/latest/fixture.html for more information.", +) + +CFG_PYTEST_SECTION = UnformattedWarning( + RemovedInPytest4Warning, + "[pytest] section in {filename} files is deprecated, use [tool:pytest] instead.", +) + +GETFUNCARGVALUE = RemovedInPytest4Warning( + "getfuncargvalue is deprecated, use getfixturevalue" +) + +RESULT_LOG = RemovedInPytest4Warning( + "--result-log is deprecated and scheduled for removal in pytest 4.0.\n" + "See https://docs.pytest.org/en/latest/usage.html#creating-resultlog-format-files for more information." +) + +MARK_INFO_ATTRIBUTE = RemovedInPytest4Warning( + "MarkInfo objects are deprecated as they contain merged marks which are hard to deal with correctly.\n" + "Please use node.get_closest_marker(name) or node.iter_markers(name).\n" + "Docs: https://docs.pytest.org/en/latest/mark.html#updating-code" +) + +MARK_PARAMETERSET_UNPACKING = RemovedInPytest4Warning( + "Applying marks directly to parameters is deprecated," + " please use pytest.param(..., marks=...) instead.\n" + "For more details, see: https://docs.pytest.org/en/latest/parametrize.html" +) + +NODE_WARN = RemovedInPytest4Warning( + "Node.warn(code, message) form has been deprecated, use Node.warn(warning_instance) instead." +) + +RECORD_XML_PROPERTY = RemovedInPytest4Warning( + 'Fixture renamed from "record_xml_property" to "record_property" as user ' + "properties are now available to all reporters.\n" + '"record_xml_property" is now deprecated.' +) + +COLLECTOR_MAKEITEM = RemovedInPytest4Warning( + "pycollector makeitem was removed as it is an accidentially leaked internal api" +) + +METAFUNC_ADD_CALL = RemovedInPytest4Warning( + "Metafunc.addcall is deprecated and scheduled to be removed in pytest 4.0.\n" + "Please use Metafunc.parametrize instead." +) + +PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST = RemovedInPytest4Warning( + "Defining pytest_plugins in a non-top-level conftest is deprecated, " + "because it affects the entire directory tree in a non-explicit way.\n" + "Please move it to the top level conftest file instead." +) + +PYTEST_NAMESPACE = RemovedInPytest4Warning( + "pytest_namespace is deprecated and will be removed soon" +) + +PYTEST_ENSURETEMP = RemovedInPytest4Warning( + "pytest/tmpdir_factory.ensuretemp is deprecated, \n" + "please use the tmp_path fixture or tmp_path_factory.mktemp" +) diff --git a/venv/Lib/site-packages/_pytest/doctest.py b/venv/Lib/site-packages/_pytest/doctest.py new file mode 100644 index 00000000..12b871f9 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/doctest.py @@ -0,0 +1,512 @@ +""" discover and run doctests in modules and test files.""" +from __future__ import absolute_import, division, print_function + +import traceback +import sys +import platform + +import pytest +from _pytest._code.code import ExceptionInfo, ReprFileLocation, TerminalRepr +from _pytest.fixtures import FixtureRequest + + +DOCTEST_REPORT_CHOICE_NONE = "none" +DOCTEST_REPORT_CHOICE_CDIFF = "cdiff" +DOCTEST_REPORT_CHOICE_NDIFF = "ndiff" +DOCTEST_REPORT_CHOICE_UDIFF = "udiff" +DOCTEST_REPORT_CHOICE_ONLY_FIRST_FAILURE = "only_first_failure" + +DOCTEST_REPORT_CHOICES = ( + DOCTEST_REPORT_CHOICE_NONE, + DOCTEST_REPORT_CHOICE_CDIFF, + DOCTEST_REPORT_CHOICE_NDIFF, + DOCTEST_REPORT_CHOICE_UDIFF, + DOCTEST_REPORT_CHOICE_ONLY_FIRST_FAILURE, +) + +# Lazy definition of runner class +RUNNER_CLASS = None + + +def pytest_addoption(parser): + parser.addini( + "doctest_optionflags", + "option flags for doctests", + type="args", + default=["ELLIPSIS"], + ) + parser.addini( + "doctest_encoding", "encoding used for doctest files", default="utf-8" + ) + group = parser.getgroup("collect") + group.addoption( + "--doctest-modules", + action="store_true", + default=False, + help="run doctests in all .py modules", + dest="doctestmodules", + ) + group.addoption( + "--doctest-report", + type=str.lower, + default="udiff", + help="choose another output format for diffs on doctest failure", + choices=DOCTEST_REPORT_CHOICES, + dest="doctestreport", + ) + group.addoption( + "--doctest-glob", + action="append", + default=[], + metavar="pat", + help="doctests file matching pattern, default: test*.txt", + dest="doctestglob", + ) + group.addoption( + "--doctest-ignore-import-errors", + action="store_true", + default=False, + help="ignore doctest ImportErrors", + dest="doctest_ignore_import_errors", + ) + group.addoption( + "--doctest-continue-on-failure", + action="store_true", + default=False, + help="for a given doctest, continue to run after the first failure", + dest="doctest_continue_on_failure", + ) + + +def pytest_collect_file(path, parent): + config = parent.config + if path.ext == ".py": + if config.option.doctestmodules and not _is_setup_py(config, path, parent): + return DoctestModule(path, parent) + elif _is_doctest(config, path, parent): + return DoctestTextfile(path, parent) + + +def _is_setup_py(config, path, parent): + if path.basename != "setup.py": + return False + contents = path.read() + return "setuptools" in contents or "distutils" in contents + + +def _is_doctest(config, path, parent): + if path.ext in (".txt", ".rst") and parent.session.isinitpath(path): + return True + globs = config.getoption("doctestglob") or ["test*.txt"] + for glob in globs: + if path.check(fnmatch=glob): + return True + return False + + +class ReprFailDoctest(TerminalRepr): + def __init__(self, reprlocation_lines): + # List of (reprlocation, lines) tuples + self.reprlocation_lines = reprlocation_lines + + def toterminal(self, tw): + for reprlocation, lines in self.reprlocation_lines: + for line in lines: + tw.line(line) + reprlocation.toterminal(tw) + + +class MultipleDoctestFailures(Exception): + def __init__(self, failures): + super(MultipleDoctestFailures, self).__init__() + self.failures = failures + + +def _init_runner_class(): + import doctest + + class PytestDoctestRunner(doctest.DebugRunner): + """ + Runner to collect failures. Note that the out variable in this case is + a list instead of a stdout-like object + """ + + def __init__( + self, checker=None, verbose=None, optionflags=0, continue_on_failure=True + ): + doctest.DebugRunner.__init__( + self, checker=checker, verbose=verbose, optionflags=optionflags + ) + self.continue_on_failure = continue_on_failure + + def report_failure(self, out, test, example, got): + failure = doctest.DocTestFailure(test, example, got) + if self.continue_on_failure: + out.append(failure) + else: + raise failure + + def report_unexpected_exception(self, out, test, example, exc_info): + failure = doctest.UnexpectedException(test, example, exc_info) + if self.continue_on_failure: + out.append(failure) + else: + raise failure + + return PytestDoctestRunner + + +def _get_runner(checker=None, verbose=None, optionflags=0, continue_on_failure=True): + # We need this in order to do a lazy import on doctest + global RUNNER_CLASS + if RUNNER_CLASS is None: + RUNNER_CLASS = _init_runner_class() + return RUNNER_CLASS( + checker=checker, + verbose=verbose, + optionflags=optionflags, + continue_on_failure=continue_on_failure, + ) + + +class DoctestItem(pytest.Item): + def __init__(self, name, parent, runner=None, dtest=None): + super(DoctestItem, self).__init__(name, parent) + self.runner = runner + self.dtest = dtest + self.obj = None + self.fixture_request = None + + def setup(self): + if self.dtest is not None: + self.fixture_request = _setup_fixtures(self) + globs = dict(getfixture=self.fixture_request.getfixturevalue) + for name, value in self.fixture_request.getfixturevalue( + "doctest_namespace" + ).items(): + globs[name] = value + self.dtest.globs.update(globs) + + def runtest(self): + _check_all_skipped(self.dtest) + self._disable_output_capturing_for_darwin() + failures = [] + self.runner.run(self.dtest, out=failures) + if failures: + raise MultipleDoctestFailures(failures) + + def _disable_output_capturing_for_darwin(self): + """ + Disable output capturing. Otherwise, stdout is lost to doctest (#985) + """ + if platform.system() != "Darwin": + return + capman = self.config.pluginmanager.getplugin("capturemanager") + if capman: + capman.suspend_global_capture(in_=True) + out, err = capman.read_global_capture() + sys.stdout.write(out) + sys.stderr.write(err) + + def repr_failure(self, excinfo): + import doctest + + failures = None + if excinfo.errisinstance((doctest.DocTestFailure, doctest.UnexpectedException)): + failures = [excinfo.value] + elif excinfo.errisinstance(MultipleDoctestFailures): + failures = excinfo.value.failures + + if failures is not None: + reprlocation_lines = [] + for failure in failures: + example = failure.example + test = failure.test + filename = test.filename + if test.lineno is None: + lineno = None + else: + lineno = test.lineno + example.lineno + 1 + message = type(failure).__name__ + reprlocation = ReprFileLocation(filename, lineno, message) + checker = _get_checker() + report_choice = _get_report_choice( + self.config.getoption("doctestreport") + ) + if lineno is not None: + lines = failure.test.docstring.splitlines(False) + # add line numbers to the left of the error message + lines = [ + "%03d %s" % (i + test.lineno + 1, x) + for (i, x) in enumerate(lines) + ] + # trim docstring error lines to 10 + lines = lines[max(example.lineno - 9, 0) : example.lineno + 1] + else: + lines = [ + "EXAMPLE LOCATION UNKNOWN, not showing all tests of that example" + ] + indent = ">>>" + for line in example.source.splitlines(): + lines.append("??? %s %s" % (indent, line)) + indent = "..." + if isinstance(failure, doctest.DocTestFailure): + lines += checker.output_difference( + example, failure.got, report_choice + ).split("\n") + else: + inner_excinfo = ExceptionInfo(failure.exc_info) + lines += ["UNEXPECTED EXCEPTION: %s" % repr(inner_excinfo.value)] + lines += traceback.format_exception(*failure.exc_info) + reprlocation_lines.append((reprlocation, lines)) + return ReprFailDoctest(reprlocation_lines) + else: + return super(DoctestItem, self).repr_failure(excinfo) + + def reportinfo(self): + return self.fspath, self.dtest.lineno, "[doctest] %s" % self.name + + +def _get_flag_lookup(): + import doctest + + return dict( + DONT_ACCEPT_TRUE_FOR_1=doctest.DONT_ACCEPT_TRUE_FOR_1, + DONT_ACCEPT_BLANKLINE=doctest.DONT_ACCEPT_BLANKLINE, + NORMALIZE_WHITESPACE=doctest.NORMALIZE_WHITESPACE, + ELLIPSIS=doctest.ELLIPSIS, + IGNORE_EXCEPTION_DETAIL=doctest.IGNORE_EXCEPTION_DETAIL, + COMPARISON_FLAGS=doctest.COMPARISON_FLAGS, + ALLOW_UNICODE=_get_allow_unicode_flag(), + ALLOW_BYTES=_get_allow_bytes_flag(), + ) + + +def get_optionflags(parent): + optionflags_str = parent.config.getini("doctest_optionflags") + flag_lookup_table = _get_flag_lookup() + flag_acc = 0 + for flag in optionflags_str: + flag_acc |= flag_lookup_table[flag] + return flag_acc + + +def _get_continue_on_failure(config): + continue_on_failure = config.getvalue("doctest_continue_on_failure") + if continue_on_failure: + # We need to turn off this if we use pdb since we should stop at + # the first failure + if config.getvalue("usepdb"): + continue_on_failure = False + return continue_on_failure + + +class DoctestTextfile(pytest.Module): + obj = None + + def collect(self): + import doctest + + # inspired by doctest.testfile; ideally we would use it directly, + # but it doesn't support passing a custom checker + encoding = self.config.getini("doctest_encoding") + text = self.fspath.read_text(encoding) + filename = str(self.fspath) + name = self.fspath.basename + globs = {"__name__": "__main__"} + + optionflags = get_optionflags(self) + + runner = _get_runner( + verbose=0, + optionflags=optionflags, + checker=_get_checker(), + continue_on_failure=_get_continue_on_failure(self.config), + ) + _fix_spoof_python2(runner, encoding) + + parser = doctest.DocTestParser() + test = parser.get_doctest(text, globs, name, filename, 0) + if test.examples: + yield DoctestItem(test.name, self, runner, test) + + +def _check_all_skipped(test): + """raises pytest.skip() if all examples in the given DocTest have the SKIP + option set. + """ + import doctest + + all_skipped = all(x.options.get(doctest.SKIP, False) for x in test.examples) + if all_skipped: + pytest.skip("all tests skipped by +SKIP option") + + +class DoctestModule(pytest.Module): + def collect(self): + import doctest + + if self.fspath.basename == "conftest.py": + module = self.config.pluginmanager._importconftest(self.fspath) + else: + try: + module = self.fspath.pyimport() + except ImportError: + if self.config.getvalue("doctest_ignore_import_errors"): + pytest.skip("unable to import module %r" % self.fspath) + else: + raise + # uses internal doctest module parsing mechanism + finder = doctest.DocTestFinder() + optionflags = get_optionflags(self) + runner = _get_runner( + verbose=0, + optionflags=optionflags, + checker=_get_checker(), + continue_on_failure=_get_continue_on_failure(self.config), + ) + + for test in finder.find(module, module.__name__): + if test.examples: # skip empty doctests + yield DoctestItem(test.name, self, runner, test) + + +def _setup_fixtures(doctest_item): + """ + Used by DoctestTextfile and DoctestItem to setup fixture information. + """ + + def func(): + pass + + doctest_item.funcargs = {} + fm = doctest_item.session._fixturemanager + doctest_item._fixtureinfo = fm.getfixtureinfo( + node=doctest_item, func=func, cls=None, funcargs=False + ) + fixture_request = FixtureRequest(doctest_item) + fixture_request._fillfixtures() + return fixture_request + + +def _get_checker(): + """ + Returns a doctest.OutputChecker subclass that takes in account the + ALLOW_UNICODE option to ignore u'' prefixes in strings and ALLOW_BYTES + to strip b'' prefixes. + Useful when the same doctest should run in Python 2 and Python 3. + + An inner class is used to avoid importing "doctest" at the module + level. + """ + if hasattr(_get_checker, "LiteralsOutputChecker"): + return _get_checker.LiteralsOutputChecker() + + import doctest + import re + + class LiteralsOutputChecker(doctest.OutputChecker): + """ + Copied from doctest_nose_plugin.py from the nltk project: + https://github.com/nltk/nltk + + Further extended to also support byte literals. + """ + + _unicode_literal_re = re.compile(r"(\W|^)[uU]([rR]?[\'\"])", re.UNICODE) + _bytes_literal_re = re.compile(r"(\W|^)[bB]([rR]?[\'\"])", re.UNICODE) + + def check_output(self, want, got, optionflags): + res = doctest.OutputChecker.check_output(self, want, got, optionflags) + if res: + return True + + allow_unicode = optionflags & _get_allow_unicode_flag() + allow_bytes = optionflags & _get_allow_bytes_flag() + if not allow_unicode and not allow_bytes: + return False + + else: # pragma: no cover + + def remove_prefixes(regex, txt): + return re.sub(regex, r"\1\2", txt) + + if allow_unicode: + want = remove_prefixes(self._unicode_literal_re, want) + got = remove_prefixes(self._unicode_literal_re, got) + if allow_bytes: + want = remove_prefixes(self._bytes_literal_re, want) + got = remove_prefixes(self._bytes_literal_re, got) + res = doctest.OutputChecker.check_output(self, want, got, optionflags) + return res + + _get_checker.LiteralsOutputChecker = LiteralsOutputChecker + return _get_checker.LiteralsOutputChecker() + + +def _get_allow_unicode_flag(): + """ + Registers and returns the ALLOW_UNICODE flag. + """ + import doctest + + return doctest.register_optionflag("ALLOW_UNICODE") + + +def _get_allow_bytes_flag(): + """ + Registers and returns the ALLOW_BYTES flag. + """ + import doctest + + return doctest.register_optionflag("ALLOW_BYTES") + + +def _get_report_choice(key): + """ + This function returns the actual `doctest` module flag value, we want to do it as late as possible to avoid + importing `doctest` and all its dependencies when parsing options, as it adds overhead and breaks tests. + """ + import doctest + + return { + DOCTEST_REPORT_CHOICE_UDIFF: doctest.REPORT_UDIFF, + DOCTEST_REPORT_CHOICE_CDIFF: doctest.REPORT_CDIFF, + DOCTEST_REPORT_CHOICE_NDIFF: doctest.REPORT_NDIFF, + DOCTEST_REPORT_CHOICE_ONLY_FIRST_FAILURE: doctest.REPORT_ONLY_FIRST_FAILURE, + DOCTEST_REPORT_CHOICE_NONE: 0, + }[key] + + +def _fix_spoof_python2(runner, encoding): + """ + Installs a "SpoofOut" into the given DebugRunner so it properly deals with unicode output. This + should patch only doctests for text files because they don't have a way to declare their + encoding. Doctests in docstrings from Python modules don't have the same problem given that + Python already decoded the strings. + + This fixes the problem related in issue #2434. + """ + from _pytest.compat import _PY2 + + if not _PY2: + return + + from doctest import _SpoofOut + + class UnicodeSpoof(_SpoofOut): + def getvalue(self): + result = _SpoofOut.getvalue(self) + if encoding and isinstance(result, bytes): + result = result.decode(encoding) + return result + + runner._fakeout = UnicodeSpoof() + + +@pytest.fixture(scope="session") +def doctest_namespace(): + """ + Fixture that returns a :py:class:`dict` that will be injected into the namespace of doctests. + """ + return dict() diff --git a/venv/Lib/site-packages/_pytest/fixtures.py b/venv/Lib/site-packages/_pytest/fixtures.py new file mode 100644 index 00000000..29eda351 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/fixtures.py @@ -0,0 +1,1379 @@ +from __future__ import absolute_import, division, print_function + +import functools +import inspect +import sys +import warnings +from collections import OrderedDict, deque, defaultdict + +import six +from more_itertools import flatten + +import attr +import py +from py._code.code import FormattedExcinfo + +import _pytest +from _pytest import nodes +from _pytest._code.code import TerminalRepr +from _pytest.compat import ( + NOTSET, + exc_clear, + _format_args, + getfslineno, + get_real_func, + is_generator, + isclass, + getimfunc, + getlocation, + getfuncargnames, + safe_getattr, + FuncargnamesCompatAttr, + get_real_method, + _PytestWrapper, +) +from _pytest.deprecated import FIXTURE_FUNCTION_CALL +from _pytest.outcomes import fail, TEST_OUTCOME + +FIXTURE_MSG = 'fixtures cannot have "pytest_funcarg__" prefix and be decorated with @pytest.fixture:\n{}' + + +@attr.s(frozen=True) +class PseudoFixtureDef(object): + cached_result = attr.ib() + scope = attr.ib() + + +def pytest_sessionstart(session): + import _pytest.python + import _pytest.nodes + + scopename2class.update( + { + "package": _pytest.python.Package, + "class": _pytest.python.Class, + "module": _pytest.python.Module, + "function": _pytest.nodes.Item, + "session": _pytest.main.Session, + } + ) + session._fixturemanager = FixtureManager(session) + + +scopename2class = {} + + +scope2props = dict(session=()) +scope2props["package"] = ("fspath",) +scope2props["module"] = ("fspath", "module") +scope2props["class"] = scope2props["module"] + ("cls",) +scope2props["instance"] = scope2props["class"] + ("instance",) +scope2props["function"] = scope2props["instance"] + ("function", "keywords") + + +def scopeproperty(name=None, doc=None): + def decoratescope(func): + scopename = name or func.__name__ + + def provide(self): + if func.__name__ in scope2props[self.scope]: + return func(self) + raise AttributeError( + "%s not available in %s-scoped context" % (scopename, self.scope) + ) + + return property(provide, None, None, func.__doc__) + + return decoratescope + + +def get_scope_package(node, fixturedef): + import pytest + + cls = pytest.Package + current = node + fixture_package_name = "%s/%s" % (fixturedef.baseid, "__init__.py") + while current and ( + type(current) is not cls or fixture_package_name != current.nodeid + ): + current = current.parent + if current is None: + return node.session + return current + + +def get_scope_node(node, scope): + cls = scopename2class.get(scope) + if cls is None: + raise ValueError("unknown scope") + return node.getparent(cls) + + +def add_funcarg_pseudo_fixture_def(collector, metafunc, fixturemanager): + # this function will transform all collected calls to a functions + # if they use direct funcargs (i.e. direct parametrization) + # because we want later test execution to be able to rely on + # an existing FixtureDef structure for all arguments. + # XXX we can probably avoid this algorithm if we modify CallSpec2 + # to directly care for creating the fixturedefs within its methods. + if not metafunc._calls[0].funcargs: + return # this function call does not have direct parametrization + # collect funcargs of all callspecs into a list of values + arg2params = {} + arg2scope = {} + for callspec in metafunc._calls: + for argname, argvalue in callspec.funcargs.items(): + assert argname not in callspec.params + callspec.params[argname] = argvalue + arg2params_list = arg2params.setdefault(argname, []) + callspec.indices[argname] = len(arg2params_list) + arg2params_list.append(argvalue) + if argname not in arg2scope: + scopenum = callspec._arg2scopenum.get(argname, scopenum_function) + arg2scope[argname] = scopes[scopenum] + callspec.funcargs.clear() + + # register artificial FixtureDef's so that later at test execution + # time we can rely on a proper FixtureDef to exist for fixture setup. + arg2fixturedefs = metafunc._arg2fixturedefs + for argname, valuelist in arg2params.items(): + # if we have a scope that is higher than function we need + # to make sure we only ever create an according fixturedef on + # a per-scope basis. We thus store and cache the fixturedef on the + # node related to the scope. + scope = arg2scope[argname] + node = None + if scope != "function": + node = get_scope_node(collector, scope) + if node is None: + assert scope == "class" and isinstance(collector, _pytest.python.Module) + # use module-level collector for class-scope (for now) + node = collector + if node and argname in node._name2pseudofixturedef: + arg2fixturedefs[argname] = [node._name2pseudofixturedef[argname]] + else: + fixturedef = FixtureDef( + fixturemanager, + "", + argname, + get_direct_param_fixture_func, + arg2scope[argname], + valuelist, + False, + False, + ) + arg2fixturedefs[argname] = [fixturedef] + if node is not None: + node._name2pseudofixturedef[argname] = fixturedef + + +def getfixturemarker(obj): + """ return fixturemarker or None if it doesn't exist or raised + exceptions.""" + try: + return getattr(obj, "_pytestfixturefunction", None) + except TEST_OUTCOME: + # some objects raise errors like request (from flask import request) + # we don't expect them to be fixture functions + return None + + +def get_parametrized_fixture_keys(item, scopenum): + """ return list of keys for all parametrized arguments which match + the specified scope. """ + assert scopenum < scopenum_function # function + try: + cs = item.callspec + except AttributeError: + pass + else: + # cs.indices.items() is random order of argnames. Need to + # sort this so that different calls to + # get_parametrized_fixture_keys will be deterministic. + for argname, param_index in sorted(cs.indices.items()): + if cs._arg2scopenum[argname] != scopenum: + continue + if scopenum == 0: # session + key = (argname, param_index) + elif scopenum == 1: # package + key = (argname, param_index, item.fspath.dirpath()) + elif scopenum == 2: # module + key = (argname, param_index, item.fspath) + elif scopenum == 3: # class + key = (argname, param_index, item.fspath, item.cls) + yield key + + +# algorithm for sorting on a per-parametrized resource setup basis +# it is called for scopenum==0 (session) first and performs sorting +# down to the lower scopes such as to minimize number of "high scope" +# setups and teardowns + + +def reorder_items(items): + argkeys_cache = {} + items_by_argkey = {} + for scopenum in range(0, scopenum_function): + argkeys_cache[scopenum] = d = {} + items_by_argkey[scopenum] = item_d = defaultdict(deque) + for item in items: + keys = OrderedDict.fromkeys(get_parametrized_fixture_keys(item, scopenum)) + if keys: + d[item] = keys + for key in keys: + item_d[key].append(item) + items = OrderedDict.fromkeys(items) + return list(reorder_items_atscope(items, argkeys_cache, items_by_argkey, 0)) + + +def fix_cache_order(item, argkeys_cache, items_by_argkey): + for scopenum in range(0, scopenum_function): + for key in argkeys_cache[scopenum].get(item, []): + items_by_argkey[scopenum][key].appendleft(item) + + +def reorder_items_atscope(items, argkeys_cache, items_by_argkey, scopenum): + if scopenum >= scopenum_function or len(items) < 3: + return items + ignore = set() + items_deque = deque(items) + items_done = OrderedDict() + scoped_items_by_argkey = items_by_argkey[scopenum] + scoped_argkeys_cache = argkeys_cache[scopenum] + while items_deque: + no_argkey_group = OrderedDict() + slicing_argkey = None + while items_deque: + item = items_deque.popleft() + if item in items_done or item in no_argkey_group: + continue + argkeys = OrderedDict.fromkeys( + k for k in scoped_argkeys_cache.get(item, []) if k not in ignore + ) + if not argkeys: + no_argkey_group[item] = None + else: + slicing_argkey, _ = argkeys.popitem() + # we don't have to remove relevant items from later in the deque because they'll just be ignored + matching_items = [ + i for i in scoped_items_by_argkey[slicing_argkey] if i in items + ] + for i in reversed(matching_items): + fix_cache_order(i, argkeys_cache, items_by_argkey) + items_deque.appendleft(i) + break + if no_argkey_group: + no_argkey_group = reorder_items_atscope( + no_argkey_group, argkeys_cache, items_by_argkey, scopenum + 1 + ) + for item in no_argkey_group: + items_done[item] = None + ignore.add(slicing_argkey) + return items_done + + +def fillfixtures(function): + """ fill missing funcargs for a test function. """ + try: + request = function._request + except AttributeError: + # XXX this special code path is only expected to execute + # with the oejskit plugin. It uses classes with funcargs + # and we thus have to work a bit to allow this. + fm = function.session._fixturemanager + fi = fm.getfixtureinfo(function.parent, function.obj, None) + function._fixtureinfo = fi + request = function._request = FixtureRequest(function) + request._fillfixtures() + # prune out funcargs for jstests + newfuncargs = {} + for name in fi.argnames: + newfuncargs[name] = function.funcargs[name] + function.funcargs = newfuncargs + else: + request._fillfixtures() + + +def get_direct_param_fixture_func(request): + return request.param + + +@attr.s(slots=True) +class FuncFixtureInfo(object): + # original function argument names + argnames = attr.ib(type=tuple) + # argnames that function immediately requires. These include argnames + + # fixture names specified via usefixtures and via autouse=True in fixture + # definitions. + initialnames = attr.ib(type=tuple) + names_closure = attr.ib() # type: List[str] + name2fixturedefs = attr.ib() # type: List[str, List[FixtureDef]] + + def prune_dependency_tree(self): + """Recompute names_closure from initialnames and name2fixturedefs + + Can only reduce names_closure, which means that the new closure will + always be a subset of the old one. The order is preserved. + + This method is needed because direct parametrization may shadow some + of the fixtures that were included in the originally built dependency + tree. In this way the dependency tree can get pruned, and the closure + of argnames may get reduced. + """ + closure = set() + working_set = set(self.initialnames) + while working_set: + argname = working_set.pop() + # argname may be smth not included in the original names_closure, + # in which case we ignore it. This currently happens with pseudo + # FixtureDefs which wrap 'get_direct_param_fixture_func(request)'. + # So they introduce the new dependency 'request' which might have + # been missing in the original tree (closure). + if argname not in closure and argname in self.names_closure: + closure.add(argname) + if argname in self.name2fixturedefs: + working_set.update(self.name2fixturedefs[argname][-1].argnames) + + self.names_closure[:] = sorted(closure, key=self.names_closure.index) + + +class FixtureRequest(FuncargnamesCompatAttr): + """ A request for a fixture from a test or fixture function. + + A request object gives access to the requesting test context + and has an optional ``param`` attribute in case + the fixture is parametrized indirectly. + """ + + def __init__(self, pyfuncitem): + self._pyfuncitem = pyfuncitem + #: fixture for which this request is being performed + self.fixturename = None + #: Scope string, one of "function", "class", "module", "session" + self.scope = "function" + self._fixture_defs = {} # argname -> FixtureDef + fixtureinfo = pyfuncitem._fixtureinfo + self._arg2fixturedefs = fixtureinfo.name2fixturedefs.copy() + self._arg2index = {} + self._fixturemanager = pyfuncitem.session._fixturemanager + + @property + def fixturenames(self): + """names of all active fixtures in this request""" + result = list(self._pyfuncitem._fixtureinfo.names_closure) + result.extend(set(self._fixture_defs).difference(result)) + return result + + @property + def node(self): + """ underlying collection node (depends on current request scope)""" + return self._getscopeitem(self.scope) + + def _getnextfixturedef(self, argname): + fixturedefs = self._arg2fixturedefs.get(argname, None) + if fixturedefs is None: + # we arrive here because of a dynamic call to + # getfixturevalue(argname) usage which was naturally + # not known at parsing/collection time + parentid = self._pyfuncitem.parent.nodeid + fixturedefs = self._fixturemanager.getfixturedefs(argname, parentid) + self._arg2fixturedefs[argname] = fixturedefs + # fixturedefs list is immutable so we maintain a decreasing index + index = self._arg2index.get(argname, 0) - 1 + if fixturedefs is None or (-index > len(fixturedefs)): + raise FixtureLookupError(argname, self) + self._arg2index[argname] = index + return fixturedefs[index] + + @property + def config(self): + """ the pytest config object associated with this request. """ + return self._pyfuncitem.config + + @scopeproperty() + def function(self): + """ test function object if the request has a per-function scope. """ + return self._pyfuncitem.obj + + @scopeproperty("class") + def cls(self): + """ class (can be None) where the test function was collected. """ + clscol = self._pyfuncitem.getparent(_pytest.python.Class) + if clscol: + return clscol.obj + + @property + def instance(self): + """ instance (can be None) on which test function was collected. """ + # unittest support hack, see _pytest.unittest.TestCaseFunction + try: + return self._pyfuncitem._testcase + except AttributeError: + function = getattr(self, "function", None) + return getattr(function, "__self__", None) + + @scopeproperty() + def module(self): + """ python module object where the test function was collected. """ + return self._pyfuncitem.getparent(_pytest.python.Module).obj + + @scopeproperty() + def fspath(self): + """ the file system path of the test module which collected this test. """ + return self._pyfuncitem.fspath + + @property + def keywords(self): + """ keywords/markers dictionary for the underlying node. """ + return self.node.keywords + + @property + def session(self): + """ pytest session object. """ + return self._pyfuncitem.session + + def addfinalizer(self, finalizer): + """ add finalizer/teardown function to be called after the + last test within the requesting test context finished + execution. """ + # XXX usually this method is shadowed by fixturedef specific ones + self._addfinalizer(finalizer, scope=self.scope) + + def _addfinalizer(self, finalizer, scope): + colitem = self._getscopeitem(scope) + self._pyfuncitem.session._setupstate.addfinalizer( + finalizer=finalizer, colitem=colitem + ) + + def applymarker(self, marker): + """ Apply a marker to a single test function invocation. + This method is useful if you don't want to have a keyword/marker + on all function invocations. + + :arg marker: a :py:class:`_pytest.mark.MarkDecorator` object + created by a call to ``pytest.mark.NAME(...)``. + """ + self.node.add_marker(marker) + + def raiseerror(self, msg): + """ raise a FixtureLookupError with the given message. """ + raise self._fixturemanager.FixtureLookupError(None, self, msg) + + def _fillfixtures(self): + item = self._pyfuncitem + fixturenames = getattr(item, "fixturenames", self.fixturenames) + for argname in fixturenames: + if argname not in item.funcargs: + item.funcargs[argname] = self.getfixturevalue(argname) + + def cached_setup(self, setup, teardown=None, scope="module", extrakey=None): + """ (deprecated) Return a testing resource managed by ``setup`` & + ``teardown`` calls. ``scope`` and ``extrakey`` determine when the + ``teardown`` function will be called so that subsequent calls to + ``setup`` would recreate the resource. With pytest-2.3 you often + do not need ``cached_setup()`` as you can directly declare a scope + on a fixture function and register a finalizer through + ``request.addfinalizer()``. + + :arg teardown: function receiving a previously setup resource. + :arg setup: a no-argument function creating a resource. + :arg scope: a string value out of ``function``, ``class``, ``module`` + or ``session`` indicating the caching lifecycle of the resource. + :arg extrakey: added to internal caching key of (funcargname, scope). + """ + from _pytest.deprecated import CACHED_SETUP + + warnings.warn(CACHED_SETUP, stacklevel=2) + if not hasattr(self.config, "_setupcache"): + self.config._setupcache = {} # XXX weakref? + cachekey = (self.fixturename, self._getscopeitem(scope), extrakey) + cache = self.config._setupcache + try: + val = cache[cachekey] + except KeyError: + self._check_scope(self.fixturename, self.scope, scope) + val = setup() + cache[cachekey] = val + if teardown is not None: + + def finalizer(): + del cache[cachekey] + teardown(val) + + self._addfinalizer(finalizer, scope=scope) + return val + + def getfixturevalue(self, argname): + """ Dynamically run a named fixture function. + + Declaring fixtures via function argument is recommended where possible. + But if you can only decide whether to use another fixture at test + setup time, you may use this function to retrieve it inside a fixture + or test function body. + """ + return self._get_active_fixturedef(argname).cached_result[0] + + def getfuncargvalue(self, argname): + """ Deprecated, use getfixturevalue. """ + from _pytest import deprecated + + warnings.warn(deprecated.GETFUNCARGVALUE, stacklevel=2) + return self.getfixturevalue(argname) + + def _get_active_fixturedef(self, argname): + try: + return self._fixture_defs[argname] + except KeyError: + try: + fixturedef = self._getnextfixturedef(argname) + except FixtureLookupError: + if argname == "request": + cached_result = (self, [0], None) + scope = "function" + return PseudoFixtureDef(cached_result, scope) + raise + # remove indent to prevent the python3 exception + # from leaking into the call + self._compute_fixture_value(fixturedef) + self._fixture_defs[argname] = fixturedef + return fixturedef + + def _get_fixturestack(self): + current = self + values = [] + while 1: + fixturedef = getattr(current, "_fixturedef", None) + if fixturedef is None: + values.reverse() + return values + values.append(fixturedef) + current = current._parent_request + + def _compute_fixture_value(self, fixturedef): + """ + Creates a SubRequest based on "self" and calls the execute method of the given fixturedef object. This will + force the FixtureDef object to throw away any previous results and compute a new fixture value, which + will be stored into the FixtureDef object itself. + + :param FixtureDef fixturedef: + """ + # prepare a subrequest object before calling fixture function + # (latter managed by fixturedef) + argname = fixturedef.argname + funcitem = self._pyfuncitem + scope = fixturedef.scope + try: + param = funcitem.callspec.getparam(argname) + except (AttributeError, ValueError): + param = NOTSET + param_index = 0 + has_params = fixturedef.params is not None + fixtures_not_supported = getattr(funcitem, "nofuncargs", False) + if has_params and fixtures_not_supported: + msg = ( + "{name} does not support fixtures, maybe unittest.TestCase subclass?\n" + "Node id: {nodeid}\n" + "Function type: {typename}" + ).format( + name=funcitem.name, + nodeid=funcitem.nodeid, + typename=type(funcitem).__name__, + ) + fail(msg, pytrace=False) + if has_params: + frame = inspect.stack()[3] + frameinfo = inspect.getframeinfo(frame[0]) + source_path = frameinfo.filename + source_lineno = frameinfo.lineno + source_path = py.path.local(source_path) + if source_path.relto(funcitem.config.rootdir): + source_path = source_path.relto(funcitem.config.rootdir) + msg = ( + "The requested fixture has no parameter defined for test:\n" + " {}\n\n" + "Requested fixture '{}' defined in:\n{}" + "\n\nRequested here:\n{}:{}".format( + funcitem.nodeid, + fixturedef.argname, + getlocation(fixturedef.func, funcitem.config.rootdir), + source_path, + source_lineno, + ) + ) + fail(msg, pytrace=False) + else: + # indices might not be set if old-style metafunc.addcall() was used + param_index = funcitem.callspec.indices.get(argname, 0) + # if a parametrize invocation set a scope it will override + # the static scope defined with the fixture function + paramscopenum = funcitem.callspec._arg2scopenum.get(argname) + if paramscopenum is not None: + scope = scopes[paramscopenum] + + subrequest = SubRequest(self, scope, param, param_index, fixturedef) + + # check if a higher-level scoped fixture accesses a lower level one + subrequest._check_scope(argname, self.scope, scope) + + # clear sys.exc_info before invoking the fixture (python bug?) + # if its not explicitly cleared it will leak into the call + exc_clear() + try: + # call the fixture function + fixturedef.execute(request=subrequest) + finally: + # if fixture function failed it might have registered finalizers + self.session._setupstate.addfinalizer( + functools.partial(fixturedef.finish, request=subrequest), + subrequest.node, + ) + + def _check_scope(self, argname, invoking_scope, requested_scope): + if argname == "request": + return + if scopemismatch(invoking_scope, requested_scope): + # try to report something helpful + lines = self._factorytraceback() + fail( + "ScopeMismatch: You tried to access the %r scoped " + "fixture %r with a %r scoped request object, " + "involved factories\n%s" + % ((requested_scope, argname, invoking_scope, "\n".join(lines))), + pytrace=False, + ) + + def _factorytraceback(self): + lines = [] + for fixturedef in self._get_fixturestack(): + factory = fixturedef.func + fs, lineno = getfslineno(factory) + p = self._pyfuncitem.session.fspath.bestrelpath(fs) + args = _format_args(factory) + lines.append("%s:%d: def %s%s" % (p, lineno, factory.__name__, args)) + return lines + + def _getscopeitem(self, scope): + if scope == "function": + # this might also be a non-function Item despite its attribute name + return self._pyfuncitem + if scope == "package": + node = get_scope_package(self._pyfuncitem, self._fixturedef) + else: + node = get_scope_node(self._pyfuncitem, scope) + if node is None and scope == "class": + # fallback to function item itself + node = self._pyfuncitem + assert node, 'Could not obtain a node for scope "{}" for function {!r}'.format( + scope, self._pyfuncitem + ) + return node + + def __repr__(self): + return "" % (self.node) + + +class SubRequest(FixtureRequest): + """ a sub request for handling getting a fixture from a + test function/fixture. """ + + def __init__(self, request, scope, param, param_index, fixturedef): + self._parent_request = request + self.fixturename = fixturedef.argname + if param is not NOTSET: + self.param = param + self.param_index = param_index + self.scope = scope + self._fixturedef = fixturedef + self._pyfuncitem = request._pyfuncitem + self._fixture_defs = request._fixture_defs + self._arg2fixturedefs = request._arg2fixturedefs + self._arg2index = request._arg2index + self._fixturemanager = request._fixturemanager + + def __repr__(self): + return "" % (self.fixturename, self._pyfuncitem) + + def addfinalizer(self, finalizer): + self._fixturedef.addfinalizer(finalizer) + + +class ScopeMismatchError(Exception): + """ A fixture function tries to use a different fixture function which + which has a lower scope (e.g. a Session one calls a function one) + """ + + +scopes = "session package module class function".split() +scopenum_function = scopes.index("function") + + +def scopemismatch(currentscope, newscope): + return scopes.index(newscope) > scopes.index(currentscope) + + +def scope2index(scope, descr, where=None): + """Look up the index of ``scope`` and raise a descriptive value error + if not defined. + """ + try: + return scopes.index(scope) + except ValueError: + fail( + "{} {}got an unexpected scope value '{}'".format( + descr, "from {} ".format(where) if where else "", scope + ), + pytrace=False, + ) + + +class FixtureLookupError(LookupError): + """ could not return a requested Fixture (missing or invalid). """ + + def __init__(self, argname, request, msg=None): + self.argname = argname + self.request = request + self.fixturestack = request._get_fixturestack() + self.msg = msg + + def formatrepr(self): + tblines = [] + addline = tblines.append + stack = [self.request._pyfuncitem.obj] + stack.extend(map(lambda x: x.func, self.fixturestack)) + msg = self.msg + if msg is not None: + # the last fixture raise an error, let's present + # it at the requesting side + stack = stack[:-1] + for function in stack: + fspath, lineno = getfslineno(function) + try: + lines, _ = inspect.getsourcelines(get_real_func(function)) + except (IOError, IndexError, TypeError): + error_msg = "file %s, line %s: source code not available" + addline(error_msg % (fspath, lineno + 1)) + else: + addline("file %s, line %s" % (fspath, lineno + 1)) + for i, line in enumerate(lines): + line = line.rstrip() + addline(" " + line) + if line.lstrip().startswith("def"): + break + + if msg is None: + fm = self.request._fixturemanager + available = [] + parentid = self.request._pyfuncitem.parent.nodeid + for name, fixturedefs in fm._arg2fixturedefs.items(): + faclist = list(fm._matchfactories(fixturedefs, parentid)) + if faclist and name not in available: + available.append(name) + msg = "fixture %r not found" % (self.argname,) + msg += "\n available fixtures: %s" % (", ".join(sorted(available)),) + msg += "\n use 'pytest --fixtures [testpath]' for help on them." + + return FixtureLookupErrorRepr(fspath, lineno, tblines, msg, self.argname) + + +class FixtureLookupErrorRepr(TerminalRepr): + def __init__(self, filename, firstlineno, tblines, errorstring, argname): + self.tblines = tblines + self.errorstring = errorstring + self.filename = filename + self.firstlineno = firstlineno + self.argname = argname + + def toterminal(self, tw): + # tw.line("FixtureLookupError: %s" %(self.argname), red=True) + for tbline in self.tblines: + tw.line(tbline.rstrip()) + lines = self.errorstring.split("\n") + if lines: + tw.line( + "{} {}".format(FormattedExcinfo.fail_marker, lines[0].strip()), + red=True, + ) + for line in lines[1:]: + tw.line( + "{} {}".format(FormattedExcinfo.flow_marker, line.strip()), + red=True, + ) + tw.line() + tw.line("%s:%d" % (self.filename, self.firstlineno + 1)) + + +def fail_fixturefunc(fixturefunc, msg): + fs, lineno = getfslineno(fixturefunc) + location = "%s:%s" % (fs, lineno + 1) + source = _pytest._code.Source(fixturefunc) + fail(msg + ":\n\n" + str(source.indent()) + "\n" + location, pytrace=False) + + +def call_fixture_func(fixturefunc, request, kwargs): + yieldctx = is_generator(fixturefunc) + if yieldctx: + it = fixturefunc(**kwargs) + res = next(it) + finalizer = functools.partial(_teardown_yield_fixture, fixturefunc, it) + request.addfinalizer(finalizer) + else: + res = fixturefunc(**kwargs) + return res + + +def _teardown_yield_fixture(fixturefunc, it): + """Executes the teardown of a fixture function by advancing the iterator after the + yield and ensure the iteration ends (if not it means there is more than one yield in the function)""" + try: + next(it) + except StopIteration: + pass + else: + fail_fixturefunc( + fixturefunc, "yield_fixture function has more than one 'yield'" + ) + + +class FixtureDef(object): + """ A container for a factory definition. """ + + def __init__( + self, + fixturemanager, + baseid, + argname, + func, + scope, + params, + unittest=False, + ids=None, + ): + self._fixturemanager = fixturemanager + self.baseid = baseid or "" + self.has_location = baseid is not None + self.func = func + self.argname = argname + self.scope = scope + self.scopenum = scope2index( + scope or "function", + descr="Fixture '{}'".format(func.__name__), + where=baseid, + ) + self.params = params + self.argnames = getfuncargnames(func, is_method=unittest) + self.unittest = unittest + self.ids = ids + self._finalizers = [] + + def addfinalizer(self, finalizer): + self._finalizers.append(finalizer) + + def finish(self, request): + exceptions = [] + try: + while self._finalizers: + try: + func = self._finalizers.pop() + func() + except: # noqa + exceptions.append(sys.exc_info()) + if exceptions: + e = exceptions[0] + del exceptions # ensure we don't keep all frames alive because of the traceback + six.reraise(*e) + + finally: + hook = self._fixturemanager.session.gethookproxy(request.node.fspath) + hook.pytest_fixture_post_finalizer(fixturedef=self, request=request) + # even if finalization fails, we invalidate + # the cached fixture value and remove + # all finalizers because they may be bound methods which will + # keep instances alive + if hasattr(self, "cached_result"): + del self.cached_result + self._finalizers = [] + + def execute(self, request): + # get required arguments and register our own finish() + # with their finalization + for argname in self.argnames: + fixturedef = request._get_active_fixturedef(argname) + if argname != "request": + fixturedef.addfinalizer(functools.partial(self.finish, request=request)) + + my_cache_key = request.param_index + cached_result = getattr(self, "cached_result", None) + if cached_result is not None: + result, cache_key, err = cached_result + if my_cache_key == cache_key: + if err is not None: + six.reraise(*err) + else: + return result + # we have a previous but differently parametrized fixture instance + # so we need to tear it down before creating a new one + self.finish(request) + assert not hasattr(self, "cached_result") + + hook = self._fixturemanager.session.gethookproxy(request.node.fspath) + return hook.pytest_fixture_setup(fixturedef=self, request=request) + + def __repr__(self): + return "" % ( + self.argname, + self.scope, + self.baseid, + ) + + +def resolve_fixture_function(fixturedef, request): + """Gets the actual callable that can be called to obtain the fixture value, dealing with unittest-specific + instances and bound methods. + """ + fixturefunc = fixturedef.func + if fixturedef.unittest: + if request.instance is not None: + # bind the unbound method to the TestCase instance + fixturefunc = fixturedef.func.__get__(request.instance) + else: + # the fixture function needs to be bound to the actual + # request.instance so that code working with "fixturedef" behaves + # as expected. + if request.instance is not None: + fixturefunc = getimfunc(fixturedef.func) + if fixturefunc != fixturedef.func: + fixturefunc = fixturefunc.__get__(request.instance) + return fixturefunc + + +def pytest_fixture_setup(fixturedef, request): + """ Execution of fixture setup. """ + kwargs = {} + for argname in fixturedef.argnames: + fixdef = request._get_active_fixturedef(argname) + result, arg_cache_key, exc = fixdef.cached_result + request._check_scope(argname, request.scope, fixdef.scope) + kwargs[argname] = result + + fixturefunc = resolve_fixture_function(fixturedef, request) + my_cache_key = request.param_index + try: + result = call_fixture_func(fixturefunc, request, kwargs) + except TEST_OUTCOME: + fixturedef.cached_result = (None, my_cache_key, sys.exc_info()) + raise + fixturedef.cached_result = (result, my_cache_key, None) + return result + + +def _ensure_immutable_ids(ids): + if ids is None: + return + if callable(ids): + return ids + return tuple(ids) + + +def wrap_function_to_warning_if_called_directly(function, fixture_marker): + """Wrap the given fixture function so we can issue warnings about it being called directly, instead of + used as an argument in a test function. + """ + is_yield_function = is_generator(function) + warning = FIXTURE_FUNCTION_CALL.format( + name=fixture_marker.name or function.__name__ + ) + + if is_yield_function: + + @functools.wraps(function) + def result(*args, **kwargs): + __tracebackhide__ = True + warnings.warn(warning, stacklevel=3) + for x in function(*args, **kwargs): + yield x + + else: + + @functools.wraps(function) + def result(*args, **kwargs): + __tracebackhide__ = True + warnings.warn(warning, stacklevel=3) + return function(*args, **kwargs) + + if six.PY2: + result.__wrapped__ = function + + # keep reference to the original function in our own custom attribute so we don't unwrap + # further than this point and lose useful wrappings like @mock.patch (#3774) + result.__pytest_wrapped__ = _PytestWrapper(function) + + return result + + +@attr.s(frozen=True) +class FixtureFunctionMarker(object): + scope = attr.ib() + params = attr.ib(converter=attr.converters.optional(tuple)) + autouse = attr.ib(default=False) + ids = attr.ib(default=None, converter=_ensure_immutable_ids) + name = attr.ib(default=None) + + def __call__(self, function): + if isclass(function): + raise ValueError("class fixtures not supported (maybe in the future)") + + if getattr(function, "_pytestfixturefunction", False): + raise ValueError( + "fixture is being applied more than once to the same function" + ) + + function = wrap_function_to_warning_if_called_directly(function, self) + + function._pytestfixturefunction = self + return function + + +def fixture(scope="function", params=None, autouse=False, ids=None, name=None): + """Decorator to mark a fixture factory function. + + This decorator can be used, with or without parameters, to define a + fixture function. + + The name of the fixture function can later be referenced to cause its + invocation ahead of running tests: test + modules or classes can use the ``pytest.mark.usefixtures(fixturename)`` + marker. + + Test functions can directly use fixture names as input + arguments in which case the fixture instance returned from the fixture + function will be injected. + + Fixtures can provide their values to test functions using ``return`` or ``yield`` + statements. When using ``yield`` the code block after the ``yield`` statement is executed + as teardown code regardless of the test outcome, and must yield exactly once. + + :arg scope: the scope for which this fixture is shared, one of + ``"function"`` (default), ``"class"``, ``"module"``, + ``"package"`` or ``"session"``. + + ``"package"`` is considered **experimental** at this time. + + :arg params: an optional list of parameters which will cause multiple + invocations of the fixture function and all of the tests + using it. + + :arg autouse: if True, the fixture func is activated for all tests that + can see it. If False (the default) then an explicit + reference is needed to activate the fixture. + + :arg ids: list of string ids each corresponding to the params + so that they are part of the test id. If no ids are provided + they will be generated automatically from the params. + + :arg name: the name of the fixture. This defaults to the name of the + decorated function. If a fixture is used in the same module in + which it is defined, the function name of the fixture will be + shadowed by the function arg that requests the fixture; one way + to resolve this is to name the decorated function + ``fixture_`` and then use + ``@pytest.fixture(name='')``. + """ + if callable(scope) and params is None and autouse is False: + # direct decoration + return FixtureFunctionMarker("function", params, autouse, name=name)(scope) + if params is not None and not isinstance(params, (list, tuple)): + params = list(params) + return FixtureFunctionMarker(scope, params, autouse, ids=ids, name=name) + + +def yield_fixture(scope="function", params=None, autouse=False, ids=None, name=None): + """ (return a) decorator to mark a yield-fixture factory function. + + .. deprecated:: 3.0 + Use :py:func:`pytest.fixture` directly instead. + """ + return fixture(scope=scope, params=params, autouse=autouse, ids=ids, name=name) + + +defaultfuncargprefixmarker = fixture() + + +@fixture(scope="session") +def pytestconfig(request): + """Session-scoped fixture that returns the :class:`_pytest.config.Config` object. + + Example:: + + def test_foo(pytestconfig): + if pytestconfig.getoption("verbose"): + ... + + """ + return request.config + + +class FixtureManager(object): + """ + pytest fixtures definitions and information is stored and managed + from this class. + + During collection fm.parsefactories() is called multiple times to parse + fixture function definitions into FixtureDef objects and internal + data structures. + + During collection of test functions, metafunc-mechanics instantiate + a FuncFixtureInfo object which is cached per node/func-name. + This FuncFixtureInfo object is later retrieved by Function nodes + which themselves offer a fixturenames attribute. + + The FuncFixtureInfo object holds information about fixtures and FixtureDefs + relevant for a particular function. An initial list of fixtures is + assembled like this: + + - ini-defined usefixtures + - autouse-marked fixtures along the collection chain up from the function + - usefixtures markers at module/class/function level + - test function funcargs + + Subsequently the funcfixtureinfo.fixturenames attribute is computed + as the closure of the fixtures needed to setup the initial fixtures, + i. e. fixtures needed by fixture functions themselves are appended + to the fixturenames list. + + Upon the test-setup phases all fixturenames are instantiated, retrieved + by a lookup of their FuncFixtureInfo. + """ + + _argprefix = "pytest_funcarg__" + FixtureLookupError = FixtureLookupError + FixtureLookupErrorRepr = FixtureLookupErrorRepr + + def __init__(self, session): + self.session = session + self.config = session.config + self._arg2fixturedefs = {} + self._holderobjseen = set() + self._arg2finish = {} + self._nodeid_and_autousenames = [("", self.config.getini("usefixtures"))] + session.config.pluginmanager.register(self, "funcmanage") + + def getfixtureinfo(self, node, func, cls, funcargs=True): + if funcargs and not getattr(node, "nofuncargs", False): + argnames = getfuncargnames(func, cls=cls) + else: + argnames = () + usefixtures = flatten( + mark.args for mark in node.iter_markers(name="usefixtures") + ) + initialnames = tuple(usefixtures) + argnames + fm = node.session._fixturemanager + initialnames, names_closure, arg2fixturedefs = fm.getfixtureclosure( + initialnames, node + ) + return FuncFixtureInfo(argnames, initialnames, names_closure, arg2fixturedefs) + + def pytest_plugin_registered(self, plugin): + nodeid = None + try: + p = py.path.local(plugin.__file__).realpath() + except AttributeError: + pass + else: + # construct the base nodeid which is later used to check + # what fixtures are visible for particular tests (as denoted + # by their test id) + if p.basename.startswith("conftest.py"): + nodeid = p.dirpath().relto(self.config.rootdir) + if p.sep != nodes.SEP: + nodeid = nodeid.replace(p.sep, nodes.SEP) + self.parsefactories(plugin, nodeid) + + def _getautousenames(self, nodeid): + """ return a tuple of fixture names to be used. """ + autousenames = [] + for baseid, basenames in self._nodeid_and_autousenames: + if nodeid.startswith(baseid): + if baseid: + i = len(baseid) + nextchar = nodeid[i : i + 1] + if nextchar and nextchar not in ":/": + continue + autousenames.extend(basenames) + return autousenames + + def getfixtureclosure(self, fixturenames, parentnode): + # collect the closure of all fixtures , starting with the given + # fixturenames as the initial set. As we have to visit all + # factory definitions anyway, we also return an arg2fixturedefs + # mapping so that the caller can reuse it and does not have + # to re-discover fixturedefs again for each fixturename + # (discovering matching fixtures for a given name/node is expensive) + + parentid = parentnode.nodeid + fixturenames_closure = self._getautousenames(parentid) + + def merge(otherlist): + for arg in otherlist: + if arg not in fixturenames_closure: + fixturenames_closure.append(arg) + + merge(fixturenames) + + # at this point, fixturenames_closure contains what we call "initialnames", + # which is a set of fixturenames the function immediately requests. We + # need to return it as well, so save this. + initialnames = tuple(fixturenames_closure) + + arg2fixturedefs = {} + lastlen = -1 + while lastlen != len(fixturenames_closure): + lastlen = len(fixturenames_closure) + for argname in fixturenames_closure: + if argname in arg2fixturedefs: + continue + fixturedefs = self.getfixturedefs(argname, parentid) + if fixturedefs: + arg2fixturedefs[argname] = fixturedefs + merge(fixturedefs[-1].argnames) + + def sort_by_scope(arg_name): + try: + fixturedefs = arg2fixturedefs[arg_name] + except KeyError: + return scopes.index("function") + else: + return fixturedefs[-1].scopenum + + fixturenames_closure.sort(key=sort_by_scope) + return initialnames, fixturenames_closure, arg2fixturedefs + + def pytest_generate_tests(self, metafunc): + for argname in metafunc.fixturenames: + faclist = metafunc._arg2fixturedefs.get(argname) + if faclist: + fixturedef = faclist[-1] + if fixturedef.params is not None: + parametrize_func = getattr(metafunc.function, "parametrize", None) + if parametrize_func is not None: + parametrize_func = parametrize_func.combined + func_params = getattr(parametrize_func, "args", [[None]]) + func_kwargs = getattr(parametrize_func, "kwargs", {}) + # skip directly parametrized arguments + if "argnames" in func_kwargs: + argnames = parametrize_func.kwargs["argnames"] + else: + argnames = func_params[0] + if not isinstance(argnames, (tuple, list)): + argnames = [x.strip() for x in argnames.split(",") if x.strip()] + if argname not in func_params and argname not in argnames: + metafunc.parametrize( + argname, + fixturedef.params, + indirect=True, + scope=fixturedef.scope, + ids=fixturedef.ids, + ) + else: + continue # will raise FixtureLookupError at setup time + + def pytest_collection_modifyitems(self, items): + # separate parametrized setups + items[:] = reorder_items(items) + + def parsefactories(self, node_or_obj, nodeid=NOTSET, unittest=False): + from _pytest import deprecated + + if nodeid is not NOTSET: + holderobj = node_or_obj + else: + holderobj = node_or_obj.obj + nodeid = node_or_obj.nodeid + if holderobj in self._holderobjseen: + return + self._holderobjseen.add(holderobj) + autousenames = [] + for name in dir(holderobj): + # The attribute can be an arbitrary descriptor, so the attribute + # access below can raise. safe_getatt() ignores such exceptions. + obj = safe_getattr(holderobj, name, None) + marker = getfixturemarker(obj) + # fixture functions have a pytest_funcarg__ prefix (pre-2.3 style) + # or are "@pytest.fixture" marked + if marker is None: + if not name.startswith(self._argprefix): + continue + if not callable(obj): + continue + marker = defaultfuncargprefixmarker + + filename, lineno = getfslineno(obj) + warnings.warn_explicit( + deprecated.FUNCARG_PREFIX.format(name=name), + category=None, + filename=str(filename), + lineno=lineno + 1, + ) + name = name[len(self._argprefix) :] + elif not isinstance(marker, FixtureFunctionMarker): + # magic globals with __getattr__ might have got us a wrong + # fixture attribute + continue + else: + if marker.name: + name = marker.name + assert not name.startswith(self._argprefix), FIXTURE_MSG.format(name) + + # during fixture definition we wrap the original fixture function + # to issue a warning if called directly, so here we unwrap it in order to not emit the warning + # when pytest itself calls the fixture function + if six.PY2 and unittest: + # hack on Python 2 because of the unbound methods + obj = get_real_func(obj) + else: + obj = get_real_method(obj, holderobj) + + fixture_def = FixtureDef( + self, + nodeid, + name, + obj, + marker.scope, + marker.params, + unittest=unittest, + ids=marker.ids, + ) + + faclist = self._arg2fixturedefs.setdefault(name, []) + if fixture_def.has_location: + faclist.append(fixture_def) + else: + # fixturedefs with no location are at the front + # so this inserts the current fixturedef after the + # existing fixturedefs from external plugins but + # before the fixturedefs provided in conftests. + i = len([f for f in faclist if not f.has_location]) + faclist.insert(i, fixture_def) + if marker.autouse: + autousenames.append(name) + + if autousenames: + self._nodeid_and_autousenames.append((nodeid or "", autousenames)) + + def getfixturedefs(self, argname, nodeid): + """ + Gets a list of fixtures which are applicable to the given node id. + + :param str argname: name of the fixture to search for + :param str nodeid: full node id of the requesting test. + :return: list[FixtureDef] + """ + try: + fixturedefs = self._arg2fixturedefs[argname] + except KeyError: + return None + return tuple(self._matchfactories(fixturedefs, nodeid)) + + def _matchfactories(self, fixturedefs, nodeid): + for fixturedef in fixturedefs: + if nodes.ischildnode(fixturedef.baseid, nodeid): + yield fixturedef diff --git a/venv/Lib/site-packages/_pytest/freeze_support.py b/venv/Lib/site-packages/_pytest/freeze_support.py new file mode 100644 index 00000000..002e0773 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/freeze_support.py @@ -0,0 +1,45 @@ +""" +Provides a function to report all internal modules for using freezing tools +pytest +""" +from __future__ import absolute_import, division, print_function + + +def freeze_includes(): + """ + Returns a list of module names used by pytest that should be + included by cx_freeze. + """ + import py + import _pytest + + result = list(_iter_all_modules(py)) + result += list(_iter_all_modules(_pytest)) + return result + + +def _iter_all_modules(package, prefix=""): + """ + Iterates over the names of all modules that can be found in the given + package, recursively. + Example: + _iter_all_modules(_pytest) -> + ['_pytest.assertion.newinterpret', + '_pytest.capture', + '_pytest.core', + ... + ] + """ + import os + import pkgutil + + if type(package) is not str: + path, prefix = package.__path__[0], package.__name__ + "." + else: + path = package + for _, name, is_package in pkgutil.iter_modules([path]): + if is_package: + for m in _iter_all_modules(os.path.join(path, name), prefix=name + "."): + yield prefix + m + else: + yield prefix + name diff --git a/venv/Lib/site-packages/_pytest/helpconfig.py b/venv/Lib/site-packages/_pytest/helpconfig.py new file mode 100644 index 00000000..88bef95f --- /dev/null +++ b/venv/Lib/site-packages/_pytest/helpconfig.py @@ -0,0 +1,213 @@ +""" version info, help messages, tracing configuration. """ +from __future__ import absolute_import, division, print_function + +import py +import pytest +from _pytest.config import PrintHelp +import os +import sys +from argparse import Action + + +class HelpAction(Action): + """This is an argparse Action that will raise an exception in + order to skip the rest of the argument parsing when --help is passed. + This prevents argparse from quitting due to missing required arguments + when any are defined, for example by ``pytest_addoption``. + This is similar to the way that the builtin argparse --help option is + implemented by raising SystemExit. + """ + + def __init__(self, option_strings, dest=None, default=False, help=None): + super(HelpAction, self).__init__( + option_strings=option_strings, + dest=dest, + const=True, + default=default, + nargs=0, + help=help, + ) + + def __call__(self, parser, namespace, values, option_string=None): + setattr(namespace, self.dest, self.const) + + # We should only skip the rest of the parsing after preparse is done + if getattr(parser._parser, "after_preparse", False): + raise PrintHelp + + +def pytest_addoption(parser): + group = parser.getgroup("debugconfig") + group.addoption( + "--version", + action="store_true", + help="display pytest lib version and import information.", + ) + group._addoption( + "-h", + "--help", + action=HelpAction, + dest="help", + help="show help message and configuration info", + ) + group._addoption( + "-p", + action="append", + dest="plugins", + default=[], + metavar="name", + help="early-load given plugin (multi-allowed). " + "To avoid loading of plugins, use the `no:` prefix, e.g. " + "`no:doctest`.", + ) + group.addoption( + "--traceconfig", + "--trace-config", + action="store_true", + default=False, + help="trace considerations of conftest.py files.", + ), + group.addoption( + "--debug", + action="store_true", + dest="debug", + default=False, + help="store internal tracing debug information in 'pytestdebug.log'.", + ) + group._addoption( + "-o", + "--override-ini", + dest="override_ini", + action="append", + help='override ini option with "option=value" style, e.g. `-o xfail_strict=True -o cache_dir=cache`.', + ) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_cmdline_parse(): + outcome = yield + config = outcome.get_result() + if config.option.debug: + path = os.path.abspath("pytestdebug.log") + debugfile = open(path, "w") + debugfile.write( + "versions pytest-%s, py-%s, " + "python-%s\ncwd=%s\nargs=%s\n\n" + % ( + pytest.__version__, + py.__version__, + ".".join(map(str, sys.version_info)), + os.getcwd(), + config._origargs, + ) + ) + config.trace.root.setwriter(debugfile.write) + undo_tracing = config.pluginmanager.enable_tracing() + sys.stderr.write("writing pytestdebug information to %s\n" % path) + + def unset_tracing(): + debugfile.close() + sys.stderr.write("wrote pytestdebug information to %s\n" % debugfile.name) + config.trace.root.setwriter(None) + undo_tracing() + + config.add_cleanup(unset_tracing) + + +def pytest_cmdline_main(config): + if config.option.version: + p = py.path.local(pytest.__file__) + sys.stderr.write( + "This is pytest version %s, imported from %s\n" % (pytest.__version__, p) + ) + plugininfo = getpluginversioninfo(config) + if plugininfo: + for line in plugininfo: + sys.stderr.write(line + "\n") + return 0 + elif config.option.help: + config._do_configure() + showhelp(config) + config._ensure_unconfigure() + return 0 + + +def showhelp(config): + reporter = config.pluginmanager.get_plugin("terminalreporter") + tw = reporter._tw + tw.write(config._parser.optparser.format_help()) + tw.line() + tw.line() + tw.line( + "[pytest] ini-options in the first pytest.ini|tox.ini|setup.cfg file found:" + ) + tw.line() + + for name in config._parser._ininames: + help, type, default = config._parser._inidict[name] + if type is None: + type = "string" + spec = "%s (%s)" % (name, type) + line = " %-24s %s" % (spec, help) + tw.line(line[: tw.fullwidth]) + + tw.line() + tw.line("environment variables:") + vars = [ + ("PYTEST_ADDOPTS", "extra command line options"), + ("PYTEST_PLUGINS", "comma-separated plugins to load during startup"), + ("PYTEST_DISABLE_PLUGIN_AUTOLOAD", "set to disable plugin auto-loading"), + ("PYTEST_DEBUG", "set to enable debug tracing of pytest's internals"), + ] + for name, help in vars: + tw.line(" %-24s %s" % (name, help)) + tw.line() + tw.line() + + tw.line("to see available markers type: pytest --markers") + tw.line("to see available fixtures type: pytest --fixtures") + tw.line( + "(shown according to specified file_or_dir or current dir " + "if not specified; fixtures with leading '_' are only shown " + "with the '-v' option" + ) + + for warningreport in reporter.stats.get("warnings", []): + tw.line("warning : " + warningreport.message, red=True) + return + + +conftest_options = [("pytest_plugins", "list of plugin names to load")] + + +def getpluginversioninfo(config): + lines = [] + plugininfo = config.pluginmanager.list_plugin_distinfo() + if plugininfo: + lines.append("setuptools registered plugins:") + for plugin, dist in plugininfo: + loc = getattr(plugin, "__file__", repr(plugin)) + content = "%s-%s at %s" % (dist.project_name, dist.version, loc) + lines.append(" " + content) + return lines + + +def pytest_report_header(config): + lines = [] + if config.option.debug or config.option.traceconfig: + lines.append("using: pytest-%s pylib-%s" % (pytest.__version__, py.__version__)) + + verinfo = getpluginversioninfo(config) + if verinfo: + lines.extend(verinfo) + + if config.option.traceconfig: + lines.append("active plugins:") + items = config.pluginmanager.list_name_plugin() + for name, plugin in items: + if hasattr(plugin, "__file__"): + r = plugin.__file__ + else: + r = repr(plugin) + lines.append(" %-20s: %s" % (name, r)) + return lines diff --git a/venv/Lib/site-packages/_pytest/hookspec.py b/venv/Lib/site-packages/_pytest/hookspec.py new file mode 100644 index 00000000..53380696 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/hookspec.py @@ -0,0 +1,611 @@ +""" hook specifications for pytest plugins, invoked from main.py and builtin plugins. """ + +from pluggy import HookspecMarker +from .deprecated import PYTEST_NAMESPACE + + +hookspec = HookspecMarker("pytest") + +# ------------------------------------------------------------------------- +# Initialization hooks called for every plugin +# ------------------------------------------------------------------------- + + +@hookspec(historic=True) +def pytest_addhooks(pluginmanager): + """called at plugin registration time to allow adding new hooks via a call to + ``pluginmanager.add_hookspecs(module_or_class, prefix)``. + + + :param _pytest.config.PytestPluginManager pluginmanager: pytest plugin manager + + .. note:: + This hook is incompatible with ``hookwrapper=True``. + """ + + +@hookspec(historic=True, warn_on_impl=PYTEST_NAMESPACE) +def pytest_namespace(): + """ + return dict of name->object to be made globally available in + the pytest namespace. + + This hook is called at plugin registration time. + + .. note:: + This hook is incompatible with ``hookwrapper=True``. + + .. warning:: + This hook has been **deprecated** and will be removed in pytest 4.0. + + Plugins whose users depend on the current namespace functionality should prepare to migrate to a + namespace they actually own. + + To support the migration its suggested to trigger ``DeprecationWarnings`` for objects they put into the + pytest namespace. + + An stopgap measure to avoid the warning is to monkeypatch the ``pytest`` module, but just as the + ``pytest_namespace`` hook this should be seen as a temporary measure to be removed in future versions after + an appropriate transition period. + """ + + +@hookspec(historic=True) +def pytest_plugin_registered(plugin, manager): + """ a new pytest plugin got registered. + + :param plugin: the plugin module or instance + :param _pytest.config.PytestPluginManager manager: pytest plugin manager + + .. note:: + This hook is incompatible with ``hookwrapper=True``. + """ + + +@hookspec(historic=True) +def pytest_addoption(parser): + """register argparse-style options and ini-style config values, + called once at the beginning of a test run. + + .. note:: + + This function should be implemented only in plugins or ``conftest.py`` + files situated at the tests root directory due to how pytest + :ref:`discovers plugins during startup `. + + :arg _pytest.config.Parser parser: To add command line options, call + :py:func:`parser.addoption(...) <_pytest.config.Parser.addoption>`. + To add ini-file values call :py:func:`parser.addini(...) + <_pytest.config.Parser.addini>`. + + Options can later be accessed through the + :py:class:`config <_pytest.config.Config>` object, respectively: + + - :py:func:`config.getoption(name) <_pytest.config.Config.getoption>` to + retrieve the value of a command line option. + + - :py:func:`config.getini(name) <_pytest.config.Config.getini>` to retrieve + a value read from an ini-style file. + + The config object is passed around on many internal objects via the ``.config`` + attribute or can be retrieved as the ``pytestconfig`` fixture. + + .. note:: + This hook is incompatible with ``hookwrapper=True``. + """ + + +@hookspec(historic=True) +def pytest_configure(config): + """ + Allows plugins and conftest files to perform initial configuration. + + This hook is called for every plugin and initial conftest file + after command line options have been parsed. + + After that, the hook is called for other conftest files as they are + imported. + + .. note:: + This hook is incompatible with ``hookwrapper=True``. + + :arg _pytest.config.Config config: pytest config object + """ + + +# ------------------------------------------------------------------------- +# Bootstrapping hooks called for plugins registered early enough: +# internal and 3rd party plugins. +# ------------------------------------------------------------------------- + + +@hookspec(firstresult=True) +def pytest_cmdline_parse(pluginmanager, args): + """return initialized config object, parsing the specified args. + + Stops at first non-None result, see :ref:`firstresult` + + .. note:: + This hook will not be called for ``conftest.py`` files, only for setuptools plugins. + + :param _pytest.config.PytestPluginManager pluginmanager: pytest plugin manager + :param list[str] args: list of arguments passed on the command line + """ + + +def pytest_cmdline_preparse(config, args): + """(**Deprecated**) modify command line arguments before option parsing. + + This hook is considered deprecated and will be removed in a future pytest version. Consider + using :func:`pytest_load_initial_conftests` instead. + + .. note:: + This hook will not be called for ``conftest.py`` files, only for setuptools plugins. + + :param _pytest.config.Config config: pytest config object + :param list[str] args: list of arguments passed on the command line + """ + + +@hookspec(firstresult=True) +def pytest_cmdline_main(config): + """ called for performing the main command line action. The default + implementation will invoke the configure hooks and runtest_mainloop. + + .. note:: + This hook will not be called for ``conftest.py`` files, only for setuptools plugins. + + Stops at first non-None result, see :ref:`firstresult` + + :param _pytest.config.Config config: pytest config object + """ + + +def pytest_load_initial_conftests(early_config, parser, args): + """ implements the loading of initial conftest files ahead + of command line option parsing. + + .. note:: + This hook will not be called for ``conftest.py`` files, only for setuptools plugins. + + :param _pytest.config.Config early_config: pytest config object + :param list[str] args: list of arguments passed on the command line + :param _pytest.config.Parser parser: to add command line options + """ + + +# ------------------------------------------------------------------------- +# collection hooks +# ------------------------------------------------------------------------- + + +@hookspec(firstresult=True) +def pytest_collection(session): + """Perform the collection protocol for the given session. + + Stops at first non-None result, see :ref:`firstresult`. + + :param _pytest.main.Session session: the pytest session object + """ + + +def pytest_collection_modifyitems(session, config, items): + """ called after collection has been performed, may filter or re-order + the items in-place. + + :param _pytest.main.Session session: the pytest session object + :param _pytest.config.Config config: pytest config object + :param List[_pytest.nodes.Item] items: list of item objects + """ + + +def pytest_collection_finish(session): + """ called after collection has been performed and modified. + + :param _pytest.main.Session session: the pytest session object + """ + + +@hookspec(firstresult=True) +def pytest_ignore_collect(path, config): + """ return True to prevent considering this path for collection. + This hook is consulted for all files and directories prior to calling + more specific hooks. + + Stops at first non-None result, see :ref:`firstresult` + + :param str path: the path to analyze + :param _pytest.config.Config config: pytest config object + """ + + +@hookspec(firstresult=True) +def pytest_collect_directory(path, parent): + """ called before traversing a directory for collection files. + + Stops at first non-None result, see :ref:`firstresult` + + :param str path: the path to analyze + """ + + +def pytest_collect_file(path, parent): + """ return collection Node or None for the given path. Any new node + needs to have the specified ``parent`` as a parent. + + :param str path: the path to collect + """ + + +# logging hooks for collection + + +def pytest_collectstart(collector): + """ collector starts collecting. """ + + +def pytest_itemcollected(item): + """ we just collected a test item. """ + + +def pytest_collectreport(report): + """ collector finished collecting. """ + + +def pytest_deselected(items): + """ called for test items deselected by keyword. """ + + +@hookspec(firstresult=True) +def pytest_make_collect_report(collector): + """ perform ``collector.collect()`` and return a CollectReport. + + Stops at first non-None result, see :ref:`firstresult` """ + + +# ------------------------------------------------------------------------- +# Python test function related hooks +# ------------------------------------------------------------------------- + + +@hookspec(firstresult=True) +def pytest_pycollect_makemodule(path, parent): + """ return a Module collector or None for the given path. + This hook will be called for each matching test module path. + The pytest_collect_file hook needs to be used if you want to + create test modules for files that do not match as a test module. + + Stops at first non-None result, see :ref:`firstresult` """ + + +@hookspec(firstresult=True) +def pytest_pycollect_makeitem(collector, name, obj): + """ return custom item/collector for a python object in a module, or None. + + Stops at first non-None result, see :ref:`firstresult` """ + + +@hookspec(firstresult=True) +def pytest_pyfunc_call(pyfuncitem): + """ call underlying test function. + + Stops at first non-None result, see :ref:`firstresult` """ + + +def pytest_generate_tests(metafunc): + """ generate (multiple) parametrized calls to a test function.""" + + +@hookspec(firstresult=True) +def pytest_make_parametrize_id(config, val, argname): + """Return a user-friendly string representation of the given ``val`` that will be used + by @pytest.mark.parametrize calls. Return None if the hook doesn't know about ``val``. + The parameter name is available as ``argname``, if required. + + Stops at first non-None result, see :ref:`firstresult` + + :param _pytest.config.Config config: pytest config object + :param val: the parametrized value + :param str argname: the automatic parameter name produced by pytest + """ + + +# ------------------------------------------------------------------------- +# generic runtest related hooks +# ------------------------------------------------------------------------- + + +@hookspec(firstresult=True) +def pytest_runtestloop(session): + """ called for performing the main runtest loop + (after collection finished). + + Stops at first non-None result, see :ref:`firstresult` + + :param _pytest.main.Session session: the pytest session object + """ + + +def pytest_itemstart(item, node): + """(**Deprecated**) use pytest_runtest_logstart. """ + + +@hookspec(firstresult=True) +def pytest_runtest_protocol(item, nextitem): + """ implements the runtest_setup/call/teardown protocol for + the given test item, including capturing exceptions and calling + reporting hooks. + + :arg item: test item for which the runtest protocol is performed. + + :arg nextitem: the scheduled-to-be-next test item (or None if this + is the end my friend). This argument is passed on to + :py:func:`pytest_runtest_teardown`. + + :return boolean: True if no further hook implementations should be invoked. + + + Stops at first non-None result, see :ref:`firstresult` """ + + +def pytest_runtest_logstart(nodeid, location): + """ signal the start of running a single test item. + + This hook will be called **before** :func:`pytest_runtest_setup`, :func:`pytest_runtest_call` and + :func:`pytest_runtest_teardown` hooks. + + :param str nodeid: full id of the item + :param location: a triple of ``(filename, linenum, testname)`` + """ + + +def pytest_runtest_logfinish(nodeid, location): + """ signal the complete finish of running a single test item. + + This hook will be called **after** :func:`pytest_runtest_setup`, :func:`pytest_runtest_call` and + :func:`pytest_runtest_teardown` hooks. + + :param str nodeid: full id of the item + :param location: a triple of ``(filename, linenum, testname)`` + """ + + +def pytest_runtest_setup(item): + """ called before ``pytest_runtest_call(item)``. """ + + +def pytest_runtest_call(item): + """ called to execute the test ``item``. """ + + +def pytest_runtest_teardown(item, nextitem): + """ called after ``pytest_runtest_call``. + + :arg nextitem: the scheduled-to-be-next test item (None if no further + test item is scheduled). This argument can be used to + perform exact teardowns, i.e. calling just enough finalizers + so that nextitem only needs to call setup-functions. + """ + + +@hookspec(firstresult=True) +def pytest_runtest_makereport(item, call): + """ return a :py:class:`_pytest.runner.TestReport` object + for the given :py:class:`pytest.Item <_pytest.main.Item>` and + :py:class:`_pytest.runner.CallInfo`. + + Stops at first non-None result, see :ref:`firstresult` """ + + +def pytest_runtest_logreport(report): + """ process a test setup/call/teardown report relating to + the respective phase of executing a test. """ + + +# ------------------------------------------------------------------------- +# Fixture related hooks +# ------------------------------------------------------------------------- + + +@hookspec(firstresult=True) +def pytest_fixture_setup(fixturedef, request): + """ performs fixture setup execution. + + :return: The return value of the call to the fixture function + + Stops at first non-None result, see :ref:`firstresult` + + .. note:: + If the fixture function returns None, other implementations of + this hook function will continue to be called, according to the + behavior of the :ref:`firstresult` option. + """ + + +def pytest_fixture_post_finalizer(fixturedef, request): + """ called after fixture teardown, but before the cache is cleared so + the fixture result cache ``fixturedef.cached_result`` can + still be accessed.""" + + +# ------------------------------------------------------------------------- +# test session related hooks +# ------------------------------------------------------------------------- + + +def pytest_sessionstart(session): + """ called after the ``Session`` object has been created and before performing collection + and entering the run test loop. + + :param _pytest.main.Session session: the pytest session object + """ + + +def pytest_sessionfinish(session, exitstatus): + """ called after whole test run finished, right before returning the exit status to the system. + + :param _pytest.main.Session session: the pytest session object + :param int exitstatus: the status which pytest will return to the system + """ + + +def pytest_unconfigure(config): + """ called before test process is exited. + + :param _pytest.config.Config config: pytest config object + """ + + +# ------------------------------------------------------------------------- +# hooks for customizing the assert methods +# ------------------------------------------------------------------------- + + +def pytest_assertrepr_compare(config, op, left, right): + """return explanation for comparisons in failing assert expressions. + + Return None for no custom explanation, otherwise return a list + of strings. The strings will be joined by newlines but any newlines + *in* a string will be escaped. Note that all but the first line will + be indented slightly, the intention is for the first line to be a summary. + + :param _pytest.config.Config config: pytest config object + """ + + +# ------------------------------------------------------------------------- +# hooks for influencing reporting (invoked from _pytest_terminal) +# ------------------------------------------------------------------------- + + +def pytest_report_header(config, startdir): + """ return a string or list of strings to be displayed as header info for terminal reporting. + + :param _pytest.config.Config config: pytest config object + :param startdir: py.path object with the starting dir + + .. note:: + + This function should be implemented only in plugins or ``conftest.py`` + files situated at the tests root directory due to how pytest + :ref:`discovers plugins during startup `. + """ + + +def pytest_report_collectionfinish(config, startdir, items): + """ + .. versionadded:: 3.2 + + return a string or list of strings to be displayed after collection has finished successfully. + + This strings will be displayed after the standard "collected X items" message. + + :param _pytest.config.Config config: pytest config object + :param startdir: py.path object with the starting dir + :param items: list of pytest items that are going to be executed; this list should not be modified. + """ + + +@hookspec(firstresult=True) +def pytest_report_teststatus(report): + """ return result-category, shortletter and verbose word for reporting. + + Stops at first non-None result, see :ref:`firstresult` """ + + +def pytest_terminal_summary(terminalreporter, exitstatus): + """Add a section to terminal summary reporting. + + :param _pytest.terminal.TerminalReporter terminalreporter: the internal terminal reporter object + :param int exitstatus: the exit status that will be reported back to the OS + + .. versionadded:: 3.5 + The ``config`` parameter. + """ + + +@hookspec(historic=True) +def pytest_logwarning(message, code, nodeid, fslocation): + """ + .. deprecated:: 3.8 + + This hook is will stop working in a future release. + + pytest no longer triggers this hook, but the + terminal writer still implements it to display warnings issued by + :meth:`_pytest.config.Config.warn` and :meth:`_pytest.nodes.Node.warn`. Calling those functions will be + an error in future releases. + + process a warning specified by a message, a code string, + a nodeid and fslocation (both of which may be None + if the warning is not tied to a particular node/location). + + .. note:: + This hook is incompatible with ``hookwrapper=True``. + """ + + +@hookspec(historic=True) +def pytest_warning_captured(warning_message, when, item): + """ + Process a warning captured by the internal pytest warnings plugin. + + :param warnings.WarningMessage warning_message: + The captured warning. This is the same object produced by :py:func:`warnings.catch_warnings`, and contains + the same attributes as the parameters of :py:func:`warnings.showwarning`. + + :param str when: + Indicates when the warning was captured. Possible values: + + * ``"config"``: during pytest configuration/initialization stage. + * ``"collect"``: during test collection. + * ``"runtest"``: during test execution. + + :param pytest.Item|None item: + **DEPRECATED**: This parameter is incompatible with ``pytest-xdist``, and will always receive ``None`` + in a future release. + + The item being executed if ``when`` is ``"runtest"``, otherwise ``None``. + """ + + +# ------------------------------------------------------------------------- +# doctest hooks +# ------------------------------------------------------------------------- + + +@hookspec(firstresult=True) +def pytest_doctest_prepare_content(content): + """ return processed content for a given doctest + + Stops at first non-None result, see :ref:`firstresult` """ + + +# ------------------------------------------------------------------------- +# error handling and internal debugging hooks +# ------------------------------------------------------------------------- + + +def pytest_internalerror(excrepr, excinfo): + """ called for internal errors. """ + + +def pytest_keyboard_interrupt(excinfo): + """ called for keyboard interrupt. """ + + +def pytest_exception_interact(node, call, report): + """called when an exception was raised which can potentially be + interactively handled. + + This hook is only called if an exception was raised + that is not an internal exception like ``skip.Exception``. + """ + + +def pytest_enter_pdb(config): + """ called upon pdb.set_trace(), can be used by plugins to take special + action just before the python debugger enters in interactive mode. + + :param _pytest.config.Config config: pytest config object + """ diff --git a/venv/Lib/site-packages/_pytest/junitxml.py b/venv/Lib/site-packages/_pytest/junitxml.py new file mode 100644 index 00000000..ac00c772 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/junitxml.py @@ -0,0 +1,563 @@ +""" + report test results in JUnit-XML format, + for use with Jenkins and build integration servers. + + +Based on initial code from Ross Lawley. + +Output conforms to https://github.com/jenkinsci/xunit-plugin/blob/master/ +src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd +""" +from __future__ import absolute_import, division, print_function + +import functools +import py +import os +import re +import sys +import time +import pytest +from _pytest import nodes +from _pytest.config import filename_arg + +# Python 2.X and 3.X compatibility +if sys.version_info[0] < 3: + from codecs import open +else: + unichr = chr + unicode = str + long = int + + +class Junit(py.xml.Namespace): + pass + + +# We need to get the subset of the invalid unicode ranges according to +# XML 1.0 which are valid in this python build. Hence we calculate +# this dynamically instead of hardcoding it. The spec range of valid +# chars is: Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] +# | [#x10000-#x10FFFF] +_legal_chars = (0x09, 0x0A, 0x0D) +_legal_ranges = ((0x20, 0x7E), (0x80, 0xD7FF), (0xE000, 0xFFFD), (0x10000, 0x10FFFF)) +_legal_xml_re = [ + unicode("%s-%s") % (unichr(low), unichr(high)) + for (low, high) in _legal_ranges + if low < sys.maxunicode +] +_legal_xml_re = [unichr(x) for x in _legal_chars] + _legal_xml_re +illegal_xml_re = re.compile(unicode("[^%s]") % unicode("").join(_legal_xml_re)) +del _legal_chars +del _legal_ranges +del _legal_xml_re + +_py_ext_re = re.compile(r"\.py$") + + +def bin_xml_escape(arg): + def repl(matchobj): + i = ord(matchobj.group()) + if i <= 0xFF: + return unicode("#x%02X") % i + else: + return unicode("#x%04X") % i + + return py.xml.raw(illegal_xml_re.sub(repl, py.xml.escape(arg))) + + +class _NodeReporter(object): + def __init__(self, nodeid, xml): + + self.id = nodeid + self.xml = xml + self.add_stats = self.xml.add_stats + self.duration = 0 + self.properties = [] + self.nodes = [] + self.testcase = None + self.attrs = {} + + def append(self, node): + self.xml.add_stats(type(node).__name__) + self.nodes.append(node) + + def add_property(self, name, value): + self.properties.append((str(name), bin_xml_escape(value))) + + def add_attribute(self, name, value): + self.attrs[str(name)] = bin_xml_escape(value) + + def make_properties_node(self): + """Return a Junit node containing custom properties, if any. + """ + if self.properties: + return Junit.properties( + [ + Junit.property(name=name, value=value) + for name, value in self.properties + ] + ) + return "" + + def record_testreport(self, testreport): + assert not self.testcase + names = mangle_test_address(testreport.nodeid) + existing_attrs = self.attrs + classnames = names[:-1] + if self.xml.prefix: + classnames.insert(0, self.xml.prefix) + attrs = { + "classname": ".".join(classnames), + "name": bin_xml_escape(names[-1]), + "file": testreport.location[0], + } + if testreport.location[1] is not None: + attrs["line"] = testreport.location[1] + if hasattr(testreport, "url"): + attrs["url"] = testreport.url + self.attrs = attrs + self.attrs.update(existing_attrs) # restore any user-defined attributes + + def to_xml(self): + testcase = Junit.testcase(time=self.duration, **self.attrs) + testcase.append(self.make_properties_node()) + for node in self.nodes: + testcase.append(node) + return testcase + + def _add_simple(self, kind, message, data=None): + data = bin_xml_escape(data) + node = kind(data, message=message) + self.append(node) + + def write_captured_output(self, report): + content_out = report.capstdout + content_log = report.caplog + content_err = report.capstderr + + if content_log or content_out: + if content_log and self.xml.logging == "system-out": + if content_out: + # syncing stdout and the log-output is not done yet. It's + # probably not worth the effort. Therefore, first the captured + # stdout is shown and then the captured logs. + content = "\n".join( + [ + " Captured Stdout ".center(80, "-"), + content_out, + "", + " Captured Log ".center(80, "-"), + content_log, + ] + ) + else: + content = content_log + else: + content = content_out + + if content: + tag = getattr(Junit, "system-out") + self.append(tag(bin_xml_escape(content))) + + if content_log or content_err: + if content_log and self.xml.logging == "system-err": + if content_err: + content = "\n".join( + [ + " Captured Stderr ".center(80, "-"), + content_err, + "", + " Captured Log ".center(80, "-"), + content_log, + ] + ) + else: + content = content_log + else: + content = content_err + + if content: + tag = getattr(Junit, "system-err") + self.append(tag(bin_xml_escape(content))) + + def append_pass(self, report): + self.add_stats("passed") + + def append_failure(self, report): + # msg = str(report.longrepr.reprtraceback.extraline) + if hasattr(report, "wasxfail"): + self._add_simple(Junit.skipped, "xfail-marked test passes unexpectedly") + else: + if hasattr(report.longrepr, "reprcrash"): + message = report.longrepr.reprcrash.message + elif isinstance(report.longrepr, (unicode, str)): + message = report.longrepr + else: + message = str(report.longrepr) + message = bin_xml_escape(message) + fail = Junit.failure(message=message) + fail.append(bin_xml_escape(report.longrepr)) + self.append(fail) + + def append_collect_error(self, report): + # msg = str(report.longrepr.reprtraceback.extraline) + self.append( + Junit.error(bin_xml_escape(report.longrepr), message="collection failure") + ) + + def append_collect_skipped(self, report): + self._add_simple(Junit.skipped, "collection skipped", report.longrepr) + + def append_error(self, report): + if getattr(report, "when", None) == "teardown": + msg = "test teardown failure" + else: + msg = "test setup failure" + self._add_simple(Junit.error, msg, report.longrepr) + + def append_skipped(self, report): + if hasattr(report, "wasxfail"): + self._add_simple(Junit.skipped, "expected test failure", report.wasxfail) + else: + filename, lineno, skipreason = report.longrepr + if skipreason.startswith("Skipped: "): + skipreason = bin_xml_escape(skipreason[9:]) + self.append( + Junit.skipped( + "%s:%s: %s" % (filename, lineno, skipreason), + type="pytest.skip", + message=skipreason, + ) + ) + self.write_captured_output(report) + + def finalize(self): + data = self.to_xml().unicode(indent=0) + self.__dict__.clear() + self.to_xml = lambda: py.xml.raw(data) + + +@pytest.fixture +def record_property(request): + """Add an extra properties the calling test. + User properties become part of the test report and are available to the + configured reporters, like JUnit XML. + The fixture is callable with ``(name, value)``, with value being automatically + xml-encoded. + + Example:: + + def test_function(record_property): + record_property("example_key", 1) + """ + + def append_property(name, value): + request.node.user_properties.append((name, value)) + + return append_property + + +@pytest.fixture +def record_xml_property(record_property, request): + """(Deprecated) use record_property.""" + from _pytest import deprecated + + request.node.warn(deprecated.RECORD_XML_PROPERTY) + + return record_property + + +@pytest.fixture +def record_xml_attribute(request): + """Add extra xml attributes to the tag for the calling test. + The fixture is callable with ``(name, value)``, with value being + automatically xml-encoded + """ + from _pytest.warning_types import PytestWarning + + request.node.warn(PytestWarning("record_xml_attribute is an experimental feature")) + xml = getattr(request.config, "_xml", None) + if xml is not None: + node_reporter = xml.node_reporter(request.node.nodeid) + return node_reporter.add_attribute + else: + + def add_attr_noop(name, value): + pass + + return add_attr_noop + + +def pytest_addoption(parser): + group = parser.getgroup("terminal reporting") + group.addoption( + "--junitxml", + "--junit-xml", + action="store", + dest="xmlpath", + metavar="path", + type=functools.partial(filename_arg, optname="--junitxml"), + default=None, + help="create junit-xml style report file at given path.", + ) + group.addoption( + "--junitprefix", + "--junit-prefix", + action="store", + metavar="str", + default=None, + help="prepend prefix to classnames in junit-xml output", + ) + parser.addini( + "junit_suite_name", "Test suite name for JUnit report", default="pytest" + ) + parser.addini( + "junit_logging", + "Write captured log messages to JUnit report: " + "one of no|system-out|system-err", + default="no", + ) # choices=['no', 'stdout', 'stderr']) + + +def pytest_configure(config): + xmlpath = config.option.xmlpath + # prevent opening xmllog on slave nodes (xdist) + if xmlpath and not hasattr(config, "slaveinput"): + config._xml = LogXML( + xmlpath, + config.option.junitprefix, + config.getini("junit_suite_name"), + config.getini("junit_logging"), + ) + config.pluginmanager.register(config._xml) + + +def pytest_unconfigure(config): + xml = getattr(config, "_xml", None) + if xml: + del config._xml + config.pluginmanager.unregister(xml) + + +def mangle_test_address(address): + path, possible_open_bracket, params = address.partition("[") + names = path.split("::") + try: + names.remove("()") + except ValueError: + pass + # convert file path to dotted path + names[0] = names[0].replace(nodes.SEP, ".") + names[0] = _py_ext_re.sub("", names[0]) + # put any params back + names[-1] += possible_open_bracket + params + return names + + +class LogXML(object): + def __init__(self, logfile, prefix, suite_name="pytest", logging="no"): + logfile = os.path.expanduser(os.path.expandvars(logfile)) + self.logfile = os.path.normpath(os.path.abspath(logfile)) + self.prefix = prefix + self.suite_name = suite_name + self.logging = logging + self.stats = dict.fromkeys(["error", "passed", "failure", "skipped"], 0) + self.node_reporters = {} # nodeid -> _NodeReporter + self.node_reporters_ordered = [] + self.global_properties = [] + # List of reports that failed on call but teardown is pending. + self.open_reports = [] + self.cnt_double_fail_tests = 0 + + def finalize(self, report): + nodeid = getattr(report, "nodeid", report) + # local hack to handle xdist report order + slavenode = getattr(report, "node", None) + reporter = self.node_reporters.pop((nodeid, slavenode)) + if reporter is not None: + reporter.finalize() + + def node_reporter(self, report): + nodeid = getattr(report, "nodeid", report) + # local hack to handle xdist report order + slavenode = getattr(report, "node", None) + + key = nodeid, slavenode + + if key in self.node_reporters: + # TODO: breasks for --dist=each + return self.node_reporters[key] + + reporter = _NodeReporter(nodeid, self) + + self.node_reporters[key] = reporter + self.node_reporters_ordered.append(reporter) + + return reporter + + def add_stats(self, key): + if key in self.stats: + self.stats[key] += 1 + + def _opentestcase(self, report): + reporter = self.node_reporter(report) + reporter.record_testreport(report) + return reporter + + def pytest_runtest_logreport(self, report): + """handle a setup/call/teardown report, generating the appropriate + xml tags as necessary. + + note: due to plugins like xdist, this hook may be called in interlaced + order with reports from other nodes. for example: + + usual call order: + -> setup node1 + -> call node1 + -> teardown node1 + -> setup node2 + -> call node2 + -> teardown node2 + + possible call order in xdist: + -> setup node1 + -> call node1 + -> setup node2 + -> call node2 + -> teardown node2 + -> teardown node1 + """ + close_report = None + if report.passed: + if report.when == "call": # ignore setup/teardown + reporter = self._opentestcase(report) + reporter.append_pass(report) + elif report.failed: + if report.when == "teardown": + # The following vars are needed when xdist plugin is used + report_wid = getattr(report, "worker_id", None) + report_ii = getattr(report, "item_index", None) + close_report = next( + ( + rep + for rep in self.open_reports + if ( + rep.nodeid == report.nodeid + and getattr(rep, "item_index", None) == report_ii + and getattr(rep, "worker_id", None) == report_wid + ) + ), + None, + ) + if close_report: + # We need to open new testcase in case we have failure in + # call and error in teardown in order to follow junit + # schema + self.finalize(close_report) + self.cnt_double_fail_tests += 1 + reporter = self._opentestcase(report) + if report.when == "call": + reporter.append_failure(report) + self.open_reports.append(report) + else: + reporter.append_error(report) + elif report.skipped: + reporter = self._opentestcase(report) + reporter.append_skipped(report) + self.update_testcase_duration(report) + if report.when == "teardown": + reporter = self._opentestcase(report) + reporter.write_captured_output(report) + + for propname, propvalue in report.user_properties: + reporter.add_property(propname, propvalue) + + self.finalize(report) + report_wid = getattr(report, "worker_id", None) + report_ii = getattr(report, "item_index", None) + close_report = next( + ( + rep + for rep in self.open_reports + if ( + rep.nodeid == report.nodeid + and getattr(rep, "item_index", None) == report_ii + and getattr(rep, "worker_id", None) == report_wid + ) + ), + None, + ) + if close_report: + self.open_reports.remove(close_report) + + def update_testcase_duration(self, report): + """accumulates total duration for nodeid from given report and updates + the Junit.testcase with the new total if already created. + """ + reporter = self.node_reporter(report) + reporter.duration += getattr(report, "duration", 0.0) + + def pytest_collectreport(self, report): + if not report.passed: + reporter = self._opentestcase(report) + if report.failed: + reporter.append_collect_error(report) + else: + reporter.append_collect_skipped(report) + + def pytest_internalerror(self, excrepr): + reporter = self.node_reporter("internal") + reporter.attrs.update(classname="pytest", name="internal") + reporter._add_simple(Junit.error, "internal error", excrepr) + + def pytest_sessionstart(self): + self.suite_start_time = time.time() + + def pytest_sessionfinish(self): + dirname = os.path.dirname(os.path.abspath(self.logfile)) + if not os.path.isdir(dirname): + os.makedirs(dirname) + logfile = open(self.logfile, "w", encoding="utf-8") + suite_stop_time = time.time() + suite_time_delta = suite_stop_time - self.suite_start_time + + numtests = ( + self.stats["passed"] + + self.stats["failure"] + + self.stats["skipped"] + + self.stats["error"] + - self.cnt_double_fail_tests + ) + logfile.write('') + + logfile.write( + Junit.testsuite( + self._get_global_properties_node(), + [x.to_xml() for x in self.node_reporters_ordered], + name=self.suite_name, + errors=self.stats["error"], + failures=self.stats["failure"], + skips=self.stats["skipped"], + tests=numtests, + time="%.3f" % suite_time_delta, + ).unicode(indent=0) + ) + logfile.close() + + def pytest_terminal_summary(self, terminalreporter): + terminalreporter.write_sep("-", "generated xml file: %s" % (self.logfile)) + + def add_global_property(self, name, value): + self.global_properties.append((str(name), bin_xml_escape(value))) + + def _get_global_properties_node(self): + """Return a Junit node containing custom properties, if any. + """ + if self.global_properties: + return Junit.properties( + [ + Junit.property(name=name, value=value) + for name, value in self.global_properties + ] + ) + return "" diff --git a/venv/Lib/site-packages/_pytest/logging.py b/venv/Lib/site-packages/_pytest/logging.py new file mode 100644 index 00000000..fe6711ac --- /dev/null +++ b/venv/Lib/site-packages/_pytest/logging.py @@ -0,0 +1,599 @@ +""" Access and control log capturing. """ +from __future__ import absolute_import, division, print_function + +import logging +from contextlib import contextmanager +import re +import six + +from _pytest.compat import dummy_context_manager +from _pytest.config import create_terminal_writer +import pytest +import py + + +DEFAULT_LOG_FORMAT = "%(filename)-25s %(lineno)4d %(levelname)-8s %(message)s" +DEFAULT_LOG_DATE_FORMAT = "%H:%M:%S" + + +class ColoredLevelFormatter(logging.Formatter): + """ + Colorize the %(levelname)..s part of the log format passed to __init__. + """ + + LOGLEVEL_COLOROPTS = { + logging.CRITICAL: {"red"}, + logging.ERROR: {"red", "bold"}, + logging.WARNING: {"yellow"}, + logging.WARN: {"yellow"}, + logging.INFO: {"green"}, + logging.DEBUG: {"purple"}, + logging.NOTSET: set(), + } + LEVELNAME_FMT_REGEX = re.compile(r"%\(levelname\)([+-]?\d*s)") + + def __init__(self, terminalwriter, *args, **kwargs): + super(ColoredLevelFormatter, self).__init__(*args, **kwargs) + if six.PY2: + self._original_fmt = self._fmt + else: + self._original_fmt = self._style._fmt + self._level_to_fmt_mapping = {} + + levelname_fmt_match = self.LEVELNAME_FMT_REGEX.search(self._fmt) + if not levelname_fmt_match: + return + levelname_fmt = levelname_fmt_match.group() + + for level, color_opts in self.LOGLEVEL_COLOROPTS.items(): + formatted_levelname = levelname_fmt % { + "levelname": logging.getLevelName(level) + } + + # add ANSI escape sequences around the formatted levelname + color_kwargs = {name: True for name in color_opts} + colorized_formatted_levelname = terminalwriter.markup( + formatted_levelname, **color_kwargs + ) + self._level_to_fmt_mapping[level] = self.LEVELNAME_FMT_REGEX.sub( + colorized_formatted_levelname, self._fmt + ) + + def format(self, record): + fmt = self._level_to_fmt_mapping.get(record.levelno, self._original_fmt) + if six.PY2: + self._fmt = fmt + else: + self._style._fmt = fmt + return super(ColoredLevelFormatter, self).format(record) + + +def get_option_ini(config, *names): + for name in names: + ret = config.getoption(name) # 'default' arg won't work as expected + if ret is None: + ret = config.getini(name) + if ret: + return ret + + +def pytest_addoption(parser): + """Add options to control log capturing.""" + group = parser.getgroup("logging") + + def add_option_ini(option, dest, default=None, type=None, **kwargs): + parser.addini( + dest, default=default, type=type, help="default value for " + option + ) + group.addoption(option, dest=dest, **kwargs) + + add_option_ini( + "--no-print-logs", + dest="log_print", + action="store_const", + const=False, + default=True, + type="bool", + help="disable printing caught logs on failed tests.", + ) + add_option_ini( + "--log-level", + dest="log_level", + default=None, + help="logging level used by the logging module", + ) + add_option_ini( + "--log-format", + dest="log_format", + default=DEFAULT_LOG_FORMAT, + help="log format as used by the logging module.", + ) + add_option_ini( + "--log-date-format", + dest="log_date_format", + default=DEFAULT_LOG_DATE_FORMAT, + help="log date format as used by the logging module.", + ) + parser.addini( + "log_cli", + default=False, + type="bool", + help='enable log display during test run (also known as "live logging").', + ) + add_option_ini( + "--log-cli-level", dest="log_cli_level", default=None, help="cli logging level." + ) + add_option_ini( + "--log-cli-format", + dest="log_cli_format", + default=None, + help="log format as used by the logging module.", + ) + add_option_ini( + "--log-cli-date-format", + dest="log_cli_date_format", + default=None, + help="log date format as used by the logging module.", + ) + add_option_ini( + "--log-file", + dest="log_file", + default=None, + help="path to a file when logging will be written to.", + ) + add_option_ini( + "--log-file-level", + dest="log_file_level", + default=None, + help="log file logging level.", + ) + add_option_ini( + "--log-file-format", + dest="log_file_format", + default=DEFAULT_LOG_FORMAT, + help="log format as used by the logging module.", + ) + add_option_ini( + "--log-file-date-format", + dest="log_file_date_format", + default=DEFAULT_LOG_DATE_FORMAT, + help="log date format as used by the logging module.", + ) + + +@contextmanager +def catching_logs(handler, formatter=None, level=None): + """Context manager that prepares the whole logging machinery properly.""" + root_logger = logging.getLogger() + + if formatter is not None: + handler.setFormatter(formatter) + if level is not None: + handler.setLevel(level) + + # Adding the same handler twice would confuse logging system. + # Just don't do that. + add_new_handler = handler not in root_logger.handlers + + if add_new_handler: + root_logger.addHandler(handler) + if level is not None: + orig_level = root_logger.level + root_logger.setLevel(min(orig_level, level)) + try: + yield handler + finally: + if level is not None: + root_logger.setLevel(orig_level) + if add_new_handler: + root_logger.removeHandler(handler) + + +class LogCaptureHandler(logging.StreamHandler): + """A logging handler that stores log records and the log text.""" + + def __init__(self): + """Creates a new log handler.""" + logging.StreamHandler.__init__(self, py.io.TextIO()) + self.records = [] + + def emit(self, record): + """Keep the log records in a list in addition to the log text.""" + self.records.append(record) + logging.StreamHandler.emit(self, record) + + def reset(self): + self.records = [] + self.stream = py.io.TextIO() + + +class LogCaptureFixture(object): + """Provides access and control of log capturing.""" + + def __init__(self, item): + """Creates a new funcarg.""" + self._item = item + # dict of log name -> log level + self._initial_log_levels = {} # type: Dict[str, int] + + def _finalize(self): + """Finalizes the fixture. + + This restores the log levels changed by :meth:`set_level`. + """ + # restore log levels + for logger_name, level in self._initial_log_levels.items(): + logger = logging.getLogger(logger_name) + logger.setLevel(level) + + @property + def handler(self): + """ + :rtype: LogCaptureHandler + """ + return self._item.catch_log_handler + + def get_records(self, when): + """ + Get the logging records for one of the possible test phases. + + :param str when: + Which test phase to obtain the records from. Valid values are: "setup", "call" and "teardown". + + :rtype: List[logging.LogRecord] + :return: the list of captured records at the given stage + + .. versionadded:: 3.4 + """ + handler = self._item.catch_log_handlers.get(when) + if handler: + return handler.records + else: + return [] + + @property + def text(self): + """Returns the log text.""" + return self.handler.stream.getvalue() + + @property + def records(self): + """Returns the list of log records.""" + return self.handler.records + + @property + def record_tuples(self): + """Returns a list of a striped down version of log records intended + for use in assertion comparison. + + The format of the tuple is: + + (logger_name, log_level, message) + """ + return [(r.name, r.levelno, r.getMessage()) for r in self.records] + + @property + def messages(self): + """Returns a list of format-interpolated log messages. + + Unlike 'records', which contains the format string and parameters for interpolation, log messages in this list + are all interpolated. + Unlike 'text', which contains the output from the handler, log messages in this list are unadorned with + levels, timestamps, etc, making exact comparisions more reliable. + + Note that traceback or stack info (from :func:`logging.exception` or the `exc_info` or `stack_info` arguments + to the logging functions) is not included, as this is added by the formatter in the handler. + + .. versionadded:: 3.7 + """ + return [r.getMessage() for r in self.records] + + def clear(self): + """Reset the list of log records and the captured log text.""" + self.handler.reset() + + def set_level(self, level, logger=None): + """Sets the level for capturing of logs. The level will be restored to its previous value at the end of + the test. + + :param int level: the logger to level. + :param str logger: the logger to update the level. If not given, the root logger level is updated. + + .. versionchanged:: 3.4 + The levels of the loggers changed by this function will be restored to their initial values at the + end of the test. + """ + logger_name = logger + logger = logging.getLogger(logger_name) + # save the original log-level to restore it during teardown + self._initial_log_levels.setdefault(logger_name, logger.level) + logger.setLevel(level) + + @contextmanager + def at_level(self, level, logger=None): + """Context manager that sets the level for capturing of logs. After the end of the 'with' statement the + level is restored to its original value. + + :param int level: the logger to level. + :param str logger: the logger to update the level. If not given, the root logger level is updated. + """ + logger = logging.getLogger(logger) + orig_level = logger.level + logger.setLevel(level) + try: + yield + finally: + logger.setLevel(orig_level) + + +@pytest.fixture +def caplog(request): + """Access and control log capturing. + + Captured logs are available through the following methods:: + + * caplog.text -> string containing formatted log output + * caplog.records -> list of logging.LogRecord instances + * caplog.record_tuples -> list of (logger_name, level, message) tuples + * caplog.clear() -> clear captured records and formatted log output string + """ + result = LogCaptureFixture(request.node) + yield result + result._finalize() + + +def get_actual_log_level(config, *setting_names): + """Return the actual logging level.""" + + for setting_name in setting_names: + log_level = config.getoption(setting_name) + if log_level is None: + log_level = config.getini(setting_name) + if log_level: + break + else: + return + + if isinstance(log_level, six.string_types): + log_level = log_level.upper() + try: + return int(getattr(logging, log_level, log_level)) + except ValueError: + # Python logging does not recognise this as a logging level + raise pytest.UsageError( + "'{}' is not recognized as a logging level name for " + "'{}'. Please consider passing the " + "logging level num instead.".format(log_level, setting_name) + ) + + +def pytest_configure(config): + config.pluginmanager.register(LoggingPlugin(config), "logging-plugin") + + +class LoggingPlugin(object): + """Attaches to the logging module and captures log messages for each test. + """ + + def __init__(self, config): + """Creates a new plugin to capture log messages. + + The formatter can be safely shared across all handlers so + create a single one for the entire test session here. + """ + self._config = config + + # enable verbose output automatically if live logging is enabled + if self._log_cli_enabled() and not config.getoption("verbose"): + # sanity check: terminal reporter should not have been loaded at this point + assert self._config.pluginmanager.get_plugin("terminalreporter") is None + config.option.verbose = 1 + + self.print_logs = get_option_ini(config, "log_print") + self.formatter = logging.Formatter( + get_option_ini(config, "log_format"), + get_option_ini(config, "log_date_format"), + ) + self.log_level = get_actual_log_level(config, "log_level") + + log_file = get_option_ini(config, "log_file") + if log_file: + self.log_file_level = get_actual_log_level(config, "log_file_level") + + log_file_format = get_option_ini(config, "log_file_format", "log_format") + log_file_date_format = get_option_ini( + config, "log_file_date_format", "log_date_format" + ) + # Each pytest runtests session will write to a clean logfile + self.log_file_handler = logging.FileHandler( + log_file, mode="w", encoding="UTF-8" + ) + log_file_formatter = logging.Formatter( + log_file_format, datefmt=log_file_date_format + ) + self.log_file_handler.setFormatter(log_file_formatter) + else: + self.log_file_handler = None + + self.log_cli_handler = None + + def _log_cli_enabled(self): + """Return True if log_cli should be considered enabled, either explicitly + or because --log-cli-level was given in the command-line. + """ + return self._config.getoption( + "--log-cli-level" + ) is not None or self._config.getini("log_cli") + + @pytest.hookimpl(hookwrapper=True, tryfirst=True) + def pytest_collection(self): + # This has to be called before the first log message is logged, + # so we can access the terminal reporter plugin. + self._setup_cli_logging() + + with self.live_logs_context(): + if self.log_cli_handler: + self.log_cli_handler.set_when("collection") + + if self.log_file_handler is not None: + with catching_logs(self.log_file_handler, level=self.log_file_level): + yield + else: + yield + + @contextmanager + def _runtest_for(self, item, when): + """Implements the internals of pytest_runtest_xxx() hook.""" + with catching_logs( + LogCaptureHandler(), formatter=self.formatter, level=self.log_level + ) as log_handler: + if self.log_cli_handler: + self.log_cli_handler.set_when(when) + + if item is None: + yield # run the test + return + + if not hasattr(item, "catch_log_handlers"): + item.catch_log_handlers = {} + item.catch_log_handlers[when] = log_handler + item.catch_log_handler = log_handler + try: + yield # run test + finally: + if when == "teardown": + del item.catch_log_handler + del item.catch_log_handlers + + if self.print_logs: + # Add a captured log section to the report. + log = log_handler.stream.getvalue().strip() + item.add_report_section(when, "log", log) + + @pytest.hookimpl(hookwrapper=True) + def pytest_runtest_setup(self, item): + with self._runtest_for(item, "setup"): + yield + + @pytest.hookimpl(hookwrapper=True) + def pytest_runtest_call(self, item): + with self._runtest_for(item, "call"): + yield + + @pytest.hookimpl(hookwrapper=True) + def pytest_runtest_teardown(self, item): + with self._runtest_for(item, "teardown"): + yield + + @pytest.hookimpl(hookwrapper=True) + def pytest_runtest_logstart(self): + if self.log_cli_handler: + self.log_cli_handler.reset() + with self._runtest_for(None, "start"): + yield + + @pytest.hookimpl(hookwrapper=True) + def pytest_runtest_logfinish(self): + with self._runtest_for(None, "finish"): + yield + + @pytest.hookimpl(hookwrapper=True) + def pytest_runtestloop(self, session): + """Runs all collected test items.""" + with self.live_logs_context(): + if self.log_file_handler is not None: + with catching_logs(self.log_file_handler, level=self.log_file_level): + yield # run all the tests + else: + yield # run all the tests + + def _setup_cli_logging(self): + """Sets up the handler and logger for the Live Logs feature, if enabled.""" + terminal_reporter = self._config.pluginmanager.get_plugin("terminalreporter") + if self._log_cli_enabled() and terminal_reporter is not None: + capture_manager = self._config.pluginmanager.get_plugin("capturemanager") + log_cli_handler = _LiveLoggingStreamHandler( + terminal_reporter, capture_manager + ) + log_cli_format = get_option_ini( + self._config, "log_cli_format", "log_format" + ) + log_cli_date_format = get_option_ini( + self._config, "log_cli_date_format", "log_date_format" + ) + if ( + self._config.option.color != "no" + and ColoredLevelFormatter.LEVELNAME_FMT_REGEX.search(log_cli_format) + ): + log_cli_formatter = ColoredLevelFormatter( + create_terminal_writer(self._config), + log_cli_format, + datefmt=log_cli_date_format, + ) + else: + log_cli_formatter = logging.Formatter( + log_cli_format, datefmt=log_cli_date_format + ) + log_cli_level = get_actual_log_level( + self._config, "log_cli_level", "log_level" + ) + self.log_cli_handler = log_cli_handler + self.live_logs_context = lambda: catching_logs( + log_cli_handler, formatter=log_cli_formatter, level=log_cli_level + ) + else: + self.live_logs_context = lambda: dummy_context_manager() + # Note that the lambda for the live_logs_context is needed because + # live_logs_context can otherwise not be entered multiple times due + # to limitations of contextlib.contextmanager + + +class _LiveLoggingStreamHandler(logging.StreamHandler): + """ + Custom StreamHandler used by the live logging feature: it will write a newline before the first log message + in each test. + + During live logging we must also explicitly disable stdout/stderr capturing otherwise it will get captured + and won't appear in the terminal. + """ + + def __init__(self, terminal_reporter, capture_manager): + """ + :param _pytest.terminal.TerminalReporter terminal_reporter: + :param _pytest.capture.CaptureManager capture_manager: + """ + logging.StreamHandler.__init__(self, stream=terminal_reporter) + self.capture_manager = capture_manager + self.reset() + self.set_when(None) + self._test_outcome_written = False + + def reset(self): + """Reset the handler; should be called before the start of each test""" + self._first_record_emitted = False + + def set_when(self, when): + """Prepares for the given test phase (setup/call/teardown)""" + self._when = when + self._section_name_shown = False + if when == "start": + self._test_outcome_written = False + + def emit(self, record): + ctx_manager = ( + self.capture_manager.global_and_fixture_disabled() + if self.capture_manager + else dummy_context_manager() + ) + with ctx_manager: + if not self._first_record_emitted: + self.stream.write("\n") + self._first_record_emitted = True + elif self._when in ("teardown", "finish"): + if not self._test_outcome_written: + self._test_outcome_written = True + self.stream.write("\n") + if not self._section_name_shown and self._when: + self.stream.section("live log " + self._when, sep="-", bold=True) + self._section_name_shown = True + logging.StreamHandler.emit(self, record) diff --git a/venv/Lib/site-packages/_pytest/main.py b/venv/Lib/site-packages/_pytest/main.py new file mode 100644 index 00000000..8d4176ae --- /dev/null +++ b/venv/Lib/site-packages/_pytest/main.py @@ -0,0 +1,669 @@ +""" core implementation of testing process: init, session, runtest loop. """ +from __future__ import absolute_import, division, print_function + +import contextlib +import functools +import os +import pkgutil +import six +import sys + +import _pytest +from _pytest import nodes +import _pytest._code +import py + +from _pytest.config import directory_arg, UsageError, hookimpl +from _pytest.outcomes import exit +from _pytest.runner import collect_one_node + + +# exitcodes for the command line +EXIT_OK = 0 +EXIT_TESTSFAILED = 1 +EXIT_INTERRUPTED = 2 +EXIT_INTERNALERROR = 3 +EXIT_USAGEERROR = 4 +EXIT_NOTESTSCOLLECTED = 5 + + +def pytest_addoption(parser): + parser.addini( + "norecursedirs", + "directory patterns to avoid for recursion", + type="args", + default=[".*", "build", "dist", "CVS", "_darcs", "{arch}", "*.egg", "venv"], + ) + parser.addini( + "testpaths", + "directories to search for tests when no files or directories are given in the " + "command line.", + type="args", + default=[], + ) + # parser.addini("dirpatterns", + # "patterns specifying possible locations of test files", + # type="linelist", default=["**/test_*.txt", + # "**/test_*.py", "**/*_test.py"] + # ) + group = parser.getgroup("general", "running and selection options") + group._addoption( + "-x", + "--exitfirst", + action="store_const", + dest="maxfail", + const=1, + help="exit instantly on first error or failed test.", + ), + group._addoption( + "--maxfail", + metavar="num", + action="store", + type=int, + dest="maxfail", + default=0, + help="exit after first num failures or errors.", + ) + group._addoption( + "--strict", + action="store_true", + help="marks not registered in configuration file raise errors.", + ) + group._addoption( + "-c", + metavar="file", + type=str, + dest="inifilename", + help="load configuration from `file` instead of trying to locate one of the implicit " + "configuration files.", + ) + group._addoption( + "--continue-on-collection-errors", + action="store_true", + default=False, + dest="continue_on_collection_errors", + help="Force test execution even if collection errors occur.", + ) + group._addoption( + "--rootdir", + action="store", + dest="rootdir", + help="Define root directory for tests. Can be relative path: 'root_dir', './root_dir', " + "'root_dir/another_dir/'; absolute path: '/home/user/root_dir'; path with variables: " + "'$HOME/root_dir'.", + ) + + group = parser.getgroup("collect", "collection") + group.addoption( + "--collectonly", + "--collect-only", + action="store_true", + help="only collect tests, don't execute them.", + ), + group.addoption( + "--pyargs", + action="store_true", + help="try to interpret all arguments as python packages.", + ) + group.addoption( + "--ignore", + action="append", + metavar="path", + help="ignore path during collection (multi-allowed).", + ) + group.addoption( + "--deselect", + action="append", + metavar="nodeid_prefix", + help="deselect item during collection (multi-allowed).", + ) + # when changing this to --conf-cut-dir, config.py Conftest.setinitial + # needs upgrading as well + group.addoption( + "--confcutdir", + dest="confcutdir", + default=None, + metavar="dir", + type=functools.partial(directory_arg, optname="--confcutdir"), + help="only load conftest.py's relative to specified dir.", + ) + group.addoption( + "--noconftest", + action="store_true", + dest="noconftest", + default=False, + help="Don't load any conftest.py files.", + ) + group.addoption( + "--keepduplicates", + "--keep-duplicates", + action="store_true", + dest="keepduplicates", + default=False, + help="Keep duplicate tests.", + ) + group.addoption( + "--collect-in-virtualenv", + action="store_true", + dest="collect_in_virtualenv", + default=False, + help="Don't ignore tests in a local virtualenv directory", + ) + + group = parser.getgroup("debugconfig", "test session debugging and configuration") + group.addoption( + "--basetemp", + dest="basetemp", + default=None, + metavar="dir", + help=( + "base temporary directory for this test run." + "(warning: this directory is removed if it exists)" + ), + ) + + +def pytest_configure(config): + __import__("pytest").config = config # compatibility + + +def wrap_session(config, doit): + """Skeleton command line program""" + session = Session(config) + session.exitstatus = EXIT_OK + initstate = 0 + try: + try: + config._do_configure() + initstate = 1 + config.hook.pytest_sessionstart(session=session) + initstate = 2 + session.exitstatus = doit(config, session) or 0 + except UsageError: + raise + except Failed: + session.exitstatus = EXIT_TESTSFAILED + except KeyboardInterrupt: + excinfo = _pytest._code.ExceptionInfo() + exitstatus = EXIT_INTERRUPTED + if initstate <= 2 and isinstance(excinfo.value, exit.Exception): + sys.stderr.write("{}: {}\n".format(excinfo.typename, excinfo.value.msg)) + if excinfo.value.returncode is not None: + exitstatus = excinfo.value.returncode + config.hook.pytest_keyboard_interrupt(excinfo=excinfo) + session.exitstatus = exitstatus + except: # noqa + excinfo = _pytest._code.ExceptionInfo() + config.notify_exception(excinfo, config.option) + session.exitstatus = EXIT_INTERNALERROR + if excinfo.errisinstance(SystemExit): + sys.stderr.write("mainloop: caught Spurious SystemExit!\n") + + finally: + excinfo = None # Explicitly break reference cycle. + session.startdir.chdir() + if initstate >= 2: + config.hook.pytest_sessionfinish( + session=session, exitstatus=session.exitstatus + ) + config._ensure_unconfigure() + return session.exitstatus + + +def pytest_cmdline_main(config): + return wrap_session(config, _main) + + +def _main(config, session): + """ default command line protocol for initialization, session, + running tests and reporting. """ + config.hook.pytest_collection(session=session) + config.hook.pytest_runtestloop(session=session) + + if session.testsfailed: + return EXIT_TESTSFAILED + elif session.testscollected == 0: + return EXIT_NOTESTSCOLLECTED + + +def pytest_collection(session): + return session.perform_collect() + + +def pytest_runtestloop(session): + if session.testsfailed and not session.config.option.continue_on_collection_errors: + raise session.Interrupted("%d errors during collection" % session.testsfailed) + + if session.config.option.collectonly: + return True + + for i, item in enumerate(session.items): + nextitem = session.items[i + 1] if i + 1 < len(session.items) else None + item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem) + if session.shouldfail: + raise session.Failed(session.shouldfail) + if session.shouldstop: + raise session.Interrupted(session.shouldstop) + return True + + +def _in_venv(path): + """Attempts to detect if ``path`` is the root of a Virtual Environment by + checking for the existence of the appropriate activate script""" + bindir = path.join("Scripts" if sys.platform.startswith("win") else "bin") + if not bindir.isdir(): + return False + activates = ( + "activate", + "activate.csh", + "activate.fish", + "Activate", + "Activate.bat", + "Activate.ps1", + ) + return any([fname.basename in activates for fname in bindir.listdir()]) + + +def pytest_ignore_collect(path, config): + ignore_paths = config._getconftest_pathlist("collect_ignore", path=path.dirpath()) + ignore_paths = ignore_paths or [] + excludeopt = config.getoption("ignore") + if excludeopt: + ignore_paths.extend([py.path.local(x) for x in excludeopt]) + + if py.path.local(path) in ignore_paths: + return True + + allow_in_venv = config.getoption("collect_in_virtualenv") + if _in_venv(path) and not allow_in_venv: + return True + + # Skip duplicate paths. + keepduplicates = config.getoption("keepduplicates") + duplicate_paths = config.pluginmanager._duplicatepaths + if not keepduplicates: + if path in duplicate_paths: + return True + else: + duplicate_paths.add(path) + + return False + + +def pytest_collection_modifyitems(items, config): + deselect_prefixes = tuple(config.getoption("deselect") or []) + if not deselect_prefixes: + return + + remaining = [] + deselected = [] + for colitem in items: + if colitem.nodeid.startswith(deselect_prefixes): + deselected.append(colitem) + else: + remaining.append(colitem) + + if deselected: + config.hook.pytest_deselected(items=deselected) + items[:] = remaining + + +@contextlib.contextmanager +def _patched_find_module(): + """Patch bug in pkgutil.ImpImporter.find_module + + When using pkgutil.find_loader on python<3.4 it removes symlinks + from the path due to a call to os.path.realpath. This is not consistent + with actually doing the import (in these versions, pkgutil and __import__ + did not share the same underlying code). This can break conftest + discovery for pytest where symlinks are involved. + + The only supported python<3.4 by pytest is python 2.7. + """ + if six.PY2: # python 3.4+ uses importlib instead + + def find_module_patched(self, fullname, path=None): + # Note: we ignore 'path' argument since it is only used via meta_path + subname = fullname.split(".")[-1] + if subname != fullname and self.path is None: + return None + if self.path is None: + path = None + else: + # original: path = [os.path.realpath(self.path)] + path = [self.path] + try: + file, filename, etc = pkgutil.imp.find_module(subname, path) + except ImportError: + return None + return pkgutil.ImpLoader(fullname, file, filename, etc) + + old_find_module = pkgutil.ImpImporter.find_module + pkgutil.ImpImporter.find_module = find_module_patched + try: + yield + finally: + pkgutil.ImpImporter.find_module = old_find_module + else: + yield + + +class FSHookProxy(object): + def __init__(self, fspath, pm, remove_mods): + self.fspath = fspath + self.pm = pm + self.remove_mods = remove_mods + + def __getattr__(self, name): + x = self.pm.subset_hook_caller(name, remove_plugins=self.remove_mods) + self.__dict__[name] = x + return x + + +class NoMatch(Exception): + """ raised if matching cannot locate a matching names. """ + + +class Interrupted(KeyboardInterrupt): + """ signals an interrupted test run. """ + + __module__ = "builtins" # for py3 + + +class Failed(Exception): + """ signals a stop as failed test run. """ + + +class Session(nodes.FSCollector): + Interrupted = Interrupted + Failed = Failed + + def __init__(self, config): + nodes.FSCollector.__init__( + self, config.rootdir, parent=None, config=config, session=self, nodeid="" + ) + self.testsfailed = 0 + self.testscollected = 0 + self.shouldstop = False + self.shouldfail = False + self.trace = config.trace.root.get("collection") + self._norecursepatterns = config.getini("norecursedirs") + self.startdir = py.path.local() + self._initialpaths = frozenset() + # Keep track of any collected nodes in here, so we don't duplicate fixtures + self._node_cache = {} + + self.config.pluginmanager.register(self, name="session") + + @hookimpl(tryfirst=True) + def pytest_collectstart(self): + if self.shouldfail: + raise self.Failed(self.shouldfail) + if self.shouldstop: + raise self.Interrupted(self.shouldstop) + + @hookimpl(tryfirst=True) + def pytest_runtest_logreport(self, report): + if report.failed and not hasattr(report, "wasxfail"): + self.testsfailed += 1 + maxfail = self.config.getvalue("maxfail") + if maxfail and self.testsfailed >= maxfail: + self.shouldfail = "stopping after %d failures" % (self.testsfailed) + + pytest_collectreport = pytest_runtest_logreport + + def isinitpath(self, path): + return path in self._initialpaths + + def gethookproxy(self, fspath): + # check if we have the common case of running + # hooks with all conftest.py files + pm = self.config.pluginmanager + my_conftestmodules = pm._getconftestmodules(fspath) + remove_mods = pm._conftest_plugins.difference(my_conftestmodules) + if remove_mods: + # one or more conftests are not in use at this fspath + proxy = FSHookProxy(fspath, pm, remove_mods) + else: + # all plugis are active for this fspath + proxy = self.config.hook + return proxy + + def perform_collect(self, args=None, genitems=True): + hook = self.config.hook + try: + items = self._perform_collect(args, genitems) + self.config.pluginmanager.check_pending() + hook.pytest_collection_modifyitems( + session=self, config=self.config, items=items + ) + finally: + hook.pytest_collection_finish(session=self) + self.testscollected = len(items) + return items + + def _perform_collect(self, args, genitems): + if args is None: + args = self.config.args + self.trace("perform_collect", self, args) + self.trace.root.indent += 1 + self._notfound = [] + initialpaths = [] + self._initialparts = [] + self.items = items = [] + for arg in args: + parts = self._parsearg(arg) + self._initialparts.append(parts) + initialpaths.append(parts[0]) + self._initialpaths = frozenset(initialpaths) + rep = collect_one_node(self) + self.ihook.pytest_collectreport(report=rep) + self.trace.root.indent -= 1 + if self._notfound: + errors = [] + for arg, exc in self._notfound: + line = "(no name %r in any of %r)" % (arg, exc.args[0]) + errors.append("not found: %s\n%s" % (arg, line)) + # XXX: test this + raise UsageError(*errors) + if not genitems: + return rep.result + else: + if rep.passed: + for node in rep.result: + self.items.extend(self.genitems(node)) + return items + + def collect(self): + for parts in self._initialparts: + arg = "::".join(map(str, parts)) + self.trace("processing argument", arg) + self.trace.root.indent += 1 + try: + for x in self._collect(arg): + yield x + except NoMatch: + # we are inside a make_report hook so + # we cannot directly pass through the exception + self._notfound.append((arg, sys.exc_info()[1])) + + self.trace.root.indent -= 1 + + def _collect(self, arg): + from _pytest.python import Package + + names = self._parsearg(arg) + argpath = names.pop(0).realpath() + paths = [] + + root = self + # Start with a Session root, and delve to argpath item (dir or file) + # and stack all Packages found on the way. + # No point in finding packages when collecting doctests + if not self.config.option.doctestmodules: + for parent in argpath.parts(): + pm = self.config.pluginmanager + if pm._confcutdir and pm._confcutdir.relto(parent): + continue + + if parent.isdir(): + pkginit = parent.join("__init__.py") + if pkginit.isfile(): + if pkginit in self._node_cache: + root = self._node_cache[pkginit][0] + else: + col = root._collectfile(pkginit) + if col: + if isinstance(col[0], Package): + root = col[0] + # always store a list in the cache, matchnodes expects it + self._node_cache[root.fspath] = [root] + + # If it's a directory argument, recurse and look for any Subpackages. + # Let the Package collector deal with subnodes, don't collect here. + if argpath.check(dir=1): + assert not names, "invalid arg %r" % (arg,) + for path in argpath.visit( + fil=lambda x: x.check(file=1), rec=self._recurse, bf=True, sort=True + ): + pkginit = path.dirpath().join("__init__.py") + if pkginit.exists() and not any(x in pkginit.parts() for x in paths): + for x in root._collectfile(pkginit): + yield x + paths.append(x.fspath.dirpath()) + + if not any(x in path.parts() for x in paths): + for x in root._collectfile(path): + if (type(x), x.fspath) in self._node_cache: + yield self._node_cache[(type(x), x.fspath)] + else: + self._node_cache[(type(x), x.fspath)] = x + yield x + else: + assert argpath.check(file=1) + + if argpath in self._node_cache: + col = self._node_cache[argpath] + else: + col = root._collectfile(argpath) + if col: + self._node_cache[argpath] = col + for y in self.matchnodes(col, names): + yield y + + def _collectfile(self, path): + ihook = self.gethookproxy(path) + if not self.isinitpath(path): + if ihook.pytest_ignore_collect(path=path, config=self.config): + return () + return ihook.pytest_collect_file(path=path, parent=self) + + def _recurse(self, path): + ihook = self.gethookproxy(path.dirpath()) + if ihook.pytest_ignore_collect(path=path, config=self.config): + return + for pat in self._norecursepatterns: + if path.check(fnmatch=pat): + return False + ihook = self.gethookproxy(path) + ihook.pytest_collect_directory(path=path, parent=self) + return True + + def _tryconvertpyarg(self, x): + """Convert a dotted module name to path.""" + try: + with _patched_find_module(): + loader = pkgutil.find_loader(x) + except ImportError: + return x + if loader is None: + return x + # This method is sometimes invoked when AssertionRewritingHook, which + # does not define a get_filename method, is already in place: + try: + with _patched_find_module(): + path = loader.get_filename(x) + except AttributeError: + # Retrieve path from AssertionRewritingHook: + path = loader.modules[x][0].co_filename + if loader.is_package(x): + path = os.path.dirname(path) + return path + + def _parsearg(self, arg): + """ return (fspath, names) tuple after checking the file exists. """ + parts = str(arg).split("::") + if self.config.option.pyargs: + parts[0] = self._tryconvertpyarg(parts[0]) + relpath = parts[0].replace("/", os.sep) + path = self.config.invocation_dir.join(relpath, abs=True) + if not path.check(): + if self.config.option.pyargs: + raise UsageError( + "file or package not found: " + arg + " (missing __init__.py?)" + ) + raise UsageError("file not found: " + arg) + parts[0] = path + return parts + + def matchnodes(self, matching, names): + self.trace("matchnodes", matching, names) + self.trace.root.indent += 1 + nodes = self._matchnodes(matching, names) + num = len(nodes) + self.trace("matchnodes finished -> ", num, "nodes") + self.trace.root.indent -= 1 + if num == 0: + raise NoMatch(matching, names[:1]) + return nodes + + def _matchnodes(self, matching, names): + if not matching or not names: + return matching + name = names[0] + assert name + nextnames = names[1:] + resultnodes = [] + for node in matching: + if isinstance(node, nodes.Item): + if not names: + resultnodes.append(node) + continue + assert isinstance(node, nodes.Collector) + key = (type(node), node.nodeid) + if key in self._node_cache: + rep = self._node_cache[key] + else: + rep = collect_one_node(node) + self._node_cache[key] = rep + if rep.passed: + has_matched = False + for x in rep.result: + # TODO: remove parametrized workaround once collection structure contains parametrization + if x.name == name or x.name.split("[")[0] == name: + resultnodes.extend(self.matchnodes([x], nextnames)) + has_matched = True + # XXX accept IDs that don't have "()" for class instances + if not has_matched and len(rep.result) == 1 and x.name == "()": + nextnames.insert(0, name) + resultnodes.extend(self.matchnodes([x], nextnames)) + else: + # report collection failures here to avoid failing to run some test + # specified in the command line because the module could not be + # imported (#134) + node.ihook.pytest_collectreport(report=rep) + return resultnodes + + def genitems(self, node): + self.trace("genitems", node) + if isinstance(node, nodes.Item): + node.ihook.pytest_itemcollected(item=node) + yield node + else: + assert isinstance(node, nodes.Collector) + rep = collect_one_node(node) + if rep.passed: + for subnode in rep.result: + for x in self.genitems(subnode): + yield x + node.ihook.pytest_collectreport(report=rep) diff --git a/venv/Lib/site-packages/_pytest/mark/__init__.py b/venv/Lib/site-packages/_pytest/mark/__init__.py new file mode 100644 index 00000000..39005742 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/mark/__init__.py @@ -0,0 +1,169 @@ +""" generic mechanism for marking and selecting python functions. """ +from __future__ import absolute_import, division, print_function +from _pytest.config import UsageError +from .structures import ( + ParameterSet, + EMPTY_PARAMETERSET_OPTION, + MARK_GEN, + Mark, + MarkInfo, + MarkDecorator, + MarkGenerator, + transfer_markers, + get_empty_parameterset_mark, +) +from .legacy import matchkeyword, matchmark + +__all__ = [ + "Mark", + "MarkInfo", + "MarkDecorator", + "MarkGenerator", + "transfer_markers", + "get_empty_parameterset_mark", +] + + +def param(*values, **kw): + """Specify a parameter in `pytest.mark.parametrize`_ calls or + :ref:`parametrized fixtures `. + + .. code-block:: python + + @pytest.mark.parametrize("test_input,expected", [ + ("3+5", 8), + pytest.param("6*9", 42, marks=pytest.mark.xfail), + ]) + def test_eval(test_input, expected): + assert eval(test_input) == expected + + :param values: variable args of the values of the parameter set, in order. + :keyword marks: a single mark or a list of marks to be applied to this parameter set. + :keyword str id: the id to attribute to this parameter set. + """ + return ParameterSet.param(*values, **kw) + + +def pytest_addoption(parser): + group = parser.getgroup("general") + group._addoption( + "-k", + action="store", + dest="keyword", + default="", + metavar="EXPRESSION", + help="only run tests which match the given substring expression. " + "An expression is a python evaluatable expression " + "where all names are substring-matched against test names " + "and their parent classes. Example: -k 'test_method or test_" + "other' matches all test functions and classes whose name " + "contains 'test_method' or 'test_other', while -k 'not test_method' " + "matches those that don't contain 'test_method' in their names. " + "Additionally keywords are matched to classes and functions " + "containing extra names in their 'extra_keyword_matches' set, " + "as well as functions which have names assigned directly to them.", + ) + + group._addoption( + "-m", + action="store", + dest="markexpr", + default="", + metavar="MARKEXPR", + help="only run tests matching given mark expression. " + "example: -m 'mark1 and not mark2'.", + ) + + group.addoption( + "--markers", + action="store_true", + help="show markers (builtin, plugin and per-project ones).", + ) + + parser.addini("markers", "markers for test functions", "linelist") + parser.addini(EMPTY_PARAMETERSET_OPTION, "default marker for empty parametersets") + + +def pytest_cmdline_main(config): + import _pytest.config + + if config.option.markers: + config._do_configure() + tw = _pytest.config.create_terminal_writer(config) + for line in config.getini("markers"): + parts = line.split(":", 1) + name = parts[0] + rest = parts[1] if len(parts) == 2 else "" + tw.write("@pytest.mark.%s:" % name, bold=True) + tw.line(rest) + tw.line() + config._ensure_unconfigure() + return 0 + + +pytest_cmdline_main.tryfirst = True + + +def deselect_by_keyword(items, config): + keywordexpr = config.option.keyword.lstrip() + if keywordexpr.startswith("-"): + keywordexpr = "not " + keywordexpr[1:] + selectuntil = False + if keywordexpr[-1:] == ":": + selectuntil = True + keywordexpr = keywordexpr[:-1] + + remaining = [] + deselected = [] + for colitem in items: + if keywordexpr and not matchkeyword(colitem, keywordexpr): + deselected.append(colitem) + else: + if selectuntil: + keywordexpr = None + remaining.append(colitem) + + if deselected: + config.hook.pytest_deselected(items=deselected) + items[:] = remaining + + +def deselect_by_mark(items, config): + matchexpr = config.option.markexpr + if not matchexpr: + return + + remaining = [] + deselected = [] + for item in items: + if matchmark(item, matchexpr): + remaining.append(item) + else: + deselected.append(item) + + if deselected: + config.hook.pytest_deselected(items=deselected) + items[:] = remaining + + +def pytest_collection_modifyitems(items, config): + deselect_by_keyword(items, config) + deselect_by_mark(items, config) + + +def pytest_configure(config): + config._old_mark_config = MARK_GEN._config + if config.option.strict: + MARK_GEN._config = config + + empty_parameterset = config.getini(EMPTY_PARAMETERSET_OPTION) + + if empty_parameterset not in ("skip", "xfail", "fail_at_collect", None, ""): + raise UsageError( + "{!s} must be one of skip, xfail or fail_at_collect" + " but it is {!r}".format(EMPTY_PARAMETERSET_OPTION, empty_parameterset) + ) + + +def pytest_unconfigure(config): + MARK_GEN._config = getattr(config, "_old_mark_config", None) diff --git a/venv/Lib/site-packages/_pytest/mark/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/_pytest/mark/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cd620510ab03733ebeea048fdec3f7c38f61e3a GIT binary patch literal 4769 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/mark/__pycache__/evaluate.cpython-37.pyc b/venv/Lib/site-packages/_pytest/mark/__pycache__/evaluate.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3c2669e4e7a065a6f1590ef4924bc28fc23ca65 GIT binary patch literal 3528 zcmaJ^&vVT<`{i%0Ut;WE)H!`@G;ZV7yC@`+JZ9~(=522JqAg5qwJlTIZCeUy#g&26b_Qa{jJ$-qL9aZwm4*LvBLbyt+sQTffAnpd;2chCPv#_b(kO?uHj zc0C-bg3Go$`>gHJi20Ns{++31tbg9Qd$aS24wdfQzq7sl(I4K~ytlQ}xicKz3$mc| zi?kcWo!xLS>IJzdmrz&bCAo~cCfDVvy!?c>>vBzA!N{Uq0W2HE;(Z9eRmz^K zIYUSgB9dXqt7zmLya1NO4pWL;pbe^G8{TT#g&k$#pm2P$h6YMh19YnVBp8HEtFUz# z_tYA;D{LAvSd_&I4SK#GB~j-4SJBhNPzICHZ?b+)&dt+>U1AbFRFlv~;5r&a>0^Gv zrsNwC5FW9YrZFVi53^FpCRcROOQfKczW*8~HCcg)7tb%3{QvXGrRroL(JHL)u!{pp zsjoWsai9T2BwwGO`-0x5OU|83vBl_3mLAU`ZsRw(eqP+O zi|2+U!O2&RAwNfB?2*VP5EK!RBLe=VjDVRqwob?o?5qMK+Y(VSbEZOlCdufg-*=_8 z!PXG4H`qQuf}+QstekMplC^B1PtnyzkazwluCYI}Bc9cyi?KT1Md=+cEUaA>0C&Bjc-hBkwW^qRb3<{GmY6(#$P z8>&HJG1NLrlWGIc4PCvV3ts)O$=fa>oC;w0ONHwbT}Gjz(+W$Eb%B7|g`@UTWdQjW zP1MfFP&jF?rvaf842NMNiv_dUUeG-#uHdUdkonjm9A-G%Pm_48h$@DFYLRxc`)QOk zg+aZr273P@;7%#j+gPm0hZzE^hrn9p%lta8i#7BG%E{UV=#4JtK&RWrfc{-HGC-Xf z-ytCXY6BVq*^=O?+60Ua_4;n#BQSG{Efxhok!tlFd|!COILJsxMM0>r(!G9jL46Nx zGq1i+E%H+{Z^A+0jD`|7hx!41QS<%%INb|k?fWwes3lr|f$}wqW3!caFh67bDzC!? zlWXVIKC^bNyNi$L?lijp2aVGtKrKT@Xa@QVLv)LDR{th?`~2{q)Vs%i`vuXO+(246 z?^g~S^-HRyb&d7l<%xryb0iM)TwrxZDFar!nU`DS0vzWN&^(#R^h-KMsfCGv4B)UMnp~;3v`-H?v2w?BMC#<$kK)$hTW()Zj^KH z@9h5SqtL82RhZp`=6o4d`+25|LbSlh%@b%k2%C<^D`aiI2f zVN+?mKpDrfbaYtML0fF>XX9b0)lK?{a)&cSG7j_#jeV1f_fa(6(tqp$u3+^O8Ybr| z*LmCf~fM}Xwy{34>_*JL}6~z*ty!wKYXFef&E>Xfod6@4bE%K3uk78=qegEMo zh|3vu9owp}p`g%|z!yT5`o8))4O3pAUZ>(cDhx4+KqU!(My>zR%d{xZQDH+xF5?hQ9!C2Sa^=%=iQ@pS^zA&CCWb ZJH7C3m70D)_o$}WN)$Ffv21yZ{{>BA9^wE1 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/mark/__pycache__/legacy.cpython-37.pyc b/venv/Lib/site-packages/_pytest/mark/__pycache__/legacy.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63362d90f1e6ec772efed3325cafddff014df71b GIT binary patch literal 3438 zcmai0+iu*(8J;1zyIg9$cHA^R)CHzUQ+ZKaaC*3iVHiHeMw(hRAO~t$1vJeWNtC$c zdS+JAZdSR7+!yE*ST_X<^bPs|eFxt5DzD(He*bV+wpAmcG{f1Me}@0*`~JCi=1j!! z{QI~6`RlVDWB;Wei>HOb9W*1+NftB7rC0EnySEp6c>9Gv4B~(@#dlhdm<(j=C6g`H zKJt%v+`&v+b}-YSnK+c8?8<1%kGpb7_Fl3$l4oQe?~AZLUWw7z3Ypr}SUt|{SSusOMoIB}A_}#YW)qQ)auY#vyBaA`S)tXi+EdZ@P@k<1 zcpZIZ(k=D5)|Jj^Zt?gS+(9$f&?yE385tM*DtOg8W^r3}q$mBC3?_w*i7=oIg*)}q z<5cfHPDi7>+?sAa(bZlqp;;=5DoYD7Y*xf(r7_mKN}IVwxm81vW|=Z35_n)wRqSD_ zt;AD3RwCaNc3aJNkw-=lQKelGnFl@TA;qcPM>ChvQDk1S8Gpr&*#oG1=*`&7JK|8) zU(Glq=%MYjZ4J$wN4L#p?Ca=|&-f1eyZ0hkWB+9ES5T%yHSlV0t4tA zZ*F{LV9v(lyN@1y@$IK84?bVpxH}p>K!`T}NXBnGRm0K7C?8$VOJmcbxc=$x-ri@` z_;(wliB-mKB=a|&z0m}5Wi)x+y=9cms^RGNhom8?+h)_NZ+UuUQ&+=;T)1+}IojM_ zIoUMeaSuy6nLB*o*M3%*Iw1KtqS=HjGjGh%A-+*}PfjJL7&4Z5=lS%f@BQ*g6i7d6 zE(!#v8K1Eowo3`ZDewB#e(98HJ`0ZqMirZy0Crl3r6k!>mNZS03s`s7Gd{iWwhnK} ztPY|&Ox(dqQb$QLtmL>*826Io#W*d|;aAt(1}N|_}zL%%{l@ItTGa_Ho5F?o8X-`m<5Qajz92kwY?5{IAIY@EK-M?<1({(RSuSFA84)H z4V2?9xj)-Z^RkX|2M#~+ZWI^Ih$v2 z+n}WhSDLaf?h&UdIfwAiY5qMxa=H957R^WKnAi40ug`n@oZshtKjP@U>BUnaIKlr( z3@DkYxflox;3Z%iJ~{_(T}qjKcJ47O8VC?rk(llFpl}3C@ zS^H&W-|+#t-}&GV7);Jva9qwT@^8kD`H{bdM792Iq#tl(C}-0Tt#6TON4P6oKppyy zlXs+d=zZ(`nf-;8=o@cM?>*IdQ}u=^5(m(9aBaAI0b=Atnr)-lqc~Dg+;UjYs=}3k z>D7qXQE8zLs7M;*r5KJu1J9M%ON(5JCle4{`HR&-s}2;V9BnyA)k|xW(xwOQT7X=( z8ug+xKROPb9yqn;>NHh%ox&vGJVUI=JddB}=eYhg#wQLW5Yws?`xge5y+VmNMtPQ~ zxw{>Gd4^=V1X3YLOYfNLhqNMn8T`$=#31pIBo@Cfu^wa(Za~_1u>R#C+zrtC*!g7U z+ctJQu^riZ71A69;Kh@5HtE?e1rC8}LKY!p|KN=NAl-&EZ=~lT!cAb%NoRoksVFr8 znB(?swmlfInf(#EfcCC&={XVS~XwFOQ+qkW3OcH29$Uwwk$x1P{y54rH34FO{CCE!F;@% zLu9VuAXov7@~v{7-MANt1-Z^mea*!*03yZrlu4`8+f6o$h5MJkIb0UBPS?qi#X->T z4HU?6hHlD;&GPl#<>|-kx`Kb-NSqS5DZV)zEICSOAQFMQwKe;2X5BI)psw!BKVElp zvlw1M4FJj({xAu=SM7tUiRd+zy}FHyFx;eng&%qu-5}5dyyB(#A*58@nO~b@e|KM= zh8_4HZk~&OiM{3uI@XPN=!N_;@YhH4c))wU2R`j{{d=qrdJRp|l~Uh87x(Aa&y}ny zH}kDVL2l}H^?V0`X()ntQU8WIg0ws7Erlo^&D}A))m*%8)0DeZ2gKxF5A`NId+w9S H55xZf603TS literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/mark/__pycache__/structures.cpython-37.pyc b/venv/Lib/site-packages/_pytest/mark/__pycache__/structures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74751d85a49d262e6a830abf64265f791d60e20d GIT binary patch literal 15494 zcmb7LS#TW3d7fjB*#!uKAjCuGh~l*r36YfJ*a*dt5|7XpA%%o2c|~cl*qH?v*o!>_ z5m+s92uvh9rc){V!FJ*VOzb3%Qn^p@{pQTFH*b<(4uwlN0%aP8XLx4QDC?_P zHgRt?t(IN3O+K@mnO3%(m2#$;Yvs#%DVt5F?BIR2S!fl@MLf%S`Q}7xvOL+^Q{E%@ zPIIcYx4gGCU7l|3EANx<3eB0;{_=j5i{)AGoHyZ3J}}Eqcze952S)jTx7VA-_26~G z+vm+ZFuWPx_GY~O+t#*SKIA*AhrL#PoceMyr;cqaDCQ$)_V@u=RDVY9#_{p;=O?D^WIVK7_LX8hvVJ}>EWbTLR+P{ ztryVxDepx*d67@bNByJQM)???p7ze*=^1|?o*s`|IPT3owD9gF?=0S(joUcknYWG7 z`A<0$3neouwyQ1Q3)j0%A9p$Bd+Rlpiq$YwD}EUI3U`@$wbA_4!Z#%=dg|uoTVJib zdHL4mn^zaF-nxBtvGUf!o0nhv>Wzi#(SCV(W8vBxmCK8Zw{E=p*5cKY9px6@SVYBW z0!`L~W~1%5JJICLYPZ{HuiR{GG}`FJZdJQrajP3{R=QOM!q9sq@WV>0s@7`koOfWD6Ki_=qERX=OHx3$J=Ai`!WEX0X zJo)j;=Jw+V4&W3TtNawrJhV*X6KNcu*b9ncOWp)wwYJvuKk%DihjYKG+89L;WmqD& z0>4?uo1Erfl#grt#Q5y}*XHlM75FN+bMx}`>o!>Ydj+wQBRu zA~Sm%4n1amsud=>+9{BP^eErTCow3 zYkc)IyB4-sMN>UT>L^V7P2kAl5bAz_0_VSJw9GA7p}w(Wh4v$JE7Q+_!kjuDW>&LX z+4k$W&#YPM0`7BO*2_IK@$`#$n#a@CzO|a)%7sqf+BWZ4Tlp=gZ|@X5r=ROPb?bof z$o$A`J7KY(*+wa?SJ-mALf_=q{Q_!c4j5a-ezsrqiVvy16R9K?Uh6cQel6@M%#^VJ z$y;l5qwEIN^%^Htt+&g2c~_~1m71>HJARca=B6sa&cDS>*HAG-W-O8NKJG5x+LMkLBmX`)XfIr2A!bIzPJGv>7I;A-J7gTt}ZIn=DNdh(+zUcw<}%s1%! z$`RUS^ z(T}Vx8`@@v*0!ad?b~(8cY9Wz*kLBj*6nR8I3MOdG9k^jmw6yEU&r^~hGh2*NTuD+ zZc|5d3sIKL41`%}*EFX*ZnJBSua9EMT##B25Ub&hvv^u0vEpxps#*&x4euJi6?1R) zP7e=oPHGM;+4zU(r<9NEZl@bT?Ztk!YksunCg{B4*E*^SRf)3V?xIW+mLak+nbFkc z07jYOtYs<}*|la62yd<@rWVuw(bbLHR=%k!5gz%IfbVt%Ij(01O1u#&;?zO9ba67|hTc)nu58evX0 zE}%x1HDGTtJDA-t)6cGEapWjRzhfQ7`_()#$|DoDjL-3GD|_$k+iX1>I{3C17Cyq< zst5fnWFp(os2{*(nrj7KcZ%VJe2dz!ZKh{G6f0f*DQ3Fp#=m*t!N632vGeIm)~UKp zf2CU6bc1lS>5o)&!@Dpdt?H%=Z^TO*rf1p5Co)&3N84$8yHvfefF^tohAiyhJD7pM z?bK0Gt+}1$RanWOm^KsBs_Ch~1=jqE^fXGb-T5r+0&n3*lP97+`VMTYfu? zYiM~%d*PtHPWwdY!icyY1hCcZ1fa2s5iG+}uDNtgkJGj6H#_YWbW!pAIt(Wza~?eM z-A3rQG_&se?)^ryNiM~jL(*7B=7HELaOY91%dLATj}TWb1ksT&o) zMkl0!PYwfWRYL(1>Q#OtL#O=6@1$2J@a#=0-@)%QeFUF zRIF559dEq}gda^-D&(QY`_V+LSq%b&fpKVYxoRJXTr^{pT?||Z(19^6tLGfR-w16#+nsOhXntYJTX>nJhcxR zuoT8BTruvl-!=tsnY|yUmOS=f9SEAzjzRn!L=Wn@O#FVo5#AkCCoyhZn}&Vx22ozu zpLgY9`ZR7NaF;h-?GNZ%sxI|%_mtQXlxRrJ#pt=g+uruD(aBZnTCM%W=QDVNR@?BQAY}2M_pBB%NdCbt;RCo zU8poUBtp7ZODydsKP2|MIJErOla_-&na~=Zra#)%OE`kNI3*I|nPuBYREQ(DllPrR zz+RA+f?q^jYnCT)MU+>b#1#&pyvLtPvHV^S@g5{-+ADe!xbE{Ny*;?jcvIe9T=#p^ zkgR>;q^th}T<=~MFd=AG;&-BmG$PYeB#%UYkQs2@x9|FGPGz&q$ZWcI5s#tUK*N(YfAfAv zd4YSu-#};BS|DMA$_N#sSxmXm~uAgqD;t06qbQmBd}0ERAB)E=;24hMv<= zvQmD!jR2G(I{-us?AZZ>>6Plp0d(#|Uz0}9&AB(~Nlj{;TTQ^Nh=iV1K6avY_2b>36H1m(+;`A+1Zh8zNhP^x0j|(+HU;OZ=to4bZv~4jKb)hF~O2 zT@O3(ehm(5lb_)#yaM?F+N*cgK?@QY5==;Y3HCkz`J+tu{EG~9Kv)~S|H1>U${bOx zVy%kDJZLT<;xz1cJFEio)82A;n6re{;6xMJ>M?-oAXCdw$5(CPMx#AwjNjZGRMLQPOb-%&L>cJJJyEYh0YQ;YG9m~$A(Ao_jy2}|IZi6f!MbYm zBf$94-UlKn;zjB@ssaB|Z4PK2q4xwt7i?f$wchn$o;-19W6Yo;;Elko#=!jug>za% z7CIq(+ah{Yz!#uyx$^3O{__-wi&7C(h4Ba>##lWJh<~zi`LuXF{$3r z6>$LKmDZ^zlzF!Sa|>+WgORIG~DRF|9nOCr>RHsS55*%~3H4d55WEh%q<*`cw6Fq*l0Kx~HWkVCZ;+6b-9;5_nNOE|6oZeuBF=PHCk^^)uaO6@~^jFa4eYAuRKp%e7QPy@^xFiSoczh(AIU0+|!F z$hTbc;QAHZhvdU$o}wr8gE%R}mPwc*yv6*Ac^FI|bL(ZN5$LHN(^W;)=i*|(X*G}l zcaR7@gphCw*%*d~00Qx z=roS_5AqpJn(}$7^Tg2!xkEz`sU+oswSS6&jKg_8gH*1h_pQl{W8-f^YNTRFYeRJx zi*pnOs=8;c7*KSWL8Ne*NqV|(t}u6m7;l^6WA!eHB6XJO@w8-pCX`_ML|}Fsy&0QwPlrL!u~e%1x=t=ne7VmH%RZ;Xdn_NB2R`G zAj&wyC69y<`7rny+Lfrt$RMeP^$n%)Bpp5_FEzMKfX68_gK03)lWz&NDLH|R53nOf z$@H~%{U)%7pk)zmJ<1sC&PxQ#=R)$l`#Og5?ptk0{<}Bv^t5>M6m!4#p7b{#N4HX$ z)%4?(ZqiJrcpFE+pjEPD)0iUI5f8_9nsQ3K133(5^*SzE-bO8%-aKA&Y`3L zlfotDE!hizeF0wy5vX%91$zY?{hp2)4qz57Sz!*#BJX4I152^YvU;-Q(YqE0%ygsi zas~x!2;9S)A`I!SV^QEPlJx+xIw6=KN8w5DSuU=ANP&J{Z3#pMvS(sZJN_7sFt?Gi zE-EY{S0kA~^))h0w4Gv$)zg@U$bsP&NsIDWfRQ|i16LxCfVybCh1uoY-A>c<)wrzD zhaM!;Y4#1QUQHvJP9r{zL-B38W=`MBgVP#tF<|41^o(^2$?j8I_Qp}L5ndK|hv0ny z!LZJ41&5gGV#ze_9eUfiSA080g}t8%XGH80Ub$EjYzM&CkSQVyupGNCV&kD1t#gN? zFQg$^2ud3od`RDxpnZ*V5=rNrwrGj(?zGbPU+XV zlt%l5PLlx!_9jU502vq~AepC80v0ecREa1r^W=NN=u$Sy^K%$N$?al;4Dz6#r!LWS z!Ykc|3XXCbnF=)uToJ+aeTedi{_rjJD4=uPJcJ2@7JY&V`2?P86^n{n7FHu>Ge&5w z71e1IOS{kn0Qq-}(Eb>RS{8}p^$s!hSwPrZaWJ^3)&Y3x?mR~^&x}M8z*6p$sBWG& z^QYZw*qjn4DG7iyE?P`r>|M!2vNicuNo#Rp01Bq1gNnzA(fP0j5Lg@-a%RM<0{GCW z!iOSY(_KVPl1?05k04)OCU2-=SUiDSz-A!H*?tXNxMz83Ak{~W*eOIA%2%wuTDj;{ zKPy~V@!S4JS6#f2Sn`a~dorHyA&-z$OT4-0_ta(VaA_>Bhw(yyjlg|Gn+s&IG?q9L zv8aM&Hqige?37z6jI0GbHbocC=iDWdVQ5q1yW~focnL@FZJZvA{9KL9oEbgXBL!={zlbKhNG~7~}hd@4*@ibBl zA7IhnSE)gxH{mLj7__q}Y@Fgs-g`$FMqtwf^dZR6x9lK%U|_JFtl8yY#NycU?9JE| zV_B96JP<+$ou78a^3&>{{1E5Thzs;8O$cI+fn_(|q z7LdFLdYWN7gQt=L*_&wcT$~0Wz~hfs9x^DZ0sZ}oM&Zfc6iY9l?S@3w@kN=$OMBK3 z`H8npA>|1BCh;Al1--5603W%By^?znyuj(lUN$}7VncRipu{Whr`?-F-KRN+;em2; zWT15R=$a9*Kp2!Qh%U-Nfe>RsfoCPs97<89S-O=5QwC(LAR5imIhXVQFAC;;c05!}&BsesL1f1;7!QBL~_homp;Wu?cUKkmN3a*dDGQ4sVh?J{S zvJV7;iJLP_ia_r(igO|+L~&MSB%dd@l?t>BNuPSk`{Aii-Y%35j76@h#g?l)E%U@! zOtZ{m>34C8^4GA}siQWPFi?V4I^*%k^<6#_LhCG%k?NZ~4MGGdiJ_-q{8iHWGztz@ zWhbqvBKMwU%o)UO_|xHQR>ogLrSwPnxr8G)iqo*g_pCDZJYpx9QHFi@a=60&Lvr$Z zTh(=VHCg7UoVuaYmu!s0MstB;z>g%MjQCAlgDBV0km?kpG)Y-ld1lgTbH6Cez3 z2-{E^fNL6lE$B4R92)7JqLoFE%}lM{q_FVDB2o!euu8NX>m`8Jh}L|K8nWs)@f}bo zd?R;M<|f8 z+9@B1JE#R>z5WP=%^5@#uwdA8J52{0gHaP;^tcA2U&rQdfKh83u^_CPv1M&s!xzY^ zda!eF-d{wf)!xZ+mHv_CWsnoZF5aEoBYmYzC(pA8_VWEKgS~sNzKuDMp7ZK^q2pl- z4(+Cw$EF)ZF5>J93sIha4=nu5oR`d-F#j|2WbbL(cG<;Ng+W?DvI1)aI;-O=fUa^L zqKWN}KK5`r31AoQt6#ym)kB_+^K=_0Y^#;6Igt%(sVFJpGqBPwCRb+TBI{vKW805% znkv}_Gd4?#i0-#IJIvG>unpX|N;o))9URjrGv32&NrruBwnPx(EgLFbY1fuci2Z#u zC#?_lI517$!rL`=%jtEB85k!gulRI#GxR#%49pPrRAJv`Y=*GgO3YA}lOg7);1zMr z%fE6UHyQscM9puf}WBsmM|Fc!MF|B^xN|2Dt8Ed;Tz8Pzzma zguqlMXd5<*l*>M{+qWU}A$8%r)&)FAP=eIP@sH^DEv7(N>m4nxg4{@E;#fx+I4Lt_JhHPF>lfNkRo9>Q$8_C9eX#&RL0 z&{V=mTTAvIqmFvOlZcX>5@Q2vtebyCYB-0+<20m|M);XdIL83{DoLUQz#qYaKDVEG zeiNH0U9bY)hZnu6f!kOB7zosp=@u#Zyl{i5;BLt+gL>t7k0FnVnUB?nuP)E2O zQe-Tnw;<}sAgis{ckq!C(aPxsT=l~tcKwKN$B6t>Jo_n$q^KK^ry|TyZ)Q}YIJ%Td zR36BZo<}gse55nZWRYI-V9TEa@UXyuZFZH)-wn;r>}Z#|!bqnh!ZW_I_~eD*?*#_6 zVJh(d5nN%UUD%x#!T5haM8~*Q(94etrHOH@`G;sz{RvMyJU!w`5F!Vz{+y>ePXmTa ziCUz-htqf1Da8!y8(GJZ)s2jkb8LCb)q+~98)cBvx?4l7^hasBgd-rj9hmB57t~J9 z&&PY9;w%An$Z5k}j1BjMSAf(MqY1K1LzSSnD%dI6*#NMDe{Wh3k+ngjl`hNEzhQHl z?2^VtX^r&BXPwWRlYemn>L134>)dE0i*ntDu7;WT2529#45{2}#T&#PQ4VXi*iRj6Xn7(DcK{lOrbK4r#~|jPQxUMW^v8Ue)BUEj zl1?6+62a^n&(e|t@60m6%}ujd=R{&oQdLfxV|^#36#L2(Jc6w_NQhxHWFfZtU@L++ zHhrId(e{08>Z*e8{I@_?mLk)a)VIF^G2#r7ni>F;(|kIRJ~7`J_WrLNt2n~!B=o&E zJtPNntgyS<5mqJ^Nn0ID{TcgU_n)I(REU2|SqpSC+|?kEn;ciJu|V$k*bU`f50w+9 z{+cJYKQzXHhW!LD{*fJ%YNvn=vKF+gp!l4rl#{B#Pw5M>-BtgC7FSagtxP0Yy|9D* zbCPk19R6D#w}8n1=}ClHo{s+=aIUk?z1i6EOMDm=JtXz~8aL0#_IyRd%72w=b+LiC zfE)SGDm8&pxezoq=33Yr6X@{x1Yb)`$^~P+-S|98k%`^;I(*UDAL0?oT+5o2tj|d5 zS~AU&VAP@Zw^;8aPc%6)`rX(SITv&~{~}ms1cbC)b=9G(gS^2swjEE}8M|0?^3Ib7 g-kvp`16ZE8=@jK}kF(dA#IqNtkLB#?V+YLt1M76<6#xJL literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pytest/mark/evaluate.py b/venv/Lib/site-packages/_pytest/mark/evaluate.py new file mode 100644 index 00000000..6736cb79 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/mark/evaluate.py @@ -0,0 +1,123 @@ +import os +import six +import sys +import platform +import traceback + +from ..outcomes import fail, TEST_OUTCOME + + +def cached_eval(config, expr, d): + if not hasattr(config, "_evalcache"): + config._evalcache = {} + try: + return config._evalcache[expr] + except KeyError: + import _pytest._code + + exprcode = _pytest._code.compile(expr, mode="eval") + config._evalcache[expr] = x = eval(exprcode, d) + return x + + +class MarkEvaluator(object): + def __init__(self, item, name): + self.item = item + self._marks = None + self._mark = None + self._mark_name = name + + def __bool__(self): + # dont cache here to prevent staleness + return bool(self._get_marks()) + + __nonzero__ = __bool__ + + def wasvalid(self): + return not hasattr(self, "exc") + + def _get_marks(self): + return list(self.item.iter_markers(name=self._mark_name)) + + def invalidraise(self, exc): + raises = self.get("raises") + if not raises: + return + return not isinstance(exc, raises) + + def istrue(self): + try: + return self._istrue() + except TEST_OUTCOME: + self.exc = sys.exc_info() + if isinstance(self.exc[1], SyntaxError): + msg = [" " * (self.exc[1].offset + 4) + "^"] + msg.append("SyntaxError: invalid syntax") + else: + msg = traceback.format_exception_only(*self.exc[:2]) + fail( + "Error evaluating %r expression\n" + " %s\n" + "%s" % (self._mark_name, self.expr, "\n".join(msg)), + pytrace=False, + ) + + def _getglobals(self): + d = {"os": os, "sys": sys, "platform": platform, "config": self.item.config} + if hasattr(self.item, "obj"): + d.update(self.item.obj.__globals__) + return d + + def _istrue(self): + if hasattr(self, "result"): + return self.result + self._marks = self._get_marks() + + if self._marks: + self.result = False + for mark in self._marks: + self._mark = mark + if "condition" in mark.kwargs: + args = (mark.kwargs["condition"],) + else: + args = mark.args + + for expr in args: + self.expr = expr + if isinstance(expr, six.string_types): + d = self._getglobals() + result = cached_eval(self.item.config, expr, d) + else: + if "reason" not in mark.kwargs: + # XXX better be checked at collection time + msg = ( + "you need to specify reason=STRING " + "when using booleans as conditions." + ) + fail(msg) + result = bool(expr) + if result: + self.result = True + self.reason = mark.kwargs.get("reason", None) + self.expr = expr + return self.result + + if not args: + self.result = True + self.reason = mark.kwargs.get("reason", None) + return self.result + return False + + def get(self, attr, default=None): + if self._mark is None: + return default + return self._mark.kwargs.get(attr, default) + + def getexplanation(self): + expl = getattr(self, "reason", None) or self.get("reason", None) + if not expl: + if not hasattr(self, "expr"): + return "" + else: + return "condition: " + str(self.expr) + return expl diff --git a/venv/Lib/site-packages/_pytest/mark/legacy.py b/venv/Lib/site-packages/_pytest/mark/legacy.py new file mode 100644 index 00000000..0d0d852c --- /dev/null +++ b/venv/Lib/site-packages/_pytest/mark/legacy.py @@ -0,0 +1,100 @@ +""" +this is a place where we put datastructures used by legacy apis +we hope ot remove +""" +import attr +import keyword + +from _pytest.config import UsageError + + +@attr.s +class MarkMapping(object): + """Provides a local mapping for markers where item access + resolves to True if the marker is present. """ + + own_mark_names = attr.ib() + + @classmethod + def from_item(cls, item): + mark_names = {mark.name for mark in item.iter_markers()} + return cls(mark_names) + + def __getitem__(self, name): + return name in self.own_mark_names + + +class KeywordMapping(object): + """Provides a local mapping for keywords. + Given a list of names, map any substring of one of these names to True. + """ + + def __init__(self, names): + self._names = names + + @classmethod + def from_item(cls, item): + mapped_names = set() + + # Add the names of the current item and any parent items + import pytest + + for item in item.listchain(): + if not isinstance(item, pytest.Instance): + mapped_names.add(item.name) + + # Add the names added as extra keywords to current or parent items + for name in item.listextrakeywords(): + mapped_names.add(name) + + # Add the names attached to the current function through direct assignment + if hasattr(item, "function"): + for name in item.function.__dict__: + mapped_names.add(name) + + return cls(mapped_names) + + def __getitem__(self, subname): + for name in self._names: + if subname in name: + return True + return False + + +python_keywords_allowed_list = ["or", "and", "not"] + + +def matchmark(colitem, markexpr): + """Tries to match on any marker names, attached to the given colitem.""" + try: + return eval(markexpr, {}, MarkMapping.from_item(colitem)) + except SyntaxError as e: + raise SyntaxError(str(e) + "\nMarker expression must be valid Python!") + + +def matchkeyword(colitem, keywordexpr): + """Tries to match given keyword expression to given collector item. + + Will match on the name of colitem, including the names of its parents. + Only matches names of items which are either a :class:`Class` or a + :class:`Function`. + Additionally, matches on names in the 'extra_keyword_matches' set of + any item, as well as names directly assigned to test functions. + """ + mapping = KeywordMapping.from_item(colitem) + if " " not in keywordexpr: + # special case to allow for simple "-k pass" and "-k 1.3" + return mapping[keywordexpr] + elif keywordexpr.startswith("not ") and " " not in keywordexpr[4:]: + return not mapping[keywordexpr[4:]] + for kwd in keywordexpr.split(): + if keyword.iskeyword(kwd) and kwd not in python_keywords_allowed_list: + raise UsageError( + "Python keyword '{}' not accepted in expressions passed to '-k'".format( + kwd + ) + ) + try: + return eval(keywordexpr, {}, mapping) + except SyntaxError: + raise UsageError("Wrong expression passed to '-k': {}".format(keywordexpr)) diff --git a/venv/Lib/site-packages/_pytest/mark/structures.py b/venv/Lib/site-packages/_pytest/mark/structures.py new file mode 100644 index 00000000..32822c2b --- /dev/null +++ b/venv/Lib/site-packages/_pytest/mark/structures.py @@ -0,0 +1,468 @@ +import inspect +import warnings +from collections import namedtuple +from functools import reduce +from operator import attrgetter + +import attr + +from _pytest.outcomes import fail +from ..deprecated import MARK_PARAMETERSET_UNPACKING, MARK_INFO_ATTRIBUTE +from ..compat import NOTSET, getfslineno, MappingMixin +from six.moves import map + + +EMPTY_PARAMETERSET_OPTION = "empty_parameter_set_mark" + + +def alias(name, warning=None): + getter = attrgetter(name) + + def warned(self): + warnings.warn(warning, stacklevel=2) + return getter(self) + + return property(getter if warning is None else warned, doc="alias for " + name) + + +def istestfunc(func): + return ( + hasattr(func, "__call__") + and getattr(func, "__name__", "") != "" + ) + + +def get_empty_parameterset_mark(config, argnames, func): + from ..nodes import Collector + + requested_mark = config.getini(EMPTY_PARAMETERSET_OPTION) + if requested_mark in ("", None, "skip"): + mark = MARK_GEN.skip + elif requested_mark == "xfail": + mark = MARK_GEN.xfail(run=False) + elif requested_mark == "fail_at_collect": + f_name = func.__name__ + _, lineno = getfslineno(func) + raise Collector.CollectError( + "Empty parameter set in '%s' at line %d" % (f_name, lineno) + ) + else: + raise LookupError(requested_mark) + fs, lineno = getfslineno(func) + reason = "got empty parameter set %r, function %s at %s:%d" % ( + argnames, + func.__name__, + fs, + lineno, + ) + return mark(reason=reason) + + +class ParameterSet(namedtuple("ParameterSet", "values, marks, id")): + @classmethod + def param(cls, *values, **kw): + marks = kw.pop("marks", ()) + if isinstance(marks, MarkDecorator): + marks = (marks,) + else: + assert isinstance(marks, (tuple, list, set)) + + def param_extract_id(id=None): + return id + + id_ = param_extract_id(**kw) + return cls(values, marks, id_) + + @classmethod + def extract_from(cls, parameterset, belonging_definition, legacy_force_tuple=False): + """ + :param parameterset: + a legacy style parameterset that may or may not be a tuple, + and may or may not be wrapped into a mess of mark objects + + :param legacy_force_tuple: + enforce tuple wrapping so single argument tuple values + don't get decomposed and break tests + + :param belonging_definition: the item that we will be extracting the parameters from. + """ + + if isinstance(parameterset, cls): + return parameterset + if not isinstance(parameterset, MarkDecorator) and legacy_force_tuple: + return cls.param(parameterset) + + newmarks = [] + argval = parameterset + while isinstance(argval, MarkDecorator): + newmarks.append( + MarkDecorator(Mark(argval.markname, argval.args[:-1], argval.kwargs)) + ) + argval = argval.args[-1] + assert not isinstance(argval, ParameterSet) + if legacy_force_tuple: + argval = (argval,) + + if newmarks and belonging_definition is not None: + belonging_definition.warn(MARK_PARAMETERSET_UNPACKING) + + return cls(argval, marks=newmarks, id=None) + + @classmethod + def _for_parametrize(cls, argnames, argvalues, func, config, function_definition): + if not isinstance(argnames, (tuple, list)): + argnames = [x.strip() for x in argnames.split(",") if x.strip()] + force_tuple = len(argnames) == 1 + else: + force_tuple = False + parameters = [ + ParameterSet.extract_from( + x, + legacy_force_tuple=force_tuple, + belonging_definition=function_definition, + ) + for x in argvalues + ] + del argvalues + + if parameters: + # check all parameter sets have the correct number of values + for param in parameters: + if len(param.values) != len(argnames): + raise ValueError( + 'In "parametrize" the number of values ({}) must be ' + "equal to the number of names ({})".format( + param.values, argnames + ) + ) + else: + # empty parameter set (likely computed at runtime): create a single + # parameter set with NOSET values, with the "empty parameter set" mark applied to it + mark = get_empty_parameterset_mark(config, argnames, func) + parameters.append( + ParameterSet(values=(NOTSET,) * len(argnames), marks=[mark], id=None) + ) + return argnames, parameters + + +@attr.s(frozen=True) +class Mark(object): + #: name of the mark + name = attr.ib(type=str) + #: positional arguments of the mark decorator + args = attr.ib() # type: List[object] + #: keyword arguments of the mark decorator + kwargs = attr.ib() # type: Dict[str, object] + + def combined_with(self, other): + """ + :param other: the mark to combine with + :type other: Mark + :rtype: Mark + + combines by appending aargs and merging the mappings + """ + assert self.name == other.name + return Mark( + self.name, self.args + other.args, dict(self.kwargs, **other.kwargs) + ) + + +@attr.s +class MarkDecorator(object): + """ A decorator for test functions and test classes. When applied + it will create :class:`MarkInfo` objects which may be + :ref:`retrieved by hooks as item keywords `. + MarkDecorator instances are often created like this:: + + mark1 = pytest.mark.NAME # simple MarkDecorator + mark2 = pytest.mark.NAME(name1=value) # parametrized MarkDecorator + + and can then be applied as decorators to test functions:: + + @mark2 + def test_function(): + pass + + When a MarkDecorator instance is called it does the following: + 1. If called with a single class as its only positional argument and no + additional keyword arguments, it attaches itself to the class so it + gets applied automatically to all test cases found in that class. + 2. If called with a single function as its only positional argument and + no additional keyword arguments, it attaches a MarkInfo object to the + function, containing all the arguments already stored internally in + the MarkDecorator. + 3. When called in any other case, it performs a 'fake construction' call, + i.e. it returns a new MarkDecorator instance with the original + MarkDecorator's content updated with the arguments passed to this + call. + + Note: The rules above prevent MarkDecorator objects from storing only a + single function or class reference as their positional argument with no + additional keyword or positional arguments. + + """ + + mark = attr.ib(validator=attr.validators.instance_of(Mark)) + + name = alias("mark.name") + args = alias("mark.args") + kwargs = alias("mark.kwargs") + + @property + def markname(self): + return self.name # for backward-compat (2.4.1 had this attr) + + def __eq__(self, other): + return self.mark == other.mark if isinstance(other, MarkDecorator) else False + + def __repr__(self): + return "" % (self.mark,) + + def with_args(self, *args, **kwargs): + """ return a MarkDecorator with extra arguments added + + unlike call this can be used even if the sole argument is a callable/class + + :return: MarkDecorator + """ + + mark = Mark(self.name, args, kwargs) + return self.__class__(self.mark.combined_with(mark)) + + def __call__(self, *args, **kwargs): + """ if passed a single callable argument: decorate it with mark info. + otherwise add *args/**kwargs in-place to mark information. """ + if args and not kwargs: + func = args[0] + is_class = inspect.isclass(func) + if len(args) == 1 and (istestfunc(func) or is_class): + if is_class: + store_mark(func, self.mark) + else: + store_legacy_markinfo(func, self.mark) + store_mark(func, self.mark) + return func + return self.with_args(*args, **kwargs) + + +def get_unpacked_marks(obj): + """ + obtain the unpacked marks that are stored on an object + """ + mark_list = getattr(obj, "pytestmark", []) + if not isinstance(mark_list, list): + mark_list = [mark_list] + return normalize_mark_list(mark_list) + + +def normalize_mark_list(mark_list): + """ + normalizes marker decorating helpers to mark objects + + :type mark_list: List[Union[Mark, Markdecorator]] + :rtype: List[Mark] + """ + return [getattr(mark, "mark", mark) for mark in mark_list] # unpack MarkDecorator + + +def store_mark(obj, mark): + """store a Mark on an object + this is used to implement the Mark declarations/decorators correctly + """ + assert isinstance(mark, Mark), mark + # always reassign name to avoid updating pytestmark + # in a reference that was only borrowed + obj.pytestmark = get_unpacked_marks(obj) + [mark] + + +def store_legacy_markinfo(func, mark): + """create the legacy MarkInfo objects and put them onto the function + """ + if not isinstance(mark, Mark): + raise TypeError("got {mark!r} instead of a Mark".format(mark=mark)) + holder = getattr(func, mark.name, None) + if holder is None: + holder = MarkInfo.for_mark(mark) + setattr(func, mark.name, holder) + elif isinstance(holder, MarkInfo): + holder.add_mark(mark) + + +def transfer_markers(funcobj, cls, mod): + """ + this function transfers class level markers and module level markers + into function level markinfo objects + + this is the main reason why marks are so broken + the resolution will involve phasing out function level MarkInfo objects + + """ + for obj in (cls, mod): + for mark in get_unpacked_marks(obj): + if not _marked(funcobj, mark): + store_legacy_markinfo(funcobj, mark) + + +def _marked(func, mark): + """ Returns True if :func: is already marked with :mark:, False otherwise. + This can happen if marker is applied to class and the test file is + invoked more than once. + """ + try: + func_mark = getattr(func, getattr(mark, "combined", mark).name) + except AttributeError: + return False + return any(mark == info.combined for info in func_mark) + + +@attr.s(repr=False) +class MarkInfo(object): + """ Marking object created by :class:`MarkDecorator` instances. """ + + _marks = attr.ib(converter=list) + + @_marks.validator + def validate_marks(self, attribute, value): + for item in value: + if not isinstance(item, Mark): + raise ValueError( + "MarkInfo expects Mark instances, got {!r} ({!r})".format( + item, type(item) + ) + ) + + combined = attr.ib( + repr=False, + default=attr.Factory( + lambda self: reduce(Mark.combined_with, self._marks), takes_self=True + ), + ) + + name = alias("combined.name", warning=MARK_INFO_ATTRIBUTE) + args = alias("combined.args", warning=MARK_INFO_ATTRIBUTE) + kwargs = alias("combined.kwargs", warning=MARK_INFO_ATTRIBUTE) + + @classmethod + def for_mark(cls, mark): + return cls([mark]) + + def __repr__(self): + return "".format(self.combined) + + def add_mark(self, mark): + """ add a MarkInfo with the given args and kwargs. """ + self._marks.append(mark) + self.combined = self.combined.combined_with(mark) + + def __iter__(self): + """ yield MarkInfo objects each relating to a marking-call. """ + return map(MarkInfo.for_mark, self._marks) + + +class MarkGenerator(object): + """ Factory for :class:`MarkDecorator` objects - exposed as + a ``pytest.mark`` singleton instance. Example:: + + import pytest + @pytest.mark.slowtest + def test_function(): + pass + + will set a 'slowtest' :class:`MarkInfo` object + on the ``test_function`` object. """ + + _config = None + + def __getattr__(self, name): + if name[0] == "_": + raise AttributeError("Marker name must NOT start with underscore") + if self._config is not None: + self._check(name) + return MarkDecorator(Mark(name, (), {})) + + def _check(self, name): + try: + if name in self._markers: + return + except AttributeError: + pass + self._markers = values = set() + for line in self._config.getini("markers"): + marker = line.split(":", 1)[0] + marker = marker.rstrip() + x = marker.split("(", 1)[0] + values.add(x) + if name not in self._markers: + fail("{!r} not a registered marker".format(name), pytrace=False) + + +MARK_GEN = MarkGenerator() + + +class NodeKeywords(MappingMixin): + def __init__(self, node): + self.node = node + self.parent = node.parent + self._markers = {node.name: True} + + def __getitem__(self, key): + try: + return self._markers[key] + except KeyError: + if self.parent is None: + raise + return self.parent.keywords[key] + + def __setitem__(self, key, value): + self._markers[key] = value + + def __delitem__(self, key): + raise ValueError("cannot delete key in keywords dict") + + def __iter__(self): + seen = self._seen() + return iter(seen) + + def _seen(self): + seen = set(self._markers) + if self.parent is not None: + seen.update(self.parent.keywords) + return seen + + def __len__(self): + return len(self._seen()) + + def __repr__(self): + return "" % (self.node,) + + +@attr.s(cmp=False, hash=False) +class NodeMarkers(object): + """ + internal strucutre for storing marks belongong to a node + + ..warning:: + + unstable api + + """ + + own_markers = attr.ib(default=attr.Factory(list)) + + def update(self, add_markers): + """update the own markers + """ + self.own_markers.extend(add_markers) + + def find(self, name): + """ + find markers in own nodes or parent nodes + needs a better place + """ + for mark in self.own_markers: + if mark.name == name: + yield mark + + def __iter__(self): + return iter(self.own_markers) diff --git a/venv/Lib/site-packages/_pytest/monkeypatch.py b/venv/Lib/site-packages/_pytest/monkeypatch.py new file mode 100644 index 00000000..4bd6b607 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/monkeypatch.py @@ -0,0 +1,304 @@ +""" monkeypatching and mocking functionality. """ +from __future__ import absolute_import, division, print_function + +import os +import sys +import re +import warnings +from contextlib import contextmanager + +import six + +import pytest +from _pytest.fixtures import fixture + +RE_IMPORT_ERROR_NAME = re.compile("^No module named (.*)$") + + +@fixture +def monkeypatch(): + """The returned ``monkeypatch`` fixture provides these + helper methods to modify objects, dictionaries or os.environ:: + + monkeypatch.setattr(obj, name, value, raising=True) + monkeypatch.delattr(obj, name, raising=True) + monkeypatch.setitem(mapping, name, value) + monkeypatch.delitem(obj, name, raising=True) + monkeypatch.setenv(name, value, prepend=False) + monkeypatch.delenv(name, raising=True) + monkeypatch.syspath_prepend(path) + monkeypatch.chdir(path) + + All modifications will be undone after the requesting + test function or fixture has finished. The ``raising`` + parameter determines if a KeyError or AttributeError + will be raised if the set/deletion operation has no target. + """ + mpatch = MonkeyPatch() + yield mpatch + mpatch.undo() + + +def resolve(name): + # simplified from zope.dottedname + parts = name.split(".") + + used = parts.pop(0) + found = __import__(used) + for part in parts: + used += "." + part + try: + found = getattr(found, part) + except AttributeError: + pass + else: + continue + # we use explicit un-nesting of the handling block in order + # to avoid nested exceptions on python 3 + try: + __import__(used) + except ImportError as ex: + # str is used for py2 vs py3 + expected = str(ex).split()[-1] + if expected == used: + raise + else: + raise ImportError("import error in %s: %s" % (used, ex)) + found = annotated_getattr(found, part, used) + return found + + +def annotated_getattr(obj, name, ann): + try: + obj = getattr(obj, name) + except AttributeError: + raise AttributeError( + "%r object at %s has no attribute %r" % (type(obj).__name__, ann, name) + ) + return obj + + +def derive_importpath(import_path, raising): + if not isinstance(import_path, six.string_types) or "." not in import_path: + raise TypeError("must be absolute import path string, not %r" % (import_path,)) + module, attr = import_path.rsplit(".", 1) + target = resolve(module) + if raising: + annotated_getattr(target, attr, ann=module) + return attr, target + + +class Notset(object): + def __repr__(self): + return "" + + +notset = Notset() + + +class MonkeyPatch(object): + """ Object returned by the ``monkeypatch`` fixture keeping a record of setattr/item/env/syspath changes. + """ + + def __init__(self): + self._setattr = [] + self._setitem = [] + self._cwd = None + self._savesyspath = None + + @contextmanager + def context(self): + """ + Context manager that returns a new :class:`MonkeyPatch` object which + undoes any patching done inside the ``with`` block upon exit: + + .. code-block:: python + + import functools + def test_partial(monkeypatch): + with monkeypatch.context() as m: + m.setattr(functools, "partial", 3) + + Useful in situations where it is desired to undo some patches before the test ends, + such as mocking ``stdlib`` functions that might break pytest itself if mocked (for examples + of this see `#3290 `_. + """ + m = MonkeyPatch() + try: + yield m + finally: + m.undo() + + def setattr(self, target, name, value=notset, raising=True): + """ Set attribute value on target, memorizing the old value. + By default raise AttributeError if the attribute did not exist. + + For convenience you can specify a string as ``target`` which + will be interpreted as a dotted import path, with the last part + being the attribute name. Example: + ``monkeypatch.setattr("os.getcwd", lambda: "/")`` + would set the ``getcwd`` function of the ``os`` module. + + The ``raising`` value determines if the setattr should fail + if the attribute is not already present (defaults to True + which means it will raise). + """ + __tracebackhide__ = True + import inspect + + if value is notset: + if not isinstance(target, six.string_types): + raise TypeError( + "use setattr(target, name, value) or " + "setattr(target, value) with target being a dotted " + "import string" + ) + value = name + name, target = derive_importpath(target, raising) + + oldval = getattr(target, name, notset) + if raising and oldval is notset: + raise AttributeError("%r has no attribute %r" % (target, name)) + + # avoid class descriptors like staticmethod/classmethod + if inspect.isclass(target): + oldval = target.__dict__.get(name, notset) + self._setattr.append((target, name, oldval)) + setattr(target, name, value) + + def delattr(self, target, name=notset, raising=True): + """ Delete attribute ``name`` from ``target``, by default raise + AttributeError it the attribute did not previously exist. + + If no ``name`` is specified and ``target`` is a string + it will be interpreted as a dotted import path with the + last part being the attribute name. + + If ``raising`` is set to False, no exception will be raised if the + attribute is missing. + """ + __tracebackhide__ = True + if name is notset: + if not isinstance(target, six.string_types): + raise TypeError( + "use delattr(target, name) or " + "delattr(target) with target being a dotted " + "import string" + ) + name, target = derive_importpath(target, raising) + + if not hasattr(target, name): + if raising: + raise AttributeError(name) + else: + self._setattr.append((target, name, getattr(target, name, notset))) + delattr(target, name) + + def setitem(self, dic, name, value): + """ Set dictionary entry ``name`` to value. """ + self._setitem.append((dic, name, dic.get(name, notset))) + dic[name] = value + + def delitem(self, dic, name, raising=True): + """ Delete ``name`` from dict. Raise KeyError if it doesn't exist. + + If ``raising`` is set to False, no exception will be raised if the + key is missing. + """ + if name not in dic: + if raising: + raise KeyError(name) + else: + self._setitem.append((dic, name, dic.get(name, notset))) + del dic[name] + + def _warn_if_env_name_is_not_str(self, name): + """On Python 2, warn if the given environment variable name is not a native str (#4056)""" + if six.PY2 and not isinstance(name, str): + warnings.warn( + pytest.PytestWarning( + "Environment variable name {!r} should be str".format(name) + ) + ) + + def setenv(self, name, value, prepend=None): + """ Set environment variable ``name`` to ``value``. If ``prepend`` + is a character, read the current environment variable value + and prepend the ``value`` adjoined with the ``prepend`` character.""" + if not isinstance(value, str): + warnings.warn( + pytest.PytestWarning( + "Environment variable value {!r} should be str, converted to str implicitly".format( + value + ) + ) + ) + value = str(value) + if prepend and name in os.environ: + value = value + prepend + os.environ[name] + self._warn_if_env_name_is_not_str(name) + self.setitem(os.environ, name, value) + + def delenv(self, name, raising=True): + """ Delete ``name`` from the environment. Raise KeyError if it does + not exist. + + If ``raising`` is set to False, no exception will be raised if the + environment variable is missing. + """ + self._warn_if_env_name_is_not_str(name) + self.delitem(os.environ, name, raising=raising) + + def syspath_prepend(self, path): + """ Prepend ``path`` to ``sys.path`` list of import locations. """ + if self._savesyspath is None: + self._savesyspath = sys.path[:] + sys.path.insert(0, str(path)) + + def chdir(self, path): + """ Change the current working directory to the specified path. + Path can be a string or a py.path.local object. + """ + if self._cwd is None: + self._cwd = os.getcwd() + if hasattr(path, "chdir"): + path.chdir() + else: + os.chdir(path) + + def undo(self): + """ Undo previous changes. This call consumes the + undo stack. Calling it a second time has no effect unless + you do more monkeypatching after the undo call. + + There is generally no need to call `undo()`, since it is + called automatically during tear-down. + + Note that the same `monkeypatch` fixture is used across a + single test function invocation. If `monkeypatch` is used both by + the test function itself and one of the test fixtures, + calling `undo()` will undo all of the changes made in + both functions. + """ + for obj, name, value in reversed(self._setattr): + if value is not notset: + setattr(obj, name, value) + else: + delattr(obj, name) + self._setattr[:] = [] + for dictionary, name, value in reversed(self._setitem): + if value is notset: + try: + del dictionary[name] + except KeyError: + pass # was already deleted, so we have the desired state + else: + dictionary[name] = value + self._setitem[:] = [] + if self._savesyspath is not None: + sys.path[:] = self._savesyspath + self._savesyspath = None + + if self._cwd is not None: + os.chdir(self._cwd) + self._cwd = None diff --git a/venv/Lib/site-packages/_pytest/nodes.py b/venv/Lib/site-packages/_pytest/nodes.py new file mode 100644 index 00000000..d80895ab --- /dev/null +++ b/venv/Lib/site-packages/_pytest/nodes.py @@ -0,0 +1,533 @@ +from __future__ import absolute_import, division, print_function +import os +import warnings + +import six +import py +import attr + +import _pytest +import _pytest._code +from _pytest.compat import getfslineno +from _pytest.outcomes import fail + +from _pytest.mark.structures import NodeKeywords, MarkInfo + +SEP = "/" + +tracebackcutdir = py.path.local(_pytest.__file__).dirpath() + + +def _splitnode(nodeid): + """Split a nodeid into constituent 'parts'. + + Node IDs are strings, and can be things like: + '' + 'testing/code' + 'testing/code/test_excinfo.py' + 'testing/code/test_excinfo.py::TestFormattedExcinfo::()' + + Return values are lists e.g. + [] + ['testing', 'code'] + ['testing', 'code', 'test_excinfo.py'] + ['testing', 'code', 'test_excinfo.py', 'TestFormattedExcinfo', '()'] + """ + if nodeid == "": + # If there is no root node at all, return an empty list so the caller's logic can remain sane + return [] + parts = nodeid.split(SEP) + # Replace single last element 'test_foo.py::Bar::()' with multiple elements 'test_foo.py', 'Bar', '()' + parts[-1:] = parts[-1].split("::") + return parts + + +def ischildnode(baseid, nodeid): + """Return True if the nodeid is a child node of the baseid. + + E.g. 'foo/bar::Baz::()' is a child of 'foo', 'foo/bar' and 'foo/bar::Baz', but not of 'foo/blorp' + """ + base_parts = _splitnode(baseid) + node_parts = _splitnode(nodeid) + if len(node_parts) < len(base_parts): + return False + return node_parts[: len(base_parts)] == base_parts + + +@attr.s +class _CompatProperty(object): + name = attr.ib() + + def __get__(self, obj, owner): + if obj is None: + return self + + from _pytest.deprecated import COMPAT_PROPERTY + + warnings.warn( + COMPAT_PROPERTY.format(name=self.name, owner=owner.__name__), stacklevel=2 + ) + return getattr(__import__("pytest"), self.name) + + +class Node(object): + """ base class for Collector and Item the test collection tree. + Collector subclasses have children, Items are terminal nodes.""" + + def __init__( + self, name, parent=None, config=None, session=None, fspath=None, nodeid=None + ): + #: a unique name within the scope of the parent node + self.name = name + + #: the parent collector node. + self.parent = parent + + #: the pytest config object + self.config = config or parent.config + + #: the session this node is part of + self.session = session or parent.session + + #: filesystem path where this node was collected from (can be None) + self.fspath = fspath or getattr(parent, "fspath", None) + + #: keywords/markers collected from all scopes + self.keywords = NodeKeywords(self) + + #: the marker objects belonging to this node + self.own_markers = [] + + #: allow adding of extra keywords to use for matching + self.extra_keyword_matches = set() + + # used for storing artificial fixturedefs for direct parametrization + self._name2pseudofixturedef = {} + + if nodeid is not None: + self._nodeid = nodeid + else: + assert parent is not None + self._nodeid = self.parent.nodeid + "::" + self.name + + @property + def ihook(self): + """ fspath sensitive hook proxy used to call pytest hooks""" + return self.session.gethookproxy(self.fspath) + + Module = _CompatProperty("Module") + Class = _CompatProperty("Class") + Instance = _CompatProperty("Instance") + Function = _CompatProperty("Function") + File = _CompatProperty("File") + Item = _CompatProperty("Item") + + def _getcustomclass(self, name): + maybe_compatprop = getattr(type(self), name) + if isinstance(maybe_compatprop, _CompatProperty): + return getattr(__import__("pytest"), name) + else: + from _pytest.deprecated import CUSTOM_CLASS + + cls = getattr(self, name) + self.warn(CUSTOM_CLASS.format(name=name, type_name=type(self).__name__)) + return cls + + def __repr__(self): + return "<%s %r>" % (self.__class__.__name__, getattr(self, "name", None)) + + def warn(self, _code_or_warning=None, message=None, code=None): + """Issue a warning for this item. + + Warnings will be displayed after the test session, unless explicitly suppressed. + + This can be called in two forms: + + **Warning instance** + + This was introduced in pytest 3.8 and uses the standard warning mechanism to issue warnings. + + .. code-block:: python + + node.warn(PytestWarning("some message")) + + The warning instance must be a subclass of :class:`pytest.PytestWarning`. + + **code/message (deprecated)** + + This form was used in pytest prior to 3.8 and is considered deprecated. Using this form will emit another + warning about the deprecation: + + .. code-block:: python + + node.warn("CI", "some message") + + :param Union[Warning,str] _code_or_warning: + warning instance or warning code (legacy). This parameter receives an underscore for backward + compatibility with the legacy code/message form, and will be replaced for something + more usual when the legacy form is removed. + + :param Union[str,None] message: message to display when called in the legacy form. + :param str code: code for the warning, in legacy form when using keyword arguments. + :return: + """ + if message is None: + if _code_or_warning is None: + raise ValueError("code_or_warning must be given") + self._std_warn(_code_or_warning) + else: + if _code_or_warning and code: + raise ValueError( + "code_or_warning and code cannot both be passed to this function" + ) + code = _code_or_warning or code + self._legacy_warn(code, message) + + def _legacy_warn(self, code, message): + """ + .. deprecated:: 3.8 + + Use :meth:`Node.std_warn <_pytest.nodes.Node.std_warn>` instead. + + Generate a warning with the given code and message for this item. + """ + from _pytest.deprecated import NODE_WARN + + self._std_warn(NODE_WARN) + + assert isinstance(code, str) + fslocation = get_fslocation_from_item(self) + self.ihook.pytest_logwarning.call_historic( + kwargs=dict( + code=code, message=message, nodeid=self.nodeid, fslocation=fslocation + ) + ) + + def _std_warn(self, warning): + """Issue a warning for this item. + + Warnings will be displayed after the test session, unless explicitly suppressed + + :param Warning warning: the warning instance to issue. Must be a subclass of PytestWarning. + + :raise ValueError: if ``warning`` instance is not a subclass of PytestWarning. + """ + from _pytest.warning_types import PytestWarning + + if not isinstance(warning, PytestWarning): + raise ValueError( + "warning must be an instance of PytestWarning or subclass, got {!r}".format( + warning + ) + ) + path, lineno = get_fslocation_from_item(self) + warnings.warn_explicit( + warning, + category=None, + filename=str(path), + lineno=lineno + 1 if lineno is not None else None, + ) + + # methods for ordering nodes + @property + def nodeid(self): + """ a ::-separated string denoting its collection tree address. """ + return self._nodeid + + def __hash__(self): + return hash(self.nodeid) + + def setup(self): + pass + + def teardown(self): + pass + + def listchain(self): + """ return list of all parent collectors up to self, + starting from root of collection tree. """ + chain = [] + item = self + while item is not None: + chain.append(item) + item = item.parent + chain.reverse() + return chain + + def add_marker(self, marker, append=True): + """dynamically add a marker object to the node. + + :type marker: ``str`` or ``pytest.mark.*`` object + :param marker: + ``append=True`` whether to append the marker, + if ``False`` insert at position ``0``. + """ + from _pytest.mark import MarkDecorator, MARK_GEN + + if isinstance(marker, six.string_types): + marker = getattr(MARK_GEN, marker) + elif not isinstance(marker, MarkDecorator): + raise ValueError("is not a string or pytest.mark.* Marker") + self.keywords[marker.name] = marker + if append: + self.own_markers.append(marker.mark) + else: + self.own_markers.insert(0, marker.mark) + + def iter_markers(self, name=None): + """ + :param name: if given, filter the results by the name attribute + + iterate over all markers of the node + """ + return (x[1] for x in self.iter_markers_with_node(name=name)) + + def iter_markers_with_node(self, name=None): + """ + :param name: if given, filter the results by the name attribute + + iterate over all markers of the node + returns sequence of tuples (node, mark) + """ + for node in reversed(self.listchain()): + for mark in node.own_markers: + if name is None or getattr(mark, "name", None) == name: + yield node, mark + + def get_closest_marker(self, name, default=None): + """return the first marker matching the name, from closest (for example function) to farther level (for example + module level). + + :param default: fallback return value of no marker was found + :param name: name to filter by + """ + return next(self.iter_markers(name=name), default) + + def get_marker(self, name): + """ get a marker object from this node or None if + the node doesn't have a marker with that name. + + .. deprecated:: 3.6 + This function has been deprecated in favor of + :meth:`Node.get_closest_marker <_pytest.nodes.Node.get_closest_marker>` and + :meth:`Node.iter_markers <_pytest.nodes.Node.iter_markers>`, see :ref:`update marker code` + for more details. + """ + markers = list(self.iter_markers(name=name)) + if markers: + return MarkInfo(markers) + + def listextrakeywords(self): + """ Return a set of all extra keywords in self and any parents.""" + extra_keywords = set() + for item in self.listchain(): + extra_keywords.update(item.extra_keyword_matches) + return extra_keywords + + def listnames(self): + return [x.name for x in self.listchain()] + + def addfinalizer(self, fin): + """ register a function to be called when this node is finalized. + + This method can only be called when this node is active + in a setup chain, for example during self.setup(). + """ + self.session._setupstate.addfinalizer(fin, self) + + def getparent(self, cls): + """ get the next parent node (including ourself) + which is an instance of the given class""" + current = self + while current and not isinstance(current, cls): + current = current.parent + return current + + def _prunetraceback(self, excinfo): + pass + + def _repr_failure_py(self, excinfo, style=None): + if excinfo.errisinstance(fail.Exception): + if not excinfo.value.pytrace: + return six.text_type(excinfo.value) + fm = self.session._fixturemanager + if excinfo.errisinstance(fm.FixtureLookupError): + return excinfo.value.formatrepr() + tbfilter = True + if self.config.option.fulltrace: + style = "long" + else: + tb = _pytest._code.Traceback([excinfo.traceback[-1]]) + self._prunetraceback(excinfo) + if len(excinfo.traceback) == 0: + excinfo.traceback = tb + tbfilter = False # prunetraceback already does it + if style == "auto": + style = "long" + # XXX should excinfo.getrepr record all data and toterminal() process it? + if style is None: + if self.config.option.tbstyle == "short": + style = "short" + else: + style = "long" + + if self.config.option.verbose > 1: + truncate_locals = False + else: + truncate_locals = True + + try: + os.getcwd() + abspath = False + except OSError: + abspath = True + + return excinfo.getrepr( + funcargs=True, + abspath=abspath, + showlocals=self.config.option.showlocals, + style=style, + tbfilter=tbfilter, + truncate_locals=truncate_locals, + ) + + repr_failure = _repr_failure_py + + +def get_fslocation_from_item(item): + """Tries to extract the actual location from an item, depending on available attributes: + + * "fslocation": a pair (path, lineno) + * "obj": a Python object that the item wraps. + * "fspath": just a path + + :rtype: a tuple of (str|LocalPath, int) with filename and line number. + """ + result = getattr(item, "location", None) + if result is not None: + return result[:2] + obj = getattr(item, "obj", None) + if obj is not None: + return getfslineno(obj) + return getattr(item, "fspath", "unknown location"), -1 + + +class Collector(Node): + """ Collector instances create children through collect() + and thus iteratively build a tree. + """ + + class CollectError(Exception): + """ an error during collection, contains a custom message. """ + + def collect(self): + """ returns a list of children (items and collectors) + for this collection node. + """ + raise NotImplementedError("abstract") + + def repr_failure(self, excinfo): + """ represent a collection failure. """ + if excinfo.errisinstance(self.CollectError): + exc = excinfo.value + return str(exc.args[0]) + return self._repr_failure_py(excinfo, style="short") + + def _prunetraceback(self, excinfo): + if hasattr(self, "fspath"): + traceback = excinfo.traceback + ntraceback = traceback.cut(path=self.fspath) + if ntraceback == traceback: + ntraceback = ntraceback.cut(excludepath=tracebackcutdir) + excinfo.traceback = ntraceback.filter() + + +def _check_initialpaths_for_relpath(session, fspath): + for initial_path in session._initialpaths: + if fspath.common(initial_path) == initial_path: + return fspath.relto(initial_path.dirname) + + +class FSCollector(Collector): + def __init__(self, fspath, parent=None, config=None, session=None, nodeid=None): + fspath = py.path.local(fspath) # xxx only for test_resultlog.py? + name = fspath.basename + if parent is not None: + rel = fspath.relto(parent.fspath) + if rel: + name = rel + name = name.replace(os.sep, SEP) + self.fspath = fspath + + session = session or parent.session + + if nodeid is None: + nodeid = self.fspath.relto(session.config.rootdir) + + if not nodeid: + nodeid = _check_initialpaths_for_relpath(session, fspath) + if nodeid and os.sep != SEP: + nodeid = nodeid.replace(os.sep, SEP) + + super(FSCollector, self).__init__( + name, parent, config, session, nodeid=nodeid, fspath=fspath + ) + + +class File(FSCollector): + """ base class for collecting tests from a file. """ + + +class Item(Node): + """ a basic test invocation item. Note that for a single function + there might be multiple test invocation items. + """ + + nextitem = None + + def __init__(self, name, parent=None, config=None, session=None, nodeid=None): + super(Item, self).__init__(name, parent, config, session, nodeid=nodeid) + self._report_sections = [] + + #: user properties is a list of tuples (name, value) that holds user + #: defined properties for this test. + self.user_properties = [] + + def add_report_section(self, when, key, content): + """ + Adds a new report section, similar to what's done internally to add stdout and + stderr captured output:: + + item.add_report_section("call", "stdout", "report section contents") + + :param str when: + One of the possible capture states, ``"setup"``, ``"call"``, ``"teardown"``. + :param str key: + Name of the section, can be customized at will. Pytest uses ``"stdout"`` and + ``"stderr"`` internally. + + :param str content: + The full contents as a string. + """ + if content: + self._report_sections.append((when, key, content)) + + def reportinfo(self): + return self.fspath, None, "" + + @property + def location(self): + try: + return self._location + except AttributeError: + location = self.reportinfo() + # bestrelpath is a quite slow function + cache = self.config.__dict__.setdefault("_bestrelpathcache", {}) + try: + fspath = cache[location[0]] + except KeyError: + fspath = self.session.fspath.bestrelpath(location[0]) + cache[location[0]] = fspath + location = (fspath, location[1], str(location[2])) + self._location = location + return location diff --git a/venv/Lib/site-packages/_pytest/nose.py b/venv/Lib/site-packages/_pytest/nose.py new file mode 100644 index 00000000..bb2e4277 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/nose.py @@ -0,0 +1,72 @@ +""" run test suites written for nose. """ +from __future__ import absolute_import, division, print_function + +import sys + +from _pytest import unittest, runner, python +from _pytest.config import hookimpl + + +def get_skip_exceptions(): + skip_classes = set() + for module_name in ("unittest", "unittest2", "nose"): + mod = sys.modules.get(module_name) + if hasattr(mod, "SkipTest"): + skip_classes.add(mod.SkipTest) + return tuple(skip_classes) + + +def pytest_runtest_makereport(item, call): + if call.excinfo and call.excinfo.errisinstance(get_skip_exceptions()): + # let's substitute the excinfo with a pytest.skip one + call2 = call.__class__(lambda: runner.skip(str(call.excinfo.value)), call.when) + call.excinfo = call2.excinfo + + +@hookimpl(trylast=True) +def pytest_runtest_setup(item): + if is_potential_nosetest(item): + if isinstance(item.parent, python.Generator): + gen = item.parent + if not hasattr(gen, "_nosegensetup"): + call_optional(gen.obj, "setup") + if isinstance(gen.parent, python.Instance): + call_optional(gen.parent.obj, "setup") + gen._nosegensetup = True + if not call_optional(item.obj, "setup"): + # call module level setup if there is no object level one + call_optional(item.parent.obj, "setup") + # XXX this implies we only call teardown when setup worked + item.session._setupstate.addfinalizer((lambda: teardown_nose(item)), item) + + +def teardown_nose(item): + if is_potential_nosetest(item): + if not call_optional(item.obj, "teardown"): + call_optional(item.parent.obj, "teardown") + # if hasattr(item.parent, '_nosegensetup'): + # #call_optional(item._nosegensetup, 'teardown') + # del item.parent._nosegensetup + + +def pytest_make_collect_report(collector): + if isinstance(collector, python.Generator): + call_optional(collector.obj, "setup") + + +def is_potential_nosetest(item): + # extra check needed since we do not do nose style setup/teardown + # on direct unittest style classes + return isinstance(item, python.Function) and not isinstance( + item, unittest.TestCaseFunction + ) + + +def call_optional(obj, name): + method = getattr(obj, name, None) + isfixture = hasattr(method, "_pytestfixturefunction") + if method is not None and not isfixture and callable(method): + # If there's any problems allow the exception to raise rather than + # silently ignoring them + method() + return True diff --git a/venv/Lib/site-packages/_pytest/outcomes.py b/venv/Lib/site-packages/_pytest/outcomes.py new file mode 100644 index 00000000..4c795838 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/outcomes.py @@ -0,0 +1,179 @@ +""" +exception classes and constants handling test outcomes +as well as functions creating them +""" +from __future__ import absolute_import, division, print_function +import sys + + +class OutcomeException(BaseException): + """ OutcomeException and its subclass instances indicate and + contain info about test and collection outcomes. + """ + + def __init__(self, msg=None, pytrace=True): + BaseException.__init__(self, msg) + self.msg = msg + self.pytrace = pytrace + + def __repr__(self): + if self.msg: + val = self.msg + if isinstance(val, bytes): + val = val.decode("UTF-8", errors="replace") + return val + return "<%s instance>" % (self.__class__.__name__,) + + __str__ = __repr__ + + +TEST_OUTCOME = (OutcomeException, Exception) + + +class Skipped(OutcomeException): + # XXX hackish: on 3k we fake to live in the builtins + # in order to have Skipped exception printing shorter/nicer + __module__ = "builtins" + + def __init__(self, msg=None, pytrace=True, allow_module_level=False): + OutcomeException.__init__(self, msg=msg, pytrace=pytrace) + self.allow_module_level = allow_module_level + + +class Failed(OutcomeException): + """ raised from an explicit call to pytest.fail() """ + + __module__ = "builtins" + + +class Exit(KeyboardInterrupt): + """ raised for immediate program exits (no tracebacks/summaries)""" + + def __init__(self, msg="unknown reason", returncode=None): + self.msg = msg + self.returncode = returncode + KeyboardInterrupt.__init__(self, msg) + + +# exposed helper methods + + +def exit(msg, returncode=None): + """ + Exit testing process as if KeyboardInterrupt was triggered. + + :param str msg: message to display upon exit. + :param int returncode: return code to be used when exiting pytest. + """ + __tracebackhide__ = True + raise Exit(msg, returncode) + + +exit.Exception = Exit + + +def skip(msg="", **kwargs): + """ + Skip an executing test with the given message. + + This function should be called only during testing (setup, call or teardown) or + during collection by using the ``allow_module_level`` flag. + + :kwarg bool allow_module_level: allows this function to be called at + module level, skipping the rest of the module. Default to False. + + .. note:: + It is better to use the :ref:`pytest.mark.skipif ref` marker when possible to declare a test to be + skipped under certain conditions like mismatching platforms or + dependencies. + """ + __tracebackhide__ = True + allow_module_level = kwargs.pop("allow_module_level", False) + if kwargs: + keys = [k for k in kwargs.keys()] + raise TypeError("unexpected keyword arguments: {}".format(keys)) + raise Skipped(msg=msg, allow_module_level=allow_module_level) + + +skip.Exception = Skipped + + +def fail(msg="", pytrace=True): + """ + Explicitly fail an executing test with the given message. + + :param str msg: the message to show the user as reason for the failure. + :param bool pytrace: if false the msg represents the full failure information and no + python traceback will be reported. + """ + __tracebackhide__ = True + raise Failed(msg=msg, pytrace=pytrace) + + +fail.Exception = Failed + + +class XFailed(fail.Exception): + """ raised from an explicit call to pytest.xfail() """ + + +def xfail(reason=""): + """ + Imperatively xfail an executing test or setup functions with the given reason. + + This function should be called only during testing (setup, call or teardown). + + .. note:: + It is better to use the :ref:`pytest.mark.xfail ref` marker when possible to declare a test to be + xfailed under certain conditions like known bugs or missing features. + """ + __tracebackhide__ = True + raise XFailed(reason) + + +xfail.Exception = XFailed + + +def importorskip(modname, minversion=None): + """ return imported module if it has at least "minversion" as its + __version__ attribute. If no minversion is specified the a skip + is only triggered if the module can not be imported. + """ + import warnings + + __tracebackhide__ = True + compile(modname, "", "eval") # to catch syntaxerrors + should_skip = False + + with warnings.catch_warnings(): + # make sure to ignore ImportWarnings that might happen because + # of existing directories with the same name we're trying to + # import but without a __init__.py file + warnings.simplefilter("ignore") + try: + __import__(modname) + except ImportError: + # Do not raise chained exception here(#1485) + should_skip = True + if should_skip: + raise Skipped("could not import %r" % (modname,), allow_module_level=True) + mod = sys.modules[modname] + if minversion is None: + return mod + verattr = getattr(mod, "__version__", None) + if minversion is not None: + try: + from pkg_resources import parse_version as pv + except ImportError: + raise Skipped( + "we have a required version for %r but can not import " + "pkg_resources to parse version strings." % (modname,), + allow_module_level=True, + ) + if verattr is None or pv(verattr) < pv(minversion): + raise Skipped( + "module %r has __version__ %r, required is: %r" + % (modname, verattr, minversion), + allow_module_level=True, + ) + return mod diff --git a/venv/Lib/site-packages/_pytest/pastebin.py b/venv/Lib/site-packages/_pytest/pastebin.py new file mode 100644 index 00000000..6af202d1 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/pastebin.py @@ -0,0 +1,109 @@ +""" submit failure or test session information to a pastebin service. """ +from __future__ import absolute_import, division, print_function + +import pytest +import six +import sys +import tempfile + + +def pytest_addoption(parser): + group = parser.getgroup("terminal reporting") + group._addoption( + "--pastebin", + metavar="mode", + action="store", + dest="pastebin", + default=None, + choices=["failed", "all"], + help="send failed|all info to bpaste.net pastebin service.", + ) + + +@pytest.hookimpl(trylast=True) +def pytest_configure(config): + if config.option.pastebin == "all": + tr = config.pluginmanager.getplugin("terminalreporter") + # if no terminal reporter plugin is present, nothing we can do here; + # this can happen when this function executes in a slave node + # when using pytest-xdist, for example + if tr is not None: + # pastebin file will be utf-8 encoded binary file + config._pastebinfile = tempfile.TemporaryFile("w+b") + oldwrite = tr._tw.write + + def tee_write(s, **kwargs): + oldwrite(s, **kwargs) + if isinstance(s, six.text_type): + s = s.encode("utf-8") + config._pastebinfile.write(s) + + tr._tw.write = tee_write + + +def pytest_unconfigure(config): + if hasattr(config, "_pastebinfile"): + # get terminal contents and delete file + config._pastebinfile.seek(0) + sessionlog = config._pastebinfile.read() + config._pastebinfile.close() + del config._pastebinfile + # undo our patching in the terminal reporter + tr = config.pluginmanager.getplugin("terminalreporter") + del tr._tw.__dict__["write"] + # write summary + tr.write_sep("=", "Sending information to Paste Service") + pastebinurl = create_new_paste(sessionlog) + tr.write_line("pastebin session-log: %s\n" % pastebinurl) + + +def create_new_paste(contents): + """ + Creates a new paste using bpaste.net service. + + :contents: paste contents as utf-8 encoded bytes + :returns: url to the pasted contents + """ + import re + + if sys.version_info < (3, 0): + from urllib import urlopen, urlencode + else: + from urllib.request import urlopen + from urllib.parse import urlencode + + params = { + "code": contents, + "lexer": "python3" if sys.version_info[0] == 3 else "python", + "expiry": "1week", + } + url = "https://bpaste.net" + response = urlopen(url, data=urlencode(params).encode("ascii")).read() + m = re.search(r'href="/raw/(\w+)"', response.decode("utf-8")) + if m: + return "%s/show/%s" % (url, m.group(1)) + else: + return "bad response: " + response + + +def pytest_terminal_summary(terminalreporter): + import _pytest.config + + if terminalreporter.config.option.pastebin != "failed": + return + tr = terminalreporter + if "failed" in tr.stats: + terminalreporter.write_sep("=", "Sending information to Paste Service") + for rep in terminalreporter.stats.get("failed"): + try: + msg = rep.longrepr.reprtraceback.reprentries[-1].reprfileloc + except AttributeError: + msg = tr._getfailureheadline(rep) + tw = _pytest.config.create_terminal_writer( + terminalreporter.config, stringio=True + ) + rep.toterminal(tw) + s = tw.stringio.getvalue() + assert len(s) + pastebinurl = create_new_paste(s) + tr.write_line("%s --> %s" % (msg, pastebinurl)) diff --git a/venv/Lib/site-packages/_pytest/pathlib.py b/venv/Lib/site-packages/_pytest/pathlib.py new file mode 100644 index 00000000..cda5e994 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/pathlib.py @@ -0,0 +1,283 @@ + +import os +import errno +import atexit +import operator +import six +import sys +from functools import reduce +import uuid +from six.moves import map +import itertools +import shutil +from os.path import expanduser, expandvars, isabs, sep +from posixpath import sep as posix_sep +import fnmatch +import stat + +from .compat import PY36 + + +if PY36: + from pathlib import Path, PurePath +else: + from pathlib2 import Path, PurePath + +__all__ = ["Path", "PurePath"] + + +LOCK_TIMEOUT = 60 * 60 * 3 + +get_lock_path = operator.methodcaller("joinpath", ".lock") + + +def ensure_reset_dir(path): + """ + ensures the given path is a empty directory + """ + if path.exists(): + rmtree(path, force=True) + path.mkdir() + + +def _shutil_rmtree_remove_writable(func, fspath, _): + "Clear the readonly bit and reattempt the removal" + os.chmod(fspath, stat.S_IWRITE) + func(fspath) + + +def rmtree(path, force=False): + if force: + # ignore_errors leaves dead folders around + # python needs a rm -rf as a followup + # the trick with _shutil_rmtree_remove_writable is unreliable + shutil.rmtree(str(path), ignore_errors=True) + else: + shutil.rmtree(str(path)) + + +def find_prefixed(root, prefix): + """finds all elements in root that begin with the prefix, case insensitive""" + l_prefix = prefix.lower() + for x in root.iterdir(): + if x.name.lower().startswith(l_prefix): + yield x + + +def extract_suffixes(iter, prefix): + """ + :param iter: iterator over path names + :param prefix: expected prefix of the path names + :returns: the parts of the paths following the prefix + """ + p_len = len(prefix) + for p in iter: + yield p.name[p_len:] + + +def find_suffixes(root, prefix): + """combines find_prefixes and extract_suffixes + """ + return extract_suffixes(find_prefixed(root, prefix), prefix) + + +def parse_num(maybe_num): + """parses number path suffixes, returns -1 on error""" + try: + return int(maybe_num) + except ValueError: + return -1 + + +if six.PY2: + + def _max(iterable, default): + """needed due to python2.7 lacking the default argument for max""" + return reduce(max, iterable, default) + + +else: + _max = max + + +def make_numbered_dir(root, prefix): + """create a directory with a increased number as suffix for the given prefix""" + for i in range(10): + # try up to 10 times to create the folder + max_existing = _max(map(parse_num, find_suffixes(root, prefix)), default=-1) + new_number = max_existing + 1 + new_path = root.joinpath("{}{}".format(prefix, new_number)) + try: + new_path.mkdir() + except Exception: + pass + else: + return new_path + else: + raise EnvironmentError( + "could not create numbered dir with prefix " + "{prefix} in {root} after 10 tries".format(prefix=prefix, root=root) + ) + + +def create_cleanup_lock(p): + """crates a lock to prevent premature folder cleanup""" + lock_path = get_lock_path(p) + try: + fd = os.open(str(lock_path), os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o644) + except OSError as e: + if e.errno == errno.EEXIST: + six.raise_from( + EnvironmentError("cannot create lockfile in {path}".format(path=p)), e + ) + else: + raise + else: + pid = os.getpid() + spid = str(pid) + if not isinstance(spid, six.binary_type): + spid = spid.encode("ascii") + os.write(fd, spid) + os.close(fd) + if not lock_path.is_file(): + raise EnvironmentError("lock path got renamed after sucessfull creation") + return lock_path + + +def register_cleanup_lock_removal(lock_path, register=atexit.register): + """registers a cleanup function for removing a lock, by default on atexit""" + pid = os.getpid() + + def cleanup_on_exit(lock_path=lock_path, original_pid=pid): + current_pid = os.getpid() + if current_pid != original_pid: + # fork + return + try: + lock_path.unlink() + except (OSError, IOError): + pass + + return register(cleanup_on_exit) + + +def delete_a_numbered_dir(path): + """removes a numbered directory""" + create_cleanup_lock(path) + parent = path.parent + + garbage = parent.joinpath("garbage-{}".format(uuid.uuid4())) + path.rename(garbage) + rmtree(garbage, force=True) + + +def ensure_deletable(path, consider_lock_dead_if_created_before): + """checks if a lock exists and breaks it if its considered dead""" + if path.is_symlink(): + return False + lock = get_lock_path(path) + if not lock.exists(): + return True + try: + lock_time = lock.stat().st_mtime + except Exception: + return False + else: + if lock_time < consider_lock_dead_if_created_before: + lock.unlink() + return True + else: + return False + + +def try_cleanup(path, consider_lock_dead_if_created_before): + """tries to cleanup a folder if we can ensure its deletable""" + if ensure_deletable(path, consider_lock_dead_if_created_before): + delete_a_numbered_dir(path) + + +def cleanup_candidates(root, prefix, keep): + """lists candidates for numbered directories to be removed - follows py.path""" + max_existing = _max(map(parse_num, find_suffixes(root, prefix)), default=-1) + max_delete = max_existing - keep + paths = find_prefixed(root, prefix) + paths, paths2 = itertools.tee(paths) + numbers = map(parse_num, extract_suffixes(paths2, prefix)) + for path, number in zip(paths, numbers): + if number <= max_delete: + yield path + + +def cleanup_numbered_dir(root, prefix, keep, consider_lock_dead_if_created_before): + """cleanup for lock driven numbered directories""" + for path in cleanup_candidates(root, prefix, keep): + try_cleanup(path, consider_lock_dead_if_created_before) + for path in root.glob("garbage-*"): + try_cleanup(path, consider_lock_dead_if_created_before) + + +def make_numbered_dir_with_cleanup(root, prefix, keep, lock_timeout): + """creates a numbered dir with a cleanup lock and removes old ones""" + e = None + for i in range(10): + try: + p = make_numbered_dir(root, prefix) + lock_path = create_cleanup_lock(p) + register_cleanup_lock_removal(lock_path) + except Exception as e: + pass + else: + consider_lock_dead_if_created_before = p.stat().st_mtime - lock_timeout + cleanup_numbered_dir( + root=root, + prefix=prefix, + keep=keep, + consider_lock_dead_if_created_before=consider_lock_dead_if_created_before, + ) + return p + assert e is not None + raise e + + +def resolve_from_str(input, root): + assert not isinstance(input, Path), "would break on py2" + root = Path(root) + input = expanduser(input) + input = expandvars(input) + if isabs(input): + return Path(input) + else: + return root.joinpath(input) + + +def fnmatch_ex(pattern, path): + """FNMatcher port from py.path.common which works with PurePath() instances. + + The difference between this algorithm and PurePath.match() is that the latter matches "**" glob expressions + for each part of the path, while this algorithm uses the whole path instead. + + For example: + "tests/foo/bar/doc/test_foo.py" matches pattern "tests/**/doc/test*.py" with this algorithm, but not with + PurePath.match(). + + This algorithm was ported to keep backward-compatibility with existing settings which assume paths match according + this logic. + + References: + * https://bugs.python.org/issue29249 + * https://bugs.python.org/issue34731 + """ + path = PurePath(path) + iswin32 = sys.platform.startswith("win") + + if iswin32 and sep not in pattern and posix_sep in pattern: + # Running on Windows, the pattern has no Windows path separators, + # and the pattern has one or more Posix path separators. Replace + # the Posix path separators with the Windows path separator. + pattern = pattern.replace(posix_sep, sep) + + if sep not in pattern: + name = path.name + else: + name = six.text_type(path) + return fnmatch.fnmatch(name, pattern) diff --git a/venv/Lib/site-packages/_pytest/pytester.py b/venv/Lib/site-packages/_pytest/pytester.py new file mode 100644 index 00000000..8782a30b --- /dev/null +++ b/venv/Lib/site-packages/_pytest/pytester.py @@ -0,0 +1,1381 @@ +"""(disabled by default) support for testing pytest and pytest plugins.""" +from __future__ import absolute_import, division, print_function + +import codecs +import gc +import os +import platform +import re +import subprocess +import six +import sys +import time +import traceback +from fnmatch import fnmatch + +from weakref import WeakKeyDictionary + +from _pytest.capture import MultiCapture, SysCapture +from _pytest._code import Source +from _pytest.main import Session, EXIT_INTERRUPTED, EXIT_OK +from _pytest.assertion.rewrite import AssertionRewritingHook +from _pytest.pathlib import Path +from _pytest.compat import safe_str + +import py +import pytest + +IGNORE_PAM = [ # filenames added when obtaining details about the current user + u"/var/lib/sss/mc/passwd" +] + + +def pytest_addoption(parser): + parser.addoption( + "--lsof", + action="store_true", + dest="lsof", + default=False, + help="run FD checks if lsof is available", + ) + + parser.addoption( + "--runpytest", + default="inprocess", + dest="runpytest", + choices=("inprocess", "subprocess"), + help=( + "run pytest sub runs in tests using an 'inprocess' " + "or 'subprocess' (python -m main) method" + ), + ) + + parser.addini( + "pytester_example_dir", help="directory to take the pytester example files from" + ) + + +def pytest_configure(config): + if config.getvalue("lsof"): + checker = LsofFdLeakChecker() + if checker.matching_platform(): + config.pluginmanager.register(checker) + + +def raise_on_kwargs(kwargs): + if kwargs: + raise TypeError("Unexpected arguments: {}".format(", ".join(sorted(kwargs)))) + + +class LsofFdLeakChecker(object): + def get_open_files(self): + out = self._exec_lsof() + open_files = self._parse_lsof_output(out) + return open_files + + def _exec_lsof(self): + pid = os.getpid() + return py.process.cmdexec("lsof -Ffn0 -p %d" % pid) + + def _parse_lsof_output(self, out): + def isopen(line): + return line.startswith("f") and ( + "deleted" not in line + and "mem" not in line + and "txt" not in line + and "cwd" not in line + ) + + open_files = [] + + for line in out.split("\n"): + if isopen(line): + fields = line.split("\0") + fd = fields[0][1:] + filename = fields[1][1:] + if filename in IGNORE_PAM: + continue + if filename.startswith("/"): + open_files.append((fd, filename)) + + return open_files + + def matching_platform(self): + try: + py.process.cmdexec("lsof -v") + except (py.process.cmdexec.Error, UnicodeDecodeError): + # cmdexec may raise UnicodeDecodeError on Windows systems with + # locale other than English: + # https://bitbucket.org/pytest-dev/py/issues/66 + return False + else: + return True + + @pytest.hookimpl(hookwrapper=True, tryfirst=True) + def pytest_runtest_protocol(self, item): + lines1 = self.get_open_files() + yield + if hasattr(sys, "pypy_version_info"): + gc.collect() + lines2 = self.get_open_files() + + new_fds = {t[0] for t in lines2} - {t[0] for t in lines1} + leaked_files = [t for t in lines2 if t[0] in new_fds] + if leaked_files: + error = [] + error.append("***** %s FD leakage detected" % len(leaked_files)) + error.extend([str(f) for f in leaked_files]) + error.append("*** Before:") + error.extend([str(f) for f in lines1]) + error.append("*** After:") + error.extend([str(f) for f in lines2]) + error.append(error[0]) + error.append("*** function %s:%s: %s " % item.location) + error.append("See issue #2366") + item.warn(pytest.PytestWarning("\n".join(error))) + + +# XXX copied from execnet's conftest.py - needs to be merged +winpymap = { + "python2.7": r"C:\Python27\python.exe", + "python3.4": r"C:\Python34\python.exe", + "python3.5": r"C:\Python35\python.exe", + "python3.6": r"C:\Python36\python.exe", +} + + +def getexecutable(name, cache={}): + try: + return cache[name] + except KeyError: + executable = py.path.local.sysfind(name) + if executable: + import subprocess + + popen = subprocess.Popen( + [str(executable), "--version"], + universal_newlines=True, + stderr=subprocess.PIPE, + ) + out, err = popen.communicate() + if name == "jython": + if not err or "2.5" not in err: + executable = None + if "2.5.2" in err: + executable = None # http://bugs.jython.org/issue1790 + elif popen.returncode != 0: + # handle pyenv's 127 + executable = None + cache[name] = executable + return executable + + +@pytest.fixture(params=["python2.7", "python3.4", "pypy", "pypy3"]) +def anypython(request): + name = request.param + executable = getexecutable(name) + if executable is None: + if sys.platform == "win32": + executable = winpymap.get(name, None) + if executable: + executable = py.path.local(executable) + if executable.check(): + return executable + pytest.skip("no suitable %s found" % (name,)) + return executable + + +# used at least by pytest-xdist plugin + + +@pytest.fixture +def _pytest(request): + """Return a helper which offers a gethookrecorder(hook) method which + returns a HookRecorder instance which helps to make assertions about called + hooks. + + """ + return PytestArg(request) + + +class PytestArg(object): + def __init__(self, request): + self.request = request + + def gethookrecorder(self, hook): + hookrecorder = HookRecorder(hook._pm) + self.request.addfinalizer(hookrecorder.finish_recording) + return hookrecorder + + +def get_public_names(values): + """Only return names from iterator values without a leading underscore.""" + return [x for x in values if x[0] != "_"] + + +class ParsedCall(object): + def __init__(self, name, kwargs): + self.__dict__.update(kwargs) + self._name = name + + def __repr__(self): + d = self.__dict__.copy() + del d["_name"] + return "" % (self._name, d) + + +class HookRecorder(object): + """Record all hooks called in a plugin manager. + + This wraps all the hook calls in the plugin manager, recording each call + before propagating the normal calls. + + """ + + def __init__(self, pluginmanager): + self._pluginmanager = pluginmanager + self.calls = [] + + def before(hook_name, hook_impls, kwargs): + self.calls.append(ParsedCall(hook_name, kwargs)) + + def after(outcome, hook_name, hook_impls, kwargs): + pass + + self._undo_wrapping = pluginmanager.add_hookcall_monitoring(before, after) + + def finish_recording(self): + self._undo_wrapping() + + def getcalls(self, names): + if isinstance(names, str): + names = names.split() + return [call for call in self.calls if call._name in names] + + def assert_contains(self, entries): + __tracebackhide__ = True + i = 0 + entries = list(entries) + backlocals = sys._getframe(1).f_locals + while entries: + name, check = entries.pop(0) + for ind, call in enumerate(self.calls[i:]): + if call._name == name: + print("NAMEMATCH", name, call) + if eval(check, backlocals, call.__dict__): + print("CHECKERMATCH", repr(check), "->", call) + else: + print("NOCHECKERMATCH", repr(check), "-", call) + continue + i += ind + 1 + break + print("NONAMEMATCH", name, "with", call) + else: + pytest.fail("could not find %r check %r" % (name, check)) + + def popcall(self, name): + __tracebackhide__ = True + for i, call in enumerate(self.calls): + if call._name == name: + del self.calls[i] + return call + lines = ["could not find call %r, in:" % (name,)] + lines.extend([" %s" % x for x in self.calls]) + pytest.fail("\n".join(lines)) + + def getcall(self, name): + values = self.getcalls(name) + assert len(values) == 1, (name, values) + return values[0] + + # functionality for test reports + + def getreports(self, names="pytest_runtest_logreport pytest_collectreport"): + return [x.report for x in self.getcalls(names)] + + def matchreport( + self, + inamepart="", + names="pytest_runtest_logreport pytest_collectreport", + when=None, + ): + """return a testreport whose dotted import path matches""" + values = [] + for rep in self.getreports(names=names): + try: + if not when and rep.when != "call" and rep.passed: + # setup/teardown passing reports - let's ignore those + continue + except AttributeError: + pass + if when and getattr(rep, "when", None) != when: + continue + if not inamepart or inamepart in rep.nodeid.split("::"): + values.append(rep) + if not values: + raise ValueError( + "could not find test report matching %r: " + "no test reports at all!" % (inamepart,) + ) + if len(values) > 1: + raise ValueError( + "found 2 or more testreports matching %r: %s" % (inamepart, values) + ) + return values[0] + + def getfailures(self, names="pytest_runtest_logreport pytest_collectreport"): + return [rep for rep in self.getreports(names) if rep.failed] + + def getfailedcollections(self): + return self.getfailures("pytest_collectreport") + + def listoutcomes(self): + passed = [] + skipped = [] + failed = [] + for rep in self.getreports("pytest_collectreport pytest_runtest_logreport"): + if rep.passed: + if getattr(rep, "when", None) == "call": + passed.append(rep) + elif rep.skipped: + skipped.append(rep) + elif rep.failed: + failed.append(rep) + return passed, skipped, failed + + def countoutcomes(self): + return [len(x) for x in self.listoutcomes()] + + def assertoutcome(self, passed=0, skipped=0, failed=0): + realpassed, realskipped, realfailed = self.listoutcomes() + assert passed == len(realpassed) + assert skipped == len(realskipped) + assert failed == len(realfailed) + + def clear(self): + self.calls[:] = [] + + +@pytest.fixture +def linecomp(request): + return LineComp() + + +@pytest.fixture(name="LineMatcher") +def LineMatcher_fixture(request): + return LineMatcher + + +@pytest.fixture +def testdir(request, tmpdir_factory): + return Testdir(request, tmpdir_factory) + + +rex_outcome = re.compile(r"(\d+) ([\w-]+)") + + +class RunResult(object): + """The result of running a command. + + Attributes: + + :ret: the return value + :outlines: list of lines captured from stdout + :errlines: list of lines captures from stderr + :stdout: :py:class:`LineMatcher` of stdout, use ``stdout.str()`` to + reconstruct stdout or the commonly used ``stdout.fnmatch_lines()`` + method + :stderr: :py:class:`LineMatcher` of stderr + :duration: duration in seconds + + """ + + def __init__(self, ret, outlines, errlines, duration): + self.ret = ret + self.outlines = outlines + self.errlines = errlines + self.stdout = LineMatcher(outlines) + self.stderr = LineMatcher(errlines) + self.duration = duration + + def parseoutcomes(self): + """Return a dictionary of outcomestring->num from parsing the terminal + output that the test process produced. + + """ + for line in reversed(self.outlines): + if "seconds" in line: + outcomes = rex_outcome.findall(line) + if outcomes: + d = {} + for num, cat in outcomes: + d[cat] = int(num) + return d + raise ValueError("Pytest terminal report not found") + + def assert_outcomes( + self, passed=0, skipped=0, failed=0, error=0, xpassed=0, xfailed=0 + ): + """Assert that the specified outcomes appear with the respective + numbers (0 means it didn't occur) in the text output from a test run. + + """ + d = self.parseoutcomes() + obtained = { + "passed": d.get("passed", 0), + "skipped": d.get("skipped", 0), + "failed": d.get("failed", 0), + "error": d.get("error", 0), + "xpassed": d.get("xpassed", 0), + "xfailed": d.get("xfailed", 0), + } + expected = { + "passed": passed, + "skipped": skipped, + "failed": failed, + "error": error, + "xpassed": xpassed, + "xfailed": xfailed, + } + assert obtained == expected + + +class CwdSnapshot(object): + def __init__(self): + self.__saved = os.getcwd() + + def restore(self): + os.chdir(self.__saved) + + +class SysModulesSnapshot(object): + def __init__(self, preserve=None): + self.__preserve = preserve + self.__saved = dict(sys.modules) + + def restore(self): + if self.__preserve: + self.__saved.update( + (k, m) for k, m in sys.modules.items() if self.__preserve(k) + ) + sys.modules.clear() + sys.modules.update(self.__saved) + + +class SysPathsSnapshot(object): + def __init__(self): + self.__saved = list(sys.path), list(sys.meta_path) + + def restore(self): + sys.path[:], sys.meta_path[:] = self.__saved + + +class Testdir(object): + """Temporary test directory with tools to test/run pytest itself. + + This is based on the ``tmpdir`` fixture but provides a number of methods + which aid with testing pytest itself. Unless :py:meth:`chdir` is used all + methods will use :py:attr:`tmpdir` as their current working directory. + + Attributes: + + :tmpdir: The :py:class:`py.path.local` instance of the temporary directory. + + :plugins: A list of plugins to use with :py:meth:`parseconfig` and + :py:meth:`runpytest`. Initially this is an empty list but plugins can + be added to the list. The type of items to add to the list depends on + the method using them so refer to them for details. + + """ + + class TimeoutExpired(Exception): + pass + + def __init__(self, request, tmpdir_factory): + self.request = request + self._mod_collections = WeakKeyDictionary() + name = request.function.__name__ + self.tmpdir = tmpdir_factory.mktemp(name, numbered=True) + self.test_tmproot = tmpdir_factory.mktemp("tmp-" + name, numbered=True) + os.environ["PYTEST_DEBUG_TEMPROOT"] = str(self.test_tmproot) + self.plugins = [] + self._cwd_snapshot = CwdSnapshot() + self._sys_path_snapshot = SysPathsSnapshot() + self._sys_modules_snapshot = self.__take_sys_modules_snapshot() + self.chdir() + self.request.addfinalizer(self.finalize) + method = self.request.config.getoption("--runpytest") + if method == "inprocess": + self._runpytest_method = self.runpytest_inprocess + elif method == "subprocess": + self._runpytest_method = self.runpytest_subprocess + + def __repr__(self): + return "" % (self.tmpdir,) + + def finalize(self): + """Clean up global state artifacts. + + Some methods modify the global interpreter state and this tries to + clean this up. It does not remove the temporary directory however so + it can be looked at after the test run has finished. + + """ + self._sys_modules_snapshot.restore() + self._sys_path_snapshot.restore() + self._cwd_snapshot.restore() + os.environ.pop("PYTEST_DEBUG_TEMPROOT", None) + + def __take_sys_modules_snapshot(self): + # some zope modules used by twisted-related tests keep internal state + # and can't be deleted; we had some trouble in the past with + # `zope.interface` for example + def preserve_module(name): + return name.startswith("zope") + + return SysModulesSnapshot(preserve=preserve_module) + + def make_hook_recorder(self, pluginmanager): + """Create a new :py:class:`HookRecorder` for a PluginManager.""" + pluginmanager.reprec = reprec = HookRecorder(pluginmanager) + self.request.addfinalizer(reprec.finish_recording) + return reprec + + def chdir(self): + """Cd into the temporary directory. + + This is done automatically upon instantiation. + + """ + self.tmpdir.chdir() + + def _makefile(self, ext, args, kwargs, encoding="utf-8"): + items = list(kwargs.items()) + + def to_text(s): + return s.decode(encoding) if isinstance(s, bytes) else six.text_type(s) + + if args: + source = u"\n".join(to_text(x) for x in args) + basename = self.request.function.__name__ + items.insert(0, (basename, source)) + + ret = None + for basename, value in items: + p = self.tmpdir.join(basename).new(ext=ext) + p.dirpath().ensure_dir() + source = Source(value) + source = u"\n".join(to_text(line) for line in source.lines) + p.write(source.strip().encode(encoding), "wb") + if ret is None: + ret = p + return ret + + def makefile(self, ext, *args, **kwargs): + r"""Create new file(s) in the testdir. + + :param str ext: The extension the file(s) should use, including the dot, e.g. `.py`. + :param list[str] args: All args will be treated as strings and joined using newlines. + The result will be written as contents to the file. The name of the + file will be based on the test function requesting this fixture. + :param kwargs: Each keyword is the name of a file, while the value of it will + be written as contents of the file. + + Examples: + + .. code-block:: python + + testdir.makefile(".txt", "line1", "line2") + + testdir.makefile(".ini", pytest="[pytest]\naddopts=-rs\n") + + """ + return self._makefile(ext, args, kwargs) + + def makeconftest(self, source): + """Write a contest.py file with 'source' as contents.""" + return self.makepyfile(conftest=source) + + def makeini(self, source): + """Write a tox.ini file with 'source' as contents.""" + return self.makefile(".ini", tox=source) + + def getinicfg(self, source): + """Return the pytest section from the tox.ini config file.""" + p = self.makeini(source) + return py.iniconfig.IniConfig(p)["pytest"] + + def makepyfile(self, *args, **kwargs): + """Shortcut for .makefile() with a .py extension.""" + return self._makefile(".py", args, kwargs) + + def maketxtfile(self, *args, **kwargs): + """Shortcut for .makefile() with a .txt extension.""" + return self._makefile(".txt", args, kwargs) + + def syspathinsert(self, path=None): + """Prepend a directory to sys.path, defaults to :py:attr:`tmpdir`. + + This is undone automatically when this object dies at the end of each + test. + + """ + if path is None: + path = self.tmpdir + sys.path.insert(0, str(path)) + # a call to syspathinsert() usually means that the caller wants to + # import some dynamically created files, thus with python3 we + # invalidate its import caches + self._possibly_invalidate_import_caches() + + def _possibly_invalidate_import_caches(self): + # invalidate caches if we can (py33 and above) + try: + import importlib + except ImportError: + pass + else: + if hasattr(importlib, "invalidate_caches"): + importlib.invalidate_caches() + + def mkdir(self, name): + """Create a new (sub)directory.""" + return self.tmpdir.mkdir(name) + + def mkpydir(self, name): + """Create a new python package. + + This creates a (sub)directory with an empty ``__init__.py`` file so it + gets recognised as a python package. + + """ + p = self.mkdir(name) + p.ensure("__init__.py") + return p + + def copy_example(self, name=None): + import warnings + from _pytest.warning_types import PYTESTER_COPY_EXAMPLE + + warnings.warn(PYTESTER_COPY_EXAMPLE, stacklevel=2) + example_dir = self.request.config.getini("pytester_example_dir") + if example_dir is None: + raise ValueError("pytester_example_dir is unset, can't copy examples") + example_dir = self.request.config.rootdir.join(example_dir) + + for extra_element in self.request.node.iter_markers("pytester_example_path"): + assert extra_element.args + example_dir = example_dir.join(*extra_element.args) + + if name is None: + func_name = self.request.function.__name__ + maybe_dir = example_dir / func_name + maybe_file = example_dir / (func_name + ".py") + + if maybe_dir.isdir(): + example_path = maybe_dir + elif maybe_file.isfile(): + example_path = maybe_file + else: + raise LookupError( + "{} cant be found as module or package in {}".format( + func_name, example_dir.bestrelpath(self.request.confg.rootdir) + ) + ) + else: + example_path = example_dir.join(name) + + if example_path.isdir() and not example_path.join("__init__.py").isfile(): + example_path.copy(self.tmpdir) + return self.tmpdir + elif example_path.isfile(): + result = self.tmpdir.join(example_path.basename) + example_path.copy(result) + return result + else: + raise LookupError( + 'example "{}" is not found as a file or directory'.format(example_path) + ) + + Session = Session + + def getnode(self, config, arg): + """Return the collection node of a file. + + :param config: :py:class:`_pytest.config.Config` instance, see + :py:meth:`parseconfig` and :py:meth:`parseconfigure` to create the + configuration + + :param arg: a :py:class:`py.path.local` instance of the file + + """ + session = Session(config) + assert "::" not in str(arg) + p = py.path.local(arg) + config.hook.pytest_sessionstart(session=session) + res = session.perform_collect([str(p)], genitems=False)[0] + config.hook.pytest_sessionfinish(session=session, exitstatus=EXIT_OK) + return res + + def getpathnode(self, path): + """Return the collection node of a file. + + This is like :py:meth:`getnode` but uses :py:meth:`parseconfigure` to + create the (configured) pytest Config instance. + + :param path: a :py:class:`py.path.local` instance of the file + + """ + config = self.parseconfigure(path) + session = Session(config) + x = session.fspath.bestrelpath(path) + config.hook.pytest_sessionstart(session=session) + res = session.perform_collect([x], genitems=False)[0] + config.hook.pytest_sessionfinish(session=session, exitstatus=EXIT_OK) + return res + + def genitems(self, colitems): + """Generate all test items from a collection node. + + This recurses into the collection node and returns a list of all the + test items contained within. + + """ + session = colitems[0].session + result = [] + for colitem in colitems: + result.extend(session.genitems(colitem)) + return result + + def runitem(self, source): + """Run the "test_func" Item. + + The calling test instance (class containing the test method) must + provide a ``.getrunner()`` method which should return a runner which + can run the test protocol for a single item, e.g. + :py:func:`_pytest.runner.runtestprotocol`. + + """ + # used from runner functional tests + item = self.getitem(source) + # the test class where we are called from wants to provide the runner + testclassinstance = self.request.instance + runner = testclassinstance.getrunner() + return runner(item) + + def inline_runsource(self, source, *cmdlineargs): + """Run a test module in process using ``pytest.main()``. + + This run writes "source" into a temporary file and runs + ``pytest.main()`` on it, returning a :py:class:`HookRecorder` instance + for the result. + + :param source: the source code of the test module + + :param cmdlineargs: any extra command line arguments to use + + :return: :py:class:`HookRecorder` instance of the result + + """ + p = self.makepyfile(source) + values = list(cmdlineargs) + [p] + return self.inline_run(*values) + + def inline_genitems(self, *args): + """Run ``pytest.main(['--collectonly'])`` in-process. + + Runs the :py:func:`pytest.main` function to run all of pytest inside + the test process itself like :py:meth:`inline_run`, but returns a + tuple of the collected items and a :py:class:`HookRecorder` instance. + + """ + rec = self.inline_run("--collect-only", *args) + items = [x.item for x in rec.getcalls("pytest_itemcollected")] + return items, rec + + def inline_run(self, *args, **kwargs): + """Run ``pytest.main()`` in-process, returning a HookRecorder. + + Runs the :py:func:`pytest.main` function to run all of pytest inside + the test process itself. This means it can return a + :py:class:`HookRecorder` instance which gives more detailed results + from that run than can be done by matching stdout/stderr from + :py:meth:`runpytest`. + + :param args: command line arguments to pass to :py:func:`pytest.main` + + :param plugin: (keyword-only) extra plugin instances the + ``pytest.main()`` instance should use + + :return: a :py:class:`HookRecorder` instance + + """ + finalizers = [] + try: + # When running pytest inline any plugins active in the main test + # process are already imported. So this disables the warning which + # will trigger to say they can no longer be rewritten, which is + # fine as they have already been rewritten. + orig_warn = AssertionRewritingHook._warn_already_imported + + def revert_warn_already_imported(): + AssertionRewritingHook._warn_already_imported = orig_warn + + finalizers.append(revert_warn_already_imported) + AssertionRewritingHook._warn_already_imported = lambda *a: None + + # Any sys.module or sys.path changes done while running pytest + # inline should be reverted after the test run completes to avoid + # clashing with later inline tests run within the same pytest test, + # e.g. just because they use matching test module names. + finalizers.append(self.__take_sys_modules_snapshot().restore) + finalizers.append(SysPathsSnapshot().restore) + + # Important note: + # - our tests should not leave any other references/registrations + # laying around other than possibly loaded test modules + # referenced from sys.modules, as nothing will clean those up + # automatically + + rec = [] + + class Collect(object): + def pytest_configure(x, config): + rec.append(self.make_hook_recorder(config.pluginmanager)) + + plugins = kwargs.get("plugins") or [] + plugins.append(Collect()) + ret = pytest.main(list(args), plugins=plugins) + if len(rec) == 1: + reprec = rec.pop() + else: + + class reprec(object): + pass + + reprec.ret = ret + + # typically we reraise keyboard interrupts from the child run + # because it's our user requesting interruption of the testing + if ret == EXIT_INTERRUPTED and not kwargs.get("no_reraise_ctrlc"): + calls = reprec.getcalls("pytest_keyboard_interrupt") + if calls and calls[-1].excinfo.type == KeyboardInterrupt: + raise KeyboardInterrupt() + return reprec + finally: + for finalizer in finalizers: + finalizer() + + def runpytest_inprocess(self, *args, **kwargs): + """Return result of running pytest in-process, providing a similar + interface to what self.runpytest() provides. + + """ + if kwargs.get("syspathinsert"): + self.syspathinsert() + now = time.time() + capture = MultiCapture(Capture=SysCapture) + capture.start_capturing() + try: + try: + reprec = self.inline_run(*args, **kwargs) + except SystemExit as e: + + class reprec(object): + ret = e.args[0] + + except Exception: + traceback.print_exc() + + class reprec(object): + ret = 3 + + finally: + out, err = capture.readouterr() + capture.stop_capturing() + sys.stdout.write(out) + sys.stderr.write(err) + + res = RunResult(reprec.ret, out.split("\n"), err.split("\n"), time.time() - now) + res.reprec = reprec + return res + + def runpytest(self, *args, **kwargs): + """Run pytest inline or in a subprocess, depending on the command line + option "--runpytest" and return a :py:class:`RunResult`. + + """ + args = self._ensure_basetemp(args) + return self._runpytest_method(*args, **kwargs) + + def _ensure_basetemp(self, args): + args = list(args) + for x in args: + if safe_str(x).startswith("--basetemp"): + break + else: + args.append("--basetemp=%s" % self.tmpdir.dirpath("basetemp")) + return args + + def parseconfig(self, *args): + """Return a new pytest Config instance from given commandline args. + + This invokes the pytest bootstrapping code in _pytest.config to create + a new :py:class:`_pytest.core.PluginManager` and call the + pytest_cmdline_parse hook to create a new + :py:class:`_pytest.config.Config` instance. + + If :py:attr:`plugins` has been populated they should be plugin modules + to be registered with the PluginManager. + + """ + args = self._ensure_basetemp(args) + + import _pytest.config + + config = _pytest.config._prepareconfig(args, self.plugins) + # we don't know what the test will do with this half-setup config + # object and thus we make sure it gets unconfigured properly in any + # case (otherwise capturing could still be active, for example) + self.request.addfinalizer(config._ensure_unconfigure) + return config + + def parseconfigure(self, *args): + """Return a new pytest configured Config instance. + + This returns a new :py:class:`_pytest.config.Config` instance like + :py:meth:`parseconfig`, but also calls the pytest_configure hook. + + """ + config = self.parseconfig(*args) + config._do_configure() + self.request.addfinalizer(config._ensure_unconfigure) + return config + + def getitem(self, source, funcname="test_func"): + """Return the test item for a test function. + + This writes the source to a python file and runs pytest's collection on + the resulting module, returning the test item for the requested + function name. + + :param source: the module source + + :param funcname: the name of the test function for which to return a + test item + + """ + items = self.getitems(source) + for item in items: + if item.name == funcname: + return item + assert 0, "%r item not found in module:\n%s\nitems: %s" % ( + funcname, + source, + items, + ) + + def getitems(self, source): + """Return all test items collected from the module. + + This writes the source to a python file and runs pytest's collection on + the resulting module, returning all test items contained within. + + """ + modcol = self.getmodulecol(source) + return self.genitems([modcol]) + + def getmodulecol(self, source, configargs=(), withinit=False): + """Return the module collection node for ``source``. + + This writes ``source`` to a file using :py:meth:`makepyfile` and then + runs the pytest collection on it, returning the collection node for the + test module. + + :param source: the source code of the module to collect + + :param configargs: any extra arguments to pass to + :py:meth:`parseconfigure` + + :param withinit: whether to also write an ``__init__.py`` file to the + same directory to ensure it is a package + + """ + if isinstance(source, Path): + path = self.tmpdir.join(str(source)) + assert not withinit, "not supported for paths" + else: + kw = {self.request.function.__name__: Source(source).strip()} + path = self.makepyfile(**kw) + if withinit: + self.makepyfile(__init__="#") + self.config = config = self.parseconfigure(path, *configargs) + return self.getnode(config, path) + + def collect_by_name(self, modcol, name): + """Return the collection node for name from the module collection. + + This will search a module collection node for a collection node + matching the given name. + + :param modcol: a module collection node; see :py:meth:`getmodulecol` + + :param name: the name of the node to return + + """ + if modcol not in self._mod_collections: + self._mod_collections[modcol] = list(modcol.collect()) + for colitem in self._mod_collections[modcol]: + if colitem.name == name: + return colitem + + def popen(self, cmdargs, stdout, stderr, **kw): + """Invoke subprocess.Popen. + + This calls subprocess.Popen making sure the current working directory + is in the PYTHONPATH. + + You probably want to use :py:meth:`run` instead. + + """ + env = os.environ.copy() + env["PYTHONPATH"] = os.pathsep.join( + filter(None, [os.getcwd(), env.get("PYTHONPATH", "")]) + ) + kw["env"] = env + + popen = subprocess.Popen( + cmdargs, stdin=subprocess.PIPE, stdout=stdout, stderr=stderr, **kw + ) + popen.stdin.close() + + return popen + + def run(self, *cmdargs, **kwargs): + """Run a command with arguments. + + Run a process using subprocess.Popen saving the stdout and stderr. + + :param args: the sequence of arguments to pass to `subprocess.Popen()` + :param timeout: the period in seconds after which to timeout and raise + :py:class:`Testdir.TimeoutExpired` + + Returns a :py:class:`RunResult`. + + """ + __tracebackhide__ = True + + timeout = kwargs.pop("timeout", None) + raise_on_kwargs(kwargs) + + cmdargs = [ + str(arg) if isinstance(arg, py.path.local) else arg for arg in cmdargs + ] + p1 = self.tmpdir.join("stdout") + p2 = self.tmpdir.join("stderr") + print("running:", *cmdargs) + print(" in:", py.path.local()) + f1 = codecs.open(str(p1), "w", encoding="utf8") + f2 = codecs.open(str(p2), "w", encoding="utf8") + try: + now = time.time() + popen = self.popen( + cmdargs, stdout=f1, stderr=f2, close_fds=(sys.platform != "win32") + ) + + def handle_timeout(): + __tracebackhide__ = True + + timeout_message = ( + "{seconds} second timeout expired running:" + " {command}".format(seconds=timeout, command=cmdargs) + ) + + popen.kill() + popen.wait() + raise self.TimeoutExpired(timeout_message) + + if timeout is None: + ret = popen.wait() + elif six.PY3: + try: + ret = popen.wait(timeout) + except subprocess.TimeoutExpired: + handle_timeout() + else: + end = time.time() + timeout + + resolution = min(0.1, timeout / 10) + + while True: + ret = popen.poll() + if ret is not None: + break + + if time.time() > end: + handle_timeout() + + time.sleep(resolution) + finally: + f1.close() + f2.close() + f1 = codecs.open(str(p1), "r", encoding="utf8") + f2 = codecs.open(str(p2), "r", encoding="utf8") + try: + out = f1.read().splitlines() + err = f2.read().splitlines() + finally: + f1.close() + f2.close() + self._dump_lines(out, sys.stdout) + self._dump_lines(err, sys.stderr) + return RunResult(ret, out, err, time.time() - now) + + def _dump_lines(self, lines, fp): + try: + for line in lines: + print(line, file=fp) + except UnicodeEncodeError: + print("couldn't print to %s because of encoding" % (fp,)) + + def _getpytestargs(self): + return sys.executable, "-mpytest" + + def runpython(self, script): + """Run a python script using sys.executable as interpreter. + + Returns a :py:class:`RunResult`. + + """ + return self.run(sys.executable, script) + + def runpython_c(self, command): + """Run python -c "command", return a :py:class:`RunResult`.""" + return self.run(sys.executable, "-c", command) + + def runpytest_subprocess(self, *args, **kwargs): + """Run pytest as a subprocess with given arguments. + + Any plugins added to the :py:attr:`plugins` list will added using the + ``-p`` command line option. Additionally ``--basetemp`` is used put + any temporary files and directories in a numbered directory prefixed + with "runpytest-" so they do not conflict with the normal numbered + pytest location for temporary files and directories. + + :param args: the sequence of arguments to pass to the pytest subprocess + :param timeout: the period in seconds after which to timeout and raise + :py:class:`Testdir.TimeoutExpired` + + Returns a :py:class:`RunResult`. + + """ + __tracebackhide__ = True + + p = py.path.local.make_numbered_dir( + prefix="runpytest-", keep=None, rootdir=self.tmpdir + ) + args = ("--basetemp=%s" % p,) + args + plugins = [x for x in self.plugins if isinstance(x, str)] + if plugins: + args = ("-p", plugins[0]) + args + args = self._getpytestargs() + args + return self.run(*args, timeout=kwargs.get("timeout")) + + def spawn_pytest(self, string, expect_timeout=10.0): + """Run pytest using pexpect. + + This makes sure to use the right pytest and sets up the temporary + directory locations. + + The pexpect child is returned. + + """ + basetemp = self.tmpdir.mkdir("temp-pexpect") + invoke = " ".join(map(str, self._getpytestargs())) + cmd = "%s --basetemp=%s %s" % (invoke, basetemp, string) + return self.spawn(cmd, expect_timeout=expect_timeout) + + def spawn(self, cmd, expect_timeout=10.0): + """Run a command using pexpect. + + The pexpect child is returned. + + """ + pexpect = pytest.importorskip("pexpect", "3.0") + if hasattr(sys, "pypy_version_info") and "64" in platform.machine(): + pytest.skip("pypy-64 bit not supported") + if sys.platform.startswith("freebsd"): + pytest.xfail("pexpect does not work reliably on freebsd") + logfile = self.tmpdir.join("spawn.out").open("wb") + child = pexpect.spawn(cmd, logfile=logfile) + self.request.addfinalizer(logfile.close) + child.timeout = expect_timeout + return child + + +def getdecoded(out): + try: + return out.decode("utf-8") + except UnicodeDecodeError: + return "INTERNAL not-utf8-decodeable, truncated string:\n%s" % ( + py.io.saferepr(out), + ) + + +class LineComp(object): + def __init__(self): + self.stringio = py.io.TextIO() + + def assert_contains_lines(self, lines2): + """Assert that lines2 are contained (linearly) in lines1. + + Return a list of extralines found. + + """ + __tracebackhide__ = True + val = self.stringio.getvalue() + self.stringio.truncate(0) + self.stringio.seek(0) + lines1 = val.split("\n") + return LineMatcher(lines1).fnmatch_lines(lines2) + + +class LineMatcher(object): + """Flexible matching of text. + + This is a convenience class to test large texts like the output of + commands. + + The constructor takes a list of lines without their trailing newlines, i.e. + ``text.splitlines()``. + + """ + + def __init__(self, lines): + self.lines = lines + self._log_output = [] + + def str(self): + """Return the entire original text.""" + return "\n".join(self.lines) + + def _getlines(self, lines2): + if isinstance(lines2, str): + lines2 = Source(lines2) + if isinstance(lines2, Source): + lines2 = lines2.strip().lines + return lines2 + + def fnmatch_lines_random(self, lines2): + """Check lines exist in the output using in any order. + + Lines are checked using ``fnmatch.fnmatch``. The argument is a list of + lines which have to occur in the output, in any order. + + """ + self._match_lines_random(lines2, fnmatch) + + def re_match_lines_random(self, lines2): + """Check lines exist in the output using ``re.match``, in any order. + + The argument is a list of lines which have to occur in the output, in + any order. + + """ + self._match_lines_random(lines2, lambda name, pat: re.match(pat, name)) + + def _match_lines_random(self, lines2, match_func): + """Check lines exist in the output. + + The argument is a list of lines which have to occur in the output, in + any order. Each line can contain glob whildcards. + + """ + lines2 = self._getlines(lines2) + for line in lines2: + for x in self.lines: + if line == x or match_func(x, line): + self._log("matched: ", repr(line)) + break + else: + self._log("line %r not found in output" % line) + raise ValueError(self._log_text) + + def get_lines_after(self, fnline): + """Return all lines following the given line in the text. + + The given line can contain glob wildcards. + + """ + for i, line in enumerate(self.lines): + if fnline == line or fnmatch(line, fnline): + return self.lines[i + 1 :] + raise ValueError("line %r not found in output" % fnline) + + def _log(self, *args): + self._log_output.append(" ".join((str(x) for x in args))) + + @property + def _log_text(self): + return "\n".join(self._log_output) + + def fnmatch_lines(self, lines2): + """Search captured text for matching lines using ``fnmatch.fnmatch``. + + The argument is a list of lines which have to match and can use glob + wildcards. If they do not match a pytest.fail() is called. The + matches and non-matches are also printed on stdout. + + """ + __tracebackhide__ = True + self._match_lines(lines2, fnmatch, "fnmatch") + + def re_match_lines(self, lines2): + """Search captured text for matching lines using ``re.match``. + + The argument is a list of lines which have to match using ``re.match``. + If they do not match a pytest.fail() is called. + + The matches and non-matches are also printed on stdout. + + """ + __tracebackhide__ = True + self._match_lines(lines2, lambda name, pat: re.match(pat, name), "re.match") + + def _match_lines(self, lines2, match_func, match_nickname): + """Underlying implementation of ``fnmatch_lines`` and ``re_match_lines``. + + :param list[str] lines2: list of string patterns to match. The actual + format depends on ``match_func`` + :param match_func: a callable ``match_func(line, pattern)`` where line + is the captured line from stdout/stderr and pattern is the matching + pattern + :param str match_nickname: the nickname for the match function that + will be logged to stdout when a match occurs + + """ + lines2 = self._getlines(lines2) + lines1 = self.lines[:] + nextline = None + extralines = [] + __tracebackhide__ = True + for line in lines2: + nomatchprinted = False + while lines1: + nextline = lines1.pop(0) + if line == nextline: + self._log("exact match:", repr(line)) + break + elif match_func(nextline, line): + self._log("%s:" % match_nickname, repr(line)) + self._log(" with:", repr(nextline)) + break + else: + if not nomatchprinted: + self._log("nomatch:", repr(line)) + nomatchprinted = True + self._log(" and:", repr(nextline)) + extralines.append(nextline) + else: + self._log("remains unmatched: %r" % (line,)) + pytest.fail(self._log_text) diff --git a/venv/Lib/site-packages/_pytest/python.py b/venv/Lib/site-packages/_pytest/python.py new file mode 100644 index 00000000..ef3e3a73 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/python.py @@ -0,0 +1,1451 @@ +""" Python test discovery, setup and run of test functions. """ +from __future__ import absolute_import, division, print_function + +import fnmatch +import inspect +import sys +import os +import collections +import warnings +from textwrap import dedent + + +import py +import six +from _pytest.main import FSHookProxy +from _pytest.config import hookimpl + +import _pytest +from _pytest._code import filter_traceback +from _pytest import fixtures +from _pytest import nodes +from _pytest import deprecated +from _pytest.compat import ( + isclass, + isfunction, + is_generator, + ascii_escaped, + REGEX_TYPE, + STRING_TYPES, + NoneType, + NOTSET, + get_real_func, + getfslineno, + safe_getattr, + safe_str, + getlocation, + enum, + get_default_arg_names, + getimfunc, +) +from _pytest.outcomes import fail +from _pytest.mark.structures import ( + transfer_markers, + get_unpacked_marks, + normalize_mark_list, +) +from _pytest.warning_types import RemovedInPytest4Warning, PytestWarning + + +def pyobj_property(name): + def get(self): + node = self.getparent(getattr(__import__("pytest"), name)) + if node is not None: + return node.obj + + doc = "python %s object this node was collected from (can be None)." % ( + name.lower(), + ) + return property(get, None, None, doc) + + +def pytest_addoption(parser): + group = parser.getgroup("general") + group.addoption( + "--fixtures", + "--funcargs", + action="store_true", + dest="showfixtures", + default=False, + help="show available fixtures, sorted by plugin appearance " + "(fixtures with leading '_' are only shown with '-v')", + ) + group.addoption( + "--fixtures-per-test", + action="store_true", + dest="show_fixtures_per_test", + default=False, + help="show fixtures per test", + ) + parser.addini( + "usefixtures", + type="args", + default=[], + help="list of default fixtures to be used with this project", + ) + parser.addini( + "python_files", + type="args", + default=["test_*.py", "*_test.py"], + help="glob-style file patterns for Python test module discovery", + ) + parser.addini( + "python_classes", + type="args", + default=["Test"], + help="prefixes or glob names for Python test class discovery", + ) + parser.addini( + "python_functions", + type="args", + default=["test"], + help="prefixes or glob names for Python test function and method discovery", + ) + + group.addoption( + "--import-mode", + default="prepend", + choices=["prepend", "append"], + dest="importmode", + help="prepend/append to sys.path when importing test modules, " + "default is to prepend.", + ) + + +def pytest_cmdline_main(config): + if config.option.showfixtures: + showfixtures(config) + return 0 + if config.option.show_fixtures_per_test: + show_fixtures_per_test(config) + return 0 + + +def pytest_generate_tests(metafunc): + # those alternative spellings are common - raise a specific error to alert + # the user + alt_spellings = ["parameterize", "parametrise", "parameterise"] + for attr in alt_spellings: + if hasattr(metafunc.function, attr): + msg = "{0} has '{1}' mark, spelling should be 'parametrize'" + fail(msg.format(metafunc.function.__name__, attr), pytrace=False) + for marker in metafunc.definition.iter_markers(name="parametrize"): + metafunc.parametrize(*marker.args, **marker.kwargs) + + +def pytest_configure(config): + config.addinivalue_line( + "markers", + "parametrize(argnames, argvalues): call a test function multiple " + "times passing in different arguments in turn. argvalues generally " + "needs to be a list of values if argnames specifies only one name " + "or a list of tuples of values if argnames specifies multiple names. " + "Example: @parametrize('arg1', [1,2]) would lead to two calls of the " + "decorated test function, one with arg1=1 and another with arg1=2." + "see https://docs.pytest.org/en/latest/parametrize.html for more info " + "and examples.", + ) + config.addinivalue_line( + "markers", + "usefixtures(fixturename1, fixturename2, ...): mark tests as needing " + "all of the specified fixtures. see " + "https://docs.pytest.org/en/latest/fixture.html#usefixtures ", + ) + + +@hookimpl(trylast=True) +def pytest_pyfunc_call(pyfuncitem): + testfunction = pyfuncitem.obj + if pyfuncitem._isyieldedfunction(): + testfunction(*pyfuncitem._args) + else: + funcargs = pyfuncitem.funcargs + testargs = {} + for arg in pyfuncitem._fixtureinfo.argnames: + testargs[arg] = funcargs[arg] + testfunction(**testargs) + return True + + +def pytest_collect_file(path, parent): + ext = path.ext + if ext == ".py": + if not parent.session.isinitpath(path): + if not path_matches_patterns( + path, parent.config.getini("python_files") + ["__init__.py"] + ): + return + ihook = parent.session.gethookproxy(path) + return ihook.pytest_pycollect_makemodule(path=path, parent=parent) + + +def path_matches_patterns(path, patterns): + """Returns True if the given py.path.local matches one of the patterns in the list of globs given""" + return any(path.fnmatch(pattern) for pattern in patterns) + + +def pytest_pycollect_makemodule(path, parent): + if path.basename == "__init__.py": + return Package(path, parent) + return Module(path, parent) + + +@hookimpl(hookwrapper=True) +def pytest_pycollect_makeitem(collector, name, obj): + outcome = yield + res = outcome.get_result() + if res is not None: + return + # nothing was collected elsewhere, let's do it here + if isclass(obj): + if collector.istestclass(obj, name): + Class = collector._getcustomclass("Class") + outcome.force_result(Class(name, parent=collector)) + elif collector.istestfunction(obj, name): + # mock seems to store unbound methods (issue473), normalize it + obj = getattr(obj, "__func__", obj) + # We need to try and unwrap the function if it's a functools.partial + # or a funtools.wrapped. + # We musn't if it's been wrapped with mock.patch (python 2 only) + if not (isfunction(obj) or isfunction(get_real_func(obj))): + filename, lineno = getfslineno(obj) + warnings.warn_explicit( + message=PytestWarning( + "cannot collect %r because it is not a function." % name + ), + category=None, + filename=str(filename), + lineno=lineno + 1, + ) + elif getattr(obj, "__test__", True): + if is_generator(obj): + res = Generator(name, parent=collector) + else: + res = list(collector._genfunctions(name, obj)) + outcome.force_result(res) + + +def pytest_make_parametrize_id(config, val, argname=None): + return None + + +class PyobjContext(object): + module = pyobj_property("Module") + cls = pyobj_property("Class") + instance = pyobj_property("Instance") + + +class PyobjMixin(PyobjContext): + _ALLOW_MARKERS = True + + def __init__(self, *k, **kw): + super(PyobjMixin, self).__init__(*k, **kw) + + def obj(): + def fget(self): + obj = getattr(self, "_obj", None) + if obj is None: + self._obj = obj = self._getobj() + # XXX evil hack + # used to avoid Instance collector marker duplication + if self._ALLOW_MARKERS: + self.own_markers.extend(get_unpacked_marks(self.obj)) + return obj + + def fset(self, value): + self._obj = value + + return property(fget, fset, None, "underlying python object") + + obj = obj() + + def _getobj(self): + return getattr(self.parent.obj, self.name) + + def getmodpath(self, stopatmodule=True, includemodule=False): + """ return python path relative to the containing module. """ + chain = self.listchain() + chain.reverse() + parts = [] + for node in chain: + if isinstance(node, Instance): + continue + name = node.name + if isinstance(node, Module): + name = os.path.splitext(name)[0] + if stopatmodule: + if includemodule: + parts.append(name) + break + parts.append(name) + parts.reverse() + s = ".".join(parts) + return s.replace(".[", "[") + + def _getfslineno(self): + return getfslineno(self.obj) + + def reportinfo(self): + # XXX caching? + obj = self.obj + compat_co_firstlineno = getattr(obj, "compat_co_firstlineno", None) + if isinstance(compat_co_firstlineno, int): + # nose compatibility + fspath = sys.modules[obj.__module__].__file__ + if fspath.endswith(".pyc"): + fspath = fspath[:-1] + lineno = compat_co_firstlineno + else: + fspath, lineno = getfslineno(obj) + modpath = self.getmodpath() + assert isinstance(lineno, int) + return fspath, lineno, modpath + + +class PyCollector(PyobjMixin, nodes.Collector): + def funcnamefilter(self, name): + return self._matches_prefix_or_glob_option("python_functions", name) + + def isnosetest(self, obj): + """ Look for the __test__ attribute, which is applied by the + @nose.tools.istest decorator + """ + # We explicitly check for "is True" here to not mistakenly treat + # classes with a custom __getattr__ returning something truthy (like a + # function) as test classes. + return safe_getattr(obj, "__test__", False) is True + + def classnamefilter(self, name): + return self._matches_prefix_or_glob_option("python_classes", name) + + def istestfunction(self, obj, name): + if self.funcnamefilter(name) or self.isnosetest(obj): + if isinstance(obj, staticmethod): + # static methods need to be unwrapped + obj = safe_getattr(obj, "__func__", False) + return ( + safe_getattr(obj, "__call__", False) + and fixtures.getfixturemarker(obj) is None + ) + else: + return False + + def istestclass(self, obj, name): + return self.classnamefilter(name) or self.isnosetest(obj) + + def _matches_prefix_or_glob_option(self, option_name, name): + """ + checks if the given name matches the prefix or glob-pattern defined + in ini configuration. + """ + for option in self.config.getini(option_name): + if name.startswith(option): + return True + # check that name looks like a glob-string before calling fnmatch + # because this is called for every name in each collected module, + # and fnmatch is somewhat expensive to call + elif ("*" in option or "?" in option or "[" in option) and fnmatch.fnmatch( + name, option + ): + return True + return False + + def collect(self): + if not getattr(self.obj, "__test__", True): + return [] + + # NB. we avoid random getattrs and peek in the __dict__ instead + # (XXX originally introduced from a PyPy need, still true?) + dicts = [getattr(self.obj, "__dict__", {})] + for basecls in inspect.getmro(self.obj.__class__): + dicts.append(basecls.__dict__) + seen = {} + values = [] + for dic in dicts: + for name, obj in list(dic.items()): + if name in seen: + continue + seen[name] = True + res = self._makeitem(name, obj) + if res is None: + continue + if not isinstance(res, list): + res = [res] + values.extend(res) + values.sort(key=lambda item: item.reportinfo()[:2]) + return values + + def makeitem(self, name, obj): + warnings.warn(deprecated.COLLECTOR_MAKEITEM, stacklevel=2) + self._makeitem(name, obj) + + def _makeitem(self, name, obj): + # assert self.ihook.fspath == self.fspath, self + return self.ihook.pytest_pycollect_makeitem(collector=self, name=name, obj=obj) + + def _genfunctions(self, name, funcobj): + module = self.getparent(Module).obj + clscol = self.getparent(Class) + cls = clscol and clscol.obj or None + transfer_markers(funcobj, cls, module) + fm = self.session._fixturemanager + + definition = FunctionDefinition(name=name, parent=self, callobj=funcobj) + fixtureinfo = fm.getfixtureinfo(definition, funcobj, cls) + + metafunc = Metafunc( + definition, fixtureinfo, self.config, cls=cls, module=module + ) + methods = [] + if hasattr(module, "pytest_generate_tests"): + methods.append(module.pytest_generate_tests) + if hasattr(cls, "pytest_generate_tests"): + methods.append(cls().pytest_generate_tests) + if methods: + self.ihook.pytest_generate_tests.call_extra( + methods, dict(metafunc=metafunc) + ) + else: + self.ihook.pytest_generate_tests(metafunc=metafunc) + + Function = self._getcustomclass("Function") + if not metafunc._calls: + yield Function(name, parent=self, fixtureinfo=fixtureinfo) + else: + # add funcargs() as fixturedefs to fixtureinfo.arg2fixturedefs + fixtures.add_funcarg_pseudo_fixture_def(self, metafunc, fm) + + # add_funcarg_pseudo_fixture_def may have shadowed some fixtures + # with direct parametrization, so make sure we update what the + # function really needs. + fixtureinfo.prune_dependency_tree() + + for callspec in metafunc._calls: + subname = "%s[%s]" % (name, callspec.id) + yield Function( + name=subname, + parent=self, + callspec=callspec, + callobj=funcobj, + fixtureinfo=fixtureinfo, + keywords={callspec.id: True}, + originalname=name, + ) + + +class Module(nodes.File, PyCollector): + """ Collector for test classes and functions. """ + + def _getobj(self): + return self._importtestmodule() + + def collect(self): + self.session._fixturemanager.parsefactories(self) + return super(Module, self).collect() + + def _importtestmodule(self): + # we assume we are only called once per module + importmode = self.config.getoption("--import-mode") + try: + mod = self.fspath.pyimport(ensuresyspath=importmode) + except SyntaxError: + raise self.CollectError( + _pytest._code.ExceptionInfo().getrepr(style="short") + ) + except self.fspath.ImportMismatchError: + e = sys.exc_info()[1] + raise self.CollectError( + "import file mismatch:\n" + "imported module %r has this __file__ attribute:\n" + " %s\n" + "which is not the same as the test file we want to collect:\n" + " %s\n" + "HINT: remove __pycache__ / .pyc files and/or use a " + "unique basename for your test file modules" % e.args + ) + except ImportError: + from _pytest._code.code import ExceptionInfo + + exc_info = ExceptionInfo() + if self.config.getoption("verbose") < 2: + exc_info.traceback = exc_info.traceback.filter(filter_traceback) + exc_repr = ( + exc_info.getrepr(style="short") + if exc_info.traceback + else exc_info.exconly() + ) + formatted_tb = safe_str(exc_repr) + raise self.CollectError( + "ImportError while importing test module '{fspath}'.\n" + "Hint: make sure your test modules/packages have valid Python names.\n" + "Traceback:\n" + "{traceback}".format(fspath=self.fspath, traceback=formatted_tb) + ) + except _pytest.runner.Skipped as e: + if e.allow_module_level: + raise + raise self.CollectError( + "Using pytest.skip outside of a test is not allowed. " + "To decorate a test function, use the @pytest.mark.skip " + "or @pytest.mark.skipif decorators instead, and to skip a " + "module use `pytestmark = pytest.mark.{skip,skipif}." + ) + self.config.pluginmanager.consider_module(mod) + return mod + + def setup(self): + setup_module = _get_xunit_setup_teardown(self.obj, "setUpModule") + if setup_module is None: + setup_module = _get_xunit_setup_teardown(self.obj, "setup_module") + if setup_module is not None: + setup_module() + + teardown_module = _get_xunit_setup_teardown(self.obj, "tearDownModule") + if teardown_module is None: + teardown_module = _get_xunit_setup_teardown(self.obj, "teardown_module") + if teardown_module is not None: + self.addfinalizer(teardown_module) + + +class Package(Module): + def __init__(self, fspath, parent=None, config=None, session=None, nodeid=None): + session = parent.session + nodes.FSCollector.__init__( + self, fspath, parent=parent, config=config, session=session, nodeid=nodeid + ) + self.name = fspath.dirname + self.trace = session.trace + self._norecursepatterns = session._norecursepatterns + self.fspath = fspath + + def _recurse(self, path): + ihook = self.gethookproxy(path.dirpath()) + if ihook.pytest_ignore_collect(path=path, config=self.config): + return False + for pat in self._norecursepatterns: + if path.check(fnmatch=pat): + return False + ihook = self.gethookproxy(path) + ihook.pytest_collect_directory(path=path, parent=self) + return True + + def gethookproxy(self, fspath): + # check if we have the common case of running + # hooks with all conftest.py filesall conftest.py + pm = self.config.pluginmanager + my_conftestmodules = pm._getconftestmodules(fspath) + remove_mods = pm._conftest_plugins.difference(my_conftestmodules) + if remove_mods: + # one or more conftests are not in use at this fspath + proxy = FSHookProxy(fspath, pm, remove_mods) + else: + # all plugis are active for this fspath + proxy = self.config.hook + return proxy + + def _collectfile(self, path): + ihook = self.gethookproxy(path) + if not self.isinitpath(path): + if ihook.pytest_ignore_collect(path=path, config=self.config): + return () + return ihook.pytest_collect_file(path=path, parent=self) + + def isinitpath(self, path): + return path in self.session._initialpaths + + def collect(self): + # XXX: HACK! + # Before starting to collect any files from this package we need + # to cleanup the duplicate paths added by the session's collect(). + # Proper fix is to not track these as duplicates in the first place. + for path in list(self.session.config.pluginmanager._duplicatepaths): + # if path.parts()[:len(self.fspath.dirpath().parts())] == self.fspath.dirpath().parts(): + if path.dirname.startswith(self.name): + self.session.config.pluginmanager._duplicatepaths.remove(path) + + this_path = self.fspath.dirpath() + init_module = this_path.join("__init__.py") + if init_module.check(file=1) and path_matches_patterns( + init_module, self.config.getini("python_files") + ): + yield Module(init_module, self) + pkg_prefixes = set() + for path in this_path.visit(rec=self._recurse, bf=True, sort=True): + # we will visit our own __init__.py file, in which case we skip it + skip = False + if path.basename == "__init__.py" and path.dirpath() == this_path: + continue + + for pkg_prefix in pkg_prefixes: + if ( + pkg_prefix in path.parts() + and pkg_prefix.join("__init__.py") != path + ): + skip = True + + if skip: + continue + + if path.isdir() and path.join("__init__.py").check(file=1): + pkg_prefixes.add(path) + + for x in self._collectfile(path): + yield x + + +def _get_xunit_setup_teardown(holder, attr_name, param_obj=None): + """ + Return a callable to perform xunit-style setup or teardown if + the function exists in the ``holder`` object. + The ``param_obj`` parameter is the parameter which will be passed to the function + when the callable is called without arguments, defaults to the ``holder`` object. + Return ``None`` if a suitable callable is not found. + """ + param_obj = param_obj if param_obj is not None else holder + result = _get_xunit_func(holder, attr_name) + if result is not None: + arg_count = result.__code__.co_argcount + if inspect.ismethod(result): + arg_count -= 1 + if arg_count: + return lambda: result(param_obj) + else: + return result + + +def _get_xunit_func(obj, name): + """Return the attribute from the given object to be used as a setup/teardown + xunit-style function, but only if not marked as a fixture to + avoid calling it twice. + """ + meth = getattr(obj, name, None) + if fixtures.getfixturemarker(meth) is None: + return meth + + +class Class(PyCollector): + """ Collector for test methods. """ + + def collect(self): + if not safe_getattr(self.obj, "__test__", True): + return [] + if hasinit(self.obj): + self.warn( + PytestWarning( + "cannot collect test class %r because it has a " + "__init__ constructor" % self.obj.__name__ + ) + ) + return [] + elif hasnew(self.obj): + self.warn( + PytestWarning( + "cannot collect test class %r because it has a " + "__new__ constructor" % self.obj.__name__ + ) + ) + return [] + return [self._getcustomclass("Instance")(name="()", parent=self)] + + def setup(self): + setup_class = _get_xunit_func(self.obj, "setup_class") + if setup_class is not None: + setup_class = getimfunc(setup_class) + setup_class(self.obj) + + fin_class = getattr(self.obj, "teardown_class", None) + if fin_class is not None: + fin_class = getimfunc(fin_class) + self.addfinalizer(lambda: fin_class(self.obj)) + + +class Instance(PyCollector): + _ALLOW_MARKERS = False # hack, destroy later + # instances share the object with their parents in a way + # that duplicates markers instances if not taken out + # can be removed at node strucutre reorganization time + + def _getobj(self): + return self.parent.obj() + + def collect(self): + self.session._fixturemanager.parsefactories(self) + return super(Instance, self).collect() + + def newinstance(self): + self.obj = self._getobj() + return self.obj + + +class FunctionMixin(PyobjMixin): + """ mixin for the code common to Function and Generator. + """ + + def setup(self): + """ perform setup for this test function. """ + if hasattr(self, "_preservedparent"): + obj = self._preservedparent + elif isinstance(self.parent, Instance): + obj = self.parent.newinstance() + self.obj = self._getobj() + else: + obj = self.parent.obj + if inspect.ismethod(self.obj): + setup_name = "setup_method" + teardown_name = "teardown_method" + else: + setup_name = "setup_function" + teardown_name = "teardown_function" + setup_func_or_method = _get_xunit_setup_teardown( + obj, setup_name, param_obj=self.obj + ) + if setup_func_or_method is not None: + setup_func_or_method() + teardown_func_or_method = _get_xunit_setup_teardown( + obj, teardown_name, param_obj=self.obj + ) + if teardown_func_or_method is not None: + self.addfinalizer(teardown_func_or_method) + + def _prunetraceback(self, excinfo): + if hasattr(self, "_obj") and not self.config.option.fulltrace: + code = _pytest._code.Code(get_real_func(self.obj)) + path, firstlineno = code.path, code.firstlineno + traceback = excinfo.traceback + ntraceback = traceback.cut(path=path, firstlineno=firstlineno) + if ntraceback == traceback: + ntraceback = ntraceback.cut(path=path) + if ntraceback == traceback: + ntraceback = ntraceback.filter(filter_traceback) + if not ntraceback: + ntraceback = traceback + + excinfo.traceback = ntraceback.filter() + # issue364: mark all but first and last frames to + # only show a single-line message for each frame + if self.config.option.tbstyle == "auto": + if len(excinfo.traceback) > 2: + for entry in excinfo.traceback[1:-1]: + entry.set_repr_style("short") + + def repr_failure(self, excinfo, outerr=None): + assert outerr is None, "XXX outerr usage is deprecated" + style = self.config.option.tbstyle + if style == "auto": + style = "long" + return self._repr_failure_py(excinfo, style=style) + + +class Generator(FunctionMixin, PyCollector): + def collect(self): + # test generators are seen as collectors but they also + # invoke setup/teardown on popular request + # (induced by the common "test_*" naming shared with normal tests) + from _pytest import deprecated + + self.session._setupstate.prepare(self) + # see FunctionMixin.setup and test_setupstate_is_preserved_134 + self._preservedparent = self.parent.obj + values = [] + seen = {} + for i, x in enumerate(self.obj()): + name, call, args = self.getcallargs(x) + if not callable(call): + raise TypeError("%r yielded non callable test %r" % (self.obj, call)) + if name is None: + name = "[%d]" % i + else: + name = "['%s']" % name + if name in seen: + raise ValueError( + "%r generated tests with non-unique name %r" % (self, name) + ) + seen[name] = True + with warnings.catch_warnings(): + # ignore our own deprecation warning + function_class = self.Function + values.append(function_class(name, self, args=args, callobj=call)) + self.warn(deprecated.YIELD_TESTS) + return values + + def getcallargs(self, obj): + if not isinstance(obj, (tuple, list)): + obj = (obj,) + # explicit naming + if isinstance(obj[0], six.string_types): + name = obj[0] + obj = obj[1:] + else: + name = None + call, args = obj[0], obj[1:] + return name, call, args + + +def hasinit(obj): + init = getattr(obj, "__init__", None) + if init: + return init != object.__init__ + + +def hasnew(obj): + new = getattr(obj, "__new__", None) + if new: + return new != object.__new__ + + +class CallSpec2(object): + def __init__(self, metafunc): + self.metafunc = metafunc + self.funcargs = {} + self._idlist = [] + self.params = {} + self._globalid = NOTSET + self._globalparam = NOTSET + self._arg2scopenum = {} # used for sorting parametrized resources + self.marks = [] + self.indices = {} + + def copy(self): + cs = CallSpec2(self.metafunc) + cs.funcargs.update(self.funcargs) + cs.params.update(self.params) + cs.marks.extend(self.marks) + cs.indices.update(self.indices) + cs._arg2scopenum.update(self._arg2scopenum) + cs._idlist = list(self._idlist) + cs._globalid = self._globalid + cs._globalparam = self._globalparam + return cs + + def _checkargnotcontained(self, arg): + if arg in self.params or arg in self.funcargs: + raise ValueError("duplicate %r" % (arg,)) + + def getparam(self, name): + try: + return self.params[name] + except KeyError: + if self._globalparam is NOTSET: + raise ValueError(name) + return self._globalparam + + @property + def id(self): + return "-".join(map(str, filter(None, self._idlist))) + + def setmulti2(self, valtypes, argnames, valset, id, marks, scopenum, param_index): + for arg, val in zip(argnames, valset): + self._checkargnotcontained(arg) + valtype_for_arg = valtypes[arg] + getattr(self, valtype_for_arg)[arg] = val + self.indices[arg] = param_index + self._arg2scopenum[arg] = scopenum + self._idlist.append(id) + self.marks.extend(normalize_mark_list(marks)) + + def setall(self, funcargs, id, param): + for x in funcargs: + self._checkargnotcontained(x) + self.funcargs.update(funcargs) + if id is not NOTSET: + self._idlist.append(id) + if param is not NOTSET: + assert self._globalparam is NOTSET + self._globalparam = param + for arg in funcargs: + self._arg2scopenum[arg] = fixtures.scopenum_function + + +class Metafunc(fixtures.FuncargnamesCompatAttr): + """ + Metafunc objects are passed to the :func:`pytest_generate_tests <_pytest.hookspec.pytest_generate_tests>` hook. + They help to inspect a test function and to generate tests according to + test configuration or values specified in the class or module where a + test function is defined. + """ + + def __init__(self, definition, fixtureinfo, config, cls=None, module=None): + assert ( + isinstance(definition, FunctionDefinition) + or type(definition).__name__ == "DefinitionMock" + ) + self.definition = definition + + #: access to the :class:`_pytest.config.Config` object for the test session + self.config = config + + #: the module object where the test function is defined in. + self.module = module + + #: underlying python test function + self.function = definition.obj + + #: set of fixture names required by the test function + self.fixturenames = fixtureinfo.names_closure + + #: class object where the test function is defined in or ``None``. + self.cls = cls + + self._calls = [] + self._ids = set() + self._arg2fixturedefs = fixtureinfo.name2fixturedefs + + def parametrize(self, argnames, argvalues, indirect=False, ids=None, scope=None): + """ Add new invocations to the underlying test function using the list + of argvalues for the given argnames. Parametrization is performed + during the collection phase. If you need to setup expensive resources + see about setting indirect to do it rather at test setup time. + + :arg argnames: a comma-separated string denoting one or more argument + names, or a list/tuple of argument strings. + + :arg argvalues: The list of argvalues determines how often a + test is invoked with different argument values. If only one + argname was specified argvalues is a list of values. If N + argnames were specified, argvalues must be a list of N-tuples, + where each tuple-element specifies a value for its respective + argname. + + :arg indirect: The list of argnames or boolean. A list of arguments' + names (subset of argnames). If True the list contains all names from + the argnames. Each argvalue corresponding to an argname in this list will + be passed as request.param to its respective argname fixture + function so that it can perform more expensive setups during the + setup phase of a test rather than at collection time. + + :arg ids: list of string ids, or a callable. + If strings, each is corresponding to the argvalues so that they are + part of the test id. If None is given as id of specific test, the + automatically generated id for that argument will be used. + If callable, it should take one argument (a single argvalue) and return + a string or return None. If None, the automatically generated id for that + argument will be used. + If no ids are provided they will be generated automatically from + the argvalues. + + :arg scope: if specified it denotes the scope of the parameters. + The scope is used for grouping tests by parameter instances. + It will also override any fixture-function defined scope, allowing + to set a dynamic scope using test context or configuration. + """ + from _pytest.fixtures import scope2index + from _pytest.mark import ParameterSet + + argnames, parameters = ParameterSet._for_parametrize( + argnames, + argvalues, + self.function, + self.config, + function_definition=self.definition, + ) + del argvalues + + if scope is None: + scope = _find_parametrized_scope(argnames, self._arg2fixturedefs, indirect) + + self._validate_if_using_arg_names(argnames, indirect) + + arg_values_types = self._resolve_arg_value_types(argnames, indirect) + + ids = self._resolve_arg_ids(argnames, ids, parameters, item=self.definition) + + scopenum = scope2index( + scope, descr="parametrize() call in {}".format(self.function.__name__) + ) + + # create the new calls: if we are parametrize() multiple times (by applying the decorator + # more than once) then we accumulate those calls generating the cartesian product + # of all calls + newcalls = [] + for callspec in self._calls or [CallSpec2(self)]: + for param_index, (param_id, param_set) in enumerate(zip(ids, parameters)): + newcallspec = callspec.copy() + newcallspec.setmulti2( + arg_values_types, + argnames, + param_set.values, + param_id, + param_set.marks, + scopenum, + param_index, + ) + newcalls.append(newcallspec) + self._calls = newcalls + + def _resolve_arg_ids(self, argnames, ids, parameters, item): + """Resolves the actual ids for the given argnames, based on the ``ids`` parameter given + to ``parametrize``. + + :param List[str] argnames: list of argument names passed to ``parametrize()``. + :param ids: the ids parameter of the parametrized call (see docs). + :param List[ParameterSet] parameters: the list of parameter values, same size as ``argnames``. + :param Item item: the item that generated this parametrized call. + :rtype: List[str] + :return: the list of ids for each argname given + """ + from py.io import saferepr + + idfn = None + if callable(ids): + idfn = ids + ids = None + if ids: + func_name = self.function.__name__ + if len(ids) != len(parameters): + msg = "In {}: {} parameter sets specified, with different number of ids: {}" + fail(msg.format(func_name, len(parameters), len(ids)), pytrace=False) + for id_value in ids: + if id_value is not None and not isinstance(id_value, six.string_types): + msg = "In {}: ids must be list of strings, found: {} (type: {!r})" + fail( + msg.format(func_name, saferepr(id_value), type(id_value)), + pytrace=False, + ) + ids = idmaker(argnames, parameters, idfn, ids, self.config, item=item) + return ids + + def _resolve_arg_value_types(self, argnames, indirect): + """Resolves if each parametrized argument must be considered a parameter to a fixture or a "funcarg" + to the function, based on the ``indirect`` parameter of the parametrized() call. + + :param List[str] argnames: list of argument names passed to ``parametrize()``. + :param indirect: same ``indirect`` parameter of ``parametrize()``. + :rtype: Dict[str, str] + A dict mapping each arg name to either: + * "params" if the argname should be the parameter of a fixture of the same name. + * "funcargs" if the argname should be a parameter to the parametrized test function. + """ + valtypes = {} + if indirect is True: + valtypes = dict.fromkeys(argnames, "params") + elif indirect is False: + valtypes = dict.fromkeys(argnames, "funcargs") + elif isinstance(indirect, (tuple, list)): + valtypes = dict.fromkeys(argnames, "funcargs") + for arg in indirect: + if arg not in argnames: + fail( + "In {}: indirect fixture '{}' doesn't exist".format( + self.function.__name__, arg + ), + pytrace=False, + ) + valtypes[arg] = "params" + return valtypes + + def _validate_if_using_arg_names(self, argnames, indirect): + """ + Check if all argnames are being used, by default values, or directly/indirectly. + + :param List[str] argnames: list of argument names passed to ``parametrize()``. + :param indirect: same ``indirect`` parameter of ``parametrize()``. + :raise ValueError: if validation fails. + """ + default_arg_names = set(get_default_arg_names(self.function)) + func_name = self.function.__name__ + for arg in argnames: + if arg not in self.fixturenames: + if arg in default_arg_names: + fail( + "In {}: function already takes an argument '{}' with a default value".format( + func_name, arg + ), + pytrace=False, + ) + else: + if isinstance(indirect, (tuple, list)): + name = "fixture" if arg in indirect else "argument" + else: + name = "fixture" if indirect else "argument" + fail( + "In {}: function uses no {} '{}'".format(func_name, name, arg), + pytrace=False, + ) + + def addcall(self, funcargs=None, id=NOTSET, param=NOTSET): + """ Add a new call to the underlying test function during the collection phase of a test run. + + .. deprecated:: 3.3 + + Use :meth:`parametrize` instead. + + Note that request.addcall() is called during the test collection phase prior and + independently to actual test execution. You should only use addcall() + if you need to specify multiple arguments of a test function. + + :arg funcargs: argument keyword dictionary used when invoking + the test function. + + :arg id: used for reporting and identification purposes. If you + don't supply an `id` an automatic unique id will be generated. + + :arg param: a parameter which will be exposed to a later fixture function + invocation through the ``request.param`` attribute. + """ + warnings.warn(deprecated.METAFUNC_ADD_CALL, stacklevel=2) + + assert funcargs is None or isinstance(funcargs, dict) + if funcargs is not None: + for name in funcargs: + if name not in self.fixturenames: + fail("funcarg %r not used in this function." % name) + else: + funcargs = {} + if id is None: + raise ValueError("id=None not allowed") + if id is NOTSET: + id = len(self._calls) + id = str(id) + if id in self._ids: + raise ValueError("duplicate id %r" % id) + self._ids.add(id) + + cs = CallSpec2(self) + cs.setall(funcargs, id, param) + self._calls.append(cs) + + +def _find_parametrized_scope(argnames, arg2fixturedefs, indirect): + """Find the most appropriate scope for a parametrized call based on its arguments. + + When there's at least one direct argument, always use "function" scope. + + When a test function is parametrized and all its arguments are indirect + (e.g. fixtures), return the most narrow scope based on the fixtures used. + + Related to issue #1832, based on code posted by @Kingdread. + """ + from _pytest.fixtures import scopes + + if isinstance(indirect, (list, tuple)): + all_arguments_are_fixtures = len(indirect) == len(argnames) + else: + all_arguments_are_fixtures = bool(indirect) + + if all_arguments_are_fixtures: + fixturedefs = arg2fixturedefs or {} + used_scopes = [ + fixturedef[0].scope + for name, fixturedef in fixturedefs.items() + if name in argnames + ] + if used_scopes: + # Takes the most narrow scope from used fixtures + for scope in reversed(scopes): + if scope in used_scopes: + return scope + + return "function" + + +def _idval(val, argname, idx, idfn, item, config): + if idfn: + s = None + try: + s = idfn(val) + except Exception as e: + # See issue https://github.com/pytest-dev/pytest/issues/2169 + msg = ( + "While trying to determine id of parameter {} at position " + "{} the following exception was raised:\n".format(argname, idx) + ) + msg += " {}: {}\n".format(type(e).__name__, e) + msg += "This warning will be an error error in pytest-4.0." + item.warn(RemovedInPytest4Warning(msg)) + if s: + return ascii_escaped(s) + + if config: + hook_id = config.hook.pytest_make_parametrize_id( + config=config, val=val, argname=argname + ) + if hook_id: + return hook_id + + if isinstance(val, STRING_TYPES): + return ascii_escaped(val) + elif isinstance(val, (float, int, bool, NoneType)): + return str(val) + elif isinstance(val, REGEX_TYPE): + return ascii_escaped(val.pattern) + elif enum is not None and isinstance(val, enum.Enum): + return str(val) + elif (isclass(val) or isfunction(val)) and hasattr(val, "__name__"): + return val.__name__ + return str(argname) + str(idx) + + +def _idvalset(idx, parameterset, argnames, idfn, ids, item, config): + if parameterset.id is not None: + return parameterset.id + if ids is None or (idx >= len(ids) or ids[idx] is None): + this_id = [ + _idval(val, argname, idx, idfn, item=item, config=config) + for val, argname in zip(parameterset.values, argnames) + ] + return "-".join(this_id) + else: + return ascii_escaped(ids[idx]) + + +def idmaker(argnames, parametersets, idfn=None, ids=None, config=None, item=None): + ids = [ + _idvalset(valindex, parameterset, argnames, idfn, ids, config=config, item=item) + for valindex, parameterset in enumerate(parametersets) + ] + if len(set(ids)) != len(ids): + # The ids are not unique + duplicates = [testid for testid in ids if ids.count(testid) > 1] + counters = collections.defaultdict(lambda: 0) + for index, testid in enumerate(ids): + if testid in duplicates: + ids[index] = testid + str(counters[testid]) + counters[testid] += 1 + return ids + + +def show_fixtures_per_test(config): + from _pytest.main import wrap_session + + return wrap_session(config, _show_fixtures_per_test) + + +def _show_fixtures_per_test(config, session): + import _pytest.config + + session.perform_collect() + curdir = py.path.local() + tw = _pytest.config.create_terminal_writer(config) + verbose = config.getvalue("verbose") + + def get_best_relpath(func): + loc = getlocation(func, curdir) + return curdir.bestrelpath(loc) + + def write_fixture(fixture_def): + argname = fixture_def.argname + if verbose <= 0 and argname.startswith("_"): + return + if verbose > 0: + bestrel = get_best_relpath(fixture_def.func) + funcargspec = "{} -- {}".format(argname, bestrel) + else: + funcargspec = argname + tw.line(funcargspec, green=True) + fixture_doc = fixture_def.func.__doc__ + if fixture_doc: + write_docstring(tw, fixture_doc) + else: + tw.line(" no docstring available", red=True) + + def write_item(item): + try: + info = item._fixtureinfo + except AttributeError: + # doctests items have no _fixtureinfo attribute + return + if not info.name2fixturedefs: + # this test item does not use any fixtures + return + tw.line() + tw.sep("-", "fixtures used by {}".format(item.name)) + tw.sep("-", "({})".format(get_best_relpath(item.function))) + # dict key not used in loop but needed for sorting + for _, fixturedefs in sorted(info.name2fixturedefs.items()): + assert fixturedefs is not None + if not fixturedefs: + continue + # last item is expected to be the one used by the test item + write_fixture(fixturedefs[-1]) + + for session_item in session.items: + write_item(session_item) + + +def showfixtures(config): + from _pytest.main import wrap_session + + return wrap_session(config, _showfixtures_main) + + +def _showfixtures_main(config, session): + import _pytest.config + + session.perform_collect() + curdir = py.path.local() + tw = _pytest.config.create_terminal_writer(config) + verbose = config.getvalue("verbose") + + fm = session._fixturemanager + + available = [] + seen = set() + + for argname, fixturedefs in fm._arg2fixturedefs.items(): + assert fixturedefs is not None + if not fixturedefs: + continue + for fixturedef in fixturedefs: + loc = getlocation(fixturedef.func, curdir) + if (fixturedef.argname, loc) in seen: + continue + seen.add((fixturedef.argname, loc)) + available.append( + ( + len(fixturedef.baseid), + fixturedef.func.__module__, + curdir.bestrelpath(loc), + fixturedef.argname, + fixturedef, + ) + ) + + available.sort() + currentmodule = None + for baseid, module, bestrel, argname, fixturedef in available: + if currentmodule != module: + if not module.startswith("_pytest."): + tw.line() + tw.sep("-", "fixtures defined from %s" % (module,)) + currentmodule = module + if verbose <= 0 and argname[0] == "_": + continue + if verbose > 0: + funcargspec = "%s -- %s" % (argname, bestrel) + else: + funcargspec = argname + tw.line(funcargspec, green=True) + loc = getlocation(fixturedef.func, curdir) + doc = fixturedef.func.__doc__ or "" + if doc: + write_docstring(tw, doc) + else: + tw.line(" %s: no docstring available" % (loc,), red=True) + + +def write_docstring(tw, doc): + INDENT = " " + doc = doc.rstrip() + if "\n" in doc: + firstline, rest = doc.split("\n", 1) + else: + firstline, rest = doc, "" + + if firstline.strip(): + tw.line(INDENT + firstline.strip()) + + if rest: + for line in dedent(rest).split("\n"): + tw.write(INDENT + line + "\n") + + +class Function(FunctionMixin, nodes.Item, fixtures.FuncargnamesCompatAttr): + """ a Function Item is responsible for setting up and executing a + Python test function. + """ + + _genid = None + # disable since functions handle it themselfes + _ALLOW_MARKERS = False + + def __init__( + self, + name, + parent, + args=None, + config=None, + callspec=None, + callobj=NOTSET, + keywords=None, + session=None, + fixtureinfo=None, + originalname=None, + ): + super(Function, self).__init__(name, parent, config=config, session=session) + self._args = args + if callobj is not NOTSET: + self.obj = callobj + + self.keywords.update(self.obj.__dict__) + self.own_markers.extend(get_unpacked_marks(self.obj)) + if callspec: + self.callspec = callspec + # this is total hostile and a mess + # keywords are broken by design by now + # this will be redeemed later + for mark in callspec.marks: + # feel free to cry, this was broken for years before + # and keywords cant fix it per design + self.keywords[mark.name] = mark + self.own_markers.extend(normalize_mark_list(callspec.marks)) + if keywords: + self.keywords.update(keywords) + + if fixtureinfo is None: + fixtureinfo = self.session._fixturemanager.getfixtureinfo( + self, self.obj, self.cls, funcargs=not self._isyieldedfunction() + ) + self._fixtureinfo = fixtureinfo + self.fixturenames = fixtureinfo.names_closure + self._initrequest() + + #: original function name, without any decorations (for example + #: parametrization adds a ``"[...]"`` suffix to function names). + #: + #: .. versionadded:: 3.0 + self.originalname = originalname + + def _initrequest(self): + self.funcargs = {} + if self._isyieldedfunction(): + assert not hasattr( + self, "callspec" + ), "yielded functions (deprecated) cannot have funcargs" + else: + if hasattr(self, "callspec"): + callspec = self.callspec + assert not callspec.funcargs + self._genid = callspec.id + if hasattr(callspec, "param"): + self.param = callspec.param + self._request = fixtures.FixtureRequest(self) + + @property + def function(self): + "underlying python 'function' object" + return getimfunc(self.obj) + + def _getobj(self): + name = self.name + i = name.find("[") # parametrization + if i != -1: + name = name[:i] + return getattr(self.parent.obj, name) + + @property + def _pyfuncitem(self): + "(compatonly) for code expecting pytest-2.2 style request objects" + return self + + def _isyieldedfunction(self): + return getattr(self, "_args", None) is not None + + def runtest(self): + """ execute the underlying test function. """ + self.ihook.pytest_pyfunc_call(pyfuncitem=self) + + def setup(self): + super(Function, self).setup() + fixtures.fillfixtures(self) + + +class FunctionDefinition(Function): + """ + internal hack until we get actual definition nodes instead of the + crappy metafunc hack + """ + + def runtest(self): + raise RuntimeError("function definitions are not supposed to be used") + + setup = runtest diff --git a/venv/Lib/site-packages/_pytest/python_api.py b/venv/Lib/site-packages/_pytest/python_api.py new file mode 100644 index 00000000..6cd17de2 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/python_api.py @@ -0,0 +1,721 @@ +import math +import pprint +import sys +from numbers import Number +from decimal import Decimal + +import six +from six.moves import zip, filterfalse +from more_itertools.more import always_iterable + +from _pytest.compat import isclass + +from _pytest.compat import Mapping, Sequence +from _pytest.compat import STRING_TYPES + +from _pytest.outcomes import fail +import _pytest._code + +BASE_TYPE = (type, STRING_TYPES) + + +def _cmp_raises_type_error(self, other): + """__cmp__ implementation which raises TypeError. Used + by Approx base classes to implement only == and != and raise a + TypeError for other comparisons. + + Needed in Python 2 only, Python 3 all it takes is not implementing the + other operators at all. + """ + __tracebackhide__ = True + raise TypeError( + "Comparison operators other than == and != not supported by approx objects" + ) + + +def _non_numeric_type_error(value, at): + at_str = " at {}".format(at) if at else "" + return TypeError( + "cannot make approximate comparisons to non-numeric values: {!r} {}".format( + value, at_str + ) + ) + + +# builtin pytest.approx helper + + +class ApproxBase(object): + """ + Provide shared utilities for making approximate comparisons between numbers + or sequences of numbers. + """ + + # Tell numpy to use our `__eq__` operator instead of its. + __array_ufunc__ = None + __array_priority__ = 100 + + def __init__(self, expected, rel=None, abs=None, nan_ok=False): + __tracebackhide__ = True + self.expected = expected + self.abs = abs + self.rel = rel + self.nan_ok = nan_ok + self._check_type() + + def __repr__(self): + raise NotImplementedError + + def __eq__(self, actual): + return all( + a == self._approx_scalar(x) for a, x in self._yield_comparisons(actual) + ) + + __hash__ = None + + def __ne__(self, actual): + return not (actual == self) + + if sys.version_info[0] == 2: + __cmp__ = _cmp_raises_type_error + + def _approx_scalar(self, x): + return ApproxScalar(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) + + def _yield_comparisons(self, actual): + """ + Yield all the pairs of numbers to be compared. This is used to + implement the `__eq__` method. + """ + raise NotImplementedError + + def _check_type(self): + """ + Raise a TypeError if the expected value is not a valid type. + """ + # This is only a concern if the expected value is a sequence. In every + # other case, the approx() function ensures that the expected value has + # a numeric type. For this reason, the default is to do nothing. The + # classes that deal with sequences should reimplement this method to + # raise if there are any non-numeric elements in the sequence. + pass + + +def _recursive_list_map(f, x): + if isinstance(x, list): + return list(_recursive_list_map(f, xi) for xi in x) + else: + return f(x) + + +class ApproxNumpy(ApproxBase): + """ + Perform approximate comparisons where the expected value is numpy array. + """ + + def __repr__(self): + list_scalars = _recursive_list_map(self._approx_scalar, self.expected.tolist()) + return "approx({!r})".format(list_scalars) + + if sys.version_info[0] == 2: + __cmp__ = _cmp_raises_type_error + + def __eq__(self, actual): + import numpy as np + + # self.expected is supposed to always be an array here + + if not np.isscalar(actual): + try: + actual = np.asarray(actual) + except: # noqa + raise TypeError("cannot compare '{}' to numpy.ndarray".format(actual)) + + if not np.isscalar(actual) and actual.shape != self.expected.shape: + return False + + return ApproxBase.__eq__(self, actual) + + def _yield_comparisons(self, actual): + import numpy as np + + # `actual` can either be a numpy array or a scalar, it is treated in + # `__eq__` before being passed to `ApproxBase.__eq__`, which is the + # only method that calls this one. + + if np.isscalar(actual): + for i in np.ndindex(self.expected.shape): + yield actual, np.asscalar(self.expected[i]) + else: + for i in np.ndindex(self.expected.shape): + yield np.asscalar(actual[i]), np.asscalar(self.expected[i]) + + +class ApproxMapping(ApproxBase): + """ + Perform approximate comparisons where the expected value is a mapping with + numeric values (the keys can be anything). + """ + + def __repr__(self): + return "approx({!r})".format( + {k: self._approx_scalar(v) for k, v in self.expected.items()} + ) + + def __eq__(self, actual): + if set(actual.keys()) != set(self.expected.keys()): + return False + + return ApproxBase.__eq__(self, actual) + + def _yield_comparisons(self, actual): + for k in self.expected.keys(): + yield actual[k], self.expected[k] + + def _check_type(self): + __tracebackhide__ = True + for key, value in self.expected.items(): + if isinstance(value, type(self.expected)): + msg = "pytest.approx() does not support nested dictionaries: key={!r} value={!r}\n full mapping={}" + raise TypeError(msg.format(key, value, pprint.pformat(self.expected))) + elif not isinstance(value, Number): + raise _non_numeric_type_error(self.expected, at="key={!r}".format(key)) + + +class ApproxSequence(ApproxBase): + """ + Perform approximate comparisons where the expected value is a sequence of + numbers. + """ + + def __repr__(self): + seq_type = type(self.expected) + if seq_type not in (tuple, list, set): + seq_type = list + return "approx({!r})".format( + seq_type(self._approx_scalar(x) for x in self.expected) + ) + + def __eq__(self, actual): + if len(actual) != len(self.expected): + return False + return ApproxBase.__eq__(self, actual) + + def _yield_comparisons(self, actual): + return zip(actual, self.expected) + + def _check_type(self): + __tracebackhide__ = True + for index, x in enumerate(self.expected): + if isinstance(x, type(self.expected)): + msg = "pytest.approx() does not support nested data structures: {!r} at index {}\n full sequence: {}" + raise TypeError(msg.format(x, index, pprint.pformat(self.expected))) + elif not isinstance(x, Number): + raise _non_numeric_type_error( + self.expected, at="index {}".format(index) + ) + + +class ApproxScalar(ApproxBase): + """ + Perform approximate comparisons where the expected value is a single number. + """ + + DEFAULT_ABSOLUTE_TOLERANCE = 1e-12 + DEFAULT_RELATIVE_TOLERANCE = 1e-6 + + def __repr__(self): + """ + Return a string communicating both the expected value and the tolerance + for the comparison being made, e.g. '1.0 +- 1e-6'. Use the unicode + plus/minus symbol if this is python3 (it's too hard to get right for + python2). + """ + if isinstance(self.expected, complex): + return str(self.expected) + + # Infinities aren't compared using tolerances, so don't show a + # tolerance. + if math.isinf(self.expected): + return str(self.expected) + + # If a sensible tolerance can't be calculated, self.tolerance will + # raise a ValueError. In this case, display '???'. + try: + vetted_tolerance = "{:.1e}".format(self.tolerance) + except ValueError: + vetted_tolerance = "???" + + if sys.version_info[0] == 2: + return "{} +- {}".format(self.expected, vetted_tolerance) + else: + return u"{} \u00b1 {}".format(self.expected, vetted_tolerance) + + def __eq__(self, actual): + """ + Return true if the given value is equal to the expected value within + the pre-specified tolerance. + """ + if _is_numpy_array(actual): + # Call ``__eq__()`` manually to prevent infinite-recursion with + # numpy<1.13. See #3748. + return all(self.__eq__(a) for a in actual.flat) + + # Short-circuit exact equality. + if actual == self.expected: + return True + + # Allow the user to control whether NaNs are considered equal to each + # other or not. The abs() calls are for compatibility with complex + # numbers. + if math.isnan(abs(self.expected)): + return self.nan_ok and math.isnan(abs(actual)) + + # Infinity shouldn't be approximately equal to anything but itself, but + # if there's a relative tolerance, it will be infinite and infinity + # will seem approximately equal to everything. The equal-to-itself + # case would have been short circuited above, so here we can just + # return false if the expected value is infinite. The abs() call is + # for compatibility with complex numbers. + if math.isinf(abs(self.expected)): + return False + + # Return true if the two numbers are within the tolerance. + return abs(self.expected - actual) <= self.tolerance + + __hash__ = None + + @property + def tolerance(self): + """ + Return the tolerance for the comparison. This could be either an + absolute tolerance or a relative tolerance, depending on what the user + specified or which would be larger. + """ + + def set_default(x, default): + return x if x is not None else default + + # Figure out what the absolute tolerance should be. ``self.abs`` is + # either None or a value specified by the user. + absolute_tolerance = set_default(self.abs, self.DEFAULT_ABSOLUTE_TOLERANCE) + + if absolute_tolerance < 0: + raise ValueError( + "absolute tolerance can't be negative: {}".format(absolute_tolerance) + ) + if math.isnan(absolute_tolerance): + raise ValueError("absolute tolerance can't be NaN.") + + # If the user specified an absolute tolerance but not a relative one, + # just return the absolute tolerance. + if self.rel is None: + if self.abs is not None: + return absolute_tolerance + + # Figure out what the relative tolerance should be. ``self.rel`` is + # either None or a value specified by the user. This is done after + # we've made sure the user didn't ask for an absolute tolerance only, + # because we don't want to raise errors about the relative tolerance if + # we aren't even going to use it. + relative_tolerance = set_default( + self.rel, self.DEFAULT_RELATIVE_TOLERANCE + ) * abs(self.expected) + + if relative_tolerance < 0: + raise ValueError( + "relative tolerance can't be negative: {}".format(absolute_tolerance) + ) + if math.isnan(relative_tolerance): + raise ValueError("relative tolerance can't be NaN.") + + # Return the larger of the relative and absolute tolerances. + return max(relative_tolerance, absolute_tolerance) + + +class ApproxDecimal(ApproxScalar): + """ + Perform approximate comparisons where the expected value is a decimal. + """ + + DEFAULT_ABSOLUTE_TOLERANCE = Decimal("1e-12") + DEFAULT_RELATIVE_TOLERANCE = Decimal("1e-6") + + +def approx(expected, rel=None, abs=None, nan_ok=False): + """ + Assert that two numbers (or two sets of numbers) are equal to each other + within some tolerance. + + Due to the `intricacies of floating-point arithmetic`__, numbers that we + would intuitively expect to be equal are not always so:: + + >>> 0.1 + 0.2 == 0.3 + False + + __ https://docs.python.org/3/tutorial/floatingpoint.html + + This problem is commonly encountered when writing tests, e.g. when making + sure that floating-point values are what you expect them to be. One way to + deal with this problem is to assert that two floating-point numbers are + equal to within some appropriate tolerance:: + + >>> abs((0.1 + 0.2) - 0.3) < 1e-6 + True + + However, comparisons like this are tedious to write and difficult to + understand. Furthermore, absolute comparisons like the one above are + usually discouraged because there's no tolerance that works well for all + situations. ``1e-6`` is good for numbers around ``1``, but too small for + very big numbers and too big for very small ones. It's better to express + the tolerance as a fraction of the expected value, but relative comparisons + like that are even more difficult to write correctly and concisely. + + The ``approx`` class performs floating-point comparisons using a syntax + that's as intuitive as possible:: + + >>> from pytest import approx + >>> 0.1 + 0.2 == approx(0.3) + True + + The same syntax also works for sequences of numbers:: + + >>> (0.1 + 0.2, 0.2 + 0.4) == approx((0.3, 0.6)) + True + + Dictionary *values*:: + + >>> {'a': 0.1 + 0.2, 'b': 0.2 + 0.4} == approx({'a': 0.3, 'b': 0.6}) + True + + ``numpy`` arrays:: + + >>> import numpy as np # doctest: +SKIP + >>> np.array([0.1, 0.2]) + np.array([0.2, 0.4]) == approx(np.array([0.3, 0.6])) # doctest: +SKIP + True + + And for a ``numpy`` array against a scalar:: + + >>> import numpy as np # doctest: +SKIP + >>> np.array([0.1, 0.2]) + np.array([0.2, 0.1]) == approx(0.3) # doctest: +SKIP + True + + By default, ``approx`` considers numbers within a relative tolerance of + ``1e-6`` (i.e. one part in a million) of its expected value to be equal. + This treatment would lead to surprising results if the expected value was + ``0.0``, because nothing but ``0.0`` itself is relatively close to ``0.0``. + To handle this case less surprisingly, ``approx`` also considers numbers + within an absolute tolerance of ``1e-12`` of its expected value to be + equal. Infinity and NaN are special cases. Infinity is only considered + equal to itself, regardless of the relative tolerance. NaN is not + considered equal to anything by default, but you can make it be equal to + itself by setting the ``nan_ok`` argument to True. (This is meant to + facilitate comparing arrays that use NaN to mean "no data".) + + Both the relative and absolute tolerances can be changed by passing + arguments to the ``approx`` constructor:: + + >>> 1.0001 == approx(1) + False + >>> 1.0001 == approx(1, rel=1e-3) + True + >>> 1.0001 == approx(1, abs=1e-3) + True + + If you specify ``abs`` but not ``rel``, the comparison will not consider + the relative tolerance at all. In other words, two numbers that are within + the default relative tolerance of ``1e-6`` will still be considered unequal + if they exceed the specified absolute tolerance. If you specify both + ``abs`` and ``rel``, the numbers will be considered equal if either + tolerance is met:: + + >>> 1 + 1e-8 == approx(1) + True + >>> 1 + 1e-8 == approx(1, abs=1e-12) + False + >>> 1 + 1e-8 == approx(1, rel=1e-6, abs=1e-12) + True + + If you're thinking about using ``approx``, then you might want to know how + it compares to other good ways of comparing floating-point numbers. All of + these algorithms are based on relative and absolute tolerances and should + agree for the most part, but they do have meaningful differences: + + - ``math.isclose(a, b, rel_tol=1e-9, abs_tol=0.0)``: True if the relative + tolerance is met w.r.t. either ``a`` or ``b`` or if the absolute + tolerance is met. Because the relative tolerance is calculated w.r.t. + both ``a`` and ``b``, this test is symmetric (i.e. neither ``a`` nor + ``b`` is a "reference value"). You have to specify an absolute tolerance + if you want to compare to ``0.0`` because there is no tolerance by + default. Only available in python>=3.5. `More information...`__ + + __ https://docs.python.org/3/library/math.html#math.isclose + + - ``numpy.isclose(a, b, rtol=1e-5, atol=1e-8)``: True if the difference + between ``a`` and ``b`` is less that the sum of the relative tolerance + w.r.t. ``b`` and the absolute tolerance. Because the relative tolerance + is only calculated w.r.t. ``b``, this test is asymmetric and you can + think of ``b`` as the reference value. Support for comparing sequences + is provided by ``numpy.allclose``. `More information...`__ + + __ http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.isclose.html + + - ``unittest.TestCase.assertAlmostEqual(a, b)``: True if ``a`` and ``b`` + are within an absolute tolerance of ``1e-7``. No relative tolerance is + considered and the absolute tolerance cannot be changed, so this function + is not appropriate for very large or very small numbers. Also, it's only + available in subclasses of ``unittest.TestCase`` and it's ugly because it + doesn't follow PEP8. `More information...`__ + + __ https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertAlmostEqual + + - ``a == pytest.approx(b, rel=1e-6, abs=1e-12)``: True if the relative + tolerance is met w.r.t. ``b`` or if the absolute tolerance is met. + Because the relative tolerance is only calculated w.r.t. ``b``, this test + is asymmetric and you can think of ``b`` as the reference value. In the + special case that you explicitly specify an absolute tolerance but not a + relative tolerance, only the absolute tolerance is considered. + + .. warning:: + + .. versionchanged:: 3.2 + + In order to avoid inconsistent behavior, ``TypeError`` is + raised for ``>``, ``>=``, ``<`` and ``<=`` comparisons. + The example below illustrates the problem:: + + assert approx(0.1) > 0.1 + 1e-10 # calls approx(0.1).__gt__(0.1 + 1e-10) + assert 0.1 + 1e-10 > approx(0.1) # calls approx(0.1).__lt__(0.1 + 1e-10) + + In the second example one expects ``approx(0.1).__le__(0.1 + 1e-10)`` + to be called. But instead, ``approx(0.1).__lt__(0.1 + 1e-10)`` is used to + comparison. This is because the call hierarchy of rich comparisons + follows a fixed behavior. `More information...`__ + + __ https://docs.python.org/3/reference/datamodel.html#object.__ge__ + """ + + # Delegate the comparison to a class that knows how to deal with the type + # of the expected value (e.g. int, float, list, dict, numpy.array, etc). + # + # The primary responsibility of these classes is to implement ``__eq__()`` + # and ``__repr__()``. The former is used to actually check if some + # "actual" value is equivalent to the given expected value within the + # allowed tolerance. The latter is used to show the user the expected + # value and tolerance, in the case that a test failed. + # + # The actual logic for making approximate comparisons can be found in + # ApproxScalar, which is used to compare individual numbers. All of the + # other Approx classes eventually delegate to this class. The ApproxBase + # class provides some convenient methods and overloads, but isn't really + # essential. + + __tracebackhide__ = True + + if isinstance(expected, Decimal): + cls = ApproxDecimal + elif isinstance(expected, Number): + cls = ApproxScalar + elif isinstance(expected, Mapping): + cls = ApproxMapping + elif isinstance(expected, Sequence) and not isinstance(expected, STRING_TYPES): + cls = ApproxSequence + elif _is_numpy_array(expected): + cls = ApproxNumpy + else: + raise _non_numeric_type_error(expected, at=None) + + return cls(expected, rel, abs, nan_ok) + + +def _is_numpy_array(obj): + """ + Return true if the given object is a numpy array. Make a special effort to + avoid importing numpy unless it's really necessary. + """ + import sys + + np = sys.modules.get("numpy") + if np is not None: + return isinstance(obj, np.ndarray) + return False + + +# builtin pytest.raises helper + + +def raises(expected_exception, *args, **kwargs): + r""" + Assert that a code block/function call raises ``expected_exception`` + and raise a failure exception otherwise. + + :arg message: if specified, provides a custom failure message if the + exception is not raised + :arg match: if specified, asserts that the exception matches a text or regex + + This helper produces a ``ExceptionInfo()`` object (see below). + + You may use this function as a context manager:: + + >>> with raises(ZeroDivisionError): + ... 1/0 + + .. versionchanged:: 2.10 + + In the context manager form you may use the keyword argument + ``message`` to specify a custom failure message:: + + >>> with raises(ZeroDivisionError, message="Expecting ZeroDivisionError"): + ... pass + Traceback (most recent call last): + ... + Failed: Expecting ZeroDivisionError + + .. note:: + + When using ``pytest.raises`` as a context manager, it's worthwhile to + note that normal context manager rules apply and that the exception + raised *must* be the final line in the scope of the context manager. + Lines of code after that, within the scope of the context manager will + not be executed. For example:: + + >>> value = 15 + >>> with raises(ValueError) as exc_info: + ... if value > 10: + ... raise ValueError("value must be <= 10") + ... assert exc_info.type == ValueError # this will not execute + + Instead, the following approach must be taken (note the difference in + scope):: + + >>> with raises(ValueError) as exc_info: + ... if value > 10: + ... raise ValueError("value must be <= 10") + ... + >>> assert exc_info.type == ValueError + + + Since version ``3.1`` you can use the keyword argument ``match`` to assert that the + exception matches a text or regex:: + + >>> with raises(ValueError, match='must be 0 or None'): + ... raise ValueError("value must be 0 or None") + + >>> with raises(ValueError, match=r'must be \d+$'): + ... raise ValueError("value must be 42") + + **Legacy forms** + + The forms below are fully supported but are discouraged for new code because the + context manager form is regarded as more readable and less error-prone. + + It is possible to specify a callable by passing a to-be-called lambda:: + + >>> raises(ZeroDivisionError, lambda: 1/0) + + + or you can specify an arbitrary callable with arguments:: + + >>> def f(x): return 1/x + ... + >>> raises(ZeroDivisionError, f, 0) + + >>> raises(ZeroDivisionError, f, x=0) + + + It is also possible to pass a string to be evaluated at runtime:: + + >>> raises(ZeroDivisionError, "f(0)") + + + The string will be evaluated using the same ``locals()`` and ``globals()`` + at the moment of the ``raises`` call. + + .. currentmodule:: _pytest._code + + Consult the API of ``excinfo`` objects: :class:`ExceptionInfo`. + + .. note:: + Similar to caught exception objects in Python, explicitly clearing + local references to returned ``ExceptionInfo`` objects can + help the Python interpreter speed up its garbage collection. + + Clearing those references breaks a reference cycle + (``ExceptionInfo`` --> caught exception --> frame stack raising + the exception --> current frame stack --> local variables --> + ``ExceptionInfo``) which makes Python keep all objects referenced + from that cycle (including all local variables in the current + frame) alive until the next cyclic garbage collection run. See the + official Python ``try`` statement documentation for more detailed + information. + + """ + __tracebackhide__ = True + for exc in filterfalse(isclass, always_iterable(expected_exception, BASE_TYPE)): + msg = ( + "exceptions must be old-style classes or" + " derived from BaseException, not %s" + ) + raise TypeError(msg % type(exc)) + + message = "DID NOT RAISE {}".format(expected_exception) + match_expr = None + + if not args: + if "message" in kwargs: + message = kwargs.pop("message") + if "match" in kwargs: + match_expr = kwargs.pop("match") + if kwargs: + msg = "Unexpected keyword arguments passed to pytest.raises: " + msg += ", ".join(kwargs.keys()) + raise TypeError(msg) + return RaisesContext(expected_exception, message, match_expr) + elif isinstance(args[0], str): + code, = args + assert isinstance(code, str) + frame = sys._getframe(1) + loc = frame.f_locals.copy() + loc.update(kwargs) + # print "raises frame scope: %r" % frame.f_locals + try: + code = _pytest._code.Source(code).compile() + six.exec_(code, frame.f_globals, loc) + # XXX didn't mean f_globals == f_locals something special? + # this is destroyed here ... + except expected_exception: + return _pytest._code.ExceptionInfo() + else: + func = args[0] + try: + func(*args[1:], **kwargs) + except expected_exception: + return _pytest._code.ExceptionInfo() + fail(message) + + +raises.Exception = fail.Exception + + +class RaisesContext(object): + def __init__(self, expected_exception, message, match_expr): + self.expected_exception = expected_exception + self.message = message + self.match_expr = match_expr + self.excinfo = None + + def __enter__(self): + self.excinfo = object.__new__(_pytest._code.ExceptionInfo) + return self.excinfo + + def __exit__(self, *tp): + __tracebackhide__ = True + if tp[0] is None: + fail(self.message) + self.excinfo.__init__(tp) + suppress_exception = issubclass(self.excinfo.type, self.expected_exception) + if sys.version_info[0] == 2 and suppress_exception: + sys.exc_clear() + if self.match_expr and suppress_exception: + self.excinfo.match(self.match_expr) + return suppress_exception diff --git a/venv/Lib/site-packages/_pytest/recwarn.py b/venv/Lib/site-packages/_pytest/recwarn.py new file mode 100644 index 00000000..62c9158f --- /dev/null +++ b/venv/Lib/site-packages/_pytest/recwarn.py @@ -0,0 +1,221 @@ +""" recording warnings during test function execution. """ +from __future__ import absolute_import, division, print_function + +import inspect + +import _pytest._code +import re +import sys +import warnings + +import six + +from _pytest.fixtures import yield_fixture +from _pytest.outcomes import fail + + +@yield_fixture +def recwarn(): + """Return a :class:`WarningsRecorder` instance that records all warnings emitted by test functions. + + See http://docs.python.org/library/warnings.html for information + on warning categories. + """ + wrec = WarningsRecorder() + with wrec: + warnings.simplefilter("default") + yield wrec + + +def deprecated_call(func=None, *args, **kwargs): + """context manager that can be used to ensure a block of code triggers a + ``DeprecationWarning`` or ``PendingDeprecationWarning``:: + + >>> import warnings + >>> def api_call_v2(): + ... warnings.warn('use v3 of this api', DeprecationWarning) + ... return 200 + + >>> with deprecated_call(): + ... assert api_call_v2() == 200 + + ``deprecated_call`` can also be used by passing a function and ``*args`` and ``*kwargs``, + in which case it will ensure calling ``func(*args, **kwargs)`` produces one of the warnings + types above. + """ + __tracebackhide__ = True + if func is not None: + args = (func,) + args + return warns((DeprecationWarning, PendingDeprecationWarning), *args, **kwargs) + + +def warns(expected_warning, *args, **kwargs): + r"""Assert that code raises a particular class of warning. + + Specifically, the parameter ``expected_warning`` can be a warning class or + sequence of warning classes, and the inside the ``with`` block must issue a warning of that class or + classes. + + This helper produces a list of :class:`warnings.WarningMessage` objects, + one for each warning raised. + + This function can be used as a context manager, or any of the other ways + ``pytest.raises`` can be used:: + + >>> with warns(RuntimeWarning): + ... warnings.warn("my warning", RuntimeWarning) + + In the context manager form you may use the keyword argument ``match`` to assert + that the exception matches a text or regex:: + + >>> with warns(UserWarning, match='must be 0 or None'): + ... warnings.warn("value must be 0 or None", UserWarning) + + >>> with warns(UserWarning, match=r'must be \d+$'): + ... warnings.warn("value must be 42", UserWarning) + + >>> with warns(UserWarning, match=r'must be \d+$'): + ... warnings.warn("this is not here", UserWarning) + Traceback (most recent call last): + ... + Failed: DID NOT WARN. No warnings of type ...UserWarning... was emitted... + + """ + __tracebackhide__ = True + match_expr = None + if not args: + if "match" in kwargs: + match_expr = kwargs.pop("match") + return WarningsChecker(expected_warning, match_expr=match_expr) + elif isinstance(args[0], str): + code, = args + assert isinstance(code, str) + frame = sys._getframe(1) + loc = frame.f_locals.copy() + loc.update(kwargs) + + with WarningsChecker(expected_warning, match_expr=match_expr): + code = _pytest._code.Source(code).compile() + six.exec_(code, frame.f_globals, loc) + else: + func = args[0] + with WarningsChecker(expected_warning, match_expr=match_expr): + return func(*args[1:], **kwargs) + + +class WarningsRecorder(warnings.catch_warnings): + """A context manager to record raised warnings. + + Adapted from `warnings.catch_warnings`. + """ + + def __init__(self): + super(WarningsRecorder, self).__init__(record=True) + self._entered = False + self._list = [] + + @property + def list(self): + """The list of recorded warnings.""" + return self._list + + def __getitem__(self, i): + """Get a recorded warning by index.""" + return self._list[i] + + def __iter__(self): + """Iterate through the recorded warnings.""" + return iter(self._list) + + def __len__(self): + """The number of recorded warnings.""" + return len(self._list) + + def pop(self, cls=Warning): + """Pop the first recorded warning, raise exception if not exists.""" + for i, w in enumerate(self._list): + if issubclass(w.category, cls): + return self._list.pop(i) + __tracebackhide__ = True + raise AssertionError("%r not found in warning list" % cls) + + def clear(self): + """Clear the list of recorded warnings.""" + self._list[:] = [] + + def __enter__(self): + if self._entered: + __tracebackhide__ = True + raise RuntimeError("Cannot enter %r twice" % self) + self._list = super(WarningsRecorder, self).__enter__() + warnings.simplefilter("always") + # python3 keeps track of a "filter version", when the filters are + # updated previously seen warnings can be re-warned. python2 has no + # concept of this so we must reset the warnings registry manually. + # trivial patching of `warnings.warn` seems to be enough somehow? + if six.PY2: + + def warn(*args, **kwargs): + return self._saved_warn(*args, **kwargs) + + warnings.warn, self._saved_warn = warn, warnings.warn + return self + + def __exit__(self, *exc_info): + if not self._entered: + __tracebackhide__ = True + raise RuntimeError("Cannot exit %r without entering first" % self) + # see above where `self._saved_warn` is assigned + if six.PY2: + warnings.warn = self._saved_warn + super(WarningsRecorder, self).__exit__(*exc_info) + + +class WarningsChecker(WarningsRecorder): + def __init__(self, expected_warning=None, match_expr=None): + super(WarningsChecker, self).__init__() + + msg = "exceptions must be old-style classes or derived from Warning, not %s" + if isinstance(expected_warning, tuple): + for exc in expected_warning: + if not inspect.isclass(exc): + raise TypeError(msg % type(exc)) + elif inspect.isclass(expected_warning): + expected_warning = (expected_warning,) + elif expected_warning is not None: + raise TypeError(msg % type(expected_warning)) + + self.expected_warning = expected_warning + self.match_expr = match_expr + + def __exit__(self, *exc_info): + super(WarningsChecker, self).__exit__(*exc_info) + + __tracebackhide__ = True + + # only check if we're not currently handling an exception + if all(a is None for a in exc_info): + if self.expected_warning is not None: + if not any(issubclass(r.category, self.expected_warning) for r in self): + __tracebackhide__ = True + fail( + "DID NOT WARN. No warnings of type {} was emitted. " + "The list of emitted warnings is: {}.".format( + self.expected_warning, [each.message for each in self] + ) + ) + elif self.match_expr is not None: + for r in self: + if issubclass(r.category, self.expected_warning): + if re.compile(self.match_expr).search(str(r.message)): + break + else: + fail( + "DID NOT WARN. No warnings of type {} matching" + " ('{}') was emitted. The list of emitted warnings" + " is: {}.".format( + self.expected_warning, + self.match_expr, + [each.message for each in self], + ) + ) diff --git a/venv/Lib/site-packages/_pytest/reports.py b/venv/Lib/site-packages/_pytest/reports.py new file mode 100644 index 00000000..a57c9fa8 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/reports.py @@ -0,0 +1,196 @@ +import py +from _pytest._code.code import TerminalRepr + + +def getslaveinfoline(node): + try: + return node._slaveinfocache + except AttributeError: + d = node.slaveinfo + ver = "%s.%s.%s" % d["version_info"][:3] + node._slaveinfocache = s = "[%s] %s -- Python %s %s" % ( + d["id"], + d["sysplatform"], + ver, + d["executable"], + ) + return s + + +class BaseReport(object): + def __init__(self, **kw): + self.__dict__.update(kw) + + def toterminal(self, out): + if hasattr(self, "node"): + out.line(getslaveinfoline(self.node)) + + longrepr = self.longrepr + if longrepr is None: + return + + if hasattr(longrepr, "toterminal"): + longrepr.toterminal(out) + else: + try: + out.line(longrepr) + except UnicodeEncodeError: + out.line("") + + def get_sections(self, prefix): + for name, content in self.sections: + if name.startswith(prefix): + yield prefix, content + + @property + def longreprtext(self): + """ + Read-only property that returns the full string representation + of ``longrepr``. + + .. versionadded:: 3.0 + """ + tw = py.io.TerminalWriter(stringio=True) + tw.hasmarkup = False + self.toterminal(tw) + exc = tw.stringio.getvalue() + return exc.strip() + + @property + def caplog(self): + """Return captured log lines, if log capturing is enabled + + .. versionadded:: 3.5 + """ + return "\n".join( + content for (prefix, content) in self.get_sections("Captured log") + ) + + @property + def capstdout(self): + """Return captured text from stdout, if capturing is enabled + + .. versionadded:: 3.0 + """ + return "".join( + content for (prefix, content) in self.get_sections("Captured stdout") + ) + + @property + def capstderr(self): + """Return captured text from stderr, if capturing is enabled + + .. versionadded:: 3.0 + """ + return "".join( + content for (prefix, content) in self.get_sections("Captured stderr") + ) + + passed = property(lambda x: x.outcome == "passed") + failed = property(lambda x: x.outcome == "failed") + skipped = property(lambda x: x.outcome == "skipped") + + @property + def fspath(self): + return self.nodeid.split("::")[0] + + +class TestReport(BaseReport): + """ Basic test report object (also used for setup and teardown calls if + they fail). + """ + + def __init__( + self, + nodeid, + location, + keywords, + outcome, + longrepr, + when, + sections=(), + duration=0, + user_properties=None, + **extra + ): + #: normalized collection node id + self.nodeid = nodeid + + #: a (filesystempath, lineno, domaininfo) tuple indicating the + #: actual location of a test item - it might be different from the + #: collected one e.g. if a method is inherited from a different module. + self.location = location + + #: a name -> value dictionary containing all keywords and + #: markers associated with a test invocation. + self.keywords = keywords + + #: test outcome, always one of "passed", "failed", "skipped". + self.outcome = outcome + + #: None or a failure representation. + self.longrepr = longrepr + + #: one of 'setup', 'call', 'teardown' to indicate runtest phase. + self.when = when + + #: user properties is a list of tuples (name, value) that holds user + #: defined properties of the test + self.user_properties = list(user_properties or []) + + #: list of pairs ``(str, str)`` of extra information which needs to + #: marshallable. Used by pytest to add captured text + #: from ``stdout`` and ``stderr``, but may be used by other plugins + #: to add arbitrary information to reports. + self.sections = list(sections) + + #: time it took to run just the test + self.duration = duration + + self.__dict__.update(extra) + + def __repr__(self): + return "" % ( + self.nodeid, + self.when, + self.outcome, + ) + + +class TeardownErrorReport(BaseReport): + outcome = "failed" + when = "teardown" + + def __init__(self, longrepr, **extra): + self.longrepr = longrepr + self.sections = [] + self.__dict__.update(extra) + + +class CollectReport(BaseReport): + def __init__(self, nodeid, outcome, longrepr, result, sections=(), **extra): + self.nodeid = nodeid + self.outcome = outcome + self.longrepr = longrepr + self.result = result or [] + self.sections = list(sections) + self.__dict__.update(extra) + + @property + def location(self): + return (self.fspath, None, self.fspath) + + def __repr__(self): + return "" % ( + self.nodeid, + len(self.result), + self.outcome, + ) + + +class CollectErrorRepr(TerminalRepr): + def __init__(self, msg): + self.longrepr = msg + + def toterminal(self, out): + out.line(self.longrepr, red=True) diff --git a/venv/Lib/site-packages/_pytest/resultlog.py b/venv/Lib/site-packages/_pytest/resultlog.py new file mode 100644 index 00000000..9ae90e77 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/resultlog.py @@ -0,0 +1,120 @@ +""" log machine-parseable test session result information in a plain +text file. +""" +from __future__ import absolute_import, division, print_function + +import py +import os + + +def pytest_addoption(parser): + group = parser.getgroup("terminal reporting", "resultlog plugin options") + group.addoption( + "--resultlog", + "--result-log", + action="store", + metavar="path", + default=None, + help="DEPRECATED path for machine-readable result log.", + ) + + +def pytest_configure(config): + resultlog = config.option.resultlog + # prevent opening resultlog on slave nodes (xdist) + if resultlog and not hasattr(config, "slaveinput"): + dirname = os.path.dirname(os.path.abspath(resultlog)) + if not os.path.isdir(dirname): + os.makedirs(dirname) + logfile = open(resultlog, "w", 1) # line buffered + config._resultlog = ResultLog(config, logfile) + config.pluginmanager.register(config._resultlog) + + from _pytest.deprecated import RESULT_LOG + from _pytest.warnings import _issue_config_warning + + _issue_config_warning(RESULT_LOG, config) + + +def pytest_unconfigure(config): + resultlog = getattr(config, "_resultlog", None) + if resultlog: + resultlog.logfile.close() + del config._resultlog + config.pluginmanager.unregister(resultlog) + + +def generic_path(item): + chain = item.listchain() + gpath = [chain[0].name] + fspath = chain[0].fspath + fspart = False + for node in chain[1:]: + newfspath = node.fspath + if newfspath == fspath: + if fspart: + gpath.append(":") + fspart = False + else: + gpath.append(".") + else: + gpath.append("/") + fspart = True + name = node.name + if name[0] in "([": + gpath.pop() + gpath.append(name) + fspath = newfspath + return "".join(gpath) + + +class ResultLog(object): + def __init__(self, config, logfile): + self.config = config + self.logfile = logfile # preferably line buffered + + def write_log_entry(self, testpath, lettercode, longrepr): + print("%s %s" % (lettercode, testpath), file=self.logfile) + for line in longrepr.splitlines(): + print(" %s" % line, file=self.logfile) + + def log_outcome(self, report, lettercode, longrepr): + testpath = getattr(report, "nodeid", None) + if testpath is None: + testpath = report.fspath + self.write_log_entry(testpath, lettercode, longrepr) + + def pytest_runtest_logreport(self, report): + if report.when != "call" and report.passed: + return + res = self.config.hook.pytest_report_teststatus(report=report) + code = res[1] + if code == "x": + longrepr = str(report.longrepr) + elif code == "X": + longrepr = "" + elif report.passed: + longrepr = "" + elif report.failed: + longrepr = str(report.longrepr) + elif report.skipped: + longrepr = str(report.longrepr[2]) + self.log_outcome(report, code, longrepr) + + def pytest_collectreport(self, report): + if not report.passed: + if report.failed: + code = "F" + longrepr = str(report.longrepr) + else: + assert report.skipped + code = "S" + longrepr = "%s:%d: %s" % report.longrepr + self.log_outcome(report, code, longrepr) + + def pytest_internalerror(self, excrepr): + reprcrash = getattr(excrepr, "reprcrash", None) + path = getattr(reprcrash, "path", None) + if path is None: + path = "cwd:%s" % py.path.local() + self.write_log_entry(path, "!", str(excrepr)) diff --git a/venv/Lib/site-packages/_pytest/runner.py b/venv/Lib/site-packages/_pytest/runner.py new file mode 100644 index 00000000..05731799 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/runner.py @@ -0,0 +1,388 @@ +""" basic collect and runtest protocol implementations """ +from __future__ import absolute_import, division, print_function + +import bdb +import os +import sys +from time import time + +import six +from _pytest._code.code import ExceptionInfo +from _pytest.outcomes import skip, Skipped, TEST_OUTCOME + +from .reports import TestReport, CollectReport, CollectErrorRepr + +# +# pytest plugin hooks + + +def pytest_addoption(parser): + group = parser.getgroup("terminal reporting", "reporting", after="general") + group.addoption( + "--durations", + action="store", + type=int, + default=None, + metavar="N", + help="show N slowest setup/test durations (N=0 for all).", + ), + + +def pytest_terminal_summary(terminalreporter): + durations = terminalreporter.config.option.durations + verbose = terminalreporter.config.getvalue("verbose") + if durations is None: + return + tr = terminalreporter + dlist = [] + for replist in tr.stats.values(): + for rep in replist: + if hasattr(rep, "duration"): + dlist.append(rep) + if not dlist: + return + dlist.sort(key=lambda x: x.duration) + dlist.reverse() + if not durations: + tr.write_sep("=", "slowest test durations") + else: + tr.write_sep("=", "slowest %s test durations" % durations) + dlist = dlist[:durations] + + for rep in dlist: + if verbose < 2 and rep.duration < 0.005: + tr.write_line("") + tr.write_line("(0.00 durations hidden. Use -vv to show these durations.)") + break + nodeid = rep.nodeid.replace("::()::", "::") + tr.write_line("%02.2fs %-8s %s" % (rep.duration, rep.when, nodeid)) + + +def pytest_sessionstart(session): + session._setupstate = SetupState() + + +def pytest_sessionfinish(session): + session._setupstate.teardown_all() + + +def pytest_runtest_protocol(item, nextitem): + item.ihook.pytest_runtest_logstart(nodeid=item.nodeid, location=item.location) + runtestprotocol(item, nextitem=nextitem) + item.ihook.pytest_runtest_logfinish(nodeid=item.nodeid, location=item.location) + return True + + +def runtestprotocol(item, log=True, nextitem=None): + hasrequest = hasattr(item, "_request") + if hasrequest and not item._request: + item._initrequest() + rep = call_and_report(item, "setup", log) + reports = [rep] + if rep.passed: + if item.config.option.setupshow: + show_test_item(item) + if not item.config.option.setuponly: + reports.append(call_and_report(item, "call", log)) + reports.append(call_and_report(item, "teardown", log, nextitem=nextitem)) + # after all teardown hooks have been called + # want funcargs and request info to go away + if hasrequest: + item._request = False + item.funcargs = None + return reports + + +def show_test_item(item): + """Show test function, parameters and the fixtures of the test item.""" + tw = item.config.get_terminal_writer() + tw.line() + tw.write(" " * 8) + tw.write(item._nodeid) + used_fixtures = sorted(item._fixtureinfo.name2fixturedefs.keys()) + if used_fixtures: + tw.write(" (fixtures used: {})".format(", ".join(used_fixtures))) + + +def pytest_runtest_setup(item): + _update_current_test_var(item, "setup") + item.session._setupstate.prepare(item) + + +def pytest_runtest_call(item): + _update_current_test_var(item, "call") + sys.last_type, sys.last_value, sys.last_traceback = (None, None, None) + try: + item.runtest() + except Exception: + # Store trace info to allow postmortem debugging + type, value, tb = sys.exc_info() + tb = tb.tb_next # Skip *this* frame + sys.last_type = type + sys.last_value = value + sys.last_traceback = tb + del type, value, tb # Get rid of these in this frame + raise + + +def pytest_runtest_teardown(item, nextitem): + _update_current_test_var(item, "teardown") + item.session._setupstate.teardown_exact(item, nextitem) + _update_current_test_var(item, None) + + +def _update_current_test_var(item, when): + """ + Update PYTEST_CURRENT_TEST to reflect the current item and stage. + + If ``when`` is None, delete PYTEST_CURRENT_TEST from the environment. + """ + var_name = "PYTEST_CURRENT_TEST" + if when: + value = "{} ({})".format(item.nodeid, when) + # don't allow null bytes on environment variables (see #2644, #2957) + value = value.replace("\x00", "(null)") + os.environ[var_name] = value + else: + os.environ.pop(var_name) + + +def pytest_report_teststatus(report): + if report.when in ("setup", "teardown"): + if report.failed: + # category, shortletter, verbose-word + return "error", "E", "ERROR" + elif report.skipped: + return "skipped", "s", "SKIPPED" + else: + return "", "", "" + + +# +# Implementation + + +def call_and_report(item, when, log=True, **kwds): + call = call_runtest_hook(item, when, **kwds) + hook = item.ihook + report = hook.pytest_runtest_makereport(item=item, call=call) + if log: + hook.pytest_runtest_logreport(report=report) + if check_interactive_exception(call, report): + hook.pytest_exception_interact(node=item, call=call, report=report) + return report + + +def check_interactive_exception(call, report): + return call.excinfo and not ( + hasattr(report, "wasxfail") + or call.excinfo.errisinstance(skip.Exception) + or call.excinfo.errisinstance(bdb.BdbQuit) + ) + + +def call_runtest_hook(item, when, **kwds): + hookname = "pytest_runtest_" + when + ihook = getattr(item.ihook, hookname) + return CallInfo( + lambda: ihook(item=item, **kwds), + when=when, + treat_keyboard_interrupt_as_exception=item.config.getvalue("usepdb"), + ) + + +class CallInfo(object): + """ Result/Exception info a function invocation. """ + + #: None or ExceptionInfo object. + excinfo = None + + def __init__(self, func, when, treat_keyboard_interrupt_as_exception=False): + #: context of invocation: one of "setup", "call", + #: "teardown", "memocollect" + self.when = when + self.start = time() + try: + self.result = func() + except KeyboardInterrupt: + if treat_keyboard_interrupt_as_exception: + self.excinfo = ExceptionInfo() + else: + self.stop = time() + raise + except: # noqa + self.excinfo = ExceptionInfo() + self.stop = time() + + def __repr__(self): + if self.excinfo: + status = "exception: %s" % str(self.excinfo.value) + else: + status = "result: %r" % (self.result,) + return "" % (self.when, status) + + +def pytest_runtest_makereport(item, call): + when = call.when + duration = call.stop - call.start + keywords = {x: 1 for x in item.keywords} + excinfo = call.excinfo + sections = [] + if not call.excinfo: + outcome = "passed" + longrepr = None + else: + if not isinstance(excinfo, ExceptionInfo): + outcome = "failed" + longrepr = excinfo + elif excinfo.errisinstance(skip.Exception): + outcome = "skipped" + r = excinfo._getreprcrash() + longrepr = (str(r.path), r.lineno, r.message) + else: + outcome = "failed" + if call.when == "call": + longrepr = item.repr_failure(excinfo) + else: # exception in setup or teardown + longrepr = item._repr_failure_py( + excinfo, style=item.config.option.tbstyle + ) + for rwhen, key, content in item._report_sections: + sections.append(("Captured %s %s" % (key, rwhen), content)) + return TestReport( + item.nodeid, + item.location, + keywords, + outcome, + longrepr, + when, + sections, + duration, + user_properties=item.user_properties, + ) + + +def pytest_make_collect_report(collector): + call = CallInfo(lambda: list(collector.collect()), "collect") + longrepr = None + if not call.excinfo: + outcome = "passed" + else: + from _pytest import nose + + skip_exceptions = (Skipped,) + nose.get_skip_exceptions() + if call.excinfo.errisinstance(skip_exceptions): + outcome = "skipped" + r = collector._repr_failure_py(call.excinfo, "line").reprcrash + longrepr = (str(r.path), r.lineno, r.message) + else: + outcome = "failed" + errorinfo = collector.repr_failure(call.excinfo) + if not hasattr(errorinfo, "toterminal"): + errorinfo = CollectErrorRepr(errorinfo) + longrepr = errorinfo + rep = CollectReport( + collector.nodeid, outcome, longrepr, getattr(call, "result", None) + ) + rep.call = call # see collect_one_node + return rep + + +class SetupState(object): + """ shared state for setting up/tearing down test items or collectors. """ + + def __init__(self): + self.stack = [] + self._finalizers = {} + + def addfinalizer(self, finalizer, colitem): + """ attach a finalizer to the given colitem. + if colitem is None, this will add a finalizer that + is called at the end of teardown_all(). + """ + assert colitem and not isinstance(colitem, tuple) + assert callable(finalizer) + # assert colitem in self.stack # some unit tests don't setup stack :/ + self._finalizers.setdefault(colitem, []).append(finalizer) + + def _pop_and_teardown(self): + colitem = self.stack.pop() + self._teardown_with_finalization(colitem) + + def _callfinalizers(self, colitem): + finalizers = self._finalizers.pop(colitem, None) + exc = None + while finalizers: + fin = finalizers.pop() + try: + fin() + except TEST_OUTCOME: + # XXX Only first exception will be seen by user, + # ideally all should be reported. + if exc is None: + exc = sys.exc_info() + if exc: + six.reraise(*exc) + + def _teardown_with_finalization(self, colitem): + self._callfinalizers(colitem) + if hasattr(colitem, "teardown"): + colitem.teardown() + for colitem in self._finalizers: + assert ( + colitem is None or colitem in self.stack or isinstance(colitem, tuple) + ) + + def teardown_all(self): + while self.stack: + self._pop_and_teardown() + for key in list(self._finalizers): + self._teardown_with_finalization(key) + assert not self._finalizers + + def teardown_exact(self, item, nextitem): + needed_collectors = nextitem and nextitem.listchain() or [] + self._teardown_towards(needed_collectors) + + def _teardown_towards(self, needed_collectors): + exc = None + while self.stack: + if self.stack == needed_collectors[: len(self.stack)]: + break + try: + self._pop_and_teardown() + except TEST_OUTCOME: + # XXX Only first exception will be seen by user, + # ideally all should be reported. + if exc is None: + exc = sys.exc_info() + if exc: + six.reraise(*exc) + + def prepare(self, colitem): + """ setup objects along the collector chain to the test-method + and teardown previously setup objects.""" + needed_collectors = colitem.listchain() + self._teardown_towards(needed_collectors) + + # check if the last collection node has raised an error + for col in self.stack: + if hasattr(col, "_prepare_exc"): + six.reraise(*col._prepare_exc) + for col in needed_collectors[len(self.stack) :]: + self.stack.append(col) + try: + col.setup() + except TEST_OUTCOME: + col._prepare_exc = sys.exc_info() + raise + + +def collect_one_node(collector): + ihook = collector.ihook + ihook.pytest_collectstart(collector=collector) + rep = ihook.pytest_make_collect_report(collector=collector) + call = rep.__dict__.pop("call", None) + if call and check_interactive_exception(call, rep): + ihook.pytest_exception_interact(node=collector, call=call, report=rep) + return rep diff --git a/venv/Lib/site-packages/_pytest/setuponly.py b/venv/Lib/site-packages/_pytest/setuponly.py new file mode 100644 index 00000000..c3edc5f8 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/setuponly.py @@ -0,0 +1,85 @@ +from __future__ import absolute_import, division, print_function + +import pytest +import sys + + +def pytest_addoption(parser): + group = parser.getgroup("debugconfig") + group.addoption( + "--setuponly", + "--setup-only", + action="store_true", + help="only setup fixtures, do not execute tests.", + ) + group.addoption( + "--setupshow", + "--setup-show", + action="store_true", + help="show setup of fixtures while executing tests.", + ) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_fixture_setup(fixturedef, request): + yield + config = request.config + if config.option.setupshow: + if hasattr(request, "param"): + # Save the fixture parameter so ._show_fixture_action() can + # display it now and during the teardown (in .finish()). + if fixturedef.ids: + if callable(fixturedef.ids): + fixturedef.cached_param = fixturedef.ids(request.param) + else: + fixturedef.cached_param = fixturedef.ids[request.param_index] + else: + fixturedef.cached_param = request.param + _show_fixture_action(fixturedef, "SETUP") + + +def pytest_fixture_post_finalizer(fixturedef): + if hasattr(fixturedef, "cached_result"): + config = fixturedef._fixturemanager.config + if config.option.setupshow: + _show_fixture_action(fixturedef, "TEARDOWN") + if hasattr(fixturedef, "cached_param"): + del fixturedef.cached_param + + +def _show_fixture_action(fixturedef, msg): + config = fixturedef._fixturemanager.config + capman = config.pluginmanager.getplugin("capturemanager") + if capman: + capman.suspend_global_capture() + out, err = capman.read_global_capture() + + tw = config.get_terminal_writer() + tw.line() + tw.write(" " * 2 * fixturedef.scopenum) + tw.write( + "{step} {scope} {fixture}".format( + step=msg.ljust(8), # align the output to TEARDOWN + scope=fixturedef.scope[0].upper(), + fixture=fixturedef.argname, + ) + ) + + if msg == "SETUP": + deps = sorted(arg for arg in fixturedef.argnames if arg != "request") + if deps: + tw.write(" (fixtures used: {})".format(", ".join(deps))) + + if hasattr(fixturedef, "cached_param"): + tw.write("[{}]".format(fixturedef.cached_param)) + + if capman: + capman.resume_global_capture() + sys.stdout.write(out) + sys.stderr.write(err) + + +@pytest.hookimpl(tryfirst=True) +def pytest_cmdline_main(config): + if config.option.setuponly: + config.option.setupshow = True diff --git a/venv/Lib/site-packages/_pytest/setupplan.py b/venv/Lib/site-packages/_pytest/setupplan.py new file mode 100644 index 00000000..23f4f97e --- /dev/null +++ b/venv/Lib/site-packages/_pytest/setupplan.py @@ -0,0 +1,29 @@ +from __future__ import absolute_import, division, print_function + +import pytest + + +def pytest_addoption(parser): + group = parser.getgroup("debugconfig") + group.addoption( + "--setupplan", + "--setup-plan", + action="store_true", + help="show what fixtures and tests would be executed but " + "don't execute anything.", + ) + + +@pytest.hookimpl(tryfirst=True) +def pytest_fixture_setup(fixturedef, request): + # Will return a dummy fixture if the setuponly option is provided. + if request.config.option.setupplan: + fixturedef.cached_result = (None, None, None) + return fixturedef.cached_result + + +@pytest.hookimpl(tryfirst=True) +def pytest_cmdline_main(config): + if config.option.setupplan: + config.option.setuponly = True + config.option.setupshow = True diff --git a/venv/Lib/site-packages/_pytest/skipping.py b/venv/Lib/site-packages/_pytest/skipping.py new file mode 100644 index 00000000..90afd6de --- /dev/null +++ b/venv/Lib/site-packages/_pytest/skipping.py @@ -0,0 +1,294 @@ +""" support for skip/xfail functions and markers. """ +from __future__ import absolute_import, division, print_function + +from _pytest.config import hookimpl +from _pytest.mark.evaluate import MarkEvaluator +from _pytest.outcomes import fail, skip, xfail + + +def pytest_addoption(parser): + group = parser.getgroup("general") + group.addoption( + "--runxfail", + action="store_true", + dest="runxfail", + default=False, + help="run tests even if they are marked xfail", + ) + + parser.addini( + "xfail_strict", + "default for the strict parameter of xfail " + "markers when not given explicitly (default: False)", + default=False, + type="bool", + ) + + +def pytest_configure(config): + if config.option.runxfail: + # yay a hack + import pytest + + old = pytest.xfail + config._cleanup.append(lambda: setattr(pytest, "xfail", old)) + + def nop(*args, **kwargs): + pass + + nop.Exception = xfail.Exception + setattr(pytest, "xfail", nop) + + config.addinivalue_line( + "markers", + "skip(reason=None): skip the given test function with an optional reason. " + 'Example: skip(reason="no way of currently testing this") skips the ' + "test.", + ) + config.addinivalue_line( + "markers", + "skipif(condition): skip the given test function if eval(condition) " + "results in a True value. Evaluation happens within the " + "module global context. Example: skipif('sys.platform == \"win32\"') " + "skips the test if we are on the win32 platform. see " + "https://docs.pytest.org/en/latest/skipping.html", + ) + config.addinivalue_line( + "markers", + "xfail(condition, reason=None, run=True, raises=None, strict=False): " + "mark the test function as an expected failure if eval(condition) " + "has a True value. Optionally specify a reason for better reporting " + "and run=False if you don't even want to execute the test function. " + "If only specific exception(s) are expected, you can list them in " + "raises, and if the test fails in other ways, it will be reported as " + "a true failure. See https://docs.pytest.org/en/latest/skipping.html", + ) + + +@hookimpl(tryfirst=True) +def pytest_runtest_setup(item): + # Check if skip or skipif are specified as pytest marks + item._skipped_by_mark = False + eval_skipif = MarkEvaluator(item, "skipif") + if eval_skipif.istrue(): + item._skipped_by_mark = True + skip(eval_skipif.getexplanation()) + + for skip_info in item.iter_markers(name="skip"): + item._skipped_by_mark = True + if "reason" in skip_info.kwargs: + skip(skip_info.kwargs["reason"]) + elif skip_info.args: + skip(skip_info.args[0]) + else: + skip("unconditional skip") + + item._evalxfail = MarkEvaluator(item, "xfail") + check_xfail_no_run(item) + + +@hookimpl(hookwrapper=True) +def pytest_pyfunc_call(pyfuncitem): + check_xfail_no_run(pyfuncitem) + outcome = yield + passed = outcome.excinfo is None + if passed: + check_strict_xfail(pyfuncitem) + + +def check_xfail_no_run(item): + """check xfail(run=False)""" + if not item.config.option.runxfail: + evalxfail = item._evalxfail + if evalxfail.istrue(): + if not evalxfail.get("run", True): + xfail("[NOTRUN] " + evalxfail.getexplanation()) + + +def check_strict_xfail(pyfuncitem): + """check xfail(strict=True) for the given PASSING test""" + evalxfail = pyfuncitem._evalxfail + if evalxfail.istrue(): + strict_default = pyfuncitem.config.getini("xfail_strict") + is_strict_xfail = evalxfail.get("strict", strict_default) + if is_strict_xfail: + del pyfuncitem._evalxfail + explanation = evalxfail.getexplanation() + fail("[XPASS(strict)] " + explanation, pytrace=False) + + +@hookimpl(hookwrapper=True) +def pytest_runtest_makereport(item, call): + outcome = yield + rep = outcome.get_result() + evalxfail = getattr(item, "_evalxfail", None) + # unitttest special case, see setting of _unexpectedsuccess + if hasattr(item, "_unexpectedsuccess") and rep.when == "call": + from _pytest.compat import _is_unittest_unexpected_success_a_failure + + if item._unexpectedsuccess: + rep.longrepr = "Unexpected success: {}".format(item._unexpectedsuccess) + else: + rep.longrepr = "Unexpected success" + if _is_unittest_unexpected_success_a_failure(): + rep.outcome = "failed" + else: + rep.outcome = "passed" + rep.wasxfail = rep.longrepr + elif item.config.option.runxfail: + pass # don't interefere + elif call.excinfo and call.excinfo.errisinstance(xfail.Exception): + rep.wasxfail = "reason: " + call.excinfo.value.msg + rep.outcome = "skipped" + elif evalxfail and not rep.skipped and evalxfail.wasvalid() and evalxfail.istrue(): + if call.excinfo: + if evalxfail.invalidraise(call.excinfo.value): + rep.outcome = "failed" + else: + rep.outcome = "skipped" + rep.wasxfail = evalxfail.getexplanation() + elif call.when == "call": + strict_default = item.config.getini("xfail_strict") + is_strict_xfail = evalxfail.get("strict", strict_default) + explanation = evalxfail.getexplanation() + if is_strict_xfail: + rep.outcome = "failed" + rep.longrepr = "[XPASS(strict)] {}".format(explanation) + else: + rep.outcome = "passed" + rep.wasxfail = explanation + elif ( + getattr(item, "_skipped_by_mark", False) + and rep.skipped + and type(rep.longrepr) is tuple + ): + # skipped by mark.skipif; change the location of the failure + # to point to the item definition, otherwise it will display + # the location of where the skip exception was raised within pytest + filename, line, reason = rep.longrepr + filename, line = item.location[:2] + rep.longrepr = filename, line, reason + + +# called by terminalreporter progress reporting + + +def pytest_report_teststatus(report): + if hasattr(report, "wasxfail"): + if report.skipped: + return "xfailed", "x", "xfail" + elif report.passed: + return "xpassed", "X", ("XPASS", {"yellow": True}) + + +# called by the terminalreporter instance/plugin + + +def pytest_terminal_summary(terminalreporter): + tr = terminalreporter + if not tr.reportchars: + # for name in "xfailed skipped failed xpassed": + # if not tr.stats.get(name, 0): + # tr.write_line("HINT: use '-r' option to see extra " + # "summary info about tests") + # break + return + + lines = [] + for char in tr.reportchars: + action = REPORTCHAR_ACTIONS.get(char, lambda tr, lines: None) + action(terminalreporter, lines) + + if lines: + tr._tw.sep("=", "short test summary info") + for line in lines: + tr._tw.line(line) + + +def show_simple(terminalreporter, lines, stat, format): + failed = terminalreporter.stats.get(stat) + if failed: + for rep in failed: + pos = terminalreporter.config.cwd_relative_nodeid(rep.nodeid) + lines.append(format % (pos,)) + + +def show_xfailed(terminalreporter, lines): + xfailed = terminalreporter.stats.get("xfailed") + if xfailed: + for rep in xfailed: + pos = terminalreporter.config.cwd_relative_nodeid(rep.nodeid) + reason = rep.wasxfail + lines.append("XFAIL %s" % (pos,)) + if reason: + lines.append(" " + str(reason)) + + +def show_xpassed(terminalreporter, lines): + xpassed = terminalreporter.stats.get("xpassed") + if xpassed: + for rep in xpassed: + pos = terminalreporter.config.cwd_relative_nodeid(rep.nodeid) + reason = rep.wasxfail + lines.append("XPASS %s %s" % (pos, reason)) + + +def folded_skips(skipped): + d = {} + for event in skipped: + key = event.longrepr + assert len(key) == 3, (event, key) + keywords = getattr(event, "keywords", {}) + # folding reports with global pytestmark variable + # this is workaround, because for now we cannot identify the scope of a skip marker + # TODO: revisit after marks scope would be fixed + when = getattr(event, "when", None) + if when == "setup" and "skip" in keywords and "pytestmark" not in keywords: + key = (key[0], None, key[2]) + d.setdefault(key, []).append(event) + values = [] + for key, events in d.items(): + values.append((len(events),) + key) + return values + + +def show_skipped(terminalreporter, lines): + tr = terminalreporter + skipped = tr.stats.get("skipped", []) + if skipped: + # if not tr.hasopt('skipped'): + # tr.write_line( + # "%d skipped tests, specify -rs for more info" % + # len(skipped)) + # return + fskips = folded_skips(skipped) + if fskips: + # tr.write_sep("_", "skipped test summary") + for num, fspath, lineno, reason in fskips: + if reason.startswith("Skipped: "): + reason = reason[9:] + if lineno is not None: + lines.append( + "SKIP [%d] %s:%d: %s" % (num, fspath, lineno + 1, reason) + ) + else: + lines.append("SKIP [%d] %s: %s" % (num, fspath, reason)) + + +def shower(stat, format): + def show_(terminalreporter, lines): + return show_simple(terminalreporter, lines, stat, format) + + return show_ + + +REPORTCHAR_ACTIONS = { + "x": show_xfailed, + "X": show_xpassed, + "f": shower("failed", "FAIL %s"), + "F": shower("failed", "FAIL %s"), + "s": show_skipped, + "S": show_skipped, + "p": shower("passed", "PASSED %s"), + "E": shower("error", "ERROR %s"), +} diff --git a/venv/Lib/site-packages/_pytest/terminal.py b/venv/Lib/site-packages/_pytest/terminal.py new file mode 100644 index 00000000..8deb330c --- /dev/null +++ b/venv/Lib/site-packages/_pytest/terminal.py @@ -0,0 +1,882 @@ +""" terminal reporting of the full testing process. + +This is a good source for looking at the various reporting hooks. +""" +from __future__ import absolute_import, division, print_function + +import itertools +import platform +import sys +import time + +import attr +import pluggy +import py +import six +from more_itertools import collapse + +import pytest +from _pytest import nodes +from _pytest.main import ( + EXIT_OK, + EXIT_TESTSFAILED, + EXIT_INTERRUPTED, + EXIT_USAGEERROR, + EXIT_NOTESTSCOLLECTED, +) + + +import argparse + + +class MoreQuietAction(argparse.Action): + """ + a modified copy of the argparse count action which counts down and updates + the legacy quiet attribute at the same time + + used to unify verbosity handling + """ + + def __init__(self, option_strings, dest, default=None, required=False, help=None): + super(MoreQuietAction, self).__init__( + option_strings=option_strings, + dest=dest, + nargs=0, + default=default, + required=required, + help=help, + ) + + def __call__(self, parser, namespace, values, option_string=None): + new_count = getattr(namespace, self.dest, 0) - 1 + setattr(namespace, self.dest, new_count) + # todo Deprecate config.quiet + namespace.quiet = getattr(namespace, "quiet", 0) + 1 + + +def pytest_addoption(parser): + group = parser.getgroup("terminal reporting", "reporting", after="general") + group._addoption( + "-v", + "--verbose", + action="count", + default=0, + dest="verbose", + help="increase verbosity.", + ), + group._addoption( + "-q", + "--quiet", + action=MoreQuietAction, + default=0, + dest="verbose", + help="decrease verbosity.", + ), + group._addoption( + "--verbosity", dest="verbose", type=int, default=0, help="set verbosity" + ) + group._addoption( + "-r", + action="store", + dest="reportchars", + default="", + metavar="chars", + help="show extra test summary info as specified by chars (f)ailed, " + "(E)error, (s)skipped, (x)failed, (X)passed, " + "(p)passed, (P)passed with output, (a)all except pP. " + "Warnings are displayed at all times except when " + "--disable-warnings is set", + ) + group._addoption( + "--disable-warnings", + "--disable-pytest-warnings", + default=False, + dest="disable_warnings", + action="store_true", + help="disable warnings summary", + ) + group._addoption( + "-l", + "--showlocals", + action="store_true", + dest="showlocals", + default=False, + help="show locals in tracebacks (disabled by default).", + ) + group._addoption( + "--tb", + metavar="style", + action="store", + dest="tbstyle", + default="auto", + choices=["auto", "long", "short", "no", "line", "native"], + help="traceback print mode (auto/long/short/line/native/no).", + ) + group._addoption( + "--show-capture", + action="store", + dest="showcapture", + choices=["no", "stdout", "stderr", "log", "all"], + default="all", + help="Controls how captured stdout/stderr/log is shown on failed tests. " + "Default is 'all'.", + ) + group._addoption( + "--fulltrace", + "--full-trace", + action="store_true", + default=False, + help="don't cut any tracebacks (default is to cut).", + ) + group._addoption( + "--color", + metavar="color", + action="store", + dest="color", + default="auto", + choices=["yes", "no", "auto"], + help="color terminal output (yes/no/auto).", + ) + + parser.addini( + "console_output_style", + help="console output: classic or with additional progress information (classic|progress).", + default="progress", + ) + + +def pytest_configure(config): + reporter = TerminalReporter(config, sys.stdout) + config.pluginmanager.register(reporter, "terminalreporter") + if config.option.debug or config.option.traceconfig: + + def mywriter(tags, args): + msg = " ".join(map(str, args)) + reporter.write_line("[traceconfig] " + msg) + + config.trace.root.setprocessor("pytest:config", mywriter) + + +def getreportopt(config): + reportopts = "" + reportchars = config.option.reportchars + if not config.option.disable_warnings and "w" not in reportchars: + reportchars += "w" + elif config.option.disable_warnings and "w" in reportchars: + reportchars = reportchars.replace("w", "") + if reportchars: + for char in reportchars: + if char not in reportopts and char != "a": + reportopts += char + elif char == "a": + reportopts = "fEsxXw" + return reportopts + + +def pytest_report_teststatus(report): + if report.passed: + letter = "." + elif report.skipped: + letter = "s" + elif report.failed: + letter = "F" + if report.when != "call": + letter = "f" + return report.outcome, letter, report.outcome.upper() + + +@attr.s +class WarningReport(object): + """ + Simple structure to hold warnings information captured by ``pytest_logwarning`` and ``pytest_warning_captured``. + + :ivar str message: user friendly message about the warning + :ivar str|None nodeid: node id that generated the warning (see ``get_location``). + :ivar tuple|py.path.local fslocation: + file system location of the source of the warning (see ``get_location``). + + :ivar bool legacy: if this warning report was generated from the deprecated ``pytest_logwarning`` hook. + """ + + message = attr.ib() + nodeid = attr.ib(default=None) + fslocation = attr.ib(default=None) + legacy = attr.ib(default=False) + + def get_location(self, config): + """ + Returns the more user-friendly information about the location + of a warning, or None. + """ + if self.nodeid: + return self.nodeid + if self.fslocation: + if isinstance(self.fslocation, tuple) and len(self.fslocation) >= 2: + filename, linenum = self.fslocation[:2] + relpath = py.path.local(filename).relto(config.invocation_dir) + if not relpath: + relpath = str(filename) + return "%s:%s" % (relpath, linenum) + else: + return str(self.fslocation) + return None + + +class TerminalReporter(object): + def __init__(self, config, file=None): + import _pytest.config + + self.config = config + self.verbosity = self.config.option.verbose + self.showheader = self.verbosity >= 0 + self.showfspath = self.verbosity >= 0 + self.showlongtestinfo = self.verbosity > 0 + self._numcollected = 0 + self._session = None + + self.stats = {} + self.startdir = py.path.local() + if file is None: + file = sys.stdout + self._tw = _pytest.config.create_terminal_writer(config, file) + # self.writer will be deprecated in pytest-3.4 + self.writer = self._tw + self._screen_width = self._tw.fullwidth + self.currentfspath = None + self.reportchars = getreportopt(config) + self.hasmarkup = self._tw.hasmarkup + self.isatty = file.isatty() + self._progress_nodeids_reported = set() + self._show_progress_info = self._determine_show_progress_info() + + def _determine_show_progress_info(self): + """Return True if we should display progress information based on the current config""" + # do not show progress if we are not capturing output (#3038) + if self.config.getoption("capture") == "no": + return False + # do not show progress if we are showing fixture setup/teardown + if self.config.getoption("setupshow"): + return False + return self.config.getini("console_output_style") in ("progress", "count") + + def hasopt(self, char): + char = {"xfailed": "x", "skipped": "s"}.get(char, char) + return char in self.reportchars + + def write_fspath_result(self, nodeid, res): + fspath = self.config.rootdir.join(nodeid.split("::")[0]) + if fspath != self.currentfspath: + if self.currentfspath is not None and self._show_progress_info: + self._write_progress_information_filling_space() + self.currentfspath = fspath + fspath = self.startdir.bestrelpath(fspath) + self._tw.line() + self._tw.write(fspath + " ") + self._tw.write(res) + + def write_ensure_prefix(self, prefix, extra="", **kwargs): + if self.currentfspath != prefix: + self._tw.line() + self.currentfspath = prefix + self._tw.write(prefix) + if extra: + self._tw.write(extra, **kwargs) + self.currentfspath = -2 + + def ensure_newline(self): + if self.currentfspath: + self._tw.line() + self.currentfspath = None + + def write(self, content, **markup): + self._tw.write(content, **markup) + + def write_line(self, line, **markup): + if not isinstance(line, six.text_type): + line = six.text_type(line, errors="replace") + self.ensure_newline() + self._tw.line(line, **markup) + + def rewrite(self, line, **markup): + """ + Rewinds the terminal cursor to the beginning and writes the given line. + + :kwarg erase: if True, will also add spaces until the full terminal width to ensure + previous lines are properly erased. + + The rest of the keyword arguments are markup instructions. + """ + erase = markup.pop("erase", False) + if erase: + fill_count = self._tw.fullwidth - len(line) - 1 + fill = " " * fill_count + else: + fill = "" + line = str(line) + self._tw.write("\r" + line + fill, **markup) + + def write_sep(self, sep, title=None, **markup): + self.ensure_newline() + self._tw.sep(sep, title, **markup) + + def section(self, title, sep="=", **kw): + self._tw.sep(sep, title, **kw) + + def line(self, msg, **kw): + self._tw.line(msg, **kw) + + def pytest_internalerror(self, excrepr): + for line in six.text_type(excrepr).split("\n"): + self.write_line("INTERNALERROR> " + line) + return 1 + + def pytest_logwarning(self, fslocation, message, nodeid): + warnings = self.stats.setdefault("warnings", []) + warning = WarningReport( + fslocation=fslocation, message=message, nodeid=nodeid, legacy=True + ) + warnings.append(warning) + + def pytest_warning_captured(self, warning_message, item): + # from _pytest.nodes import get_fslocation_from_item + from _pytest.warnings import warning_record_to_str + + warnings = self.stats.setdefault("warnings", []) + fslocation = warning_message.filename, warning_message.lineno + message = warning_record_to_str(warning_message) + + nodeid = item.nodeid if item is not None else "" + warning_report = WarningReport( + fslocation=fslocation, message=message, nodeid=nodeid + ) + warnings.append(warning_report) + + def pytest_plugin_registered(self, plugin): + if self.config.option.traceconfig: + msg = "PLUGIN registered: %s" % (plugin,) + # XXX this event may happen during setup/teardown time + # which unfortunately captures our output here + # which garbles our output if we use self.write_line + self.write_line(msg) + + def pytest_deselected(self, items): + self.stats.setdefault("deselected", []).extend(items) + + def pytest_runtest_logstart(self, nodeid, location): + # ensure that the path is printed before the + # 1st test of a module starts running + if self.showlongtestinfo: + line = self._locationline(nodeid, *location) + self.write_ensure_prefix(line, "") + elif self.showfspath: + fsid = nodeid.split("::")[0] + self.write_fspath_result(fsid, "") + + def pytest_runtest_logreport(self, report): + rep = report + res = self.config.hook.pytest_report_teststatus(report=rep) + category, letter, word = res + if isinstance(word, tuple): + word, markup = word + else: + markup = None + self.stats.setdefault(category, []).append(rep) + self._tests_ran = True + if not letter and not word: + # probably passed setup/teardown + return + running_xdist = hasattr(rep, "node") + if self.verbosity <= 0: + if not running_xdist and self.showfspath: + self.write_fspath_result(rep.nodeid, letter) + else: + self._tw.write(letter) + else: + self._progress_nodeids_reported.add(rep.nodeid) + if markup is None: + if rep.passed: + markup = {"green": True} + elif rep.failed: + markup = {"red": True} + elif rep.skipped: + markup = {"yellow": True} + else: + markup = {} + line = self._locationline(rep.nodeid, *rep.location) + if not running_xdist: + self.write_ensure_prefix(line, word, **markup) + if self._show_progress_info: + self._write_progress_information_filling_space() + else: + self.ensure_newline() + self._tw.write("[%s]" % rep.node.gateway.id) + if self._show_progress_info: + self._tw.write( + self._get_progress_information_message() + " ", cyan=True + ) + else: + self._tw.write(" ") + self._tw.write(word, **markup) + self._tw.write(" " + line) + self.currentfspath = -2 + + def pytest_runtest_logfinish(self, nodeid): + if self.config.getini("console_output_style") == "count": + num_tests = self._session.testscollected + progress_length = len(" [{}/{}]".format(str(num_tests), str(num_tests))) + else: + progress_length = len(" [100%]") + + if self.verbosity <= 0 and self._show_progress_info: + self._progress_nodeids_reported.add(nodeid) + last_item = ( + len(self._progress_nodeids_reported) == self._session.testscollected + ) + if last_item: + self._write_progress_information_filling_space() + else: + w = self._width_of_current_line + past_edge = w + progress_length + 1 >= self._screen_width + if past_edge: + msg = self._get_progress_information_message() + self._tw.write(msg + "\n", cyan=True) + + def _get_progress_information_message(self): + if self.config.getoption("capture") == "no": + return "" + collected = self._session.testscollected + if self.config.getini("console_output_style") == "count": + if collected: + progress = self._progress_nodeids_reported + counter_format = "{{:{}d}}".format(len(str(collected))) + format_string = " [{}/{{}}]".format(counter_format) + return format_string.format(len(progress), collected) + return " [ {} / {} ]".format(collected, collected) + else: + if collected: + progress = len(self._progress_nodeids_reported) * 100 // collected + return " [{:3d}%]".format(progress) + return " [100%]" + + def _write_progress_information_filling_space(self): + msg = self._get_progress_information_message() + w = self._width_of_current_line + fill = self._tw.fullwidth - w - 1 + self.write(msg.rjust(fill), cyan=True) + + @property + def _width_of_current_line(self): + """Return the width of current line, using the superior implementation of py-1.6 when available""" + try: + return self._tw.width_of_current_line + except AttributeError: + # py < 1.6.0 + return self._tw.chars_on_current_line + + def pytest_collection(self): + if not self.isatty and self.config.option.verbose >= 1: + self.write("collecting ... ", bold=True) + + def pytest_collectreport(self, report): + if report.failed: + self.stats.setdefault("error", []).append(report) + elif report.skipped: + self.stats.setdefault("skipped", []).append(report) + items = [x for x in report.result if isinstance(x, pytest.Item)] + self._numcollected += len(items) + if self.isatty: + # self.write_fspath_result(report.nodeid, 'E') + self.report_collect() + + def report_collect(self, final=False): + if self.config.option.verbose < 0: + return + + errors = len(self.stats.get("error", [])) + skipped = len(self.stats.get("skipped", [])) + deselected = len(self.stats.get("deselected", [])) + if final: + line = "collected " + else: + line = "collecting " + line += ( + str(self._numcollected) + " item" + ("" if self._numcollected == 1 else "s") + ) + if errors: + line += " / %d errors" % errors + if deselected: + line += " / %d deselected" % deselected + if skipped: + line += " / %d skipped" % skipped + if self.isatty: + self.rewrite(line, bold=True, erase=True) + if final: + self.write("\n") + else: + self.write_line(line) + + @pytest.hookimpl(trylast=True) + def pytest_collection_modifyitems(self): + self.report_collect(True) + + @pytest.hookimpl(trylast=True) + def pytest_sessionstart(self, session): + self._session = session + self._sessionstarttime = time.time() + if not self.showheader: + return + self.write_sep("=", "test session starts", bold=True) + verinfo = platform.python_version() + msg = "platform %s -- Python %s" % (sys.platform, verinfo) + if hasattr(sys, "pypy_version_info"): + verinfo = ".".join(map(str, sys.pypy_version_info[:3])) + msg += "[pypy-%s-%s]" % (verinfo, sys.pypy_version_info[3]) + msg += ", pytest-%s, py-%s, pluggy-%s" % ( + pytest.__version__, + py.__version__, + pluggy.__version__, + ) + if ( + self.verbosity > 0 + or self.config.option.debug + or getattr(self.config.option, "pastebin", None) + ): + msg += " -- " + str(sys.executable) + self.write_line(msg) + lines = self.config.hook.pytest_report_header( + config=self.config, startdir=self.startdir + ) + self._write_report_lines_from_hooks(lines) + + def _write_report_lines_from_hooks(self, lines): + lines.reverse() + for line in collapse(lines): + self.write_line(line) + + def pytest_report_header(self, config): + inifile = "" + if config.inifile: + inifile = " " + config.rootdir.bestrelpath(config.inifile) + lines = ["rootdir: %s, inifile:%s" % (config.rootdir, inifile)] + + plugininfo = config.pluginmanager.list_plugin_distinfo() + if plugininfo: + + lines.append("plugins: %s" % ", ".join(_plugin_nameversions(plugininfo))) + return lines + + def pytest_collection_finish(self, session): + if self.config.option.collectonly: + self._printcollecteditems(session.items) + if self.stats.get("failed"): + self._tw.sep("!", "collection failures") + for rep in self.stats.get("failed"): + rep.toterminal(self._tw) + return 1 + return 0 + lines = self.config.hook.pytest_report_collectionfinish( + config=self.config, startdir=self.startdir, items=session.items + ) + self._write_report_lines_from_hooks(lines) + + def _printcollecteditems(self, items): + # to print out items and their parent collectors + # we take care to leave out Instances aka () + # because later versions are going to get rid of them anyway + if self.config.option.verbose < 0: + if self.config.option.verbose < -1: + counts = {} + for item in items: + name = item.nodeid.split("::", 1)[0] + counts[name] = counts.get(name, 0) + 1 + for name, count in sorted(counts.items()): + self._tw.line("%s: %d" % (name, count)) + else: + for item in items: + nodeid = item.nodeid + nodeid = nodeid.replace("::()::", "::") + self._tw.line(nodeid) + return + stack = [] + indent = "" + for item in items: + needed_collectors = item.listchain()[1:] # strip root node + while stack: + if stack == needed_collectors[: len(stack)]: + break + stack.pop() + for col in needed_collectors[len(stack) :]: + stack.append(col) + # if col.name == "()": + # continue + indent = (len(stack) - 1) * " " + self._tw.line("%s%s" % (indent, col)) + + @pytest.hookimpl(hookwrapper=True) + def pytest_sessionfinish(self, exitstatus): + outcome = yield + outcome.get_result() + self._tw.line("") + summary_exit_codes = ( + EXIT_OK, + EXIT_TESTSFAILED, + EXIT_INTERRUPTED, + EXIT_USAGEERROR, + EXIT_NOTESTSCOLLECTED, + ) + if exitstatus in summary_exit_codes: + self.config.hook.pytest_terminal_summary( + terminalreporter=self, exitstatus=exitstatus + ) + if exitstatus == EXIT_INTERRUPTED: + self._report_keyboardinterrupt() + del self._keyboardinterrupt_memo + self.summary_stats() + + @pytest.hookimpl(hookwrapper=True) + def pytest_terminal_summary(self): + self.summary_errors() + self.summary_failures() + yield + self.summary_warnings() + self.summary_passes() + + def pytest_keyboard_interrupt(self, excinfo): + self._keyboardinterrupt_memo = excinfo.getrepr(funcargs=True) + + def pytest_unconfigure(self): + if hasattr(self, "_keyboardinterrupt_memo"): + self._report_keyboardinterrupt() + + def _report_keyboardinterrupt(self): + excrepr = self._keyboardinterrupt_memo + msg = excrepr.reprcrash.message + self.write_sep("!", msg) + if "KeyboardInterrupt" in msg: + if self.config.option.fulltrace: + excrepr.toterminal(self._tw) + else: + excrepr.reprcrash.toterminal(self._tw) + self._tw.line( + "(to show a full traceback on KeyboardInterrupt use --fulltrace)", + yellow=True, + ) + + def _locationline(self, nodeid, fspath, lineno, domain): + def mkrel(nodeid): + line = self.config.cwd_relative_nodeid(nodeid) + if domain and line.endswith(domain): + line = line[: -len(domain)] + values = domain.split("[") + values[0] = values[0].replace(".", "::") # don't replace '.' in params + line += "[".join(values) + return line + + # collect_fspath comes from testid which has a "/"-normalized path + + if fspath: + res = mkrel(nodeid).replace("::()", "") # parens-normalization + if self.verbosity >= 2 and nodeid.split("::")[0] != fspath.replace( + "\\", nodes.SEP + ): + res += " <- " + self.startdir.bestrelpath(fspath) + else: + res = "[location]" + return res + " " + + def _getfailureheadline(self, rep): + if hasattr(rep, "location"): + fspath, lineno, domain = rep.location + return domain + else: + return "test session" # XXX? + + def _getcrashline(self, rep): + try: + return str(rep.longrepr.reprcrash) + except AttributeError: + try: + return str(rep.longrepr)[:50] + except AttributeError: + return "" + + # + # summaries for sessionfinish + # + def getreports(self, name): + values = [] + for x in self.stats.get(name, []): + if not hasattr(x, "_pdbshown"): + values.append(x) + return values + + def summary_warnings(self): + if self.hasopt("w"): + all_warnings = self.stats.get("warnings") + if not all_warnings: + return + + grouped = itertools.groupby( + all_warnings, key=lambda wr: wr.get_location(self.config) + ) + + self.write_sep("=", "warnings summary", yellow=True, bold=False) + for location, warning_records in grouped: + # legacy warnings show their location explicitly, while standard warnings look better without + # it because the location is already formatted into the message + warning_records = list(warning_records) + is_legacy = warning_records[0].legacy + if location and is_legacy: + self._tw.line(str(location)) + for w in warning_records: + if is_legacy: + lines = w.message.splitlines() + indented = "\n".join(" " + x for x in lines) + message = indented.rstrip() + else: + message = w.message.rstrip() + self._tw.line(message) + self._tw.line() + self._tw.line("-- Docs: https://docs.pytest.org/en/latest/warnings.html") + + def summary_passes(self): + if self.config.option.tbstyle != "no": + if self.hasopt("P"): + reports = self.getreports("passed") + if not reports: + return + self.write_sep("=", "PASSES") + for rep in reports: + if rep.sections: + msg = self._getfailureheadline(rep) + self.write_sep("_", msg) + self._outrep_summary(rep) + + def print_teardown_sections(self, rep): + showcapture = self.config.option.showcapture + if showcapture == "no": + return + for secname, content in rep.sections: + if showcapture != "all" and showcapture not in secname: + continue + if "teardown" in secname: + self._tw.sep("-", secname) + if content[-1:] == "\n": + content = content[:-1] + self._tw.line(content) + + def summary_failures(self): + if self.config.option.tbstyle != "no": + reports = self.getreports("failed") + if not reports: + return + self.write_sep("=", "FAILURES") + for rep in reports: + if self.config.option.tbstyle == "line": + line = self._getcrashline(rep) + self.write_line(line) + else: + msg = self._getfailureheadline(rep) + markup = {"red": True, "bold": True} + self.write_sep("_", msg, **markup) + self._outrep_summary(rep) + for report in self.getreports(""): + if report.nodeid == rep.nodeid and report.when == "teardown": + self.print_teardown_sections(report) + + def summary_errors(self): + if self.config.option.tbstyle != "no": + reports = self.getreports("error") + if not reports: + return + self.write_sep("=", "ERRORS") + for rep in self.stats["error"]: + msg = self._getfailureheadline(rep) + if not hasattr(rep, "when"): + # collect + msg = "ERROR collecting " + msg + elif rep.when == "setup": + msg = "ERROR at setup of " + msg + elif rep.when == "teardown": + msg = "ERROR at teardown of " + msg + self.write_sep("_", msg) + self._outrep_summary(rep) + + def _outrep_summary(self, rep): + rep.toterminal(self._tw) + showcapture = self.config.option.showcapture + if showcapture == "no": + return + for secname, content in rep.sections: + if showcapture != "all" and showcapture not in secname: + continue + self._tw.sep("-", secname) + if content[-1:] == "\n": + content = content[:-1] + self._tw.line(content) + + def summary_stats(self): + session_duration = time.time() - self._sessionstarttime + (line, color) = build_summary_stats_line(self.stats) + msg = "%s in %.2f seconds" % (line, session_duration) + markup = {color: True, "bold": True} + + if self.verbosity >= 0: + self.write_sep("=", msg, **markup) + if self.verbosity == -1: + self.write_line(msg, **markup) + + +def repr_pythonversion(v=None): + if v is None: + v = sys.version_info + try: + return "%s.%s.%s-%s-%s" % v + except (TypeError, ValueError): + return str(v) + + +def build_summary_stats_line(stats): + keys = ("failed passed skipped deselected xfailed xpassed warnings error").split() + unknown_key_seen = False + for key in stats.keys(): + if key not in keys: + if key: # setup/teardown reports have an empty key, ignore them + keys.append(key) + unknown_key_seen = True + parts = [] + for key in keys: + val = stats.get(key, None) + if val: + parts.append("%d %s" % (len(val), key)) + + if parts: + line = ", ".join(parts) + else: + line = "no tests ran" + + if "failed" in stats or "error" in stats: + color = "red" + elif "warnings" in stats or unknown_key_seen: + color = "yellow" + elif "passed" in stats: + color = "green" + else: + color = "yellow" + + return (line, color) + + +def _plugin_nameversions(plugininfo): + values = [] + for plugin, dist in plugininfo: + # gets us name and version! + name = "{dist.project_name}-{dist.version}".format(dist=dist) + # questionable convenience, but it keeps things short + if name.startswith("pytest-"): + name = name[7:] + # we decided to print python package names + # they can have more than one plugin + if name not in values: + values.append(name) + return values diff --git a/venv/Lib/site-packages/_pytest/tmpdir.py b/venv/Lib/site-packages/_pytest/tmpdir.py new file mode 100644 index 00000000..1963f14c --- /dev/null +++ b/venv/Lib/site-packages/_pytest/tmpdir.py @@ -0,0 +1,186 @@ +""" support for providing temporary directories to test functions. """ +from __future__ import absolute_import, division, print_function + +import os +import re +import pytest +import py +from _pytest.monkeypatch import MonkeyPatch +import attr +import tempfile +import warnings + +from .pathlib import ( + Path, + make_numbered_dir, + make_numbered_dir_with_cleanup, + ensure_reset_dir, + LOCK_TIMEOUT, +) + + +@attr.s +class TempPathFactory(object): + """Factory for temporary directories under the common base temp directory. + + The base directory can be configured using the ``--basetemp`` option.""" + + _given_basetemp = attr.ib() + _trace = attr.ib() + _basetemp = attr.ib(default=None) + + @classmethod + def from_config(cls, config): + """ + :param config: a pytest configuration + """ + return cls( + given_basetemp=config.option.basetemp, trace=config.trace.get("tmpdir") + ) + + def mktemp(self, basename, numbered=True): + """makes a temporary directory managed by the factory""" + if not numbered: + p = self.getbasetemp().joinpath(basename) + p.mkdir() + else: + p = make_numbered_dir(root=self.getbasetemp(), prefix=basename) + self._trace("mktemp", p) + return p + + def getbasetemp(self): + """ return base temporary directory. """ + if self._basetemp is None: + if self._given_basetemp is not None: + basetemp = Path(self._given_basetemp) + ensure_reset_dir(basetemp) + else: + from_env = os.environ.get("PYTEST_DEBUG_TEMPROOT") + temproot = Path(from_env or tempfile.gettempdir()) + user = get_user() or "unknown" + # use a sub-directory in the temproot to speed-up + # make_numbered_dir() call + rootdir = temproot.joinpath("pytest-of-{}".format(user)) + rootdir.mkdir(exist_ok=True) + basetemp = make_numbered_dir_with_cleanup( + prefix="pytest-", root=rootdir, keep=3, lock_timeout=LOCK_TIMEOUT + ) + assert basetemp is not None + self._basetemp = t = basetemp + self._trace("new basetemp", t) + return t + else: + return self._basetemp + + +@attr.s +class TempdirFactory(object): + """ + backward comptibility wrapper that implements + :class:``py.path.local`` for :class:``TempPathFactory`` + """ + + _tmppath_factory = attr.ib() + + def ensuretemp(self, string, dir=1): + """ (deprecated) return temporary directory path with + the given string as the trailing part. It is usually + better to use the 'tmpdir' function argument which + provides an empty unique-per-test-invocation directory + and is guaranteed to be empty. + """ + # py.log._apiwarn(">1.1", "use tmpdir function argument") + from .deprecated import PYTEST_ENSURETEMP + + warnings.warn(PYTEST_ENSURETEMP, stacklevel=2) + return self.getbasetemp().ensure(string, dir=dir) + + def mktemp(self, basename, numbered=True): + """Create a subdirectory of the base temporary directory and return it. + If ``numbered``, ensure the directory is unique by adding a number + prefix greater than any existing one. + """ + return py.path.local(self._tmppath_factory.mktemp(basename, numbered).resolve()) + + def getbasetemp(self): + """backward compat wrapper for ``_tmppath_factory.getbasetemp``""" + return py.path.local(self._tmppath_factory.getbasetemp().resolve()) + + +def get_user(): + """Return the current user name, or None if getuser() does not work + in the current environment (see #1010). + """ + import getpass + + try: + return getpass.getuser() + except (ImportError, KeyError): + return None + + +def pytest_configure(config): + """Create a TempdirFactory and attach it to the config object. + + This is to comply with existing plugins which expect the handler to be + available at pytest_configure time, but ideally should be moved entirely + to the tmpdir_factory session fixture. + """ + mp = MonkeyPatch() + tmppath_handler = TempPathFactory.from_config(config) + t = TempdirFactory(tmppath_handler) + config._cleanup.append(mp.undo) + mp.setattr(config, "_tmp_path_factory", tmppath_handler, raising=False) + mp.setattr(config, "_tmpdirhandler", t, raising=False) + mp.setattr(pytest, "ensuretemp", t.ensuretemp, raising=False) + + +@pytest.fixture(scope="session") +def tmpdir_factory(request): + """Return a :class:`_pytest.tmpdir.TempdirFactory` instance for the test session. + """ + return request.config._tmpdirhandler + + +@pytest.fixture(scope="session") +def tmp_path_factory(request): + """Return a :class:`_pytest.tmpdir.TempPathFactory` instance for the test session. + """ + return request.config._tmp_path_factory + + +def _mk_tmp(request, factory): + name = request.node.name + name = re.sub(r"[\W]", "_", name) + MAXVAL = 30 + name = name[:MAXVAL] + return factory.mktemp(name, numbered=True) + + +@pytest.fixture +def tmpdir(request, tmpdir_factory): + """Return a temporary directory path object + which is unique to each test function invocation, + created as a sub directory of the base temporary + directory. The returned object is a `py.path.local`_ + path object. + + .. _`py.path.local`: https://py.readthedocs.io/en/latest/path.html + """ + return _mk_tmp(request, tmpdir_factory) + + +@pytest.fixture +def tmp_path(request, tmp_path_factory): + """Return a temporary directory path object + which is unique to each test function invocation, + created as a sub directory of the base temporary + directory. The returned object is a :class:`pathlib.Path` + object. + + .. note:: + + in python < 3.6 this is a pathlib2.Path + """ + + return _mk_tmp(request, tmp_path_factory) diff --git a/venv/Lib/site-packages/_pytest/unittest.py b/venv/Lib/site-packages/_pytest/unittest.py new file mode 100644 index 00000000..a2fd6ad5 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/unittest.py @@ -0,0 +1,253 @@ +""" discovery and running of std-library "unittest" style tests. """ +from __future__ import absolute_import, division, print_function + +import sys +import traceback + +# for transferring markers +import _pytest._code +from _pytest.config import hookimpl +from _pytest.outcomes import fail, skip, xfail +from _pytest.python import transfer_markers, Class, Module, Function +from _pytest.compat import getimfunc + + +def pytest_pycollect_makeitem(collector, name, obj): + # has unittest been imported and is obj a subclass of its TestCase? + try: + if not issubclass(obj, sys.modules["unittest"].TestCase): + return + except Exception: + return + # yes, so let's collect it + return UnitTestCase(name, parent=collector) + + +class UnitTestCase(Class): + # marker for fixturemanger.getfixtureinfo() + # to declare that our children do not support funcargs + nofuncargs = True + + def setup(self): + cls = self.obj + if getattr(cls, "__unittest_skip__", False): + return # skipped + setup = getattr(cls, "setUpClass", None) + if setup is not None: + setup() + teardown = getattr(cls, "tearDownClass", None) + if teardown is not None: + self.addfinalizer(teardown) + super(UnitTestCase, self).setup() + + def collect(self): + from unittest import TestLoader + + cls = self.obj + if not getattr(cls, "__test__", True): + return + self.session._fixturemanager.parsefactories(self, unittest=True) + loader = TestLoader() + module = self.getparent(Module).obj + foundsomething = False + for name in loader.getTestCaseNames(self.obj): + x = getattr(self.obj, name) + if not getattr(x, "__test__", True): + continue + funcobj = getimfunc(x) + transfer_markers(funcobj, cls, module) + yield TestCaseFunction(name, parent=self, callobj=funcobj) + foundsomething = True + + if not foundsomething: + runtest = getattr(self.obj, "runTest", None) + if runtest is not None: + ut = sys.modules.get("twisted.trial.unittest", None) + if ut is None or runtest != ut.TestCase.runTest: + yield TestCaseFunction("runTest", parent=self) + + +class TestCaseFunction(Function): + nofuncargs = True + _excinfo = None + _testcase = None + + def setup(self): + self._testcase = self.parent.obj(self.name) + self._fix_unittest_skip_decorator() + self._obj = getattr(self._testcase, self.name) + if hasattr(self._testcase, "setup_method"): + self._testcase.setup_method(self._obj) + if hasattr(self, "_request"): + self._request._fillfixtures() + + def _fix_unittest_skip_decorator(self): + """ + The @unittest.skip decorator calls functools.wraps(self._testcase) + The call to functools.wraps() fails unless self._testcase + has a __name__ attribute. This is usually automatically supplied + if the test is a function or method, but we need to add manually + here. + + See issue #1169 + """ + if sys.version_info[0] == 2: + setattr(self._testcase, "__name__", self.name) + + def teardown(self): + if hasattr(self._testcase, "teardown_method"): + self._testcase.teardown_method(self._obj) + # Allow garbage collection on TestCase instance attributes. + self._testcase = None + self._obj = None + + def startTest(self, testcase): + pass + + def _addexcinfo(self, rawexcinfo): + # unwrap potential exception info (see twisted trial support below) + rawexcinfo = getattr(rawexcinfo, "_rawexcinfo", rawexcinfo) + try: + excinfo = _pytest._code.ExceptionInfo(rawexcinfo) + except TypeError: + try: + try: + values = traceback.format_exception(*rawexcinfo) + values.insert( + 0, + "NOTE: Incompatible Exception Representation, " + "displaying natively:\n\n", + ) + fail("".join(values), pytrace=False) + except (fail.Exception, KeyboardInterrupt): + raise + except: # noqa + fail( + "ERROR: Unknown Incompatible Exception " + "representation:\n%r" % (rawexcinfo,), + pytrace=False, + ) + except KeyboardInterrupt: + raise + except fail.Exception: + excinfo = _pytest._code.ExceptionInfo() + self.__dict__.setdefault("_excinfo", []).append(excinfo) + + def addError(self, testcase, rawexcinfo): + self._addexcinfo(rawexcinfo) + + def addFailure(self, testcase, rawexcinfo): + self._addexcinfo(rawexcinfo) + + def addSkip(self, testcase, reason): + try: + skip(reason) + except skip.Exception: + self._skipped_by_mark = True + self._addexcinfo(sys.exc_info()) + + def addExpectedFailure(self, testcase, rawexcinfo, reason=""): + try: + xfail(str(reason)) + except xfail.Exception: + self._addexcinfo(sys.exc_info()) + + def addUnexpectedSuccess(self, testcase, reason=""): + self._unexpectedsuccess = reason + + def addSuccess(self, testcase): + pass + + def stopTest(self, testcase): + pass + + def _handle_skip(self): + # implements the skipping machinery (see #2137) + # analog to pythons Lib/unittest/case.py:run + testMethod = getattr(self._testcase, self._testcase._testMethodName) + if getattr(self._testcase.__class__, "__unittest_skip__", False) or getattr( + testMethod, "__unittest_skip__", False + ): + # If the class or method was skipped. + skip_why = getattr( + self._testcase.__class__, "__unittest_skip_why__", "" + ) or getattr(testMethod, "__unittest_skip_why__", "") + try: # PY3, unittest2 on PY2 + self._testcase._addSkip(self, self._testcase, skip_why) + except TypeError: # PY2 + if sys.version_info[0] != 2: + raise + self._testcase._addSkip(self, skip_why) + return True + return False + + def runtest(self): + if self.config.pluginmanager.get_plugin("pdbinvoke") is None: + self._testcase(result=self) + else: + # disables tearDown and cleanups for post mortem debugging (see #1890) + if self._handle_skip(): + return + self._testcase.debug() + + def _prunetraceback(self, excinfo): + Function._prunetraceback(self, excinfo) + traceback = excinfo.traceback.filter( + lambda x: not x.frame.f_globals.get("__unittest") + ) + if traceback: + excinfo.traceback = traceback + + +@hookimpl(tryfirst=True) +def pytest_runtest_makereport(item, call): + if isinstance(item, TestCaseFunction): + if item._excinfo: + call.excinfo = item._excinfo.pop(0) + try: + del call.result + except AttributeError: + pass + + +# twisted trial support + + +@hookimpl(hookwrapper=True) +def pytest_runtest_protocol(item): + if isinstance(item, TestCaseFunction) and "twisted.trial.unittest" in sys.modules: + ut = sys.modules["twisted.python.failure"] + Failure__init__ = ut.Failure.__init__ + check_testcase_implements_trial_reporter() + + def excstore( + self, exc_value=None, exc_type=None, exc_tb=None, captureVars=None + ): + if exc_value is None: + self._rawexcinfo = sys.exc_info() + else: + if exc_type is None: + exc_type = type(exc_value) + self._rawexcinfo = (exc_type, exc_value, exc_tb) + try: + Failure__init__( + self, exc_value, exc_type, exc_tb, captureVars=captureVars + ) + except TypeError: + Failure__init__(self, exc_value, exc_type, exc_tb) + + ut.Failure.__init__ = excstore + yield + ut.Failure.__init__ = Failure__init__ + else: + yield + + +def check_testcase_implements_trial_reporter(done=[]): + if done: + return + from zope.interface import classImplements + from twisted.trial.itrial import IReporter + + classImplements(TestCaseFunction, IReporter) + done.append(1) diff --git a/venv/Lib/site-packages/_pytest/warning_types.py b/venv/Lib/site-packages/_pytest/warning_types.py new file mode 100644 index 00000000..55e1f037 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/warning_types.py @@ -0,0 +1,60 @@ +import attr + + +class PytestWarning(UserWarning): + """ + Bases: :class:`UserWarning`. + + Base class for all warnings emitted by pytest. + """ + + +class PytestDeprecationWarning(PytestWarning, DeprecationWarning): + """ + Bases: :class:`pytest.PytestWarning`, :class:`DeprecationWarning`. + + Warning class for features that will be removed in a future version. + """ + + +class RemovedInPytest4Warning(PytestDeprecationWarning): + """ + Bases: :class:`pytest.PytestDeprecationWarning`. + + Warning class for features scheduled to be removed in pytest 4.0. + """ + + +class PytestExperimentalApiWarning(PytestWarning, FutureWarning): + """ + Bases: :class:`pytest.PytestWarning`, :class:`FutureWarning`. + + Warning category used to denote experiments in pytest. Use sparingly as the API might change or even be + removed completely in future version + """ + + @classmethod + def simple(cls, apiname): + return cls( + "{apiname} is an experimental api that may change over time".format( + apiname=apiname + ) + ) + + +@attr.s +class UnformattedWarning(object): + """Used to hold warnings that need to format their message at runtime, as opposed to a direct message. + + Using this class avoids to keep all the warning types and messages in this module, avoiding misuse. + """ + + category = attr.ib() + template = attr.ib() + + def format(self, **kwargs): + """Returns an instance of the warning category, formatted with given kwargs""" + return self.category(self.template.format(**kwargs)) + + +PYTESTER_COPY_EXAMPLE = PytestExperimentalApiWarning.simple("testdir.copy_example") diff --git a/venv/Lib/site-packages/_pytest/warnings.py b/venv/Lib/site-packages/_pytest/warnings.py new file mode 100644 index 00000000..5574eee8 --- /dev/null +++ b/venv/Lib/site-packages/_pytest/warnings.py @@ -0,0 +1,172 @@ +from __future__ import absolute_import, division, print_function + +import sys +import warnings +from contextlib import contextmanager + +import pytest + +from _pytest import compat + + +def _setoption(wmod, arg): + """ + Copy of the warning._setoption function but does not escape arguments. + """ + parts = arg.split(":") + if len(parts) > 5: + raise wmod._OptionError("too many fields (max 5): %r" % (arg,)) + while len(parts) < 5: + parts.append("") + action, message, category, module, lineno = [s.strip() for s in parts] + action = wmod._getaction(action) + category = wmod._getcategory(category) + if lineno: + try: + lineno = int(lineno) + if lineno < 0: + raise ValueError + except (ValueError, OverflowError): + raise wmod._OptionError("invalid lineno %r" % (lineno,)) + else: + lineno = 0 + wmod.filterwarnings(action, message, category, module, lineno) + + +def pytest_addoption(parser): + group = parser.getgroup("pytest-warnings") + group.addoption( + "-W", + "--pythonwarnings", + action="append", + help="set which warnings to report, see -W option of python itself.", + ) + parser.addini( + "filterwarnings", + type="linelist", + help="Each line specifies a pattern for " + "warnings.filterwarnings. " + "Processed after -W and --pythonwarnings.", + ) + + +def pytest_configure(config): + config.addinivalue_line( + "markers", + "filterwarnings(warning): add a warning filter to the given test. " + "see https://docs.pytest.org/en/latest/warnings.html#pytest-mark-filterwarnings ", + ) + + +@contextmanager +def catch_warnings_for_item(config, ihook, when, item): + """ + Context manager that catches warnings generated in the contained execution block. + + ``item`` can be None if we are not in the context of an item execution. + + Each warning captured triggers the ``pytest_warning_captured`` hook. + """ + cmdline_filters = config.getoption("pythonwarnings") or [] + inifilters = config.getini("filterwarnings") + with warnings.catch_warnings(record=True) as log: + + if not sys.warnoptions: + # if user is not explicitly configuring warning filters, show deprecation warnings by default (#2908) + warnings.filterwarnings("always", category=DeprecationWarning) + warnings.filterwarnings("always", category=PendingDeprecationWarning) + + # filters should have this precedence: mark, cmdline options, ini + # filters should be applied in the inverse order of precedence + for arg in inifilters: + _setoption(warnings, arg) + + for arg in cmdline_filters: + warnings._setoption(arg) + + if item is not None: + for mark in item.iter_markers(name="filterwarnings"): + for arg in mark.args: + _setoption(warnings, arg) + + yield + + for warning_message in log: + ihook.pytest_warning_captured.call_historic( + kwargs=dict(warning_message=warning_message, when=when, item=item) + ) + + +def warning_record_to_str(warning_message): + """Convert a warnings.WarningMessage to a string, taking in account a lot of unicode shenaningans in Python 2. + + When Python 2 support is dropped this function can be greatly simplified. + """ + warn_msg = warning_message.message + unicode_warning = False + if compat._PY2 and any(isinstance(m, compat.UNICODE_TYPES) for m in warn_msg.args): + new_args = [] + for m in warn_msg.args: + new_args.append( + compat.ascii_escaped(m) if isinstance(m, compat.UNICODE_TYPES) else m + ) + unicode_warning = list(warn_msg.args) != new_args + warn_msg.args = new_args + + msg = warnings.formatwarning( + warn_msg, + warning_message.category, + warning_message.filename, + warning_message.lineno, + warning_message.line, + ) + if unicode_warning: + warnings.warn( + "Warning is using unicode non convertible to ascii, " + "converting to a safe representation:\n %s" % msg, + UnicodeWarning, + ) + return msg + + +@pytest.hookimpl(hookwrapper=True, tryfirst=True) +def pytest_runtest_protocol(item): + with catch_warnings_for_item( + config=item.config, ihook=item.ihook, when="runtest", item=item + ): + yield + + +@pytest.hookimpl(hookwrapper=True, tryfirst=True) +def pytest_collection(session): + config = session.config + with catch_warnings_for_item( + config=config, ihook=config.hook, when="collect", item=None + ): + yield + + +@pytest.hookimpl(hookwrapper=True) +def pytest_terminal_summary(terminalreporter): + config = terminalreporter.config + with catch_warnings_for_item( + config=config, ihook=config.hook, when="config", item=None + ): + yield + + +def _issue_config_warning(warning, config): + """ + This function should be used instead of calling ``warnings.warn`` directly when we are in the "configure" stage: + at this point the actual options might not have been set, so we manually trigger the pytest_warning_captured + hook so we can display this warnings in the terminal. This is a hack until we can sort out #2891. + + :param warning: the warning instance. + :param config: + """ + with warnings.catch_warnings(record=True) as records: + warnings.simplefilter("always", type(warning)) + warnings.warn(warning, stacklevel=2) + config.hook.pytest_warning_captured.call_historic( + kwargs=dict(warning_message=records[0], when="config", item=None) + ) diff --git a/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/DESCRIPTION.rst b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/DESCRIPTION.rst new file mode 100644 index 00000000..4f1a2384 --- /dev/null +++ b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/DESCRIPTION.rst @@ -0,0 +1,384 @@ +=========== + aniso8601 +=========== + +---------------------------------- +Another ISO 8601 parser for Python +---------------------------------- + +Features +======== +* Pure Python implementation +* Python 3 support +* Logical behavior + + - Parse a time, get a `datetime.time `_ + - Parse a date, get a `datetime.date `_ + - Parse a datetime, get a `datetime.datetime `_ + - Parse a duration, get a `datetime.timedelta `_ + - Parse an interval, get a tuple of dates or datetimes + - Parse a repeating interval, get a date or datetime `generator `_ + +* UTC offset represented as fixed-offset tzinfo +* Optional `dateutil.relativedelta `_ support for calendar accuracy +* No regular expressions + +Installation +============ + +The recommended installation method is to use pip:: + + $ pip install aniso8601 + +Alternatively, you can download the source (git repository hosted at `Bitbucket `_) and install directly:: + + $ python setup.py install + +Use +=== + +Parsing datetimes +----------------- + +To parse a typical ISO 8601 datetime string:: + + >>> import aniso8601 + >>> aniso8601.parse_datetime('1977-06-10T12:00:00Z') + datetime.datetime(1977, 6, 10, 12, 0, tzinfo=+0:00:00 UTC) + +Alternative delimiters can be specified, for example, a space:: + + >>> aniso8601.parse_datetime('1977-06-10 12:00:00Z', delimiter=' ') + datetime.datetime(1977, 6, 10, 12, 0, tzinfo=+0:00:00 UTC) + +UTC offsets are supported:: + + >>> aniso8601.parse_datetime('1979-06-05T08:00:00-08:00') + datetime.datetime(1979, 6, 5, 8, 0, tzinfo=-8:00:00 UTC) + +If a UTC offset is not specified, the returned datetime will be naive:: + + >>> aniso8601.parse_datetime('1983-01-22T08:00:00') + datetime.datetime(1983, 1, 22, 8, 0) + +Leap seconds are currently not supported and attempting to parse one raises a :code:`LeapSecondError`:: + + >>> aniso8601.parse_datetime('2018-03-06T23:59:60') + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/time.py", line 127, in parse_datetime + timepart = parse_time(isotimestr) + File "aniso8601/time.py", line 110, in parse_time + return _parse_time_naive(timestr) + File "aniso8601/time.py", line 140, in _parse_time_naive + return _RESOLUTION_MAP[get_time_resolution(timestr)](timestr) + File "aniso8601/time.py", line 214, in _parse_second_time + raise LeapSecondError('Leap seconds are not supported.') + aniso8601.exceptions.LeapSecondError: Leap seconds are not supported. + +Parsing dates +------------- + +To parse a date represented in an ISO 8601 string:: + + >>> import aniso8601 + >>> aniso8601.parse_date('1984-04-23') + datetime.date(1984, 4, 23) + +Basic format is supported as well:: + + >>> aniso8601.parse_date('19840423') + datetime.date(1984, 4, 23) + +To parse a date using the ISO 8601 week date format:: + + >>> aniso8601.parse_date('1986-W38-1') + datetime.date(1986, 9, 15) + +To parse an ISO 8601 ordinal date:: + + >>> aniso8601.parse_date('1988-132') + datetime.date(1988, 5, 11) + +Parsing times +------------- + +To parse a time formatted as an ISO 8601 string:: + + >>> import aniso8601 + >>> aniso8601.parse_time('11:31:14') + datetime.time(11, 31, 14) + +As with all of the above, basic format is supported:: + + >>> aniso8601.parse_time('113114') + datetime.time(11, 31, 14) + +A UTC offset can be specified for times:: + + >>> aniso8601.parse_time('17:18:19-02:30') + datetime.time(17, 18, 19, tzinfo=-2:30:00 UTC) + >>> aniso8601.parse_time('171819Z') + datetime.time(17, 18, 19, tzinfo=+0:00:00 UTC) + +Reduced accuracy is supported:: + + >>> aniso8601.parse_time('21:42') + datetime.time(21, 42) + >>> aniso8601.parse_time('22') + datetime.time(22, 0) + +A decimal fraction is always allowed on the lowest order element of an ISO 8601 formatted time:: + + >>> aniso8601.parse_time('22:33.5') + datetime.time(22, 33, 30) + >>> aniso8601.parse_time('23.75') + datetime.time(23, 45) + +Leap seconds are currently not supported and attempting to parse one raises a :code:`LeapSecondError`:: + + >>> aniso8601.parse_time('23:59:60') + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/time.py", line 110, in parse_time + return _parse_time_naive(timestr) + File "aniso8601/time.py", line 140, in _parse_time_naive + return _RESOLUTION_MAP[get_time_resolution(timestr)](timestr) + File "aniso8601/time.py", line 214, in _parse_second_time + raise LeapSecondError('Leap seconds are not supported.') + aniso8601.exceptions.LeapSecondError: Leap seconds are not supported. + +Parsing durations +----------------- + +To parse a duration formatted as an ISO 8601 string:: + + >>> import aniso8601 + >>> aniso8601.parse_duration('P1Y2M3DT4H54M6S') + datetime.timedelta(428, 17646) + +Reduced accuracy is supported:: + + >>> aniso8601.parse_duration('P1Y') + datetime.timedelta(365) + +A decimal fraction is allowed on the lowest order element:: + + >>> aniso8601.parse_duration('P1YT3.5M') + datetime.timedelta(365, 210) + +The decimal fraction can be specified with a comma instead of a full-stop:: + + >>> aniso8601.parse_duration('P1YT3,5M') + datetime.timedelta(365, 210) + +Parsing a duration from a combined date and time is supported as well:: + + >>> aniso8601.parse_duration('P0001-01-02T01:30:5') + datetime.timedelta(397, 5405) + +The above treat years as 365 days and months as 30 days. If calendar level accuracy is required, the relative keyword argument can be used if `python-dateutil `_ is installed:: + + >>> import aniso8601 + >>> from datetime import date + >>> one_month = aniso8601.parse_duration('P1M', relative=True) + >>> print one_month + relativedelta(months=+1) + >>> date(2003,1,27) + one_month + datetime.date(2003, 2, 27) + >>> date(2003,1,31) + one_month + datetime.date(2003, 2, 28) + >>> date(2003,1,31) + two_months + datetime.date(2003, 3, 31) + +Since a relative fractional month or year is not logical, a :code:`RelativeValueError` is raised when attempting to parse a duration with :code:`relative=True` and fractional month or year:: + + >>> aniso8601.parse_duration('P2.1Y', relative=True) + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/duration.py", line 29, in parse_duration + return _parse_duration_prescribed(isodurationstr, relative) + File "aniso8601/duration.py", line 73, in _parse_duration_prescribed + raise RelativeValueError('Fractional months and years are not defined for relative intervals.') + aniso8601.exceptions.RelativeValueError: Fractional months and years are not defined for relative intervals. + +If :code:`relative=True` is set without python-dateutil available, a :code:`RuntimeError` is raised:: + + >>> aniso8601.parse_duration('P1M', relative=True) + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/duration.py", line 29, in parse_duration + return _parse_duration_prescribed(isodurationstr, relative) + File "aniso8601/duration.py", line 77, in _parse_duration_prescribed + raise RuntimeError('dateutil must be installed for relative duration support.') + RuntimeError: dateutil must be installed for relative duration support + +Parsing intervals +----------------- + +To parse an interval specified by a start and end:: + + >>> import aniso8601 + >>> aniso8601.parse_interval('2007-03-01T13:00:00/2008-05-11T15:30:00') + (datetime.datetime(2007, 3, 1, 13, 0), datetime.datetime(2008, 5, 11, 15, 30)) + +Intervals specified by a start time and a duration are supported:: + + >>> aniso8601.parse_interval('2007-03-01T13:00:00Z/P1Y2M10DT2H30M') + (datetime.datetime(2007, 3, 1, 13, 0, tzinfo=+0:00:00 UTC), datetime.datetime(2008, 5, 9, 15, 30, tzinfo=+0:00:00 UTC)) + +A duration can also be specified by a duration and end time:: + + >>> aniso8601.parse_interval('P1M/1981-04-05') + (datetime.date(1981, 4, 5), datetime.date(1981, 3, 6)) + +Notice that the result of the above parse is not in order from earliest to latest. If sorted intervals are required, simply use the :code:`sorted` keyword as shown below:: + + >>> sorted(aniso8601.parse_interval('P1M/1981-04-05')) + [datetime.date(1981, 3, 6), datetime.date(1981, 4, 5)] + +The end of an interval is given as a datetime when required to maintain the resolution specified by a duration, even if the duration start is given as a date:: + + >>> aniso8601.parse_interval('2014-11-12/PT4H54M6.5S') + (datetime.date(2014, 11, 12), datetime.datetime(2014, 11, 12, 4, 54, 6, 500000)) + +Repeating intervals are supported as well, and return a generator:: + + >>> aniso8601.parse_repeating_interval('R3/1981-04-05/P1D') + + >>> list(aniso8601.parse_repeating_interval('R3/1981-04-05/P1D')) + [datetime.date(1981, 4, 5), datetime.date(1981, 4, 6), datetime.date(1981, 4, 7)] + +Repeating intervals are allowed to go in the reverse direction:: + + >>> list(aniso8601.parse_repeating_interval('R2/PT1H2M/1980-03-05T01:01:00')) + [datetime.datetime(1980, 3, 5, 1, 1), datetime.datetime(1980, 3, 4, 23, 59)] + +Unbounded intervals are also allowed (Python 2):: + + >>> result = aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00') + >>> result.next() + datetime.datetime(1980, 3, 5, 1, 1) + >>> result.next() + datetime.datetime(1980, 3, 4, 23, 59) + +or for Python 3:: + + >>> result = aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00') + >>> next(result) + datetime.datetime(1980, 3, 5, 1, 1) + >>> next(result) + datetime.datetime(1980, 3, 4, 23, 59) + +Note that you should never try to convert a generator produced by an unbounded interval to a list:: + + >>> list(aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00')) + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/interval.py", line 161, in _date_generator_unbounded + currentdate += timedelta + OverflowError: date value out of range + +The above treat years as 365 days and months as 30 days. If calendar level accuracy is required, the relative keyword argument can be used if `python-dateutil `_ is installed:: + + >>> aniso8601.parse_interval('2003-01-27/P1M', relative=True) + (datetime.date(2003, 1, 27), datetime.date(2003, 2, 27)) + >>> aniso8601.parse_interval('2003-01-31/P1M', relative=True) + (datetime.date(2003, 1, 31), datetime.date(2003, 2, 28)) + >>> aniso8601.parse_interval('P1Y/2001-02-28', relative=True) + (datetime.date(2001, 2, 28), datetime.date(2000, 2, 28) + +Fractional years and months do not make sense for relative intervals. A :code:`RelativeValueError` is raised when attempting to parse an interval with :code:`relative=True` and a fractional month or year:: + + >>> aniso8601.parse_interval('P1.1Y/2001-02-28', relative=True) + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/interval.py", line 37, in parse_interval + interval_parts = _parse_interval_parts(isointervalstr, intervaldelimiter, datetimedelimiter, relative) + File "aniso8601/interval.py", line 89, in _parse_interval_parts + duration = parse_duration(firstpart, relative=relative) + File "aniso8601/duration.py", line 29, in parse_duration + return _parse_duration_prescribed(isodurationstr, relative) + File "aniso8601/duration.py", line 73, in _parse_duration_prescribed + raise RelativeValueError('Fractional months and years are not defined for relative intervals.') + aniso8601.exceptions.RelativeValueError: Fractional months and years are not defined for relative intervals. + +If :code:`relative=True` is set without python-dateutil available, a :code:`RuntimeError` is raised:: + + >>> aniso8601.parse_interval('2003-01-27/P1M', relative=True) + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/interval.py", line 37, in parse_interval + interval_parts = _parse_interval_parts(isointervalstr, intervaldelimiter, datetimedelimiter, relative) + File "aniso8601/interval.py", line 108, in _parse_interval_parts + duration = parse_duration(secondpart, relative=relative) + File "aniso8601/duration.py", line 29, in parse_duration + return _parse_duration_prescribed(isodurationstr, relative) + File "aniso8601/duration.py", line 77, in _parse_duration_prescribed + raise RuntimeError('dateutil must be installed for relative duration support.') + RuntimeError: dateutil must be installed for relative duration support. + +Date and time resolution +------------------------ + +In some situations, it may be useful to figure out the resolution provided by an ISO 8601 date or time string. Two functions are provided for this purpose. + +To get the resolution of a ISO 8601 time string:: + + >>> aniso8601.get_time_resolution('11:31:14') == aniso8601.resolution.TimeResolution.Seconds + True + >>> aniso8601.get_time_resolution('11:31') == aniso8601.resolution.TimeResolution.Minutes + True + >>> aniso8601.get_time_resolution('11') == aniso8601.resolution.TimeResolution.Hours + True + +Similarly, for an ISO 8601 date string:: + + >>> aniso8601.get_date_resolution('1981-04-05') == aniso8601.resolution.DateResolution.Day + True + >>> aniso8601.get_date_resolution('1981-04') == aniso8601.resolution.DateResolution.Month + True + >>> aniso8601.get_date_resolution('1981') == aniso8601.resolution.DateResolution.Year + True + +Development +=========== + +Setup +----- + +It is recommended to develop using a `virtualenv `_. + +The tests require the :code:`relative` feature to be enabled, install the necessary dependencies using pip:: + + $ pip install .[relative] + +Tests +----- + +To run the unit tests, navigate to the source directory and run the tests for the python version being worked on (python2, python3):: + + $ python2 -m unittest discover aniso8601/tests/ + +or:: + + $ python3 -m unittest discover aniso8601/tests/ + +Contributing +============ + +aniso8601 is an open source project hosted on `Bitbucket `_. + +Any and all bugs are welcome on our `issue tracker `_. +Of particular interest are valid ISO 8601 strings that don't parse, or invalid ones that do. At a minimum, +bug reports should include an example of the misbehaving string, as well as the expected result. Of course +patches containing unit tests (or fixed bugs) are welcome! + +References +========== + +* `ISO 8601:2004(E) `_ (Caution, PDF link) +* `Wikipedia article on ISO 8601 `_ +* `Discussion on alternative ISO 8601 parsers for Python `_ + + diff --git a/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/INSTALLER b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/METADATA b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/METADATA new file mode 100644 index 00000000..f2434368 --- /dev/null +++ b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/METADATA @@ -0,0 +1,413 @@ +Metadata-Version: 2.0 +Name: aniso8601 +Version: 3.0.2 +Summary: A library for parsing ISO 8601 strings. +Home-page: https://bitbucket.org/nielsenb/aniso8601 +Author: Brandon Nielsen +Author-email: nielsenb@jetfuse.net +License: UNKNOWN +Project-URL: Source, https://bitbucket.org/nielsenb/aniso8601 +Project-URL: Documentation, http://aniso8601.readthedocs.io/en/latest/ +Project-URL: Tracker, https://bitbucket.org/nielsenb/aniso8601/issues +Keywords: iso8601 parser +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD 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.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Provides-Extra: relative +Provides-Extra: relative +Requires-Dist: python-dateutil; extra == 'relative' + +=========== + aniso8601 +=========== + +---------------------------------- +Another ISO 8601 parser for Python +---------------------------------- + +Features +======== +* Pure Python implementation +* Python 3 support +* Logical behavior + + - Parse a time, get a `datetime.time `_ + - Parse a date, get a `datetime.date `_ + - Parse a datetime, get a `datetime.datetime `_ + - Parse a duration, get a `datetime.timedelta `_ + - Parse an interval, get a tuple of dates or datetimes + - Parse a repeating interval, get a date or datetime `generator `_ + +* UTC offset represented as fixed-offset tzinfo +* Optional `dateutil.relativedelta `_ support for calendar accuracy +* No regular expressions + +Installation +============ + +The recommended installation method is to use pip:: + + $ pip install aniso8601 + +Alternatively, you can download the source (git repository hosted at `Bitbucket `_) and install directly:: + + $ python setup.py install + +Use +=== + +Parsing datetimes +----------------- + +To parse a typical ISO 8601 datetime string:: + + >>> import aniso8601 + >>> aniso8601.parse_datetime('1977-06-10T12:00:00Z') + datetime.datetime(1977, 6, 10, 12, 0, tzinfo=+0:00:00 UTC) + +Alternative delimiters can be specified, for example, a space:: + + >>> aniso8601.parse_datetime('1977-06-10 12:00:00Z', delimiter=' ') + datetime.datetime(1977, 6, 10, 12, 0, tzinfo=+0:00:00 UTC) + +UTC offsets are supported:: + + >>> aniso8601.parse_datetime('1979-06-05T08:00:00-08:00') + datetime.datetime(1979, 6, 5, 8, 0, tzinfo=-8:00:00 UTC) + +If a UTC offset is not specified, the returned datetime will be naive:: + + >>> aniso8601.parse_datetime('1983-01-22T08:00:00') + datetime.datetime(1983, 1, 22, 8, 0) + +Leap seconds are currently not supported and attempting to parse one raises a :code:`LeapSecondError`:: + + >>> aniso8601.parse_datetime('2018-03-06T23:59:60') + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/time.py", line 127, in parse_datetime + timepart = parse_time(isotimestr) + File "aniso8601/time.py", line 110, in parse_time + return _parse_time_naive(timestr) + File "aniso8601/time.py", line 140, in _parse_time_naive + return _RESOLUTION_MAP[get_time_resolution(timestr)](timestr) + File "aniso8601/time.py", line 214, in _parse_second_time + raise LeapSecondError('Leap seconds are not supported.') + aniso8601.exceptions.LeapSecondError: Leap seconds are not supported. + +Parsing dates +------------- + +To parse a date represented in an ISO 8601 string:: + + >>> import aniso8601 + >>> aniso8601.parse_date('1984-04-23') + datetime.date(1984, 4, 23) + +Basic format is supported as well:: + + >>> aniso8601.parse_date('19840423') + datetime.date(1984, 4, 23) + +To parse a date using the ISO 8601 week date format:: + + >>> aniso8601.parse_date('1986-W38-1') + datetime.date(1986, 9, 15) + +To parse an ISO 8601 ordinal date:: + + >>> aniso8601.parse_date('1988-132') + datetime.date(1988, 5, 11) + +Parsing times +------------- + +To parse a time formatted as an ISO 8601 string:: + + >>> import aniso8601 + >>> aniso8601.parse_time('11:31:14') + datetime.time(11, 31, 14) + +As with all of the above, basic format is supported:: + + >>> aniso8601.parse_time('113114') + datetime.time(11, 31, 14) + +A UTC offset can be specified for times:: + + >>> aniso8601.parse_time('17:18:19-02:30') + datetime.time(17, 18, 19, tzinfo=-2:30:00 UTC) + >>> aniso8601.parse_time('171819Z') + datetime.time(17, 18, 19, tzinfo=+0:00:00 UTC) + +Reduced accuracy is supported:: + + >>> aniso8601.parse_time('21:42') + datetime.time(21, 42) + >>> aniso8601.parse_time('22') + datetime.time(22, 0) + +A decimal fraction is always allowed on the lowest order element of an ISO 8601 formatted time:: + + >>> aniso8601.parse_time('22:33.5') + datetime.time(22, 33, 30) + >>> aniso8601.parse_time('23.75') + datetime.time(23, 45) + +Leap seconds are currently not supported and attempting to parse one raises a :code:`LeapSecondError`:: + + >>> aniso8601.parse_time('23:59:60') + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/time.py", line 110, in parse_time + return _parse_time_naive(timestr) + File "aniso8601/time.py", line 140, in _parse_time_naive + return _RESOLUTION_MAP[get_time_resolution(timestr)](timestr) + File "aniso8601/time.py", line 214, in _parse_second_time + raise LeapSecondError('Leap seconds are not supported.') + aniso8601.exceptions.LeapSecondError: Leap seconds are not supported. + +Parsing durations +----------------- + +To parse a duration formatted as an ISO 8601 string:: + + >>> import aniso8601 + >>> aniso8601.parse_duration('P1Y2M3DT4H54M6S') + datetime.timedelta(428, 17646) + +Reduced accuracy is supported:: + + >>> aniso8601.parse_duration('P1Y') + datetime.timedelta(365) + +A decimal fraction is allowed on the lowest order element:: + + >>> aniso8601.parse_duration('P1YT3.5M') + datetime.timedelta(365, 210) + +The decimal fraction can be specified with a comma instead of a full-stop:: + + >>> aniso8601.parse_duration('P1YT3,5M') + datetime.timedelta(365, 210) + +Parsing a duration from a combined date and time is supported as well:: + + >>> aniso8601.parse_duration('P0001-01-02T01:30:5') + datetime.timedelta(397, 5405) + +The above treat years as 365 days and months as 30 days. If calendar level accuracy is required, the relative keyword argument can be used if `python-dateutil `_ is installed:: + + >>> import aniso8601 + >>> from datetime import date + >>> one_month = aniso8601.parse_duration('P1M', relative=True) + >>> print one_month + relativedelta(months=+1) + >>> date(2003,1,27) + one_month + datetime.date(2003, 2, 27) + >>> date(2003,1,31) + one_month + datetime.date(2003, 2, 28) + >>> date(2003,1,31) + two_months + datetime.date(2003, 3, 31) + +Since a relative fractional month or year is not logical, a :code:`RelativeValueError` is raised when attempting to parse a duration with :code:`relative=True` and fractional month or year:: + + >>> aniso8601.parse_duration('P2.1Y', relative=True) + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/duration.py", line 29, in parse_duration + return _parse_duration_prescribed(isodurationstr, relative) + File "aniso8601/duration.py", line 73, in _parse_duration_prescribed + raise RelativeValueError('Fractional months and years are not defined for relative intervals.') + aniso8601.exceptions.RelativeValueError: Fractional months and years are not defined for relative intervals. + +If :code:`relative=True` is set without python-dateutil available, a :code:`RuntimeError` is raised:: + + >>> aniso8601.parse_duration('P1M', relative=True) + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/duration.py", line 29, in parse_duration + return _parse_duration_prescribed(isodurationstr, relative) + File "aniso8601/duration.py", line 77, in _parse_duration_prescribed + raise RuntimeError('dateutil must be installed for relative duration support.') + RuntimeError: dateutil must be installed for relative duration support + +Parsing intervals +----------------- + +To parse an interval specified by a start and end:: + + >>> import aniso8601 + >>> aniso8601.parse_interval('2007-03-01T13:00:00/2008-05-11T15:30:00') + (datetime.datetime(2007, 3, 1, 13, 0), datetime.datetime(2008, 5, 11, 15, 30)) + +Intervals specified by a start time and a duration are supported:: + + >>> aniso8601.parse_interval('2007-03-01T13:00:00Z/P1Y2M10DT2H30M') + (datetime.datetime(2007, 3, 1, 13, 0, tzinfo=+0:00:00 UTC), datetime.datetime(2008, 5, 9, 15, 30, tzinfo=+0:00:00 UTC)) + +A duration can also be specified by a duration and end time:: + + >>> aniso8601.parse_interval('P1M/1981-04-05') + (datetime.date(1981, 4, 5), datetime.date(1981, 3, 6)) + +Notice that the result of the above parse is not in order from earliest to latest. If sorted intervals are required, simply use the :code:`sorted` keyword as shown below:: + + >>> sorted(aniso8601.parse_interval('P1M/1981-04-05')) + [datetime.date(1981, 3, 6), datetime.date(1981, 4, 5)] + +The end of an interval is given as a datetime when required to maintain the resolution specified by a duration, even if the duration start is given as a date:: + + >>> aniso8601.parse_interval('2014-11-12/PT4H54M6.5S') + (datetime.date(2014, 11, 12), datetime.datetime(2014, 11, 12, 4, 54, 6, 500000)) + +Repeating intervals are supported as well, and return a generator:: + + >>> aniso8601.parse_repeating_interval('R3/1981-04-05/P1D') + + >>> list(aniso8601.parse_repeating_interval('R3/1981-04-05/P1D')) + [datetime.date(1981, 4, 5), datetime.date(1981, 4, 6), datetime.date(1981, 4, 7)] + +Repeating intervals are allowed to go in the reverse direction:: + + >>> list(aniso8601.parse_repeating_interval('R2/PT1H2M/1980-03-05T01:01:00')) + [datetime.datetime(1980, 3, 5, 1, 1), datetime.datetime(1980, 3, 4, 23, 59)] + +Unbounded intervals are also allowed (Python 2):: + + >>> result = aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00') + >>> result.next() + datetime.datetime(1980, 3, 5, 1, 1) + >>> result.next() + datetime.datetime(1980, 3, 4, 23, 59) + +or for Python 3:: + + >>> result = aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00') + >>> next(result) + datetime.datetime(1980, 3, 5, 1, 1) + >>> next(result) + datetime.datetime(1980, 3, 4, 23, 59) + +Note that you should never try to convert a generator produced by an unbounded interval to a list:: + + >>> list(aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00')) + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/interval.py", line 161, in _date_generator_unbounded + currentdate += timedelta + OverflowError: date value out of range + +The above treat years as 365 days and months as 30 days. If calendar level accuracy is required, the relative keyword argument can be used if `python-dateutil `_ is installed:: + + >>> aniso8601.parse_interval('2003-01-27/P1M', relative=True) + (datetime.date(2003, 1, 27), datetime.date(2003, 2, 27)) + >>> aniso8601.parse_interval('2003-01-31/P1M', relative=True) + (datetime.date(2003, 1, 31), datetime.date(2003, 2, 28)) + >>> aniso8601.parse_interval('P1Y/2001-02-28', relative=True) + (datetime.date(2001, 2, 28), datetime.date(2000, 2, 28) + +Fractional years and months do not make sense for relative intervals. A :code:`RelativeValueError` is raised when attempting to parse an interval with :code:`relative=True` and a fractional month or year:: + + >>> aniso8601.parse_interval('P1.1Y/2001-02-28', relative=True) + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/interval.py", line 37, in parse_interval + interval_parts = _parse_interval_parts(isointervalstr, intervaldelimiter, datetimedelimiter, relative) + File "aniso8601/interval.py", line 89, in _parse_interval_parts + duration = parse_duration(firstpart, relative=relative) + File "aniso8601/duration.py", line 29, in parse_duration + return _parse_duration_prescribed(isodurationstr, relative) + File "aniso8601/duration.py", line 73, in _parse_duration_prescribed + raise RelativeValueError('Fractional months and years are not defined for relative intervals.') + aniso8601.exceptions.RelativeValueError: Fractional months and years are not defined for relative intervals. + +If :code:`relative=True` is set without python-dateutil available, a :code:`RuntimeError` is raised:: + + >>> aniso8601.parse_interval('2003-01-27/P1M', relative=True) + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/interval.py", line 37, in parse_interval + interval_parts = _parse_interval_parts(isointervalstr, intervaldelimiter, datetimedelimiter, relative) + File "aniso8601/interval.py", line 108, in _parse_interval_parts + duration = parse_duration(secondpart, relative=relative) + File "aniso8601/duration.py", line 29, in parse_duration + return _parse_duration_prescribed(isodurationstr, relative) + File "aniso8601/duration.py", line 77, in _parse_duration_prescribed + raise RuntimeError('dateutil must be installed for relative duration support.') + RuntimeError: dateutil must be installed for relative duration support. + +Date and time resolution +------------------------ + +In some situations, it may be useful to figure out the resolution provided by an ISO 8601 date or time string. Two functions are provided for this purpose. + +To get the resolution of a ISO 8601 time string:: + + >>> aniso8601.get_time_resolution('11:31:14') == aniso8601.resolution.TimeResolution.Seconds + True + >>> aniso8601.get_time_resolution('11:31') == aniso8601.resolution.TimeResolution.Minutes + True + >>> aniso8601.get_time_resolution('11') == aniso8601.resolution.TimeResolution.Hours + True + +Similarly, for an ISO 8601 date string:: + + >>> aniso8601.get_date_resolution('1981-04-05') == aniso8601.resolution.DateResolution.Day + True + >>> aniso8601.get_date_resolution('1981-04') == aniso8601.resolution.DateResolution.Month + True + >>> aniso8601.get_date_resolution('1981') == aniso8601.resolution.DateResolution.Year + True + +Development +=========== + +Setup +----- + +It is recommended to develop using a `virtualenv `_. + +The tests require the :code:`relative` feature to be enabled, install the necessary dependencies using pip:: + + $ pip install .[relative] + +Tests +----- + +To run the unit tests, navigate to the source directory and run the tests for the python version being worked on (python2, python3):: + + $ python2 -m unittest discover aniso8601/tests/ + +or:: + + $ python3 -m unittest discover aniso8601/tests/ + +Contributing +============ + +aniso8601 is an open source project hosted on `Bitbucket `_. + +Any and all bugs are welcome on our `issue tracker `_. +Of particular interest are valid ISO 8601 strings that don't parse, or invalid ones that do. At a minimum, +bug reports should include an example of the misbehaving string, as well as the expected result. Of course +patches containing unit tests (or fixed bugs) are welcome! + +References +========== + +* `ISO 8601:2004(E) `_ (Caution, PDF link) +* `Wikipedia article on ISO 8601 `_ +* `Discussion on alternative ISO 8601 parsers for Python `_ + + diff --git a/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/RECORD b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/RECORD new file mode 100644 index 00000000..2045edf5 --- /dev/null +++ b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/RECORD @@ -0,0 +1,25 @@ +aniso8601-3.0.2.dist-info/DESCRIPTION.rst,sha256=IRO_7zo9wM-GXLQbkggGyZoIVr3ddwLG627qf5-Wl90,15070 +aniso8601-3.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +aniso8601-3.0.2.dist-info/METADATA,sha256=DaU0fNs-ghRC1q6nKwF1cXiQieIyHNh-oZhNv0vRGrc,16259 +aniso8601-3.0.2.dist-info/RECORD,, +aniso8601-3.0.2.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 +aniso8601-3.0.2.dist-info/metadata.json,sha256=loCVI9Gvc7WILza0eIH-iQITWlL8rDxjWSM2Z9K6ZLU,1135 +aniso8601-3.0.2.dist-info/top_level.txt,sha256=MVQomyeED8nGIH7PUQdMzxgLppIB48oYHtcmL17ETB0,10 +aniso8601/__init__.py,sha256=r15awjHgn8H6loHfYB4mJgGeiSTiJpIvIpVK4gXCzzk,527 +aniso8601/__pycache__/__init__.cpython-37.pyc,, +aniso8601/__pycache__/compat.cpython-37.pyc,, +aniso8601/__pycache__/date.cpython-37.pyc,, +aniso8601/__pycache__/duration.cpython-37.pyc,, +aniso8601/__pycache__/exceptions.cpython-37.pyc,, +aniso8601/__pycache__/interval.cpython-37.pyc,, +aniso8601/__pycache__/resolution.cpython-37.pyc,, +aniso8601/__pycache__/time.cpython-37.pyc,, +aniso8601/__pycache__/timezone.cpython-37.pyc,, +aniso8601/compat.py,sha256=TEGb7_3qpbKtAfu7FfSkf0tcc9lquiDZ-Yt4uQCw45o,305 +aniso8601/date.py,sha256=fmY0t6ESI6dooFOI2g57RFgIPrmxnyEI8DznuW7QrmE,8405 +aniso8601/duration.py,sha256=qwrK0nS-Zo9hVGZzmhL0aQXOuTv_mBNmO74u8PbC5RE,10726 +aniso8601/exceptions.py,sha256=N94MSQSnyctkjFXRlg4T91qQpYYSSrXuGCc1V1-knUI,1210 +aniso8601/interval.py,sha256=VPgu4po6j88CtRy-0RNPBX_BffyiN-mAFvpdyesCtT4,6447 +aniso8601/resolution.py,sha256=JklhrwxP807fpZZhLvQrDy40lzIz5OctsMK7m1yNSk8,422 +aniso8601/time.py,sha256=MG61Oc4cyCBYklNPIkO14PCod4F8FyMe9N0X8rme2Rs,8128 +aniso8601/timezone.py,sha256=9A-ah5xFapOkxOJFEPvmF-_WYnn2zfS5ZrHqQdC5K9M,3376 diff --git a/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/WHEEL b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/WHEEL new file mode 100644 index 00000000..7bf9daa1 --- /dev/null +++ b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0.a0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/metadata.json b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/metadata.json new file mode 100644 index 00000000..902a9632 --- /dev/null +++ b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules"], "extensions": {"python.details": {"contacts": [{"email": "nielsenb@jetfuse.net", "name": "Brandon Nielsen", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://bitbucket.org/nielsenb/aniso8601"}}}, "extras": ["relative"], "generator": "bdist_wheel (0.30.0.a0)", "keywords": ["iso8601", "parser"], "metadata_version": "2.0", "name": "aniso8601", "project_url": "Source, https://bitbucket.org/nielsenb/aniso8601", "run_requires": [{"extra": "relative", "requires": ["python-dateutil"]}], "summary": "A library for parsing ISO 8601 strings.", "version": "3.0.2"} \ No newline at end of file diff --git a/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/top_level.txt b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/top_level.txt new file mode 100644 index 00000000..166ae78c --- /dev/null +++ b/venv/Lib/site-packages/aniso8601-3.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +aniso8601 diff --git a/venv/Lib/site-packages/aniso8601/__init__.py b/venv/Lib/site-packages/aniso8601/__init__.py new file mode 100644 index 00000000..a5286e90 --- /dev/null +++ b/venv/Lib/site-packages/aniso8601/__init__.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2018, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +#Import the main parsing functions so they are readily available +from aniso8601.time import parse_datetime, parse_time, get_time_resolution +from aniso8601.date import parse_date, get_date_resolution +from aniso8601.duration import parse_duration +from aniso8601.interval import parse_interval, parse_repeating_interval diff --git a/venv/Lib/site-packages/aniso8601/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/aniso8601/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7522df1faa45cde0bafd602ad141d9cfeaa4e12 GIT binary patch literal 511 zcmZ8dOHRWu6tt5jP16quSa5|bT2U5&5JD7+DkNZ2*ceNZAyyUDPAuC6b;Er)33ter z6<1(|ohGHil1DS1_ukmP>~=$7R`2lhY0ClN%Zhp#4KB=9V*?3DAOjpC$Q|Tx7rD@$ zIjq4wL3}|ww8epAno6m@Pn^T@uQ+r z;k(gfa`QeMjIXD7B*d6#f^YK|!tev-0*h4i(@bf?Sbu&zf7Z)4ir4uYEH-aTbsP`G WvIx$2o-7zWw}Hyuc@J*G4*Ufwsgaie literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/aniso8601/__pycache__/compat.cpython-37.pyc b/venv/Lib/site-packages/aniso8601/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7969198f24b72b9af692053648c7c4af5c0417f GIT binary patch literal 267 zcmZ?b<>g`k0zRYT(T0o+439w^7+?Z29Dul314yJWq%h_%L@}f?WHF{NNHU}_Wiv%F zr7{&Mq%udb2!(#@Er^-LuY6&&4%3#<8HlC9xzi z#wR~HF()P@HMbz9AhSR>Gq1QLF(*ei+dMm|q_R9UCNVFwIN!p|zz~U*oS$2eSfW=@ dd5gm)H$SB`C)JJ$n@iYQx%M?KqYbH!W&guHz!63M*-9R)Dbfj4Vpz zE-|~REtYbDsLd^CjxA6G(y_OmbIc`|9^1>Jr}m_O!I$=Xv*ePd)54e1-ZwLEe!Q7) z-uK?{v~!V>fL^ zdb90xa?Kp-maujDGIW1K6KS>pkHFT;vXzaQkfD zIN%~L3Vk+fpl-%y-#BD_zRT5CZ0*?V#z132^As8fnw*$Aa{I9QxE#xf96c>8b$Psy&5kqly=Zr%&R*o*eM-B86+)D!mc z$-nVCA%{>TPI4q%5*(uU=Hjm}9V~jSNYC`WU-|8p@G@IZ;Dw%mbJb7Ck4{XQ^Ztu- zg3)jqdC}`iwe5E!uN9AW7kR!Hw>r`bm0pkP^;$V8M6s{p=t(QyPG%Zme7DnW%MOks zMM?x~s}+dEY|B77FrHXMj3h@=`1^`BlsH?OIf+H|NbIQFZpDdxFAT7#3AQD
bs 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 Iue!(n1Fd)3EC2ui literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/aniso8601/__pycache__/exceptions.cpython-37.pyc b/venv/Lib/site-packages/aniso8601/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0889606af8b15eeb5b064b0cdb2e0b4f09988a4c GIT binary patch literal 2256 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/aniso8601/__pycache__/time.cpython-37.pyc b/venv/Lib/site-packages/aniso8601/__pycache__/time.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7922f7a36265f5e10328f6d4f68df26f662f36c3 GIT binary patch literal 3773 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/aniso8601/compat.py b/venv/Lib/site-packages/aniso8601/compat.py new file mode 100644 index 00000000..9f82be37 --- /dev/null +++ b/venv/Lib/site-packages/aniso8601/compat.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2018, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +import sys + +PY2 = sys.version_info[0] == 2 + +if PY2: + range = xrange +else: + range = range diff --git a/venv/Lib/site-packages/aniso8601/date.py b/venv/Lib/site-packages/aniso8601/date.py new file mode 100644 index 00000000..df35d0ba --- /dev/null +++ b/venv/Lib/site-packages/aniso8601/date.py @@ -0,0 +1,250 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2018, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +import datetime + +from aniso8601.exceptions import DayOutOfBoundsError, ISOFormatError, \ + WeekOutOfBoundsError, YearOutOfBoundsError +from aniso8601.resolution import DateResolution + +def get_date_resolution(isodatestr): + #Valid string formats are: + # + #Y[YYY] + #YYYY-MM-DD + #YYYYMMDD + #YYYY-MM + #YYYY-Www + #YYYYWww + #YYYY-Www-D + #YYYYWwwD + #YYYY-DDD + #YYYYDDD + if isodatestr.startswith('+') or isodatestr.startswith('-'): + raise NotImplementedError('ISO 8601 extended year representation not supported.') + + if isodatestr.find('W') != -1: + #Handle ISO 8601 week date format + hyphens_present = 1 if isodatestr.find('-') != -1 else 0 + week_date_len = 7 + hyphens_present + weekday_date_len = 8 + 2 * hyphens_present + + if len(isodatestr) == week_date_len: + #YYYY-Www + #YYYYWww + return DateResolution.Week + elif len(isodatestr) == weekday_date_len: + #YYYY-Www-D + #YYYYWwwD + return DateResolution.Weekday + else: + raise ISOFormatError('"{0}" is not a valid ISO 8601 week date.'.format(isodatestr)) + + #If the size of the string of 4 or less, assume its a truncated year representation + if len(isodatestr) <= 4: + return DateResolution.Year + + #An ISO string may be a calendar represntation if: + # 1) When split on a hyphen, the sizes of the parts are 4, 2, 2 or 4, 2 + # 2) There are no hyphens, and the length is 8 + datestrsplit = isodatestr.split('-') + + #Check case 1 + if len(datestrsplit) == 2: + if len(datestrsplit[0]) == 4 and len(datestrsplit[1]) == 2: + return DateResolution.Month + + if len(datestrsplit) == 3: + if len(datestrsplit[0]) == 4 and len(datestrsplit[1]) == 2 and len(datestrsplit[2]) == 2: + return DateResolution.Day + + #Check case 2 + if len(isodatestr) == 8 and isodatestr.find('-') == -1: + return DateResolution.Day + + #An ISO string may be a ordinal date representation if: + # 1) When split on a hyphen, the sizes of the parts are 4, 3 + # 2) There are no hyphens, and the length is 7 + + #Check case 1 + if len(datestrsplit) == 2: + if len(datestrsplit[0]) == 4 and len(datestrsplit[1]) == 3: + return DateResolution.Ordinal + + #Check case 2 + if len(isodatestr) == 7 and isodatestr.find('-') == -1: + return DateResolution.Ordinal + + #None of the date representations match + raise ISOFormatError('"{0}" is not an ISO 8601 date, perhaps it represents a time or datetime.'.format(isodatestr)) + +def parse_date(isodatestr): + #Given a string in any ISO 8601 date format, return a datetime.date + #object that corresponds to the given date. Valid string formats are: + # + #Y[YYY] + #YYYY-MM-DD + #YYYYMMDD + #YYYY-MM + #YYYY-Www + #YYYYWww + #YYYY-Www-D + #YYYYWwwD + #YYYY-DDD + #YYYYDDD + # + #Note that the ISO 8601 date format of ±YYYYY is expressly not supported + return _RESOLUTION_MAP[get_date_resolution(isodatestr)](isodatestr) + +def _parse_year(yearstr): + #yearstr is of the format Y[YYY] + # + #0000 (1 BC) is not representible as a Python date so a ValueError is + #raised + # + #Truncated dates, like '19', refer to 1900-1999 inclusive, we simply parse + #to 1900-01-01 + # + #Since no additional resolution is provided, the month is set to 1, and + #day is set to 1 + + if len(yearstr) == 4: + isoyear = int(yearstr) + else: + #Shift 0s in from the left to form complete year + isoyear = int(yearstr.ljust(4, '0')) + + if isoyear == 0: + raise YearOutOfBoundsError('Year must be between 1..9999.') + + return datetime.date(isoyear, 1, 1) + +def _parse_calendar_day(datestr): + #datestr is of the format YYYY-MM-DD or YYYYMMDD + if len(datestr) == 10: + #YYYY-MM-DD + strformat = '%Y-%m-%d' + elif len(datestr) == 8: + #YYYYMMDD + strformat = '%Y%m%d' + else: + raise ISOFormatError('"{0}" is not a valid ISO 8601 calendar day.'.format(datestr)) + + parseddatetime = datetime.datetime.strptime(datestr, strformat) + + #Since no 'time' is given, cast to a date + return parseddatetime.date() + +def _parse_calendar_month(datestr): + #datestr is of the format YYYY-MM + if len(datestr) != 7: + raise ISOFormatError('"{0}" is not a valid ISO 8601 calendar month.'.format(datestr)) + + parseddatetime = datetime.datetime.strptime(datestr, '%Y-%m') + + #Since no 'time' is given, cast to a date + return parseddatetime.date() + +def _parse_week_day(datestr): + #datestr is of the format YYYY-Www-D, YYYYWwwD + # + #W is the week number prefix, ww is the week number, between 1 and 53 + #0 is not a valid week number, which differs from the Python implementation + # + #D is the weekday number, between 1 and 7, which differs from the Python + #implementation which is between 0 and 6 + + isoyear = int(datestr[0:4]) + gregorianyearstart = _iso_year_start(isoyear) + + #Week number will be the two characters after the W + windex = datestr.find('W') + isoweeknumber = int(datestr[windex + 1:windex + 3]) + + if isoweeknumber == 0 or isoweeknumber > 53: + raise WeekOutOfBoundsError('Week number must be between 1..53.') + + if datestr.find('-') != -1 and len(datestr) == 10: + #YYYY-Www-D + isoday = int(datestr[9:10]) + elif len(datestr) == 8: + #YYYYWwwD + isoday = int(datestr[7:8]) + else: + raise ISOFormatError('"{0}" is not a valid ISO 8601 week date.'.format(datestr)) + + if isoday == 0 or isoday > 7: + raise DayOutOfBoundsError('Weekday number must be between 1..7.') + + return gregorianyearstart + datetime.timedelta(weeks=isoweeknumber - 1, days=isoday - 1) + +def _parse_week(datestr): + #datestr is of the format YYYY-Www, YYYYWww + # + #W is the week number prefix, ww is the week number, between 1 and 53 + #0 is not a valid week number, which differs from the Python implementation + + isoyear = int(datestr[0:4]) + gregorianyearstart = _iso_year_start(isoyear) + + #Week number will be the two characters after the W + windex = datestr.find('W') + isoweeknumber = int(datestr[windex + 1:windex + 3]) + + if isoweeknumber == 0 or isoweeknumber > 53: + raise WeekOutOfBoundsError('Week number must be between 1..53.') + + return gregorianyearstart + datetime.timedelta(weeks=isoweeknumber - 1, days=0) + +def _parse_ordinal_date(datestr): + #datestr is of the format YYYY-DDD or YYYYDDD + #DDD can be from 1 - 36[5,6], this matches Python's definition + + isoyear = int(datestr[0:4]) + + if datestr.find('-') != -1: + #YYYY-DDD + isoday = int(datestr[(datestr.find('-') + 1):]) + else: + #YYYYDDD + isoday = int(datestr[4:]) + + parseddate = datetime.date(isoyear, 1, 1) + datetime.timedelta(days=isoday - 1) + + #Enforce ordinal day limitation + #https://bitbucket.org/nielsenb/aniso8601/issues/14/parsing-ordinal-dates-should-only-allow + if isoday == 0 or parseddate.year != isoyear: + raise DayOutOfBoundsError('Day of year must be from 1..365, 1..366 for leap year.') + + return parseddate + +def _iso_year_start(isoyear): + #Given an ISO year, returns the equivalent of the start of the year + #on the Gregorian calendar (which is used by Python) + #Stolen from: + #http://stackoverflow.com/questions/304256/whats-the-best-way-to-find-the-inverse-of-datetime-isocalendar + + #Determine the location of the 4th of January, the first week of + #the ISO year is the week containing the 4th of January + #http://en.wikipedia.org/wiki/ISO_week_date + fourth_jan = datetime.date(isoyear, 1, 4) + + #Note the conversion from ISO day (1 - 7) and Python day (0 - 6) + delta = datetime.timedelta(fourth_jan.isoweekday() - 1) + + #Return the start of the year + return fourth_jan - delta + +_RESOLUTION_MAP = { + DateResolution.Day: _parse_calendar_day, + DateResolution.Ordinal: _parse_ordinal_date, + DateResolution.Month: _parse_calendar_month, + DateResolution.Week: _parse_week, + DateResolution.Weekday: _parse_week_day, + DateResolution.Year: _parse_year +} diff --git a/venv/Lib/site-packages/aniso8601/duration.py b/venv/Lib/site-packages/aniso8601/duration.py new file mode 100644 index 00000000..98095a23 --- /dev/null +++ b/venv/Lib/site-packages/aniso8601/duration.py @@ -0,0 +1,292 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2018, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +import datetime + +from aniso8601.date import parse_date +from aniso8601.exceptions import ISOFormatError, RelativeValueError +from aniso8601.time import parse_time +from aniso8601 import compat + +def parse_duration(isodurationstr, relative=False): + #Given a string representing an ISO 8601 duration, return a + #datetime.timedelta (or dateutil.relativedelta.relativedelta + #if relative=True) that matches the given duration. Valid formats are: + # + #PnYnMnDTnHnMnS (or any reduced precision equivalent) + #PT&@)`n+wtj^n#odLs5D2(c?gtyq`P&6qJK++B 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/__pycache__/builder.cpython-37.pyc b/venv/Lib/site-packages/astroid/__pycache__/builder.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16a9b5ae248d89823b8d4a53975508fb98472d5a GIT binary patch literal 12273 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 ZS8yD>vt8GnnE8S6g6mYK-7mUl{|6oK8883< literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/__pycache__/context.cpython-37.pyc b/venv/Lib/site-packages/astroid/__pycache__/context.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..397f727eabb024297f8c8819c5455a25a8592deb GIT binary patch literal 4213 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 UPzvztK&Ot~UFxoQzwEaE3rvT9MgRZ+ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/__pycache__/exceptions.cpython-37.pyc b/venv/Lib/site-packages/astroid/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bf5013454fe7d46c94b6d785d789b612a941c00 GIT binary patch literal 9372 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/__pycache__/helpers.cpython-37.pyc b/venv/Lib/site-packages/astroid/__pycache__/helpers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e42bf28bfedf1743bb39be26eef311c88e4a304e GIT binary patch literal 7259 zcmd5>U2_}PdEPI8AP9blq9sa}la1n-0!`Dg+`0)z(O4EOhmFLxCS|D`s?ZW=NiGQN zg6AAq1haH!DtD$ARnunj1IYHOx1H%9=uK|=3-&5A$&LF1dXec&`@HX2fFSEMz3EIr zV)yLX_ndwA{dnFFd^9;(weab@|BD~XZ(G){=wk43G58Q)_3tbE#$&-4kINWWf(nnvFdh%ad0fG`8dP~aj`2h=!Q(2%wV-BOk<*$C zro@D(eQ5>LVp2@uJR=sww3zwQ4lapX;*yxfXjat4Wif}*Ww9t;6IU>r6K{*FVjiQ{ z#FDrsu48mXydz#0H!!*?-VoowZu8=s!pHfV_?Ebd^L6oU@g~l%i)Ha0@fIj=2xr5p zzkBq0^|MgMX;1lkQM(&Szo+ANtm8;6SHFT_to6E`m$pL{DGbJ%X`-V;jbSx9Y(`xj zrwQNagh{v?Ng_^C!NfHgzG!Us;QRK2tK3^`rgM^&EcS} z6Faj`?PDjiGpFHX#IU_ycjXxF1{1tYN*4lhiNlxZ*4}M?p8PM zzJujDY`5Rpd;k6Dy~FSCY=uh8G#10Nk(yfW_VZcuvJHNkVeAIIOc@8uuG(c=&S3QQ zZ~Q6lXe+a{-Ev+!@~zA|aZjz5r%U^e^aZ4F@I&DoJIPI^D!0Z!^*!NYW~P{_V1{Y* zcm|ohBzbx3!SzB8jh$Z7Bz-kf+2}-iFBN%ZFqfCjOud>{W5sWsG$UC7S9$qi*x43g z?#VROxo3p?(c`s;n``SElJu8Pe3bSQ@yKjC`8e4=yX1F<(k_8c*61)n2U3MOOkEO%1TYe)4tNv{`7-7|Lg$hcWBS=eEt88-JKd6kw_3+Kejd}b}#iQp2= z=)UpTycE-nybMaC*2;Zyoz-Y3uO!h6rTgtDABPo$#-+w~G1OX0@}iFz5<0q5tJ38n`u7SO=T&nt$FNJ!H0MKh>1((P8%)D05EyC6_L4whYk z`_!CSHi8O_plmz#EdHj*JRG?InxRRMB*|_WNY*jv&uX|;W|2$0gd;t%l6lY4PRre| z%0(Lrwk_?oN*mTwOP4dy2z%dCcQQwPWago4nsu&`y4>(FH1tQ?I*b!v??pcG>ZdzA z-i<$x5}$-nt@`+E?#0T-e@{ii*Qpv_;$h%@CzeVt`6>llc%K1o_{}i!Rj=DkrS`!I@1k&__^GT+ z!(BTC$KVc(^oJ`hJpL;(eYXF4C3jV%S+ml^Y(BL%u;`DaOr;#B$%)4aZxL?8c-?lC z{^ugFC@Z*XGqrIop>7R=8*yi22J9~^r?9z*w;E}fKx zdusoMeRu=NKXz(?Vumm%^ML=)1$H@j{=_=C3(SC_*30Wnk`;XjfC(cu@Kxkgy9guC zt{>ZmK?)~oKC=^k*xxw^*ouWwFBveP^+9Eg0v$m<$yL6ML*2=pHVg9 zhs4}WJKeh>NEPi-wvU!Z-M0~|hU#rInk?UGQ(RSdF&Hd7dMlK>{%yb0Q<_XIEF4Mt zdSJDzxy=Xl3Uiv5_=bFkI2^KRtYfCY$4%&(?IU+PG6f)2pl3#tyvCeR@Ke!&fv9ma zh3mYuPiPp_h+XTordmm#z5lu{8NHXKl;tc-;CYOa4Z5&?DG5 zH~s7xyZ?$Ly{-7$Y1%FxD#I8Fq<>LKEA$Qop@xm;&-uZTDwG6ZL|O-4ftKXMyn7KV z>mIx3h#io4G0Tqs2N<)8pT~H|s8rC?e48FgD@laVVE{4il#06(u zoT;fB+7))o%Pir%vR}f3b%{a^)aA0eypRBGL}TU!;*r7PS8&mHSL~bn_=amdFv@c;uSWrW^NsM(1J;pNQAeyf2ERQ%`I z&J+R@H3S#=16&U?7Q%vI#?rz?e;#QnjEK_IV+XklvX5gIdCQey-m+}+7OLW&TK$@# zL7j=~A{?FciI0Y{!PZQVUO{WQ`&X;K*urV`=)^RV5Ed`dUY+>^w)Y#h2+ zvYsX|V<)X@fD|D%N?4-{>L| zR8_bWHJIk7AXoD^SY-!jOXstul&)O<=sWUs0RLHG%eYU%e@u%xbWn4&FrI2L-Mu z26#t57-&sGPZS9#Uqh8{ARkyum|`v{4Qz{1KUyv%`e3tO31%8t+u#bnv7e+bl6>kO z^8R?cr;Y8Kp1F%6BGHD*0T|2-lj(dQm*nU`gxdTo6{@bW$={sCV_<%H!p zkTuFYlDkvmXo=`aFidnqnNyZA^pkB|P+qSgBP3sloG)!PPYD$u7_qcf%IsEYmu8oQ zym(sX+_v&uGs#9 z>kat8Y9xBi7%3>h#SdfHp=|E;<+s40{CymP$|IRFj3B4tbo4!Qx_v<``2?pb4U}}v z{eQ+vMGXTBIceD;BXsOJd&ZGJ!rVEbki1D!in?8t_GK1V|Mti3? z`2nB*8-{AkP_gzGBP=~4mJoIMa}Hg9hN+@O04r(1c6J$MGrQsT|LpK7?8bxFq0oOt z{`vs^TFM;F?G|lSOs=Z zwx(cfe?5u~l-k!zNB{OoWNJc#yg)(}R&gSt!wV=p=*<*Jyhf=52u=3xqxbZAjF3;0 z4FDU~HyWrXsoS$eSPoiEk(H4bp>>>131r-6z!^fe8}Mt;iu&r(2)EF z4#C8II9$=b2qvh`EgBqXA`F@n+|D3ekObZNC5Cb|MSy4p@K7|*OV|btln-g_;+4*V z$7r;WZ{fcDm<|_A|EkG|2V!mj_E@(63R(kUW2hMcV{?Eo$Dtzy5UwIOK{NCZYF$$4 z!rpodCdy4`tAj9)CImwn85R`*0u`iMglU-?@dFAJ$TCZ>D91#QD7sc#G;UQjjE?(I zTY8eNUjp(9swq%T<2#c%J01-43#Pa@K&gvK6B=zU2oYBf1IN-E#B-#Iz z=03y$zjX9=- zVg7VpQ}XwS9PdC_-8rs}l z=6n|?Oxr8#xB{1deg>w-}(O(kk@(YYehCzKAH}c9I(_X(zzeTWcJg0)p h^W2|Xb}Qw|Wc9V`rD}J!wZtGij=}X`0$?rqgNrBa^w)=?`b7(_}LJ zmB|lHrqkzn&%JjSOHfih0eL^q_c`z9bKbjW2M6;8{#IW6;oE=lj$!;MAL73hZeGRV z|FLZtu2C{v)3q9A$&{;AvgB%)Y+UVzvyv*MOy+TLpDtzOK85>iDJ%DB+~-O;xzFG} zU&_mU7WV_C0lClNzECR2eZDccGE^Fp`vJV)SK24{1>6sphE2m8*xtWmlt$dQ-9dNg zJ+pMcJKz=Sqvc2BdN8^kimqeP_0j11Sosn6rn}D_M#;~3x%%Tco^Wru``wZE%zOA( zI_w=reLsQxycVPDlPLFf_kcT!a!1@p+=K5KrKj9O?ij8|y(7r^S>$-seGJc^bIa~$ z+{cmgn3vl|3)@e4$9Bve6S!qIlxbAUxJgVdK-sh3}1?2kTJ)`t8+i^YjY4;ha=@qHz6{%?wd0s)@$)1`P+!OAz zQB7a+zJ%0M==+5G9QyucchP;`eF3v{I_dqAd(wR|%KsJbH1fY%KJ9%)u8+7cxt~Y5 zGwv7MFXDREt+}tblPEvs*4;0;r*L=9{jz%+Y3JRqxUb@R!9C-i#r2{)<(|X!l6&60 zfa|n-(Y=K0YiRkaIG%8q-D&r=sO8ta*U;kS@@wAfa(%>YxLb z4Q~edu9RoIH{{w~yQcewdnL;CHScRky{cD3+HARBbFW6Jv)(LH$C1kGOFg;T?yNf( z<(l*6kb12rb=AG*z8R&y>Ai{6>zHBXUUzSxzc;)aUaJ09x#Yg(mN4G8U2E1D_ct#G zOEtf^(sI`tUa{J029;XVFII}a7Zh6y#f7zIHK?`lDrgm#Doq!;YRv^tdCjU#wXXSwp1l(Dap3vHQJuO zU8yuHi=JXF&6X>*47zJg*Hh(2tF^q=MoO-&T0yJYYOt`g7StM5i*4hNR})7Shfnd= zG2X-r*Ti_O&8tc8kNHKf=@u7Ss>o)F{#tbj!zo^txj0drYE*pxoVReIcp;huKIDt| zo5F+y6B848d7AlkR2(|K*H};xm4+(Br;py6n!I_<$GC1@K6CNn^gAz1oI5{z^Gv&a zt`bykzTT=<8aL;>mG;ect^F(}KBzPr&n~_AqW8l3D+@QHxlOJ~*C*N=VNRaP7{UYx zDx*)SeYj6%f)bp^6f?Yw)1t9ut>5Vwb>p0ItFdJVX2%Y!x_!@5&A{1Cb?kb&WA0d6 zPRDW0AXCpSSj%a3A;{J99is#Jf8YA184Ms5W&E%2e&4aS3&CK=xd-`X8mk374|QyP zf8FSi-ki;6r%63UjI(&B(pdBSA}PfsDV5LS4pU1K^wfmc2>cmNELTS+Hgx!Ie4pBn zv4r`WFEa*0R9U{r%mx*uJXfV9*{>{kWtpTfB~7UTz8|>Ol$VwHhNm398ImrMpwBDS zQekGP;#Yz|g=x?&<~Ka3t10{5>Ke0^HL-^2O1q8p@st`yJ-Ul&J*v<~S4$ZzsPrhI z2sOlf{gs5+^I#c>8-cb z>8q?+H?#SqtVlAy6Q>&F4FB{*l6yQG+Lh*pth`K1=mZ;WFHAQ;E6rAzhbSnw78W43 z!gRX=@f3vFcFPZH%~~+-s6lp5nDcSmg_)*zm(BHcFC5z4kvG^!uAO0znprDv9>nUX z<9Ob+D&#R)l^eMEm{ocC)2vF61>cxEShI((4hNE~&S5-Ybq?ONwoEMdC$CVLKUb>; z*P880br~zi@}apLn&rOPP(`FvaKy{>xSpMrN_(#r%Bd$=Q>qqtD}I=dcm|o(5xiGV z@pP1@&+_y+oIlbFsMM1xqcc-Bxj>vP|Wry#7u>Q5D@5+g^k+50+GGZE-15SuGBO zLz+i#q-u-}@p63$=Chrsn%=UQznrrKV!FvIe2N81*Ec9d@MF z)OG{pbCCs#LMFO5lVI4&O3}sZQ?44Rv{ctX#8^fX>$1)RjrInI>Q#)YtUB(bl#SP^l#QphG>DexA*$gIA!jMCsklt((8uUw59?8#-KJ_chDWU- zOML-%3CGg_NKBm{;GsrS=R>GFnmQjqHriWGkGazpbH@>5C)G*8*h$wjV(h#cWa~K? zIc6sX(6{UTaep zi|mi}%Q3%O`UF#}FvN?y3smrY7ivqIkj_<#5Zghmy4I*DDbGbHE>vm_KXQyB0Ze%} zSv(UJ<5Jla=>&EZGNn2>aA=Ijp1x2Oat)bT# zb?g<;f1Rw-i<`V1xl$8SgIg96JQ4eKx4RWRYu%4$oD>r#F?qv*xF&dr5hud& zU4!Z04Eo3o&csq}5e7gxp8c})>6bw{+NvoyVrJ3}P^U;~Sb3I<`MU6LZ_99YZG$ROa;LNkw@mt58nogd8yM+usDGZl`xZpORvhGeLGcM~MbE z!G=v_Z9XODU$Ii0!9q`xvWl|g+9@w8AP7G6&@1R!n36$>92(EVN*BLfl4MNk%g7{b zUK(L-BICLqSPInL^uoL@#zqt;AuPm>Sg-;=Fx|E4!_)#S2oKFNrL<2IPBO*n88)|@ z@8Lhv6D_m$-$b%MhLd3pn~q&DAp{@@vcm9LT-7@>oZ!)S9md!A_A*Y;3RJOf8e5KOY>xKU)N#IPT_=_Rk@1dm!+6VRS~s*xvNyjNQAx8n zz0z)}KnP_rA_5_dn!JaW(IDb;t@*lF4R%{3Y4s`w)1BpT*lm?{!LlwE=9E`y2sehK zXEdmIcCFTML5%{-^sWhz7hj};$Qm2CVn1^iG$raL{uFI%_I9Yjhb#*#FpBvfk(Gd) zeG@qn_U2-c9;R4~_7c5ENJg08U{%fF7NHkmBzxup46Zq3gI>6VOE^4DGNUw$Dfv~r zRs<6u9)+;jZw*KE38jdGIJjtHK0;P)_M+?PDlvwHUTF4`UZku46E`16FQAsEW6IdF zH%KK8hUM&{kUA&?`#60Rl1eBf^-e0Lkd2c;8YmK|4oU;kt!zLlWpM|jX*;)LEN8|1 zO$YhyfsWvcvzS*)lc{l0Y$t;m(_$(=|7JWhNgbdd>$N7NT~lHo@i|xjNVZ?StPZ2l-b1< ziD>#uq^$ohs4U_tT4nt)_`{;53qf_Xqw&EZ*tze4Bpvl$kU}baEGRGD<6Zo;ag>$@ z4k*96vt!B~pvfIe)%j)%!l`)>ghO?hSKri%O$(_Fv;@L)0GWY+pb}9E>d>S*bkVai zhPS~HVY7IIHAom`k@c>Y5;GrTOdQ{U_F~izb63Zt$&CLOblnC6e0SH=~7YKAf z*IMR-&}jHr8D{i3&t0q5;0n#*{iT|x=v8cl*;-7QS<Dakqw&F$qy>Wf;jU zvO<_@-32z^PjvfaPRguM*yadH?ga81cBJ;KyhE4D!chRR4O?jtT^azM##DzOj1^7V z2gpq%n?edm0lUy3uCYXS!NP(T918&4LE@x#jBQAny0Jr&gpDJzCWD1-K-O50HClgK zkWo^b=uwc4NE_6>WxWHv7im9@hwpN$ZS@xVp-Mc7T*&py1um7axw^%>n>@+nmT?!$ zeil^~p88~eq_Y+qt@%ph0;f<+QadjbH-hP+z9M%znWfYutblNwfkJ`zo(A87OL_^68|!4K9q!FYPLCN9Et` zEgxiH!eXkqMYL?G?{t8_G>>9~DSq=i!N7KbM#~oP7xjCc6w+bDh~b+-Z~kjAC?;-f z>)hNi3#;p_@9xMCbgc%VFc?dT`j?c{pze=4EtW?%0bX4K;F`T zT*@+)CFoEsY?J20ESF;u_@!3BeViM~zhwR2CiBu3H1ZZ?9L@hctTzWTujk2jAPdvj z`=djU7Jrkb=`eDW%}2~5&Ow%fv{ZLc*Dhu!!#{2#;NLbDz(%h99`=@GyMrqAFc>IRPeUAB)$GjuUSWSA%r}hnZ_Dnk^|J&}-vM|! z;HKO(KukyPHL7>x{HwR!4C;`(@EV!Z*GkNyhv|l zVEttPi+*v?p!-CTN1G{K zeiZ%}wj#t1@S+(=1zof&v|4HxXh>i009TMwei3VUYnY&Ho#Qm_n?El||F{{Uxwwb} zq48K@z$itl5$-Dkl{3I}&B(Jyic;zQ&_l!^Iv5TXh$Dg9_GYg)j_VxSEQ_TTrnL&~qXghb3$+GxS2+2|Y*`y4uvr8zh@qI(VF+E=De5My6dNY#!5{^rRbvYFj)Y=F zP>lVKO=DC_z=(xq^4Ge|`{w4mdhe)iKMMDqp*paaK0sUf9XRjUw@TFq05pCtD8MU9 z6<`o^CYxEl=iU2eb21o$-3O>JDAe~aVE+9-d9WvUhc`al7!F3Z51@xmWOtpw2uACV zNRJLiisOMX+#S|tbSLdv>|<~c&;WQAfBIiO;8mz4>>dU&^Da&ZTcgbrO zJ=z*nCKEFX)E09enD9KG4u=^b%BCxFKc?+9RtR!c-$14?mzX{xAi}Y;6*p=!Qiqo{ zsG!6GBH5PqU7I;`^{w(7SIU>q&s}=soD%-$UY~^TaHkg5PkEtIMQGke*9BEBTg*;H zQE`d@xH`=fIa<3pP05n*A1xsDHc!($y~dNEt@Jg=^F27nPcezmM(8lGLHZPCbc_QK zW-)sq$Vvs)9YM>!dXJ_0OtGOzZplQo+W&)$ES8vc5RTIbY^fs& zYQgTJ5Enk-$L731z0`P+BY|YGLPkGYDUm`4J=|R5N!5y z90w_pf4owBPT}xL9C~1k{A$4ms>A17&SEg;=JQiaUUfP4Yh*8yairL@lr06gI5Vwa zdZms1V;DsscS!3IRH$S2Qh-PS_KGP!v^ygddP*wlU*ZF0pdZwa0J-8?4|6bF4Z~8u zfOD0bW&9(VW^l+rh}-E2V-Iv>ksrW6=^mcMSX6J zDVBql>{}{wSwCDPJV>@GMZSpc2_(gMj{KwjnK0dIb5*qTNXf3L*dpP8<~70J)wkJp zTE9{E*;*eV9Ribayk)e~YHN<8SNarJfr`Iph5pe$Mhm|{*a7Ug~hQ*3RXx`-eq+1-u6bsF%Z=k;zh!mid9HHkg23=`NZ{JUsK z#;v}?yT8X1DO~*`PM}EiKhB0U74RZ-8m(!|vjiccq~?qVbHbRO+KV z?p7LRly?VVzn;|IKYf`px{9Tl;B;|n4TzUC1P~AP5AnSBT+w0zRx;e3uVxOJ3u-p zP28(E_JFkKRa}iGeBwH!^*S87dj7)e=cl+1XQyYnYf&29^{BXOu6~85PgoH3515Hd z{orDNh_M(ib1`U~8!7nZy$kZIcvmH<@Nbt1JBb(TFLA;d)^qDPc5@B7B@8vfve+|@L6!T)gxWvI%HX* zm=SoPi4(g%QN|d{<>MRUI*SfML>6gv1IbF#*O3nUMCqcfW&>NoaGkL+vPR|tU4}>#APC{8o42O83aqzck#4KC9|z59I~EzNwmMX%xO0_k9Ktyu%j19(;TD(VIsJM zNZ82<>Yr8OL_dj^v6EUQEC&UF;Vwl>VN3LTZeOTPhtFqGyS{S|s_dHI+x;2f?mr zkzqqos}gIK6ff>kw~&gep(tS{0dqk-jPWJdRP@$?zw}f9hK|A|`mCU+LFsV9dz_r{ zqy;T8caH;YRRG+|#t-peDc?I~tl}ZFff!tnHv9fDH3LTDob=bdM?ZT;iF$REn$#{c zBg)|+otcA=LvajcAX<}*q9|l_ETD(Gupk>;QE$d`YMU=}tWfwY98ByRv1fLeoR?ne zeK3(W`y!>4$QNmj)=fVP@9U8?B=%e6W179jF!2sL3_M2Q1TYRzeIF?aZ&Moa5Q+06 z+>p1oA^PFR;v)<2c@~_e`TR6L#{i#ln;d)|**Y=T!=G(#iyyAJy77s*6>?(>USz=c zAIRO62mpWYV~=B(M6l7?$p^~xNFn6!t6>pkIyuM(r}CY>Fu&y5a8@gXge6;WLyS?ebK)|m95m0~6RR3}HbTEXVc=X4n=JQ@~*MkFtxMrFp5!NPDUx_$AdZ#TIvA@9_5>JgdN%?N(A#M|tG>8=o zzsnsJ+DwoEUq~G>A~3Ms+CuEplKm2cOG9wdq-MFlv2B{YpfgnjiTw_#6bE4X&8Oon z0GT_u4-uxgM{IwB8?h+4MD|b~!wt5NqVEQ=?D$@gi-!#)qNUcK5oN;H!h+buJ2rcO zdeXBG*)zf%j$xVOBVzPxgJA(L)dWvKt?u0N=X!~m` zq22JB;iJG#&&o*OhzA;jr!*VJ2eovdrJ;VECl0ezAZsUJDMf?G4=pal()jy$M>v4d zuzt9&54YNDAwt3{AP9Os8tsiH{#Q8#FQYyqLtrIO7!zj()o_cMzL4IL0f>psW`^4! z$`o*>19ujAE%m!7n|MlDJkV|t(eekl0Yu521mFu2@5o4S#FZ26WAL&L7L2Z`_4mPU z5ljZge0M927zz!P&G8zGg>@G(AN;}wa2oQ>3HGn^b$at{JcbV+)8fCFLGE5EhE5T` zH4kBw$Bsr`VJA(*PEBX#+!aU5l6LSxm)c& z;u?PrH5php*+om?Y9WkD)-k>kt{%f`s}GSgSy7Y~fMN<)@qKs0(e!=!^}HK$xF(HLV7Ca zNDqnOXC!1$2OmxD3cJytBG~H-D1nFp#6QR6!?<`|qS0Fd3)VQOgl zvCPLvHUAbll7;*Kp&AzabW{_^1jbz}faSWB^ZUIWATyGBglwP24Wl4P8xrr=je3`O zKOOBy+eUwuvOCZ`)gO{aiY$$l6Z|TkF|{brPETy3{yL>^hT~Dh@YfheLBVO*5=w5W ze~0^IDz$!!MnZHj!UHV;JrW!XsOK;?Y8l1`6-c<2zqmk@5Z0I-WVY!TO7tQi@9V;N z#Y*vv1Ru=+WqMBEGE8%_*z^ct5C-(y0AR&(xO!<;zRRKq4@*Lf4ow@fA0yAP{KK#D zU|#_78vIOY1ijUJGPyHri@F(2qg1V>AzcYR;FM2nx)II2AJ>;0CQ5j6KdDB+jk=a2 zoJFpTk>*Ddc}9Q!dpsrcNRs3%S8@1PaMJVWkHldC%}H=P0B_76ATWMw1BGGeuV5sy zi7FB81_XP{P?A;18TcW8)hz_nK^Uu{MFK!7KIgV zkRr6Y?6(McqYQRdB(_)BxKxPZ&?E%y<3#JQt`ENe5^Tuk&P$vb(jet4!?cB6e}Ly* zbAw!(TbLDd5CtA+0dIA~^FFTaNUTfX+Zi^?NjGfuL!1-1JBk7#cQZisS38q6`U%oQxcP4UY!#27%V z<0ApMHal<+By^Xt-oJ!hdwz^CCMD7o?hpzYd?KJfNWhYB^?Z;Z@gZ3*?0NJw94ONP zV?0v19FhFy@hQea3Rbs(kr#Wih@}4pJ-#Q^)&ypbn*m}dY>s!80x|kH)7#&W$$Qe@ zx+UK|a&yyBWfqgNL0kch$4k8bJ3LME^cqi1o|bqL=HvXA2F~*9rpvOCqIH5;u@{-E zg;V_1TT-|B$4sJ?xo2o1C@hL)jOJpROML{{xkraMLwgu%f_L}`K%x)v1sv}APyHw4 zO6ZQHK=~%5(8divu?FukCL6)Iv&Q-aDG_@8=&oOu!6&Ye*5K7s#_E{9=N+Q^z`H1& zQ&)J`wD9XR&N>1`P{R06p5zG`bU=3A2MYhPGS18{P0mJtyQG@X{Jzzh3VHT zEAwtey^n`dYL;=m@*6CrM^y#jdAYX0?Rbj8s3;>f+7DJAE1fa9gq z9DX{(3+-7ikRR>P-*rFB#^~DU&qL3#S%(U*l-H_=_v+s;!xfxL&Jj+Yu=>BnD3qOIKJe@X}wbOj_a`NV6HkBR7e?dyJOS?$_Pu#yvpt8_f#9Z5rx zGxVLIB~D0V5vSPn!GKW|i+$*W^w$0b1r~iQx-Uf^_hGP4+ou5i1B!hp_IJ(Otu|DC zY7Grfy{&hQhN03oqh06}8%3@c&|YekxL!ovY?!E*g!z@yD1WGkvar5Vg!NQwSVCJ> zs#D2-xKS)aU)UWtaJM{p&2}I2Yp)&q-L_|szHjvWwy?uZ+qEONM>As*J=|#ht0K!F^`}p7U0c5&c`{nRcjLnkSDw6GyS==+exuvH z?Z)o<-LUDl*VnvGcfIR(-|~YfcH8Z@wy$3G-roD$&Gr2B$IqNgwQfHxNA9NQ(Bv=E zx@iN7s;QBLTebl(kKXB7!Z=8D2O7SCGncD z#MD=6!xR-UP2wYF#4Mhcm=h=PoD#2#d2tdwDq=yLLd&#R6sPf=5tqan@e;nwip%1x zIEUJtctb3Smr*+*&Wl&jYhKvmRXk6Ms<&_4;b7lPXKrL7c`uX5q!WYbBQeYm z;L4;_W#T#N#e%fyx4p=+=`WNcVX0Z%0*=^3_GT!z?5-Qfo(yXIC7Br!X@{=x!`#^OC2bVHc(nx^uUM2I69Zc7S#)az81MG#pY9LE63LU)B)8h7*%OaqlO=9 zGpNl7&~j#3zV!N?Zv-Z(&dCZMX<AKAw zfP=HU?Z;l*2YU)wQ)6yzq)VUpkspULwVbhfHRh$ag|41F(zehGUewxg_Z&ai^rQxCi~Xc?lg%N^jE}hjAH+V zm;NG4DBF!^+7Qp7@u?Cl0@EO|K(#9ws(q#e+5=^v34OIQI%TCxGS)Kq^h+rV@$$&YKD})X3 z^_uZoRc*}pL9^Wxo)d&5?DbTwNdkL7^ax~bl3DX)a^ZeJ!bjZ9p(L1@7%8ZW?;jOz`Hb()*f1@y=WW!BfBGms=J=|V0kydPLgrd};(f@cy9 zT18sIKpK>qo3Jw*(Cf6AZGmT-6ixz}!Kt^=gw0vNo28z`&rmC9 zg$AOQEahv;fxLE%*jNck0qH!M`VuPa=O`V>7-R*A2w8z_LK?|qG3q%7dA+Gp)#U|@ z$=)i^ckJEa)4~_hI!OzD;pXPEeohqkHV8f8&U}Wx5iLf+K9W}_*8lDPO}a4F2VAPRBuYj9B%PAgBf+o+LeRV~)nB(ZyJU`JD3rKyN(1LgDcfGuTT z`5NarQ2!qAa-d=X>Q3%h>swyn?RDjQ+jwQXg~a~NALxGoX;78tYVuFd)qV~Af#HPlLt|jH%(&dLT2r9(OMI!IWg6C{FenIZ zr!1cg3ad)+-{XEW+7FAxWaC8n87v&uyU<$N zvC#MTSTka{2dp_qdj9sP1%IwS`t_&Ep!B7h@2m8rG};%n z5T^z@aR@OCfsyr>+EjABI&ecBr=DE83m1~YvM+LzGPE;?)86&t?Q7N-Fkqn^LYf(X z3AU2zp^+sA)NY2IF8Qb6jLeI2(%ei@f>nJp{^=AJbnBygAFte9zRjzv-?+ED z`tglh%aWYq^la4I$mfVWS2ni+W!VxVS*597qhcOKwR~t{(n>Q7Vz^70Q&S4t!odl` z5ea*Na44ouiy7He^Y&5|t_}qk6ZS}61l=9{q6P{@BafW?0uyL8kFo-vp@L@-UuM{U zApDwv_h8^@s}(J)&EN?yL#uGRsm;UNsGx@lDi!stmRy{`J9p%=hkyeI$`%|Quna1kc-`M?yQi54ABa0&2; zR#Nx_eOMlp86KuV|KAVkKf3fld2|ViP3efz$gf~er>Z4J4f2W7+uD+3P}xQ%<#7yD zok`2+kp+iGT&SXCGbOLl7}gd9gWc5ngn}}5D$}X)I8UY}Bp}*wUs4MuFOL)DUtw@+ z9lFOX*i|c&vDb+*r7RjHc7Z@dhqN_HSStIdCQ?G|MyF=BJWn>v1l(jD`6&%27G?!8 zRNg>wfM4_m3JM3w4JBdI)Fp@%xu_&qBz)9v;0=cI{Dk04DD>D!Qh+s$AIr?IQR&ZT z#&Mu+!Xp{#;C}#6rbN*%Gye3?z$C)h>>C0G389sS0F3(m82u=aY6IetzDpM3Vyl#y zB{E9XN8sPkcw&s88{Q+EVw&xGZl+?$2}YKmYVsckI?M@$NQF8x8A!N-MJDgu;rO2- zn(P?A1)hx5HskaduPJmTz)lO?4yK);H}hv+pShpm*CGQaLiTVBNW?n%*XS#4DhS2o zG71t5PHP2Cj{&DzIK-O9RE{-7579CSnfw_Io#60$X!|$(BJvn1%{31mYT)ET4j4-e z3vl6Ho8amTA^sR|$3b%!qz76TTGvvB8igL@Y0C5Tq|kO%>D%}QPR4p>O67GJ`~o<{ zfh_pD0R9%i-=7~f%#16gj!7IJ7#z@)Gsg&A)03-tU>oFo8r#F~iEfVuK~;w1jz(r<9W7xm<_R!VYEFGld0+Hd6~L!HH5ve}XwFneo+^jLDn3{3{YB%;g!b-c_SFj7GNy^ zLxwt7r?(8wLJ?r*870aIC1)83HNYC64Y8sQ552&QGlVfLJSi~a-o>ag)ay53_-K?R zpn%^y3fV25d5TSSH=p?rM`)Bp@ds#-s9|P!=L<*1S;$iT;M{-+#4l|AVG=kR`03sU zF!Iv_ikT1*e_ny%Hz}lr5C1L%`@)`m?E4&j-=8^9@;(n>CJczGnY_w*)9(}3wCp&U z;5o^q?-biyU`aM1u$p`bo=O)*J-Kh}#da>6{rixXI zwXI?LxwjR0N0oFa-^SjuBR7{wav5cUSKC1mJv>Ja(P0BziY0sYfKhf z$BzM*G7IE(WYKkY^HtT{A(Z^*d0HQdaGU&oaxlnaYd`jK0~P@<-PlIbA_!x9gE)=I z!483G$!((^2|3qpb~C@F%pAA+-l#I<`IL_WMSUgh{GuGl`T2kjo$JGhg2m~-tW zrKPcD_PHJ&u7|Q*1lnm4HxOPR@XC3jduW>k{Bz^0mT%t#0X*|d1~YkcLQ=kG*fC+D zOcx8w!VzIB|^5i8sigJsJ4izC4kErNTamZ1wk&D5Xpu~@e3bSAU6b;QhVH(z=Y2cq_y<;w# zbJna?u`ZgHY4C{Zl-#A!9L?6L7E?h`*El!gg^z59#Q%qYvX*CbIQhfQGv9RbeL53- c(b`h;dIm1wVO>YncD%jrJfx$5@JOj*Oz zy!?;f)sAS|KdIAyEHsu-l0TyonyU$27@^)YTtla}iMHvQx^`a^mMFZ`L}AZxE%b__ zgkA}~0(!QXLT?JaB6?*pjo!2@?wM{0{R3hK{TW$6-$s8{%%MMr*;DAvi-YJLM6WCs z9&43Do$F6Fg2ZXYVmp*hJ&sa8h!Q7>o6>0pJJfE(%1Jk*BZ5XlDjB6t6bqSD%WrTG zt)gdTA?va7(^w_clRI_UN`p8`>NKJMm}o4aB#W09u6r*J&GHiUWsS;-V@cEtVtG`L4N>(4-x_^J=>r2(;yN_3IwOY%5 z>aTtl*ZpwyiEOr3TS4n0c#`^IcyZ(MWqE1mT4U8uQWXbc@Xq;GZMCyQd_qiDsh7q% z?W1%q1C?fU&W_!!I$?gTPJ%-Zy@`u_vqxxjb-LS@p%&268^&X;Yp7+k!Pnz7Qc$0A z&pf zl?)S^Ss}5S5X&nYt!%-gG2!ufJr;(O_@2z7(yX#>>y|!?--6ybGtTa}my(#+neBOz z-;|!0l|3)l4YUt<-m`5#?2VK>PsDZ4Q-ozUTlec5QnXauk}7ShDST8jR1J^IEjqIz zBoCvoeByw{ti|8z_%?WG-zAj9K{cu{xw5!cZY5l(3&gvW&EE^cRI0~mGfki=LDad# zFIM0I5>A6>1<^X=box;dah=lP{b4_6i3vW0ZAXv=iZm}>t!O>Z8{uf5@v9HnT zdJH%@wt02r{*$Gyiq+j*;^w<%Pu_-7_|ZfuJUJ$Xqe4gmrbz92qUBD9alEzN@<_bY zdl*n;oYgU^h8$;&B`9v7B<$Y}8)k(i>g@QnCJ0mw^v2+2P#NAKoguPhzkW`{Na$?C zHWhuDj4R#eZCrt;l^uELle-=};XYIcDo)oTXYxva-E)>kR&4QlhH|pF^Uw;G_EA1P zk>n`WHCXmZ%$URnlG*$H-EBire;*f2d|09h7f=nk0LkWf0+Kz|izW()D{RPmk)w)o zHn-Aj#VWlA*OS}IALF$Wv8|+!Y@YHtPL0ByI?fT*zxm;VZ1y5?)6YiwEw7p`_WRM;%g*RC1=3hHHU6@>MziK`Skzg9BcRuM;i z@VLwrzaJyM*oYH^1h|-k!0`sWBeicj0W%b~f35A@py2A}z~^U$P(GJoO-FxhTo;=t+yBf z{#V5FU=5tzCFlJWLRM^kTJ2U~2l7rfHJAe>&I&|0$qGp;3{pi};U2x!-(-a(Tt;wSx8(JDL(OLoI)zvuWO&!HXF_IKGv+yrv-Eicb7Xrh-OxM7$3Ypa zq$sX5Zf4k}p2lwK9986AMkIny!KR*~od+lh^(Z*A&GKPIU+XA?hi<%tlKc$SsO=fc zXE>EZHp5ArYv<{kJ0;41a5_8mU^`5M&k$vEY|6ICufo1?i#3n4E$2m$Za7Vve34^v z4tJA9M^@LX&OIPV(f7UWs7{&JvTRgY`)YA2p~gOq35HjpErqi|(&E(ph=jD4hdPgPJH#AVZ$e(G;YuM9QOX1A^J(A`T*0Q z7Dn}xtiWvA=Nw6DewezkE+dKS-uwgY$prMywFzKXJ?4Z*pyoMDQoVt^)(?}L)xj&VEH6JlAphD_B3`qNJR;Y!yRwQ53p(wx73`0j;{Lz1RumQt}yTq_MN^%v| z&Zj*icYasjInxD~pPnF7wyCT4pDn<|8Lzdwn$UhptX%kljar|frn-V1-02|k8a?^V z91f#$H^kvt;w4)_YcL_H^c^khK~}CK?-Y3;x8I(qpJMYr(K$JCgIO=@MY0}OCf=EH zi2p$L|H^?Wa3J)XYr@Zd#P@F#u%p+{NBfsoWO)?X+w9@lx!L*o K;(TTH?7sn8)*;3K literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/__pycache__/modutils.cpython-37.pyc b/venv/Lib/site-packages/astroid/__pycache__/modutils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b29f554d9f97c151fd8657b54ca5a4331f26c0bd GIT binary patch literal 17174 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/__pycache__/node_classes.cpython-37.pyc b/venv/Lib/site-packages/astroid/__pycache__/node_classes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f816b7b0f04bbf6ce34ac557544ade15b191bd01 GIT binary patch literal 118497 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/__pycache__/nodes.cpython-37.pyc b/venv/Lib/site-packages/astroid/__pycache__/nodes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..558fa82de969571ff1d82994ea6376f623ac4b8b GIT binary patch literal 1937 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/__pycache__/protocols.cpython-37.pyc b/venv/Lib/site-packages/astroid/__pycache__/protocols.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8190680b61721950762195e2c361ba6519ac7982 GIT binary patch literal 16135 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

gM z8IaQP)6u(Q3))%D>xpPdl=+^3S;m1VXM&~OsRfuWZgkzlRkdUXh&@?idF#TD;_4Ev z=T%M#5VqnU+{bb{_)%Ud+SY)LG)BuOUr4)h^S8sVAOc*T-3opYCbT9D!g=a*UB+b# zk5)GC+_pyPm`{~wcWi$0g=FPtySFrZbKrtbX~G@9i8-ghD3VWsTK#eezf9jAB}%o) zPl7&P26oFwYuMn*9a7*OS@dkX&2=W_nnbv^WTOG|%EXm)7=UB6b5m)mD#2!Q%(_KY z>U(sNwWF%kvNpLz_Xp@6I|x?bj;Rh`i2;_X%fF_)WpoN>tVcNWZQj@pnsQ1ae`_ah zsx}D>@qzNu4>WoLL=`K-z-f%JhpEJyjB`obo=3TMK8;n%MuXj3ZKz&^BZ1*A>IJV7 zQ7?ZWKOLgGJJ9&r^C=K*ylN=VGD1N)QXc|5t@CJLJJeM8%|IKz8RjJJX!U$m7?S^$=LFDvPNV2$smsDX zFX!cPKOwtO0$hA-ptY@6xa%;w2~EiJR*5EheWD46dLAaUat^xnAhaP`LLdIA*302w zV>dOgml6G(fqFK@wRDHt)y(2uQai}whxea1fPYJB=$&L@oysVE*oRI8>onb_S z(e8B{Yukb3G%v~?(Si#sAH?g5@~U*>~Ss`YY^EcV7+c ztC8&Mf#?ACb>Dq^@i*s;WOomA=^A}DQF&$0T3gh|muR!=5Vkl{O*KuT&^9ZdM^;G? z6Y@tPNZ)1;p5VJkc-{>XuvZk&XA6_ef=L_%t}KL$;CCZ1@n)21fZVWH5*^m+`h4PAWHXIlH7Cym%6Sg_zo=dQxBh`bL zvEq#yoc;MNwT4_J>*iph5>s(jtEV`Jqu{&Ci-A6KrpS(SzP@jU+fawAo{upW;E~~g zPDoU=|7W0Q<%joWAd+17?Dh9%ksYPY^Q%2rH!WWw=Q1 zdZ~Yb9&2ZAz|?}xyhJet*9BBszk zV_)JX&fykE)1M9FyrTOQ;PQjSYd>HMZnq*<)z6W*d4v?gdaE9)RhIpf30V^dXw5pV zGttzlJh9_3tdQz)wzaXTv90C7-2!KzBN%y9%iTSAB7T9(9qyhjWe_NH;k>&GM`c|yX1!a|yH?d}`5A%r z&oVmGg%)RZ3wM}OgmY*imXy}!wMm=Y9s$u&p6Jh;M!ExSl^su#rT#lw8O2f`#SIUQ z@(?_Eiw0!TIw+y%qJ*ReVLWE#xWehZ7ly^u#r_Ze>x+_IaDphW!#tO{STP2roDM@+uOuY|nz4DN*fYhrE+iCgMk>aFs?)DBhyH;2vQ$7`B8 zZ8mk7Nc5llquEI!dkmDzEjxV|i9F)=HEV0Qn!2#q#>EGQnIujwU$)7|P3i$#^(PmU zFHhdMcx6Jp&a!>iCNI1-dH%-aM0HE8yXWlNZ(N>4q;P_Fnspa7Im ziPtXp=@Vj?xS6bYI;KCdbPW6)yJ{!Ecgq8t~IBFdZ1sqvp!&$;qI@-~v};J$%5`qSdlu5v z(zB=LQeB5nuJkvlXZE5;@Jl2PITAd{kmk039uir3JMU<2Be!h-&)Zq61P&|V9Gw5; zG5!~wd?tnF=n(1lw1l2T1WbqQfxQ@|KVKRc#Z2r02kBt`Ft~Mq@5O#eIZr$PT(Ky8 ZTrB4B&XS{OhqC+&_&p_cf5SNb{{c;-Y;phq literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/__pycache__/raw_building.cpython-37.pyc b/venv/Lib/site-packages/astroid/__pycache__/raw_building.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0669a635a97cedf2ea0d31ac2d492b083a5ba2d5 GIT binary patch literal 10846 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/__pycache__/scoped_nodes.cpython-37.pyc b/venv/Lib/site-packages/astroid/__pycache__/scoped_nodes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0dce6f0ace399d7debc1032a179708046b4207c4 GIT binary patch literal 70038 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

vWK{Q#?6tcZ0(-v&m5iXq+xuPSN@}z6k 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 KFSl(p{{I2$?GwNN literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/__pycache__/test_utils.cpython-37.pyc b/venv/Lib/site-packages/astroid/__pycache__/test_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..442b6a78fc42b72dcf864c1aa21a3deefe409957 GIT binary patch literal 2490 zcmb7G+iuiG7@iq>y@!MVJw!k$9VBRFDl8BbwJ1cSfKa7&RVkFh5@Z?AIC0i%o0(aX zY&TpqsS+-F(Kmq0K1px-1itMRufSFRe|EDWZJ}aT^UvAy&G(=7>qCcH1WNDH9}oU) z5b_re_KE|Y>rnMw5Q21wpn_$zLv71C%(hO)v8~&2p>?ua&+B-Uh?a0gZJT!LVoG?T z4!wq?t4+}m&26$pJ1xN$i9bEK{)0)g)NJsipT{OGa?O)MaU-?iaUmo(E0N)SEj5p{ zQAH~F!r~nq@H8*`CU^cA) zL@4#aeSV|pm64MCiBuY(@FL;mhFO7Lnj5J~B|&mi04T|q(;)P9BaA^VyA2obMVP&E{2QTt3O zh&<#|sC$}Ucq2FQij2GA8E{aT7wKWx$2$&{SJsxqR zP685en&Z%@6DW@21Xbwo%6iL({|VtVtdHISZ#Y9;HcL-52En_%!>4Ua5CE`uTNG#T zX0*e9!5ZN?{Es_6KqR=IxUJ@qqv|a5Vze$Sdrpe2%{AamHcf6f(3T8cWutgL1gC|_ z>>P~D6aPkd%NU#A+oVIfN_I&X+-69BV~^d%FG@|qD+rX>VT$XAR zLo%EH0uiCJdSq~VS(*^fhL|Z|i=UI-zSEhpSu`w?FwP>a6`rl!Hs0uTS`gNi2@_TH z?44CD&4pYa@i>NIwRz~kRhRcb5UM_h{=_>mJz*e?al<(f26G>Ukc648B?zV_%x-p` zjpoPM&1qL&l&wV@S{;UykgyuyDmjFHFj1ZMAc7}p2KgF7dwskz;s~`kQu2(SGk=L3HZl zbZ5!4mSUe>&5V!qqC8rb%6|PdNc*@NbG<_JGdVv6pVLP`xZuI|$EKYYZ@GU1c=l`x literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/__pycache__/transforms.cpython-37.pyc b/venv/Lib/site-packages/astroid/__pycache__/transforms.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30af013db47613294e3ad5088108315435f91da8 GIT binary patch literal 3297 zcmbVOTW{1x6rQoYmlz1)(zFyLrUg_sDyz~+EsdfG3N5WfQv?B|ZIEL;v%4l4>9dil%28+M_ zuzHk`-|?gT+0eNTk9r>(PB@K7hukLI;`U3z?Om%wIlWI>&L1#ORs(FyU$yrRj0gfN zNyp-}W9Pd&4tIF%CF#_7oj2fJ=S@BX?*>1?kMN@}X{X6g@?(4!dNceupMyDgxcVQCEE zD`j?Whf&0|zX@Z$6sQB|rBM1~w(Uoo=6o=srO3C-Q5+Y8M!@v&#wdX&6>*S^VlAZL zEKay+o0S1AV8=Hie-j=x2aP7LsJ33ylz28LfF50KIoXjQi6Rl`Fo{)mgo~~}iZl-c zojFmcbmmS~w`k@l5p{ndvI+A3?A%;hf1rd^>)+kDef!%NSKGI~y1#y7IK1U+fBjAZ zz^$)|!Ek*T4zGkUU>!wQ`iqO=>hmwU>ji4nd#a~B+{v1r7sjFXym#>U7Bqy8&#aX` zES%jgR|RGTENZ}0Sta4_D(xU7KK=U1FrZCTlj=b5*K{hjlFbM-+!y?dW9GEvVxZU-t_3y#A!iG3?>ROKF(pfr3 zn|6~r@Li|lvj^Q!?XDbA0|EG$@Vf;a4N!5qYssbOZEy+&*e^~jZKdFfU29^eC~`F}XaYJgzi58wEhE0Y5QTtm+QZ^L!4yTIKP zGB5It|2fe6J<$Vjg=8DL>4EQ4D_?ij)^{>=HJY zvB64mPh+SQ85|R=DO;Nj$AaQxz6n3qbsdSbaD_3tOn=XABg_;u&E@=TEBIxAY}$VV D5y)3E literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/__pycache__/util.cpython-37.pyc b/venv/Lib/site-packages/astroid/__pycache__/util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbdd5337cd5ec6ad23939ab7854e6449602d475d GIT binary patch literal 5712 zcma)AO>^7E8O9e$kd$P}cAU85PT{o4gdK;q<8+#+Zbtr!olZ=rW4oQQn!!NWr3eWG zm|f7e7^*X^Jkwr!?WqU*)akG2vHt1SD$m}=q+!QT5w~nlS3r}saf~OVPIA)C?bn0Y;b7szrBcfvWLM*6$HhNoV`T{P}=$pdmTfz~RuwR%^mtLt&KZt|rfiI*E zRW#00)x8m?VG!%jx_7FvuT=W{pcfKB`q7&I>bf(fsRQE|1#oh6N zB2f_(h9+AY=Je`!)wnyC8wxqO>-$MClF+B+`=eA$V(PE>{@0TrE@qe&tFmxuf@yx{ zgfTbf^0=m2MIQ#+V6oDjJsD>Hm@J;x*zlOMG0f}UpnF1>b)riO8|GPC5tk~GD57d; z7nj&}0Z zqFdUDrABbKOS6%+3QgEJ?u|GY?TFyBi^L1fn0}x2Du}#}$oaaCr6}yw8C*K1dW-rL zK=VFRZ7+~`89HCq>`i^t}2ac$rUl(=Jz#VWPnz*~t z?E?x#8~v78LHMuc?I%f;45SKnVmZC}Xe`4hh&>*Xh$$vK?ER!_Zy{@eoO;5(_mvzg-~R!I=6P^_K}v*r zu^{9m!792F3+8nnof*8pZ>jYR{y#GR2-rb9*sn}=6+PIAdYS#wnZp3qJ6M0`*cdRQ zQ|skUBA;hdkFMTGX2Vo?dYDdP;U#J2?MM%q9!rs1$gp}4hH{*BYWdpDEK||WB$IcQ zN>$zhh^S0Ii?U(v%0v{sdSTssowGNXzXJHN6xjyMtMIEVq%LFThiHsvhUwz(yt#tw ziaEV>+)%)>1*(;EY`jg*c}P^qax+ra>=k~oOWuLn)p>pY8Qqt7iS+jUD@1}FVNOqY zsaQ}kC5Fo);`9F#4LfNHK0i5~PqCni22zgNZF-{s4~mB)>(H86<@RIs`WsIp9cBLH zb@(Ie8>PWIg$?=*UIhO+gGmyeFoL=S4j&U2GNEC%%<0)h^B2L;>$DZ^_^M5p6<~>;`xuzpD4>@;;5X0pe*gl`6#?v07mNIv6OOXp(WywHy=8a+|L0+K$D^ z7Gk#gkps5Sc=>VoKm^$Nxm$sFI0hVKQJOrES_ivw`p<`q^d$xq`|pm_Uf?}G7#9KV zrC~Tx3b3Hlkpwg-32gAPA>9Bkj3wbPh>}*z!|(ABP=bHTp&;?(bIKdAyy78eKsZd3 z42z{I0jT6XOk<&$Y6i}bAQ4QC_()2$a@|~-F3)01JmCV>fen`0lj8XkG7!bITT}FW z%z`!sw$L|I(3yU z9C20HQH2pDNFSfs)Um=a>-d{qK20^icJW392qa}CDQ%K~YxBsYDshi?c&nE;hBAic z8hA)MVcsqP(Bt`&FPiX<$Uwi<=8?c?#y^erKCyN zl9~Iix4UmWvif`|m!%ehK1D*^tZAFUXir!N{#U*bBn&2-=cJn%3 z8wD8$T^WV_m69%dTwSL(?2+C*VL0_;OguqjSTnE@wk$LgC?Ak2gzlOu2142l z_&P8P6JIp4ny~(6;Ts4x3O>owmm8PAh18}$yCg2u-%z25qo~Vk|p8YCw|eN0lERkZDW!^FqDPCV*d>3FsC$`#Njsd(0ou z%A+oy_5C1@0=?v@ThATd)o3s01F!PXqgp{k_)y@p(K>d&#RT{hh599}s4?AA5FRSd zg6#!G7I1TbCKv?@tbtSWYjd41c z^4Zi5{tg>`8I7WBp=J$6=_JXzMb)}|lDtDDhDWD64_gKAV{~|?NJgDT<6MZ!=i@Yy zNroeKe1M{N9H$h>-Z<4d!T}taq$hEvOLm*%Km{W&%BUVs)u#7FRZ8zl)W$SO%wv+7 z8Ei7S zRJbo3aJ(Sns6;k;(V&n58U%>GqAD+>DcD3wRx)SGdegf(SNj0GMKp-Otx~Jd2AeLb z3AO^1CtYA9p6Y#$f{Fk|Q59BJSom01>WhzeP_FNy=)iX!^+us}hE0ZiDUT*EC~9cS zHrCgvZa|)^U*V~

This is a doc

') + + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, **kwargs) + + +def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML fragment as a string or file-like object into a tree + + :arg doc: the fragment to parse as a string or file-like object + + :arg container: the container context to parse the fragment in + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import parseFragment + >>> parseFragment('this is a fragment') + + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parseFragment(doc, container=container, **kwargs) + + +def method_decorator_metaclass(function): + class Decorated(type): + def __new__(meta, classname, bases, classDict): + for attributeName, attribute in classDict.items(): + if isinstance(attribute, types.FunctionType): + attribute = function(attribute) + + classDict[attributeName] = attribute + return type.__new__(meta, classname, bases, classDict) + return Decorated + + +class HTMLParser(object): + """HTML parser + + Generates a tree structure from a stream of (possibly malformed) HTML. + + """ + + def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): + """ + :arg tree: a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + + :arg strict: raise an exception when a parse error is encountered + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :arg debug: whether or not to enable debug mode which logs things + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() # generates parser with etree builder + >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict + + """ + + # Raise an exception on the first error encountered + self.strict = strict + + if tree is None: + tree = treebuilders.getTreeBuilder("etree") + self.tree = tree(namespaceHTMLElements) + self.errors = [] + + self.phases = dict([(name, cls(self, self.tree)) for name, cls in + getPhases(debug).items()]) + + def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): + + self.innerHTMLMode = innerHTML + self.container = container + self.scripting = scripting + self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) + self.reset() + + try: + self.mainLoop() + except _ReparseException: + self.reset() + self.mainLoop() + + def reset(self): + self.tree.reset() + self.firstStartTag = False + self.errors = [] + self.log = [] # only used with debug mode + # "quirks" / "limited quirks" / "no quirks" + self.compatMode = "no quirks" + + if self.innerHTMLMode: + self.innerHTML = self.container.lower() + + if self.innerHTML in cdataElements: + self.tokenizer.state = self.tokenizer.rcdataState + elif self.innerHTML in rcdataElements: + self.tokenizer.state = self.tokenizer.rawtextState + elif self.innerHTML == 'plaintext': + self.tokenizer.state = self.tokenizer.plaintextState + else: + # state already is data state + # self.tokenizer.state = self.tokenizer.dataState + pass + self.phase = self.phases["beforeHtml"] + self.phase.insertHtmlElement() + self.resetInsertionMode() + else: + self.innerHTML = False # pylint:disable=redefined-variable-type + self.phase = self.phases["initial"] + + self.lastPhase = None + + self.beforeRCDataPhase = None + + self.framesetOK = True + + @property + def documentEncoding(self): + """Name of the character encoding that was used to decode the input stream, or + :obj:`None` if that is not determined yet + + """ + if not hasattr(self, 'tokenizer'): + return None + return self.tokenizer.stream.charEncoding[0].name + + def isHTMLIntegrationPoint(self, element): + if (element.name == "annotation-xml" and + element.namespace == namespaces["mathml"]): + return ("encoding" in element.attributes and + element.attributes["encoding"].translate( + asciiUpper2Lower) in + ("text/html", "application/xhtml+xml")) + else: + return (element.namespace, element.name) in htmlIntegrationPointElements + + def isMathMLTextIntegrationPoint(self, element): + return (element.namespace, element.name) in mathmlTextIntegrationPointElements + + def mainLoop(self): + CharactersToken = tokenTypes["Characters"] + SpaceCharactersToken = tokenTypes["SpaceCharacters"] + StartTagToken = tokenTypes["StartTag"] + EndTagToken = tokenTypes["EndTag"] + CommentToken = tokenTypes["Comment"] + DoctypeToken = tokenTypes["Doctype"] + ParseErrorToken = tokenTypes["ParseError"] + + for token in self.normalizedTokens(): + prev_token = None + new_token = token + while new_token is not None: + prev_token = new_token + currentNode = self.tree.openElements[-1] if self.tree.openElements else None + currentNodeNamespace = currentNode.namespace if currentNode else None + currentNodeName = currentNode.name if currentNode else None + + type = new_token["type"] + + if type == ParseErrorToken: + self.parseError(new_token["data"], new_token.get("datavars", {})) + new_token = None + else: + if (len(self.tree.openElements) == 0 or + currentNodeNamespace == self.tree.defaultNamespace or + (self.isMathMLTextIntegrationPoint(currentNode) and + ((type == StartTagToken and + token["name"] not in frozenset(["mglyph", "malignmark"])) or + type in (CharactersToken, SpaceCharactersToken))) or + (currentNodeNamespace == namespaces["mathml"] and + currentNodeName == "annotation-xml" and + type == StartTagToken and + token["name"] == "svg") or + (self.isHTMLIntegrationPoint(currentNode) and + type in (StartTagToken, CharactersToken, SpaceCharactersToken))): + phase = self.phase + else: + phase = self.phases["inForeignContent"] + + if type == CharactersToken: + new_token = phase.processCharacters(new_token) + elif type == SpaceCharactersToken: + new_token = phase.processSpaceCharacters(new_token) + elif type == StartTagToken: + new_token = phase.processStartTag(new_token) + elif type == EndTagToken: + new_token = phase.processEndTag(new_token) + elif type == CommentToken: + new_token = phase.processComment(new_token) + elif type == DoctypeToken: + new_token = phase.processDoctype(new_token) + + if (type == StartTagToken and prev_token["selfClosing"] and + not prev_token["selfClosingAcknowledged"]): + self.parseError("non-void-element-with-trailing-solidus", + {"name": prev_token["name"]}) + + # When the loop finishes it's EOF + reprocess = True + phases = [] + while reprocess: + phases.append(self.phase) + reprocess = self.phase.processEOF() + if reprocess: + assert self.phase not in phases + + def normalizedTokens(self): + for token in self.tokenizer: + yield self.normalizeToken(token) + + def parse(self, stream, *args, **kwargs): + """Parse a HTML document into a well-formed tree + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element). + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parse('

This is a doc

') + + + """ + self._parse(stream, False, None, *args, **kwargs) + return self.tree.getDocument() + + def parseFragment(self, stream, *args, **kwargs): + """Parse a HTML fragment into a well-formed tree fragment + + :arg container: name of the element we're setting the innerHTML + property if set to None, default to 'div' + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parseFragment('this is a fragment') + + + """ + self._parse(stream, True, *args, **kwargs) + return self.tree.getFragment() + + def parseError(self, errorcode="XXX-undefined-error", datavars=None): + # XXX The idea is to make errorcode mandatory. + if datavars is None: + datavars = {} + self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) + if self.strict: + raise ParseError(E[errorcode] % datavars) + + def normalizeToken(self, token): + # HTML5 specific normalizations to the token stream + if token["type"] == tokenTypes["StartTag"]: + raw = token["data"] + token["data"] = OrderedDict(raw) + if len(raw) > len(token["data"]): + # we had some duplicated attribute, fix so first wins + token["data"].update(raw[::-1]) + + return token + + def adjustMathMLAttributes(self, token): + adjust_attributes(token, adjustMathMLAttributes) + + def adjustSVGAttributes(self, token): + adjust_attributes(token, adjustSVGAttributes) + + def adjustForeignAttributes(self, token): + adjust_attributes(token, adjustForeignAttributesMap) + + def reparseTokenNormal(self, token): + # pylint:disable=unused-argument + self.parser.phase() + + def resetInsertionMode(self): + # The name of this method is mostly historical. (It's also used in the + # specification.) + last = False + newModes = { + "select": "inSelect", + "td": "inCell", + "th": "inCell", + "tr": "inRow", + "tbody": "inTableBody", + "thead": "inTableBody", + "tfoot": "inTableBody", + "caption": "inCaption", + "colgroup": "inColumnGroup", + "table": "inTable", + "head": "inBody", + "body": "inBody", + "frameset": "inFrameset", + "html": "beforeHead" + } + for node in self.tree.openElements[::-1]: + nodeName = node.name + new_phase = None + if node == self.tree.openElements[0]: + assert self.innerHTML + last = True + nodeName = self.innerHTML + # Check for conditions that should only happen in the innerHTML + # case + if nodeName in ("select", "colgroup", "head", "html"): + assert self.innerHTML + + if not last and node.namespace != self.tree.defaultNamespace: + continue + + if nodeName in newModes: + new_phase = self.phases[newModes[nodeName]] + break + elif last: + new_phase = self.phases["inBody"] + break + + self.phase = new_phase + + def parseRCDataRawtext(self, token, contentType): + # Generic RCDATA/RAWTEXT Parsing algorithm + assert contentType in ("RAWTEXT", "RCDATA") + + self.tree.insertElement(token) + + if contentType == "RAWTEXT": + self.tokenizer.state = self.tokenizer.rawtextState + else: + self.tokenizer.state = self.tokenizer.rcdataState + + self.originalPhase = self.phase + + self.phase = self.phases["text"] + + +@_utils.memoize +def getPhases(debug): + def log(function): + """Logger that records which phase processes each token""" + type_names = dict((value, key) for key, value in + tokenTypes.items()) + + def wrapped(self, *args, **kwargs): + if function.__name__.startswith("process") and len(args) > 0: + token = args[0] + try: + info = {"type": type_names[token['type']]} + except: + raise + if token['type'] in tagTokenTypes: + info["name"] = token['name'] + + self.parser.log.append((self.parser.tokenizer.state.__name__, + self.parser.phase.__class__.__name__, + self.__class__.__name__, + function.__name__, + info)) + return function(self, *args, **kwargs) + else: + return function(self, *args, **kwargs) + return wrapped + + def getMetaclass(use_metaclass, metaclass_func): + if use_metaclass: + return method_decorator_metaclass(metaclass_func) + else: + return type + + # pylint:disable=unused-argument + class Phase(with_metaclass(getMetaclass(debug, log))): + """Base class for helper object that implements each phase of processing + """ + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + + def processEOF(self): + raise NotImplementedError + + def processComment(self, token): + # For most phases the following is correct. Where it's not it will be + # overridden. + self.tree.insertComment(token, self.tree.openElements[-1]) + + def processDoctype(self, token): + self.parser.parseError("unexpected-doctype") + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processSpaceCharacters(self, token): + self.tree.insertText(token["data"]) + + def processStartTag(self, token): + return self.startTagHandler[token["name"]](token) + + def startTagHtml(self, token): + if not self.parser.firstStartTag and token["name"] == "html": + self.parser.parseError("non-html-root") + # XXX Need a check here to see if the first start tag token emitted is + # this token... If it's not, invoke self.parser.parseError(). + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[0].attributes: + self.tree.openElements[0].attributes[attr] = value + self.parser.firstStartTag = False + + def processEndTag(self, token): + return self.endTagHandler[token["name"]](token) + + class InitialPhase(Phase): + def processSpaceCharacters(self, token): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + correct = token["correct"] + + if (name != "html" or publicId is not None or + systemId is not None and systemId != "about:legacy-compat"): + self.parser.parseError("unknown-doctype") + + if publicId is None: + publicId = "" + + self.tree.insertDoctype(token) + + if publicId != "": + publicId = publicId.translate(asciiUpper2Lower) + + if (not correct or token["name"] != "html" or + publicId.startswith( + ("+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//")) or + publicId in ("-//w3o//dtd w3 html strict 3.0//en//", + "-/w3c/dtd html 4.0 transitional/en", + "html") or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is None or + systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): + self.parser.compatMode = "quirks" + elif (publicId.startswith( + ("-//w3c//dtd xhtml 1.0 frameset//", + "-//w3c//dtd xhtml 1.0 transitional//")) or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is not None): + self.parser.compatMode = "limited quirks" + + self.parser.phase = self.parser.phases["beforeHtml"] + + def anythingElse(self): + self.parser.compatMode = "quirks" + self.parser.phase = self.parser.phases["beforeHtml"] + + def processCharacters(self, token): + self.parser.parseError("expected-doctype-but-got-chars") + self.anythingElse() + return token + + def processStartTag(self, token): + self.parser.parseError("expected-doctype-but-got-start-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEndTag(self, token): + self.parser.parseError("expected-doctype-but-got-end-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEOF(self): + self.parser.parseError("expected-doctype-but-got-eof") + self.anythingElse() + return True + + class BeforeHtmlPhase(Phase): + # helper methods + def insertHtmlElement(self): + self.tree.insertRoot(impliedTagToken("html", "StartTag")) + self.parser.phase = self.parser.phases["beforeHead"] + + # other + def processEOF(self): + self.insertHtmlElement() + return True + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.insertHtmlElement() + return token + + def processStartTag(self, token): + if token["name"] == "html": + self.parser.firstStartTag = True + self.insertHtmlElement() + return token + + def processEndTag(self, token): + if token["name"] not in ("head", "body", "html", "br"): + self.parser.parseError("unexpected-end-tag-before-html", + {"name": token["name"]}) + else: + self.insertHtmlElement() + return token + + class BeforeHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("head", "body", "html", "br"), self.endTagImplyHead) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.startTagHead(impliedTagToken("head", "StartTag")) + return True + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.tree.insertElement(token) + self.tree.headPointer = self.tree.openElements[-1] + self.parser.phase = self.parser.phases["inHead"] + + def startTagOther(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagImplyHead(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagOther(self, token): + self.parser.parseError("end-tag-after-implied-root", + {"name": token["name"]}) + + class InHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("title", self.startTagTitle), + (("noframes", "style"), self.startTagNoFramesStyle), + ("noscript", self.startTagNoscript), + ("script", self.startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + self.startTagBaseLinkCommand), + ("meta", self.startTagMeta), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("head", self.endTagHead), + (("br", "html", "body"), self.endTagHtmlBodyBr) + ]) + self.endTagHandler.default = self.endTagOther + + # the real thing + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.parser.parseError("two-heads-are-not-better-than-one") + + def startTagBaseLinkCommand(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMeta(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + attributes = token["data"] + if self.parser.tokenizer.stream.charEncoding[1] == "tentative": + if "charset" in attributes: + self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) + elif ("content" in attributes and + "http-equiv" in attributes and + attributes["http-equiv"].lower() == "content-type"): + # Encoding it as UTF-8 here is a hack, as really we should pass + # the abstract Unicode string, and just use the + # ContentAttrParser on that, but using UTF-8 allows all chars + # to be encoded and as a ASCII-superset works. + data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) + parser = _inputstream.ContentAttrParser(data) + codec = parser.parse() + self.parser.tokenizer.stream.changeEncoding(codec) + + def startTagTitle(self, token): + self.parser.parseRCDataRawtext(token, "RCDATA") + + def startTagNoFramesStyle(self, token): + # Need to decide whether to implement the scripting-disabled case + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagNoscript(self, token): + if self.parser.scripting: + self.parser.parseRCDataRawtext(token, "RAWTEXT") + else: + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inHeadNoscript"] + + def startTagScript(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState + self.parser.originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["text"] + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHead(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "head", "Expected head got %s" % node.name + self.parser.phase = self.parser.phases["afterHead"] + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.endTagHead(impliedTagToken("head")) + + class InHeadNoscriptPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), + (("head", "noscript"), self.startTagHeadNoscript), + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("noscript", self.endTagNoscript), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.parseError("eof-in-head-noscript") + self.anythingElse() + return True + + def processComment(self, token): + return self.parser.phases["inHead"].processComment(token) + + def processCharacters(self, token): + self.parser.parseError("char-in-head-noscript") + self.anythingElse() + return token + + def processSpaceCharacters(self, token): + return self.parser.phases["inHead"].processSpaceCharacters(token) + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBaseLinkCommand(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagHeadNoscript(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagNoscript(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "noscript", "Expected noscript got %s" % node.name + self.parser.phase = self.parser.phases["inHead"] + + def endTagBr(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + # Caller must raise parse error first! + self.endTagNoscript(impliedTagToken("noscript")) + + class AfterHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + self.startTagFromHead), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), + self.endTagHtmlBodyBr)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBody(self, token): + self.parser.framesetOK = False + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inBody"] + + def startTagFrameset(self, token): + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagFromHead(self, token): + self.parser.parseError("unexpected-start-tag-out-of-my-head", + {"name": token["name"]}) + self.tree.openElements.append(self.tree.headPointer) + self.parser.phases["inHead"].processStartTag(token) + for node in self.tree.openElements[::-1]: + if node.name == "head": + self.tree.openElements.remove(node) + break + + def startTagHead(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.tree.insertElement(impliedTagToken("body", "StartTag")) + self.parser.phase = self.parser.phases["inBody"] + self.parser.framesetOK = True + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + # Set this to the default handler + self.processSpaceCharacters = self.processSpaceCharactersNonPre + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("base", "basefont", "bgsound", "command", "link", "meta", + "script", "style", "title"), + self.startTagProcessInHead), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("address", "article", "aside", "blockquote", "center", "details", + "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", + "section", "summary", "ul"), + self.startTagCloseP), + (headingElements, self.startTagHeading), + (("pre", "listing"), self.startTagPreListing), + ("form", self.startTagForm), + (("li", "dd", "dt"), self.startTagListItem), + ("plaintext", self.startTagPlaintext), + ("a", self.startTagA), + (("b", "big", "code", "em", "font", "i", "s", "small", "strike", + "strong", "tt", "u"), self.startTagFormatting), + ("nobr", self.startTagNobr), + ("button", self.startTagButton), + (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), + ("xmp", self.startTagXmp), + ("table", self.startTagTable), + (("area", "br", "embed", "img", "keygen", "wbr"), + self.startTagVoidFormatting), + (("param", "source", "track"), self.startTagParamSource), + ("input", self.startTagInput), + ("hr", self.startTagHr), + ("image", self.startTagImage), + ("isindex", self.startTagIsIndex), + ("textarea", self.startTagTextarea), + ("iframe", self.startTagIFrame), + ("noscript", self.startTagNoscript), + (("noembed", "noframes"), self.startTagRawtext), + ("select", self.startTagSelect), + (("rp", "rt"), self.startTagRpRt), + (("option", "optgroup"), self.startTagOpt), + (("math"), self.startTagMath), + (("svg"), self.startTagSvg), + (("caption", "col", "colgroup", "frame", "head", + "tbody", "td", "tfoot", "th", "thead", + "tr"), self.startTagMisplaced) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("body", self.endTagBody), + ("html", self.endTagHtml), + (("address", "article", "aside", "blockquote", "button", "center", + "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", + "section", "summary", "ul"), self.endTagBlock), + ("form", self.endTagForm), + ("p", self.endTagP), + (("dd", "dt", "li"), self.endTagListItem), + (headingElements, self.endTagHeading), + (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", + "strike", "strong", "tt", "u"), self.endTagFormatting), + (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def isMatchingFormattingElement(self, node1, node2): + return (node1.name == node2.name and + node1.namespace == node2.namespace and + node1.attributes == node2.attributes) + + # helper + def addFormattingElement(self, token): + self.tree.insertElement(token) + element = self.tree.openElements[-1] + + matchingElements = [] + for node in self.tree.activeFormattingElements[::-1]: + if node is Marker: + break + elif self.isMatchingFormattingElement(node, element): + matchingElements.append(node) + + assert len(matchingElements) <= 3 + if len(matchingElements) == 3: + self.tree.activeFormattingElements.remove(matchingElements[-1]) + self.tree.activeFormattingElements.append(element) + + # the real deal + def processEOF(self): + allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", + "tfoot", "th", "thead", "tr", "body", + "html")) + for node in self.tree.openElements[::-1]: + if node.name not in allowed_elements: + self.parser.parseError("expected-closing-tag-but-got-eof") + break + # Stop parsing + + def processSpaceCharactersDropNewline(self, token): + # Sometimes (start of
, , and ",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("

E-Z&qW}d;UKCDrj$sI0P D`4wBa literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/_ast.py b/venv/Lib/site-packages/astroid/_ast.py new file mode 100644 index 00000000..8fc6472c --- /dev/null +++ b/venv/Lib/site-packages/astroid/_ast.py @@ -0,0 +1,43 @@ +import ast +import sys +from collections import namedtuple +from typing import Optional + +_ast_py2 = _ast_py3 = None +try: + import typed_ast.ast3 as _ast_py3 + import typed_ast.ast27 as _ast_py2 +except ImportError: + pass + + +FunctionType = namedtuple('FunctionType', ['argtypes', 'returns']) + + +def _get_parser_module(parse_python_two: bool = False): + if parse_python_two: + parser_module = _ast_py2 + elif sys.version_info[:2] >= (3, 7): + # The typed_ast module doesn't support the full 3.7 syntax yet. + # Remove once typed_ast is updated. + parser_module = ast + else: + parser_module = _ast_py3 + return parser_module or ast + + +def _parse(string: str, + parse_python_two: bool = False): + return _get_parser_module(parse_python_two=parse_python_two).parse(string) + + +def parse_function_type_comment(type_comment: str) -> Optional[FunctionType]: + """Given a correct type comment, obtain a FunctionType object""" + if _ast_py3 is None: + return None + + func_type = _ast_py3.parse(type_comment, "", "func_type") + return FunctionType( + argtypes=func_type.argtypes, + returns=func_type.returns, + ) diff --git a/venv/Lib/site-packages/astroid/arguments.py b/venv/Lib/site-packages/astroid/arguments.py new file mode 100644 index 00000000..11d430a6 --- /dev/null +++ b/venv/Lib/site-packages/astroid/arguments.py @@ -0,0 +1,261 @@ +# Copyright (c) 2015-2016, 2018 Claudiu Popa +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2018 Bryce Guinta +# Copyright (c) 2018 Nick Drozd +# Copyright (c) 2018 Anthony Sottile + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + + +from astroid import bases +from astroid import context as contextmod +from astroid import exceptions +from astroid import nodes +from astroid import util + + +class CallSite: + """Class for understanding arguments passed into a call site + + It needs a call context, which contains the arguments and the + keyword arguments that were passed into a given call site. + In order to infer what an argument represents, call + :meth:`infer_argument` with the corresponding function node + and the argument name. + """ + + def __init__(self, callcontext, argument_context_map=None): + if argument_context_map is None: + argument_context_map = {} + self.argument_context_map = argument_context_map + args = callcontext.args + keywords = callcontext.keywords + self.duplicated_keywords = set() + self._unpacked_args = self._unpack_args(args) + self._unpacked_kwargs = self._unpack_keywords(keywords) + + self.positional_arguments = [ + arg for arg in self._unpacked_args + if arg is not util.Uninferable + ] + self.keyword_arguments = { + key: value for key, value in self._unpacked_kwargs.items() + if value is not util.Uninferable + } + + @classmethod + def from_call(cls, call_node): + """Get a CallSite object from the given Call node.""" + callcontext = contextmod.CallContext(call_node.args, + call_node.keywords) + return cls(callcontext) + + def has_invalid_arguments(self): + """Check if in the current CallSite were passed *invalid* arguments + + This can mean multiple things. For instance, if an unpacking + of an invalid object was passed, then this method will return True. + Other cases can be when the arguments can't be inferred by astroid, + for example, by passing objects which aren't known statically. + """ + return len(self.positional_arguments) != len(self._unpacked_args) + + def has_invalid_keywords(self): + """Check if in the current CallSite were passed *invalid* keyword arguments + + For instance, unpacking a dictionary with integer keys is invalid + (**{1:2}), because the keys must be strings, which will make this + method to return True. Other cases where this might return True if + objects which can't be inferred were passed. + """ + return len(self.keyword_arguments) != len(self._unpacked_kwargs) + + def _unpack_keywords(self, keywords): + values = {} + context = contextmod.InferenceContext() + context.extra_context = self.argument_context_map + for name, value in keywords: + if name is None: + # Then it's an unpacking operation (**) + try: + inferred = next(value.infer(context=context)) + except exceptions.InferenceError: + values[name] = util.Uninferable + continue + + if not isinstance(inferred, nodes.Dict): + # Not something we can work with. + values[name] = util.Uninferable + continue + + for dict_key, dict_value in inferred.items: + try: + dict_key = next(dict_key.infer(context=context)) + except exceptions.InferenceError: + values[name] = util.Uninferable + continue + if not isinstance(dict_key, nodes.Const): + values[name] = util.Uninferable + continue + if not isinstance(dict_key.value, str): + values[name] = util.Uninferable + continue + if dict_key.value in values: + # The name is already in the dictionary + values[dict_key.value] = util.Uninferable + self.duplicated_keywords.add(dict_key.value) + continue + values[dict_key.value] = dict_value + else: + values[name] = value + return values + + def _unpack_args(self, args): + values = [] + context = contextmod.InferenceContext() + context.extra_context = self.argument_context_map + for arg in args: + if isinstance(arg, nodes.Starred): + try: + inferred = next(arg.value.infer(context=context)) + except exceptions.InferenceError: + values.append(util.Uninferable) + continue + + if inferred is util.Uninferable: + values.append(util.Uninferable) + continue + if not hasattr(inferred, 'elts'): + values.append(util.Uninferable) + continue + values.extend(inferred.elts) + else: + values.append(arg) + return values + + def infer_argument(self, funcnode, name, context): + """infer a function argument value according to the call context + + Arguments: + funcnode: The function being called. + name: The name of the argument whose value is being inferred. + context: Inference context object + """ + if name in self.duplicated_keywords: + raise exceptions.InferenceError('The arguments passed to {func!r} ' + ' have duplicate keywords.', + call_site=self, func=funcnode, + arg=name, context=context) + + # Look into the keywords first, maybe it's already there. + try: + return self.keyword_arguments[name].infer(context) + except KeyError: + pass + + # Too many arguments given and no variable arguments. + if len(self.positional_arguments) > len(funcnode.args.args): + if not funcnode.args.vararg: + raise exceptions.InferenceError('Too many positional arguments ' + 'passed to {func!r} that does ' + 'not have *args.', + call_site=self, func=funcnode, + arg=name, context=context) + + positional = self.positional_arguments[:len(funcnode.args.args)] + vararg = self.positional_arguments[len(funcnode.args.args):] + argindex = funcnode.args.find_argname(name)[0] + kwonlyargs = {arg.name for arg in funcnode.args.kwonlyargs} + kwargs = { + key: value for key, value in self.keyword_arguments.items() + if key not in kwonlyargs + } + # If there are too few positionals compared to + # what the function expects to receive, check to see + # if the missing positional arguments were passed + # as keyword arguments and if so, place them into the + # positional args list. + if len(positional) < len(funcnode.args.args): + for func_arg in funcnode.args.args: + if func_arg.name in kwargs: + arg = kwargs.pop(func_arg.name) + positional.append(arg) + + if argindex is not None: + # 2. first argument of instance/class method + if argindex == 0 and funcnode.type in ('method', 'classmethod'): + if context.boundnode is not None: + boundnode = context.boundnode + else: + # XXX can do better ? + boundnode = funcnode.parent.frame() + + if isinstance(boundnode, nodes.ClassDef): + # Verify that we're accessing a method + # of the metaclass through a class, as in + # `cls.metaclass_method`. In this case, the + # first argument is always the class. + method_scope = funcnode.parent.scope() + if method_scope is boundnode.metaclass(): + return iter((boundnode, )) + + if funcnode.type == 'method': + if not isinstance(boundnode, bases.Instance): + boundnode = bases.Instance(boundnode) + return iter((boundnode,)) + if funcnode.type == 'classmethod': + return iter((boundnode,)) + # if we have a method, extract one position + # from the index, so we'll take in account + # the extra parameter represented by `self` or `cls` + if funcnode.type in ('method', 'classmethod'): + argindex -= 1 + # 2. search arg index + try: + return self.positional_arguments[argindex].infer(context) + except IndexError: + pass + + if funcnode.args.kwarg == name: + # It wants all the keywords that were passed into + # the call site. + if self.has_invalid_keywords(): + raise exceptions.InferenceError( + "Inference failed to find values for all keyword arguments " + "to {func!r}: {unpacked_kwargs!r} doesn't correspond to " + "{keyword_arguments!r}.", + keyword_arguments=self.keyword_arguments, + unpacked_kwargs=self._unpacked_kwargs, + call_site=self, func=funcnode, arg=name, context=context) + kwarg = nodes.Dict(lineno=funcnode.args.lineno, + col_offset=funcnode.args.col_offset, + parent=funcnode.args) + kwarg.postinit([(nodes.const_factory(key), value) + for key, value in kwargs.items()]) + return iter((kwarg, )) + if funcnode.args.vararg == name: + # It wants all the args that were passed into + # the call site. + if self.has_invalid_arguments(): + raise exceptions.InferenceError( + "Inference failed to find values for all positional " + "arguments to {func!r}: {unpacked_args!r} doesn't " + "correspond to {positional_arguments!r}.", + positional_arguments=self.positional_arguments, + unpacked_args=self._unpacked_args, + call_site=self, func=funcnode, arg=name, context=context) + args = nodes.Tuple(lineno=funcnode.args.lineno, + col_offset=funcnode.args.col_offset, + parent=funcnode.args) + args.postinit(vararg) + return iter((args, )) + + # Check if it's a default parameter. + try: + return funcnode.args.default_value(name).infer(context) + except exceptions.NoDefault: + pass + raise exceptions.InferenceError('No value found for argument {name} to ' + '{func!r}', call_site=self, + func=funcnode, arg=name, context=context) diff --git a/venv/Lib/site-packages/astroid/as_string.py b/venv/Lib/site-packages/astroid/as_string.py new file mode 100644 index 00000000..b6338509 --- /dev/null +++ b/venv/Lib/site-packages/astroid/as_string.py @@ -0,0 +1,587 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2009-2011, 2013-2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2010 Daniel Harding +# Copyright (c) 2013-2016, 2018 Claudiu Popa +# Copyright (c) 2013-2014 Google, Inc. +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2016 Jared Garst +# Copyright (c) 2016 Jakub Wilk +# Copyright (c) 2017 Łukasz Rogalski +# Copyright (c) 2017 rr- +# Copyright (c) 2018 brendanator +# Copyright (c) 2018 Nick Drozd + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""This module renders Astroid nodes as string: + +* :func:`to_code` function return equivalent (hopefully valid) python string + +* :func:`dump` function return an internal representation of nodes found + in the tree, useful for debugging or understanding the tree structure +""" +import sys + + +# pylint: disable=unused-argument + +DOC_NEWLINE = '\0' + + +class AsStringVisitor: + """Visitor to render an Astroid node as a valid python code string""" + + def __init__(self, indent): + self.indent = indent + + def __call__(self, node): + """Makes this visitor behave as a simple function""" + return node.accept(self).replace(DOC_NEWLINE, '\n') + + def _docs_dedent(self, doc): + """Stop newlines in docs being indented by self._stmt_list""" + return '\n%s"""%s"""' % (self.indent, doc.replace('\n', DOC_NEWLINE)) + + def _stmt_list(self, stmts, indent=True): + """return a list of nodes to string""" + stmts = '\n'.join( + [nstr for nstr in [n.accept(self) for n in stmts] if nstr]) + if indent: + return self.indent + stmts.replace('\n', '\n' + self.indent) + + return stmts + + def _precedence_parens(self, node, child, is_left=True): + """Wrap child in parens only if required to keep same semantics""" + if self._should_wrap(node, child, is_left): + return '(%s)' % child.accept(self) + + return child.accept(self) + + def _should_wrap(self, node, child, is_left): + """Wrap child if: + - it has lower precedence + - same precedence with position opposite to associativity direction + """ + node_precedence = node.op_precedence() + child_precedence = child.op_precedence() + + if node_precedence > child_precedence: + # 3 * (4 + 5) + return True + + if (node_precedence == child_precedence and + is_left != node.op_left_associative()): + # 3 - (4 - 5) + # (2**3)**4 + return True + + return False + + + ## visit_ methods ########################################### + + def visit_arguments(self, node): + """return an astroid.Function node as string""" + return node.format_args() + + def visit_assignattr(self, node): + """return an astroid.AssAttr node as string""" + return self.visit_attribute(node) + + def visit_assert(self, node): + """return an astroid.Assert node as string""" + if node.fail: + return 'assert %s, %s' % (node.test.accept(self), + node.fail.accept(self)) + return 'assert %s' % node.test.accept(self) + + def visit_assignname(self, node): + """return an astroid.AssName node as string""" + return node.name + + def visit_assign(self, node): + """return an astroid.Assign node as string""" + lhs = ' = '.join([n.accept(self) for n in node.targets]) + return '%s = %s' % (lhs, node.value.accept(self)) + + def visit_augassign(self, node): + """return an astroid.AugAssign node as string""" + return '%s %s %s' % (node.target.accept(self), node.op, node.value.accept(self)) + + def visit_annassign(self, node): + """Return an astroid.AugAssign node as string""" + + target = node.target.accept(self) + annotation = node.annotation.accept(self) + if node.value is None: + return '%s: %s' % (target, annotation) + return '%s: %s = %s' % (target, annotation, node.value.accept(self)) + + def visit_repr(self, node): + """return an astroid.Repr node as string""" + return '`%s`' % node.value.accept(self) + + def visit_binop(self, node): + """return an astroid.BinOp node as string""" + left = self._precedence_parens(node, node.left) + right = self._precedence_parens(node, node.right, is_left=False) + if node.op == '**': + return '%s%s%s' % (left, node.op, right) + + return '%s %s %s' % (left, node.op, right) + + def visit_boolop(self, node): + """return an astroid.BoolOp node as string""" + values = ['%s' % self._precedence_parens(node, n) for n in node.values] + return (' %s ' % node.op).join(values) + + def visit_break(self, node): + """return an astroid.Break node as string""" + return 'break' + + def visit_call(self, node): + """return an astroid.Call node as string""" + expr_str = self._precedence_parens(node, node.func) + args = [arg.accept(self) for arg in node.args] + if node.keywords: + keywords = [kwarg.accept(self) for kwarg in node.keywords] + else: + keywords = [] + + args.extend(keywords) + return '%s(%s)' % (expr_str, ', '.join(args)) + + def visit_classdef(self, node): + """return an astroid.ClassDef node as string""" + decorate = node.decorators.accept(self) if node.decorators else '' + bases = ', '.join([n.accept(self) for n in node.bases]) + if sys.version_info[0] == 2: + bases = '(%s)' % bases if bases else '' + else: + metaclass = node.metaclass() + if metaclass and not node.has_metaclass_hack(): + if bases: + bases = '(%s, metaclass=%s)' % (bases, metaclass.name) + else: + bases = '(metaclass=%s)' % metaclass.name + else: + bases = '(%s)' % bases if bases else '' + docs = self._docs_dedent(node.doc) if node.doc else '' + return '\n\n%sclass %s%s:%s\n%s\n' % (decorate, node.name, bases, docs, + self._stmt_list(node.body)) + + def visit_compare(self, node): + """return an astroid.Compare node as string""" + rhs_str = ' '.join([ + '%s %s' % (op, self._precedence_parens(node, expr, is_left=False)) + for op, expr in node.ops + ]) + return '%s %s' % (self._precedence_parens(node, node.left), rhs_str) + + def visit_comprehension(self, node): + """return an astroid.Comprehension node as string""" + ifs = ''.join([' if %s' % n.accept(self) for n in node.ifs]) + return 'for %s in %s%s' % (node.target.accept(self), + node.iter.accept(self), ifs) + + def visit_const(self, node): + """return an astroid.Const node as string""" + return repr(node.value) + + def visit_continue(self, node): + """return an astroid.Continue node as string""" + return 'continue' + + def visit_delete(self, node): # XXX check if correct + """return an astroid.Delete node as string""" + return 'del %s' % ', '.join([child.accept(self) + for child in node.targets]) + + def visit_delattr(self, node): + """return an astroid.DelAttr node as string""" + return self.visit_attribute(node) + + def visit_delname(self, node): + """return an astroid.DelName node as string""" + return node.name + + def visit_decorators(self, node): + """return an astroid.Decorators node as string""" + return '@%s\n' % '\n@'.join([item.accept(self) for item in node.nodes]) + + def visit_dict(self, node): + """return an astroid.Dict node as string""" + return '{%s}' % ', '.join(self._visit_dict(node)) + + def _visit_dict(self, node): + for key, value in node.items: + key = key.accept(self) + value = value.accept(self) + if key == '**': + # It can only be a DictUnpack node. + yield key + value + else: + yield '%s: %s' % (key, value) + + def visit_dictunpack(self, node): + return '**' + + def visit_dictcomp(self, node): + """return an astroid.DictComp node as string""" + return '{%s: %s %s}' % (node.key.accept(self), node.value.accept(self), + ' '.join([n.accept(self) for n in node.generators])) + + def visit_expr(self, node): + """return an astroid.Discard node as string""" + return node.value.accept(self) + + def visit_emptynode(self, node): + """dummy method for visiting an Empty node""" + return '' + + def visit_excepthandler(self, node): + if node.type: + if node.name: + excs = 'except %s, %s' % (node.type.accept(self), + node.name.accept(self)) + else: + excs = 'except %s' % node.type.accept(self) + else: + excs = 'except' + return '%s:\n%s' % (excs, self._stmt_list(node.body)) + + def visit_ellipsis(self, node): + """return an astroid.Ellipsis node as string""" + return '...' + + def visit_empty(self, node): + """return an Empty node as string""" + return '' + + def visit_exec(self, node): + """return an astroid.Exec node as string""" + if node.locals: + return 'exec %s in %s, %s' % (node.expr.accept(self), + node.locals.accept(self), + node.globals.accept(self)) + if node.globals: + return 'exec %s in %s' % (node.expr.accept(self), + node.globals.accept(self)) + return 'exec %s' % node.expr.accept(self) + + def visit_extslice(self, node): + """return an astroid.ExtSlice node as string""" + return ','.join([dim.accept(self) for dim in node.dims]) + + def visit_for(self, node): + """return an astroid.For node as string""" + fors = 'for %s in %s:\n%s' % (node.target.accept(self), + node.iter.accept(self), + self._stmt_list(node.body)) + if node.orelse: + fors = '%s\nelse:\n%s' % (fors, self._stmt_list(node.orelse)) + return fors + + def visit_importfrom(self, node): + """return an astroid.ImportFrom node as string""" + return 'from %s import %s' % ('.' * (node.level or 0) + node.modname, + _import_string(node.names)) + + def visit_functiondef(self, node): + """return an astroid.Function node as string""" + decorate = node.decorators.accept(self) if node.decorators else '' + docs = self._docs_dedent(node.doc) if node.doc else '' + trailer = ':' + if node.returns: + return_annotation = '->' + node.returns.as_string() + trailer = return_annotation + ":" + def_format = "\n%sdef %s(%s)%s%s\n%s" + return def_format % (decorate, node.name, + node.args.accept(self), + trailer, docs, + self._stmt_list(node.body)) + + def visit_generatorexp(self, node): + """return an astroid.GeneratorExp node as string""" + return '(%s %s)' % (node.elt.accept(self), + ' '.join([n.accept(self) for n in node.generators])) + + def visit_attribute(self, node): + """return an astroid.Getattr node as string""" + return '%s.%s' % (self._precedence_parens(node, node.expr), node.attrname) + + def visit_global(self, node): + """return an astroid.Global node as string""" + return 'global %s' % ', '.join(node.names) + + def visit_if(self, node): + """return an astroid.If node as string""" + ifs = ['if %s:\n%s' % (node.test.accept(self), self._stmt_list(node.body))] + if node.has_elif_block(): + ifs.append('el%s' % self._stmt_list(node.orelse, indent=False)) + elif node.orelse: + ifs.append('else:\n%s' % self._stmt_list(node.orelse)) + return '\n'.join(ifs) + + def visit_ifexp(self, node): + """return an astroid.IfExp node as string""" + return '%s if %s else %s' % ( + self._precedence_parens(node, node.body, is_left=True), + self._precedence_parens(node, node.test, is_left=True), + self._precedence_parens(node, node.orelse, is_left=False)) + + def visit_import(self, node): + """return an astroid.Import node as string""" + return 'import %s' % _import_string(node.names) + + def visit_keyword(self, node): + """return an astroid.Keyword node as string""" + if node.arg is None: + return '**%s' % node.value.accept(self) + return '%s=%s' % (node.arg, node.value.accept(self)) + + def visit_lambda(self, node): + """return an astroid.Lambda node as string""" + args = node.args.accept(self) + body = node.body.accept(self) + if args: + return 'lambda %s: %s' % (args, body) + + return 'lambda: %s' % body + + def visit_list(self, node): + """return an astroid.List node as string""" + return '[%s]' % ', '.join([child.accept(self) for child in node.elts]) + + def visit_listcomp(self, node): + """return an astroid.ListComp node as string""" + return '[%s %s]' % (node.elt.accept(self), + ' '.join([n.accept(self) for n in node.generators])) + + def visit_module(self, node): + """return an astroid.Module node as string""" + docs = '"""%s"""\n\n' % node.doc if node.doc else '' + return docs + '\n'.join([n.accept(self) for n in node.body]) + '\n\n' + + def visit_name(self, node): + """return an astroid.Name node as string""" + return node.name + + def visit_pass(self, node): + """return an astroid.Pass node as string""" + return 'pass' + + def visit_print(self, node): + """return an astroid.Print node as string""" + nodes = ', '.join([n.accept(self) for n in node.values]) + if not node.nl: + nodes = '%s,' % nodes + if node.dest: + return 'print >> %s, %s' % (node.dest.accept(self), nodes) + return 'print %s' % nodes + + def visit_raise(self, node): + """return an astroid.Raise node as string""" + if node.exc: + if node.inst: + if node.tback: + return 'raise %s, %s, %s' % (node.exc.accept(self), + node.inst.accept(self), + node.tback.accept(self)) + return 'raise %s, %s' % (node.exc.accept(self), + node.inst.accept(self)) + return 'raise %s' % node.exc.accept(self) + return 'raise' + + def visit_return(self, node): + """return an astroid.Return node as string""" + if node.is_tuple_return() and len(node.value.elts) > 1: + elts = [child.accept(self) for child in node.value.elts] + return 'return %s' % ', '.join(elts) + + if node.value: + return 'return %s' % node.value.accept(self) + + return 'return' + + def visit_index(self, node): + """return an astroid.Index node as string""" + return node.value.accept(self) + + def visit_set(self, node): + """return an astroid.Set node as string""" + return '{%s}' % ', '.join([child.accept(self) for child in node.elts]) + + def visit_setcomp(self, node): + """return an astroid.SetComp node as string""" + return '{%s %s}' % (node.elt.accept(self), + ' '.join([n.accept(self) for n in node.generators])) + + def visit_slice(self, node): + """return an astroid.Slice node as string""" + lower = node.lower.accept(self) if node.lower else '' + upper = node.upper.accept(self) if node.upper else '' + step = node.step.accept(self) if node.step else '' + if step: + return '%s:%s:%s' % (lower, upper, step) + return '%s:%s' % (lower, upper) + + def visit_subscript(self, node): + """return an astroid.Subscript node as string""" + return '%s[%s]' % (self._precedence_parens(node, node.value), + node.slice.accept(self)) + + def visit_tryexcept(self, node): + """return an astroid.TryExcept node as string""" + trys = ['try:\n%s' % self._stmt_list(node.body)] + for handler in node.handlers: + trys.append(handler.accept(self)) + if node.orelse: + trys.append('else:\n%s' % self._stmt_list(node.orelse)) + return '\n'.join(trys) + + def visit_tryfinally(self, node): + """return an astroid.TryFinally node as string""" + return 'try:\n%s\nfinally:\n%s' % (self._stmt_list(node.body), + self._stmt_list(node.finalbody)) + + def visit_tuple(self, node): + """return an astroid.Tuple node as string""" + if len(node.elts) == 1: + return '(%s, )' % node.elts[0].accept(self) + return '(%s)' % ', '.join([child.accept(self) for child in node.elts]) + + def visit_unaryop(self, node): + """return an astroid.UnaryOp node as string""" + if node.op == 'not': + operator = 'not ' + else: + operator = node.op + return '%s%s' % (operator, self._precedence_parens(node, node.operand)) + + def visit_while(self, node): + """return an astroid.While node as string""" + whiles = 'while %s:\n%s' % (node.test.accept(self), + self._stmt_list(node.body)) + if node.orelse: + whiles = '%s\nelse:\n%s' % (whiles, self._stmt_list(node.orelse)) + return whiles + + def visit_with(self, node): # 'with' without 'as' is possible + """return an astroid.With node as string""" + items = ', '.join(('%s' % expr.accept(self)) + + (vars and ' as %s' % (vars.accept(self)) or '') + for expr, vars in node.items) + return 'with %s:\n%s' % (items, self._stmt_list(node.body)) + + def visit_yield(self, node): + """yield an ast.Yield node as string""" + yi_val = (" " + node.value.accept(self)) if node.value else "" + expr = 'yield' + yi_val + if node.parent.is_statement: + return expr + + return "(%s)" % (expr,) + + def visit_starred(self, node): + """return Starred node as string""" + return "*" + node.value.accept(self) + + # These aren't for real AST nodes, but for inference objects. + + def visit_frozenset(self, node): + return node.parent.accept(self) + + def visit_super(self, node): + return node.parent.accept(self) + + def visit_uninferable(self, node): + return str(node) + + +class AsStringVisitor3(AsStringVisitor): + """AsStringVisitor3 overwrites some AsStringVisitor methods""" + + def visit_excepthandler(self, node): + if node.type: + if node.name: + excs = 'except %s as %s' % (node.type.accept(self), + node.name.accept(self)) + else: + excs = 'except %s' % node.type.accept(self) + else: + excs = 'except' + return '%s:\n%s' % (excs, self._stmt_list(node.body)) + + def visit_nonlocal(self, node): + """return an astroid.Nonlocal node as string""" + return 'nonlocal %s' % ', '.join(node.names) + + def visit_raise(self, node): + """return an astroid.Raise node as string""" + if node.exc: + if node.cause: + return 'raise %s from %s' % (node.exc.accept(self), + node.cause.accept(self)) + return 'raise %s' % node.exc.accept(self) + return 'raise' + + def visit_yieldfrom(self, node): + """ Return an astroid.YieldFrom node as string. """ + yi_val = (" " + node.value.accept(self)) if node.value else "" + expr = 'yield from' + yi_val + if node.parent.is_statement: + return expr + + return "(%s)" % (expr,) + + def visit_asyncfunctiondef(self, node): + function = super(AsStringVisitor3, self).visit_functiondef(node) + return 'async ' + function.strip() + + def visit_await(self, node): + return 'await %s' % node.value.accept(self) + + def visit_asyncwith(self, node): + return 'async %s' % self.visit_with(node) + + def visit_asyncfor(self, node): + return 'async %s' % self.visit_for(node) + + def visit_joinedstr(self, node): + # Special treatment for constants, + # as we want to join literals not reprs + string = ''.join( + value.value if type(value).__name__ == 'Const' + else value.accept(self) + for value in node.values + ) + return "f'%s'" % string + + def visit_formattedvalue(self, node): + return '{%s}' % node.value.accept(self) + + def visit_comprehension(self, node): + """return an astroid.Comprehension node as string""" + return '%s%s' % ('async ' if node.is_async else '', + super(AsStringVisitor3, self).visit_comprehension(node)) + + +def _import_string(names): + """return a list of (name, asname) formatted as a string""" + _names = [] + for name, asname in names: + if asname is not None: + _names.append('%s as %s' % (name, asname)) + else: + _names.append(name) + return ', '.join(_names) + + +if sys.version_info >= (3, 0): + AsStringVisitor = AsStringVisitor3 + +# This sets the default indent to 4 spaces. +to_code = AsStringVisitor(' ') diff --git a/venv/Lib/site-packages/astroid/bases.py b/venv/Lib/site-packages/astroid/bases.py new file mode 100644 index 00000000..c6407951 --- /dev/null +++ b/venv/Lib/site-packages/astroid/bases.py @@ -0,0 +1,493 @@ +# Copyright (c) 2009-2011, 2013-2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2012 FELD Boris +# Copyright (c) 2014-2018 Claudiu Popa +# Copyright (c) 2014 Google, Inc. +# Copyright (c) 2014 Eevee (Alex Munroe) +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2015 Florian Bruhin +# Copyright (c) 2016-2017 Derek Gustafson +# Copyright (c) 2017 Calen Pennington +# Copyright (c) 2018 Bryce Guinta +# Copyright (c) 2018 Nick Drozd +# Copyright (c) 2018 Daniel Colascione + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""This module contains base classes and functions for the nodes and some +inference utils. +""" + +import builtins +import collections +import sys + +from astroid import context as contextmod +from astroid import exceptions +from astroid import util + +objectmodel = util.lazy_import('interpreter.objectmodel') +helpers = util.lazy_import('helpers') +BUILTINS = builtins.__name__ +manager = util.lazy_import('manager') +MANAGER = manager.AstroidManager() + +if sys.version_info >= (3, 0): + # TODO: check if needs special treatment + BUILTINS = 'builtins' + BOOL_SPECIAL_METHOD = '__bool__' +else: + BUILTINS = '__builtin__' + BOOL_SPECIAL_METHOD = '__nonzero__' +PROPERTIES = {BUILTINS + '.property', 'abc.abstractproperty'} +# List of possible property names. We use this list in order +# to see if a method is a property or not. This should be +# pretty reliable and fast, the alternative being to check each +# decorator to see if its a real property-like descriptor, which +# can be too complicated. +# Also, these aren't qualified, because each project can +# define them, we shouldn't expect to know every possible +# property-like decorator! +POSSIBLE_PROPERTIES = {"cached_property", "cachedproperty", + "lazyproperty", "lazy_property", "reify", + "lazyattribute", "lazy_attribute", + "LazyProperty", "lazy", "cache_readonly"} + + +def _is_property(meth): + if PROPERTIES.intersection(meth.decoratornames()): + return True + stripped = {name.split(".")[-1] for name in meth.decoratornames() + if name is not util.Uninferable} + if any(name in stripped for name in POSSIBLE_PROPERTIES): + return True + + # Lookup for subclasses of *property* + if not meth.decorators: + return False + for decorator in meth.decorators.nodes or (): + inferred = helpers.safe_infer(decorator) + if inferred is None or inferred is util.Uninferable: + continue + if inferred.__class__.__name__ == 'ClassDef': + for base_class in inferred.bases: + module, _ = base_class.lookup(base_class.name) + if module.name == BUILTINS and base_class.name == 'property': + return True + + return False + + +class Proxy: + """a simple proxy object + + Note: + + Subclasses of this object will need a custom __getattr__ + if new instance attributes are created. See the Const class + """ + + _proxied = None # proxied object may be set by class or by instance + + def __init__(self, proxied=None): + if proxied is not None: + self._proxied = proxied + + def __getattr__(self, name): + if name == '_proxied': + return getattr(self.__class__, '_proxied') + if name in self.__dict__: + return self.__dict__[name] + return getattr(self._proxied, name) + + def infer(self, context=None): + yield self + + +def _infer_stmts(stmts, context, frame=None): + """Return an iterator on statements inferred by each statement in *stmts*.""" + stmt = None + inferred = False + if context is not None: + name = context.lookupname + context = context.clone() + else: + name = None + context = contextmod.InferenceContext() + + for stmt in stmts: + if stmt is util.Uninferable: + yield stmt + inferred = True + continue + context.lookupname = stmt._infer_name(frame, name) + try: + for inferred in stmt.infer(context=context): + yield inferred + inferred = True + except exceptions.NameInferenceError: + continue + except exceptions.InferenceError: + yield util.Uninferable + inferred = True + if not inferred: + raise exceptions.InferenceError( + 'Inference failed for all members of {stmts!r}.', + stmts=stmts, frame=frame, context=context) + + +def _infer_method_result_truth(instance, method_name, context): + # Get the method from the instance and try to infer + # its return's truth value. + meth = next(instance.igetattr(method_name, context=context), None) + if meth and hasattr(meth, 'infer_call_result'): + if not meth.callable(): + return util.Uninferable + try: + for value in meth.infer_call_result(instance, context=context): + if value is util.Uninferable: + return value + + inferred = next(value.infer(context=context)) + return inferred.bool_value() + except exceptions.InferenceError: + pass + return util.Uninferable + + +class BaseInstance(Proxy): + """An instance base class, which provides lookup methods for potential instances.""" + + special_attributes = None + + def display_type(self): + return 'Instance of' + + def getattr(self, name, context=None, lookupclass=True): + try: + values = self._proxied.instance_attr(name, context) + except exceptions.AttributeInferenceError as exc: + if self.special_attributes and name in self.special_attributes: + return [self.special_attributes.lookup(name)] + + if lookupclass: + # Class attributes not available through the instance + # unless they are explicitly defined. + return self._proxied.getattr(name, context, + class_context=False) + + raise exceptions.AttributeInferenceError( + target=self, + attribute=name, + context=context, + ) from exc + # since we've no context information, return matching class members as + # well + if lookupclass: + try: + return values + self._proxied.getattr(name, context, + class_context=False) + except exceptions.AttributeInferenceError: + pass + return values + + def igetattr(self, name, context=None): + """inferred getattr""" + if not context: + context = contextmod.InferenceContext() + try: + # avoid recursively inferring the same attr on the same class + if context.push((self._proxied, name)): + return + + # XXX frame should be self._proxied, or not ? + get_attr = self.getattr(name, context, lookupclass=False) + yield from _infer_stmts(self._wrap_attr(get_attr, context), context, frame=self) + except exceptions.AttributeInferenceError as error: + try: + # fallback to class.igetattr since it has some logic to handle + # descriptors + # But only if the _proxied is the Class. + if self._proxied.__class__.__name__ != 'ClassDef': + raise exceptions.InferenceError(**vars(error)) from error + attrs = self._proxied.igetattr(name, context, class_context=False) + yield from self._wrap_attr(attrs, context) + except exceptions.AttributeInferenceError as error: + raise exceptions.InferenceError(**vars(error)) from error + + def _wrap_attr(self, attrs, context=None): + """wrap bound methods of attrs in a InstanceMethod proxies""" + for attr in attrs: + if isinstance(attr, UnboundMethod): + if _is_property(attr): + yield from attr.infer_call_result(self, context) + else: + yield BoundMethod(attr, self) + elif hasattr(attr, 'name') and attr.name == '': + # This is a lambda function defined at class level, + # since its scope is the underlying _proxied class. + # Unfortunately, we can't do an isinstance check here, + # because of the circular dependency between astroid.bases + # and astroid.scoped_nodes. + if attr.statement().scope() == self._proxied: + if attr.args.args and attr.args.args[0].name == 'self': + yield BoundMethod(attr, self) + continue + yield attr + else: + yield attr + + def infer_call_result(self, caller, context=None): + """infer what a class instance is returning when called""" + context = contextmod.bind_context_to_node(context, self) + inferred = False + for node in self._proxied.igetattr('__call__', context): + if node is util.Uninferable or not node.callable(): + continue + for res in node.infer_call_result(caller, context): + inferred = True + yield res + if not inferred: + raise exceptions.InferenceError(node=self, caller=caller, + context=context) + + +class Instance(BaseInstance): + """A special node representing a class instance.""" + + # pylint: disable=unnecessary-lambda + special_attributes = util.lazy_descriptor(lambda: objectmodel.InstanceModel()) + + def __repr__(self): + return '' % (self._proxied.root().name, + self._proxied.name, + id(self)) + def __str__(self): + return 'Instance of %s.%s' % (self._proxied.root().name, + self._proxied.name) + + def callable(self): + try: + self._proxied.getattr('__call__', class_context=False) + return True + except exceptions.AttributeInferenceError: + return False + + def pytype(self): + return self._proxied.qname() + + def display_type(self): + return 'Instance of' + + def bool_value(self): + """Infer the truth value for an Instance + + The truth value of an instance is determined by these conditions: + + * if it implements __bool__ on Python 3 or __nonzero__ + on Python 2, then its bool value will be determined by + calling this special method and checking its result. + * when this method is not defined, __len__() is called, if it + is defined, and the object is considered true if its result is + nonzero. If a class defines neither __len__() nor __bool__(), + all its instances are considered true. + """ + context = contextmod.InferenceContext() + context.callcontext = contextmod.CallContext(args=[]) + context.boundnode = self + + try: + result = _infer_method_result_truth(self, BOOL_SPECIAL_METHOD, context) + except (exceptions.InferenceError, exceptions.AttributeInferenceError): + # Fallback to __len__. + try: + result = _infer_method_result_truth(self, '__len__', context) + except (exceptions.AttributeInferenceError, exceptions.InferenceError): + return True + return result + + # This is set in inference.py. + def getitem(self, index, context=None): + pass + + +class UnboundMethod(Proxy): + """a special node representing a method not bound to an instance""" + + # pylint: disable=unnecessary-lambda + special_attributes = util.lazy_descriptor(lambda: objectmodel.UnboundMethodModel()) + + def __repr__(self): + frame = self._proxied.parent.frame() + return '<%s %s of %s at 0x%s' % (self.__class__.__name__, + self._proxied.name, + frame.qname(), id(self)) + + def implicit_parameters(self): + return 0 + + def is_bound(self): + return False + + def getattr(self, name, context=None): + if name in self.special_attributes: + return [self.special_attributes.lookup(name)] + return self._proxied.getattr(name, context) + + def igetattr(self, name, context=None): + if name in self.special_attributes: + return iter((self.special_attributes.lookup(name), )) + return self._proxied.igetattr(name, context) + + def infer_call_result(self, caller, context): + """ + The boundnode of the regular context with a function called + on ``object.__new__`` will be of type ``object``, + which is incorrect for the argument in general. + If no context is given the ``object.__new__`` call argument will + correctly inferred except when inside a call that requires + the additional context (such as a classmethod) of the boundnode + to determine which class the method was called from + """ + + # If we're unbound method __new__ of builtin object, the result is an + # instance of the class given as first argument. + if (self._proxied.name == '__new__' and + self._proxied.parent.frame().qname() == '%s.object' % BUILTINS): + if caller.args: + node_context = context.extra_context.get(caller.args[0]) + infer = caller.args[0].infer(context=node_context) + else: + infer = [] + return (Instance(x) if x is not util.Uninferable else x for x in infer) + return self._proxied.infer_call_result(caller, context) + + def bool_value(self): + return True + + +class BoundMethod(UnboundMethod): + """a special node representing a method bound to an instance""" + + # pylint: disable=unnecessary-lambda + special_attributes = util.lazy_descriptor(lambda: objectmodel.BoundMethodModel()) + + def __init__(self, proxy, bound): + UnboundMethod.__init__(self, proxy) + self.bound = bound + + def implicit_parameters(self): + return 1 + + def is_bound(self): + return True + + def _infer_type_new_call(self, caller, context): + """Try to infer what type.__new__(mcs, name, bases, attrs) returns. + + In order for such call to be valid, the metaclass needs to be + a subtype of ``type``, the name needs to be a string, the bases + needs to be a tuple of classes + """ + from astroid import node_classes + # Verify the metaclass + mcs = next(caller.args[0].infer(context=context)) + if mcs.__class__.__name__ != 'ClassDef': + # Not a valid first argument. + return None + if not mcs.is_subtype_of("%s.type" % BUILTINS): + # Not a valid metaclass. + return None + + # Verify the name + name = next(caller.args[1].infer(context=context)) + if name.__class__.__name__ != 'Const': + # Not a valid name, needs to be a const. + return None + if not isinstance(name.value, str): + # Needs to be a string. + return None + + # Verify the bases + bases = next(caller.args[2].infer(context=context)) + if bases.__class__.__name__ != 'Tuple': + # Needs to be a tuple. + return None + inferred_bases = [next(elt.infer(context=context)) + for elt in bases.elts] + if any(base.__class__.__name__ != 'ClassDef' + for base in inferred_bases): + # All the bases needs to be Classes + return None + + # Verify the attributes. + attrs = next(caller.args[3].infer(context=context)) + if attrs.__class__.__name__ != 'Dict': + # Needs to be a dictionary. + return None + cls_locals = collections.defaultdict(list) + for key, value in attrs.items: + key = next(key.infer(context=context)) + value = next(value.infer(context=context)) + # Ignore non string keys + if (key.__class__.__name__ == 'Const' and + isinstance(key.value, str)): + cls_locals[key.value].append(value) + + # Build the class from now. + cls = mcs.__class__(name=name.value, lineno=caller.lineno, + col_offset=caller.col_offset, + parent=caller) + empty = node_classes.Pass() + cls.postinit(bases=bases.elts, body=[empty], decorators=[], + newstyle=True, metaclass=mcs, keywords=[]) + cls.locals = cls_locals + return cls + + def infer_call_result(self, caller, context=None): + context = contextmod.bind_context_to_node(context, self.bound) + if (self.bound.__class__.__name__ == 'ClassDef' + and self.bound.name == 'type' + and self.name == '__new__' + and len(caller.args) == 4): + # Check if we have a ``type.__new__(mcs, name, bases, attrs)`` call. + new_cls = self._infer_type_new_call(caller, context) + if new_cls: + return iter((new_cls, )) + + return super(BoundMethod, self).infer_call_result(caller, context) + + def bool_value(self): + return True + + +class Generator(BaseInstance): + """a special node representing a generator. + + Proxied class is set once for all in raw_building. + """ + + # pylint: disable=unnecessary-lambda + special_attributes = util.lazy_descriptor(lambda: objectmodel.GeneratorModel()) + + # pylint: disable=super-init-not-called + def __init__(self, parent=None): + self.parent = parent + + def callable(self): + return False + + def pytype(self): + return '%s.generator' % BUILTINS + + def display_type(self): + return 'Generator' + + def bool_value(self): + return True + + def __repr__(self): + return '' % (self._proxied.name, self.lineno, id(self)) + + def __str__(self): + return 'Generator(%s)' % (self._proxied.name) diff --git a/venv/Lib/site-packages/astroid/brain/__pycache__/brain_attrs.cpython-37.pyc b/venv/Lib/site-packages/astroid/brain/__pycache__/brain_attrs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40fddb62957771019626e82dedc9de8d644ead95 GIT binary patch literal 1415 zcmZWp&2Hm15GE;FQWQJhZUgiO2C7p57md+vPA!6>PO=Ra=;n}k5kPezFd}Wsktvy^ zH?iULvU}{lLvq|F={xA!Q(vK{4kahMKnZX--1CGzp&G*)y;$!st*SExw zH8IYVz9H(HHJLVUVSeY{qcy&A)viTkzIy?f0y56(@JyJ6lHoutM3|037IKl~@EpNI znR5|Nm<~c{Ojd9`gzZC%B1;AD{W9o!QLx#TD;+iLMqLJ}PNgm5HoANGslm>D+wHBVSJ9Ee#lEYf1Hx=NPqP4@T2vzs4A!_AEzM-V|Ohn0;hDtg7T z{4CY+BOviL2&9gEVo7)c22mGNyn~zAh3;e3gtY|Q2sFzVsJrIuPjC#dv{x&5-)-F^6I?m!Y~GP%-nsb>*0(pz z+tcy13B9$3T6yQ(I%}u?5-4Hk0L`NdH17cW6xeU9CMW4@AwlrWs$PUgR<)-a+W$}a zx0MohD;LA6BfxQ1|JW8mI}DibmsF`pvvZq=dmTsLL`D&tLyHY8xHrsaZ7gi$G6Y9su zMlq?O{%2o7Sa-l6cb7Cl6a?h)1XDtAlTZ)~#XeD=L%fTXE$XgcdU4G2B#x`sDqHbt z*BUFPDm8kl#5mPPs1F~C{EDt)G5Y9owlGw6L;qlw^F=0pvN-6cU?}l%)1fqI`Cr;= G5d0scHH(D+ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/brain/__pycache__/brain_builtin_inference.cpython-37.pyc b/venv/Lib/site-packages/astroid/brain/__pycache__/brain_builtin_inference.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54f1d4f93e7ba6399608eb0fadfe82ec8ce4b74f GIT binary patch literal 19735 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/brain/__pycache__/brain_curses.cpython-37.pyc b/venv/Lib/site-packages/astroid/brain/__pycache__/brain_curses.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39ed71a7d92254a2dffd1ea35ba344b12438b414 GIT binary patch literal 3371 zcmZu!&2Aev5MEh!Vx-NXw;p}yp$3|ut`0?tHYk@%Nrbt}Eoaw1ssKT;HmwR-7FG(7 zUYbiEqle_!C+RcP*Pi+cJ$1OUy&O^tc)jy+IR7)G;-^oaMEG3y{`&FnkE7@xOWZ#P z`0+jdtv|!pEShx|(I}ej&APuwqfQmQ->afuy0iVN^P$_pRfvuc{zc9xyRz^5r;8sP z|JGK~CVJnQbv{_$y=?l&M^W_T2p=|Ks^CLrKom#c9i7~Pv69)TOKX)lWFk|ClG&LA zmoAu++yOFeQl=arH@XnqRcOSSKpPw$C|H*0(q$^ML>RQpWgBWEM><25&R!+@?mnf@ zokb%DLwB{%xwDF96p|BZHavy6aQCpHFfuL+;rhLUk87pPgY;8zIZ0(k=-3F>M%r>D z`kb5Sq$|J~0O9?kr~m>PsFVSU@q6!2^K#h{y^-HGvUsYgki5BsVf^%fs?0 z>J2*~marZnUdvz97CaK{ie*&f=>m2pUzaDQN@|tfYt+@3)&_+FQm?BRpmHWq%J9FM52kGM)ZXd z7&RZoOb4wE>Bwi_BiY2Nl@gJ@=20~-Wl zZxcW}Telp(*g~|1G#sT;?i~Yd;iqw+Dq+UB$2GDgVqiRBiDapEqG%Ni#1Ex=ZX-0L zmjy%=vlG4@9Co7$RjN>yQe2zNIUSmX_d?=k0b<1@r zlzT(9*Ye}N+sD)OroNfaZVy(|dR_e))%$pjZ(jes;@^zRbycs&sCOWLJ9(Z67_-$X znQo?Ib#pacjEm}eHD1kE&*sbZX1Z8B`?=SvPTszFJ-!qC@c&gkoiE4Ddvf&#b*-PT ze!czV?t8MSr_1&0oBH~Z{Vic%QD^^M^m%PRM~}8Uj`!<5B)8b7b@kJHy{YQS_08A*;t)|c&<{lRm4`0bYcrTyX3C_3yOzKg#2ALBRczyJUM literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/brain/__pycache__/brain_dateutil.cpython-37.pyc b/venv/Lib/site-packages/astroid/brain/__pycache__/brain_dateutil.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de321f44d4685e0d23fb565dc986663b3402c026 GIT binary patch literal 683 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 F{{mfpo&o>> literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/brain/__pycache__/brain_gi.cpython-37.pyc b/venv/Lib/site-packages/astroid/brain/__pycache__/brain_gi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22b3b17899fcd0b32e94a52843a9f61c056eba58 GIT binary patch literal 3939 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 rRD-wgB~;gi$g*m!Q)NdgA literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/brain/__pycache__/brain_mechanize.cpython-37.pyc b/venv/Lib/site-packages/astroid/brain/__pycache__/brain_mechanize.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a92115a59613aae5e555c2c056bc36d7dd8f12e GIT binary patch literal 721 zcmb_a&2H2%5Vn*3YqVXExb&D~BW+izmJ1aivTe0OqI;ll36UaiJZW7yPGmdK_Q0h) z2poA5-XT{`h&SNGcz3&q12;zUc;<`e=bOoFcQ+s?YWnTnl~2fb=iEyNjTd;#V^o}Q zDoIHbT6&2`o$pD%>?9quect&*k}h~ac^A5OK4QId67_#zB#FGXe-U z7IaotypfQ>wFSjNN31Oto=&t+X z)Gs(bO5frrOnMg2=Py4VPEJnG)3~lrka_ybRZZVOS*NwA4}>z7NqKNNoxLhNImG(L^+@O-(0#m^pw}E->>o~RtA|)Sc)I?7p6{S%9Q2S5y}{@=nCZil literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/brain/__pycache__/brain_multiprocessing.cpython-37.pyc b/venv/Lib/site-packages/astroid/brain/__pycache__/brain_multiprocessing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce7493260ade5ad1b4d23fa9fac3bfb038c074df GIT binary patch literal 2592 zcmZ`*UvJws5GQ5HcHFcbimhw+Bw!0_52=A7eb|C#Skh!gizVoqt=&8i0wdCi9Q_MP zr*_~B7&`28BrgN@74`-89rU`VeuX~mj*?Zy$!Lh=-TjWdBkzvhxPHAwpv5cy{QSit zA^##VYYt4lhEMgN~6}pl1z1 zhfUrT_467aXY_(_kmhukbXsp=eX`S`Sxbz4k?J6cRmXZ;1MXWJIv?fO>hLw;dkmlY z8#+zSD5vN2lxR!cnv&g|V*!UwKGU@+<+Z!y%swY?=&5CByQFKcNPOES+8NdlTk<6( z_`@}RB;)?nn$`x^Ci&(0DIGtX(qZGQc}{?S)VEIUQ)g)GLcz5Onerq%n7uJRMt|ONv&Q7 z`XFlsaEw3$ws-BDQS4(-fxW$J8_6i<+d>~Cyi?EWQNl+dY#Aq9WR2n|BnDbmI~0@5 zIcDKV{6*wPzIsNZNl=jmgy>AQ% z!}|v-E8@ZU%R#?zvmEy%3*x@%z4-u0C)p?SOixP|t3e{8n_!G;Lr17>*Qrfy2S@sd*@aL!T>D;*L}hu*7=(Ad85{z4HZ>L_0$YwUO98}; zr5tzP7usw*w|J3`73~XJs?aKooKvo7UAd>{Ns-FJ<2l`8<9kc0y(E|2CE2;R)JD&8 zE4!W-!>N1T@|^!O+IW~(4s?I!I25Qz`M zO3ZW2u{D!oU7VMKFi_|j4keEVKJsuVc`q@efN92(Ywi-bW-Pg7qJpHHmr~Dz!xRvY zAPrfx$C-((Rnu2dV@%WcpwF4ySF0}eC90fYV4133q&4Pvz{21}$hDm$hTuXD>Kbw` z3rzXI_{Cu;c3)o@RuXMM8%s#zTmuIi_`vUzCfC~S+K!Lt5 z@4$F+XTCtrw6dFXlFmX_Qxlb&fiGXScnoh2gbWlpDF0ZoO+hyc_wGos5BCgbpFd_E wyqhBCLiQTl>pSaDwq8^`Fb)|vnvZh$SNPbeThKMlbJ40bmzob+v~ojzV)K+ey4y$q_A4jvR~8nv%T>QHFnkF<~6S^?!y07!M z;T!li>t@69EuH$Tdahynb|dfS8;<^>vih)OlKO%}^P?W^bBg-EZ!(!x_<{uNI;uyZi#I!gr#-Hi_adARS zpk-W4ij(+05$d&x@Ps%ePCqyN$?UGkcPFzum+wxAH^mw83g$R1UKJjmJtJnsYvL?g zUJm7!)?N>t@bptXoZK~aZBN@PXgjIeYBcU# z_^K$2i_bLiThIF=&*5ngBgYRs{TkX%QJXLpwDRTcnb|0ot*Y=IwOVVDx6+bc{3!J9 zZpDvUO)rWoO;M4;t5=s~MQ+V}Pn?`D>!~e55jNwpmFDlv&d+`@_i=jceiYtru7omd zE{8Y6mC8mvP6w;qmLRUS(^7B1oRlqzi3%0Dy3xQ?5pLXYb2)6s)mD@4a?O?qqq32f zvPHhXQLT$mrp0hGmX+l=paB?YZN$~O@6J~mp}4ovu7}$r@m9OqT%GARrPf??qmkxs zH)E=77ebUXTrF}n>sU5ui};wh99%bWMZZ9iXt7q)*Bn`jjVJon#n?==nw3CypX*Qc zj*%Ey|68%~RC}T~tpqgwRBN8Jv^cls%8zx8{$iVYf2lQ%UqA=I1%n8hUv4#H?5muY zMZ7E>xZh;bRhH_Zw5Y{uqC3rTYdW|Px7xSkP*#Xq(#C+Yi6J0}9HP;=FDmto@UJyF zj=LY$Zd_Redt|hDXZC{+ZvWBcnVWM9i?i+a%}QKZ{HV2DsW09O8|}q*wf$zb3BK3s zZ$5ha?eOyEPgfQzN=AC$kcDbU;dt*A=ON}aWEi|IxjgZM{^W2KeWMpFdn{IVrQ#Eg?Cu!i((&=dGRweeuklHK97 z)`-MaGm0Q>QQw{e{W0CjMsqoUS~r58qRm{b6T_qTW?nw;GJu*tL>Xew0 zEOqomuYndd{m+bbYe9)y*^tLEA~o?!?A(~Sl;*Q-sa?_YytNrc`PPNDdoy9QROVO=oI0W9-nOP=N@dbFnHvX+%? zIYxETA^8dwZ=ir;VO{_dO2wG6$y2CtXJ{OAYVw8ahAGq{T9#&v=55_J#|;D8;AEwv zyM`oPxwTAGrVp9X0xnjF&#{lKGzQHfkH#XzyOY}*PjWSVhm5ANYwVc2TE_<5dTjBp=|ajqHpj`mU~Pn=^@hQ+xPE$HB;Bph+Rg zCk2dgP>v;qRUM;`C(c#vSNi(&ry6>##9lE0#HH8;C7{bVsd89$4w`?5y zaOc5PW@hqjkD<@|L7)CX_x7m_c{~gzgmtT=GQ%AmYy^}%HEQ~w?o%2X!pTvuye&v3V^@_j|W+8Yl85{HfG=tWLrGG634wMYT9i}jiT zzFRPNfJMfvpyF{p5LHH2+#%l8^I zJtLjIefGt~><&Mgh!-&l6Y=cc1u6p8tR4w-`$=f`mn`3+#j`M6rW%3M-t`|%z7|IH z$anP0{x354BMf6^D8QD(c)MQ^t!3~Wj#qh{!AzNfybRm*$};dXYS*hV+_@NomNw#$ zoj^&OO!JQ_Q3dUa3^UYZkZzR^-83ZvAn zv|$K@UzlsORDWGxhDC-<2WE zZ6yY%0ljz|dw>oOy6bxQTp>DmJg05Yel%NtfU@VK zkv*h~_eo}z+`^6#>u|u0nhC5rodBT{eU02a)k;?GEwtLIRp{(?-zw)*i{QPldud^| z%V_x?=1#47NDT`DOg=B3h2r zI3GL0daCafcFD}=w@$*i+dFQO7daS66FmbkiVlqK1dMJG<~CO5R@fa!8RW!~PvXHO zhv#!5zfMK^ z19S5AD{hL2Viuz8f(isg zxT1(c2+j2PTU0W7R9a9xh4J3`DcW#3no>-^!k`xfQN0yMK>#{Tl~ohZ8=>L+l&Y2` zci>H4P>CqWnIamM)f7Za8O9qDITp0e1Obf*0)FN?19Kxp3P$uNX~4uxE!U%I4-TB9 zw7|6248Odl7#0Mm2f?(5i1Qk*!|y@={>RnId4ZXM<`qt33)ww|j8Qo{JQuCGzp`L8 zj4?Y64uTi#l2@tv+>As4UX9s#9zFi6|=FFdEEOBY4ZZe2*WK~jR3)LU5?Q30V*h4L4E>KS-qgy zcgf}joK#^)1VK5rjrS_G;gUDWensXfShZHQnR2R$GBu&3m`;*}r$yx`1xu9EO0A`q z*h*~`m!}qSxIEa8MExN(H9INvDmhCN5y|9r6n=rW5Fo!0O14b%)N`MTdnjP!KqW~| zN7q03nCk4Gj2zPbzeHa|#t)$?{1f^s!S@)(_euC7E_@OPm#w>|Wt7n3lqj)dz|M_l zf3AMokjt2%r`Dv>gl#u)MSqNfyb~B0J=UMXdT&08k=`K_@^BH#4zm`kw2zipWL6Mm zeimChNaXD55z;u6$`R(Iwqx&Vbib1qSx-V4nHr3pIS$lJOc)Gf$D!vCAxyvo6cS|s z?D^i}$ju0!r^w2&y#WV zWi@^TcUlN}2P4Zld7hqP_tuKSu$k&rB~ts{Gx-3+{ux(9PQJ$8=cs;KKMQ^%iATLX z2ZlIIi9F^q1wt{>_~0^mX9~IvI4+j3CbfOV$P99B`?B{ki%ed**R#blUgh6G zS4I%!%+8_zP8e6FT1z#U;62E7p%Bdi~y~>Kf6L^>Q*ZxwLXlj)c^mnwg(3m_prACwK_^m zAHBM4b2MOz_Mq_p;O+pU=xp>@KoQlEEck>n+Ak*k^{!9STOUz~KD16^%t70vdR3XN z^$5oO_`J;4-(X_em5Q#qZ_VDQcGV|J5Hv#akCcD$;KBt(?|Z-)PD=hBv`S@NEM=}p z*JK4n3Mi)&o45*76R>E&u5!#mPx@?!Fgw72&BuN4-T3()9cUACG1DdZH^5R_@c@ran<-2P1 zJHUG&eryY1LpPldy#HkV-Bk@~eB>>G^LYdhe!UxmGMjCyOs6jU{N zWNo-(V@3JRFUTf6Y$C%rCi1moiG$raJI87NyU1;d!gGXKokBbwpFkKikrdF1F~B?* z-;;?OOm2Fh%SocZ!!Zhqkd<^1vkuf?uaK9#LV3xZQ;EBCdKYuTa{V`FD(S$wc z`>A$UTX)e$k-fY9>XFEa7@xQq&3KZerpG;Hi@;(uMwAJMxf|P?tSV|R%%}P8Y!p>j zoAcxst28BNd5$uC#~>KpAS267(t4C=zR1kYZ(C;{cg|Ku@bDo`R(PkPkg3O%jEFi1 zu%fG8FIHO`L6GoL)un-%mOfVB$^q;gS{IFc`3ql$L3`gvV-LTF!bQY2>?`MZ`##)b ziX+s@%4g&p_?ZsP&ELPnc^A&ZEJz=%%D8_{HO{Y@mFAXT0Ac`rkv{7uL3~^BIL!kp z0M8L;Bz>DOJQPTgG@ID~TMbYWaEab*!ms7JO@_d`6P8N;T-F0i3b!1-}?1I}*|f1~;^&M_$|M=81z-J#|h zhC@j^7qu~rr{vuzN?VtYF{9Rq- zkOMMfIJX#K#mM#`!-C^T+~qc30i-w#DWe@bu>mQ$S|PCsQr16&LkwE%0xk~9Il(=#7c(RlQZu_J11iqQ^<_#D*hu0Ci(v*G zexcHABAE(6IlvJ<61YW7P(G!hZ(mkCQmfpXF60gD!IR!$$M${JR0{I;CStrSQ9~l8 z&aQb_|5iZ@-M=O~)81nhQ=+cSw7iIIUC%*XL1$|!fx-V;&sld%GNmI)M6)EKi6r91?98rrs)wix z79LjLlvnAj4=0FPE&mi}m1vpg7Kd6WiX)qjYhVQ@O;L^dU}w$EyWRd;5q9!A1RinR zzOlc~X13q~sG0wYS`b$t^;j#i=TOQlXhPN!?;~#lZSW?B5GCU00z1Qr3DwGfYmC#b zw0H!u3ZL?3j=X-lFrkfYVOzSiWnO!6pO=Rc}Oqe>|$9Yza)8sQX zy3p<($lymnx9FD%z5nxR9!bI0au6VCNhi=qKSe6Ucj$LQU&>0G@y5?*KhNR3k~$wF zs8&)!Rz{tkk-P2>Wn*VJ?G#F7ni-GO`}qV$9be>e*oFwB?vL*| z?%0FI{_x&*^7s5Rds_~{H|L2sjleMmTS>+t77Tw>hO3ZdM8NpXS2LpYwr^1iKwhDR z_2rUloYHcxHdZ&m8xtlOZpvj9A)mHUG@U``jC;i?I0Z7{CDZ*~ eXTUw{Tyc-P9vN|)Ogfi1$1%yUBOXEp_N9a57+EZVlr_L-LHSnP;?Cj3|3}?UjX0+XExddAJ_|MmWIE4I# z%ExBIj0O&;(*X%%Rg3QpSdDy40 zjtxf>`Vn-w0)o+kOvwyBeuqryjI6>ITqtQM@T_l?_KCM_`FwkW-i_07V&7V89H16Y_pV zSw#g_ZAL!O2|Xt1EsH4otbXo_bqWYWB+Vo8Bf0z;BH_%)E_w5OVid;N!qjEfjEaKQ zP&==SLN#y(cFe+5_Ow|T1)UiK;}uxJ9cG^!;t8wY+`D*ktiR$rA2&Lv?L?CM z>-q@Z&Eb?*BJaEEw6E2YMu(*hn_MV?*anSC*}E7;Nzkg4kfSF3R_TP>FP}c!-Fsd( zfd_GV681)M!b(T+OZ84fd1*7wc&Z?ruoBebbihSfzh+I)eu_Fz`+QG`3^uOcC@|kk z7q}*rd>5-z9pRv{jX)e|9DJ*^hZ!3snk15grq{~_WLAja-Q>*|nvtQ(vP6c1QQB8= zmdaK5l)Mds7>?~wgRameYST8oMP0f~T|?Y~y?OFs;>|PlJ}8%8D)IsOvC=gr6ghGN z>3Bv9x35T{(=t{IAzaM5%jj41ssA z-vnlM9zsRF2+R8Qy6=cKxGWY?An-uPJm)DZ?K}deD1mt&SkGdq%G%o~8FAkZEU894 z;3`jl;3~-&LP#@?(ikZ@4J1 zs_ml%=tOJ&XNVlj`e9faf(!iXs1RDb&asZpNG^i<$4Psus@dC^sBmV;b00$1-_sWSs0Z#m0Rrk2(qq=*uM0_YCdAg_Gt5@&6s(SU_ ztLJxKdF6HwpY-mZfBDzrUhi-8qx#&y%Mb9UGkk@;(_YvQx8nY3Kim#?e%CwQ3U7or z@!Sq?g}Zp}gfE4+@w~zNpWWpBr?0C(>dQ&OSwHHa{rA3lm?*AS9^d1NFU46Fk@-F@~iIev}>xcc%`=GM*nEm5c zuXo$SC*+Yg<~bX%p*J3ST3qpy$1>%6550_OeT^ehnFtmS(xI0%;a%oj4`QB9^64s# zU@G*l3a0oVj2cJ;Qz-&Y3@x}BdWvT;3;4+sRd8^yk;hOd5lmyA4_KT{>-|?b;qweK zra1|u0~Yg>(f&bgyjA=N97D}RFN{JC4J;U2MVzoCVFNv78My31dBSDFbMQTA(&~ig zzRp?B2WtZs$(YB3SOzBtMuZO1OfNI8t_MyhQiek>9W(mYEXiVG-n9~9W@h5~hK%Jz z=p0f$7o+HvN|j)e63)_6Kru;J%XFci=1O28HYqhJ;=I19FIcP_PKuZ* z98ys}^b#4u+9@a-Kb+)?RN$yhXriqdGHa>%(72FkA~cLpQVhLwmSs&R(u~ESv2tL7 zOn3t?GcLwO95?QWE0IM`guSh2x0rP!p54Gc*8Gn>wF4i)eEpNX`|#}Nu%G(uqemZn z@T1?3_TPK|Tm`Kme zw{Ja_?DE-n%$rZU6T2aStxH3nzBOt2>*TW#KfV6Wfx3z3!ma7!2f1Lzt@##S!u}`L zwb^>Q^_yO}{d?=;>^#2uP!@T)+hwc#9aAi zodf4!|Nh%=ACB%H9o;)V7~Q{nczoMnz2QBU9!!@P6=^`G^4jOZsn3;?xv2COc`Fa;fm0jrf*FjjdRsX(SryWkW!>|srtg@jUDnF{&jP_eL$6wnlh zjcFMXw)wCFPBLmkirBbyut;IJHbO#2A{Fhr5?BsV8!VH^Kg3x}BO4rn;wTBk_yKxB$cc`HG3pITOz7L(S!NH}BBfmHi`)fo$5 z!dtnrv1SYJ9n44<8cC&I@8Ihc=z-u$rHv{d*~ zJs0}CBYq&WOFP>gcnQUY2w@C6pmNL=mSP9YD3&buZA{P+Un>7OScwug@5V_&$5|Ja zVFx-P!j$9m=r(f*;>iGY7(Nb-Iqrf9kJ#5!5p^WYH4IG`x^lw8?p##ZFvZ=78++V! zhg9~vcHXTci&Upca!1?+<7?5o#Zo7)pIN; z_}d5qf^Mr17MFM3*L(fb-O7XA+g4i$928|opWUQ*gXMsG1zBXja)teKemO%}Ku&Lw zARVKxBP2x;$g|gN3=>Gj{Q@+m*8$8sfNP3d5WsBh{8a7YZ4tsyGmULRnDxwT|mo)b%MWHEID^ebMBBh)!5?q04-_I`1;S$71*m@J55@dj|fd~2CLj$T@bss4U zk^4T<1u;^v$aodV^e#{cjUf9^5U@}Pvs z89|dz-)w-fhMJcsA<$Xo9)>Ol-Owif8x1tBRyl82z&dXb-5y77t{Q9@8Fn^D3d*I| zoSnPn&80bi-JK7Yfbz{wlj%?9d}kuS)rc613aB2cK)NGxF z*F#QC^`QycHyg)EddjqQYMmHD8{v6~SuX;&0)!qHf-Zj>D5d7o){W5SSJKUbvp25% zS);R@;&Q^-n}BX5A~bOJG}hA%&D}GH(9A4ZXXm;4{Cxa`||1?ONX* zbn}Qi&`$fKEVi)sHYPiSN)}vd;zGyX;>ak1Q9d~sF4(FToq3k7c!g|kf~e!Bz4Zm- zA{(bURoA!@nzi1%W60lfj{4skHqr6uWcq(EsKWhfE=&o8>kOi6wHJxJz6!23yJ}%; z{DcImYf`?%=;;MRpcjd9zMLTD-x7$lZj=8=sPg|GjWk)F7YZr93K=$=r7s*Zj0+vI zODYZ`_o$O^G~@g{Vfy^!&WJt-2Pklv%2 zj1jPvY3O2*3(oHFm3S@^espgGPThsPK#}yIVyEWIQHFIT4Q?t2 zhu)iS+VYngGC7DwCygP~7jV&ti`Hz{##}>PMvBC6T>^bw3u?=@>sV!#;=ro5Cfx>A zY`76H@}ue*<==>jP;b7T{WmD)N}`Ui%mbg(#ZJY;I+t+6aV?Q6gtwJcE378SBbXX7 zb7GH(`$!{z~+&7osk5G|pBCT{Ut z9}o(KQNC#lLRsJpLt`~FhZZ?7Y;I_eWja~wbbM&35pcC*1+#kbH;_cx+oaCJ(LF&#%-pVFo z?z*kg0(C9bKn@YHLQli(-qv*?M6I~N6oQ)yhwtLF&MtjZ;b2bpvf$vl(BTiLW6)IH zfI^2)d!P13>Lt8)EOoe=+eMjVG-G8(_PY3(?oClKk8&F8sxFsiUl(_ubDrUzY|Wp= zzo!%`UC`Y(^!B<*{<4*vDnj&MP;*{Yqwgpx*tmMtfcHr;`=<2c>YKL37PRl%g7&L# z*U<2~DA+i?VE}u(&u;mCC literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/brain/__pycache__/brain_pkg_resources.cpython-37.pyc b/venv/Lib/site-packages/astroid/brain/__pycache__/brain_pkg_resources.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a98b18af5dfd8ddf9bdaa76ca0ce0cff4bb10819 GIT binary patch literal 2192 zcmcgt&2G~`5VrHvgs2rqIQmw*q>-vhNJRuu+EO9W3Q@R(NY>V#BugE8nO&Dw2rlIj zcnO}Q@6anJUV#%cwqw#?T2<;sS&!HA^Ub%rGcV@mS{99X`S`QIGR*o68Kf46rm z@7{0nYHfS=NnHulK*F4i2Y?U<;2WuE;UU6MY6IwxlQ50IhXVs~2uR-=TdUivn;UNf zb~70j64vOiDHqF7pd$`d*%m)$EUOj5z(M$wN(6VI5XKN2?LBEZG!RURv7`2eK7vkC z3_y22C%7l$p|8PoE;erEj?>uJ0ZL`uLQS`we8G>!7_J@Te}3|Cl35|_c<8G{QV#AA zlT@`Gj@8{x;%f)I(vw#tSI|KlK>MLxC4xOM1V2GyDkGG6Y!ibyZ5L!b1mi1A_9boK zCH7utBy>qV(Kzkw3=pY9d6}Qv<0wPtVY1VapO7mc4P*q&{w3Mn9u-qqA}gbn;50;o zvq8?VrVWA^-wnVb)(zp&Rl75I9P1|VB0Bqba_T05N^s?_XO$%1RH}t20wa^y2gC&3 zqQWSlb*{nZB@n>~d?n1t6&Q@#&DX_kd6V$ z-IS?!`K8b*kguQn+-hZ;7S=ZQ`JrIbqz YT03bz&0G01*3h#wHSO8_S8cBR1sH4Cg8%>k literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/brain/__pycache__/brain_pytest.cpython-37.pyc b/venv/Lib/site-packages/astroid/brain/__pycache__/brain_pytest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..199d17bde5fa64794d574d1e545c102ab90a6c34 GIT binary patch literal 2162 zcmbtW&2Aev5Z={~B`=i3$L7=pa)}OEB=D(06GV;;BS38gO>)@^AXef?CcHnykXuVW zqh)d3VoNtC4a&&UiT7|O$L%GzTbo37qdP9HpAepElEj2Ka$pZDTwd!4r zE=T8Qzpj2jmO@r6;Q}?OUp7uZaf3~>) zmrp*mE|VV*JTC||E}sV>HOCvW%CRiL>s@k$=}m(9PF0!bfV(tg^QzdnMqLXjMLyrP zDp3kh3t9+^DM%f@v0HP7SfKM+5+s0BftzxW|03&Mda*)>{}^g*9moufb@h z(FJwqKnIlQ0v``84illE8M`~E$jKeuqwo@LLXlS)8y-hb?b(5 zwI5qPaF~?y`T9O8&`e`8Z5~jKh}=W*_VncOFshN?6uIP+Iz?(rjc7@~hwb~Kor#4m z5tKV?H)+tW)loIDu%&>Mvr4iHyaD*O?fCjyn)vQ=RhO&jmH}=sH(aaW8)_TN|K`cC zja{l8XevoOpc+P*!6v5EeD;vahwJ{Gyna6ZKyS4gUyRPr-+X))ou0iLkEA?JbTa;> zpvQRp9x^$WLOv0>()2h#xjH_EXN#X^U5w;%b>z~`y-HK4BJ5Bwv4(C(iO{Qm%C7O6b| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/brain/__pycache__/brain_qt.cpython-37.pyc b/venv/Lib/site-packages/astroid/brain/__pycache__/brain_qt.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1448e4419fdfaf3d915dd25e05d3d42257169cb9 GIT binary patch literal 2068 zcmcIlPjA~c6elHFR%FLX)3i;79R%zW52=A7#jpiwFgO3uq4k=%16IwLpomPOSe6`; z8R{V2VeNUJAvx}o?7pK8yX>^Du+!e7WXD}sw3ksJMN*HC@BM!7Jw2SAbqTa|?YHlL zo+0ECb2mFQNDdVC^^G2!g;aQv%JC!tJT*9ZyFcgyK?r?Ofy75sOCXs=vp_$Mf z=v&a`1`Lc|kQ36k#pk0XoH4pgn6XS=8W+Y1y`X)gODv*{zAHYX1fS<5HNGRv1h=eC zJ`)5{5=t2af`Yo;rkOY5RH`tIcn~TjWNxM5fP=lTh!4&b-w`4cAZMYyeobl%11)4m ziTss_259>GhpqMAw~`Cld(z(9d-T)2*7i=f*B%bHLlyQOXHl5+p7Fu3H;jjO^_59- z_jqlM-+S@JVJ|G;p1c9!IPK{%I909TC|?K?q#{V-J`V~bZXhanIiW5!XamNEVN)>= zI}y5v4I#v?A>4$C0?=O3mjKonIA$&r02AVEgIpNQDp!_XRmxRm1ELf_v^(d2xE?f( zqjyc(N_KFZMsAc*Nr$A!wpw z9`zsWhKb};N>I@d7<)r2i{;yj-*<=);;|i{hT=%ROI}m~rQAaC+`Yajua;Lf4S~rk zAfrjs6m^ugi-^zNGCUwKbXXL_9E#jhB1|P@(jY+4N)A7UPZCuSYB)A^fW-zCw_*K% zGWh!xgPlx09d%>Ii`@GV8po7PQTZ+~$8m6tV;Kr#9q&8%p{)6H|8hj!1Q5jn4wxwa z!J1gakGF8ZESlo#&NNpNuqoME1+ll;x&ylr^hulK8>&@ALB3rYj9yX5AER^r+;uTE zx{vlc?Z+!q1*N%Ogt}Yg*8bNzquyi$PflS{oE{&9aJ1k`f%Vg`Lrsa(qu>Bb?v#hx zR~?eKF%a)Vfr&D~gNe^rXeH_))Um}9ywB@U`PKc_zS;uGNn~P;!K-v_!63dMm*fiS z3zlK@bg_u6@?5KkFf93}SU;OoC(o2=+A3!w2?qx(-24hOO6Wv<1VabJF*BQUc{K=F z76pM{E$gOsSRm~FT)EZKZgWupQb8>`Yq2=${1Ql;_Re3J{J16<__f`$G*WSvZu3Lm o*}|U&%%*I;hSAw5vVRjRf<#*_W1iOWG2NOo506`i;%r0z2X>(Lw*UYD literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/brain/__pycache__/brain_random.cpython-37.pyc b/venv/Lib/site-packages/astroid/brain/__pycache__/brain_random.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e413481016934b9354d0d44eb62daf92701916b9 GIT binary patch literal 2218 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/brain/__pycache__/brain_ssl.cpython-37.pyc b/venv/Lib/site-packages/astroid/brain/__pycache__/brain_ssl.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2902498367fbfae2b2d635734c69319720523f2 GIT binary patch literal 3527 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 JQzK}sJ_6udt3v<) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/brain/__pycache__/brain_typing.cpython-37.pyc b/venv/Lib/site-packages/astroid/brain/__pycache__/brain_typing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dff0b5581f8283204d52efa6c0c54b8f471c1db2 GIT binary patch literal 2289 zcmZ`)&2k$>5Z>8;t!()>PEr_HAQVW= zKe#v@1_i;McoS@rk-gF}@up~zPP|aOX*x$IY3T*=X6O{12F)y;r!#aGG;>TF%`Zoj{uxSc+C#X%hQb}I3Kn+)Q( z&qd`G+(xOFO=)db>(#Z|T{(9zVe7pP z1C@y^jlZgK-shfE54wyt2XVxPGkN4Qm1i{%Vs<~^o>ga0P#%_Yr`#}JpW3@lI|`D- z-DDzI0$*0X<+v~?>$twZ!$c@p*Y}qa7Im(lNMIvUF=aL7Bi;qyNgJ`L>k_MKZTC?8K+o7J_o^=CIKE44^c zRz~)TGAdC0gdFL@5yjEOA;=I1d9&;T(pMT>!zggSd+Nd^b(gd(~15q~k6b70@l7`pV)3&s+LKrn| znvBfgW*?@9`~Rv|z$sY(qNplaAk*ZMIze=(u&&ON65%db#<0Qb;|WT6eL~gwU5dhM=5E+?NJt0XQp&=|`j|v%dMh?|Z2-Pnu=Rje+#MjFl ze)twB9y|g#{BoAc`q0XR%XecWk|KkzWADuOPwpIctA@5th<{mynC(Nho&H zuI7vA^gf!5B#uH+*57F4bej**<9tr#%(?c(SM&$)O3(`%b~bI;5;W@~;bqX3NgaO| zrRDpy-}ZfJW*6|R{3+!4Sfx14&V_GQ)+q>J@4dW9>ebEKO7q^-$>}(1)O)1z+c(*8JlH7TcZhgswFM?Zi?_%LOiU-#(5@WS0MYK`s%0z3WBfF8& zYIQn~Y9)4+9RCCq6yq*9OP0yvE$}(`$_-m3(dt(*% zm15j}?w;f=x5cLS^P=L$i~!ic1rQ?Io#elv-FrXu5R4mihwfqjR|Li+%j-d3)NRsj z>|?`g8DkwlW_df(7tw<{j&OY(x+Np umc~k*Tg@8-2dvX@<~pCt^*=yvf%*Y$f7m1UADPD>7#-pv4Lyb#Cipk4#Fg>@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/brain/brain_attrs.py b/venv/Lib/site-packages/astroid/brain/brain_attrs.py new file mode 100644 index 00000000..06dc912f --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_attrs.py @@ -0,0 +1,60 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER +""" +Astroid hook for the attrs library + +Without this hook pylint reports unsupported-assignment-operation +for atrrs classes +""" + +import astroid +from astroid import MANAGER + + +ATTR_IB = 'attr.ib' + + +def is_decorated_with_attrs( + node, decorator_names=('attr.s', 'attr.attrs', 'attr.attributes')): + """Return True if a decorated node has + an attr decorator applied.""" + if not node.decorators: + return False + for decorator_attribute in node.decorators.nodes: + if isinstance(decorator_attribute, astroid.Call): # decorator with arguments + decorator_attribute = decorator_attribute.func + if decorator_attribute.as_string() in decorator_names: + return True + return False + + +def attr_attributes_transform(node): + """Given that the ClassNode has an attr decorator, + rewrite class attributes as instance attributes + """ + # Astroid can't infer this attribute properly + # Prevents https://github.com/PyCQA/pylint/issues/1884 + node.locals["__attrs_attrs__"] = [astroid.Unknown(parent=node)] + + for cdefbodynode in node.body: + if not isinstance(cdefbodynode, astroid.Assign): + continue + if isinstance(cdefbodynode.value, astroid.Call): + if cdefbodynode.value.func.as_string() != ATTR_IB: + continue + else: + continue + for target in cdefbodynode.targets: + + rhs_node = astroid.Unknown( + lineno=cdefbodynode.lineno, + col_offset=cdefbodynode.col_offset, + parent=cdefbodynode + ) + node.locals[target.name] = [rhs_node] + + +MANAGER.register_transform( + astroid.ClassDef, + attr_attributes_transform, + is_decorated_with_attrs) diff --git a/venv/Lib/site-packages/astroid/brain/brain_builtin_inference.py b/venv/Lib/site-packages/astroid/brain/brain_builtin_inference.py new file mode 100644 index 00000000..e6def5c7 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_builtin_inference.py @@ -0,0 +1,803 @@ +# Copyright (c) 2014-2018 Claudiu Popa +# Copyright (c) 2014-2015 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2015 Rene Zhang +# Copyright (c) 2018 Bryce Guinta + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Astroid hooks for various builtins.""" + +from functools import partial +import sys +from textwrap import dedent + +import six +from astroid import ( + MANAGER, + Instance, + UseInferenceDefault, + AttributeInferenceError, + inference_tip, + InferenceError, + NameInferenceError, + AstroidTypeError, + MroError, +) +from astroid import arguments +from astroid.builder import AstroidBuilder +from astroid import helpers +from astroid import nodes +from astroid import objects +from astroid import scoped_nodes +from astroid import util + + +OBJECT_DUNDER_NEW = 'object.__new__' + + +def _extend_str(class_node, rvalue): + """function to extend builtin str/unicode class""" + code = dedent(''' + class whatever(object): + def join(self, iterable): + return {rvalue} + def replace(self, old, new, count=None): + return {rvalue} + def format(self, *args, **kwargs): + return {rvalue} + def encode(self, encoding='ascii', errors=None): + return '' + def decode(self, encoding='ascii', errors=None): + return u'' + def capitalize(self): + return {rvalue} + def title(self): + return {rvalue} + def lower(self): + return {rvalue} + def upper(self): + return {rvalue} + def swapcase(self): + return {rvalue} + def index(self, sub, start=None, end=None): + return 0 + def find(self, sub, start=None, end=None): + return 0 + def count(self, sub, start=None, end=None): + return 0 + def strip(self, chars=None): + return {rvalue} + def lstrip(self, chars=None): + return {rvalue} + def rstrip(self, chars=None): + return {rvalue} + def rjust(self, width, fillchar=None): + return {rvalue} + def center(self, width, fillchar=None): + return {rvalue} + def ljust(self, width, fillchar=None): + return {rvalue} + ''') + code = code.format(rvalue=rvalue) + fake = AstroidBuilder(MANAGER).string_build(code)['whatever'] + for method in fake.mymethods(): + method.parent = class_node + method.lineno = None + method.col_offset = None + if '__class__' in method.locals: + method.locals['__class__'] = [class_node] + class_node.locals[method.name] = [method] + method.parent = class_node + + +def extend_builtins(class_transforms): + from astroid.bases import BUILTINS + builtin_ast = MANAGER.astroid_cache[BUILTINS] + for class_name, transform in class_transforms.items(): + transform(builtin_ast[class_name]) + + +if sys.version_info > (3, 0): + extend_builtins({'bytes': partial(_extend_str, rvalue="b''"), + 'str': partial(_extend_str, rvalue="''")}) +else: + extend_builtins({'str': partial(_extend_str, rvalue="''"), + 'unicode': partial(_extend_str, rvalue="u''")}) + + +def _builtin_filter_predicate(node, builtin_name): + if isinstance(node.func, nodes.Name) and node.func.name == builtin_name: + return True + if isinstance(node.func, nodes.Attribute): + return (node.func.attrname == 'fromkeys' + and isinstance(node.func.expr, nodes.Name) + and node.func.expr.name == 'dict') + return False + + +def register_builtin_transform(transform, builtin_name): + """Register a new transform function for the given *builtin_name*. + + The transform function must accept two parameters, a node and + an optional context. + """ + def _transform_wrapper(node, context=None): + result = transform(node, context=context) + if result: + if not result.parent: + # Let the transformation function determine + # the parent for its result. Otherwise, + # we set it to be the node we transformed from. + result.parent = node + + if result.lineno is None: + result.lineno = node.lineno + if result.col_offset is None: + result.col_offset = node.col_offset + return iter([result]) + + MANAGER.register_transform( + nodes.Call, + inference_tip(_transform_wrapper), + partial(_builtin_filter_predicate, builtin_name=builtin_name), + ) + + +def _generic_inference(node, context, node_type, transform): + args = node.args + if not args: + return node_type() + if len(node.args) > 1: + raise UseInferenceDefault() + + arg, = args + transformed = transform(arg) + if not transformed: + try: + inferred = next(arg.infer(context=context)) + except (InferenceError, StopIteration): + raise UseInferenceDefault() + if inferred is util.Uninferable: + raise UseInferenceDefault() + transformed = transform(inferred) + if not transformed or transformed is util.Uninferable: + raise UseInferenceDefault() + return transformed + + +def _generic_transform(arg, klass, iterables, build_elts): + if isinstance(arg, klass): + return arg + elif isinstance(arg, iterables): + if not all(isinstance(elt, nodes.Const) for elt in arg.elts): + raise UseInferenceDefault() + elts = [elt.value for elt in arg.elts] + elif isinstance(arg, nodes.Dict): + if not all(isinstance(elt[0], nodes.Const) + for elt in arg.items): + raise UseInferenceDefault() + elts = [item[0].value for item in arg.items] + elif (isinstance(arg, nodes.Const) and + isinstance(arg.value, (six.string_types, six.binary_type))): + elts = arg.value + else: + return + return klass.from_constants(elts=build_elts(elts)) + + +def _infer_builtin(node, context, + klass=None, iterables=None, + build_elts=None): + transform_func = partial( + _generic_transform, + klass=klass, + iterables=iterables, + build_elts=build_elts) + + return _generic_inference(node, context, klass, transform_func) + +# pylint: disable=invalid-name +infer_tuple = partial( + _infer_builtin, + klass=nodes.Tuple, + iterables=(nodes.List, nodes.Set, objects.FrozenSet, + objects.DictItems, objects.DictKeys, + objects.DictValues), + build_elts=tuple) + +infer_list = partial( + _infer_builtin, + klass=nodes.List, + iterables=(nodes.Tuple, nodes.Set, objects.FrozenSet, + objects.DictItems, objects.DictKeys, + objects.DictValues), + build_elts=list) + +infer_set = partial( + _infer_builtin, + klass=nodes.Set, + iterables=(nodes.List, nodes.Tuple, objects.FrozenSet, + objects.DictKeys), + build_elts=set) + +infer_frozenset = partial( + _infer_builtin, + klass=objects.FrozenSet, + iterables=(nodes.List, nodes.Tuple, nodes.Set, objects.FrozenSet, + objects.DictKeys), + build_elts=frozenset) + + +def _get_elts(arg, context): + is_iterable = lambda n: isinstance(n, + (nodes.List, nodes.Tuple, nodes.Set)) + try: + inferred = next(arg.infer(context)) + except (InferenceError, NameInferenceError): + raise UseInferenceDefault() + if isinstance(inferred, nodes.Dict): + items = inferred.items + elif is_iterable(inferred): + items = [] + for elt in inferred.elts: + # If an item is not a pair of two items, + # then fallback to the default inference. + # Also, take in consideration only hashable items, + # tuples and consts. We are choosing Names as well. + if not is_iterable(elt): + raise UseInferenceDefault() + if len(elt.elts) != 2: + raise UseInferenceDefault() + if not isinstance(elt.elts[0], + (nodes.Tuple, nodes.Const, nodes.Name)): + raise UseInferenceDefault() + items.append(tuple(elt.elts)) + else: + raise UseInferenceDefault() + return items + +def infer_dict(node, context=None): + """Try to infer a dict call to a Dict node. + + The function treats the following cases: + + * dict() + * dict(mapping) + * dict(iterable) + * dict(iterable, **kwargs) + * dict(mapping, **kwargs) + * dict(**kwargs) + + If a case can't be inferred, we'll fallback to default inference. + """ + call = arguments.CallSite.from_call(node) + if call.has_invalid_arguments() or call.has_invalid_keywords(): + raise UseInferenceDefault + + args = call.positional_arguments + kwargs = list(call.keyword_arguments.items()) + + if not args and not kwargs: + # dict() + return nodes.Dict() + elif kwargs and not args: + # dict(a=1, b=2, c=4) + items = [(nodes.Const(key), value) for key, value in kwargs] + elif len(args) == 1 and kwargs: + # dict(some_iterable, b=2, c=4) + elts = _get_elts(args[0], context) + keys = [(nodes.Const(key), value) for key, value in kwargs] + items = elts + keys + elif len(args) == 1: + items = _get_elts(args[0], context) + else: + raise UseInferenceDefault() + + value = nodes.Dict(col_offset=node.col_offset, + lineno=node.lineno, + parent=node.parent) + value.postinit(items) + return value + + +def infer_super(node, context=None): + """Understand super calls. + + There are some restrictions for what can be understood: + + * unbounded super (one argument form) is not understood. + + * if the super call is not inside a function (classmethod or method), + then the default inference will be used. + + * if the super arguments can't be inferred, the default inference + will be used. + """ + if len(node.args) == 1: + # Ignore unbounded super. + raise UseInferenceDefault + + scope = node.scope() + if not isinstance(scope, nodes.FunctionDef): + # Ignore non-method uses of super. + raise UseInferenceDefault + if scope.type not in ('classmethod', 'method'): + # Not interested in staticmethods. + raise UseInferenceDefault + + cls = scoped_nodes.get_wrapping_class(scope) + if not len(node.args): + mro_pointer = cls + # In we are in a classmethod, the interpreter will fill + # automatically the class as the second argument, not an instance. + if scope.type == 'classmethod': + mro_type = cls + else: + mro_type = cls.instantiate_class() + else: + try: + mro_pointer = next(node.args[0].infer(context=context)) + except InferenceError: + raise UseInferenceDefault + try: + mro_type = next(node.args[1].infer(context=context)) + except InferenceError: + raise UseInferenceDefault + + if mro_pointer is util.Uninferable or mro_type is util.Uninferable: + # No way we could understand this. + raise UseInferenceDefault + + super_obj = objects.Super(mro_pointer=mro_pointer, + mro_type=mro_type, + self_class=cls, + scope=scope) + super_obj.parent = node + return super_obj + + +def _infer_getattr_args(node, context): + if len(node.args) not in (2, 3): + # Not a valid getattr call. + raise UseInferenceDefault + + try: + obj = next(node.args[0].infer(context=context)) + attr = next(node.args[1].infer(context=context)) + except InferenceError: + raise UseInferenceDefault + + if obj is util.Uninferable or attr is util.Uninferable: + # If one of the arguments is something we can't infer, + # then also make the result of the getattr call something + # which is unknown. + return util.Uninferable, util.Uninferable + + is_string = (isinstance(attr, nodes.Const) and + isinstance(attr.value, six.string_types)) + if not is_string: + raise UseInferenceDefault + + return obj, attr.value + + +def infer_getattr(node, context=None): + """Understand getattr calls + + If one of the arguments is an Uninferable object, then the + result will be an Uninferable object. Otherwise, the normal attribute + lookup will be done. + """ + obj, attr = _infer_getattr_args(node, context) + if obj is util.Uninferable or attr is util.Uninferable or not hasattr(obj, 'igetattr'): + return util.Uninferable + + try: + return next(obj.igetattr(attr, context=context)) + except (StopIteration, InferenceError, AttributeInferenceError): + if len(node.args) == 3: + # Try to infer the default and return it instead. + try: + return next(node.args[2].infer(context=context)) + except InferenceError: + raise UseInferenceDefault + + raise UseInferenceDefault + + +def infer_hasattr(node, context=None): + """Understand hasattr calls + + This always guarantees three possible outcomes for calling + hasattr: Const(False) when we are sure that the object + doesn't have the intended attribute, Const(True) when + we know that the object has the attribute and Uninferable + when we are unsure of the outcome of the function call. + """ + try: + obj, attr = _infer_getattr_args(node, context) + if obj is util.Uninferable or attr is util.Uninferable or not hasattr(obj, 'getattr'): + return util.Uninferable + obj.getattr(attr, context=context) + except UseInferenceDefault: + # Can't infer something from this function call. + return util.Uninferable + except AttributeInferenceError: + # Doesn't have it. + return nodes.Const(False) + return nodes.Const(True) + + +def infer_callable(node, context=None): + """Understand callable calls + + This follows Python's semantics, where an object + is callable if it provides an attribute __call__, + even though that attribute is something which can't be + called. + """ + if len(node.args) != 1: + # Invalid callable call. + raise UseInferenceDefault + + argument = node.args[0] + try: + inferred = next(argument.infer(context=context)) + except InferenceError: + return util.Uninferable + if inferred is util.Uninferable: + return util.Uninferable + return nodes.Const(inferred.callable()) + + +def infer_bool(node, context=None): + """Understand bool calls.""" + if len(node.args) > 1: + # Invalid bool call. + raise UseInferenceDefault + + if not node.args: + return nodes.Const(False) + + argument = node.args[0] + try: + inferred = next(argument.infer(context=context)) + except InferenceError: + return util.Uninferable + if inferred is util.Uninferable: + return util.Uninferable + + bool_value = inferred.bool_value() + if bool_value is util.Uninferable: + return util.Uninferable + return nodes.Const(bool_value) + + +def infer_type(node, context=None): + """Understand the one-argument form of *type*.""" + if len(node.args) != 1: + raise UseInferenceDefault + + return helpers.object_type(node.args[0], context) + + +def infer_slice(node, context=None): + """Understand `slice` calls.""" + args = node.args + if not 0 < len(args) <= 3: + raise UseInferenceDefault + + args = list(map(helpers.safe_infer, args)) + for arg in args: + if not arg or arg is util.Uninferable: + raise UseInferenceDefault + if not isinstance(arg, nodes.Const): + raise UseInferenceDefault + if not isinstance(arg.value, (type(None), int)): + raise UseInferenceDefault + + if len(args) < 3: + # Make sure we have 3 arguments. + args.extend([None] * (3 - len(args))) + + slice_node = nodes.Slice(lineno=node.lineno, + col_offset=node.col_offset, + parent=node.parent) + slice_node.postinit(*args) + return slice_node + + +def _infer_object__new__decorator(node, context=None): + # Instantiate class immediately + # since that's what @object.__new__ does + return iter((node.instantiate_class(),)) + + +def _infer_object__new__decorator_check(node): + """Predicate before inference_tip + + Check if the given ClassDef has an @object.__new__ decorator + """ + if not node.decorators: + return False + + for decorator in node.decorators.nodes: + if isinstance(decorator, nodes.Attribute): + if decorator.as_string() == OBJECT_DUNDER_NEW: + return True + return False + + +def infer_issubclass(callnode, context=None): + """Infer issubclass() calls + + :param nodes.Call callnode: an `issubclass` call + :param InferenceContext: the context for the inference + :rtype nodes.Const: Boolean Const value of the `issubclass` call + :raises UseInferenceDefault: If the node cannot be inferred + """ + call = arguments.CallSite.from_call(callnode) + if call.keyword_arguments: + # issubclass doesn't support keyword arguments + raise UseInferenceDefault("TypeError: issubclass() takes no keyword arguments") + if len(call.positional_arguments) != 2: + raise UseInferenceDefault( + "Expected two arguments, got {count}" + .format(count=len(call.positional_arguments))) + # The left hand argument is the obj to be checked + obj_node, class_or_tuple_node = call.positional_arguments + + try: + obj_type = next(obj_node.infer(context=context)) + except InferenceError as exc: + raise UseInferenceDefault from exc + if not isinstance(obj_type, nodes.ClassDef): + raise UseInferenceDefault("TypeError: arg 1 must be class") + + # The right hand argument is the class(es) that the given + # object is to be checked against. + try: + class_container = _class_or_tuple_to_container( + class_or_tuple_node, context=context) + except InferenceError as exc: + raise UseInferenceDefault from exc + try: + issubclass_bool = helpers.object_issubclass(obj_type, class_container, context) + except AstroidTypeError as exc: + raise UseInferenceDefault("TypeError: " + str(exc)) from exc + except MroError as exc: + raise UseInferenceDefault from exc + return nodes.Const(issubclass_bool) + + +def infer_isinstance(callnode, context=None): + """Infer isinstance calls + + :param nodes.Call callnode: an isinstance call + :param InferenceContext: context for call + (currently unused but is a common interface for inference) + :rtype nodes.Const: Boolean Const value of isinstance call + + :raises UseInferenceDefault: If the node cannot be inferred + """ + call = arguments.CallSite.from_call(callnode) + if call.keyword_arguments: + # isinstance doesn't support keyword arguments + raise UseInferenceDefault("TypeError: isinstance() takes no keyword arguments") + if len(call.positional_arguments) != 2: + raise UseInferenceDefault( + "Expected two arguments, got {count}" + .format(count=len(call.positional_arguments))) + # The left hand argument is the obj to be checked + obj_node, class_or_tuple_node = call.positional_arguments + # The right hand argument is the class(es) that the given + # obj is to be check is an instance of + try: + class_container = _class_or_tuple_to_container( + class_or_tuple_node, context=context) + except InferenceError: + raise UseInferenceDefault + try: + isinstance_bool = helpers.object_isinstance( + obj_node, class_container, context) + except AstroidTypeError as exc: + raise UseInferenceDefault("TypeError: " + str(exc)) + except MroError as exc: + raise UseInferenceDefault from exc + if isinstance_bool is util.Uninferable: + raise UseInferenceDefault + return nodes.Const(isinstance_bool) + + +def _class_or_tuple_to_container(node, context=None): + # Move inferences results into container + # to simplify later logic + # raises InferenceError if any of the inferences fall through + node_infer = next(node.infer(context=context)) + # arg2 MUST be a type or a TUPLE of types + # for isinstance + if isinstance(node_infer, nodes.Tuple): + class_container = [ + next(node.infer(context=context)) + for node in node_infer.elts + ] + class_container = [ + klass_node for klass_node + in class_container if klass_node is not None + ] + else: + class_container = [node_infer] + return class_container + + +def infer_len(node, context=None): + """Infer length calls + + :param nodes.Call node: len call to infer + :param context.InferenceContext: node context + :rtype nodes.Const: a Const node with the inferred length, if possible + """ + call = arguments.CallSite.from_call(node) + if call.keyword_arguments: + raise UseInferenceDefault( + "TypeError: len() must take no keyword arguments" + ) + if len(call.positional_arguments) != 1: + raise UseInferenceDefault( + "TypeError: len() must take exactly one argument " + "({len}) given".format(len=len(call.positional_arguments)) + ) + [argument_node] = call.positional_arguments + try: + return nodes.Const(helpers.object_len(argument_node)) + except (AstroidTypeError, InferenceError) as exc: + raise UseInferenceDefault(str(exc)) from exc + + +def infer_str(node, context=None): + """Infer str() calls + + :param nodes.Call node: str() call to infer + :param context.InferenceContext: node context + :rtype nodes.Const: a Const containing an empty string + """ + call = arguments.CallSite.from_call(node) + if call.keyword_arguments: + raise UseInferenceDefault( + "TypeError: str() must take no keyword arguments") + try: + return nodes.Const('') + except (AstroidTypeError, InferenceError) as exc: + raise UseInferenceDefault(str(exc)) from exc + + +def infer_int(node, context=None): + """Infer int() calls + + :param nodes.Call node: int() call to infer + :param context.InferenceContext: node context + :rtype nodes.Const: a Const containing the integer value of the int() call + """ + call = arguments.CallSite.from_call(node) + if call.keyword_arguments: + raise UseInferenceDefault( + "TypeError: int() must take no keyword arguments" + ) + + if call.positional_arguments: + try: + first_value = next(call.positional_arguments[0].infer(context=context)) + except InferenceError as exc: + raise UseInferenceDefault(str(exc)) from exc + + if first_value is util.Uninferable: + raise UseInferenceDefault + + if isinstance(first_value, nodes.Const) and isinstance(first_value.value, (int, str)): + try: + actual_value = int(first_value.value) + except ValueError: + return nodes.Const(0) + return nodes.Const(actual_value) + + return nodes.Const(0) + + +def infer_dict_fromkeys(node, context=None): + """Infer dict.fromkeys + + :param nodes.Call node: dict.fromkeys() call to infer + :param context.InferenceContext: node context + :rtype nodes.Dict: + a Dictionary containing the values that astroid was able to infer. + In case the inference failed for any reason, an empty dictionary + will be inferred instead. + """ + + def _build_dict_with_elements(elements): + new_node = nodes.Dict(col_offset=node.col_offset, + lineno=node.lineno, + parent=node.parent) + new_node.postinit(elements) + return new_node + + call = arguments.CallSite.from_call(node) + if call.keyword_arguments: + raise UseInferenceDefault( + "TypeError: int() must take no keyword arguments" + ) + if len(call.positional_arguments) not in {1, 2}: + raise UseInferenceDefault("TypeError: Needs between 1 and 2 positional arguments") + + default = nodes.Const(None) + values = call.positional_arguments[0] + try: + inferred_values = next(values.infer(context=context)) + except InferenceError: + return _build_dict_with_elements([]) + if inferred_values is util.Uninferable: + return _build_dict_with_elements([]) + + # Limit to a couple of potential values, as this can become pretty complicated + accepted_iterable_elements = ( + nodes.Const, + ) + if isinstance(inferred_values, (nodes.List, nodes.Set, nodes.Tuple)): + elements = inferred_values.elts + for element in elements: + if not isinstance(element, accepted_iterable_elements): + # Fallback to an empty dict + return _build_dict_with_elements([]) + + elements_with_value = [(element, default) for element in elements] + return _build_dict_with_elements(elements_with_value) + + elif (isinstance(inferred_values, nodes.Const) + and isinstance(inferred_values.value, (str, bytes))): + elements = [ + (nodes.Const(element), default) for element in inferred_values.value + ] + return _build_dict_with_elements(elements) + elif isinstance(inferred_values, nodes.Dict): + keys = inferred_values.itered() + for key in keys: + if not isinstance(key, accepted_iterable_elements): + # Fallback to an empty dict + return _build_dict_with_elements([]) + + elements_with_value = [(element, default) for element in keys] + return _build_dict_with_elements(elements_with_value) + + # Fallback to an empty dictionary + return _build_dict_with_elements([]) + + +# Builtins inference +register_builtin_transform(infer_bool, 'bool') +register_builtin_transform(infer_super, 'super') +register_builtin_transform(infer_callable, 'callable') +register_builtin_transform(infer_getattr, 'getattr') +register_builtin_transform(infer_hasattr, 'hasattr') +register_builtin_transform(infer_tuple, 'tuple') +register_builtin_transform(infer_set, 'set') +register_builtin_transform(infer_list, 'list') +register_builtin_transform(infer_dict, 'dict') +register_builtin_transform(infer_frozenset, 'frozenset') +register_builtin_transform(infer_type, 'type') +register_builtin_transform(infer_slice, 'slice') +register_builtin_transform(infer_isinstance, 'isinstance') +register_builtin_transform(infer_issubclass, 'issubclass') +register_builtin_transform(infer_len, 'len') +register_builtin_transform(infer_str, 'str') +register_builtin_transform(infer_int, 'int') +register_builtin_transform(infer_dict_fromkeys, 'dict.fromkeys') + + +# Infer object.__new__ calls +MANAGER.register_transform( + nodes.ClassDef, + inference_tip(_infer_object__new__decorator), + _infer_object__new__decorator_check +) diff --git a/venv/Lib/site-packages/astroid/brain/brain_collections.py b/venv/Lib/site-packages/astroid/brain/brain_collections.py new file mode 100644 index 00000000..c255bf44 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_collections.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2016, 2018 Claudiu Popa +# Copyright (c) 2016-2017 Łukasz Rogalski +# Copyright (c) 2017 Derek Gustafson +# Copyright (c) 2018 Ioana Tagirta + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER +import sys + +import astroid + +PY34 = sys.version_info >= (3, 4) +PY35 = sys.version_info >= (3, 5) + + +def _collections_transform(): + return astroid.parse(''' + class defaultdict(dict): + default_factory = None + def __missing__(self, key): pass + def __getitem__(self, key): return default_factory + + ''' + _deque_mock() + _ordered_dict_mock()) + + +def _deque_mock(): + base_deque_class = ''' + class deque(object): + maxlen = 0 + def __init__(self, iterable=None, maxlen=None): + self.iterable = iterable or [] + def append(self, x): pass + def appendleft(self, x): pass + def clear(self): pass + def count(self, x): return 0 + def extend(self, iterable): pass + def extendleft(self, iterable): pass + def pop(self): return self.iterable[0] + def popleft(self): return self.iterable[0] + def remove(self, value): pass + def reverse(self): return reversed(self.iterable) + def rotate(self, n=1): return self + def __iter__(self): return self + def __reversed__(self): return self.iterable[::-1] + def __getitem__(self, index): return self.iterable[index] + def __setitem__(self, index, value): pass + def __delitem__(self, index): pass + def __bool__(self): return bool(self.iterable) + def __nonzero__(self): return bool(self.iterable) + def __contains__(self, o): return o in self.iterable + def __len__(self): return len(self.iterable) + def __copy__(self): return deque(self.iterable)''' + if PY35: + base_deque_class += ''' + def copy(self): return deque(self.iterable) + def index(self, x, start=0, end=0): return 0 + def insert(self, x, i): pass + def __add__(self, other): pass + def __iadd__(self, other): pass + def __mul__(self, other): pass + def __imul__(self, other): pass + def __rmul__(self, other): pass''' + return base_deque_class + + +def _ordered_dict_mock(): + base_ordered_dict_class = ''' + class OrderedDict(dict): + def __reversed__(self): return self[::-1] + ''' + if PY34: + base_ordered_dict_class += ''' + def move_to_end(self, key, last=False): pass''' + return base_ordered_dict_class + +astroid.register_module_extender(astroid.MANAGER, 'collections', _collections_transform) + diff --git a/venv/Lib/site-packages/astroid/brain/brain_curses.py b/venv/Lib/site-packages/astroid/brain/brain_curses.py new file mode 100644 index 00000000..f1954835 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_curses.py @@ -0,0 +1,177 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER +import astroid + + +def _curses_transform(): + return astroid.parse(''' + A_ALTCHARSET = 1 + A_BLINK = 1 + A_BOLD = 1 + A_DIM = 1 + A_INVIS = 1 + A_ITALIC = 1 + A_NORMAL = 1 + A_PROTECT = 1 + A_REVERSE = 1 + A_STANDOUT = 1 + A_UNDERLINE = 1 + A_HORIZONTAL = 1 + A_LEFT = 1 + A_LOW = 1 + A_RIGHT = 1 + A_TOP = 1 + A_VERTICAL = 1 + A_CHARTEXT = 1 + A_ATTRIBUTES = 1 + A_CHARTEXT = 1 + A_COLOR = 1 + KEY_MIN = 1 + KEY_BREAK = 1 + KEY_DOWN = 1 + KEY_UP = 1 + KEY_LEFT = 1 + KEY_RIGHT = 1 + KEY_HOME = 1 + KEY_BACKSPACE = 1 + KEY_F0 = 1 + KEY_Fn = 1 + KEY_DL = 1 + KEY_IL = 1 + KEY_DC = 1 + KEY_IC = 1 + KEY_EIC = 1 + KEY_CLEAR = 1 + KEY_EOS = 1 + KEY_EOL = 1 + KEY_SF = 1 + KEY_SR = 1 + KEY_NPAGE = 1 + KEY_PPAGE = 1 + KEY_STAB = 1 + KEY_CTAB = 1 + KEY_CATAB = 1 + KEY_ENTER = 1 + KEY_SRESET = 1 + KEY_RESET = 1 + KEY_PRINT = 1 + KEY_LL = 1 + KEY_A1 = 1 + KEY_A3 = 1 + KEY_B2 = 1 + KEY_C1 = 1 + KEY_C3 = 1 + KEY_BTAB = 1 + KEY_BEG = 1 + KEY_CANCEL = 1 + KEY_CLOSE = 1 + KEY_COMMAND = 1 + KEY_COPY = 1 + KEY_CREATE = 1 + KEY_END = 1 + KEY_EXIT = 1 + KEY_FIND = 1 + KEY_HELP = 1 + KEY_MARK = 1 + KEY_MESSAGE = 1 + KEY_MOVE = 1 + KEY_NEXT = 1 + KEY_OPEN = 1 + KEY_OPTIONS = 1 + KEY_PREVIOUS = 1 + KEY_REDO = 1 + KEY_REFERENCE = 1 + KEY_REFRESH = 1 + KEY_REPLACE = 1 + KEY_RESTART = 1 + KEY_RESUME = 1 + KEY_SAVE = 1 + KEY_SBEG = 1 + KEY_SCANCEL = 1 + KEY_SCOMMAND = 1 + KEY_SCOPY = 1 + KEY_SCREATE = 1 + KEY_SDC = 1 + KEY_SDL = 1 + KEY_SELECT = 1 + KEY_SEND = 1 + KEY_SEOL = 1 + KEY_SEXIT = 1 + KEY_SFIND = 1 + KEY_SHELP = 1 + KEY_SHOME = 1 + KEY_SIC = 1 + KEY_SLEFT = 1 + KEY_SMESSAGE = 1 + KEY_SMOVE = 1 + KEY_SNEXT = 1 + KEY_SOPTIONS = 1 + KEY_SPREVIOUS = 1 + KEY_SPRINT = 1 + KEY_SREDO = 1 + KEY_SREPLACE = 1 + KEY_SRIGHT = 1 + KEY_SRSUME = 1 + KEY_SSAVE = 1 + KEY_SSUSPEND = 1 + KEY_SUNDO = 1 + KEY_SUSPEND = 1 + KEY_UNDO = 1 + KEY_MOUSE = 1 + KEY_RESIZE = 1 + KEY_MAX = 1 + ACS_BBSS = 1 + ACS_BLOCK = 1 + ACS_BOARD = 1 + ACS_BSBS = 1 + ACS_BSSB = 1 + ACS_BSSS = 1 + ACS_BTEE = 1 + ACS_BULLET = 1 + ACS_CKBOARD = 1 + ACS_DARROW = 1 + ACS_DEGREE = 1 + ACS_DIAMOND = 1 + ACS_GEQUAL = 1 + ACS_HLINE = 1 + ACS_LANTERN = 1 + ACS_LARROW = 1 + ACS_LEQUAL = 1 + ACS_LLCORNER = 1 + ACS_LRCORNER = 1 + ACS_LTEE = 1 + ACS_NEQUAL = 1 + ACS_PI = 1 + ACS_PLMINUS = 1 + ACS_PLUS = 1 + ACS_RARROW = 1 + ACS_RTEE = 1 + ACS_S1 = 1 + ACS_S3 = 1 + ACS_S7 = 1 + ACS_S9 = 1 + ACS_SBBS = 1 + ACS_SBSB = 1 + ACS_SBSS = 1 + ACS_SSBB = 1 + ACS_SSBS = 1 + ACS_SSSB = 1 + ACS_SSSS = 1 + ACS_STERLING = 1 + ACS_TTEE = 1 + ACS_UARROW = 1 + ACS_ULCORNER = 1 + ACS_URCORNER = 1 + ACS_VLINE = 1 + COLOR_BLACK = 1 + COLOR_BLUE = 1 + COLOR_CYAN = 1 + COLOR_GREEN = 1 + COLOR_MAGENTA = 1 + COLOR_RED = 1 + COLOR_WHITE = 1 + COLOR_YELLOW = 1 + ''') + + +astroid.register_module_extender(astroid.MANAGER, 'curses', _curses_transform) diff --git a/venv/Lib/site-packages/astroid/brain/brain_dateutil.py b/venv/Lib/site-packages/astroid/brain/brain_dateutil.py new file mode 100644 index 00000000..0c641ac6 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_dateutil.py @@ -0,0 +1,22 @@ +# Copyright (c) 2015-2016 Claudiu Popa +# Copyright (c) 2015 raylu +# Copyright (c) 2016 Ceridwen + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Astroid hooks for dateutil""" + +import textwrap + +from astroid import MANAGER, register_module_extender +from astroid.builder import AstroidBuilder + +def dateutil_transform(): + return AstroidBuilder(MANAGER).string_build(textwrap.dedent(''' + import datetime + def parse(timestr, parserinfo=None, **kwargs): + return datetime.datetime() + ''')) + +register_module_extender(MANAGER, 'dateutil.parser', dateutil_transform) diff --git a/venv/Lib/site-packages/astroid/brain/brain_fstrings.py b/venv/Lib/site-packages/astroid/brain/brain_fstrings.py new file mode 100644 index 00000000..25a5c89b --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_fstrings.py @@ -0,0 +1,60 @@ +# Copyright (c) 2017 Claudiu Popa + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +import sys + +import astroid + + +def _clone_node_with_lineno(node, parent, lineno): + cls = node.__class__ + other_fields = node._other_fields + _astroid_fields = node._astroid_fields + init_params = { + 'lineno': lineno, + 'col_offset': node.col_offset, + 'parent': parent + } + postinit_params = { + param: getattr(node, param) + for param in _astroid_fields + } + if other_fields: + init_params.update({ + param: getattr(node, param) + for param in other_fields + }) + new_node = cls(**init_params) + if hasattr(node, 'postinit') and _astroid_fields: + new_node.postinit(**postinit_params) + return new_node + + +def _transform_formatted_value(node): + if node.value and node.value.lineno == 1: + if node.lineno != node.value.lineno: + new_node = astroid.FormattedValue( + lineno=node.lineno, + col_offset=node.col_offset, + parent=node.parent + ) + new_value = _clone_node_with_lineno( + node=node.value, + lineno=node.lineno, + parent=new_node + ) + new_node.postinit(value=new_value, + format_spec=node.format_spec) + return new_node + + +if sys.version_info[:2] >= (3, 6): + # TODO: this fix tries to *patch* http://bugs.python.org/issue29051 + # The problem is that FormattedValue.value, which is a Name node, + # has wrong line numbers, usually 1. This creates problems for pylint, + # which expects correct line numbers for things such as message control. + astroid.MANAGER.register_transform( + astroid.FormattedValue, + _transform_formatted_value) diff --git a/venv/Lib/site-packages/astroid/brain/brain_functools.py b/venv/Lib/site-packages/astroid/brain/brain_functools.py new file mode 100644 index 00000000..b70dd4dc --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_functools.py @@ -0,0 +1,176 @@ +# Copyright (c) 2016, 2018 Claudiu Popa +# Copyright (c) 2018 Bryce Guinta + +"""Astroid hooks for understanding functools library module.""" +from itertools import chain + +import astroid +from astroid import arguments +from astroid import BoundMethod +from astroid import extract_node +from astroid import helpers +from astroid.interpreter import objectmodel +from astroid import MANAGER + + +LRU_CACHE = 'functools.lru_cache' + + +class LruWrappedModel(objectmodel.FunctionModel): + """Special attribute model for functions decorated with functools.lru_cache. + + The said decorators patches at decoration time some functions onto + the decorated function. + """ + + @property + def py__wrapped__(self): + return self._instance + + @property + def pycache_info(self): + cache_info = extract_node(''' + from functools import _CacheInfo + _CacheInfo(0, 0, 0, 0) + ''') + class CacheInfoBoundMethod(BoundMethod): + def infer_call_result(self, caller, context=None): + yield helpers.safe_infer(cache_info) + + return CacheInfoBoundMethod(proxy=self._instance, bound=self._instance) + + @property + def pycache_clear(self): + node = extract_node('''def cache_clear(self): pass''') + return BoundMethod(proxy=node, bound=self._instance.parent.scope()) + + +def _transform_lru_cache(node, context=None): + # TODO: this is not ideal, since the node should be immutable, + # but due to https://github.com/PyCQA/astroid/issues/354, + # there's not much we can do now. + # Replacing the node would work partially, because, + # in pylint, the old node would still be available, leading + # to spurious false positives. + node.special_attributes = LruWrappedModel()(node) + return + + +def _functools_partial_inference(node, context=None): + call = arguments.CallSite.from_call(node) + number_of_positional = len(call.positional_arguments) + if number_of_positional < 1: + raise astroid.UseInferenceDefault('functools.partial takes at least one argument') + if number_of_positional == 1 and not call.keyword_arguments: + raise astroid.UseInferenceDefault( + 'functools.partial needs at least to have some filled arguments' + ) + + partial_function = call.positional_arguments[0] + try: + inferred_wrapped_function = next(partial_function.infer(context=context)) + except astroid.InferenceError as exc: + raise astroid.UseInferenceDefault from exc + if inferred_wrapped_function is astroid.Uninferable: + raise astroid.UseInferenceDefault('Cannot infer the wrapped function') + if not isinstance(inferred_wrapped_function, astroid.FunctionDef): + raise astroid.UseInferenceDefault('The wrapped function is not a function') + + # Determine if the passed keywords into the callsite are supported + # by the wrapped function. + function_parameters = chain( + inferred_wrapped_function.args.args or (), + inferred_wrapped_function.args.kwonlyargs or () + ) + parameter_names = set( + param.name for param in function_parameters + if isinstance(param, astroid.AssignName) + ) + if set(call.keyword_arguments) - parameter_names: + raise astroid.UseInferenceDefault('wrapped function received unknown parameters') + + # Return a wrapped() object that can be used further for inference + class PartialFunction(astroid.FunctionDef): + + filled_positionals = len(call.positional_arguments[1:]) + filled_keywords = list(call.keyword_arguments) + + def infer_call_result(self, caller=None, context=None): + nonlocal call + filled_args = call.positional_arguments[1:] + filled_keywords = call.keyword_arguments + + if context: + current_passed_keywords = { + keyword for (keyword, _) in context.callcontext.keywords + } + for keyword, value in filled_keywords.items(): + if keyword not in current_passed_keywords: + context.callcontext.keywords.append((keyword, value)) + + call_context_args = context.callcontext.args or [] + context.callcontext.args = filled_args + call_context_args + + return super().infer_call_result( + caller=caller, + context=context, + ) + + partial_function = PartialFunction( + name=inferred_wrapped_function.name, + doc=inferred_wrapped_function.doc, + lineno=inferred_wrapped_function.lineno, + col_offset=inferred_wrapped_function.col_offset, + parent=inferred_wrapped_function.parent, + ) + partial_function.postinit( + args=inferred_wrapped_function.args, + body=inferred_wrapped_function.body, + decorators=inferred_wrapped_function.decorators, + returns=inferred_wrapped_function.returns, + type_comment_returns=inferred_wrapped_function.type_comment_returns, + type_comment_args=inferred_wrapped_function.type_comment_args, + ) + return iter((partial_function,)) + + +def _looks_like_lru_cache(node): + """Check if the given function node is decorated with lru_cache.""" + if not node.decorators: + return False + + for decorator in node.decorators.nodes: + if not isinstance(decorator, astroid.Call): + continue + + func = helpers.safe_infer(decorator.func) + if func in (None, astroid.Uninferable): + continue + + if isinstance(func, astroid.FunctionDef) and func.qname() == LRU_CACHE: + return True + return False + + +def _looks_like_functools_partial(node): + """Check if the given Call node is a functools.partial call""" + if isinstance(node.func, astroid.Name): + return node.func.name == 'partial' + elif isinstance(node.func, astroid.Attribute): + return (node.func.attrname == 'partial' + and isinstance(node.func.expr, astroid.Name) + and node.func.expr.name == 'functools') + + +MANAGER.register_transform( + astroid.FunctionDef, + _transform_lru_cache, + _looks_like_lru_cache, +) + + +MANAGER.register_transform( + astroid.Call, + astroid.inference_tip(_functools_partial_inference), + _looks_like_functools_partial, +) diff --git a/venv/Lib/site-packages/astroid/brain/brain_gi.py b/venv/Lib/site-packages/astroid/brain/brain_gi.py new file mode 100644 index 00000000..cd3ed003 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_gi.py @@ -0,0 +1,208 @@ +# Copyright (c) 2013-2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2014 Google, Inc. +# Copyright (c) 2014 Cole Robinson +# Copyright (c) 2015-2016 Claudiu Popa +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2015 David Shea +# Copyright (c) 2016 Jakub Wilk +# Copyright (c) 2016 Giuseppe Scrivano + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Astroid hooks for the Python 2 GObject introspection bindings. + +Helps with understanding everything imported from 'gi.repository' +""" + +import inspect +import itertools +import sys +import re +import warnings + +from astroid import MANAGER, AstroidBuildingError, nodes +from astroid.builder import AstroidBuilder + + +_inspected_modules = {} + +_identifier_re = r'^[A-Za-z_]\w*$' + +def _gi_build_stub(parent): + """ + Inspect the passed module recursively and build stubs for functions, + classes, etc. + """ + classes = {} + functions = {} + constants = {} + methods = {} + for name in dir(parent): + if name.startswith("__"): + continue + + # Check if this is a valid name in python + if not re.match(_identifier_re, name): + continue + + try: + obj = getattr(parent, name) + except: + continue + + if inspect.isclass(obj): + classes[name] = obj + elif (inspect.isfunction(obj) or + inspect.isbuiltin(obj)): + functions[name] = obj + elif (inspect.ismethod(obj) or + inspect.ismethoddescriptor(obj)): + methods[name] = obj + elif (str(obj).startswith(", ) + # Only accept function calls with two constant arguments + if len(node.args) != 2: + return False + + if not all(isinstance(arg, nodes.Const) for arg in node.args): + return False + + func = node.func + if isinstance(func, nodes.Attribute): + if func.attrname != 'require_version': + return False + if isinstance(func.expr, nodes.Name) and func.expr.name == 'gi': + return True + + return False + + if isinstance(func, nodes.Name): + return func.name == 'require_version' + + return False + +def _register_require_version(node): + # Load the gi.require_version locally + try: + import gi + gi.require_version(node.args[0].value, node.args[1].value) + except Exception: + pass + + return node + +MANAGER.register_failed_import_hook(_import_gi_module) +MANAGER.register_transform(nodes.Call, _register_require_version, _looks_like_require_version) diff --git a/venv/Lib/site-packages/astroid/brain/brain_hashlib.py b/venv/Lib/site-packages/astroid/brain/brain_hashlib.py new file mode 100644 index 00000000..81486313 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_hashlib.py @@ -0,0 +1,47 @@ +# Copyright (c) 2016, 2018 Claudiu Popa +# Copyright (c) 2018 Ioana Tagirta + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER +import sys + +import six + +import astroid + +PY36 = sys.version_info >= (3, 6) + +def _hashlib_transform(): + template = ''' + class %(name)s(object): + def __init__(self, value=''): pass + def digest(self): + return %(digest)s + def copy(self): + return self + def update(self, value): pass + def hexdigest(self): + return '' + @property + def name(self): + return %(name)r + @property + def block_size(self): + return 1 + @property + def digest_size(self): + return 1 + ''' + algorithms = ['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'] + if PY36: + algorithms += [ + 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'shake_128', 'shake_256', + 'blake2b', + ] + classes = "".join( + template % {'name': hashfunc, 'digest': 'b""' if six.PY3 else '""'} + for hashfunc in algorithms) + return astroid.parse(classes) + + +astroid.register_module_extender(astroid.MANAGER, 'hashlib', _hashlib_transform) diff --git a/venv/Lib/site-packages/astroid/brain/brain_io.py b/venv/Lib/site-packages/astroid/brain/brain_io.py new file mode 100644 index 00000000..be8d30c8 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_io.py @@ -0,0 +1,43 @@ +# Copyright (c) 2016 Claudiu Popa + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +'''Astroid brain hints for some of the _io C objects.''' + +import astroid + + +BUFFERED = {'BufferedWriter', 'BufferedReader'} +TextIOWrapper = 'TextIOWrapper' +FileIO = 'FileIO' +BufferedWriter = 'BufferedWriter' + + +def _generic_io_transform(node, name, cls): + '''Transform the given name, by adding the given *class* as a member of the node.''' + + io_module = astroid.MANAGER.ast_from_module_name('_io') + attribute_object = io_module[cls] + instance = attribute_object.instantiate_class() + node.locals[name] = [instance] + + +def _transform_text_io_wrapper(node): + # This is not always correct, since it can vary with the type of the descriptor, + # being stdout, stderr or stdin. But we cannot get access to the name of the + # stream, which is why we are using the BufferedWriter class as a default + # value + return _generic_io_transform(node, name='buffer', cls=BufferedWriter) + + +def _transform_buffered(node): + return _generic_io_transform(node, name='raw', cls=FileIO) + + +astroid.MANAGER.register_transform(astroid.ClassDef, + _transform_buffered, + lambda node: node.name in BUFFERED) +astroid.MANAGER.register_transform(astroid.ClassDef, + _transform_text_io_wrapper, + lambda node: node.name == TextIOWrapper) diff --git a/venv/Lib/site-packages/astroid/brain/brain_mechanize.py b/venv/Lib/site-packages/astroid/brain/brain_mechanize.py new file mode 100644 index 00000000..3b921807 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_mechanize.py @@ -0,0 +1,26 @@ +# Copyright (c) 2012-2013 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2014 Google, Inc. +# Copyright (c) 2015-2016 Claudiu Popa +# Copyright (c) 2016 Ceridwen + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +from astroid import MANAGER, register_module_extender +from astroid.builder import AstroidBuilder + +def mechanize_transform(): + return AstroidBuilder(MANAGER).string_build(''' + +class Browser(object): + def open(self, url, data=None, timeout=None): + return None + def open_novisit(self, url, data=None, timeout=None): + return None + def open_local_file(self, filename): + return None + +''') + + +register_module_extender(MANAGER, 'mechanize', mechanize_transform) diff --git a/venv/Lib/site-packages/astroid/brain/brain_multiprocessing.py b/venv/Lib/site-packages/astroid/brain/brain_multiprocessing.py new file mode 100644 index 00000000..a19bac69 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_multiprocessing.py @@ -0,0 +1,104 @@ +# Copyright (c) 2016 Claudiu Popa + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +import sys + +import astroid +from astroid import exceptions + + +PY34 = sys.version_info >= (3, 4) + + +def _multiprocessing_transform(): + module = astroid.parse(''' + from multiprocessing.managers import SyncManager + def Manager(): + return SyncManager() + ''') + if not PY34: + return module + + # On Python 3.4, multiprocessing uses a getattr lookup inside contexts, + # in order to get the attributes they need. Since it's extremely + # dynamic, we use this approach to fake it. + node = astroid.parse(''' + from multiprocessing.context import DefaultContext, BaseContext + default = DefaultContext() + base = BaseContext() + ''') + try: + context = next(node['default'].infer()) + base = next(node['base'].infer()) + except exceptions.InferenceError: + return module + + for node in (context, base): + for key, value in node.locals.items(): + if key.startswith("_"): + continue + + value = value[0] + if isinstance(value, astroid.FunctionDef): + # We need to rebound this, since otherwise + # it will have an extra argument (self). + value = astroid.BoundMethod(value, node) + module[key] = value + return module + + +def _multiprocessing_managers_transform(): + return astroid.parse(''' + import array + import threading + import multiprocessing.pool as pool + + import six + + class Namespace(object): + pass + + class Value(object): + def __init__(self, typecode, value, lock=True): + self._typecode = typecode + self._value = value + def get(self): + return self._value + def set(self, value): + self._value = value + def __repr__(self): + return '%s(%r, %r)'%(type(self).__name__, self._typecode, self._value) + value = property(get, set) + + def Array(typecode, sequence, lock=True): + return array.array(typecode, sequence) + + class SyncManager(object): + Queue = JoinableQueue = six.moves.queue.Queue + Event = threading.Event + RLock = threading.RLock + BoundedSemaphore = threading.BoundedSemaphore + Condition = threading.Condition + Barrier = threading.Barrier + Pool = pool.Pool + list = list + dict = dict + Value = Value + Array = Array + Namespace = Namespace + __enter__ = lambda self: self + __exit__ = lambda *args: args + + def start(self, initializer=None, initargs=None): + pass + def shutdown(self): + pass + ''') + + +astroid.register_module_extender(astroid.MANAGER, 'multiprocessing.managers', + _multiprocessing_managers_transform) +astroid.register_module_extender(astroid.MANAGER, 'multiprocessing', + _multiprocessing_transform) diff --git a/venv/Lib/site-packages/astroid/brain/brain_namedtuple_enum.py b/venv/Lib/site-packages/astroid/brain/brain_namedtuple_enum.py new file mode 100644 index 00000000..cc399246 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_namedtuple_enum.py @@ -0,0 +1,397 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2012-2015 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2013-2014 Google, Inc. +# Copyright (c) 2014-2018 Claudiu Popa +# Copyright (c) 2014 Eevee (Alex Munroe) +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2015 Dmitry Pribysh +# Copyright (c) 2015 David Shea +# Copyright (c) 2015 Philip Lorenz +# Copyright (c) 2016 Jakub Wilk +# Copyright (c) 2016 Mateusz Bysiek +# Copyright (c) 2017 Hugo +# Copyright (c) 2017 Łukasz Rogalski + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Astroid hooks for the Python standard library.""" + +import functools +import keyword +from textwrap import dedent + +from astroid import ( + MANAGER, UseInferenceDefault, inference_tip, + InferenceError) +from astroid import arguments +from astroid import exceptions +from astroid import nodes +from astroid.builder import AstroidBuilder, extract_node +from astroid import util + + +TYPING_NAMEDTUPLE_BASENAMES = { + 'NamedTuple', + 'typing.NamedTuple' +} +ENUM_BASE_NAMES = {'Enum', 'IntEnum', 'enum.Enum', 'enum.IntEnum'} + + +def _infer_first(node, context): + if node is util.Uninferable: + raise UseInferenceDefault + try: + value = next(node.infer(context=context)) + if value is util.Uninferable: + raise UseInferenceDefault() + else: + return value + except StopIteration: + raise InferenceError() + + +def _find_func_form_arguments(node, context): + + def _extract_namedtuple_arg_or_keyword(position, key_name=None): + + if len(args) > position: + return _infer_first(args[position], context) + if key_name and key_name in found_keywords: + return _infer_first(found_keywords[key_name], context) + + args = node.args + keywords = node.keywords + found_keywords = { + keyword.arg: keyword.value for keyword in keywords + } if keywords else {} + + name = _extract_namedtuple_arg_or_keyword( + position=0, + key_name='typename' + ) + names = _extract_namedtuple_arg_or_keyword( + position=1, + key_name='field_names' + ) + if name and names: + return name.value, names + + raise UseInferenceDefault() + + +def infer_func_form(node, base_type, context=None, enum=False): + """Specific inference function for namedtuple or Python 3 enum. """ + # node is a Call node, class name as first argument and generated class + # attributes as second argument + + # namedtuple or enums list of attributes can be a list of strings or a + # whitespace-separate string + try: + name, names = _find_func_form_arguments(node, context) + try: + attributes = names.value.replace(',', ' ').split() + except AttributeError: + if not enum: + attributes = [_infer_first(const, context).value + for const in names.elts] + else: + # Enums supports either iterator of (name, value) pairs + # or mappings. + if hasattr(names, 'items') and isinstance(names.items, list): + attributes = [_infer_first(const[0], context).value + for const in names.items + if isinstance(const[0], nodes.Const)] + elif hasattr(names, 'elts'): + # Enums can support either ["a", "b", "c"] + # or [("a", 1), ("b", 2), ...], but they can't + # be mixed. + if all(isinstance(const, nodes.Tuple) + for const in names.elts): + attributes = [_infer_first(const.elts[0], context).value + for const in names.elts + if isinstance(const, nodes.Tuple)] + else: + attributes = [_infer_first(const, context).value + for const in names.elts] + else: + raise AttributeError + if not attributes: + raise AttributeError + except (AttributeError, exceptions.InferenceError): + raise UseInferenceDefault() + + # If we can't infer the name of the class, don't crash, up to this point + # we know it is a namedtuple anyway. + name = name or 'Uninferable' + # we want to return a Class node instance with proper attributes set + class_node = nodes.ClassDef(name, 'docstring') + class_node.parent = node.parent + # set base class=tuple + class_node.bases.append(base_type) + # XXX add __init__(*attributes) method + for attr in attributes: + fake_node = nodes.EmptyNode() + fake_node.parent = class_node + fake_node.attrname = attr + class_node.instance_attrs[attr] = [fake_node] + return class_node, name, attributes + + +def _has_namedtuple_base(node): + """Predicate for class inference tip + + :type node: ClassDef + :rtype: bool + """ + return set(node.basenames) & TYPING_NAMEDTUPLE_BASENAMES + + +def _looks_like(node, name): + func = node.func + if isinstance(func, nodes.Attribute): + return func.attrname == name + if isinstance(func, nodes.Name): + return func.name == name + return False + + +_looks_like_namedtuple = functools.partial(_looks_like, name='namedtuple') +_looks_like_enum = functools.partial(_looks_like, name='Enum') +_looks_like_typing_namedtuple = functools.partial(_looks_like, name='NamedTuple') + + +def infer_named_tuple(node, context=None): + """Specific inference function for namedtuple Call node""" + tuple_base_name = nodes.Name(name='tuple', parent=node.root()) + class_node, name, attributes = infer_func_form( + node, + tuple_base_name, + context=context, + ) + call_site = arguments.CallSite.from_call(node) + func = next(extract_node('import collections; collections.namedtuple').infer()) + try: + rename = next(call_site.infer_argument(func, 'rename', context)).bool_value() + except InferenceError: + rename = False + + if rename: + attributes = _get_renamed_namedtuple_attributes(attributes) + + replace_args = ', '.join( + '{arg}=None'.format(arg=arg) + for arg in attributes + ) + + field_def = (" {name} = property(lambda self: self[{index:d}], " + "doc='Alias for field number {index:d}')") + field_defs = '\n'.join(field_def.format(name=name, index=index) + for index, name in enumerate(attributes)) + fake = AstroidBuilder(MANAGER).string_build(''' +class %(name)s(tuple): + __slots__ = () + _fields = %(fields)r + def _asdict(self): + return self.__dict__ + @classmethod + def _make(cls, iterable, new=tuple.__new__, len=len): + return new(cls, iterable) + def _replace(self, %(replace_args)s): + return self + def __getnewargs__(self): + return tuple(self) +%(field_defs)s + ''' % {'name': name, + 'fields': attributes, + 'field_defs': field_defs, + 'replace_args': replace_args}) + class_node.locals['_asdict'] = fake.body[0].locals['_asdict'] + class_node.locals['_make'] = fake.body[0].locals['_make'] + class_node.locals['_replace'] = fake.body[0].locals['_replace'] + class_node.locals['_fields'] = fake.body[0].locals['_fields'] + for attr in attributes: + class_node.locals[attr] = fake.body[0].locals[attr] + # we use UseInferenceDefault, we can't be a generator so return an iterator + return iter([class_node]) + + +def _get_renamed_namedtuple_attributes(field_names): + names = list(field_names) + seen = set() + for i, name in enumerate(field_names): + if (not all(c.isalnum() or c == '_' for c in name) or keyword.iskeyword(name) + or not name or name[0].isdigit() or name.startswith('_') or name in seen): + names[i] = '_%d' % i + seen.add(name) + return tuple(names) + + +def infer_enum(node, context=None): + """ Specific inference function for enum Call node. """ + enum_meta = extract_node(''' + class EnumMeta(object): + 'docstring' + def __call__(self, node): + class EnumAttribute(object): + name = '' + value = 0 + return EnumAttribute() + def __iter__(self): + class EnumAttribute(object): + name = '' + value = 0 + return [EnumAttribute()] + def __next__(self): + return next(iter(self)) + def __getitem__(self, attr): + class Value(object): + @property + def name(self): + return '' + @property + def value(self): + return attr + + return Value() + __members__ = [''] + ''') + class_node = infer_func_form(node, enum_meta, + context=context, enum=True)[0] + return iter([class_node.instantiate_class()]) + + +def infer_enum_class(node): + """ Specific inference for enums. """ + for basename in node.basenames: + # TODO: doesn't handle subclasses yet. This implementation + # is a hack to support enums. + if basename not in ENUM_BASE_NAMES: + continue + if node.root().name == 'enum': + # Skip if the class is directly from enum module. + break + for local, values in node.locals.items(): + if any(not isinstance(value, nodes.AssignName) + for value in values): + continue + + targets = [] + stmt = values[0].statement() + if isinstance(stmt, nodes.Assign): + if isinstance(stmt.targets[0], nodes.Tuple): + targets = stmt.targets[0].itered() + else: + targets = stmt.targets + elif isinstance(stmt, nodes.AnnAssign): + targets = [stmt.target] + + inferred_return_value = None + if isinstance(stmt.value, nodes.Const): + if isinstance(stmt.value.value, str): + inferred_return_value = '"{}"'.format(stmt.value.value) + else: + inferred_return_value = stmt.value.value + + new_targets = [] + for target in targets: + # Replace all the assignments with our mocked class. + classdef = dedent(''' + class {name}({types}): + @property + def value(self): + return {return_value} + @property + def name(self): + return {name} + '''.format( + name=target.name, + types=', '.join(node.basenames), + return_value=inferred_return_value, + )) + fake = AstroidBuilder(MANAGER).string_build(classdef)[target.name] + fake.parent = target.parent + for method in node.mymethods(): + fake.locals[method.name] = [method] + new_targets.append(fake.instantiate_class()) + node.locals[local] = new_targets + break + return node + + +def infer_typing_namedtuple_class(class_node, context=None): + """Infer a subclass of typing.NamedTuple""" + # Check if it has the corresponding bases + annassigns_fields = [ + annassign.target.name for annassign in class_node.body + if isinstance(annassign, nodes.AnnAssign) + ] + code = dedent(''' + from collections import namedtuple + namedtuple({typename!r}, {fields!r}) + ''').format( + typename=class_node.name, + fields=",".join(annassigns_fields) + ) + node = extract_node(code) + generated_class_node = next(infer_named_tuple(node, context)) + for method in class_node.mymethods(): + generated_class_node.locals[method.name] = [method] + return iter((generated_class_node, )) + + +def infer_typing_namedtuple(node, context=None): + """Infer a typing.NamedTuple(...) call.""" + # This is essentially a namedtuple with different arguments + # so we extract the args and infer a named tuple. + try: + func = next(node.func.infer()) + except InferenceError: + raise UseInferenceDefault + + if func.qname() != 'typing.NamedTuple': + raise UseInferenceDefault + + if len(node.args) != 2: + raise UseInferenceDefault + + if not isinstance(node.args[1], (nodes.List, nodes.Tuple)): + raise UseInferenceDefault + + names = [] + for elt in node.args[1].elts: + if not isinstance(elt, (nodes.List, nodes.Tuple)): + raise UseInferenceDefault + if len(elt.elts) != 2: + raise UseInferenceDefault + names.append(elt.elts[0].as_string()) + + typename = node.args[0].as_string() + node = extract_node('namedtuple(%(typename)s, (%(fields)s,)) ' % + {'typename': typename, 'fields': ",".join(names)}) + return infer_named_tuple(node, context) + + +MANAGER.register_transform( + nodes.Call, inference_tip(infer_named_tuple), + _looks_like_namedtuple, +) +MANAGER.register_transform( + nodes.Call, inference_tip(infer_enum), + _looks_like_enum, +) +MANAGER.register_transform( + nodes.ClassDef, infer_enum_class, + predicate=lambda cls: any(basename for basename in cls.basenames + if basename in ENUM_BASE_NAMES) +) +MANAGER.register_transform( + nodes.ClassDef, + inference_tip(infer_typing_namedtuple_class), + _has_namedtuple_base, +) +MANAGER.register_transform( + nodes.Call, + inference_tip(infer_typing_namedtuple), + _looks_like_typing_namedtuple, +) diff --git a/venv/Lib/site-packages/astroid/brain/brain_nose.py b/venv/Lib/site-packages/astroid/brain/brain_nose.py new file mode 100644 index 00000000..6aec041b --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_nose.py @@ -0,0 +1,71 @@ +# Copyright (c) 2015-2016 Claudiu Popa +# Copyright (c) 2016 Ceridwen + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + + +"""Hooks for nose library.""" + +import re +import textwrap + +import astroid +import astroid.builder + +_BUILDER = astroid.builder.AstroidBuilder(astroid.MANAGER) + + +def _pep8(name, caps=re.compile('([A-Z])')): + return caps.sub(lambda m: '_' + m.groups()[0].lower(), name) + + +def _nose_tools_functions(): + """Get an iterator of names and bound methods.""" + module = _BUILDER.string_build(textwrap.dedent(''' + import unittest + + class Test(unittest.TestCase): + pass + a = Test() + ''')) + try: + case = next(module['a'].infer()) + except astroid.InferenceError: + return + for method in case.methods(): + if method.name.startswith('assert') and '_' not in method.name: + pep8_name = _pep8(method.name) + yield pep8_name, astroid.BoundMethod(method, case) + if method.name == 'assertEqual': + # nose also exports assert_equals. + yield 'assert_equals', astroid.BoundMethod(method, case) + + +def _nose_tools_transform(node): + for method_name, method in _nose_tools_functions(): + node.locals[method_name] = [method] + + +def _nose_tools_trivial_transform(): + """Custom transform for the nose.tools module.""" + stub = _BUILDER.string_build('''__all__ = []''') + all_entries = ['ok_', 'eq_'] + + for pep8_name, method in _nose_tools_functions(): + all_entries.append(pep8_name) + stub[pep8_name] = method + + # Update the __all__ variable, since nose.tools + # does this manually with .append. + all_assign = stub['__all__'].parent + all_object = astroid.List(all_entries) + all_object.parent = all_assign + all_assign.value = all_object + return stub + + +astroid.register_module_extender(astroid.MANAGER, 'nose.tools.trivial', + _nose_tools_trivial_transform) +astroid.MANAGER.register_transform(astroid.Module, _nose_tools_transform, + lambda n: n.name == 'nose.tools') diff --git a/venv/Lib/site-packages/astroid/brain/brain_numpy.py b/venv/Lib/site-packages/astroid/brain/brain_numpy.py new file mode 100644 index 00000000..e32e3401 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_numpy.py @@ -0,0 +1,472 @@ +# Copyright (c) 2015-2016, 2018 Claudiu Popa +# Copyright (c) 2016 Ceridwen +# Copyright (c) 2017-2018 hippo91 + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + + +"""Astroid hooks for numpy.""" + +import astroid + + +def numpy_random_mtrand_transform(): + return astroid.parse(''' + def beta(a, b, size=None): pass + def binomial(n, p, size=None): pass + def bytes(length): pass + def chisquare(df, size=None): pass + def choice(a, size=None, replace=True, p=None): pass + def dirichlet(alpha, size=None): pass + def exponential(scale=1.0, size=None): pass + def f(dfnum, dfden, size=None): pass + def gamma(shape, scale=1.0, size=None): pass + def geometric(p, size=None): pass + def get_state(): pass + def gumbel(loc=0.0, scale=1.0, size=None): pass + def hypergeometric(ngood, nbad, nsample, size=None): pass + def laplace(loc=0.0, scale=1.0, size=None): pass + def logistic(loc=0.0, scale=1.0, size=None): pass + def lognormal(mean=0.0, sigma=1.0, size=None): pass + def logseries(p, size=None): pass + def multinomial(n, pvals, size=None): pass + def multivariate_normal(mean, cov, size=None): pass + def negative_binomial(n, p, size=None): pass + def noncentral_chisquare(df, nonc, size=None): pass + def noncentral_f(dfnum, dfden, nonc, size=None): pass + def normal(loc=0.0, scale=1.0, size=None): pass + def pareto(a, size=None): pass + def permutation(x): pass + def poisson(lam=1.0, size=None): pass + def power(a, size=None): pass + def rand(*args): pass + def randint(low, high=None, size=None, dtype='l'): pass + def randn(*args): pass + def random_integers(low, high=None, size=None): pass + def random_sample(size=None): pass + def rayleigh(scale=1.0, size=None): pass + def seed(seed=None): pass + def set_state(state): pass + def shuffle(x): pass + def standard_cauchy(size=None): pass + def standard_exponential(size=None): pass + def standard_gamma(shape, size=None): pass + def standard_normal(size=None): pass + def standard_t(df, size=None): pass + def triangular(left, mode, right, size=None): pass + def uniform(low=0.0, high=1.0, size=None): pass + def vonmises(mu, kappa, size=None): pass + def wald(mean, scale, size=None): pass + def weibull(a, size=None): pass + def zipf(a, size=None): pass + ''') + + +def numpy_core_umath_transform(): + ufunc_optional_keyword_arguments = ("""out=None, where=True, casting='same_kind', order='K', """ + """dtype=None, subok=True""") + return astroid.parse(''' + # Constants + e = 2.718281828459045 + euler_gamma = 0.5772156649015329 + + # No arg functions + def geterrobj(): pass + + # One arg functions + def seterrobj(errobj): pass + + # One arg functions with optional kwargs + def arccos(x, {opt_args:s}): pass + def arccosh(x, {opt_args:s}): pass + def arcsin(x, {opt_args:s}): pass + def arcsinh(x, {opt_args:s}): pass + def arctan(x, {opt_args:s}): pass + def arctanh(x, {opt_args:s}): pass + def cbrt(x, {opt_args:s}): pass + def conj(x, {opt_args:s}): pass + def conjugate(x, {opt_args:s}): pass + def cosh(x, {opt_args:s}): pass + def deg2rad(x, {opt_args:s}): pass + def degrees(x, {opt_args:s}): pass + def exp2(x, {opt_args:s}): pass + def expm1(x, {opt_args:s}): pass + def fabs(x, {opt_args:s}): pass + def frexp(x, {opt_args:s}): pass + def isfinite(x, {opt_args:s}): pass + def isinf(x, {opt_args:s}): pass + def log(x, {opt_args:s}): pass + def log1p(x, {opt_args:s}): pass + def log2(x, {opt_args:s}): pass + def logical_not(x, {opt_args:s}): pass + def modf(x, {opt_args:s}): pass + def negative(x, {opt_args:s}): pass + def rad2deg(x, {opt_args:s}): pass + def radians(x, {opt_args:s}): pass + def reciprocal(x, {opt_args:s}): pass + def rint(x, {opt_args:s}): pass + def sign(x, {opt_args:s}): pass + def signbit(x, {opt_args:s}): pass + def sinh(x, {opt_args:s}): pass + def spacing(x, {opt_args:s}): pass + def square(x, {opt_args:s}): pass + def tan(x, {opt_args:s}): pass + def tanh(x, {opt_args:s}): pass + def trunc(x, {opt_args:s}): pass + + # Two args functions with optional kwargs + def bitwise_and(x1, x2, {opt_args:s}): pass + def bitwise_or(x1, x2, {opt_args:s}): pass + def bitwise_xor(x1, x2, {opt_args:s}): pass + def copysign(x1, x2, {opt_args:s}): pass + def divide(x1, x2, {opt_args:s}): pass + def equal(x1, x2, {opt_args:s}): pass + def float_power(x1, x2, {opt_args:s}): pass + def floor_divide(x1, x2, {opt_args:s}): pass + def fmax(x1, x2, {opt_args:s}): pass + def fmin(x1, x2, {opt_args:s}): pass + def fmod(x1, x2, {opt_args:s}): pass + def greater(x1, x2, {opt_args:s}): pass + def hypot(x1, x2, {opt_args:s}): pass + def ldexp(x1, x2, {opt_args:s}): pass + def left_shift(x1, x2, {opt_args:s}): pass + def less(x1, x2, {opt_args:s}): pass + def logaddexp(x1, x2, {opt_args:s}): pass + def logaddexp2(x1, x2, {opt_args:s}): pass + def logical_and(x1, x2, {opt_args:s}): pass + def logical_or(x1, x2, {opt_args:s}): pass + def logical_xor(x1, x2, {opt_args:s}): pass + def maximum(x1, x2, {opt_args:s}): pass + def minimum(x1, x2, {opt_args:s}): pass + def nextafter(x1, x2, {opt_args:s}): pass + def not_equal(x1, x2, {opt_args:s}): pass + def power(x1, x2, {opt_args:s}): pass + def remainder(x1, x2, {opt_args:s}): pass + def right_shift(x1, x2, {opt_args:s}): pass + def subtract(x1, x2, {opt_args:s}): pass + def true_divide(x1, x2, {opt_args:s}): pass + '''.format(opt_args=ufunc_optional_keyword_arguments)) + + +def numpy_core_numerictypes_transform(): + return astroid.parse(''' + # different types defined in numerictypes.py + class generic(object): + def __init__(self, value): + self.T = None + self.base = None + self.data = None + self.dtype = None + self.flags = None + self.flat = None + self.imag = None + self.itemsize = None + self.nbytes = None + self.ndim = None + self.real = None + self.size = None + self.strides = None + + def all(self): pass + def any(self): pass + def argmax(self): pass + def argmin(self): pass + def argsort(self): pass + def astype(self): pass + def base(self): pass + def byteswap(self): pass + def choose(self): pass + def clip(self): pass + def compress(self): pass + def conj(self): pass + def conjugate(self): pass + def copy(self): pass + def cumprod(self): pass + def cumsum(self): pass + def data(self): pass + def diagonal(self): pass + def dtype(self): pass + def dump(self): pass + def dumps(self): pass + def fill(self): pass + def flags(self): pass + def flat(self): pass + def flatten(self): pass + def getfield(self): pass + def imag(self): pass + def item(self): pass + def itemset(self): pass + def itemsize(self): pass + def max(self): pass + def mean(self): pass + def min(self): pass + def nbytes(self): pass + def ndim(self): pass + def newbyteorder(self): pass + def nonzero(self): pass + def prod(self): pass + def ptp(self): pass + def put(self): pass + def ravel(self): pass + def real(self): pass + def repeat(self): pass + def reshape(self): pass + def resize(self): pass + def round(self): pass + def searchsorted(self): pass + def setfield(self): pass + def setflags(self): pass + def shape(self): pass + def size(self): pass + def sort(self): pass + def squeeze(self): pass + def std(self): pass + def strides(self): pass + def sum(self): pass + def swapaxes(self): pass + def take(self): pass + def tobytes(self): pass + def tofile(self): pass + def tolist(self): pass + def tostring(self): pass + def trace(self): pass + def transpose(self): pass + def var(self): pass + def view(self): pass + + + class dtype(object): + def __init__(self, obj, align=False, copy=False): + self.alignment = None + self.base = None + self.byteorder = None + self.char = None + self.descr = None + self.fields = None + self.flags = None + self.hasobject = None + self.isalignedstruct = None + self.isbuiltin = None + self.isnative = None + self.itemsize = None + self.kind = None + self.metadata = None + self.name = None + self.names = None + self.num = None + self.shape = None + self.str = None + self.subdtype = None + self.type = None + + def newbyteorder(self, new_order='S'): pass + + + class ndarray(object): + def __init__(self, shape, dtype=float, buffer=None, offset=0, + strides=None, order=None): + self.T = None + self.base = None + self.ctypes = None + self.data = None + self.dtype = None + self.flags = None + self.flat = None + self.imag = None + self.itemsize = None + self.nbytes = None + self.ndim = None + self.real = None + self.shape = None + self.size = None + self.strides = None + + def all(self): pass + def any(self): pass + def argmax(self): pass + def argmin(self): pass + def argpartition(self): pass + def argsort(self): pass + def astype(self): pass + def byteswap(self): pass + def choose(self): pass + def clip(self): pass + def compress(self): pass + def conj(self): pass + def conjugate(self): pass + def copy(self): pass + def cumprod(self): pass + def cumsum(self): pass + def diagonal(self): pass + def dot(self): pass + def dump(self): pass + def dumps(self): pass + def fill(self): pass + def flatten(self): pass + def getfield(self): pass + def item(self): pass + def itemset(self): pass + def max(self): pass + def mean(self): pass + def min(self): pass + def newbyteorder(self): pass + def nonzero(self): pass + def partition(self): pass + def prod(self): pass + def ptp(self): pass + def put(self): pass + def ravel(self): pass + def repeat(self): pass + def reshape(self): pass + def resize(self): pass + def round(self): pass + def searchsorted(self): pass + def setfield(self): pass + def setflags(self): pass + def sort(self): pass + def squeeze(self): pass + def std(self): pass + def sum(self): pass + def swapaxes(self): pass + def take(self): pass + def tobytes(self): pass + def tofile(self): pass + def tolist(self): pass + def tostring(self): pass + def trace(self): pass + def transpose(self): pass + def var(self): pass + def view(self): pass + + + class busdaycalendar(object): + def __init__(self, weekmask='1111100', holidays=None): + self.holidays = None + self.weekmask = None + + class flexible(generic): pass + class bool_(generic): pass + class number(generic): pass + class datetime64(generic): pass + + + class void(flexible): + def __init__(self, *args, **kwargs): + self.base = None + self.dtype = None + self.flags = None + def getfield(self): pass + def setfield(self): pass + + + class character(flexible): pass + + + class integer(number): + def __init__(self, value): + self.denominator = None + self.numerator = None + + + class inexact(number): pass + + + class str_(str, character): + def maketrans(self, x, y=None, z=None): pass + + + class bytes_(bytes, character): + def fromhex(self, string): pass + def maketrans(self, frm, to): pass + + + class signedinteger(integer): pass + + + class unsignedinteger(integer): pass + + + class complexfloating(inexact): pass + + + class floating(inexact): pass + + + class float64(floating, float): + def fromhex(self, string): pass + + + class uint64(unsignedinteger): pass + class complex64(complexfloating): pass + class int16(signedinteger): pass + class float96(floating): pass + class int8(signedinteger): pass + class uint32(unsignedinteger): pass + class uint8(unsignedinteger): pass + class _typedict(dict): pass + class complex192(complexfloating): pass + class timedelta64(signedinteger): pass + class int32(signedinteger): pass + class uint16(unsignedinteger): pass + class float32(floating): pass + class complex128(complexfloating, complex): pass + class float16(floating): pass + class int64(signedinteger): pass + + buffer_type = memoryview + bool8 = bool_ + byte = int8 + bytes0 = bytes_ + cdouble = complex128 + cfloat = complex128 + clongdouble = complex192 + clongfloat = complex192 + complex_ = complex128 + csingle = complex64 + double = float64 + float_ = float64 + half = float16 + int0 = int32 + int_ = int32 + intc = int32 + intp = int32 + long = int32 + longcomplex = complex192 + longdouble = float96 + longfloat = float96 + longlong = int64 + object0 = object_ + object_ = object_ + short = int16 + single = float32 + singlecomplex = complex64 + str0 = str_ + string_ = bytes_ + ubyte = uint8 + uint = uint32 + uint0 = uint32 + uintc = uint32 + uintp = uint32 + ulonglong = uint64 + unicode = str_ + unicode_ = str_ + ushort = uint16 + void0 = void + ''') + + +def numpy_funcs(): + return astroid.parse(''' + import builtins + def sum(a, axis=None, dtype=None, out=None, keepdims=None): + return builtins.sum(a) + ''') + + +astroid.register_module_extender(astroid.MANAGER, 'numpy.core.umath', numpy_core_umath_transform) +astroid.register_module_extender(astroid.MANAGER, 'numpy.random.mtrand', + numpy_random_mtrand_transform) +astroid.register_module_extender(astroid.MANAGER, 'numpy.core.numerictypes', + numpy_core_numerictypes_transform) +astroid.register_module_extender(astroid.MANAGER, 'numpy', numpy_funcs) diff --git a/venv/Lib/site-packages/astroid/brain/brain_pkg_resources.py b/venv/Lib/site-packages/astroid/brain/brain_pkg_resources.py new file mode 100644 index 00000000..7863105c --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_pkg_resources.py @@ -0,0 +1,72 @@ +# Copyright (c) 2016, 2018 Claudiu Popa +# Copyright (c) 2016 Ceridwen + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + + +import astroid +from astroid import parse +from astroid import inference_tip +from astroid import register_module_extender +from astroid import MANAGER + + +def pkg_resources_transform(): + return parse(''' +def require(*requirements): + return pkg_resources.working_set.require(*requirements) + +def run_script(requires, script_name): + return pkg_resources.working_set.run_script(requires, script_name) + +def iter_entry_points(group, name=None): + return pkg_resources.working_set.iter_entry_points(group, name) + +def resource_exists(package_or_requirement, resource_name): + return get_provider(package_or_requirement).has_resource(resource_name) + +def resource_isdir(package_or_requirement, resource_name): + return get_provider(package_or_requirement).resource_isdir( + resource_name) + +def resource_filename(package_or_requirement, resource_name): + return get_provider(package_or_requirement).get_resource_filename( + self, resource_name) + +def resource_stream(package_or_requirement, resource_name): + return get_provider(package_or_requirement).get_resource_stream( + self, resource_name) + +def resource_string(package_or_requirement, resource_name): + return get_provider(package_or_requirement).get_resource_string( + self, resource_name) + +def resource_listdir(package_or_requirement, resource_name): + return get_provider(package_or_requirement).resource_listdir( + resource_name) + +def extraction_error(): + pass + +def get_cache_path(archive_name, names=()): + extract_path = self.extraction_path or get_default_cache() + target_path = os.path.join(extract_path, archive_name+'-tmp', *names) + return target_path + +def postprocess(tempname, filename): + pass + +def set_extraction_path(path): + pass + +def cleanup_resources(force=False): + pass + +def get_distribution(dist): + return Distribution(dist) + +_namespace_packages = {} +''') + +register_module_extender(MANAGER, 'pkg_resources', pkg_resources_transform) diff --git a/venv/Lib/site-packages/astroid/brain/brain_pytest.py b/venv/Lib/site-packages/astroid/brain/brain_pytest.py new file mode 100644 index 00000000..01132f89 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_pytest.py @@ -0,0 +1,85 @@ +# Copyright (c) 2014-2016 Claudiu Popa +# Copyright (c) 2014 Jeff Quast +# Copyright (c) 2014 Google, Inc. +# Copyright (c) 2016 Florian Bruhin +# Copyright (c) 2016 Ceridwen + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Astroid hooks for pytest.""" +from __future__ import absolute_import +from astroid import MANAGER, register_module_extender +from astroid.builder import AstroidBuilder + + +def pytest_transform(): + return AstroidBuilder(MANAGER).string_build(''' + +try: + import _pytest.mark + import _pytest.recwarn + import _pytest.runner + import _pytest.python + import _pytest.skipping + import _pytest.assertion +except ImportError: + pass +else: + deprecated_call = _pytest.recwarn.deprecated_call + warns = _pytest.recwarn.warns + + exit = _pytest.runner.exit + fail = _pytest.runner.fail + skip = _pytest.runner.skip + importorskip = _pytest.runner.importorskip + + xfail = _pytest.skipping.xfail + mark = _pytest.mark.MarkGenerator() + raises = _pytest.python.raises + + # New in pytest 3.0 + try: + approx = _pytest.python.approx + register_assert_rewrite = _pytest.assertion.register_assert_rewrite + except AttributeError: + pass + + +# Moved in pytest 3.0 + +try: + import _pytest.freeze_support + freeze_includes = _pytest.freeze_support.freeze_includes +except ImportError: + try: + import _pytest.genscript + freeze_includes = _pytest.genscript.freeze_includes + except ImportError: + pass + +try: + import _pytest.debugging + set_trace = _pytest.debugging.pytestPDB().set_trace +except ImportError: + try: + import _pytest.pdb + set_trace = _pytest.pdb.pytestPDB().set_trace + except ImportError: + pass + +try: + import _pytest.fixtures + fixture = _pytest.fixtures.fixture + yield_fixture = _pytest.fixtures.yield_fixture +except ImportError: + try: + import _pytest.python + fixture = _pytest.python.fixture + yield_fixture = _pytest.python.yield_fixture + except ImportError: + pass +''') + +register_module_extender(MANAGER, 'pytest', pytest_transform) +register_module_extender(MANAGER, 'py.test', pytest_transform) diff --git a/venv/Lib/site-packages/astroid/brain/brain_qt.py b/venv/Lib/site-packages/astroid/brain/brain_qt.py new file mode 100644 index 00000000..d8fcc0b4 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_qt.py @@ -0,0 +1,74 @@ +# Copyright (c) 2015-2016 Claudiu Popa +# Copyright (c) 2016 Ceridwen +# Copyright (c) 2017 Roy Wright +# Copyright (c) 2018 Ashley Whetter + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Astroid hooks for the PyQT library.""" + +from astroid import MANAGER, register_module_extender +from astroid.builder import AstroidBuilder +from astroid import nodes +from astroid import parse + + +def _looks_like_signal(node, signal_name='pyqtSignal'): + if '__class__' in node.instance_attrs: + try: + cls = node.instance_attrs['__class__'][0] + return cls.name == signal_name + except AttributeError: + # return False if the cls does not have a name attribute + pass + return False + + +def transform_pyqt_signal(node): + module = parse(''' + class pyqtSignal(object): + def connect(self, slot, type=None, no_receiver_check=False): + pass + def disconnect(self, slot): + pass + def emit(self, *args): + pass + ''') + signal_cls = module['pyqtSignal'] + node.instance_attrs['emit'] = signal_cls['emit'] + node.instance_attrs['disconnect'] = signal_cls['disconnect'] + node.instance_attrs['connect'] = signal_cls['connect'] + + +def transform_pyside_signal(node): + module = parse(''' + class NotPySideSignal(object): + def connect(self, receiver, type=None): + pass + def disconnect(self, receiver): + pass + def emit(self, *args): + pass + ''') + signal_cls = module['NotPySideSignal'] + node.instance_attrs['connect'] = signal_cls['connect'] + node.instance_attrs['disconnect'] = signal_cls['disconnect'] + node.instance_attrs['emit'] = signal_cls['emit'] + + +def pyqt4_qtcore_transform(): + return AstroidBuilder(MANAGER).string_build(''' + +def SIGNAL(signal_name): pass + +class QObject(object): + def emit(self, signal): pass +''') + + +register_module_extender(MANAGER, 'PyQt4.QtCore', pyqt4_qtcore_transform) +MANAGER.register_transform(nodes.FunctionDef, transform_pyqt_signal, + _looks_like_signal) +MANAGER.register_transform(nodes.ClassDef, transform_pyside_signal, + lambda node: node.qname() == 'PySide.QtCore.Signal') diff --git a/venv/Lib/site-packages/astroid/brain/brain_random.py b/venv/Lib/site-packages/astroid/brain/brain_random.py new file mode 100644 index 00000000..c76798d2 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_random.py @@ -0,0 +1,97 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER +import random + +import astroid +from astroid import helpers +from astroid import MANAGER + + +ACCEPTED_ITERABLES_FOR_SAMPLE = ( + astroid.List, + astroid.Set, + astroid.Tuple, +) + + +def _clone_node_with_lineno(node, parent, lineno): + cls = node.__class__ + other_fields = node._other_fields + _astroid_fields = node._astroid_fields + init_params = { + 'lineno': lineno, + 'col_offset': node.col_offset, + 'parent': parent + } + postinit_params = { + param: getattr(node, param) + for param in _astroid_fields + } + if other_fields: + init_params.update({ + param: getattr(node, param) + for param in other_fields + }) + new_node = cls(**init_params) + if hasattr(node, 'postinit') and _astroid_fields: + new_node.postinit(**postinit_params) + return new_node + + +def infer_random_sample(node, context=None): + if len(node.args) != 2: + raise astroid.UseInferenceDefault + + length = node.args[1] + if not isinstance(length, astroid.Const): + raise astroid.UseInferenceDefault + if not isinstance(length.value, int): + raise astroid.UseInferenceDefault + + inferred_sequence = helpers.safe_infer(node.args[0], context=context) + if inferred_sequence in (None, astroid.Uninferable): + raise astroid.UseInferenceDefault + + if not isinstance(inferred_sequence, ACCEPTED_ITERABLES_FOR_SAMPLE): + raise astroid.UseInferenceDefault + + if length.value > len(inferred_sequence.elts): + # In this case, this will raise a ValueError + raise astroid.UseInferenceDefault + + try: + elts = random.sample(inferred_sequence.elts, length.value) + except ValueError: + raise astroid.UseInferenceDefault + + new_node = astroid.List( + lineno=node.lineno, + col_offset=node.col_offset, + parent=node.scope(), + ) + new_elts = [ + _clone_node_with_lineno( + elt, + parent=new_node, + lineno=new_node.lineno + ) + for elt in elts + ] + new_node.postinit(new_elts) + return iter((new_node, )) + + +def _looks_like_random_sample(node): + func = node.func + if isinstance(func, astroid.Attribute): + return func.attrname == 'sample' + if isinstance(func, astroid.Name): + return func.name == 'sample' + return False + + +MANAGER.register_transform( + astroid.Call, + astroid.inference_tip(infer_random_sample), + _looks_like_random_sample, +) diff --git a/venv/Lib/site-packages/astroid/brain/brain_re.py b/venv/Lib/site-packages/astroid/brain/brain_re.py new file mode 100644 index 00000000..f6e1befd --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_re.py @@ -0,0 +1,34 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER +import sys +import astroid + +PY36 = sys.version_info >= (3, 6) + +if PY36: + # Since Python 3.6 there is the RegexFlag enum + # where every entry will be exposed via updating globals() + + def _re_transform(): + return astroid.parse(''' + import sre_compile + ASCII = sre_compile.SRE_FLAG_ASCII + IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE + LOCALE = sre_compile.SRE_FLAG_LOCALE + UNICODE = sre_compile.SRE_FLAG_UNICODE + MULTILINE = sre_compile.SRE_FLAG_MULTILINE + DOTALL = sre_compile.SRE_FLAG_DOTALL + VERBOSE = sre_compile.SRE_FLAG_VERBOSE + A = ASCII + I = IGNORECASE + L = LOCALE + U = UNICODE + M = MULTILINE + S = DOTALL + X = VERBOSE + TEMPLATE = sre_compile.SRE_FLAG_TEMPLATE + T = TEMPLATE + DEBUG = sre_compile.SRE_FLAG_DEBUG + ''') + + astroid.register_module_extender(astroid.MANAGER, 're', _re_transform) diff --git a/venv/Lib/site-packages/astroid/brain/brain_six.py b/venv/Lib/site-packages/astroid/brain/brain_six.py new file mode 100644 index 00000000..30ecca35 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_six.py @@ -0,0 +1,193 @@ +# Copyright (c) 2014-2016, 2018 Claudiu Popa +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2018 Bryce Guinta + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + + +"""Astroid hooks for six module.""" + +from textwrap import dedent + +from astroid import MANAGER, register_module_extender +from astroid.builder import AstroidBuilder +from astroid.exceptions import AstroidBuildingError, InferenceError, AttributeInferenceError +from astroid import nodes + + +SIX_ADD_METACLASS = 'six.add_metaclass' + + +def _indent(text, prefix, predicate=None): + """Adds 'prefix' to the beginning of selected lines in 'text'. + + If 'predicate' is provided, 'prefix' will only be added to the lines + where 'predicate(line)' is True. If 'predicate' is not provided, + it will default to adding 'prefix' to all non-empty lines that do not + consist solely of whitespace characters. + """ + if predicate is None: + predicate = lambda line: line.strip() + + def prefixed_lines(): + for line in text.splitlines(True): + yield prefix + line if predicate(line) else line + return ''.join(prefixed_lines()) + + +_IMPORTS = """ +import _io +cStringIO = _io.StringIO +filter = filter +from itertools import filterfalse +input = input +from sys import intern +map = map +range = range +from imp import reload as reload_module +from functools import reduce +from shlex import quote as shlex_quote +from io import StringIO +from collections import UserDict, UserList, UserString +xrange = range +zip = zip +from itertools import zip_longest +import builtins +import configparser +import copyreg +import _dummy_thread +import http.cookiejar as http_cookiejar +import http.cookies as http_cookies +import html.entities as html_entities +import html.parser as html_parser +import http.client as http_client +import http.server as http_server +BaseHTTPServer = CGIHTTPServer = SimpleHTTPServer = http.server +import pickle as cPickle +import queue +import reprlib +import socketserver +import _thread +import winreg +import xmlrpc.server as xmlrpc_server +import xmlrpc.client as xmlrpc_client +import urllib.robotparser as urllib_robotparser +import email.mime.multipart as email_mime_multipart +import email.mime.nonmultipart as email_mime_nonmultipart +import email.mime.text as email_mime_text +import email.mime.base as email_mime_base +import urllib.parse as urllib_parse +import urllib.error as urllib_error +import tkinter +import tkinter.dialog as tkinter_dialog +import tkinter.filedialog as tkinter_filedialog +import tkinter.scrolledtext as tkinter_scrolledtext +import tkinter.simpledialog as tkinder_simpledialog +import tkinter.tix as tkinter_tix +import tkinter.ttk as tkinter_ttk +import tkinter.constants as tkinter_constants +import tkinter.dnd as tkinter_dnd +import tkinter.colorchooser as tkinter_colorchooser +import tkinter.commondialog as tkinter_commondialog +import tkinter.filedialog as tkinter_tkfiledialog +import tkinter.font as tkinter_font +import tkinter.messagebox as tkinter_messagebox +import urllib +import urllib.request as urllib_request +import urllib.robotparser as urllib_robotparser +import urllib.parse as urllib_parse +import urllib.error as urllib_error +""" + + +def six_moves_transform(): + code = dedent(''' + class Moves(object): + {} + moves = Moves() + ''').format(_indent(_IMPORTS, " ")) + module = AstroidBuilder(MANAGER).string_build(code) + module.name = 'six.moves' + return module + + +def _six_fail_hook(modname): + """Fix six.moves imports due to the dynamic nature of this + class. + + Construct a pseudo-module which contains all the necessary imports + for six + + :param modname: Name of failed module + :type modname: str + + :return: An astroid module + :rtype: nodes.Module + """ + + attribute_of = (modname != "six.moves" and + modname.startswith("six.moves")) + if modname != 'six.moves' and not attribute_of: + raise AstroidBuildingError(modname=modname) + module = AstroidBuilder(MANAGER).string_build(_IMPORTS) + module.name = 'six.moves' + if attribute_of: + # Facilitate import of submodules in Moves + start_index = len(module.name) + attribute = modname[start_index:].lstrip(".").replace(".", "_") + try: + import_attr = module.getattr(attribute)[0] + except AttributeInferenceError: + raise AstroidBuildingError(modname=modname) + if isinstance(import_attr, nodes.Import): + submodule = MANAGER.ast_from_module_name(import_attr.names[0][0]) + return submodule + # Let dummy submodule imports pass through + # This will cause an Uninferable result, which is okay + return module + + +def _looks_like_decorated_with_six_add_metaclass(node): + if not node.decorators: + return False + + for decorator in node.decorators.nodes: + if not isinstance(decorator, nodes.Call): + continue + if decorator.func.as_string() == SIX_ADD_METACLASS: + return True + return False + + +def transform_six_add_metaclass(node): + """Check if the given class node is decorated with *six.add_metaclass* + + If so, inject its argument as the metaclass of the underlying class. + """ + if not node.decorators: + return + + for decorator in node.decorators.nodes: + if not isinstance(decorator, nodes.Call): + continue + + try: + func = next(decorator.func.infer()) + except InferenceError: + continue + if func.qname() == SIX_ADD_METACLASS and decorator.args: + metaclass = decorator.args[0] + node._metaclass = metaclass + return node + + +register_module_extender(MANAGER, 'six', six_moves_transform) +register_module_extender(MANAGER, 'requests.packages.urllib3.packages.six', + six_moves_transform) +MANAGER.register_failed_import_hook(_six_fail_hook) +MANAGER.register_transform( + nodes.ClassDef, + transform_six_add_metaclass, + _looks_like_decorated_with_six_add_metaclass, +) diff --git a/venv/Lib/site-packages/astroid/brain/brain_ssl.py b/venv/Lib/site-packages/astroid/brain/brain_ssl.py new file mode 100644 index 00000000..132e827d --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_ssl.py @@ -0,0 +1,71 @@ +# Copyright (c) 2016 Claudiu Popa +# Copyright (c) 2016 Ceridwen + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Astroid hooks for the ssl library.""" + +from astroid import MANAGER, register_module_extender +from astroid.builder import AstroidBuilder +from astroid import nodes +from astroid import parse + + +def ssl_transform(): + return parse(''' + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import _SSLContext, MemoryBIO + from _ssl import ( + SSLError, SSLZeroReturnError, SSLWantReadError, SSLWantWriteError, + SSLSyscallError, SSLEOFError, + ) + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED + from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj + from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes + try: + from _ssl import RAND_egd + except ImportError: + # LibreSSL does not provide RAND_egd + pass + from _ssl import (OP_ALL, OP_CIPHER_SERVER_PREFERENCE, + OP_NO_COMPRESSION, OP_NO_SSLv2, OP_NO_SSLv3, + OP_NO_TLSv1, OP_NO_TLSv1_1, OP_NO_TLSv1_2, + OP_SINGLE_DH_USE, OP_SINGLE_ECDH_USE) + + from _ssl import (ALERT_DESCRIPTION_ACCESS_DENIED, ALERT_DESCRIPTION_BAD_CERTIFICATE, + ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE, + ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE, + ALERT_DESCRIPTION_BAD_RECORD_MAC, + ALERT_DESCRIPTION_CERTIFICATE_EXPIRED, + ALERT_DESCRIPTION_CERTIFICATE_REVOKED, + ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN, + ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE, + ALERT_DESCRIPTION_CLOSE_NOTIFY, ALERT_DESCRIPTION_DECODE_ERROR, + ALERT_DESCRIPTION_DECOMPRESSION_FAILURE, + ALERT_DESCRIPTION_DECRYPT_ERROR, + ALERT_DESCRIPTION_HANDSHAKE_FAILURE, + ALERT_DESCRIPTION_ILLEGAL_PARAMETER, + ALERT_DESCRIPTION_INSUFFICIENT_SECURITY, + ALERT_DESCRIPTION_INTERNAL_ERROR, + ALERT_DESCRIPTION_NO_RENEGOTIATION, + ALERT_DESCRIPTION_PROTOCOL_VERSION, + ALERT_DESCRIPTION_RECORD_OVERFLOW, + ALERT_DESCRIPTION_UNEXPECTED_MESSAGE, + ALERT_DESCRIPTION_UNKNOWN_CA, + ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY, + ALERT_DESCRIPTION_UNRECOGNIZED_NAME, + ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE, + ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION, + ALERT_DESCRIPTION_USER_CANCELLED) + from _ssl import (SSL_ERROR_EOF, SSL_ERROR_INVALID_ERROR_CODE, SSL_ERROR_SSL, + SSL_ERROR_SYSCALL, SSL_ERROR_WANT_CONNECT, SSL_ERROR_WANT_READ, + SSL_ERROR_WANT_WRITE, SSL_ERROR_WANT_X509_LOOKUP, SSL_ERROR_ZERO_RETURN) + from _ssl import VERIFY_CRL_CHECK_CHAIN, VERIFY_CRL_CHECK_LEAF, VERIFY_DEFAULT, VERIFY_X509_STRICT + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN, HAS_ALPN + from _ssl import _OPENSSL_API_VERSION + from _ssl import PROTOCOL_SSLv23, PROTOCOL_TLSv1, PROTOCOL_TLSv1_1, PROTOCOL_TLSv1_2 + ''') + + +register_module_extender(MANAGER, 'ssl', ssl_transform) diff --git a/venv/Lib/site-packages/astroid/brain/brain_subprocess.py b/venv/Lib/site-packages/astroid/brain/brain_subprocess.py new file mode 100644 index 00000000..8d654705 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_subprocess.py @@ -0,0 +1,103 @@ +# Copyright (c) 2016-2017 Claudiu Popa +# Copyright (c) 2017 Hugo +# Copyright (c) 2018 Bryce Guinta + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +import sys +import textwrap + +import six + +import astroid + + +PY34 = sys.version_info >= (3, 4) +PY36 = sys.version_info >= (3, 6) +PY33 = sys.version_info >= (3, 3) + + +def _subprocess_transform(): + if six.PY3: + communicate = (bytes('string', 'ascii'), bytes('string', 'ascii')) + communicate_signature = 'def communicate(self, input=None, timeout=None)' + if PY36: + init = """ + def __init__(self, args, bufsize=0, executable=None, + stdin=None, stdout=None, stderr=None, + preexec_fn=None, close_fds=False, shell=False, + cwd=None, env=None, universal_newlines=False, + startupinfo=None, creationflags=0, restore_signals=True, + start_new_session=False, pass_fds=(), *, + encoding=None, errors=None): + pass + """ + else: + init = """ + def __init__(self, args, bufsize=0, executable=None, + stdin=None, stdout=None, stderr=None, + preexec_fn=None, close_fds=False, shell=False, + cwd=None, env=None, universal_newlines=False, + startupinfo=None, creationflags=0, restore_signals=True, + start_new_session=False, pass_fds=()): + pass + """ + else: + communicate = ('string', 'string') + communicate_signature = 'def communicate(self, input=None)' + init = """ + def __init__(self, args, bufsize=0, executable=None, + stdin=None, stdout=None, stderr=None, + preexec_fn=None, close_fds=False, shell=False, + cwd=None, env=None, universal_newlines=False, + startupinfo=None, creationflags=0): + pass + """ + if PY34: + wait_signature = 'def wait(self, timeout=None)' + else: + wait_signature = 'def wait(self)' + if six.PY3: + ctx_manager = ''' + def __enter__(self): return self + def __exit__(self, *args): pass + ''' + else: + ctx_manager = '' + py3_args = "" + if PY33: + py3_args = "args = []" + code = textwrap.dedent(''' + class Popen(object): + returncode = pid = 0 + stdin = stdout = stderr = file() + %(py3_args)s + + %(communicate_signature)s: + return %(communicate)r + %(wait_signature)s: + return self.returncode + def poll(self): + return self.returncode + def send_signal(self, signal): + pass + def terminate(self): + pass + def kill(self): + pass + %(ctx_manager)s + ''' % {'communicate': communicate, + 'communicate_signature': communicate_signature, + 'wait_signature': wait_signature, + 'ctx_manager': ctx_manager, + 'py3_args': py3_args, + }) + + init_lines = textwrap.dedent(init).splitlines() + indented_init = '\n'.join([' ' * 4 + line for line in init_lines]) + code += indented_init + return astroid.parse(code) + + +astroid.register_module_extender(astroid.MANAGER, 'subprocess', _subprocess_transform) diff --git a/venv/Lib/site-packages/astroid/brain/brain_threading.py b/venv/Lib/site-packages/astroid/brain/brain_threading.py new file mode 100644 index 00000000..7c609759 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_threading.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2016 Claudiu Popa +# Copyright (c) 2017 Łukasz Rogalski + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +import astroid + + +def _thread_transform(): + return astroid.parse(''' + class lock(object): + def acquire(self, blocking=True): + pass + def release(self): + pass + def __enter__(self): + return True + def __exit__(self, *args): + pass + + def Lock(): + return lock() + ''') + + +astroid.register_module_extender(astroid.MANAGER, 'threading', _thread_transform) diff --git a/venv/Lib/site-packages/astroid/brain/brain_typing.py b/venv/Lib/site-packages/astroid/brain/brain_typing.py new file mode 100644 index 00000000..5aa7bee5 --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_typing.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017-2018 Claudiu Popa +# Copyright (c) 2017 Łukasz Rogalski +# Copyright (c) 2017 David Euresti +# Copyright (c) 2018 Bryce Guinta + +"""Astroid hooks for typing.py support.""" +import typing + +from astroid import ( + MANAGER, + UseInferenceDefault, + extract_node, + inference_tip, + nodes, + InferenceError, +) + + +TYPING_NAMEDTUPLE_BASENAMES = { + 'NamedTuple', + 'typing.NamedTuple' +} +TYPING_TYPEVARS = {'TypeVar', 'NewType'} +TYPING_TYPEVARS_QUALIFIED = {'typing.TypeVar', 'typing.NewType'} +TYPING_TYPE_TEMPLATE = """ +class Meta(type): + def __getitem__(self, item): + return self + +class {0}(metaclass=Meta): + pass +""" +TYPING_MEMBERS = set(typing.__all__) + + +def looks_like_typing_typevar_or_newtype(node): + func = node.func + if isinstance(func, nodes.Attribute): + return func.attrname in TYPING_TYPEVARS + if isinstance(func, nodes.Name): + return func.name in TYPING_TYPEVARS + return False + + +def infer_typing_typevar_or_newtype(node, context=None): + """Infer a typing.TypeVar(...) or typing.NewType(...) call""" + try: + func = next(node.func.infer(context=context)) + except InferenceError as exc: + raise UseInferenceDefault from exc + + if func.qname() not in TYPING_TYPEVARS_QUALIFIED: + raise UseInferenceDefault + if not node.args: + raise UseInferenceDefault + + typename = node.args[0].as_string().strip("'") + node = extract_node(TYPING_TYPE_TEMPLATE.format(typename)) + return node.infer(context=context) + + +def _looks_like_typing_subscript(node): + """Try to figure out if a Subscript node *might* be a typing-related subscript""" + if isinstance(node, nodes.Name): + return node.name in TYPING_MEMBERS + elif isinstance(node, nodes.Attribute): + return node.attrname in TYPING_MEMBERS + elif isinstance(node, nodes.Subscript): + return _looks_like_typing_subscript(node.value) + return False + + +def infer_typing_attr(node, context=None): + """Infer a typing.X[...] subscript""" + try: + value = next(node.value.infer()) + except InferenceError as exc: + raise UseInferenceDefault from exc + + if not value.qname().startswith('typing.'): + raise UseInferenceDefault + + node = extract_node(TYPING_TYPE_TEMPLATE.format(value.qname().split('.')[-1])) + return node.infer(context=context) + + +MANAGER.register_transform( + nodes.Call, + inference_tip(infer_typing_typevar_or_newtype), + looks_like_typing_typevar_or_newtype +) +MANAGER.register_transform( + nodes.Subscript, + inference_tip(infer_typing_attr), + _looks_like_typing_subscript, +) diff --git a/venv/Lib/site-packages/astroid/brain/brain_uuid.py b/venv/Lib/site-packages/astroid/brain/brain_uuid.py new file mode 100644 index 00000000..ea3b277a --- /dev/null +++ b/venv/Lib/site-packages/astroid/brain/brain_uuid.py @@ -0,0 +1,22 @@ +# Copyright (c) 2017 Claudiu Popa + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Astroid hooks for the UUID module.""" + + +from astroid import MANAGER +from astroid import nodes + + +def _patch_uuid_class(node): + # The .int member is patched using __dict__ + node.locals['int'] = [nodes.Const(0, parent=node)] + + +MANAGER.register_transform( + nodes.ClassDef, + _patch_uuid_class, + lambda node: node.qname() == 'uuid.UUID' +) diff --git a/venv/Lib/site-packages/astroid/builder.py b/venv/Lib/site-packages/astroid/builder.py new file mode 100644 index 00000000..0715b186 --- /dev/null +++ b/venv/Lib/site-packages/astroid/builder.py @@ -0,0 +1,414 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2006-2011, 2013-2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2013 Phil Schaf +# Copyright (c) 2014-2018 Claudiu Popa +# Copyright (c) 2014-2015 Google, Inc. +# Copyright (c) 2014 Alexander Presnyakov +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2016 Derek Gustafson +# Copyright (c) 2017 Łukasz Rogalski +# Copyright (c) 2018 Anthony Sottile + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""The AstroidBuilder makes astroid from living object and / or from _ast + +The builder is not thread safe and can't be used to parse different sources +at the same time. +""" + +import os +import textwrap +from tokenize import detect_encoding + +from astroid._ast import _parse +from astroid import bases +from astroid import exceptions +from astroid import manager +from astroid import modutils +from astroid import raw_building +from astroid import rebuilder +from astroid import nodes +from astroid import util + +# The name of the transient function that is used to +# wrap expressions to be extracted when calling +# extract_node. +_TRANSIENT_FUNCTION = '__' + +# The comment used to select a statement to be extracted +# when calling extract_node. +_STATEMENT_SELECTOR = '#@' + +MANAGER = manager.AstroidManager() + + +def open_source_file(filename): + with open(filename, 'rb') as byte_stream: + encoding = detect_encoding(byte_stream.readline)[0] + stream = open(filename, 'r', newline=None, encoding=encoding) + data = stream.read() + return stream, encoding, data + + +def _can_assign_attr(node, attrname): + try: + slots = node.slots() + except NotImplementedError: + pass + else: + if slots and attrname not in {slot.value for slot in slots}: + return False + return True + + +class AstroidBuilder(raw_building.InspectBuilder): + """Class for building an astroid tree from source code or from a live module. + + The param *manager* specifies the manager class which should be used. + If no manager is given, then the default one will be used. The + param *apply_transforms* determines if the transforms should be + applied after the tree was built from source or from a live object, + by default being True. + """ + # pylint: disable=redefined-outer-name + def __init__(self, manager=None, apply_transforms=True): + super(AstroidBuilder, self).__init__() + self._manager = manager or MANAGER + self._apply_transforms = apply_transforms + + def module_build(self, module, modname=None): + """Build an astroid from a living module instance.""" + node = None + path = getattr(module, '__file__', None) + if path is not None: + path_, ext = os.path.splitext(modutils._path_from_filename(path)) + if ext in ('.py', '.pyc', '.pyo') and os.path.exists(path_ + '.py'): + node = self.file_build(path_ + '.py', modname) + if node is None: + # this is a built-in module + # get a partial representation by introspection + node = self.inspect_build(module, modname=modname, path=path) + if self._apply_transforms: + # We have to handle transformation by ourselves since the + # rebuilder isn't called for builtin nodes + node = self._manager.visit_transforms(node) + return node + + def file_build(self, path, modname=None): + """Build astroid from a source code file (i.e. from an ast) + + *path* is expected to be a python source file + """ + try: + stream, encoding, data = open_source_file(path) + except IOError as exc: + raise exceptions.AstroidBuildingError( + 'Unable to load file {path}:\n{error}', + modname=modname, path=path, error=exc) from exc + except (SyntaxError, LookupError) as exc: + raise exceptions.AstroidSyntaxError( + 'Python 3 encoding specification error or unknown encoding:\n' + '{error}', modname=modname, path=path, error=exc) from exc + except UnicodeError as exc: # wrong encoding + # detect_encoding returns utf-8 if no encoding specified + raise exceptions.AstroidBuildingError( + 'Wrong or no encoding specified for {filename}.', + filename=path) from exc + with stream: + # get module name if necessary + if modname is None: + try: + modname = '.'.join(modutils.modpath_from_file(path)) + except ImportError: + modname = os.path.splitext(os.path.basename(path))[0] + # build astroid representation + module = self._data_build(data, modname, path) + return self._post_build(module, encoding) + + def string_build(self, data, modname='', path=None): + """Build astroid from source code string.""" + module = self._data_build(data, modname, path) + module.file_bytes = data.encode('utf-8') + return self._post_build(module, 'utf-8') + + def _post_build(self, module, encoding): + """Handles encoding and delayed nodes after a module has been built""" + module.file_encoding = encoding + self._manager.cache_module(module) + # post tree building steps after we stored the module in the cache: + for from_node in module._import_from_nodes: + if from_node.modname == '__future__': + for symbol, _ in from_node.names: + module.future_imports.add(symbol) + self.add_from_names_to_locals(from_node) + # handle delayed assattr nodes + for delayed in module._delayed_assattr: + self.delayed_assattr(delayed) + + # Visit the transforms + if self._apply_transforms: + module = self._manager.visit_transforms(module) + return module + + def _data_build(self, data, modname, path): + """Build tree node from data and add some informations""" + try: + node = _parse(data + '\n') + except (TypeError, ValueError, SyntaxError) as exc: + raise exceptions.AstroidSyntaxError( + 'Parsing Python code failed:\n{error}', + source=data, modname=modname, path=path, error=exc) from exc + if path is not None: + node_file = os.path.abspath(path) + else: + node_file = '' + if modname.endswith('.__init__'): + modname = modname[:-9] + package = True + else: + package = path is not None and os.path.splitext(os.path.basename(path))[0] == '__init__' + builder = rebuilder.TreeRebuilder(self._manager) + module = builder.visit_module(node, modname, node_file, package) + module._import_from_nodes = builder._import_from_nodes + module._delayed_assattr = builder._delayed_assattr + return module + + def add_from_names_to_locals(self, node): + """Store imported names to the locals + + Resort the locals if coming from a delayed node + """ + _key_func = lambda node: node.fromlineno + def sort_locals(my_list): + my_list.sort(key=_key_func) + + for (name, asname) in node.names: + if name == '*': + try: + imported = node.do_import_module() + except exceptions.AstroidBuildingError: + continue + for name in imported.public_names(): + node.parent.set_local(name, node) + sort_locals(node.parent.scope().locals[name]) + else: + node.parent.set_local(asname or name, node) + sort_locals(node.parent.scope().locals[asname or name]) + + def delayed_assattr(self, node): + """Visit a AssAttr node + + This adds name to locals and handle members definition. + """ + try: + frame = node.frame() + for inferred in node.expr.infer(): + if inferred is util.Uninferable: + continue + try: + if inferred.__class__ is bases.Instance: + inferred = inferred._proxied + iattrs = inferred.instance_attrs + if not _can_assign_attr(inferred, node.attrname): + continue + elif isinstance(inferred, bases.Instance): + # Const, Tuple, ... we may be wrong, may be not, but + # anyway we don't want to pollute builtin's namespace + continue + elif inferred.is_function: + iattrs = inferred.instance_attrs + else: + iattrs = inferred.locals + except AttributeError: + # XXX log error + continue + values = iattrs.setdefault(node.attrname, []) + if node in values: + continue + # get assign in __init__ first XXX useful ? + if (frame.name == '__init__' and values and + values[0].frame().name != '__init__'): + values.insert(0, node) + else: + values.append(node) + except exceptions.InferenceError: + pass + + +def build_namespace_package_module(name, path): + return nodes.Module(name, doc='', path=path, package=True) + + +def parse(code, module_name='', path=None, apply_transforms=True): + """Parses a source string in order to obtain an astroid AST from it + + :param str code: The code for the module. + :param str module_name: The name for the module, if any + :param str path: The path for the module + :param bool apply_transforms: + Apply the transforms for the give code. Use it if you + don't want the default transforms to be applied. + """ + code = textwrap.dedent(code) + builder = AstroidBuilder(manager=MANAGER, + apply_transforms=apply_transforms) + return builder.string_build(code, modname=module_name, path=path) + + +def _extract_expressions(node): + """Find expressions in a call to _TRANSIENT_FUNCTION and extract them. + + The function walks the AST recursively to search for expressions that + are wrapped into a call to _TRANSIENT_FUNCTION. If it finds such an + expression, it completely removes the function call node from the tree, + replacing it by the wrapped expression inside the parent. + + :param node: An astroid node. + :type node: astroid.bases.NodeNG + :yields: The sequence of wrapped expressions on the modified tree + expression can be found. + """ + if (isinstance(node, nodes.Call) + and isinstance(node.func, nodes.Name) + and node.func.name == _TRANSIENT_FUNCTION): + real_expr = node.args[0] + real_expr.parent = node.parent + # Search for node in all _astng_fields (the fields checked when + # get_children is called) of its parent. Some of those fields may + # be lists or tuples, in which case the elements need to be checked. + # When we find it, replace it by real_expr, so that the AST looks + # like no call to _TRANSIENT_FUNCTION ever took place. + for name in node.parent._astroid_fields: + child = getattr(node.parent, name) + if isinstance(child, (list, tuple)): + for idx, compound_child in enumerate(child): + if compound_child is node: + child[idx] = real_expr + elif child is node: + setattr(node.parent, name, real_expr) + yield real_expr + else: + for child in node.get_children(): + yield from _extract_expressions(child) + + +def _find_statement_by_line(node, line): + """Extracts the statement on a specific line from an AST. + + If the line number of node matches line, it will be returned; + otherwise its children are iterated and the function is called + recursively. + + :param node: An astroid node. + :type node: astroid.bases.NodeNG + :param line: The line number of the statement to extract. + :type line: int + :returns: The statement on the line, or None if no statement for the line + can be found. + :rtype: astroid.bases.NodeNG or None + """ + if isinstance(node, (nodes.ClassDef, nodes.FunctionDef)): + # This is an inaccuracy in the AST: the nodes that can be + # decorated do not carry explicit information on which line + # the actual definition (class/def), but .fromline seems to + # be close enough. + node_line = node.fromlineno + else: + node_line = node.lineno + + if node_line == line: + return node + + for child in node.get_children(): + result = _find_statement_by_line(child, line) + if result: + return result + + return None + + +def extract_node(code, module_name=''): + """Parses some Python code as a module and extracts a designated AST node. + + Statements: + To extract one or more statement nodes, append #@ to the end of the line + + Examples: + >>> def x(): + >>> def y(): + >>> return 1 #@ + + The return statement will be extracted. + + >>> class X(object): + >>> def meth(self): #@ + >>> pass + + The function object 'meth' will be extracted. + + Expressions: + To extract arbitrary expressions, surround them with the fake + function call __(...). After parsing, the surrounded expression + will be returned and the whole AST (accessible via the returned + node's parent attribute) will look like the function call was + never there in the first place. + + Examples: + >>> a = __(1) + + The const node will be extracted. + + >>> def x(d=__(foo.bar)): pass + + The node containing the default argument will be extracted. + + >>> def foo(a, b): + >>> return 0 < __(len(a)) < b + + The node containing the function call 'len' will be extracted. + + If no statements or expressions are selected, the last toplevel + statement will be returned. + + If the selected statement is a discard statement, (i.e. an expression + turned into a statement), the wrapped expression is returned instead. + + For convenience, singleton lists are unpacked. + + :param str code: A piece of Python code that is parsed as + a module. Will be passed through textwrap.dedent first. + :param str module_name: The name of the module. + :returns: The designated node from the parse tree, or a list of nodes. + :rtype: astroid.bases.NodeNG, or a list of nodes. + """ + def _extract(node): + if isinstance(node, nodes.Expr): + return node.value + + return node + + requested_lines = [] + for idx, line in enumerate(code.splitlines()): + if line.strip().endswith(_STATEMENT_SELECTOR): + requested_lines.append(idx + 1) + + tree = parse(code, module_name=module_name) + if not tree.body: + raise ValueError('Empty tree, cannot extract from it') + + extracted = [] + if requested_lines: + extracted = [_find_statement_by_line(tree, line) for line in requested_lines] + + # Modifies the tree. + extracted.extend(_extract_expressions(tree)) + + if not extracted: + extracted.append(tree.body[-1]) + + extracted = [_extract(node) for node in extracted] + if len(extracted) == 1: + return extracted[0] + return extracted diff --git a/venv/Lib/site-packages/astroid/context.py b/venv/Lib/site-packages/astroid/context.py new file mode 100644 index 00000000..3b50d99d --- /dev/null +++ b/venv/Lib/site-packages/astroid/context.py @@ -0,0 +1,173 @@ +# Copyright (c) 2015-2016, 2018 Claudiu Popa +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2018 Bryce Guinta +# Copyright (c) 2018 Nick Drozd + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Various context related utilities, including inference and call contexts.""" + +import contextlib +import copy +import pprint + + +class InferenceContext: + """Provide context for inference + + Store already inferred nodes to save time + Account for already visited nodes to infinite stop infinite recursion + """ + + __slots__ = ('path', 'lookupname', 'callcontext', 'boundnode', 'inferred', 'extra_context') + + def __init__(self, path=None, inferred=None): + self.path = path or set() + """ + :type: set(tuple(NodeNG, optional(str))) + + Path of visited nodes and their lookupname + + Currently this key is ``(node, context.lookupname)`` + """ + self.lookupname = None + """ + :type: optional[str] + + The original name of the node + + e.g. + foo = 1 + The inference of 'foo' is nodes.Const(1) but the lookup name is 'foo' + """ + self.callcontext = None + """ + :type: optional[CallContext] + + The call arguments and keywords for the given context + """ + self.boundnode = None + """ + :type: optional[NodeNG] + + The bound node of the given context + + e.g. the bound node of object.__new__(cls) is the object node + """ + self.inferred = inferred or {} + """ + :type: dict(seq, seq) + + Inferred node contexts to their mapped results + Currently the key is ``(node, lookupname, callcontext, boundnode)`` + and the value is tuple of the inferred results + """ + self.extra_context = {} + """ + :type: dict(NodeNG, Context) + + Context that needs to be passed down through call stacks + for call arguments + """ + + def push(self, node): + """Push node into inference path + + :return: True if node is already in context path else False + :rtype: bool + + Allows one to see if the given node has already + been looked at for this inference context""" + name = self.lookupname + if (node, name) in self.path: + return True + + self.path.add((node, name)) + return False + + def clone(self): + """Clone inference path + + For example, each side of a binary operation (BinOp) + starts with the same context but diverge as each side is inferred + so the InferenceContext will need be cloned""" + # XXX copy lookupname/callcontext ? + clone = InferenceContext(copy.copy(self.path), inferred=self.inferred) + clone.callcontext = self.callcontext + clone.boundnode = self.boundnode + clone.extra_context = self.extra_context + return clone + + def cache_generator(self, key, generator): + """Cache result of generator into dictionary + + Used to cache inference results""" + results = [] + for result in generator: + results.append(result) + yield result + + self.inferred[key] = tuple(results) + + @contextlib.contextmanager + def restore_path(self): + path = set(self.path) + yield + self.path = path + + def __str__(self): + state = ('%s=%s' % (field, pprint.pformat(getattr(self, field), + width=80 - len(field))) + for field in self.__slots__) + return '%s(%s)' % (type(self).__name__, ',\n '.join(state)) + + +class CallContext: + """Holds information for a call site.""" + + __slots__ = ('args', 'keywords') + + def __init__(self, args, keywords=None): + """ + :param List[NodeNG] args: Call positional arguments + :param Union[List[nodes.Keyword], None] keywords: Call keywords + """ + self.args = args + if keywords: + keywords = [(arg.arg, arg.value) for arg in keywords] + else: + keywords = [] + self.keywords = keywords + + +def copy_context(context): + if context is not None: + return context.clone() + + return InferenceContext() + + +def bind_context_to_node(context, node): + """Give a context a boundnode + to retrieve the correct function name or attribute value + with from further inference. + + Do not use an existing context since the boundnode could then + be incorrectly propagated higher up in the call stack. + + :param context: Context to use + :type context: Optional(context) + + :param node: Node to do name lookups from + :type node NodeNG: + + :returns: A new context + :rtype: InferenceContext + """ + if context is not None: + context = context.clone() + else: + context = InferenceContext() + context.boundnode = node + return context diff --git a/venv/Lib/site-packages/astroid/decorators.py b/venv/Lib/site-packages/astroid/decorators.py new file mode 100644 index 00000000..ef5a7a8e --- /dev/null +++ b/venv/Lib/site-packages/astroid/decorators.py @@ -0,0 +1,134 @@ +# Copyright (c) 2015-2016, 2018 Claudiu Popa +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2015 Florian Bruhin +# Copyright (c) 2016 Derek Gustafson +# Copyright (c) 2018 Nick Drozd +# Copyright (c) 2018 Ashley Whetter +# Copyright (c) 2018 HoverHell +# Copyright (c) 2018 Bryce Guinta + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +""" A few useful function/method decorators.""" + +import functools + +import wrapt + +from astroid import context as contextmod +from astroid import exceptions +from astroid import util + + +@wrapt.decorator +def cached(func, instance, args, kwargs): + """Simple decorator to cache result of method calls without args.""" + cache = getattr(instance, '__cache', None) + if cache is None: + instance.__cache = cache = {} + try: + return cache[func] + except KeyError: + cache[func] = result = func(*args, **kwargs) + return result + + +class cachedproperty: + """ Provides a cached property equivalent to the stacking of + @cached and @property, but more efficient. + + After first usage, the becomes part of the object's + __dict__. Doing: + + del obj. empties the cache. + + Idea taken from the pyramid_ framework and the mercurial_ project. + + .. _pyramid: http://pypi.python.org/pypi/pyramid + .. _mercurial: http://pypi.python.org/pypi/Mercurial + """ + __slots__ = ('wrapped',) + + def __init__(self, wrapped): + try: + wrapped.__name__ + except AttributeError as exc: + raise TypeError('%s must have a __name__ attribute' % wrapped) from exc + self.wrapped = wrapped + + @property + def __doc__(self): + doc = getattr(self.wrapped, '__doc__', None) + return ('%s' + % ('\n%s' % doc if doc else '')) + + def __get__(self, inst, objtype=None): + if inst is None: + return self + val = self.wrapped(inst) + setattr(inst, self.wrapped.__name__, val) + return val + + +def path_wrapper(func): + """return the given infer function wrapped to handle the path + + Used to stop inference if the node has already been looked + at for a given `InferenceContext` to prevent infinite recursion + """ + @functools.wraps(func) + def wrapped(node, context=None, _func=func, **kwargs): + """wrapper function handling context""" + if context is None: + context = contextmod.InferenceContext() + if context.push(node): + return None + + yielded = set() + generator = _func(node, context, **kwargs) + try: + while True: + res = next(generator) + # unproxy only true instance, not const, tuple, dict... + if res.__class__.__name__ == 'Instance': + ares = res._proxied + else: + ares = res + if ares not in yielded: + yield res + yielded.add(ares) + except StopIteration as error: + if error.args: + return error.args[0] + return None + + return wrapped + + +@wrapt.decorator +def yes_if_nothing_inferred(func, instance, args, kwargs): + inferred = False + for node in func(*args, **kwargs): + inferred = True + yield node + if not inferred: + yield util.Uninferable + + +@wrapt.decorator +def raise_if_nothing_inferred(func, instance, args, kwargs): + inferred = False + try: + generator = func(*args, **kwargs) + while True: + yield next(generator) + inferred = True + except StopIteration as error: + if not inferred: + if error.args: + # pylint: disable=not-a-mapping + raise exceptions.InferenceError(**error.args[0]) + else: + raise exceptions.InferenceError( + 'StopIteration raised without any error information.') diff --git a/venv/Lib/site-packages/astroid/exceptions.py b/venv/Lib/site-packages/astroid/exceptions.py new file mode 100644 index 00000000..ad3705a7 --- /dev/null +++ b/venv/Lib/site-packages/astroid/exceptions.py @@ -0,0 +1,217 @@ +# Copyright (c) 2007, 2009-2010, 2013 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2014 Google, Inc. +# Copyright (c) 2015-2018 Claudiu Popa +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2016 Derek Gustafson +# Copyright (c) 2018 Bryce Guinta + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""this module contains exceptions used in the astroid library +""" +from astroid import util + + +class AstroidError(Exception): + """base exception class for all astroid related exceptions + + AstroidError and its subclasses are structured, intended to hold + objects representing state when the exception is thrown. Field + values are passed to the constructor as keyword-only arguments. + Each subclass has its own set of standard fields, but use your + best judgment to decide whether a specific exception instance + needs more or fewer fields for debugging. Field values may be + used to lazily generate the error message: self.message.format() + will be called with the field names and values supplied as keyword + arguments. + """ + def __init__(self, message='', **kws): + super(AstroidError, self).__init__(message) + self.message = message + for key, value in kws.items(): + setattr(self, key, value) + + def __str__(self): + return self.message.format(**vars(self)) + + +class AstroidBuildingError(AstroidError): + """exception class when we are unable to build an astroid representation + + Standard attributes: + modname: Name of the module that AST construction failed for. + error: Exception raised during construction. + """ + + def __init__(self, message='Failed to import module {modname}.', **kws): + super(AstroidBuildingError, self).__init__(message, **kws) + + +class AstroidImportError(AstroidBuildingError): + """Exception class used when a module can't be imported by astroid.""" + + +class TooManyLevelsError(AstroidImportError): + """Exception class which is raised when a relative import was beyond the top-level. + + Standard attributes: + level: The level which was attempted. + name: the name of the module on which the relative import was attempted. + """ + level = None + name = None + + def __init__(self, message='Relative import with too many levels ' + '({level}) for module {name!r}', **kws): + super(TooManyLevelsError, self).__init__(message, **kws) + + +class AstroidSyntaxError(AstroidBuildingError): + """Exception class used when a module can't be parsed.""" + + +class NoDefault(AstroidError): + """raised by function's `default_value` method when an argument has + no default value + + Standard attributes: + func: Function node. + name: Name of argument without a default. + """ + func = None + name = None + + def __init__(self, message='{func!r} has no default for {name!r}.', **kws): + super(NoDefault, self).__init__(message, **kws) + + +class ResolveError(AstroidError): + """Base class of astroid resolution/inference error. + + ResolveError is not intended to be raised. + + Standard attributes: + context: InferenceContext object. + """ + context = None + + +class MroError(ResolveError): + """Error raised when there is a problem with method resolution of a class. + + Standard attributes: + mros: A sequence of sequences containing ClassDef nodes. + cls: ClassDef node whose MRO resolution failed. + context: InferenceContext object. + """ + mros = () + cls = None + + def __str__(self): + mro_names = ", ".join("({})".format(", ".join(b.name for b in m)) + for m in self.mros) + return self.message.format(mros=mro_names, cls=self.cls) + + +class DuplicateBasesError(MroError): + """Error raised when there are duplicate bases in the same class bases.""" + + +class InconsistentMroError(MroError): + """Error raised when a class's MRO is inconsistent.""" + + +class SuperError(ResolveError): + """Error raised when there is a problem with a *super* call. + + Standard attributes: + *super_*: The Super instance that raised the exception. + context: InferenceContext object. + """ + super_ = None + + def __str__(self): + return self.message.format(**vars(self.super_)) + + +class InferenceError(ResolveError): + """raised when we are unable to infer a node + + Standard attributes: + node: The node inference was called on. + context: InferenceContext object. + """ + node = None + context = None + + def __init__(self, message='Inference failed for {node!r}.', **kws): + super(InferenceError, self).__init__(message, **kws) + + +# Why does this inherit from InferenceError rather than ResolveError? +# Changing it causes some inference tests to fail. +class NameInferenceError(InferenceError): + """Raised when a name lookup fails, corresponds to NameError. + + Standard attributes: + name: The name for which lookup failed, as a string. + scope: The node representing the scope in which the lookup occurred. + context: InferenceContext object. + """ + name = None + scope = None + + def __init__(self, message='{name!r} not found in {scope!r}.', **kws): + super(NameInferenceError, self).__init__(message, **kws) + + +class AttributeInferenceError(ResolveError): + """Raised when an attribute lookup fails, corresponds to AttributeError. + + Standard attributes: + target: The node for which lookup failed. + attribute: The attribute for which lookup failed, as a string. + context: InferenceContext object. + """ + target = None + attribute = None + + def __init__(self, message='{attribute!r} not found on {target!r}.', **kws): + super(AttributeInferenceError, self).__init__(message, **kws) + + +class UseInferenceDefault(Exception): + """exception to be raised in custom inference function to indicate that it + should go back to the default behaviour + """ + + +class _NonDeducibleTypeHierarchy(Exception): + """Raised when is_subtype / is_supertype can't deduce the relation between two types.""" + + +class AstroidIndexError(AstroidError): + """Raised when an Indexable / Mapping does not have an index / key.""" + + +class AstroidTypeError(AstroidError): + """Raised when a TypeError would be expected in Python code.""" + + +class InferenceOverwriteError(AstroidError): + """Raised when an inference tip is overwritten + + Currently only used for debugging. + """ + + +# Backwards-compatibility aliases +OperationError = util.BadOperationMessage +UnaryOperationError = util.BadUnaryOperationMessage +BinaryOperationError = util.BadBinaryOperationMessage + +SuperArgumentTypeError = SuperError +UnresolvableName = NameInferenceError +NotFoundError = AttributeInferenceError +AstroidBuildingException = AstroidBuildingError diff --git a/venv/Lib/site-packages/astroid/helpers.py b/venv/Lib/site-packages/astroid/helpers.py new file mode 100644 index 00000000..d7a72338 --- /dev/null +++ b/venv/Lib/site-packages/astroid/helpers.py @@ -0,0 +1,264 @@ +# Copyright (c) 2015-2018 Claudiu Popa +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2018 Bryce Guinta + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + + +""" +Various helper utilities. +""" + +import builtins as builtins_mod + +from astroid import bases +from astroid import context as contextmod +from astroid import exceptions +from astroid import manager +from astroid import nodes +from astroid import raw_building +from astroid import scoped_nodes +from astroid import util + + +BUILTINS = builtins_mod.__name__ + + +def _build_proxy_class(cls_name, builtins): + proxy = raw_building.build_class(cls_name) + proxy.parent = builtins + return proxy + + +def _function_type(function, builtins): + if isinstance(function, scoped_nodes.Lambda): + if function.root().name == BUILTINS: + cls_name = 'builtin_function_or_method' + else: + cls_name = 'function' + elif isinstance(function, bases.BoundMethod): + cls_name = 'method' + elif isinstance(function, bases.UnboundMethod): + cls_name = 'function' + return _build_proxy_class(cls_name, builtins) + + +def _object_type(node, context=None): + astroid_manager = manager.AstroidManager() + builtins = astroid_manager.astroid_cache[BUILTINS] + context = context or contextmod.InferenceContext() + + for inferred in node.infer(context=context): + if isinstance(inferred, scoped_nodes.ClassDef): + if inferred.newstyle: + metaclass = inferred.metaclass() + if metaclass: + yield metaclass + continue + yield builtins.getattr('type')[0] + elif isinstance(inferred, (scoped_nodes.Lambda, bases.UnboundMethod)): + yield _function_type(inferred, builtins) + elif isinstance(inferred, scoped_nodes.Module): + yield _build_proxy_class('module', builtins) + else: + yield inferred._proxied + + +def object_type(node, context=None): + """Obtain the type of the given node + + This is used to implement the ``type`` builtin, which means that it's + used for inferring type calls, as well as used in a couple of other places + in the inference. + The node will be inferred first, so this function can support all + sorts of objects, as long as they support inference. + """ + + try: + types = set(_object_type(node, context)) + except exceptions.InferenceError: + return util.Uninferable + if len(types) > 1 or not types: + return util.Uninferable + return list(types)[0] + + +def _object_type_is_subclass(obj_type, class_or_seq, context=None): + if not isinstance(class_or_seq, (tuple, list)): + class_seq = (class_or_seq,) + else: + class_seq = class_or_seq + + if obj_type is util.Uninferable: + return util.Uninferable + + # Instances are not types + class_seq = [item if not isinstance(item, bases.Instance) + else util.Uninferable for item in class_seq] + # strict compatibility with issubclass + # issubclass(type, (object, 1)) evaluates to true + # issubclass(object, (1, type)) raises TypeError + for klass in class_seq: + if klass is util.Uninferable: + raise exceptions.AstroidTypeError("arg 2 must be a type or tuple of types") + + for obj_subclass in obj_type.mro(): + if obj_subclass == klass: + return True + return False + + +def object_isinstance(node, class_or_seq, context=None): + """Check if a node 'isinstance' any node in class_or_seq + + :param node: A given node + :param class_or_seq: Union[nodes.NodeNG, Sequence[nodes.NodeNG]] + :rtype: bool + + :raises AstroidTypeError: if the given ``classes_or_seq`` are not types + """ + obj_type = object_type(node, context) + if obj_type is util.Uninferable: + return util.Uninferable + return _object_type_is_subclass(obj_type, class_or_seq, context=context) + + +def object_issubclass(node, class_or_seq, context=None): + """Check if a type is a subclass of any node in class_or_seq + + :param node: A given node + :param class_or_seq: Union[Nodes.NodeNG, Sequence[nodes.NodeNG]] + :rtype: bool + + :raises AstroidTypeError: if the given ``classes_or_seq`` are not types + :raises AstroidError: if the type of the given node cannot be inferred + or its type's mro doesn't work + """ + if not isinstance(node, nodes.ClassDef): + raise TypeError("{node} needs to be a ClassDef node".format(node=node)) + return _object_type_is_subclass(node, class_or_seq, context=context) + + +def safe_infer(node, context=None): + """Return the inferred value for the given node. + + Return None if inference failed or if there is some ambiguity (more than + one node has been inferred). + """ + try: + inferit = node.infer(context=context) + value = next(inferit) + except exceptions.InferenceError: + return None + try: + next(inferit) + return None # None if there is ambiguity on the inferred node + except exceptions.InferenceError: + return None# there is some kind of ambiguity + except StopIteration: + return value + + +def has_known_bases(klass, context=None): + """Return true if all base classes of a class could be inferred.""" + try: + return klass._all_bases_known + except AttributeError: + pass + for base in klass.bases: + result = safe_infer(base, context=context) + # TODO: check for A->B->A->B pattern in class structure too? + if (not isinstance(result, scoped_nodes.ClassDef) or + result is klass or + not has_known_bases(result, context=context)): + klass._all_bases_known = False + return False + klass._all_bases_known = True + return True + + +def _type_check(type1, type2): + if not all(map(has_known_bases, (type1, type2))): + raise exceptions._NonDeducibleTypeHierarchy + + if not all([type1.newstyle, type2.newstyle]): + return False + try: + return type1 in type2.mro()[:-1] + except exceptions.MroError: + # The MRO is invalid. + raise exceptions._NonDeducibleTypeHierarchy + + +def is_subtype(type1, type2): + """Check if *type1* is a subtype of *typ2*.""" + return _type_check(type2, type1) + + +def is_supertype(type1, type2): + """Check if *type2* is a supertype of *type1*.""" + return _type_check(type1, type2) + + +def class_instance_as_index(node): + """Get the value as an index for the given instance. + + If an instance provides an __index__ method, then it can + be used in some scenarios where an integer is expected, + for instance when multiplying or subscripting a list. + """ + context = contextmod.InferenceContext() + context.callcontext = contextmod.CallContext(args=[node]) + + try: + for inferred in node.igetattr('__index__', context=context): + if not isinstance(inferred, bases.BoundMethod): + continue + + for result in inferred.infer_call_result(node, context=context): + if (isinstance(result, nodes.Const) + and isinstance(result.value, int)): + return result + except exceptions.InferenceError: + pass + return None + + +def object_len(node, context=None): + """Infer length of given node object + + :param Union[nodes.ClassDef, nodes.Instance] node: + :param node: Node to infer length of + + :raises AstroidTypeError: If an invalid node is returned + from __len__ method or no __len__ method exists + :raises InferenceError: If the given node cannot be inferred + or if multiple nodes are inferred + :rtype int: Integer length of node + """ + from astroid.objects import FrozenSet + inferred_node = safe_infer(node, context=context) + if inferred_node is None or inferred_node is util.Uninferable: + raise exceptions.InferenceError(node=node) + if (isinstance(inferred_node, nodes.Const) and + isinstance(inferred_node.value, (bytes, str))): + return len(inferred_node.value) + if isinstance(inferred_node, (nodes.List, nodes.Set, nodes.Tuple, FrozenSet)): + return len(inferred_node.elts) + if isinstance(inferred_node, nodes.Dict): + return len(inferred_node.items) + try: + node_type = object_type(inferred_node, context=context) + len_call = next(node_type.igetattr("__len__", context=context)) + except exceptions.AttributeInferenceError: + raise exceptions.AstroidTypeError( + "object of type '{}' has no len()" + .format(len_call.pytype())) + + result_of_len = next(len_call.infer_call_result(node, context)) + if isinstance(result_of_len, nodes.Const) and result_of_len.pytype() == "builtins.int": + return result_of_len.value + raise exceptions.AstroidTypeError( + "'{}' object cannot be interpreted as an integer" + .format(result_of_len)) diff --git a/venv/Lib/site-packages/astroid/inference.py b/venv/Lib/site-packages/astroid/inference.py new file mode 100644 index 00000000..b61427a0 --- /dev/null +++ b/venv/Lib/site-packages/astroid/inference.py @@ -0,0 +1,882 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2006-2011, 2013-2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2012 FELD Boris +# Copyright (c) 2013-2014 Google, Inc. +# Copyright (c) 2014-2018 Claudiu Popa +# Copyright (c) 2014 Eevee (Alex Munroe) +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2015 Dmitry Pribysh +# Copyright (c) 2016 Jakub Wilk +# Copyright (c) 2017 Michał Masłowski +# Copyright (c) 2017 Calen Pennington +# Copyright (c) 2017 Łukasz Rogalski +# Copyright (c) 2018 Bryce Guinta +# Copyright (c) 2018 Nick Drozd +# Copyright (c) 2018 Ashley Whetter +# Copyright (c) 2018 HoverHell + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""this module contains a set of functions to handle inference on astroid trees +""" + +import functools +import itertools +import operator + +from astroid import bases +from astroid import context as contextmod +from astroid import exceptions +from astroid import decorators +from astroid import helpers +from astroid import manager +from astroid import nodes +from astroid.interpreter import dunder_lookup +from astroid import protocols +from astroid import util + + +MANAGER = manager.AstroidManager() + + +# .infer method ############################################################### + + +def infer_end(self, context=None): + """inference's end for node such as Module, ClassDef, FunctionDef, + Const... + + """ + yield self +nodes.Module._infer = infer_end +nodes.ClassDef._infer = infer_end +nodes.FunctionDef._infer = infer_end +nodes.Lambda._infer = infer_end +nodes.Const._infer = infer_end +nodes.Slice._infer = infer_end + + +def _infer_sequence_helper(node, context=None): + """Infer all values based on _BaseContainer.elts""" + values = [] + + for elt in node.elts: + if isinstance(elt, nodes.Starred): + starred = helpers.safe_infer(elt.value, context) + if starred in (None, util.Uninferable): + raise exceptions.InferenceError(node=node, + context=context) + if not hasattr(starred, 'elts'): + raise exceptions.InferenceError(node=node, + context=context) + values.extend(_infer_sequence_helper(starred)) + else: + values.append(elt) + return values + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_sequence(self, context=None): + if not any(isinstance(e, nodes.Starred) for e in self.elts): + yield self + else: + values = _infer_sequence_helper(self, context) + new_seq = type(self)(self.lineno, self.col_offset, self.parent) + new_seq.postinit(values) + yield new_seq + + +nodes.List._infer = infer_sequence +nodes.Tuple._infer = infer_sequence +nodes.Set._infer = infer_sequence + + +def infer_map(self, context=None): + if not any(isinstance(k, nodes.DictUnpack) for k, _ in self.items): + yield self + else: + items = _infer_map(self, context) + new_seq = type(self)(self.lineno, self.col_offset, self.parent) + new_seq.postinit(list(items.items())) + yield new_seq + + +def _update_with_replacement(lhs_dict, rhs_dict): + """Delete nodes that equate to duplicate keys + + Since an astroid node doesn't 'equal' another node with the same value, + this function uses the as_string method to make sure duplicate keys + don't get through + + Note that both the key and the value are astroid nodes + + Fixes issue with DictUnpack causing duplicte keys + in inferred Dict items + + :param dict(nodes.NodeNG, nodes.NodeNG) lhs_dict: Dictionary to 'merge' nodes into + :param dict(nodes.NodeNG, nodes.NodeNG) rhs_dict: Dictionary with nodes to pull from + :return dict(nodes.NodeNG, nodes.NodeNG): merged dictionary of nodes + """ + combined_dict = itertools.chain(lhs_dict.items(), rhs_dict.items()) + # Overwrite keys which have the same string values + string_map = {key.as_string(): (key, value) for key, value in combined_dict} + # Return to dictionary + return dict(string_map.values()) + + +def _infer_map(node, context): + """Infer all values based on Dict.items""" + values = {} + for name, value in node.items: + if isinstance(name, nodes.DictUnpack): + double_starred = helpers.safe_infer(value, context) + if double_starred in (None, util.Uninferable): + raise exceptions.InferenceError + if not isinstance(double_starred, nodes.Dict): + raise exceptions.InferenceError(node=node, + context=context) + unpack_items = _infer_map(double_starred, context) + values = _update_with_replacement(values, unpack_items) + else: + key = helpers.safe_infer(name, context=context) + value = helpers.safe_infer(value, context=context) + if any(elem in (None, util.Uninferable) for elem in (key, value)): + raise exceptions.InferenceError(node=node, + context=context) + values = _update_with_replacement(values, {key: value}) + return values + + +nodes.Dict._infer = infer_map + + +def _higher_function_scope(node): + """ Search for the first function which encloses the given + scope. This can be used for looking up in that function's + scope, in case looking up in a lower scope for a particular + name fails. + + :param node: A scope node. + :returns: + ``None``, if no parent function scope was found, + otherwise an instance of :class:`astroid.scoped_nodes.Function`, + which encloses the given node. + """ + current = node + while current.parent and not isinstance(current.parent, nodes.FunctionDef): + current = current.parent + if current and current.parent: + return current.parent + return None + +def infer_name(self, context=None): + """infer a Name: use name lookup rules""" + frame, stmts = self.lookup(self.name) + if not stmts: + # Try to see if the name is enclosed in a nested function + # and use the higher (first function) scope for searching. + parent_function = _higher_function_scope(self.scope()) + if parent_function: + _, stmts = parent_function.lookup(self.name) + + if not stmts: + raise exceptions.NameInferenceError(name=self.name, + scope=self.scope(), + context=context) + context = context.clone() + context.lookupname = self.name + return bases._infer_stmts(stmts, context, frame) + +# pylint: disable=no-value-for-parameter +nodes.Name._infer = decorators.raise_if_nothing_inferred( + decorators.path_wrapper(infer_name) +) +nodes.AssignName.infer_lhs = infer_name # won't work with a path wrapper + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_call(self, context=None): + """infer a Call node by trying to guess what the function returns""" + callcontext = context.clone() + callcontext.callcontext = contextmod.CallContext(args=self.args, + keywords=self.keywords) + callcontext.boundnode = None + extra_context = {} + if context is not None: + extra_context = _populate_context_lookup(self, context.clone()) + callcontext.extra_context = extra_context + for callee in self.func.infer(context): + if callee is util.Uninferable: + yield callee + continue + try: + if hasattr(callee, 'infer_call_result'): + yield from callee.infer_call_result( + caller=self, + context=callcontext, + ) + except exceptions.InferenceError: + continue + return dict(node=self, context=context) +nodes.Call._infer = infer_call + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_import(self, context=None, asname=True): + """infer an Import node: return the imported module/object""" + name = context.lookupname + if name is None: + raise exceptions.InferenceError(node=self, context=context) + + try: + if asname: + yield self.do_import_module(self.real_name(name)) + else: + yield self.do_import_module(name) + except exceptions.AstroidBuildingError as exc: + raise exceptions.InferenceError( + node=self, + context=context, + ) from exc + + +nodes.Import._infer = infer_import + + +def infer_name_module(self, name): + context = contextmod.InferenceContext() + context.lookupname = name + return self.infer(context, asname=False) +nodes.Import.infer_name_module = infer_name_module + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_import_from(self, context=None, asname=True): + """infer a ImportFrom node: return the imported module/object""" + name = context.lookupname + if name is None: + raise exceptions.InferenceError(node=self, context=context) + if asname: + name = self.real_name(name) + + try: + module = self.do_import_module() + except exceptions.AstroidBuildingError as exc: + raise exceptions.InferenceError( + node=self, + context=context, + ) from exc + + try: + context = contextmod.copy_context(context) + context.lookupname = name + stmts = module.getattr(name, ignore_locals=module is self.root()) + return bases._infer_stmts(stmts, context) + except exceptions.AttributeInferenceError as error: + raise exceptions.InferenceError( + error.message, + target=self, + attribute=name, + context=context, + ) from error +nodes.ImportFrom._infer = infer_import_from + + +@decorators.raise_if_nothing_inferred +def infer_attribute(self, context=None): + """infer an Attribute node by using getattr on the associated object""" + for owner in self.expr.infer(context): + if owner is util.Uninferable: + yield owner + continue + + if context and context.boundnode: + # This handles the situation where the attribute is accessed through a subclass + # of a base class and the attribute is defined at the base class's level, + # by taking in consideration a redefinition in the subclass. + if (isinstance(owner, bases.Instance) + and isinstance(context.boundnode, bases.Instance)): + try: + if helpers.is_subtype(helpers.object_type(context.boundnode), + helpers.object_type(owner)): + owner = context.boundnode + except exceptions._NonDeducibleTypeHierarchy: + # Can't determine anything useful. + pass + + try: + context.boundnode = owner + yield from owner.igetattr(self.attrname, context) + context.boundnode = None + except (exceptions.AttributeInferenceError, exceptions.InferenceError): + context.boundnode = None + except AttributeError: + # XXX method / function + context.boundnode = None + return dict(node=self, context=context) +nodes.Attribute._infer = decorators.path_wrapper(infer_attribute) +nodes.AssignAttr.infer_lhs = infer_attribute # # won't work with a path wrapper + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_global(self, context=None): + if context.lookupname is None: + raise exceptions.InferenceError(node=self, context=context) + try: + return bases._infer_stmts(self.root().getattr(context.lookupname), + context) + except exceptions.AttributeInferenceError as error: + raise exceptions.InferenceError( + error.message, + target=self, + attribute=context.lookupname, + context=context, + ) from error +nodes.Global._infer = infer_global + + +_SUBSCRIPT_SENTINEL = object() + + +@decorators.raise_if_nothing_inferred +def infer_subscript(self, context=None): + """Inference for subscripts + + We're understanding if the index is a Const + or a slice, passing the result of inference + to the value's `getitem` method, which should + handle each supported index type accordingly. + """ + + try: + value = next(self.value.infer(context)) + except StopIteration: + return None + if value is util.Uninferable: + yield util.Uninferable + return None + + try: + index = next(self.slice.infer(context)) + except StopIteration: + return None + if index is util.Uninferable: + yield util.Uninferable + return None + + # Try to deduce the index value. + index_value = _SUBSCRIPT_SENTINEL + if value.__class__ == bases.Instance: + index_value = index + else: + if index.__class__ == bases.Instance: + instance_as_index = helpers.class_instance_as_index(index) + if instance_as_index: + index_value = instance_as_index + else: + index_value = index + if index_value is _SUBSCRIPT_SENTINEL: + raise exceptions.InferenceError(node=self, context=context) + + try: + assigned = value.getitem(index_value, context) + except (exceptions.AstroidTypeError, + exceptions.AstroidIndexError, + exceptions.AttributeInferenceError, + AttributeError) as exc: + raise exceptions.InferenceError(node=self, context=context) from exc + + # Prevent inferring if the inferred subscript + # is the same as the original subscripted object. + if self is assigned or assigned is util.Uninferable: + yield util.Uninferable + return None + yield from assigned.infer(context) + + return dict(node=self, context=context) + +nodes.Subscript._infer = decorators.path_wrapper(infer_subscript) +nodes.Subscript.infer_lhs = infer_subscript + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def _infer_boolop(self, context=None): + """Infer a boolean operation (and / or / not). + + The function will calculate the boolean operation + for all pairs generated through inference for each component + node. + """ + values = self.values + if self.op == 'or': + predicate = operator.truth + else: + predicate = operator.not_ + + try: + values = [value.infer(context=context) for value in values] + except exceptions.InferenceError: + yield util.Uninferable + return None + + for pair in itertools.product(*values): + if any(item is util.Uninferable for item in pair): + # Can't infer the final result, just yield Uninferable. + yield util.Uninferable + continue + + bool_values = [item.bool_value() for item in pair] + if any(item is util.Uninferable for item in bool_values): + # Can't infer the final result, just yield Uninferable. + yield util.Uninferable + continue + + # Since the boolean operations are short circuited operations, + # this code yields the first value for which the predicate is True + # and if no value respected the predicate, then the last value will + # be returned (or Uninferable if there was no last value). + # This is conforming to the semantics of `and` and `or`: + # 1 and 0 -> 1 + # 0 and 1 -> 0 + # 1 or 0 -> 1 + # 0 or 1 -> 1 + value = util.Uninferable + for value, bool_value in zip(pair, bool_values): + if predicate(bool_value): + yield value + break + else: + yield value + + return dict(node=self, context=context) + +nodes.BoolOp._infer = _infer_boolop + + +# UnaryOp, BinOp and AugAssign inferences + +def _filter_operation_errors(self, infer_callable, context, error): + for result in infer_callable(self, context): + if isinstance(result, error): + # For the sake of .infer(), we don't care about operation + # errors, which is the job of pylint. So return something + # which shows that we can't infer the result. + yield util.Uninferable + else: + yield result + + +def _infer_unaryop(self, context=None): + """Infer what an UnaryOp should return when evaluated.""" + for operand in self.operand.infer(context): + try: + yield operand.infer_unary_op(self.op) + except TypeError as exc: + # The operand doesn't support this operation. + yield util.BadUnaryOperationMessage(operand, self.op, exc) + except AttributeError as exc: + meth = protocols.UNARY_OP_METHOD[self.op] + if meth is None: + # `not node`. Determine node's boolean + # value and negate its result, unless it is + # Uninferable, which will be returned as is. + bool_value = operand.bool_value() + if bool_value is not util.Uninferable: + yield nodes.const_factory(not bool_value) + else: + yield util.Uninferable + else: + if not isinstance(operand, (bases.Instance, nodes.ClassDef)): + # The operation was used on something which + # doesn't support it. + yield util.BadUnaryOperationMessage(operand, self.op, exc) + continue + + try: + try: + methods = dunder_lookup.lookup(operand, meth) + except exceptions.AttributeInferenceError: + yield util.BadUnaryOperationMessage(operand, self.op, exc) + continue + + meth = methods[0] + inferred = next(meth.infer(context=context)) + if inferred is util.Uninferable or not inferred.callable(): + continue + + context = contextmod.copy_context(context) + context.callcontext = contextmod.CallContext(args=[operand]) + call_results = inferred.infer_call_result(self, context=context) + result = next(call_results, None) + if result is None: + # Failed to infer, return the same type. + yield operand + else: + yield result + except exceptions.AttributeInferenceError as exc: + # The unary operation special method was not found. + yield util.BadUnaryOperationMessage(operand, self.op, exc) + except exceptions.InferenceError: + yield util.Uninferable + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_unaryop(self, context=None): + """Infer what an UnaryOp should return when evaluated.""" + yield from _filter_operation_errors(self, _infer_unaryop, context, + util.BadUnaryOperationMessage) + return dict(node=self, context=context) + +nodes.UnaryOp._infer_unaryop = _infer_unaryop +nodes.UnaryOp._infer = infer_unaryop + + +def _is_not_implemented(const): + """Check if the given const node is NotImplemented.""" + return isinstance(const, nodes.Const) and const.value is NotImplemented + + +def _invoke_binop_inference(instance, opnode, op, other, context, method_name): + """Invoke binary operation inference on the given instance.""" + methods = dunder_lookup.lookup(instance, method_name) + context = contextmod.bind_context_to_node(context, instance) + method = methods[0] + inferred = next(method.infer(context=context)) + if inferred is util.Uninferable: + raise exceptions.InferenceError + return instance.infer_binary_op(opnode, op, other, context, inferred) + + +def _aug_op(instance, opnode, op, other, context, reverse=False): + """Get an inference callable for an augmented binary operation.""" + method_name = protocols.AUGMENTED_OP_METHOD[op] + return functools.partial(_invoke_binop_inference, + instance=instance, + op=op, opnode=opnode, other=other, + context=context, + method_name=method_name) + + +def _bin_op(instance, opnode, op, other, context, reverse=False): + """Get an inference callable for a normal binary operation. + + If *reverse* is True, then the reflected method will be used instead. + """ + if reverse: + method_name = protocols.REFLECTED_BIN_OP_METHOD[op] + else: + method_name = protocols.BIN_OP_METHOD[op] + return functools.partial(_invoke_binop_inference, + instance=instance, + op=op, opnode=opnode, other=other, + context=context, + method_name=method_name) + + +def _get_binop_contexts(context, left, right): + """Get contexts for binary operations. + + This will return two inference contexts, the first one + for x.__op__(y), the other one for y.__rop__(x), where + only the arguments are inversed. + """ + # The order is important, since the first one should be + # left.__op__(right). + for arg in (right, left): + new_context = context.clone() + new_context.callcontext = contextmod.CallContext(args=[arg]) + new_context.boundnode = None + yield new_context + + +def _same_type(type1, type2): + """Check if type1 is the same as type2.""" + return type1.qname() == type2.qname() + + +def _get_binop_flow(left, left_type, binary_opnode, right, right_type, + context, reverse_context): + """Get the flow for binary operations. + + The rules are a bit messy: + + * if left and right have the same type, then only one + method will be called, left.__op__(right) + * if left and right are unrelated typewise, then first + left.__op__(right) is tried and if this does not exist + or returns NotImplemented, then right.__rop__(left) is tried. + * if left is a subtype of right, then only left.__op__(right) + is tried. + * if left is a supertype of right, then right.__rop__(left) + is first tried and then left.__op__(right) + """ + op = binary_opnode.op + if _same_type(left_type, right_type): + methods = [_bin_op(left, binary_opnode, op, right, context)] + elif helpers.is_subtype(left_type, right_type): + methods = [_bin_op(left, binary_opnode, op, right, context)] + elif helpers.is_supertype(left_type, right_type): + methods = [_bin_op(right, binary_opnode, op, left, reverse_context, reverse=True), + _bin_op(left, binary_opnode, op, right, context)] + else: + methods = [_bin_op(left, binary_opnode, op, right, context), + _bin_op(right, binary_opnode, op, left, reverse_context, reverse=True)] + return methods + + +def _get_aug_flow(left, left_type, aug_opnode, right, right_type, + context, reverse_context): + """Get the flow for augmented binary operations. + + The rules are a bit messy: + + * if left and right have the same type, then left.__augop__(right) + is first tried and then left.__op__(right). + * if left and right are unrelated typewise, then + left.__augop__(right) is tried, then left.__op__(right) + is tried and then right.__rop__(left) is tried. + * if left is a subtype of right, then left.__augop__(right) + is tried and then left.__op__(right). + * if left is a supertype of right, then left.__augop__(right) + is tried, then right.__rop__(left) and then + left.__op__(right) + """ + bin_op = aug_opnode.op.strip("=") + aug_op = aug_opnode.op + if _same_type(left_type, right_type): + methods = [_aug_op(left, aug_opnode, aug_op, right, context), + _bin_op(left, aug_opnode, bin_op, right, context)] + elif helpers.is_subtype(left_type, right_type): + methods = [_aug_op(left, aug_opnode, aug_op, right, context), + _bin_op(left, aug_opnode, bin_op, right, context)] + elif helpers.is_supertype(left_type, right_type): + methods = [_aug_op(left, aug_opnode, aug_op, right, context), + _bin_op(right, aug_opnode, bin_op, left, reverse_context, reverse=True), + _bin_op(left, aug_opnode, bin_op, right, context)] + else: + methods = [_aug_op(left, aug_opnode, aug_op, right, context), + _bin_op(left, aug_opnode, bin_op, right, context), + _bin_op(right, aug_opnode, bin_op, left, reverse_context, reverse=True)] + return methods + + +def _infer_binary_operation(left, right, binary_opnode, context, flow_factory): + """Infer a binary operation between a left operand and a right operand + + This is used by both normal binary operations and augmented binary + operations, the only difference is the flow factory used. + """ + + context, reverse_context = _get_binop_contexts(context, left, right) + left_type = helpers.object_type(left) + right_type = helpers.object_type(right) + methods = flow_factory(left, left_type, binary_opnode, right, right_type, + context, reverse_context) + for method in methods: + try: + results = list(method()) + except AttributeError: + continue + except exceptions.AttributeInferenceError: + continue + except exceptions.InferenceError: + yield util.Uninferable + return + else: + if any(result is util.Uninferable for result in results): + yield util.Uninferable + return + + if all(map(_is_not_implemented, results)): + continue + not_implemented = sum(1 for result in results + if _is_not_implemented(result)) + if not_implemented and not_implemented != len(results): + # Can't infer yet what this is. + yield util.Uninferable + return + + for result in results: + yield result + return + # The operation doesn't seem to be supported so let the caller know about it + yield util.BadBinaryOperationMessage(left_type, binary_opnode.op, right_type) + + +def _infer_binop(self, context): + """Binary operation inference logic.""" + if context is None: + context = contextmod.InferenceContext() + left = self.left + right = self.right + + # we use two separate contexts for evaluating lhs and rhs because + # 1. evaluating lhs may leave some undesired entries in context.path + # which may not let us infer right value of rhs + lhs_context = context.clone() + rhs_context = context.clone() + + for lhs in left.infer(context=lhs_context): + if lhs is util.Uninferable: + # Don't know how to process this. + yield util.Uninferable + return + + for rhs in right.infer(context=rhs_context): + if rhs is util.Uninferable: + # Don't know how to process this. + yield util.Uninferable + return + + try: + yield from _infer_binary_operation( + lhs, rhs, self, context, _get_binop_flow) + except exceptions._NonDeducibleTypeHierarchy: + yield util.Uninferable + + +@decorators.yes_if_nothing_inferred +@decorators.path_wrapper +def infer_binop(self, context=None): + return _filter_operation_errors(self, _infer_binop, context, + util.BadBinaryOperationMessage) + +nodes.BinOp._infer_binop = _infer_binop +nodes.BinOp._infer = infer_binop + + +def _infer_augassign(self, context=None): + """Inference logic for augmented binary operations.""" + if context is None: + context = contextmod.InferenceContext() + + for lhs in self.target.infer_lhs(context=context): + if lhs is util.Uninferable: + # Don't know how to process this. + yield util.Uninferable + return + + rhs_context = context.clone() + for rhs in self.value.infer(context=rhs_context): + if rhs is util.Uninferable: + # Don't know how to process this. + yield util.Uninferable + return + + try: + yield from _infer_binary_operation(lhs, rhs, self, context, _get_aug_flow) + except exceptions._NonDeducibleTypeHierarchy: + yield util.Uninferable + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_augassign(self, context=None): + return _filter_operation_errors(self, _infer_augassign, context, + util.BadBinaryOperationMessage) + +nodes.AugAssign._infer_augassign = _infer_augassign +nodes.AugAssign._infer = infer_augassign + +# End of binary operation inference. + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_arguments(self, context=None): + name = context.lookupname + if name is None: + raise exceptions.InferenceError(node=self, context=context) + return protocols._arguments_infer_argname(self, name, context) +nodes.Arguments._infer = infer_arguments + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_assign(self, context=None): + """infer a AssignName/AssignAttr: need to inspect the RHS part of the + assign node + """ + stmt = self.statement() + if isinstance(stmt, nodes.AugAssign): + return stmt.infer(context) + + stmts = list(self.assigned_stmts(context=context)) + return bases._infer_stmts(stmts, context) +nodes.AssignName._infer = infer_assign +nodes.AssignAttr._infer = infer_assign + + +# no infer method on DelName and DelAttr (expected InferenceError) + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_empty_node(self, context=None): + if not self.has_underlying_object(): + yield util.Uninferable + else: + try: + yield from MANAGER.infer_ast_from_something(self.object, context=context) + except exceptions.AstroidError: + yield util.Uninferable +nodes.EmptyNode._infer = infer_empty_node + + +@decorators.raise_if_nothing_inferred +@decorators.path_wrapper +def infer_index(self, context=None): + return self.value.infer(context) +nodes.Index._infer = infer_index + +# TODO: move directly into bases.Instance when the dependency hell +# will be solved. +def instance_getitem(self, index, context=None): + # Rewrap index to Const for this case + new_context = contextmod.bind_context_to_node(context, self) + if not context: + context = new_context + + # Create a new callcontext for providing index as an argument. + new_context.callcontext = contextmod.CallContext(args=[index]) + + method = next(self.igetattr('__getitem__', context=context), None) + if not isinstance(method, bases.BoundMethod): + raise exceptions.InferenceError( + 'Could not find __getitem__ for {node!r}.', + node=self, context=context) + + try: + return next(method.infer_call_result(self, new_context)) + except StopIteration as exc: + raise exceptions.InferenceError( + message='Inference for {node!r}[{index!s}] failed.', + node=self, + index=index, + context=context) from exc + +bases.Instance.getitem = instance_getitem + + +def _populate_context_lookup(call, context): + # Allows context to be saved for later + # for inference inside a function + context_lookup = {} + if context is None: + return context_lookup + for arg in call.args: + if isinstance(arg, nodes.Starred): + context_lookup[arg.value] = context + else: + context_lookup[arg] = context + keywords = call.keywords if call.keywords is not None else [] + for keyword in keywords: + context_lookup[keyword.value] = context + return context_lookup diff --git a/venv/Lib/site-packages/astroid/interpreter/__init__.py b/venv/Lib/site-packages/astroid/interpreter/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/astroid/interpreter/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/astroid/interpreter/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca7fba4b1202dd7ca390425874daaaf82ff68216 GIT binary patch literal 187 zcmZ?b<>g`kf;{8n(IEOUh=2h`Aj1KOi&=m~3PUi1CZpdI zJIl;$ z+*BJLNG1Bx|ByWL#LwVAERQ_#7y86GV<&DSy4E?fp3Aw-cfS30X~`$>WNUx@bgxOs zKltb3Ves+|h~5GflYqoDW+@G*9a+F&bW%2U0*8{=jcZRy;Kud10b?!p;wFss*pC-r zY{cv#X)T6-QbIOmX2K-XJe9*F;sdF;5=JHBD9MIg=ORkNl#hiO$yj%Me|MB_wP$G*2-xp>ggteyyHxucDb2AFf)B_k1>LNBCDgjBzLlN^yVn%k0InD*w zsWjSOIhF;F!i*0R@I98WJKUFrH3h~;;L;x%li%rf(;_Oys*}q|%8pdS?&r5xzvzC| zUH!5PnYHs{C`Q&!+7nr%aXU>8Mcc@>7NXnoH#FBpG`eNoV>m@_i;5+=QcVuYgpn!2 z6so3eO%-OB`LC;A$Nv{@pX{_~<%`FW$g%u7LTunu1F3^JAo>xgk{pmT`iu<8IXhv7 z9XMz1?_^*x^VEaYTI|H`bGk)N={Y@dOx>_Er(~sb&Q9rxTe|uO(>U;+fu*?ioc%^i z7m!omi2ynFLD%SZ4Mcwgsw6+(IH4t-JAOnc`Gv&<4$_?#tLmwY!c1$dOvERbnm;3`}enhUF~e$d)V8^^R3W?y$5Kcw=2eZFHiC| z0N6ko+oQELvHJMyK`+!s$t1oUlgtQ}1G0tc#TGaH>E(3t;}^}lLy?Kcxmtf8)4-fu z`s9<@j((E$$4YkYPUBwhT<+d&(V(tGR45IJG%wL!)lH}{yQadcP%fydnSgI2C1hTU zM$mHA(m=^^AE(3pR0Pe7BIwFZ6Nn$JZ^N9v0gBLNR;NCFlU<`O{228dg$tL^!dTGUCWsz@ zGH}y|9xxCG#09B=)CaXwrdCX&BqcosnwjnMV0PU!ugv-|yK5FMXBQ8aN(xY;2sKMm z&Xd0%Oq&RMVwfBO8@$>^9Pxr>(3$%W%{8IXv3~yKv>qB-B$9vVEHIkYmNU9Ly<8 z+vAfYO@W4x6AP7zxWm5(KWdU_af|QGP}X_P9qm~Y(B(skWNM_f6vElKW0zV?A>*qB zP&=*V3h2!u8M>ir%!~)_0|+gs?H0hfK@Ip?o66lvB2zgJg{j`??-xmG0Hjku2i`U| z1DLQk7yQ_8Bbc4?vNIXA$B8 zT70@V6^4jWAHwP-UJ&;PdyAJ9cqz#lIVUHq1SUB2)W?7oHot3wq+{{YV!#pesOpa}KgH^Vlr{C}*U!pf93OFE^^lEF6zsB<1| ziJ#A_an4(P9_A|%z6F-AMu>c~4Kj;xdER}v((Pv8-5txgNX7axOledu^_WK&9q+pLp11HHu~;!C literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/interpreter/__pycache__/objectmodel.cpython-37.pyc b/venv/Lib/site-packages/astroid/interpreter/__pycache__/objectmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ee38c15e9a8520fad0d6efa19d3891e27a73851 GIT binary patch literal 21999 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/interpreter/_import/__init__.py b/venv/Lib/site-packages/astroid/interpreter/_import/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/astroid/interpreter/_import/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/astroid/interpreter/_import/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb32b22dea2973afc453e4b875ae928dcaa1a142 GIT binary patch literal 195 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 PX1-j`6_4kS=12YqL{X&9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/interpreter/_import/__pycache__/util.cpython-37.pyc b/venv/Lib/site-packages/astroid/interpreter/_import/__pycache__/util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..572e2cef74ac0f6c9ccfad6f46fd6fff145bf5f5 GIT binary patch literal 413 zcmYjN$w~u35Urkx+02OO#Sic@hXi6yiip_=0nH_f8XJaYx=qGey6K*P0rBL|_$B_s zTs`>9ioFuS-8^{hSAV}QQ zhXm~7WC3@OIk&(a?!Lmp;babee z=d`cXh~baYP;&EsAHXoGZ!;s|J)%h IvO}8gH(jt~JOBUy literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/astroid/interpreter/_import/spec.py b/venv/Lib/site-packages/astroid/interpreter/_import/spec.py new file mode 100644 index 00000000..0fb492b2 --- /dev/null +++ b/venv/Lib/site-packages/astroid/interpreter/_import/spec.py @@ -0,0 +1,300 @@ +# Copyright (c) 2016-2018 Claudiu Popa +# Copyright (c) 2016 Derek Gustafson +# Copyright (c) 2017 Chris Philip +# Copyright (c) 2017 Hugo +# Copyright (c) 2017 ioanatia +# Copyright (c) 2017 Calen Pennington +# Copyright (c) 2018 Nick Drozd + +import abc +import collections +import enum +import imp +import os +import sys +import zipimport +try: + import importlib.machinery + _HAS_MACHINERY = True +except ImportError: + _HAS_MACHINERY = False + +try: + from functools import lru_cache +except ImportError: + from backports.functools_lru_cache import lru_cache + +from . import util + +ModuleType = enum.Enum('ModuleType', 'C_BUILTIN C_EXTENSION PKG_DIRECTORY ' + 'PY_CODERESOURCE PY_COMPILED PY_FROZEN PY_RESOURCE ' + 'PY_SOURCE PY_ZIPMODULE PY_NAMESPACE') +_ImpTypes = {imp.C_BUILTIN: ModuleType.C_BUILTIN, + imp.C_EXTENSION: ModuleType.C_EXTENSION, + imp.PKG_DIRECTORY: ModuleType.PKG_DIRECTORY, + imp.PY_COMPILED: ModuleType.PY_COMPILED, + imp.PY_FROZEN: ModuleType.PY_FROZEN, + imp.PY_SOURCE: ModuleType.PY_SOURCE, + } +if hasattr(imp, 'PY_RESOURCE'): + _ImpTypes[imp.PY_RESOURCE] = ModuleType.PY_RESOURCE +if hasattr(imp, 'PY_CODERESOURCE'): + _ImpTypes[imp.PY_CODERESOURCE] = ModuleType.PY_CODERESOURCE + +def _imp_type_to_module_type(imp_type): + return _ImpTypes[imp_type] + +_ModuleSpec = collections.namedtuple('_ModuleSpec', 'name type location ' + 'origin submodule_search_locations') + +class ModuleSpec(_ModuleSpec): + """Defines a class similar to PEP 420's ModuleSpec + + A module spec defines a name of a module, its type, location + and where submodules can be found, if the module is a package. + """ + + def __new__(cls, name, module_type, location=None, origin=None, + submodule_search_locations=None): + return _ModuleSpec.__new__(cls, name=name, type=module_type, + location=location, origin=origin, + submodule_search_locations=submodule_search_locations) + + +class Finder: + """A finder is a class which knows how to find a particular module.""" + + def __init__(self, path=None): + self._path = path or sys.path + + @abc.abstractmethod + def find_module(self, modname, module_parts, processed, submodule_path): + """Find the given module + + Each finder is responsible for each protocol of finding, as long as + they all return a ModuleSpec. + + :param str modname: The module which needs to be searched. + :param list module_parts: It should be a list of strings, + where each part contributes to the module's + namespace. + :param list processed: What parts from the module parts were processed + so far. + :param list submodule_path: A list of paths where the module + can be looked into. + :returns: A ModuleSpec, describing how and where the module was found, + None, otherwise. + """ + + def contribute_to_path(self, spec, processed): + """Get a list of extra paths where this finder can search.""" + + +class ImpFinder(Finder): + """A finder based on the imp module.""" + + def find_module(self, modname, module_parts, processed, submodule_path): + if submodule_path is not None: + submodule_path = list(submodule_path) + try: + stream, mp_filename, mp_desc = imp.find_module(modname, submodule_path) + except ImportError: + return None + + # Close resources. + if stream: + stream.close() + + return ModuleSpec(name=modname, location=mp_filename, + module_type=_imp_type_to_module_type(mp_desc[2])) + + def contribute_to_path(self, spec, processed): + if spec.location is None: + # Builtin. + return None + + if _is_setuptools_namespace(spec.location): + # extend_path is called, search sys.path for module/packages + # of this name see pkgutil.extend_path documentation + path = [os.path.join(p, *processed) for p in sys.path + if os.path.isdir(os.path.join(p, *processed))] + else: + path = [spec.location] + return path + + +class ExplicitNamespacePackageFinder(ImpFinder): + """A finder for the explicit namespace packages, generated through pkg_resources.""" + + def find_module(self, modname, module_parts, processed, submodule_path): + if processed: + modname = '.'.join(processed + [modname]) + if util.is_namespace(modname) and modname in sys.modules: + submodule_path = sys.modules[modname].__path__ + return ModuleSpec(name=modname, location='', + origin='namespace', + module_type=ModuleType.PY_NAMESPACE, + submodule_search_locations=submodule_path) + return None + + + def contribute_to_path(self, spec, processed): + return spec.submodule_search_locations + + +class ZipFinder(Finder): + """Finder that knows how to find a module inside zip files.""" + + def __init__(self, path): + super(ZipFinder, self).__init__(path) + self._zipimporters = _precache_zipimporters(path) + + def find_module(self, modname, module_parts, processed, submodule_path): + try: + file_type, filename, path = _search_zip(module_parts, self._zipimporters) + except ImportError: + return None + + return ModuleSpec(name=modname, location=filename, + origin='egg', module_type=file_type, + submodule_search_locations=path) + + +class PathSpecFinder(Finder): + """Finder based on importlib.machinery.PathFinder.""" + + def find_module(self, modname, module_parts, processed, submodule_path): + spec = importlib.machinery.PathFinder.find_spec(modname, path=submodule_path) + if spec: + # origin can be either a string on older Python versions + # or None in case it is a namespace package: + # https://github.com/python/cpython/pull/5481 + is_namespace_pkg = spec.origin in ('namespace', None) + location = spec.origin if not is_namespace_pkg else None + module_type = ModuleType.PY_NAMESPACE if is_namespace_pkg else None + spec = ModuleSpec(name=spec.name, location=location, + origin=spec.origin, module_type=module_type, + submodule_search_locations=list(spec.submodule_search_locations + or [])) + return spec + + def contribute_to_path(self, spec, processed): + if spec.type == ModuleType.PY_NAMESPACE: + return spec.submodule_search_locations + return None + + +_SPEC_FINDERS = ( + ImpFinder, + ZipFinder, +) +if _HAS_MACHINERY and sys.version_info[:2] >= (3, 4): + _SPEC_FINDERS += (PathSpecFinder, ) +_SPEC_FINDERS += (ExplicitNamespacePackageFinder, ) + + +def _is_setuptools_namespace(location): + try: + with open(os.path.join(location, '__init__.py'), 'rb') as stream: + data = stream.read(4096) + except IOError: + pass + else: + extend_path = b'pkgutil' in data and b'extend_path' in data + declare_namespace = ( + b"pkg_resources" in data + and b"declare_namespace(__name__)" in data) + return extend_path or declare_namespace + + +@lru_cache() +def _cached_set_diff(left, right): + result = set(left) + result.difference_update(right) + return result + + +def _precache_zipimporters(path=None): + pic = sys.path_importer_cache + + # When measured, despite having the same complexity (O(n)), + # converting to tuples and then caching the conversion to sets + # and the set difference is faster than converting to sets + # and then only caching the set difference. + + req_paths = tuple(path or sys.path) + cached_paths = tuple(pic) + new_paths = _cached_set_diff(req_paths, cached_paths) + for entry_path in new_paths: + try: + pic[entry_path] = zipimport.zipimporter(entry_path) + except zipimport.ZipImportError: + continue + return pic + + +def _search_zip(modpath, pic): + for filepath, importer in list(pic.items()): + if importer is not None: + found = importer.find_module(modpath[0]) + if found: + if not importer.find_module(os.path.sep.join(modpath)): + raise ImportError('No module named %s in %s/%s' % ( + '.'.join(modpath[1:]), filepath, modpath)) + #import code; code.interact(local=locals()) + return (ModuleType.PY_ZIPMODULE, + os.path.abspath(filepath) + os.path.sep + os.path.sep.join(modpath), + filepath) + raise ImportError('No module named %s' % '.'.join(modpath)) + + +def _find_spec_with_path(search_path, modname, module_parts, processed, submodule_path): + finders = [finder(search_path) for finder in _SPEC_FINDERS] + for finder in finders: + spec = finder.find_module(modname, module_parts, processed, submodule_path) + if spec is None: + continue + return finder, spec + + raise ImportError('No module named %s' % '.'.join(module_parts)) + + +def find_spec(modpath, path=None): + """Find a spec for the given module. + + :type modpath: list or tuple + :param modpath: + split module's name (i.e name of a module or package split + on '.'), with leading empty strings for explicit relative import + + :type path: list or None + :param path: + optional list of path where the module or package should be + searched (use sys.path if nothing or None is given) + + :rtype: ModuleSpec + :return: A module spec, which describes how the module was + found and where. + """ + _path = path or sys.path + + # Need a copy for not mutating the argument. + modpath = modpath[:] + + submodule_path = None + module_parts = modpath[:] + processed = [] + + while modpath: + modname = modpath.pop(0) + finder, spec = _find_spec_with_path(_path, modname, + module_parts, processed, + submodule_path or path) + processed.append(modname) + if modpath: + submodule_path = finder.contribute_to_path(spec, processed) + + if spec.type == ModuleType.PKG_DIRECTORY: + spec = spec._replace(submodule_search_locations=submodule_path) + + return spec diff --git a/venv/Lib/site-packages/astroid/interpreter/_import/util.py b/venv/Lib/site-packages/astroid/interpreter/_import/util.py new file mode 100644 index 00000000..30bfd399 --- /dev/null +++ b/venv/Lib/site-packages/astroid/interpreter/_import/util.py @@ -0,0 +1,11 @@ +# Copyright (c) 2016, 2018 Claudiu Popa + +try: + import pkg_resources +except ImportError: + pkg_resources = None + + +def is_namespace(modname): + return (pkg_resources is not None + and modname in pkg_resources._namespace_packages) diff --git a/venv/Lib/site-packages/astroid/interpreter/dunder_lookup.py b/venv/Lib/site-packages/astroid/interpreter/dunder_lookup.py new file mode 100644 index 00000000..625ec93b --- /dev/null +++ b/venv/Lib/site-packages/astroid/interpreter/dunder_lookup.py @@ -0,0 +1,81 @@ +# Copyright (c) 2016-2018 Claudiu Popa +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Contains logic for retrieving special methods. + +This implementation does not rely on the dot attribute access +logic, found in ``.getattr()``. The difference between these two +is that the dunder methods are looked with the type slots +(you can find more about these here +http://lucumr.pocoo.org/2014/8/16/the-python-i-would-like-to-see/) +As such, the lookup for the special methods is actually simpler than +the dot attribute access. +""" +import itertools + +import astroid +from astroid import exceptions + + +def _lookup_in_mro(node, name): + attrs = node.locals.get(name, []) + + nodes = itertools.chain.from_iterable( + ancestor.locals.get(name, []) + for ancestor in node.ancestors(recurs=True) + ) + values = list(itertools.chain(attrs, nodes)) + if not values: + raise exceptions.AttributeInferenceError( + attribute=name, + target=node + ) + + return values + + +def lookup(node, name): + """Lookup the given special method name in the given *node* + + If the special method was found, then a list of attributes + will be returned. Otherwise, `astroid.AttributeInferenceError` + is going to be raised. + """ + if isinstance(node, (astroid.List, + astroid.Tuple, + astroid.Const, + astroid.Dict, + astroid.Set)): + return _builtin_lookup(node, name) + if isinstance(node, astroid.Instance): + return _lookup_in_mro(node, name) + if isinstance(node, astroid.ClassDef): + return _class_lookup(node, name) + + raise exceptions.AttributeInferenceError( + attribute=name, + target=node + ) + + +def _class_lookup(node, name): + metaclass = node.metaclass() + if metaclass is None: + raise exceptions.AttributeInferenceError( + attribute=name, + target=node + ) + + return _lookup_in_mro(metaclass, name) + + +def _builtin_lookup(node, name): + values = node.locals.get(name, []) + if not values: + raise exceptions.AttributeInferenceError( + attribute=name, + target=node + ) + + return values diff --git a/venv/Lib/site-packages/astroid/interpreter/objectmodel.py b/venv/Lib/site-packages/astroid/interpreter/objectmodel.py new file mode 100644 index 00000000..bab2cf7c --- /dev/null +++ b/venv/Lib/site-packages/astroid/interpreter/objectmodel.py @@ -0,0 +1,650 @@ +# Copyright (c) 2016-2018 Claudiu Popa +# Copyright (c) 2016 Derek Gustafson +# Copyright (c) 2017-2018 Bryce Guinta +# Copyright (c) 2017 Ceridwen +# Copyright (c) 2017 Calen Pennington +# Copyright (c) 2018 Nick Drozd +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER +""" +Data object model, as per https://docs.python.org/3/reference/datamodel.html. + +This module describes, at least partially, a data object model for some +of astroid's nodes. The model contains special attributes that nodes such +as functions, classes, modules etc have, such as __doc__, __class__, +__module__ etc, being used when doing attribute lookups over nodes. + +For instance, inferring `obj.__class__` will first trigger an inference +of the `obj` variable. If it was successfully inferred, then an attribute +`__class__ will be looked for in the inferred object. This is the part +where the data model occurs. The model is attached to those nodes +and the lookup mechanism will try to see if attributes such as +`__class__` are defined by the model or not. If they are defined, +the model will be requested to return the corresponding value of that +attribute. Thus the model can be viewed as a special part of the lookup +mechanism. +""" + +import builtins +import itertools +import pprint +import os +import types +from functools import lru_cache + +import astroid +from astroid import context as contextmod +from astroid import exceptions +from astroid import node_classes + + +def _dunder_dict(instance, attributes): + obj = node_classes.Dict(parent=instance) + + # Convert the keys to node strings + keys = [node_classes.Const(value=value, parent=obj) + for value in list(attributes.keys())] + + # The original attribute has a list of elements for each key, + # but that is not useful for retrieving the special attribute's value. + # In this case, we're picking the last value from each list. + values = [elem[-1] for elem in attributes.values()] + + obj.postinit(list(zip(keys, values))) + return obj + + +class ObjectModel: + + def __init__(self): + self._instance = None + + def __repr__(self): + result = [] + cname = type(self).__name__ + string = '%(cname)s(%(fields)s)' + alignment = len(cname) + 1 + for field in sorted(self.attributes()): + width = 80 - len(field) - alignment + lines = pprint.pformat(field, indent=2, + width=width).splitlines(True) + + inner = [lines[0]] + for line in lines[1:]: + inner.append(' ' * alignment + line) + result.append(field) + + return string % {'cname': cname, + 'fields': (',\n' + ' ' * alignment).join(result)} + + def __call__(self, instance): + self._instance = instance + return self + + def __get__(self, instance, cls=None): + # ObjectModel needs to be a descriptor so that just doing + # `special_attributes = SomeObjectModel` should be enough in the body of a node. + # But at the same time, node.special_attributes should return an object + # which can be used for manipulating the special attributes. That's the reason + # we pass the instance through which it got accessed to ObjectModel.__call__, + # returning itself afterwards, so we can still have access to the + # underlying data model and to the instance for which it got accessed. + return self(instance) + + def __contains__(self, name): + return name in self.attributes() + + @lru_cache(maxsize=None) + def attributes(self): + """Get the attributes which are exported by this object model.""" + return [obj[2:] for obj in dir(self) if obj.startswith('py')] + + def lookup(self, name): + """Look up the given *name* in the current model + + It should return an AST or an interpreter object, + but if the name is not found, then an AttributeInferenceError will be raised. + """ + + if name in self.attributes(): + return getattr(self, "py" + name) + raise exceptions.AttributeInferenceError(target=self._instance, attribute=name) + + +class ModuleModel(ObjectModel): + + def _builtins(self): + builtins_ast_module = astroid.MANAGER.astroid_cache[builtins.__name__] + return builtins_ast_module.special_attributes.lookup('__dict__') + + @property + def pybuiltins(self): + return self._builtins() + + # __path__ is a standard attribute on *packages* not + # non-package modules. The only mention of it in the + # official 2.7 documentation I can find is in the + # tutorial. + + @property + def py__path__(self): + if not self._instance.package: + raise exceptions.AttributeInferenceError(target=self._instance, + attribute='__path__') + + path_objs = [ + node_classes.Const( + value=path if not path.endswith('__init__.py') else os.path.dirname(path), + parent=self._instance + ) + for path in self._instance.path + ] + + container = node_classes.List(parent=self._instance) + container.postinit(path_objs) + + return container + + @property + def py__name__(self): + return node_classes.Const(value=self._instance.name, + parent=self._instance) + + @property + def py__doc__(self): + return node_classes.Const(value=self._instance.doc, + parent=self._instance) + + @property + def py__file__(self): + return node_classes.Const(value=self._instance.file, + parent=self._instance) + + @property + def py__dict__(self): + return _dunder_dict(self._instance, self._instance.globals) + + # __package__ isn't mentioned anywhere outside a PEP: + # https://www.python.org/dev/peps/pep-0366/ + @property + def py__package__(self): + if not self._instance.package: + value = '' + else: + value = self._instance.name + + return node_classes.Const(value=value, parent=self._instance) + + # These are related to the Python 3 implementation of the + # import system, + # https://docs.python.org/3/reference/import.html#import-related-module-attributes + + @property + def py__spec__(self): + # No handling for now. + return node_classes.Unknown() + + @property + def py__loader__(self): + # No handling for now. + return node_classes.Unknown() + + @property + def py__cached__(self): + # No handling for now. + return node_classes.Unknown() + + +class FunctionModel(ObjectModel): + + @property + def py__name__(self): + return node_classes.Const(value=self._instance.name, + parent=self._instance) + + @property + def py__doc__(self): + return node_classes.Const(value=self._instance.doc, + parent=self._instance) + + @property + def py__qualname__(self): + return node_classes.Const(value=self._instance.qname(), + parent=self._instance) + + @property + def py__defaults__(self): + func = self._instance + if not func.args.defaults: + return node_classes.Const(value=None, parent=func) + + defaults_obj = node_classes.Tuple(parent=func) + defaults_obj.postinit(func.args.defaults) + return defaults_obj + + @property + def py__annotations__(self): + obj = node_classes.Dict(parent=self._instance) + + if not self._instance.returns: + returns = None + else: + returns = self._instance.returns + + args = self._instance.args + pair_annotations = itertools.chain( + zip(args.args or [], args.annotations), + zip(args.kwonlyargs, args.kwonlyargs_annotations) + ) + + annotations = { + arg.name: annotation + for (arg, annotation) in pair_annotations + if annotation + } + if args.varargannotation: + annotations[args.vararg] = args.varargannotation + if args.kwargannotation: + annotations[args.kwarg] = args.kwargannotation + if returns: + annotations['return'] = returns + + items = [(node_classes.Const(key, parent=obj), value) + for (key, value) in annotations.items()] + + obj.postinit(items) + return obj + + @property + def py__dict__(self): + return node_classes.Dict(parent=self._instance) + + py__globals__ = py__dict__ + + @property + def py__kwdefaults__(self): + + def _default_args(args, parent): + for arg in args.kwonlyargs: + try: + default = args.default_value(arg.name) + except exceptions.NoDefault: + continue + + name = node_classes.Const(arg.name, parent=parent) + yield name, default + + args = self._instance.args + obj = node_classes.Dict(parent=self._instance) + defaults = dict(_default_args(args, obj)) + + obj.postinit(list(defaults.items())) + return obj + + @property + def py__module__(self): + return node_classes.Const(self._instance.root().qname()) + + @property + def py__get__(self): + from astroid import bases + + func = self._instance + + class DescriptorBoundMethod(bases.BoundMethod): + """Bound method which knows how to understand calling descriptor binding.""" + + def implicit_parameters(self): + # Different than BoundMethod since the signature + # is different. + return 0 + + def infer_call_result(self, caller, context=None): + if len(caller.args) != 2: + raise exceptions.InferenceError( + "Invalid arguments for descriptor binding", + target=self, context=context) + + context = contextmod.copy_context(context) + cls = next(caller.args[0].infer(context=context)) + + if cls is astroid.Uninferable: + raise exceptions.InferenceError( + "Invalid class inferred", + target=self, context=context) + + # For some reason func is a Node that the below + # code is not expecting + if isinstance(func, bases.BoundMethod): + yield func + return + + # Rebuild the original value, but with the parent set as the + # class where it will be bound. + new_func = func.__class__(name=func.name, doc=func.doc, + lineno=func.lineno, col_offset=func.col_offset, + parent=cls) + # pylint: disable=no-member + new_func.postinit(func.args, func.body, + func.decorators, func.returns) + + # Build a proper bound method that points to our newly built function. + proxy = bases.UnboundMethod(new_func) + yield bases.BoundMethod(proxy=proxy, bound=cls) + + @property + def args(self): + """Overwrite the underlying args to match those of the underlying func + + Usually the underlying *func* is a function/method, as in: + + def test(self): + pass + + This has only the *self* parameter but when we access test.__get__ + we get a new object which has two parameters, *self* and *type*. + """ + nonlocal func + params = func.args.args.copy() + params.append(astroid.AssignName(name='type')) + arguments = astroid.Arguments(parent=func.args.parent,) + arguments.postinit( + args=params, + defaults=[], + kwonlyargs=[], + kw_defaults=[], + annotations=[], + ) + return arguments + + return DescriptorBoundMethod(proxy=self._instance, bound=self._instance) + + # These are here just for completion. + @property + def py__ne__(self): + return node_classes.Unknown() + + py__subclasshook__ = py__ne__ + py__str__ = py__ne__ + py__sizeof__ = py__ne__ + py__setattr__ = py__ne__ + py__repr__ = py__ne__ + py__reduce__ = py__ne__ + py__reduce_ex__ = py__ne__ + py__new__ = py__ne__ + py__lt__ = py__ne__ + py__eq__ = py__ne__ + py__gt__ = py__ne__ + py__format__ = py__ne__ + py__delattr__ = py__ne__ + py__getattribute__ = py__ne__ + py__hash__ = py__ne__ + py__init__ = py__ne__ + py__dir__ = py__ne__ + py__call__ = py__ne__ + py__class__ = py__ne__ + py__closure__ = py__ne__ + py__code__ = py__ne__ + + +class ClassModel(ObjectModel): + + @property + def py__module__(self): + return node_classes.Const(self._instance.root().qname()) + + @property + def py__name__(self): + return node_classes.Const(self._instance.name) + + @property + def py__qualname__(self): + return node_classes.Const(self._instance.qname()) + + @property + def py__doc__(self): + return node_classes.Const(self._instance.doc) + + @property + def py__mro__(self): + if not self._instance.newstyle: + raise exceptions.AttributeInferenceError(target=self._instance, + attribute='__mro__') + + mro = self._instance.mro() + obj = node_classes.Tuple(parent=self._instance) + obj.postinit(mro) + return obj + + @property + def pymro(self): + if not self._instance.newstyle: + raise exceptions.AttributeInferenceError(target=self._instance, + attribute='mro') + + from astroid import bases + + other_self = self + + # Cls.mro is a method and we need to return one in order to have a proper inference. + # The method we're returning is capable of inferring the underlying MRO though. + class MroBoundMethod(bases.BoundMethod): + def infer_call_result(self, caller, context=None): + yield other_self.py__mro__ + + implicit_metaclass = self._instance.implicit_metaclass() + mro_method = implicit_metaclass.locals['mro'][0] + return MroBoundMethod(proxy=mro_method, bound=implicit_metaclass) + + @property + def py__bases__(self): + obj = node_classes.Tuple() + context = contextmod.InferenceContext() + elts = list(self._instance._inferred_bases(context)) + obj.postinit(elts=elts) + return obj + + @property + def py__class__(self): + from astroid import helpers + return helpers.object_type(self._instance) + + @property + def py__subclasses__(self): + """Get the subclasses of the underlying class + + This looks only in the current module for retrieving the subclasses, + thus it might miss a couple of them. + """ + from astroid import bases + from astroid import scoped_nodes + + if not self._instance.newstyle: + raise exceptions.AttributeInferenceError(target=self._instance, + attribute='__subclasses__') + + qname = self._instance.qname() + root = self._instance.root() + classes = [cls for cls in root.nodes_of_class(scoped_nodes.ClassDef) + if cls != self._instance and cls.is_subtype_of(qname)] + + obj = node_classes.List(parent=self._instance) + obj.postinit(classes) + + class SubclassesBoundMethod(bases.BoundMethod): + def infer_call_result(self, caller, context=None): + yield obj + + implicit_metaclass = self._instance.implicit_metaclass() + subclasses_method = implicit_metaclass.locals['__subclasses__'][0] + return SubclassesBoundMethod(proxy=subclasses_method, + bound=implicit_metaclass) + + @property + def py__dict__(self): + return node_classes.Dict(parent=self._instance) + + +class SuperModel(ObjectModel): + + @property + def py__thisclass__(self): + return self._instance.mro_pointer + + @property + def py__self_class__(self): + return self._instance._self_class + + @property + def py__self__(self): + return self._instance.type + + @property + def py__class__(self): + return self._instance._proxied + + +class UnboundMethodModel(ObjectModel): + + @property + def py__class__(self): + from astroid import helpers + return helpers.object_type(self._instance) + + @property + def py__func__(self): + return self._instance._proxied + + @property + def py__self__(self): + return node_classes.Const(value=None, parent=self._instance) + + pyim_func = py__func__ + pyim_class = py__class__ + pyim_self = py__self__ + + +class BoundMethodModel(FunctionModel): + + @property + def py__func__(self): + return self._instance._proxied._proxied + + @property + def py__self__(self): + return self._instance.bound + + +class GeneratorModel(FunctionModel): + + def __new__(cls, *args, **kwargs): + # Append the values from the GeneratorType unto this object. + ret = super(GeneratorModel, cls).__new__(cls, *args, **kwargs) + generator = astroid.MANAGER.astroid_cache[builtins.__name__]['generator'] + for name, values in generator.locals.items(): + method = values[0] + patched = lambda cls, meth=method: meth + + setattr(type(ret), 'py' + name, property(patched)) + + return ret + + @property + def py__name__(self): + return node_classes.Const(value=self._instance.parent.name, + parent=self._instance) + + @property + def py__doc__(self): + return node_classes.Const(value=self._instance.parent.doc, + parent=self._instance) + + +class InstanceModel(ObjectModel): + + @property + def py__class__(self): + return self._instance._proxied + + @property + def py__module__(self): + return node_classes.Const(self._instance.root().qname()) + + @property + def py__doc__(self): + return node_classes.Const(self._instance.doc) + + @property + def py__dict__(self): + return _dunder_dict(self._instance, self._instance.instance_attrs) + + +class ExceptionInstanceModel(InstanceModel): + + @property + def pyargs(self): + message = node_classes.Const('') + args = node_classes.Tuple(parent=self._instance) + args.postinit((message, )) + return args + + @property + def py__traceback__(self): + builtins_ast_module = astroid.MANAGER.astroid_cache[builtins.__name__] + traceback_type = builtins_ast_module[types.TracebackType.__name__] + return traceback_type.instantiate_class() + + +class DictModel(ObjectModel): + + @property + def py__class__(self): + return self._instance._proxied + + def _generic_dict_attribute(self, obj, name): + """Generate a bound method that can infer the given *obj*.""" + + class DictMethodBoundMethod(astroid.BoundMethod): + def infer_call_result(self, caller, context=None): + yield obj + + meth = next(self._instance._proxied.igetattr(name)) + return DictMethodBoundMethod(proxy=meth, bound=self._instance) + + @property + def pyitems(self): + elems = [] + obj = node_classes.List(parent=self._instance) + for key, value in self._instance.items: + elem = node_classes.Tuple(parent=obj) + elem.postinit((key, value)) + elems.append(elem) + obj.postinit(elts=elems) + + from astroid import objects + obj = objects.DictItems(obj) + + return self._generic_dict_attribute(obj, 'items') + + @property + def pykeys(self): + keys = [key for (key, _) in self._instance.items] + obj = node_classes.List(parent=self._instance) + obj.postinit(elts=keys) + + from astroid import objects + obj = objects.DictKeys(obj) + + return self._generic_dict_attribute(obj, 'keys') + + @property + def pyvalues(self): + + values = [value for (_, value) in self._instance.items] + obj = node_classes.List(parent=self._instance) + obj.postinit(values) + + from astroid import objects + obj = objects.DictValues(obj) + + return self._generic_dict_attribute(obj, 'values') diff --git a/venv/Lib/site-packages/astroid/manager.py b/venv/Lib/site-packages/astroid/manager.py new file mode 100644 index 00000000..7c8fca5f --- /dev/null +++ b/venv/Lib/site-packages/astroid/manager.py @@ -0,0 +1,284 @@ +# Copyright (c) 2006-2011, 2013-2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2014-2018 Claudiu Popa +# Copyright (c) 2014 BioGeek +# Copyright (c) 2014 Google, Inc. +# Copyright (c) 2014 Eevee (Alex Munroe) +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2016 Derek Gustafson +# Copyright (c) 2017 Iva Miholic +# Copyright (c) 2018 Bryce Guinta +# Copyright (c) 2018 Nick Drozd + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""astroid manager: avoid multiple astroid build of a same module when +possible by providing a class responsible to get astroid representation +from various source and using a cache of built modules) +""" + +import os +import zipimport + +from astroid import exceptions +from astroid.interpreter._import import spec +from astroid import modutils +from astroid import transforms + + +def safe_repr(obj): + try: + return repr(obj) + except Exception: # pylint: disable=broad-except + return '???' + + +class AstroidManager: + """the astroid manager, responsible to build astroid from files + or modules. + + Use the Borg pattern. + """ + + name = 'astroid loader' + brain = {} + + def __init__(self): + self.__dict__ = AstroidManager.brain + if not self.__dict__: + # NOTE: cache entries are added by the [re]builder + self.astroid_cache = {} + self._mod_file_cache = {} + self._failed_import_hooks = [] + self.always_load_extensions = False + self.optimize_ast = False + self.extension_package_whitelist = set() + self._transform = transforms.TransformVisitor() + + # Export these APIs for convenience + self.register_transform = self._transform.register_transform + self.unregister_transform = self._transform.unregister_transform + self.max_inferable_values = 100 + + def visit_transforms(self, node): + """Visit the transforms and apply them to the given *node*.""" + return self._transform.visit(node) + + def ast_from_file(self, filepath, modname=None, fallback=True, source=False): + """given a module name, return the astroid object""" + try: + filepath = modutils.get_source_file(filepath, include_no_ext=True) + source = True + except modutils.NoSourceFile: + pass + if modname is None: + try: + modname = '.'.join(modutils.modpath_from_file(filepath)) + except ImportError: + modname = filepath + if modname in self.astroid_cache and self.astroid_cache[modname].file == filepath: + return self.astroid_cache[modname] + if source: + from astroid.builder import AstroidBuilder + return AstroidBuilder(self).file_build(filepath, modname) + if fallback and modname: + return self.ast_from_module_name(modname) + raise exceptions.AstroidBuildingError( + 'Unable to build an AST for {path}.', path=filepath) + + def _build_stub_module(self, modname): + from astroid.builder import AstroidBuilder + return AstroidBuilder(self).string_build('', modname) + + def _build_namespace_module(self, modname, path): + from astroid.builder import build_namespace_package_module + return build_namespace_package_module(modname, path) + + def _can_load_extension(self, modname): + if self.always_load_extensions: + return True + if modutils.is_standard_module(modname): + return True + parts = modname.split('.') + return any( + '.'.join(parts[:x]) in self.extension_package_whitelist + for x in range(1, len(parts) + 1)) + + def ast_from_module_name(self, modname, context_file=None): + """given a module name, return the astroid object""" + if modname in self.astroid_cache: + return self.astroid_cache[modname] + if modname == '__main__': + return self._build_stub_module(modname) + old_cwd = os.getcwd() + if context_file: + os.chdir(os.path.dirname(context_file)) + try: + found_spec = self.file_from_module_name(modname, context_file) + if found_spec.type == spec.ModuleType.PY_ZIPMODULE: + module = self.zip_import_data(found_spec.location) + if module is not None: + return module + + elif found_spec.type in (spec.ModuleType.C_BUILTIN, + spec.ModuleType.C_EXTENSION): + if (found_spec.type == spec.ModuleType.C_EXTENSION + and not self._can_load_extension(modname)): + return self._build_stub_module(modname) + try: + module = modutils.load_module_from_name(modname) + except Exception as ex: + raise exceptions.AstroidImportError( + 'Loading {modname} failed with:\n{error}', + modname=modname, path=found_spec.location) from ex + return self.ast_from_module(module, modname) + + elif found_spec.type == spec.ModuleType.PY_COMPILED: + raise exceptions.AstroidImportError( + "Unable to load compiled module {modname}.", + modname=modname, path=found_spec.location) + + elif found_spec.type == spec.ModuleType.PY_NAMESPACE: + return self._build_namespace_module(modname, + found_spec.submodule_search_locations) + + if found_spec.location is None: + raise exceptions.AstroidImportError( + "Can't find a file for module {modname}.", + modname=modname) + + return self.ast_from_file(found_spec.location, modname, fallback=False) + except exceptions.AstroidBuildingError as e: + for hook in self._failed_import_hooks: + try: + return hook(modname) + except exceptions.AstroidBuildingError: + pass + raise e + finally: + os.chdir(old_cwd) + + def zip_import_data(self, filepath): + if zipimport is None: + return None + from astroid.builder import AstroidBuilder + builder = AstroidBuilder(self) + for ext in ('.zip', '.egg'): + try: + eggpath, resource = filepath.rsplit(ext + os.path.sep, 1) + except ValueError: + continue + try: + importer = zipimport.zipimporter(eggpath + ext) + zmodname = resource.replace(os.path.sep, '.') + if importer.is_package(resource): + zmodname = zmodname + '.__init__' + module = builder.string_build(importer.get_source(resource), + zmodname, filepath) + return module + except Exception: # pylint: disable=broad-except + continue + return None + + def file_from_module_name(self, modname, contextfile): + try: + value = self._mod_file_cache[(modname, contextfile)] + except KeyError: + try: + value = modutils.file_info_from_modpath( + modname.split('.'), context_file=contextfile) + except ImportError as ex: + value = exceptions.AstroidImportError( + 'Failed to import module {modname} with error:\n{error}.', + modname=modname, error=ex) + self._mod_file_cache[(modname, contextfile)] = value + if isinstance(value, exceptions.AstroidBuildingError): + raise value + return value + + def ast_from_module(self, module, modname=None): + """given an imported module, return the astroid object""" + modname = modname or module.__name__ + if modname in self.astroid_cache: + return self.astroid_cache[modname] + try: + # some builtin modules don't have __file__ attribute + filepath = module.__file__ + if modutils.is_python_source(filepath): + return self.ast_from_file(filepath, modname) + except AttributeError: + pass + from astroid.builder import AstroidBuilder + return AstroidBuilder(self).module_build(module, modname) + + def ast_from_class(self, klass, modname=None): + """get astroid for the given class""" + if modname is None: + try: + modname = klass.__module__ + except AttributeError as exc: + raise exceptions.AstroidBuildingError( + 'Unable to get module for class {class_name}.', + cls=klass, class_repr=safe_repr(klass), modname=modname) from exc + modastroid = self.ast_from_module_name(modname) + return modastroid.getattr(klass.__name__)[0] # XXX + + def infer_ast_from_something(self, obj, context=None): + """infer astroid for the given class""" + if hasattr(obj, '__class__') and not isinstance(obj, type): + klass = obj.__class__ + else: + klass = obj + try: + modname = klass.__module__ + except AttributeError as exc: + raise exceptions.AstroidBuildingError( + 'Unable to get module for {class_repr}.', + cls=klass, class_repr=safe_repr(klass)) from exc + except Exception as exc: + raise exceptions.AstroidImportError( + 'Unexpected error while retrieving module for {class_repr}:\n' + '{error}', cls=klass, class_repr=safe_repr(klass)) from exc + try: + name = klass.__name__ + except AttributeError as exc: + raise exceptions.AstroidBuildingError( + 'Unable to get name for {class_repr}:\n', + cls=klass, class_repr=safe_repr(klass)) from exc + except Exception as exc: + raise exceptions.AstroidImportError( + 'Unexpected error while retrieving name for {class_repr}:\n' + '{error}', cls=klass, class_repr=safe_repr(klass)) from exc + # take care, on living object __module__ is regularly wrong :( + modastroid = self.ast_from_module_name(modname) + if klass is obj: + for inferred in modastroid.igetattr(name, context): + yield inferred + else: + for inferred in modastroid.igetattr(name, context): + yield inferred.instantiate_class() + + def register_failed_import_hook(self, hook): + """Registers a hook to resolve imports that cannot be found otherwise. + + `hook` must be a function that accepts a single argument `modname` which + contains the name of the module or package that could not be imported. + If `hook` can resolve the import, must return a node of type `astroid.Module`, + otherwise, it must raise `AstroidBuildingError`. + """ + self._failed_import_hooks.append(hook) + + def cache_module(self, module): + """Cache a module if no module with the same name is known yet.""" + self.astroid_cache.setdefault(module.name, module) + + def clear_cache(self, astroid_builtin=None): + # XXX clear transforms + self.astroid_cache.clear() + # force bootstrap again, else we may ends up with cache inconsistency + # between the manager and CONST_PROXY, making + # unittest_lookup.LookupTC.test_builtin_lookup fail depending on the + # test order + import astroid.raw_building + astroid.raw_building._astroid_bootstrapping( + astroid_builtin=astroid_builtin) diff --git a/venv/Lib/site-packages/astroid/mixins.py b/venv/Lib/site-packages/astroid/mixins.py new file mode 100644 index 00000000..c199f61a --- /dev/null +++ b/venv/Lib/site-packages/astroid/mixins.py @@ -0,0 +1,156 @@ +# Copyright (c) 2010-2011, 2013-2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2014-2016, 2018 Claudiu Popa +# Copyright (c) 2014 Google, Inc. +# Copyright (c) 2014 Eevee (Alex Munroe) +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2015 Florian Bruhin +# Copyright (c) 2016 Jakub Wilk +# Copyright (c) 2018 Nick Drozd + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""This module contains some mixins for the different nodes. +""" + +from astroid import decorators +from astroid import exceptions + + +class BlockRangeMixIn: + """override block range """ + + @decorators.cachedproperty + def blockstart_tolineno(self): + return self.lineno + + def _elsed_block_range(self, lineno, orelse, last=None): + """handle block line numbers range for try/finally, for, if and while + statements + """ + if lineno == self.fromlineno: + return lineno, lineno + if orelse: + if lineno >= orelse[0].fromlineno: + return lineno, orelse[-1].tolineno + return lineno, orelse[0].fromlineno - 1 + return lineno, last or self.tolineno + + +class FilterStmtsMixin: + """Mixin for statement filtering and assignment type""" + + def _get_filtered_stmts(self, _, node, _stmts, mystmt): + """method used in _filter_stmts to get statements and trigger break""" + if self.statement() is mystmt: + # original node's statement is the assignment, only keep + # current node (gen exp, list comp) + return [node], True + return _stmts, False + + def assign_type(self): + return self + + +class AssignTypeMixin: + + def assign_type(self): + return self + + def _get_filtered_stmts(self, lookup_node, node, _stmts, mystmt): + """method used in filter_stmts""" + if self is mystmt: + return _stmts, True + if self.statement() is mystmt: + # original node's statement is the assignment, only keep + # current node (gen exp, list comp) + return [node], True + return _stmts, False + + +class ParentAssignTypeMixin(AssignTypeMixin): + + def assign_type(self): + return self.parent.assign_type() + + +class ImportFromMixin(FilterStmtsMixin): + """MixIn for From and Import Nodes""" + + def _infer_name(self, frame, name): + return name + + def do_import_module(self, modname=None): + """return the ast for a module whose name is imported by + """ + # handle special case where we are on a package node importing a module + # using the same name as the package, which may end in an infinite loop + # on relative imports + # XXX: no more needed ? + mymodule = self.root() + level = getattr(self, 'level', None) # Import as no level + if modname is None: + modname = self.modname + # XXX we should investigate deeper if we really want to check + # importing itself: modname and mymodule.name be relative or absolute + if mymodule.relative_to_absolute_name(modname, level) == mymodule.name: + # FIXME: we used to raise InferenceError here, but why ? + return mymodule + + return mymodule.import_module(modname, level=level, + relative_only=level and level >= 1) + + def real_name(self, asname): + """get name from 'as' name""" + for name, _asname in self.names: + if name == '*': + return asname + if not _asname: + name = name.split('.', 1)[0] + _asname = name + if asname == _asname: + return name + raise exceptions.AttributeInferenceError( + 'Could not find original name for {attribute} in {target!r}', + target=self, attribute=asname) + + +class MultiLineBlockMixin: + """Mixin for nodes with multi-line blocks, e.g. For and FunctionDef. + Note that this does not apply to every node with a `body` field. + For instance, an If node has a multi-line body, but the body of an + IfExpr is not multi-line, and hence cannot contain Return nodes, + Assign nodes, etc. + """ + + @decorators.cachedproperty + def _multi_line_blocks(self): + return tuple( + getattr(self, field) + for field in self._multi_line_block_fields + ) + + def _get_return_nodes_skip_functions(self): + for block in self._multi_line_blocks: + for child_node in block: + if child_node.is_function: + continue + yield from child_node._get_return_nodes_skip_functions() + + def _get_yield_nodes_skip_lambdas(self): + for block in self._multi_line_blocks: + for child_node in block: + if child_node.is_lambda: + continue + yield from child_node._get_yield_nodes_skip_lambdas() + + def _get_assign_nodes(self): + for block in self._multi_line_blocks: + for child_node in block: + yield from child_node._get_assign_nodes() + + +class NoChildrenMixin: + """Mixin for nodes with no children, e.g. Pass.""" + def get_children(self): + yield from () diff --git a/venv/Lib/site-packages/astroid/modutils.py b/venv/Lib/site-packages/astroid/modutils.py new file mode 100644 index 00000000..90ea31c7 --- /dev/null +++ b/venv/Lib/site-packages/astroid/modutils.py @@ -0,0 +1,691 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2014-2018 Claudiu Popa +# Copyright (c) 2014 Google, Inc. +# Copyright (c) 2014 Denis Laxalde +# Copyright (c) 2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2014 Eevee (Alex Munroe) +# Copyright (c) 2015 Florian Bruhin +# Copyright (c) 2015 Radosław Ganczarek +# Copyright (c) 2016 Derek Gustafson +# Copyright (c) 2016 Jakub Wilk +# Copyright (c) 2016 Ceridwen +# Copyright (c) 2018 Mario Corchero +# Copyright (c) 2018 Mario Corchero +# Copyright (c) 2018 Anthony Sottile + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Python modules manipulation utility functions. + +:type PY_SOURCE_EXTS: tuple(str) +:var PY_SOURCE_EXTS: list of possible python source file extension + +:type STD_LIB_DIRS: set of str +:var STD_LIB_DIRS: directories where standard modules are located + +:type BUILTIN_MODULES: dict +:var BUILTIN_MODULES: dictionary with builtin module names has key +""" +import imp +import os +import platform +import sys +import itertools +from distutils.sysconfig import get_python_lib # pylint: disable=import-error +# pylint: disable=import-error, no-name-in-module +from distutils.errors import DistutilsPlatformError +# distutils is replaced by virtualenv with a module that does +# weird path manipulations in order to get to the +# real distutils module. + +from .interpreter._import import spec +from .interpreter._import import util + +if sys.platform.startswith('win'): + PY_SOURCE_EXTS = ('py', 'pyw') + PY_COMPILED_EXTS = ('dll', 'pyd') +else: + PY_SOURCE_EXTS = ('py',) + PY_COMPILED_EXTS = ('so',) + + +try: + # The explicit sys.prefix is to work around a patch in virtualenv that + # replaces the 'real' sys.prefix (i.e. the location of the binary) + # with the prefix from which the virtualenv was created. This throws + # off the detection logic for standard library modules, thus the + # workaround. + STD_LIB_DIRS = { + get_python_lib(standard_lib=True, prefix=sys.prefix), + # Take care of installations where exec_prefix != prefix. + get_python_lib(standard_lib=True, prefix=sys.exec_prefix), + get_python_lib(standard_lib=True)} +# get_python_lib(standard_lib=1) is not available on pypy, set STD_LIB_DIR to +# non-valid path, see https://bugs.pypy.org/issue1164 +except DistutilsPlatformError: + STD_LIB_DIRS = set() + +if os.name == 'nt': + STD_LIB_DIRS.add(os.path.join(sys.prefix, 'dlls')) + try: + # real_prefix is defined when running inside virtual environments, + # created with the **virtualenv** library. + STD_LIB_DIRS.add(os.path.join(sys.real_prefix, 'dlls')) + except AttributeError: + # sys.base_exec_prefix is always defined, but in a virtual environment + # created with the stdlib **venv** module, it points to the original + # installation, if the virtual env is activated. + try: + STD_LIB_DIRS.add(os.path.join(sys.base_exec_prefix, 'dlls')) + except AttributeError: + pass + +if platform.python_implementation() == 'PyPy': + _root = os.path.join(sys.prefix, 'lib_pypy') + STD_LIB_DIRS.add(_root) + try: + # real_prefix is defined when running inside virtualenv. + STD_LIB_DIRS.add(os.path.join(sys.real_prefix, 'lib_pypy')) + except AttributeError: + pass + del _root +if os.name == 'posix': + # Need the real prefix is we're under a virtualenv, otherwise + # the usual one will do. + try: + prefix = sys.real_prefix + except AttributeError: + prefix = sys.prefix + + def _posix_path(path): + base_python = 'python%d.%d' % sys.version_info[:2] + return os.path.join(prefix, path, base_python) + + STD_LIB_DIRS.add(_posix_path('lib')) + if sys.maxsize > 2**32: + # This tries to fix a problem with /usr/lib64 builds, + # where systems are running both 32-bit and 64-bit code + # on the same machine, which reflects into the places where + # standard library could be found. More details can be found + # here http://bugs.python.org/issue1294959. + # An easy reproducing case would be + # https://github.com/PyCQA/pylint/issues/712#issuecomment-163178753 + STD_LIB_DIRS.add(_posix_path('lib64')) + +EXT_LIB_DIR = get_python_lib() +IS_JYTHON = platform.python_implementation() == 'Jython' +BUILTIN_MODULES = dict.fromkeys(sys.builtin_module_names, True) + + +class NoSourceFile(Exception): + """exception raised when we are not able to get a python + source file for a precompiled file + """ + +def _normalize_path(path): + return os.path.normcase(os.path.abspath(path)) + + +def _canonicalize_path(path): + return os.path.realpath(os.path.expanduser(path)) + + +def _path_from_filename(filename, is_jython=IS_JYTHON): + if not is_jython: + if sys.version_info > (3, 0): + return filename + if filename.endswith(".pyc"): + return filename[:-1] + return filename + head, has_pyclass, _ = filename.partition("$py.class") + if has_pyclass: + return head + ".py" + return filename + + +def _handle_blacklist(blacklist, dirnames, filenames): + """remove files/directories in the black list + + dirnames/filenames are usually from os.walk + """ + for norecurs in blacklist: + if norecurs in dirnames: + dirnames.remove(norecurs) + elif norecurs in filenames: + filenames.remove(norecurs) + + +_NORM_PATH_CACHE = {} + +def _cache_normalize_path(path): + """abspath with caching""" + # _module_file calls abspath on every path in sys.path every time it's + # called; on a larger codebase this easily adds up to half a second just + # assembling path components. This cache alleviates that. + try: + return _NORM_PATH_CACHE[path] + except KeyError: + if not path: # don't cache result for '' + return _normalize_path(path) + result = _NORM_PATH_CACHE[path] = _normalize_path(path) + return result + +def load_module_from_name(dotted_name, path=None, use_sys=True): + """Load a Python module from its name. + + :type dotted_name: str + :param dotted_name: python name of a module or package + + :type path: list or None + :param path: + optional list of path where the module or package should be + searched (use sys.path if nothing or None is given) + + :type use_sys: bool + :param use_sys: + boolean indicating whether the sys.modules dictionary should be + used or not + + + :raise ImportError: if the module or package is not found + + :rtype: module + :return: the loaded module + """ + return load_module_from_modpath(dotted_name.split('.'), path, use_sys) + + +def load_module_from_modpath(parts, path=None, use_sys=1): + """Load a python module from its split name. + + :type parts: list(str) or tuple(str) + :param parts: + python name of a module or package split on '.' + + :type path: list or None + :param path: + optional list of path where the module or package should be + searched (use sys.path if nothing or None is given) + + :type use_sys: bool + :param use_sys: + boolean indicating whether the sys.modules dictionary should be used or not + + :raise ImportError: if the module or package is not found + + :rtype: module + :return: the loaded module + """ + if use_sys: + try: + return sys.modules['.'.join(parts)] + except KeyError: + pass + modpath = [] + prevmodule = None + for part in parts: + modpath.append(part) + curname = '.'.join(modpath) + module = None + if len(modpath) != len(parts): + # even with use_sys=False, should try to get outer packages from sys.modules + module = sys.modules.get(curname) + elif use_sys: + # because it may have been indirectly loaded through a parent + module = sys.modules.get(curname) + if module is None: + mp_file, mp_filename, mp_desc = imp.find_module(part, path) + module = imp.load_module(curname, mp_file, mp_filename, mp_desc) + # mp_file still needs to be closed. + if mp_file: + mp_file.close() + if prevmodule: + setattr(prevmodule, part, module) + _file = getattr(module, '__file__', '') + prevmodule = module + if not _file and util.is_namespace(curname): + continue + if not _file and len(modpath) != len(parts): + raise ImportError('no module in %s' % '.'.join(parts[len(modpath):])) + path = [os.path.dirname(_file)] + return module + + +def load_module_from_file(filepath, path=None, use_sys=True, extrapath=None): + """Load a Python module from it's path. + + :type filepath: str + :param filepath: path to the python module or package + + :type path: list or None + :param path: + optional list of path where the module or package should be + searched (use sys.path if nothing or None is given) + + :type use_sys: bool + :param use_sys: + boolean indicating whether the sys.modules dictionary should be + used or not + + + :raise ImportError: if the module or package is not found + + :rtype: module + :return: the loaded module + """ + modpath = modpath_from_file(filepath, extrapath) + return load_module_from_modpath(modpath, path, use_sys) + + +def check_modpath_has_init(path, mod_path): + """check there are some __init__.py all along the way""" + modpath = [] + for part in mod_path: + modpath.append(part) + path = os.path.join(path, part) + if not _has_init(path): + old_namespace = util.is_namespace('.'.join(modpath)) + if not old_namespace: + return False + return True + + +def _get_relative_base_path(filename, path_to_check): + """Extracts the relative mod path of the file to import from + + Check if a file is within the passed in path and if so, returns the + relative mod path from the one passed in. + + If the filename is no in path_to_check, returns None + + Note this function will look for both abs and realpath of the file, + this allows to find the relative base path even if the file is a + symlink of a file in the passed in path + + Examples: + _get_relative_base_path("/a/b/c/d.py", "/a/b") -> ["c","d"] + _get_relative_base_path("/a/b/c/d.py", "/dev") -> None + """ + importable_path = None + path_to_check = os.path.normcase(path_to_check) + abs_filename = os.path.abspath(filename) + if os.path.normcase(abs_filename).startswith(path_to_check): + importable_path = abs_filename + + real_filename = os.path.realpath(filename) + if os.path.normcase(real_filename).startswith(path_to_check): + importable_path = real_filename + + if importable_path: + base_path = os.path.splitext(importable_path)[0] + relative_base_path = base_path[len(path_to_check):] + return [pkg for pkg in relative_base_path.split(os.sep) if pkg] + + return None + + +def modpath_from_file_with_callback(filename, extrapath=None, is_package_cb=None): + filename = os.path.expanduser(_path_from_filename(filename)) + + if extrapath is not None: + for path_ in itertools.chain(map(_canonicalize_path, extrapath), + extrapath): + path = os.path.abspath(path_) + if not path: + continue + submodpath = _get_relative_base_path(filename, path) + if not submodpath: + continue + if is_package_cb(path, submodpath[:-1]): + return extrapath[path_].split('.') + submodpath + + for path in itertools.chain(map(_canonicalize_path, sys.path), sys.path): + path = _cache_normalize_path(path) + if not path: + continue + modpath = _get_relative_base_path(filename, path) + if not modpath: + continue + if is_package_cb(path, modpath[:-1]): + return modpath + + raise ImportError('Unable to find module for %s in %s' % ( + filename, ', \n'.join(sys.path))) + + + +def modpath_from_file(filename, extrapath=None): + """given a file path return the corresponding split module's name + (i.e name of a module or package split on '.') + + :type filename: str + :param filename: file's path for which we want the module's name + + :type extrapath: dict + :param extrapath: + optional extra search path, with path as key and package name for the path + as value. This is usually useful to handle package split in multiple + directories using __path__ trick. + + + :raise ImportError: + if the corresponding module's name has not been found + + :rtype: list(str) + :return: the corresponding split module's name + """ + return modpath_from_file_with_callback(filename, extrapath, check_modpath_has_init) + + +def file_from_modpath(modpath, path=None, context_file=None): + return file_info_from_modpath(modpath, path, context_file).location + +def file_info_from_modpath(modpath, path=None, context_file=None): + """given a mod path (i.e. split module / package name), return the + corresponding file, giving priority to source file over precompiled + file if it exists + + :type modpath: list or tuple + :param modpath: + split module's name (i.e name of a module or package split + on '.') + (this means explicit relative imports that start with dots have + empty strings in this list!) + + :type path: list or None + :param path: + optional list of path where the module or package should be + searched (use sys.path if nothing or None is given) + + :type context_file: str or None + :param context_file: + context file to consider, necessary if the identifier has been + introduced using a relative import unresolvable in the actual + context (i.e. modutils) + + :raise ImportError: if there is no such module in the directory + + :rtype: (str or None, import type) + :return: + the path to the module's file or None if it's an integrated + builtin module such as 'sys' + """ + if context_file is not None: + context = os.path.dirname(context_file) + else: + context = context_file + if modpath[0] == 'xml': + # handle _xmlplus + try: + return _spec_from_modpath(['_xmlplus'] + modpath[1:], path, context) + except ImportError: + return _spec_from_modpath(modpath, path, context) + elif modpath == ['os', 'path']: + # FIXME: currently ignoring search_path... + return spec.ModuleSpec(name='os.path', location=os.path.__file__, module_type=imp.PY_SOURCE) + return _spec_from_modpath(modpath, path, context) + + +def get_module_part(dotted_name, context_file=None): + """given a dotted name return the module part of the name : + + >>> get_module_part('astroid.as_string.dump') + 'astroid.as_string' + + :type dotted_name: str + :param dotted_name: full name of the identifier we are interested in + + :type context_file: str or None + :param context_file: + context file to consider, necessary if the identifier has been + introduced using a relative import unresolvable in the actual + context (i.e. modutils) + + + :raise ImportError: if there is no such module in the directory + + :rtype: str or None + :return: + the module part of the name or None if we have not been able at + all to import the given name + + XXX: deprecated, since it doesn't handle package precedence over module + (see #10066) + """ + # os.path trick + if dotted_name.startswith('os.path'): + return 'os.path' + parts = dotted_name.split('.') + if context_file is not None: + # first check for builtin module which won't be considered latter + # in that case (path != None) + if parts[0] in BUILTIN_MODULES: + if len(parts) > 2: + raise ImportError(dotted_name) + return parts[0] + # don't use += or insert, we want a new list to be created ! + path = None + starti = 0 + if parts[0] == '': + assert context_file is not None, \ + 'explicit relative import, but no context_file?' + path = [] # prevent resolving the import non-relatively + starti = 1 + while parts[starti] == '': # for all further dots: change context + starti += 1 + context_file = os.path.dirname(context_file) + for i in range(starti, len(parts)): + try: + file_from_modpath(parts[starti:i+1], path=path, + context_file=context_file) + except ImportError: + if i < max(1, len(parts) - 2): + raise + return '.'.join(parts[:i]) + return dotted_name + + +def get_module_files(src_directory, blacklist, list_all=False): + """given a package directory return a list of all available python + module's files in the package and its subpackages + + :type src_directory: str + :param src_directory: + path of the directory corresponding to the package + + :type blacklist: list or tuple + :param blacklist: iterable + list of files or directories to ignore. + + :type list_all: bool + :param list_all: + get files from all paths, including ones without __init__.py + + :rtype: list + :return: + the list of all available python module's files in the package and + its subpackages + """ + files = [] + for directory, dirnames, filenames in os.walk(src_directory): + if directory in blacklist: + continue + _handle_blacklist(blacklist, dirnames, filenames) + # check for __init__.py + if not list_all and '__init__.py' not in filenames: + dirnames[:] = () + continue + for filename in filenames: + if _is_python_file(filename): + src = os.path.join(directory, filename) + files.append(src) + return files + + +def get_source_file(filename, include_no_ext=False): + """given a python module's file name return the matching source file + name (the filename will be returned identically if it's already an + absolute path to a python source file...) + + :type filename: str + :param filename: python module's file name + + + :raise NoSourceFile: if no source file exists on the file system + + :rtype: str + :return: the absolute path of the source file if it exists + """ + filename = os.path.abspath(_path_from_filename(filename)) + base, orig_ext = os.path.splitext(filename) + for ext in PY_SOURCE_EXTS: + source_path = '%s.%s' % (base, ext) + if os.path.exists(source_path): + return source_path + if include_no_ext and not orig_ext and os.path.exists(base): + return base + raise NoSourceFile(filename) + + +def is_python_source(filename): + """ + rtype: bool + return: True if the filename is a python source file + """ + return os.path.splitext(filename)[1][1:] in PY_SOURCE_EXTS + + +def is_standard_module(modname, std_path=None): + """try to guess if a module is a standard python module (by default, + see `std_path` parameter's description) + + :type modname: str + :param modname: name of the module we are interested in + + :type std_path: list(str) or tuple(str) + :param std_path: list of path considered has standard + + + :rtype: bool + :return: + true if the module: + - is located on the path listed in one of the directory in `std_path` + - is a built-in module + """ + modname = modname.split('.')[0] + try: + filename = file_from_modpath([modname]) + except ImportError: + # import failed, i'm probably not so wrong by supposing it's + # not standard... + return False + # modules which are not living in a file are considered standard + # (sys and __builtin__ for instance) + if filename is None: + # we assume there are no namespaces in stdlib + return not util.is_namespace(modname) + filename = _normalize_path(filename) + if filename.startswith(_cache_normalize_path(EXT_LIB_DIR)): + return False + if std_path is None: + std_path = STD_LIB_DIRS + for path in std_path: + if filename.startswith(_cache_normalize_path(path)): + return True + return False + + + +def is_relative(modname, from_file): + """return true if the given module name is relative to the given + file name + + :type modname: str + :param modname: name of the module we are interested in + + :type from_file: str + :param from_file: + path of the module from which modname has been imported + + :rtype: bool + :return: + true if the module has been imported relatively to `from_file` + """ + if not os.path.isdir(from_file): + from_file = os.path.dirname(from_file) + if from_file in sys.path: + return False + try: + stream, _, _ = imp.find_module(modname.split('.')[0], [from_file]) + + # Close the stream to avoid ResourceWarnings. + if stream: + stream.close() + return True + except ImportError: + return False + + +# internal only functions ##################################################### + +def _spec_from_modpath(modpath, path=None, context=None): + """given a mod path (i.e. split module / package name), return the + corresponding spec + + this function is used internally, see `file_from_modpath`'s + documentation for more information + """ + assert modpath + location = None + if context is not None: + try: + found_spec = spec.find_spec(modpath, [context]) + location = found_spec.location + except ImportError: + found_spec = spec.find_spec(modpath, path) + location = found_spec.location + else: + found_spec = spec.find_spec(modpath, path) + if found_spec.type == spec.ModuleType.PY_COMPILED: + try: + location = get_source_file(found_spec.location) + return found_spec._replace(location=location, type=spec.ModuleType.PY_SOURCE) + except NoSourceFile: + return found_spec._replace(location=location) + elif found_spec.type == spec.ModuleType.C_BUILTIN: + # integrated builtin module + return found_spec._replace(location=None) + elif found_spec.type == spec.ModuleType.PKG_DIRECTORY: + location = _has_init(found_spec.location) + return found_spec._replace(location=location, type=spec.ModuleType.PY_SOURCE) + return found_spec + + +def _is_python_file(filename): + """return true if the given filename should be considered as a python file + + .pyc and .pyo are ignored + """ + for ext in ('.py', '.so', '.pyd', '.pyw'): + if filename.endswith(ext): + return True + return False + + +def _has_init(directory): + """if the given directory has a valid __init__ file, return its path, + else return None + """ + mod_or_pack = os.path.join(directory, '__init__') + for ext in PY_SOURCE_EXTS + ('pyc', 'pyo'): + if os.path.exists(mod_or_pack + '.' + ext): + return mod_or_pack + '.' + ext + return None + + +def is_namespace(specobj): + return specobj.type == spec.ModuleType.PY_NAMESPACE + +def is_directory(specobj): + return specobj.type == spec.ModuleType.PKG_DIRECTORY diff --git a/venv/Lib/site-packages/astroid/node_classes.py b/venv/Lib/site-packages/astroid/node_classes.py new file mode 100644 index 00000000..ba0f301b --- /dev/null +++ b/venv/Lib/site-packages/astroid/node_classes.py @@ -0,0 +1,4537 @@ +# -*- coding: utf-8 -*- +# pylint: disable=too-many-lines; https://github.com/PyCQA/astroid/issues/465 +# Copyright (c) 2009-2011, 2013-2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2010 Daniel Harding +# Copyright (c) 2012 FELD Boris +# Copyright (c) 2013-2014 Google, Inc. +# Copyright (c) 2014-2018 Claudiu Popa +# Copyright (c) 2014 Eevee (Alex Munroe) +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2015 Florian Bruhin +# Copyright (c) 2016-2017 Derek Gustafson +# Copyright (c) 2016 Jared Garst +# Copyright (c) 2016 Jakub Wilk +# Copyright (c) 2016 Dave Baum +# Copyright (c) 2017-2018 Ashley Whetter +# Copyright (c) 2017 Łukasz Rogalski +# Copyright (c) 2017 rr- +# Copyright (c) 2018 Bryce Guinta +# Copyright (c) 2018 brendanator +# Copyright (c) 2018 Nick Drozd +# Copyright (c) 2018 HoverHell + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Module for some node classes. More nodes in scoped_nodes.py +""" + +import abc +import builtins as builtins_mod +import itertools +import pprint +from functools import lru_cache +from functools import singledispatch as _singledispatch + +from astroid import as_string +from astroid import bases +from astroid import context as contextmod +from astroid import decorators +from astroid import exceptions +from astroid import manager +from astroid import mixins +from astroid import util + + +BUILTINS = builtins_mod.__name__ +MANAGER = manager.AstroidManager() + + +@decorators.raise_if_nothing_inferred +def unpack_infer(stmt, context=None): + """recursively generate nodes inferred by the given statement. + If the inferred value is a list or a tuple, recurse on the elements + """ + if isinstance(stmt, (List, Tuple)): + for elt in stmt.elts: + if elt is util.Uninferable: + yield elt + continue + yield from unpack_infer(elt, context) + return dict(node=stmt, context=context) + # if inferred is a final node, return it and stop + inferred = next(stmt.infer(context)) + if inferred is stmt: + yield inferred + return dict(node=stmt, context=context) + # else, infer recursively, except Uninferable object that should be returned as is + for inferred in stmt.infer(context): + if inferred is util.Uninferable: + yield inferred + else: + yield from unpack_infer(inferred, context) + + return dict(node=stmt, context=context) + + +def are_exclusive(stmt1, stmt2, exceptions=None): # pylint: disable=redefined-outer-name + """return true if the two given statements are mutually exclusive + + `exceptions` may be a list of exception names. If specified, discard If + branches and check one of the statement is in an exception handler catching + one of the given exceptions. + + algorithm : + 1) index stmt1's parents + 2) climb among stmt2's parents until we find a common parent + 3) if the common parent is a If or TryExcept statement, look if nodes are + in exclusive branches + """ + # index stmt1's parents + stmt1_parents = {} + children = {} + node = stmt1.parent + previous = stmt1 + while node: + stmt1_parents[node] = 1 + children[node] = previous + previous = node + node = node.parent + # climb among stmt2's parents until we find a common parent + node = stmt2.parent + previous = stmt2 + while node: + if node in stmt1_parents: + # if the common parent is a If or TryExcept statement, look if + # nodes are in exclusive branches + if isinstance(node, If) and exceptions is None: + if (node.locate_child(previous)[1] + is not node.locate_child(children[node])[1]): + return True + elif isinstance(node, TryExcept): + c2attr, c2node = node.locate_child(previous) + c1attr, c1node = node.locate_child(children[node]) + if c1node is not c2node: + first_in_body_caught_by_handlers = ( + c2attr == 'handlers' + and c1attr == 'body' + and previous.catch(exceptions)) + second_in_body_caught_by_handlers = ( + c2attr == 'body' + and c1attr == 'handlers' + and children[node].catch(exceptions)) + first_in_else_other_in_handlers = ( + c2attr == 'handlers' and c1attr == 'orelse') + second_in_else_other_in_handlers = ( + c2attr == 'orelse' and c1attr == 'handlers') + if any((first_in_body_caught_by_handlers, + second_in_body_caught_by_handlers, + first_in_else_other_in_handlers, + second_in_else_other_in_handlers)): + return True + elif c2attr == 'handlers' and c1attr == 'handlers': + return previous is not children[node] + return False + previous = node + node = node.parent + return False + + +# getitem() helpers. + +_SLICE_SENTINEL = object() + + +def _slice_value(index, context=None): + """Get the value of the given slice index.""" + + if isinstance(index, Const): + if isinstance(index.value, (int, type(None))): + return index.value + elif index is None: + return None + else: + # Try to infer what the index actually is. + # Since we can't return all the possible values, + # we'll stop at the first possible value. + try: + inferred = next(index.infer(context=context)) + except exceptions.InferenceError: + pass + else: + if isinstance(inferred, Const): + if isinstance(inferred.value, (int, type(None))): + return inferred.value + + # Use a sentinel, because None can be a valid + # value that this function can return, + # as it is the case for unspecified bounds. + return _SLICE_SENTINEL + + +def _infer_slice(node, context=None): + lower = _slice_value(node.lower, context) + upper = _slice_value(node.upper, context) + step = _slice_value(node.step, context) + if all(elem is not _SLICE_SENTINEL for elem in (lower, upper, step)): + return slice(lower, upper, step) + + raise exceptions.AstroidTypeError( + message='Could not infer slice used in subscript', + node=node, index=node.parent, context=context) + + +def _container_getitem(instance, elts, index, context=None): + """Get a slice or an item, using the given *index*, for the given sequence.""" + try: + if isinstance(index, Slice): + index_slice = _infer_slice(index, context=context) + new_cls = instance.__class__() + new_cls.elts = elts[index_slice] + new_cls.parent = instance.parent + return new_cls + if isinstance(index, Const): + return elts[index.value] + except IndexError as exc: + raise exceptions.AstroidIndexError( + message='Index {index!s} out of range', + node=instance, index=index, context=context) from exc + except TypeError as exc: + raise exceptions.AstroidTypeError( + message='Type error {error!r}', + node=instance, index=index, context=context) from exc + + raise exceptions.AstroidTypeError('Could not use %s as subscript index' % index) + + +OP_PRECEDENCE = { + op: precedence + for precedence, ops in enumerate([ + ['Lambda'], # lambda x: x + 1 + ['IfExp'], # 1 if True else 2 + ['or'], + ['and'], + ['not'], + ['Compare'], # in, not in, is, is not, <, <=, >, >=, !=, == + ['|'], + ['^'], + ['&'], + ['<<', '>>'], + ['+', '-'], + ['*', '@', '/', '//', '%'], + ['UnaryOp'], # +, -, ~ + ['**'], + ['Await'], + ]) for op in ops +} + + +class NodeNG: + """ A node of the new Abstract Syntax Tree (AST). + + This is the base class for all Astroid node classes. + """ + is_statement = False + """Whether this node indicates a statement. + + :type: bool + """ + optional_assign = False # True for For (and for Comprehension if py <3.0) + """Whether this node optionally assigns a variable. + + This is for loop assignments because loop won't necessarily perform an + assignment if the loop has no iterations. + This is also the case from comprehensions in Python 2. + + :type: bool + """ + is_function = False # True for FunctionDef nodes + """Whether this node indicates a function. + + :type: bool + """ + is_lambda = False + # Attributes below are set by the builder module or by raw factories + lineno = None + """The line that this node appears on in the source code. + + :type: int or None + """ + col_offset = None + """The column that this node appears on in the source code. + + :type: int or None + """ + parent = None + """The parent node in the syntax tree. + + :type: NodeNG or None + """ + _astroid_fields = () + """Node attributes that contain child nodes. + + This is redefined in most concrete classes. + + :type: tuple(str) + """ + _other_fields = () + """Node attributes that do not contain child nodes. + + :type: tuple(str) + """ + _other_other_fields = () + """Attributes that contain AST-dependent fields. + + :type: tuple(str) + """ + # instance specific inference function infer(node, context) + _explicit_inference = None + + def __init__(self, lineno=None, col_offset=None, parent=None): + """ + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.lineno = lineno + self.col_offset = col_offset + self.parent = parent + + def infer(self, context=None, **kwargs): + """Get a generator of the inferred values. + + This is the main entry point to the inference system. + + .. seealso:: :ref:`inference` + + If the instance has some explicit inference function set, it will be + called instead of the default interface. + + :returns: The inferred values. + :rtype: iterable + """ + if context is not None: + context = context.extra_context.get(self, context) + if self._explicit_inference is not None: + # explicit_inference is not bound, give it self explicitly + try: + # pylint: disable=not-callable + return self._explicit_inference(self, context, **kwargs) + except exceptions.UseInferenceDefault: + pass + + if not context: + return self._infer(context, **kwargs) + + key = (self, context.lookupname, + context.callcontext, context.boundnode) + if key in context.inferred: + return iter(context.inferred[key]) + + gen = context.cache_generator( + key, self._infer(context, **kwargs)) + return util.limit_inference(gen, MANAGER.max_inferable_values) + + def _repr_name(self): + """Get a name for nice representation. + + This is either :attr:`name`, :attr:`attrname`, or the empty string. + + :returns: The nice name. + :rtype: str + """ + names = {'name', 'attrname'} + if all(name not in self._astroid_fields for name in names): + return getattr(self, 'name', getattr(self, 'attrname', '')) + return '' + + def __str__(self): + rname = self._repr_name() + cname = type(self).__name__ + if rname: + string = '%(cname)s.%(rname)s(%(fields)s)' + alignment = len(cname) + len(rname) + 2 + else: + string = '%(cname)s(%(fields)s)' + alignment = len(cname) + 1 + result = [] + for field in self._other_fields + self._astroid_fields: + value = getattr(self, field) + width = 80 - len(field) - alignment + lines = pprint.pformat(value, indent=2, + width=width).splitlines(True) + + inner = [lines[0]] + for line in lines[1:]: + inner.append(' ' * alignment + line) + result.append('%s=%s' % (field, ''.join(inner))) + + return string % {'cname': cname, + 'rname': rname, + 'fields': (',\n' + ' ' * alignment).join(result)} + + def __repr__(self): + rname = self._repr_name() + if rname: + string = '<%(cname)s.%(rname)s l.%(lineno)s at 0x%(id)x>' + else: + string = '<%(cname)s l.%(lineno)s at 0x%(id)x>' + return string % {'cname': type(self).__name__, + 'rname': rname, + 'lineno': self.fromlineno, + 'id': id(self)} + + def accept(self, visitor): + """Visit this node using the given visitor.""" + func = getattr(visitor, "visit_" + self.__class__.__name__.lower()) + return func(self) + + def get_children(self): + """Get the child nodes below this node. + + :returns: The children. + :rtype: iterable(NodeNG) + """ + for field in self._astroid_fields: + attr = getattr(self, field) + if attr is None: + continue + if isinstance(attr, (list, tuple)): + yield from attr + else: + yield attr + + def last_child(self): + """An optimized version of list(get_children())[-1] + + :returns: The last child, or None if no children exist. + :rtype: NodeNG or None + """ + for field in self._astroid_fields[::-1]: + attr = getattr(self, field) + if not attr: # None or empty listy / tuple + continue + if isinstance(attr, (list, tuple)): + return attr[-1] + + return attr + return None + + def parent_of(self, node): + """Check if this node is the parent of the given node. + + :param node: The node to check if it is the child. + :type node: NodeNG + + :returns: True if this node is the parent of the given node, + False otherwise. + :rtype: bool + """ + parent = node.parent + while parent is not None: + if self is parent: + return True + parent = parent.parent + return False + + def statement(self): + """The first parent node, including self, marked as statement node. + + :returns: The first parent statement. + :rtype: NodeNG + """ + if self.is_statement: + return self + return self.parent.statement() + + def frame(self): + """The first parent frame node. + + A frame node is a :class:`Module`, :class:`FunctionDef`, + or :class:`ClassDef`. + + :returns: The first parent frame node. + :rtype: Module or FunctionDef or ClassDef + """ + return self.parent.frame() + + def scope(self): + """The first parent node defining a new scope. + + :returns: The first parent scope node. + :rtype: Module or FunctionDef or ClassDef or Lambda or GenExpr + """ + return self.parent.scope() + + def root(self): + """Return the root node of the syntax tree. + + :returns: The root node. + :rtype: Module + """ + if self.parent: + return self.parent.root() + return self + + def child_sequence(self, child): + """Search for the sequence that contains this child. + + :param child: The child node to search sequences for. + :type child: NodeNG + + :returns: The sequence containing the given child node. + :rtype: iterable(NodeNG) + + :raises AstroidError: If no sequence could be found that contains + the given child. + """ + for field in self._astroid_fields: + node_or_sequence = getattr(self, field) + if node_or_sequence is child: + return [node_or_sequence] + # /!\ compiler.ast Nodes have an __iter__ walking over child nodes + if (isinstance(node_or_sequence, (tuple, list)) + and child in node_or_sequence): + return node_or_sequence + + msg = 'Could not find %s in %s\'s children' + raise exceptions.AstroidError(msg % (repr(child), repr(self))) + + def locate_child(self, child): + """Find the field of this node that contains the given child. + + :param child: The child node to search fields for. + :type child: NodeNG + + :returns: A tuple of the name of the field that contains the child, + and the sequence or node that contains the child node. + :rtype: tuple(str, iterable(NodeNG) or NodeNG) + + :raises AstroidError: If no field could be found that contains + the given child. + """ + for field in self._astroid_fields: + node_or_sequence = getattr(self, field) + # /!\ compiler.ast Nodes have an __iter__ walking over child nodes + if child is node_or_sequence: + return field, child + if isinstance(node_or_sequence, (tuple, list)) and child in node_or_sequence: + return field, node_or_sequence + msg = 'Could not find %s in %s\'s children' + raise exceptions.AstroidError(msg % (repr(child), repr(self))) + # FIXME : should we merge child_sequence and locate_child ? locate_child + # is only used in are_exclusive, child_sequence one time in pylint. + + def next_sibling(self): + """The next sibling statement node. + + :returns: The next sibling statement node. + :rtype: NodeNG or None + """ + return self.parent.next_sibling() + + def previous_sibling(self): + """The previous sibling statement. + + :returns: The previous sibling statement node. + :rtype: NodeNG or None + """ + return self.parent.previous_sibling() + + def nearest(self, nodes): + """Get the node closest to this one from the given list of nodes. + + :param nodes: The list of nodes to search. All of these nodes must + belong to the same module as this one. The list should be + sorted by the line number of the nodes, smallest first. + :type nodes: iterable(NodeNG) + + :returns: The node closest to this one in the source code, + or None if one could not be found. + :rtype: NodeNG or None + """ + myroot = self.root() + mylineno = self.fromlineno + nearest = None, 0 + for node in nodes: + assert node.root() is myroot, \ + 'nodes %s and %s are not from the same module' % (self, node) + lineno = node.fromlineno + if node.fromlineno > mylineno: + break + if lineno > nearest[1]: + nearest = node, lineno + # FIXME: raise an exception if nearest is None ? + return nearest[0] + + # these are lazy because they're relatively expensive to compute for every + # single node, and they rarely get looked at + + @decorators.cachedproperty + def fromlineno(self): + """The first line that this node appears on in the source code. + + :type: int or None + """ + if self.lineno is None: + return self._fixed_source_line() + + return self.lineno + + @decorators.cachedproperty + def tolineno(self): + """The last line that this node appears on in the source code. + + :type: int or None + """ + if not self._astroid_fields: + # can't have children + lastchild = None + else: + lastchild = self.last_child() + if lastchild is None: + return self.fromlineno + + return lastchild.tolineno + + def _fixed_source_line(self): + """Attempt to find the line that this node appears on. + + We need this method since not all nodes have :attr:`lineno` set. + + :returns: The line number of this node, + or None if this could not be determined. + :rtype: int or None + """ + line = self.lineno + _node = self + try: + while line is None: + _node = next(_node.get_children()) + line = _node.lineno + except StopIteration: + _node = self.parent + while _node and line is None: + line = _node.lineno + _node = _node.parent + return line + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: The line number to start the range at. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + starting at the given line number. + :rtype: tuple(int, int or None) + """ + return lineno, self.tolineno + + def set_local(self, name, stmt): + """Define that the given name is declared in the given statement node. + + This definition is stored on the parent scope node. + + .. seealso:: :meth:`scope` + + :param name: The name that is being defined. + :type name: str + + :param stmt: The statement that defines the given name. + :type stmt: NodeNG + """ + self.parent.set_local(name, stmt) + + def nodes_of_class(self, klass, skip_klass=None): + """Get the nodes (including this one or below) of the given type. + + :param klass: The type of node to search for. + :type klass: builtins.type + + :param skip_klass: A type of node to ignore. This is useful to ignore + subclasses of :attr:`klass`. + :type skip_klass: builtins.type + + :returns: The node of the given type. + :rtype: iterable(NodeNG) + """ + if isinstance(self, klass): + yield self + + if skip_klass is None: + for child_node in self.get_children(): + yield from child_node.nodes_of_class(klass, skip_klass) + + return + + for child_node in self.get_children(): + if isinstance(child_node, skip_klass): + continue + yield from child_node.nodes_of_class(klass, skip_klass) + + def _get_assign_nodes(self): + yield from () + + def _get_name_nodes(self): + for child_node in self.get_children(): + yield from child_node._get_name_nodes() + + def _get_return_nodes_skip_functions(self): + yield from () + + def _get_yield_nodes_skip_lambdas(self): + yield from () + + def _infer_name(self, frame, name): + # overridden for ImportFrom, Import, Global, TryExcept and Arguments + pass + + def _infer(self, context=None): + """we don't know how to resolve a statement by default""" + # this method is overridden by most concrete classes + raise exceptions.InferenceError('No inference function for {node!r}.', + node=self, context=context) + + def inferred(self): + """Get a list of the inferred values. + + .. seealso:: :ref:`inference` + + :returns: The inferred values. + :rtype: list + """ + return list(self.infer()) + + def instantiate_class(self): + """Instantiate an instance of the defined class. + + .. note:: + + On anything other than a :class:`ClassDef` this will return self. + + :returns: An instance of the defined class. + :rtype: object + """ + return self + + def has_base(self, node): + """Check if this node inherits from the given type. + + :param node: The node defining the base to look for. + Usually this is a :class:`Name` node. + :type node: NodeNG + """ + return False + + def callable(self): + """Whether this node defines something that is callable. + + :returns: True if this defines something that is callable, + False otherwise. + :rtype: bool + """ + return False + + def eq(self, value): + return False + + def as_string(self): + """Get the source code that this node represents. + + :returns: The source code. + :rtype: str + """ + return as_string.to_code(self) + + def repr_tree(self, ids=False, include_linenos=False, + ast_state=False, indent=' ', max_depth=0, max_width=80): + """Get a string representation of the AST from this node. + + :param ids: If true, includes the ids with the node type names. + :type ids: bool + + :param include_linenos: If true, includes the line numbers and + column offsets. + :type include_linenos: bool + + :param ast_state: If true, includes information derived from + the whole AST like local and global variables. + :type ast_state: bool + + :param indent: A string to use to indent the output string. + :type indent: str + + :param max_depth: If set to a positive integer, won't return + nodes deeper than max_depth in the string. + :type max_depth: int + + :param max_width: Attempt to format the output string to stay + within this number of characters, but can exceed it under some + circumstances. Only positive integer values are valid, the default is 80. + :type max_width: int + + :returns: The string representation of the AST. + :rtype: str + """ + # pylint: disable=too-many-statements + @_singledispatch + def _repr_tree(node, result, done, cur_indent='', depth=1): + """Outputs a representation of a non-tuple/list, non-node that's + contained within an AST, including strings. + """ + lines = pprint.pformat(node, + width=max(max_width - len(cur_indent), + 1)).splitlines(True) + result.append(lines[0]) + result.extend([cur_indent + line for line in lines[1:]]) + return len(lines) != 1 + + # pylint: disable=unused-variable; doesn't understand singledispatch + @_repr_tree.register(tuple) + @_repr_tree.register(list) + def _repr_seq(node, result, done, cur_indent='', depth=1): + """Outputs a representation of a sequence that's contained within an AST.""" + cur_indent += indent + result.append('[') + if not node: + broken = False + elif len(node) == 1: + broken = _repr_tree(node[0], result, done, cur_indent, depth) + elif len(node) == 2: + broken = _repr_tree(node[0], result, done, cur_indent, depth) + if not broken: + result.append(', ') + else: + result.append(',\n') + result.append(cur_indent) + broken = (_repr_tree(node[1], result, done, cur_indent, depth) + or broken) + else: + result.append('\n') + result.append(cur_indent) + for child in node[:-1]: + _repr_tree(child, result, done, cur_indent, depth) + result.append(',\n') + result.append(cur_indent) + _repr_tree(node[-1], result, done, cur_indent, depth) + broken = True + result.append(']') + return broken + + # pylint: disable=unused-variable; doesn't understand singledispatch + @_repr_tree.register(NodeNG) + def _repr_node(node, result, done, cur_indent='', depth=1): + """Outputs a strings representation of an astroid node.""" + if node in done: + result.append(indent + ' max_depth: + result.append('...') + return False + depth += 1 + cur_indent += indent + if ids: + result.append('%s<0x%x>(\n' % (type(node).__name__, id(node))) + else: + result.append('%s(' % type(node).__name__) + fields = [] + if include_linenos: + fields.extend(('lineno', 'col_offset')) + fields.extend(node._other_fields) + fields.extend(node._astroid_fields) + if ast_state: + fields.extend(node._other_other_fields) + if not fields: + broken = False + elif len(fields) == 1: + result.append('%s=' % fields[0]) + broken = _repr_tree(getattr(node, fields[0]), result, done, + cur_indent, depth) + else: + result.append('\n') + result.append(cur_indent) + for field in fields[:-1]: + result.append('%s=' % field) + _repr_tree(getattr(node, field), result, done, cur_indent, + depth) + result.append(',\n') + result.append(cur_indent) + result.append('%s=' % fields[-1]) + _repr_tree(getattr(node, fields[-1]), result, done, cur_indent, + depth) + broken = True + result.append(')') + return broken + + result = [] + _repr_tree(self, result, set()) + return ''.join(result) + + def bool_value(self): + """Determine the boolean value of this node. + + The boolean value of a node can have three + possible values: + + * False: For instance, empty data structures, + False, empty strings, instances which return + explicitly False from the __nonzero__ / __bool__ + method. + * True: Most of constructs are True by default: + classes, functions, modules etc + * Uninferable: The inference engine is uncertain of the + node's value. + + :returns: The boolean value of this node. + :rtype: bool or Uninferable + """ + return util.Uninferable + + def op_precedence(self): + # Look up by class name or default to highest precedence + return OP_PRECEDENCE.get( + self.__class__.__name__, len(OP_PRECEDENCE)) + + def op_left_associative(self): + # Everything is left associative except `**` and IfExp + return True + + +class Statement(NodeNG): + """Statement node adding a few attributes""" + is_statement = True + """Whether this node indicates a statement. + + :type: bool + """ + + def next_sibling(self): + """The next sibling statement node. + + :returns: The next sibling statement node. + :rtype: NodeNG or None + """ + stmts = self.parent.child_sequence(self) + index = stmts.index(self) + try: + return stmts[index +1] + except IndexError: + pass + + def previous_sibling(self): + """The previous sibling statement. + + :returns: The previous sibling statement node. + :rtype: NodeNG or None + """ + stmts = self.parent.child_sequence(self) + index = stmts.index(self) + if index >= 1: + return stmts[index -1] + return None + + +class _BaseContainer(mixins.ParentAssignTypeMixin, + NodeNG, bases.Instance, + metaclass=abc.ABCMeta): + """Base class for Set, FrozenSet, Tuple and List.""" + + _astroid_fields = ('elts',) + + def __init__(self, lineno=None, col_offset=None, parent=None): + """ + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.elts = [] + """The elements in the node. + + :type: list(NodeNG) + """ + + super(_BaseContainer, self).__init__(lineno, col_offset, parent) + + def postinit(self, elts): + """Do some setup after initialisation. + + :param elts: The list of elements the that node contains. + :type elts: list(NodeNG) + """ + self.elts = elts + + @classmethod + def from_constants(cls, elts=None): + """Create a node of this type from the given list of elements. + + :param elts: The list of elements that the node should contain. + :type elts: list(NodeNG) + + :returns: A new node containing the given elements. + :rtype: NodeNG + """ + node = cls() + if elts is None: + node.elts = [] + else: + node.elts = [const_factory(e) for e in elts] + return node + + def itered(self): + """An iterator over the elements this node contains. + + :returns: The contents of this node. + :rtype: iterable(NodeNG) + """ + return self.elts + + def bool_value(self): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + :rtype: bool or Uninferable + """ + return bool(self.elts) + + @abc.abstractmethod + def pytype(self): + """Get the name of the type that this node represents. + + :returns: The name of the type. + :rtype: str + """ + + def get_children(self): + yield from self.elts + + +class LookupMixIn: + """Mixin to look up a name in the right scope.""" + + @lru_cache(maxsize=None) + def lookup(self, name): + """Lookup where the given variable is assigned. + + The lookup starts from self's scope. If self is not a frame itself + and the name is found in the inner frame locals, statements will be + filtered to remove ignorable statements according to self's location. + + :param name: The name of the variable to find assignments for. + :type name: str + + :returns: The scope node and the list of assignments associated to the + given name according to the scope where it has been found (locals, + globals or builtin). + :rtype: tuple(str, list(NodeNG)) + """ + return self.scope().scope_lookup(self, name) + + def ilookup(self, name): + """Lookup the inferred values of the given variable. + + :param name: The variable name to find values for. + :type name: str + + :returns: The inferred values of the statements returned from + :meth:`lookup`. + :rtype: iterable + """ + frame, stmts = self.lookup(name) + context = contextmod.InferenceContext() + return bases._infer_stmts(stmts, context, frame) + + def _filter_stmts(self, stmts, frame, offset): + """Filter the given list of statements to remove ignorable statements. + + If self is not a frame itself and the name is found in the inner + frame locals, statements will be filtered to remove ignorable + statements according to self's location. + + :param stmts: The statements to filter. + :type stmts: list(NodeNG) + + :param frame: The frame that all of the given statements belong to. + :type frame: NodeNG + + :param offset: The line offset to filter statements up to. + :type offset: int + + :returns: The filtered statements. + :rtype: list(NodeNG) + """ + # if offset == -1, my actual frame is not the inner frame but its parent + # + # class A(B): pass + # + # we need this to resolve B correctly + if offset == -1: + myframe = self.frame().parent.frame() + else: + myframe = self.frame() + # If the frame of this node is the same as the statement + # of this node, then the node is part of a class or + # a function definition and the frame of this node should be the + # the upper frame, not the frame of the definition. + # For more information why this is important, + # see Pylint issue #295. + # For example, for 'b', the statement is the same + # as the frame / scope: + # + # def test(b=1): + # ... + + if self.statement() is myframe and myframe.parent: + myframe = myframe.parent.frame() + mystmt = self.statement() + # line filtering if we are in the same frame + # + # take care node may be missing lineno information (this is the case for + # nodes inserted for living objects) + if myframe is frame and mystmt.fromlineno is not None: + assert mystmt.fromlineno is not None, mystmt + mylineno = mystmt.fromlineno + offset + else: + # disabling lineno filtering + mylineno = 0 + _stmts = [] + _stmt_parents = [] + for node in stmts: + stmt = node.statement() + # line filtering is on and we have reached our location, break + if stmt.fromlineno > mylineno > 0: + break + # Ignore decorators with the same name as the + # decorated function + # Fixes issue #375 + if mystmt is stmt and is_from_decorator(self): + continue + assert hasattr(node, 'assign_type'), (node, node.scope(), + node.scope().locals) + assign_type = node.assign_type() + if node.has_base(self): + break + + _stmts, done = assign_type._get_filtered_stmts(self, node, _stmts, mystmt) + if done: + break + + optional_assign = assign_type.optional_assign + if optional_assign and assign_type.parent_of(self): + # we are inside a loop, loop var assignment is hiding previous + # assignment + _stmts = [node] + _stmt_parents = [stmt.parent] + continue + + # XXX comment various branches below!!! + try: + pindex = _stmt_parents.index(stmt.parent) + except ValueError: + pass + else: + # we got a parent index, this means the currently visited node + # is at the same block level as a previously visited node + if _stmts[pindex].assign_type().parent_of(assign_type): + # both statements are not at the same block level + continue + # if currently visited node is following previously considered + # assignment and both are not exclusive, we can drop the + # previous one. For instance in the following code :: + # + # if a: + # x = 1 + # else: + # x = 2 + # print x + # + # we can't remove neither x = 1 nor x = 2 when looking for 'x' + # of 'print x'; while in the following :: + # + # x = 1 + # x = 2 + # print x + # + # we can remove x = 1 when we see x = 2 + # + # moreover, on loop assignment types, assignment won't + # necessarily be done if the loop has no iteration, so we don't + # want to clear previous assignments if any (hence the test on + # optional_assign) + if not (optional_assign or are_exclusive(_stmts[pindex], node)): + del _stmt_parents[pindex] + del _stmts[pindex] + if isinstance(node, AssignName): + if not optional_assign and stmt.parent is mystmt.parent: + _stmts = [] + _stmt_parents = [] + elif isinstance(node, DelName): + _stmts = [] + _stmt_parents = [] + continue + if not are_exclusive(self, node): + _stmts.append(node) + _stmt_parents.append(stmt.parent) + return _stmts + + +# Name classes + +class AssignName(mixins.NoChildrenMixin, LookupMixIn, + mixins.ParentAssignTypeMixin, NodeNG): + """Variation of :class:`ast.Assign` representing assignment to a name. + + An :class:`AssignName` is the name of something that is assigned to. + This includes variables defined in a function signature or in a loop. + + >>> node = astroid.extract_node('variable = range(10)') + >>> node + + >>> list(node.get_children()) + [, ] + >>> list(node.get_children())[0].as_string() + 'variable' + """ + _other_fields = ('name',) + + def __init__(self, name=None, lineno=None, col_offset=None, parent=None): + """ + :param name: The name that is assigned to. + :type name: str or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.name = name + """The name that is assigned to. + + :type: str or None + """ + + super(AssignName, self).__init__(lineno, col_offset, parent) + + +class DelName(mixins.NoChildrenMixin, LookupMixIn, + mixins.ParentAssignTypeMixin, NodeNG): + """Variation of :class:`ast.Delete` representing deletion of a name. + + A :class:`DelName` is the name of something that is deleted. + + >>> node = astroid.extract_node("del variable #@") + >>> list(node.get_children()) + [] + >>> list(node.get_children())[0].as_string() + 'variable' + """ + _other_fields = ('name',) + + def __init__(self, name=None, lineno=None, col_offset=None, parent=None): + """ + :param name: The name that is being deleted. + :type name: str or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.name = name + """The name that is being deleted. + + :type: str or None + """ + + super(DelName, self).__init__(lineno, col_offset, parent) + + +class Name(mixins.NoChildrenMixin, LookupMixIn, NodeNG): + """Class representing an :class:`ast.Name` node. + + A :class:`Name` node is something that is named, but not covered by + :class:`AssignName` or :class:`DelName`. + + >>> node = astroid.extract_node('range(10)') + >>> node + + >>> list(node.get_children()) + [, ] + >>> list(node.get_children())[0].as_string() + 'range' + """ + _other_fields = ('name',) + + def __init__(self, name=None, lineno=None, col_offset=None, parent=None): + """ + :param name: The name that this node refers to. + :type name: str or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.name = name + """The name that this node refers to. + + :type: str or None + """ + + super(Name, self).__init__(lineno, col_offset, parent) + + def _get_name_nodes(self): + yield self + + for child_node in self.get_children(): + yield from child_node._get_name_nodes() + + +class Arguments(mixins.AssignTypeMixin, NodeNG): + """Class representing an :class:`ast.arguments` node. + + An :class:`Arguments` node represents that arguments in a + function definition. + + >>> node = astroid.extract_node('def foo(bar): pass') + >>> node + + >>> node.args + + """ + # Python 3.4+ uses a different approach regarding annotations, + # each argument is a new class, _ast.arg, which exposes an + # 'annotation' attribute. In astroid though, arguments are exposed + # as is in the Arguments node and the only way to expose annotations + # is by using something similar with Python 3.3: + # - we expose 'varargannotation' and 'kwargannotation' of annotations + # of varargs and kwargs. + # - we expose 'annotation', a list with annotations for + # for each normal argument. If an argument doesn't have an + # annotation, its value will be None. + + _astroid_fields = ('args', 'defaults', 'kwonlyargs', + 'kw_defaults', 'annotations', 'varargannotation', + 'kwargannotation', 'kwonlyargs_annotations') + varargannotation = None + """The type annotation for the variable length arguments. + + :type: NodeNG + """ + kwargannotation = None + """The type annotation for the variable length keyword arguments. + + :type: NodeNG + """ + + _other_fields = ('vararg', 'kwarg') + + def __init__(self, vararg=None, kwarg=None, parent=None): + """ + :param vararg: The name of the variable length arguments. + :type vararg: str or None + + :param kwarg: The name of the variable length keyword arguments. + :type kwarg: str or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + super(Arguments, self).__init__(parent=parent) + self.vararg = vararg + """The name of the variable length arguments. + + :type: str or None + """ + + self.kwarg = kwarg + """The name of the variable length keyword arguments. + + :type: str or None + """ + + self.args = [] + """The names of the required arguments. + + :type: list(AssignName) + """ + + self.defaults = [] + """The default values for arguments that can be passed positionally. + + :type: list(NodeNG) + """ + + self.kwonlyargs = [] + """The keyword arguments that cannot be passed positionally. + + :type: list(AssignName) + """ + + self.kw_defaults = [] + """The default values for keyword arguments that cannot be passed positionally. + + :type: list(NodeNG) + """ + + self.annotations = [] + """The type annotations of arguments that can be passed positionally. + + :type: list(NodeNG) + """ + + self.kwonlyargs_annotations = [] + """The type annotations of arguments that cannot be passed positionally. + + :type: list(NodeNG) + """ + + def postinit(self, args, defaults, kwonlyargs, kw_defaults, + annotations, + kwonlyargs_annotations=None, + varargannotation=None, + kwargannotation=None): + """Do some setup after initialisation. + + :param args: The names of the required arguments. + :type args: list(AssignName) + + :param defaults: The default values for arguments that can be passed + positionally. + :type defaults: list(NodeNG) + + :param kwonlyargs: The keyword arguments that cannot be passed + positionally. + :type kwonlyargs: list(AssignName) + + :param kw_defaults: The default values for keyword arguments that + cannot be passed positionally. + :type kw_defaults: list(NodeNG) + + :param annotations: The type annotations of arguments that can be + passed positionally. + :type annotations: list(NodeNG) + + :param kwonlyargs_annotations: The type annotations of arguments that + cannot be passed positionally. This should always be passed in + Python 3. + :type kwonlyargs_annotations: list(NodeNG) + + :param varargannotation: The type annotation for the variable length + arguments. + :type varargannotation: NodeNG + + :param kwargannotation: The type annotation for the variable length + keyword arguments. + :type kwargannotation: NodeNG + """ + self.args = args + self.defaults = defaults + self.kwonlyargs = kwonlyargs + self.kw_defaults = kw_defaults + self.annotations = annotations + self.kwonlyargs_annotations = kwonlyargs_annotations + self.varargannotation = varargannotation + self.kwargannotation = kwargannotation + + def _infer_name(self, frame, name): + if self.parent is frame: + return name + return None + + @decorators.cachedproperty + def fromlineno(self): + """The first line that this node appears on in the source code. + + :type: int or None + """ + lineno = super(Arguments, self).fromlineno + return max(lineno, self.parent.fromlineno or 0) + + def format_args(self): + """Get the arguments formatted as string. + + :returns: The formatted arguments. + :rtype: str + """ + result = [] + if self.args: + result.append( + _format_args(self.args, self.defaults, + getattr(self, 'annotations', None)) + ) + if self.vararg: + result.append('*%s' % self.vararg) + if self.kwonlyargs: + if not self.vararg: + result.append('*') + result.append(_format_args( + self.kwonlyargs, + self.kw_defaults, + self.kwonlyargs_annotations + )) + if self.kwarg: + result.append('**%s' % self.kwarg) + return ', '.join(result) + + def default_value(self, argname): + """Get the default value for an argument. + + :param argname: The name of the argument to get the default value for. + :type argname: str + + :raises NoDefault: If there is no default value defined for the + given argument. + """ + i = _find_arg(argname, self.args)[0] + if i is not None: + idx = i - (len(self.args) - len(self.defaults)) + if idx >= 0: + return self.defaults[idx] + i = _find_arg(argname, self.kwonlyargs)[0] + if i is not None and self.kw_defaults[i] is not None: + return self.kw_defaults[i] + raise exceptions.NoDefault(func=self.parent, name=argname) + + def is_argument(self, name): + """Check if the given name is defined in the arguments. + + :param name: The name to check for. + :type name: str + + :returns: True if the given name is defined in the arguments, + False otherwise. + :rtype: bool + """ + if name == self.vararg: + return True + if name == self.kwarg: + return True + return (self.find_argname(name, True)[1] is not None or + self.kwonlyargs and _find_arg(name, self.kwonlyargs, True)[1] is not None) + + def find_argname(self, argname, rec=False): + """Get the index and :class:`AssignName` node for given name. + + :param argname: The name of the argument to search for. + :type argname: str + + :param rec: Whether or not to include arguments in unpacked tuples + in the search. + :type rec: bool + + :returns: The index and node for the argument. + :rtype: tuple(str or None, AssignName or None) + """ + if self.args: # self.args may be None in some cases (builtin function) + return _find_arg(argname, self.args, rec) + return None, None + + def get_children(self): + yield from self.args or () + + yield from self.defaults + yield from self.kwonlyargs + + for elt in self.kw_defaults: + if elt is not None: + yield elt + + for elt in self.annotations: + if elt is not None: + yield elt + + if self.varargannotation is not None: + yield self.varargannotation + + if self.kwargannotation is not None: + yield self.kwargannotation + + for elt in self.kwonlyargs_annotations: + if elt is not None: + yield elt + + +def _find_arg(argname, args, rec=False): + for i, arg in enumerate(args): + if isinstance(arg, Tuple): + if rec: + found = _find_arg(argname, arg.elts) + if found[0] is not None: + return found + elif arg.name == argname: + return i, arg + return None, None + + +def _format_args(args, defaults=None, annotations=None): + values = [] + if args is None: + return '' + if annotations is None: + annotations = [] + if defaults is not None: + default_offset = len(args) - len(defaults) + packed = itertools.zip_longest(args, annotations) + for i, (arg, annotation) in enumerate(packed): + if isinstance(arg, Tuple): + values.append('(%s)' % _format_args(arg.elts)) + else: + argname = arg.name + if annotation is not None: + argname += ':' + annotation.as_string() + values.append(argname) + + if defaults is not None and i >= default_offset: + if defaults[i-default_offset] is not None: + values[-1] += '=' + defaults[i-default_offset].as_string() + return ', '.join(values) + + +class AssignAttr(mixins.ParentAssignTypeMixin, NodeNG): + """Variation of :class:`ast.Assign` representing assignment to an attribute. + + >>> node = astroid.extract_node('self.attribute = range(10)') + >>> node + + >>> list(node.get_children()) + [, ] + >>> list(node.get_children())[0].as_string() + 'self.attribute' + """ + _astroid_fields = ('expr',) + _other_fields = ('attrname',) + expr = None + """What has the attribute that is being assigned to. + + :type: NodeNG or None + """ + + def __init__(self, attrname=None, lineno=None, col_offset=None, parent=None): + """ + :param attrname: The name of the attribute being assigned to. + :type attrname: str or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.attrname = attrname + """The name of the attribute being assigned to. + + :type: str or None + """ + + super(AssignAttr, self).__init__(lineno, col_offset, parent) + + def postinit(self, expr=None): + """Do some setup after initialisation. + + :param expr: What has the attribute that is being assigned to. + :type expr: NodeNG or None + """ + self.expr = expr + + def get_children(self): + yield self.expr + + +class Assert(Statement): + """Class representing an :class:`ast.Assert` node. + + An :class:`Assert` node represents an assert statement. + + >>> node = astroid.extract_node('assert len(things) == 10, "Not enough things"') + >>> node + + """ + _astroid_fields = ('test', 'fail',) + test = None + """The test that passes or fails the assertion. + + :type: NodeNG or None + """ + fail = None + """The message shown when the assertion fails. + + :type: NodeNG or None + """ + + def postinit(self, test=None, fail=None): + """Do some setup after initialisation. + + :param test: The test that passes or fails the assertion. + :type test: NodeNG or None + + :param fail: The message shown when the assertion fails. + :type fail: NodeNG or None + """ + self.fail = fail + self.test = test + + def get_children(self): + yield self.test + + if self.fail is not None: + yield self.fail + + +class Assign(mixins.AssignTypeMixin, Statement): + """Class representing an :class:`ast.Assign` node. + + An :class:`Assign` is a statement where something is explicitly + asssigned to. + + >>> node = astroid.extract_node('variable = range(10)') + >>> node + + """ + _astroid_fields = ('targets', 'value',) + _other_other_fields = ('type_annotation',) + targets = None + """What is being assigned to. + + :type: list(NodeNG) or None + """ + value = None + """The value being assigned to the variables. + + :type: NodeNG or None + """ + type_annotation = None + """If present, this will contain the type annotation passed by a type comment + + :type: NodeNG or None + """ + + def postinit(self, targets=None, value=None, type_annotation=None): + """Do some setup after initialisation. + + :param targets: What is being assigned to. + :type targets: list(NodeNG) or None + + :param value: The value being assigned to the variables. + :type: NodeNG or None + """ + self.targets = targets + self.value = value + self.type_annotation = type_annotation + + def get_children(self): + yield from self.targets + + yield self.value + + def _get_assign_nodes(self): + yield self + + yield from self.value._get_assign_nodes() + + def _get_yield_nodes_skip_lambdas(self): + yield from self.value._get_yield_nodes_skip_lambdas() + + +class AnnAssign(mixins.AssignTypeMixin, Statement): + """Class representing an :class:`ast.AnnAssign` node. + + An :class:`AnnAssign` is an assignment with a type annotation. + + >>> node = astroid.extract_node('variable: List[int] = range(10)') + >>> node + + """ + + _astroid_fields = ('target', 'annotation', 'value',) + _other_fields = ('simple',) + target = None + """What is being assigned to. + + :type: NodeNG or None + """ + annotation = None + """The type annotation of what is being assigned to. + + :type: NodeNG + """ + value = None + """The value being assigned to the variables. + + :type: NodeNG or None + """ + simple = None + """Whether :attr:`target` is a pure name or a complex statement. + + :type: int + """ + + def postinit(self, target, annotation, simple, value=None): + """Do some setup after initialisation. + + :param target: What is being assigned to. + :type target: NodeNG + + :param annotation: The type annotation of what is being assigned to. + :type: NodeNG + + :param simple: Whether :attr:`target` is a pure name + or a complex statement. + :type simple: int + + :param value: The value being assigned to the variables. + :type: NodeNG or None + """ + self.target = target + self.annotation = annotation + self.value = value + self.simple = simple + + def get_children(self): + yield self.target + yield self.annotation + + if self.value is not None: + yield self.value + + +class AugAssign(mixins.AssignTypeMixin, Statement): + """Class representing an :class:`ast.AugAssign` node. + + An :class:`AugAssign` is an assignment paired with an operator. + + >>> node = astroid.extract_node('variable += 1') + >>> node + + """ + _astroid_fields = ('target', 'value') + _other_fields = ('op',) + target = None + """What is being assigned to. + + :type: NodeNG or None + """ + value = None + """The value being assigned to the variable. + + :type: NodeNG or None + """ + + def __init__(self, op=None, lineno=None, col_offset=None, parent=None): + """ + :param op: The operator that is being combined with the assignment. + This includes the equals sign. + :type op: str or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.op = op + """The operator that is being combined with the assignment. + + This includes the equals sign. + + :type: str or None + """ + + super(AugAssign, self).__init__(lineno, col_offset, parent) + + def postinit(self, target=None, value=None): + """Do some setup after initialisation. + + :param target: What is being assigned to. + :type target: NodeNG or None + + :param value: The value being assigned to the variable. + :type: NodeNG or None + """ + self.target = target + self.value = value + + # This is set by inference.py + def _infer_augassign(self, context=None): + raise NotImplementedError + + def type_errors(self, context=None): + """Get a list of type errors which can occur during inference. + + Each TypeError is represented by a :class:`BadBinaryOperationMessage` , + which holds the original exception. + + :returns: The list of possible type errors. + :rtype: list(BadBinaryOperationMessage) + """ + try: + results = self._infer_augassign(context=context) + return [result for result in results + if isinstance(result, util.BadBinaryOperationMessage)] + except exceptions.InferenceError: + return [] + + def get_children(self): + yield self.target + yield self.value + + +class Repr(NodeNG): + """Class representing an :class:`ast.Repr` node. + + A :class:`Repr` node represents the backtick syntax, + which is a deprecated alias for :func:`repr` removed in Python 3. + + >>> node = astroid.extract_node('`variable`') + >>> node + + """ + _astroid_fields = ('value',) + value = None + """What is having :func:`repr` called on it. + + :type: NodeNG or None + """ + + def postinit(self, value=None): + """Do some setup after initialisation. + + :param value: What is having :func:`repr` called on it. + :type value: NodeNG or None + """ + self.value = value + + +class BinOp(NodeNG): + """Class representing an :class:`ast.BinOp` node. + + A :class:`BinOp` node is an application of a binary operator. + + >>> node = astroid.extract_node('a + b') + >>> node + + """ + _astroid_fields = ('left', 'right') + _other_fields = ('op',) + left = None + """What is being applied to the operator on the left side. + + :type: NodeNG or None + """ + right = None + """What is being applied to the operator on the right side. + + :type: NodeNG or None + """ + + def __init__(self, op=None, lineno=None, col_offset=None, parent=None): + """ + :param op: The operator. + :type: str or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.op = op + """The operator. + + :type: str or None + """ + + super(BinOp, self).__init__(lineno, col_offset, parent) + + def postinit(self, left=None, right=None): + """Do some setup after initialisation. + + :param left: What is being applied to the operator on the left side. + :type left: NodeNG or None + + :param right: What is being applied to the operator on the right side. + :type right: NodeNG or None + """ + self.left = left + self.right = right + + # This is set by inference.py + def _infer_binop(self, context=None): + raise NotImplementedError + + def type_errors(self, context=None): + """Get a list of type errors which can occur during inference. + + Each TypeError is represented by a :class:`BadBinaryOperationMessage`, + which holds the original exception. + + :returns: The list of possible type errors. + :rtype: list(BadBinaryOperationMessage) + """ + try: + results = self._infer_binop(context=context) + return [result for result in results + if isinstance(result, util.BadBinaryOperationMessage)] + except exceptions.InferenceError: + return [] + + def get_children(self): + yield self.left + yield self.right + + def op_precedence(self): + return OP_PRECEDENCE[self.op] + + def op_left_associative(self): + # 2**3**4 == 2**(3**4) + return self.op != '**' + + +class BoolOp(NodeNG): + """Class representing an :class:`ast.BoolOp` node. + + A :class:`BoolOp` is an application of a boolean operator. + + >>> node = astroid.extract_node('a and b') + >>> node + + """ + _astroid_fields = ('values',) + _other_fields = ('op',) + values = None + """The values being applied to the operator. + + :type: list(NodeNG) or None + """ + + def __init__(self, op=None, lineno=None, col_offset=None, parent=None): + """ + :param op: The operator. + :type: str or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.op = op + """The operator. + + :type: str or None + """ + + super(BoolOp, self).__init__(lineno, col_offset, parent) + + def postinit(self, values=None): + """Do some setup after initialisation. + + :param values: The values being applied to the operator. + :type values: list(NodeNG) or None + """ + self.values = values + + def get_children(self): + yield from self.values + + def op_precedence(self): + return OP_PRECEDENCE[self.op] + + +class Break(mixins.NoChildrenMixin, Statement): + """Class representing an :class:`ast.Break` node. + + >>> node = astroid.extract_node('break') + >>> node + + """ + + +class Call(NodeNG): + """Class representing an :class:`ast.Call` node. + + A :class:`Call` node is a call to a function, method, etc. + + >>> node = astroid.extract_node('function()') + >>> node + + """ + _astroid_fields = ('func', 'args', 'keywords') + func = None + """What is being called. + + :type: NodeNG or None + """ + args = None + """The positional arguments being given to the call. + + :type: list(NodeNG) or None + """ + keywords = None + """The keyword arguments being given to the call. + + :type: list(NodeNG) or None + """ + + def postinit(self, func=None, args=None, keywords=None): + """Do some setup after initialisation. + + :param func: What is being called. + :type func: NodeNG or None + + :param args: The positional arguments being given to the call. + :type args: list(NodeNG) or None + + :param keywords: The keyword arguments being given to the call. + :type keywords: list(NodeNG) or None + """ + self.func = func + self.args = args + self.keywords = keywords + + @property + def starargs(self): + """The positional arguments that unpack something. + + :type: list(Starred) + """ + args = self.args or [] + return [arg for arg in args if isinstance(arg, Starred)] + + @property + def kwargs(self): + """The keyword arguments that unpack something. + + :type: list(Keyword) + """ + keywords = self.keywords or [] + return [keyword for keyword in keywords if keyword.arg is None] + + def get_children(self): + yield self.func + + yield from self.args + + yield from self.keywords or () + + +class Compare(NodeNG): + """Class representing an :class:`ast.Compare` node. + + A :class:`Compare` node indicates a comparison. + + >>> node = astroid.extract_node('a <= b <= c') + >>> node + + >>> node.ops + [('<=', ), ('<=', )] + """ + _astroid_fields = ('left', 'ops',) + left = None + """The value at the left being applied to a comparison operator. + + :type: NodeNG or None + """ + ops = None + """The remainder of the operators and their relevant right hand value. + + :type: list(tuple(str, NodeNG)) or None + """ + + def postinit(self, left=None, ops=None): + """Do some setup after initialisation. + + :param left: The value at the left being applied to a comparison + operator. + :type left: NodeNG or None + + :param ops: The remainder of the operators + and their relevant right hand value. + :type ops: list(tuple(str, NodeNG)) or None + """ + self.left = left + self.ops = ops + + def get_children(self): + """Get the child nodes below this node. + + Overridden to handle the tuple fields and skip returning the operator + strings. + + :returns: The children. + :rtype: iterable(NodeNG) + """ + yield self.left + for _, comparator in self.ops: + yield comparator # we don't want the 'op' + + def last_child(self): + """An optimized version of list(get_children())[-1] + + :returns: The last child. + :rtype: NodeNG + """ + # XXX maybe if self.ops: + return self.ops[-1][1] + #return self.left + + +class Comprehension(NodeNG): + """Class representing an :class:`ast.comprehension` node. + + A :class:`Comprehension` indicates the loop inside any type of + comprehension including generator expressions. + + >>> node = astroid.extract_node('[x for x in some_values]') + >>> list(node.get_children()) + [, ] + >>> list(node.get_children())[1].as_string() + 'for x in some_values' + """ + _astroid_fields = ('target', 'iter', 'ifs') + _other_fields = ('is_async',) + target = None + """What is assigned to by the comprehension. + + :type: NodeNG or None + """ + iter = None + """What is iterated over by the comprehension. + + :type: NodeNG or None + """ + ifs = None + """The contents of any if statements that filter the comprehension. + + :type: list(NodeNG) or None + """ + is_async = None + """Whether this is an asynchronous comprehension or not. + + :type: bool or None + """ + + def __init__(self, parent=None): + """ + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + super(Comprehension, self).__init__() + self.parent = parent + + # pylint: disable=redefined-builtin; same name as builtin ast module. + def postinit(self, target=None, iter=None, ifs=None, is_async=None): + """Do some setup after initialisation. + + :param target: What is assigned to by the comprehension. + :type target: NodeNG or None + + :param iter: What is iterated over by the comprehension. + :type iter: NodeNG or None + + :param ifs: The contents of any if statements that filter + the comprehension. + :type ifs: list(NodeNG) or None + + :param is_async: Whether this is an asynchronous comprehension or not. + :type: bool or None + """ + self.target = target + self.iter = iter + self.ifs = ifs + self.is_async = is_async + + optional_assign = True + """Whether this node optionally assigns a variable. + + :type: bool + """ + def assign_type(self): + """The type of assignment that this node performs. + + :returns: The assignment type. + :rtype: NodeNG + """ + return self + + def _get_filtered_stmts(self, lookup_node, node, stmts, mystmt): + """method used in filter_stmts""" + if self is mystmt: + if isinstance(lookup_node, (Const, Name)): + return [lookup_node], True + + elif self.statement() is mystmt: + # original node's statement is the assignment, only keeps + # current node (gen exp, list comp) + + return [node], True + + return stmts, False + + def get_children(self): + yield self.target + yield self.iter + + yield from self.ifs + + +class Const(mixins.NoChildrenMixin, NodeNG, bases.Instance): + """Class representing any constant including num, str, bool, None, bytes. + + >>> node = astroid.extract_node('(5, "This is a string.", True, None, b"bytes")') + >>> node + + >>> list(node.get_children()) + [, + , + , + , + ] + """ + _other_fields = ('value',) + + def __init__(self, value, lineno=None, col_offset=None, parent=None): + """ + :param value: The value that the constant represents. + :type value: object + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.value = value + """The value that the constant represents. + + :type: object + """ + + super(Const, self).__init__(lineno, col_offset, parent) + + def __getattr__(self, name): + # This is needed because of Proxy's __getattr__ method. + # Calling object.__new__ on this class without calling + # __init__ would result in an infinite loop otherwise + # since __getattr__ is called when an attribute doesn't + # exist and self._proxied indirectly calls self.value + # and Proxy __getattr__ calls self.value + if name == "value": + raise AttributeError + return super().__getattr__(name) + + def getitem(self, index, context=None): + """Get an item from this node if subscriptable. + + :param index: The node to use as a subscript index. + :type index: Const or Slice + + :raises AstroidTypeError: When the given index cannot be used as a + subscript index, or if this node is not subscriptable. + """ + if isinstance(index, Const): + index_value = index.value + elif isinstance(index, Slice): + index_value = _infer_slice(index, context=context) + + else: + raise exceptions.AstroidTypeError( + 'Could not use type {} as subscript index'.format(type(index)) + ) + + try: + if isinstance(self.value, (str, bytes)): + return Const(self.value[index_value]) + except IndexError as exc: + raise exceptions.AstroidIndexError( + message='Index {index!r} out of range', + node=self, index=index, context=context) from exc + except TypeError as exc: + raise exceptions.AstroidTypeError( + message='Type error {error!r}', + node=self, index=index, context=context) from exc + + raise exceptions.AstroidTypeError( + '%r (value=%s)' % (self, self.value) + ) + + def has_dynamic_getattr(self): + """Check if the node has a custom __getattr__ or __getattribute__. + + :returns: True if the class has a custom + __getattr__ or __getattribute__, False otherwise. + For a :class:`Const` this is always ``False``. + :rtype: bool + """ + return False + + def itered(self): + """An iterator over the elements this node contains. + + :returns: The contents of this node. + :rtype: iterable(str) + + :raises TypeError: If this node does not represent something that is iterable. + """ + if isinstance(self.value, str): + return self.value + raise TypeError() + + def pytype(self): + """Get the name of the type that this node represents. + + :returns: The name of the type. + :rtype: str + """ + return self._proxied.qname() + + def bool_value(self): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + :rtype: bool + """ + return bool(self.value) + + +class Continue(mixins.NoChildrenMixin, Statement): + """Class representing an :class:`ast.Continue` node. + + >>> node = astroid.extract_node('continue') + >>> node + + """ + + +class Decorators(NodeNG): + """A node representing a list of decorators. + + A :class:`Decorators` is the decorators that are applied to + a method or function. + + >>> node = astroid.extract_node(''' + @property + def my_property(self): + return 3 + ''') + >>> node + + >>> list(node.get_children())[0] + + """ + _astroid_fields = ('nodes',) + nodes = None + """The decorators that this node contains. + + :type: list(Name or Call) or None + """ + + def postinit(self, nodes): + """Do some setup after initialisation. + + :param nodes: The decorators that this node contains. + :type nodes: list(Name or Call) + """ + self.nodes = nodes + + def scope(self): + """The first parent node defining a new scope. + + :returns: The first parent scope node. + :rtype: Module or FunctionDef or ClassDef or Lambda or GenExpr + """ + # skip the function node to go directly to the upper level scope + return self.parent.parent.scope() + + def get_children(self): + yield from self.nodes + + +class DelAttr(mixins.ParentAssignTypeMixin, NodeNG): + """Variation of :class:`ast.Delete` representing deletion of an attribute. + + >>> node = astroid.extract_node('del self.attr') + >>> node + + >>> list(node.get_children())[0] + + """ + _astroid_fields = ('expr',) + _other_fields = ('attrname',) + expr = None + """The name that this node represents. + + :type: Name or None + """ + + def __init__(self, attrname=None, lineno=None, col_offset=None, parent=None): + """ + :param attrname: The name of the attribute that is being deleted. + :type attrname: str or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.attrname = attrname + """The name of the attribute that is being deleted. + + :type: str or None + """ + + super(DelAttr, self).__init__(lineno, col_offset, parent) + + def postinit(self, expr=None): + """Do some setup after initialisation. + + :param expr: The name that this node represents. + :type expr: Name or None + """ + self.expr = expr + + def get_children(self): + yield self.expr + + +class Delete(mixins.AssignTypeMixin, Statement): + """Class representing an :class:`ast.Delete` node. + + A :class:`Delete` is a ``del`` statement this is deleting something. + + >>> node = astroid.extract_node('del self.attr') + >>> node + + """ + _astroid_fields = ('targets',) + targets = None + """What is being deleted. + + :type: list(NodeNG) or None + """ + + def postinit(self, targets=None): + """Do some setup after initialisation. + + :param targets: What is being deleted. + :type targets: list(NodeNG) or None + """ + self.targets = targets + + def get_children(self): + yield from self.targets + + +class Dict(NodeNG, bases.Instance): + """Class representing an :class:`ast.Dict` node. + + A :class:`Dict` is a dictionary that is created with ``{}`` syntax. + + >>> node = astroid.extract_node('{1: "1"}') + >>> node + + """ + _astroid_fields = ('items',) + + def __init__(self, lineno=None, col_offset=None, parent=None): + """ + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.items = [] + """The key-value pairs contained in the dictionary. + + :type: list(tuple(NodeNG, NodeNG)) + """ + + super(Dict, self).__init__(lineno, col_offset, parent) + + def postinit(self, items): + """Do some setup after initialisation. + + :param items: The key-value pairs contained in the dictionary. + :type items: list(tuple(NodeNG, NodeNG)) + """ + self.items = items + + @classmethod + def from_constants(cls, items=None): + """Create a :class:`Dict` of constants from a live dictionary. + + :param items: The items to store in the node. + :type items: dict + + :returns: The created dictionary node. + :rtype: Dict + """ + node = cls() + if items is None: + node.items = [] + else: + node.items = [(const_factory(k), const_factory(v)) + for k, v in items.items()] + return node + + def pytype(self): + """Get the name of the type that this node represents. + + :returns: The name of the type. + :rtype: str + """ + return '%s.dict' % BUILTINS + + def get_children(self): + """Get the key and value nodes below this node. + + Children are returned in the order that they are defined in the source + code, key first then the value. + + :returns: The children. + :rtype: iterable(NodeNG) + """ + for key, value in self.items: + yield key + yield value + + def last_child(self): + """An optimized version of list(get_children())[-1] + + :returns: The last child, or None if no children exist. + :rtype: NodeNG or None + """ + if self.items: + return self.items[-1][1] + return None + + def itered(self): + """An iterator over the keys this node contains. + + :returns: The keys of this node. + :rtype: iterable(NodeNG) + """ + return [key for (key, _) in self.items] + + def getitem(self, index, context=None): + """Get an item from this node. + + :param index: The node to use as a subscript index. + :type index: Const or Slice + + :raises AstroidTypeError: When the given index cannot be used as a + subscript index, or if this node is not subscriptable. + :raises AstroidIndexError: If the given index does not exist in the + dictionary. + """ + for key, value in self.items: + # TODO(cpopa): no support for overriding yet, {1:2, **{1: 3}}. + if isinstance(key, DictUnpack): + try: + return value.getitem(index, context) + except (exceptions.AstroidTypeError, exceptions.AstroidIndexError): + continue + for inferredkey in key.infer(context): + if inferredkey is util.Uninferable: + continue + if isinstance(inferredkey, Const) and isinstance(index, Const): + if inferredkey.value == index.value: + return value + + raise exceptions.AstroidIndexError(index) + + def bool_value(self): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + :rtype: bool + """ + return bool(self.items) + + +class Expr(Statement): + """Class representing an :class:`ast.Expr` node. + + An :class:`Expr` is any expression that does not have its value used or + stored. + + >>> node = astroid.extract_node('method()') + >>> node + + >>> node.parent + + """ + _astroid_fields = ('value',) + value = None + """What the expression does. + + :type: NodeNG or None + """ + + def postinit(self, value=None): + """Do some setup after initialisation. + + :param value: What the expression does. + :type value: NodeNG or None + """ + self.value = value + + def get_children(self): + yield self.value + + def _get_yield_nodes_skip_lambdas(self): + if not self.value.is_lambda: + yield from self.value._get_yield_nodes_skip_lambdas() + + +class Ellipsis(mixins.NoChildrenMixin, NodeNG): # pylint: disable=redefined-builtin + """Class representing an :class:`ast.Ellipsis` node. + + An :class:`Ellipsis` is the ``...`` syntax. + + >>> node = astroid.extract_node('...') + >>> node + + """ + + def bool_value(self): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For an :class:`Ellipsis` this is always ``True``. + :rtype: bool + """ + return True + + +class EmptyNode(mixins.NoChildrenMixin, NodeNG): + """Holds an arbitrary object in the :attr:`LocalsDictNodeNG.locals`.""" + + object = None + + +class ExceptHandler(mixins.MultiLineBlockMixin, + mixins.AssignTypeMixin, Statement): + """Class representing an :class:`ast.ExceptHandler`. node. + + An :class:`ExceptHandler` is an ``except`` block on a try-except. + + >>> node = astroid.extract_node(''' + try: + do_something() + except Exception as error: + print("Error!") + ''') + >>> node + + >>> >>> node.handlers + [] + """ + _astroid_fields = ('type', 'name', 'body',) + _multi_line_block_fields = ('body',) + type = None + """The types that the block handles. + + :type: Tuple or NodeNG or None + """ + name = None + """The name that the caught exception is assigned to. + + :type: AssignName or None + """ + body = None + """The contents of the block. + + :type: list(NodeNG) or None + """ + + def get_children(self): + if self.type is not None: + yield self.type + + if self.name is not None: + yield self.name + + yield from self.body + + # pylint: disable=redefined-builtin; had to use the same name as builtin ast module. + def postinit(self, type=None, name=None, body=None): + """Do some setup after initialisation. + + :param type: The types that the block handles. + :type type: Tuple or NodeNG or None + + :param name: The name that the caught exception is assigned to. + :type name: AssignName or None + + :param body:The contents of the block. + :type body: list(NodeNG) or None + """ + self.type = type + self.name = name + self.body = body + + @decorators.cachedproperty + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + if self.name: + return self.name.tolineno + if self.type: + return self.type.tolineno + return self.lineno + + def catch(self, exceptions): # pylint: disable=redefined-outer-name + """Check if this node handles any of the given exceptions. + + If ``exceptions`` is empty, this will default to ``True``. + + :param exceptions: The name of the exceptions to check for. + :type exceptions: list(str) + """ + if self.type is None or exceptions is None: + return True + for node in self.type._get_name_nodes(): + if node.name in exceptions: + return True + return False + + +class Exec(Statement): + """Class representing the ``exec`` statement. + + >>> node = astroid.extract_node('exec "True"') + >>> node + + """ + _astroid_fields = ('expr', 'globals', 'locals',) + expr = None + """The expression to be executed. + + :type: NodeNG or None + """ + globals = None + """The globals dictionary to execute with. + + :type: NodeNG or None + """ + locals = None + """The locals dictionary to execute with. + + :type: NodeNG or None + """ + + # pylint: disable=redefined-builtin; had to use the same name as builtin ast module. + def postinit(self, expr=None, globals=None, locals=None): + """Do some setup after initialisation. + + :param expr: The expression to be executed. + :type expr: NodeNG or None + + :param globals:The globals dictionary to execute with. + :type globals: NodeNG or None + + :param locals: The locals dictionary to execute with. + :type locals: NodeNG or None + """ + self.expr = expr + self.globals = globals + self.locals = locals + + +class ExtSlice(NodeNG): + """Class representing an :class:`ast.ExtSlice` node. + + An :class:`ExtSlice` is a complex slice expression. + + >>> node = astroid.extract_node('l[1:3, 5]') + >>> node + + >>> node.slice + + """ + _astroid_fields = ('dims',) + dims = None + """The simple dimensions that form the complete slice. + + :type: list(NodeNG) or None + """ + + def postinit(self, dims=None): + """Do some setup after initialisation. + + :param dims: The simple dimensions that form the complete slice. + :type dims: list(NodeNG) or None + """ + self.dims = dims + + +class For(mixins.MultiLineBlockMixin, mixins.BlockRangeMixIn, + mixins.AssignTypeMixin, Statement): + """Class representing an :class:`ast.For` node. + + >>> node = astroid.extract_node('for thing in things: print(thing)') + >>> node + + """ + _astroid_fields = ('target', 'iter', 'body', 'orelse',) + _other_other_fields = ('type_annotation',) + _multi_line_block_fields = ('body', 'orelse') + target = None + """What the loop assigns to. + + :type: NodeNG or None + """ + iter = None + """What the loop iterates over. + + :type: NodeNG or None + """ + body = None + """The contents of the body of the loop. + + :type: list(NodeNG) or None + """ + orelse = None + """The contents of the ``else`` block of the loop. + + :type: list(NodeNG) or None + """ + type_annotation = None + """If present, this will contain the type annotation passed by a type comment + + :type: NodeNG or None + """ + + # pylint: disable=redefined-builtin; had to use the same name as builtin ast module. + def postinit(self, target=None, iter=None, body=None, orelse=None, type_annotation=None): + """Do some setup after initialisation. + + :param target: What the loop assigns to. + :type target: NodeNG or None + + :param iter: What the loop iterates over. + :type iter: NodeNG or None + + :param body: The contents of the body of the loop. + :type body: list(NodeNG) or None + + :param orelse: The contents of the ``else`` block of the loop. + :type orelse: list(NodeNG) or None + """ + self.target = target + self.iter = iter + self.body = body + self.orelse = orelse + self.type_annotation = type_annotation + + optional_assign = True + """Whether this node optionally assigns a variable. + + This is always ``True`` for :class:`For` nodes. + + :type: bool + """ + + @decorators.cachedproperty + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + return self.iter.tolineno + + def get_children(self): + yield self.target + yield self.iter + + yield from self.body + yield from self.orelse + + +class AsyncFor(For): + """Class representing an :class:`ast.AsyncFor` node. + + An :class:`AsyncFor` is an asynchronous :class:`For` built with + the ``async`` keyword. + + >>> node = astroid.extract_node(''' + async def func(things): + async for thing in things: + print(thing) + ''') + >>> node + + >>> node.body[0] + + """ + + +class Await(NodeNG): + """Class representing an :class:`ast.Await` node. + + An :class:`Await` is the ``await`` keyword. + + >>> node = astroid.extract_node(''' + async def func(things): + await other_func() + ''') + >>> node + + >>> node.body[0] + + >>> list(node.body[0].get_children())[0] + + """ + + _astroid_fields = ('value', ) + value = None + """What to wait for. + + :type: NodeNG or None + """ + + def postinit(self, value=None): + """Do some setup after initialisation. + + :param value: What to wait for. + :type value: NodeNG or None + """ + self.value = value + + def get_children(self): + yield self.value + + +class ImportFrom(mixins.NoChildrenMixin, mixins.ImportFromMixin, Statement): + """Class representing an :class:`ast.ImportFrom` node. + + >>> node = astroid.extract_node('from my_package import my_module') + >>> node + + """ + _other_fields = ('modname', 'names', 'level') + + def __init__(self, fromname, names, level=0, lineno=None, + col_offset=None, parent=None): + """ + :param fromname: The module that is being imported from. + :type fromname: str or None + + :param names: What is being imported from the module. + :type names: list(tuple(str, str or None)) + + :param level: The level of relative import. + :type level: int + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.modname = fromname + """The module that is being imported from. + + This is ``None`` for relative imports. + + :type: str or None + """ + + self.names = names + """What is being imported from the module. + + Each entry is a :class:`tuple` of the name being imported, + and the alias that the name is assigned to (if any). + + :type: list(tuple(str, str or None)) + """ + + self.level = level + """The level of relative import. + + Essentially this is the number of dots in the import. + This is always 0 for absolute imports. + + :type: int + """ + + super(ImportFrom, self).__init__(lineno, col_offset, parent) + + +class Attribute(NodeNG): + """Class representing an :class:`ast.Attribute` node.""" + _astroid_fields = ('expr',) + _other_fields = ('attrname',) + expr = None + """The name that this node represents. + + :type: Name or None + """ + + def __init__(self, attrname=None, lineno=None, col_offset=None, parent=None): + """ + :param attrname: The name of the attribute. + :type attrname: str or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.attrname = attrname + """The name of the attribute. + + :type: str or None + """ + + super(Attribute, self).__init__(lineno, col_offset, parent) + + def postinit(self, expr=None): + """Do some setup after initialisation. + + :param expr: The name that this node represents. + :type expr: Name or None + """ + self.expr = expr + + def get_children(self): + yield self.expr + + +class Global(mixins.NoChildrenMixin, Statement): + """Class representing an :class:`ast.Global` node. + + >>> node = astroid.extract_node('global a_global') + >>> node + + """ + _other_fields = ('names',) + + def __init__(self, names, lineno=None, col_offset=None, parent=None): + """ + :param names: The names being declared as global. + :type names: list(str) + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.names = names + """The names being declared as global. + + :type: list(str) + """ + + super(Global, self).__init__(lineno, col_offset, parent) + + def _infer_name(self, frame, name): + return name + + +class If(mixins.MultiLineBlockMixin, mixins.BlockRangeMixIn, Statement): + """Class representing an :class:`ast.If` node. + + >>> node = astroid.extract_node('if condition: print(True)') + >>> node + + """ + _astroid_fields = ('test', 'body', 'orelse') + _multi_line_block_fields = ('body', 'orelse') + test = None + """The condition that the statement tests. + + :type: NodeNG or None + """ + body = None + """The contents of the block. + + :type: list(NodeNG) or None + """ + orelse = None + """The contents of the ``else`` block. + + :type: list(NodeNG) or None + """ + + def postinit(self, test=None, body=None, orelse=None): + """Do some setup after initialisation. + + :param test: The condition that the statement tests. + :type test: NodeNG or None + + :param body: The contents of the block. + :type body: list(NodeNG) or None + + :param orelse: The contents of the ``else`` block. + :type orelse: list(NodeNG) or None + """ + self.test = test + self.body = body + self.orelse = orelse + + @decorators.cachedproperty + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + return self.test.tolineno + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: The line number to start the range at. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + starting at the given line number. + :rtype: tuple(int, int) + """ + if lineno == self.body[0].fromlineno: + return lineno, lineno + if lineno <= self.body[-1].tolineno: + return lineno, self.body[-1].tolineno + return self._elsed_block_range(lineno, self.orelse, + self.body[0].fromlineno - 1) + + def get_children(self): + yield self.test + + yield from self.body + yield from self.orelse + + def has_elif_block(self): + return len(self.orelse) == 1 and isinstance(self.orelse[0], If) + +class IfExp(NodeNG): + """Class representing an :class:`ast.IfExp` node. + + >>> node = astroid.extract_node('value if condition else other') + >>> node + + """ + _astroid_fields = ('test', 'body', 'orelse') + test = None + """The condition that the statement tests. + + :type: NodeNG or None + """ + body = None + """The contents of the block. + + :type: list(NodeNG) or None + """ + orelse = None + """The contents of the ``else`` block. + + :type: list(NodeNG) or None + """ + + def postinit(self, test=None, body=None, orelse=None): + """Do some setup after initialisation. + + :param test: The condition that the statement tests. + :type test: NodeNG or None + + :param body: The contents of the block. + :type body: list(NodeNG) or None + + :param orelse: The contents of the ``else`` block. + :type orelse: list(NodeNG) or None + """ + self.test = test + self.body = body + self.orelse = orelse + + def get_children(self): + yield self.test + yield self.body + yield self.orelse + + def op_left_associative(self): + # `1 if True else 2 if False else 3` is parsed as + # `1 if True else (2 if False else 3)` + return False + + +class Import(mixins.NoChildrenMixin, mixins.ImportFromMixin, Statement): + """Class representing an :class:`ast.Import` node. + + >>> node = astroid.extract_node('import astroid') + >>> node + + """ + _other_fields = ('names',) + + def __init__(self, names=None, lineno=None, col_offset=None, parent=None): + """ + :param names: The names being imported. + :type names: list(tuple(str, str or None)) or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.names = names + """The names being imported. + + Each entry is a :class:`tuple` of the name being imported, + and the alias that the name is assigned to (if any). + + :type: list(tuple(str, str or None)) or None + """ + + super(Import, self).__init__(lineno, col_offset, parent) + + +class Index(NodeNG): + """Class representing an :class:`ast.Index` node. + + An :class:`Index` is a simple subscript. + + >>> node = astroid.extract_node('things[1]') + >>> node + + >>> node.slice + + """ + _astroid_fields = ('value',) + value = None + """The value to subscript with. + + :type: NodeNG or None + """ + + def postinit(self, value=None): + """Do some setup after initialisation. + + :param value: The value to subscript with. + :type value: NodeNG or None + """ + self.value = value + + def get_children(self): + yield self.value + + +class Keyword(NodeNG): + """Class representing an :class:`ast.keyword` node. + + >>> node = astroid.extract_node('function(a_kwarg=True)') + >>> node + + >>> node.keywords + [] + """ + _astroid_fields = ('value',) + _other_fields = ('arg',) + value = None + """The value being assigned to the keyword argument. + + :type: NodeNG or None + """ + + def __init__(self, arg=None, lineno=None, col_offset=None, parent=None): + """ + :param arg: The argument being assigned to. + :type arg: Name or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.arg = arg + """The argument being assigned to. + + :type: Name or None + """ + + super(Keyword, self).__init__(lineno, col_offset, parent) + + def postinit(self, value=None): + """Do some setup after initialisation. + + :param value: The value being assigned to the ketword argument. + :type value: NodeNG or None + """ + self.value = value + + def get_children(self): + yield self.value + + +class List(_BaseContainer): + """Class representing an :class:`ast.List` node. + + >>> node = astroid.extract_node('[1, 2, 3]') + >>> node + + """ + _other_fields = ('ctx',) + + def __init__(self, ctx=None, lineno=None, + col_offset=None, parent=None): + """ + :param ctx: Whether the list is assigned to or loaded from. + :type ctx: Context or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.ctx = ctx + """Whether the list is assigned to or loaded from. + + :type: Context or None + """ + + super(List, self).__init__(lineno, col_offset, parent) + + def pytype(self): + """Get the name of the type that this node represents. + + :returns: The name of the type. + :rtype: str + """ + return '%s.list' % BUILTINS + + def getitem(self, index, context=None): + """Get an item from this node. + + :param index: The node to use as a subscript index. + :type index: Const or Slice + """ + return _container_getitem(self, self.elts, index, context=context) + + +class Nonlocal(mixins.NoChildrenMixin, Statement): + """Class representing an :class:`ast.Nonlocal` node. + + >>> node = astroid.extract_node(''' + def function(): + nonlocal var + ''') + >>> node + + >>> node.body[0] + + """ + _other_fields = ('names',) + + def __init__(self, names, lineno=None, col_offset=None, parent=None): + """ + :param names: The names being declared as not local. + :type names: list(str) + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.names = names + """The names being declared as not local. + + :type: list(str) + """ + + super(Nonlocal, self).__init__(lineno, col_offset, parent) + + def _infer_name(self, frame, name): + return name + + +class Pass(mixins.NoChildrenMixin, Statement): + """Class representing an :class:`ast.Pass` node. + + >>> node = astroid.extract_node('pass') + >>> node + + """ + + +class Print(Statement): + """Class representing an :class:`ast.Print` node. + + >>> node = astroid.extract_node('print "A message"') + >>> node + + """ + _astroid_fields = ('dest', 'values',) + dest = None + """Where to print to. + + :type: NodeNG or None + """ + values = None + """What to print. + + :type: list(NodeNG) or None + """ + + def __init__(self, nl=None, lineno=None, col_offset=None, parent=None): + """ + :param nl: Whether to print a new line. + :type nl: bool or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.nl = nl + """Whether to print a new line. + + :type: bool or None + """ + + super(Print, self).__init__(lineno, col_offset, parent) + + def postinit(self, dest=None, values=None): + """Do some setup after initialisation. + + :param dest: Where to print to. + :type dest: NodeNG or None + + :param values: What to print. + :type values: list(NodeNG) or None + """ + self.dest = dest + self.values = values + + +class Raise(Statement): + """Class representing an :class:`ast.Raise` node. + + >>> node = astroid.extract_node('raise RuntimeError("Something bad happened!")') + >>> node + + """ + exc = None + """What is being raised. + + :type: NodeNG or None + """ + _astroid_fields = ('exc', 'cause') + cause = None + """The exception being used to raise this one. + + :type: NodeNG or None + """ + + def postinit(self, exc=None, cause=None): + """Do some setup after initialisation. + + :param exc: What is being raised. + :type exc: NodeNG or None + + :param cause: The exception being used to raise this one. + :type cause: NodeNG or None + """ + self.exc = exc + self.cause = cause + + def raises_not_implemented(self): + """Check if this node raises a :class:`NotImplementedError`. + + :returns: True if this node raises a :class:`NotImplementedError`, + False otherwise. + :rtype: bool + """ + if not self.exc: + return False + for name in self.exc._get_name_nodes(): + if name.name == 'NotImplementedError': + return True + return False + + def get_children(self): + if self.exc is not None: + yield self.exc + + if self.cause is not None: + yield self.cause + + +class Return(Statement): + """Class representing an :class:`ast.Return` node. + + >>> node = astroid.extract_node('return True') + >>> node + + """ + _astroid_fields = ('value',) + value = None + """The value being returned. + + :type: NodeNG or None + """ + + def postinit(self, value=None): + """Do some setup after initialisation. + + :param value: The value being returned. + :type value: NodeNG or None + """ + self.value = value + + def get_children(self): + if self.value is not None: + yield self.value + + def is_tuple_return(self): + return isinstance(self.value, Tuple) + + def _get_return_nodes_skip_functions(self): + yield self + + +class Set(_BaseContainer): + """Class representing an :class:`ast.Set` node. + + >>> node = astroid.extract_node('{1, 2, 3}') + >>> node + + """ + + def pytype(self): + """Get the name of the type that this node represents. + + :returns: The name of the type. + :rtype: str + """ + return '%s.set' % BUILTINS + + +class Slice(NodeNG): + """Class representing an :class:`ast.Slice` node. + + >>> node = astroid.extract_node('things[1:3]') + >>> node + + >>> node.slice + + """ + _astroid_fields = ('lower', 'upper', 'step') + lower = None + """The lower index in the slice. + + :type: NodeNG or None + """ + upper = None + """The upper index in the slice. + + :type: NodeNG or None + """ + step = None + """The step to take between indexes. + + :type: NodeNG or None + """ + + def postinit(self, lower=None, upper=None, step=None): + """Do some setup after initialisation. + + :param lower: The lower index in the slice. + :value lower: NodeNG or None + + :param upper: The upper index in the slice. + :value upper: NodeNG or None + + :param step: The step to take between index. + :param step: NodeNG or None + """ + self.lower = lower + self.upper = upper + self.step = step + + def _wrap_attribute(self, attr): + """Wrap the empty attributes of the Slice in a Const node.""" + if not attr: + const = const_factory(attr) + const.parent = self + return const + return attr + + @decorators.cachedproperty + def _proxied(self): + builtins = MANAGER.astroid_cache[BUILTINS] + return builtins.getattr('slice')[0] + + def pytype(self): + """Get the name of the type that this node represents. + + :returns: The name of the type. + :rtype: str + """ + return '%s.slice' % BUILTINS + + def igetattr(self, attrname, context=None): + """Infer the possible values of the given attribute on the slice. + + :param attrname: The name of the attribute to infer. + :type attrname: str + + :returns: The inferred possible values. + :rtype: iterable(NodeNG) + """ + if attrname == 'start': + yield self._wrap_attribute(self.lower) + elif attrname == 'stop': + yield self._wrap_attribute(self.upper) + elif attrname == 'step': + yield self._wrap_attribute(self.step) + else: + yield from self.getattr(attrname, context=context) + + def getattr(self, attrname, context=None): + return self._proxied.getattr(attrname, context) + + def get_children(self): + if self.lower is not None: + yield self.lower + + if self.upper is not None: + yield self.upper + + if self.step is not None: + yield self.step + + +class Starred(mixins.ParentAssignTypeMixin, NodeNG): + """Class representing an :class:`ast.Starred` node. + + >>> node = astroid.extract_node('*args') + >>> node + + """ + _astroid_fields = ('value',) + _other_fields = ('ctx', ) + value = None + """What is being unpacked. + + :type: NodeNG or None + """ + + def __init__(self, ctx=None, lineno=None, col_offset=None, parent=None): + """ + :param ctx: Whether the list is assigned to or loaded from. + :type ctx: Context or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.ctx = ctx + """Whether the starred item is assigned to or loaded from. + + :type: Context or None + """ + + super(Starred, self).__init__(lineno=lineno, + col_offset=col_offset, parent=parent) + + def postinit(self, value=None): + """Do some setup after initialisation. + + :param value: What is being unpacked. + :type value: NodeNG or None + """ + self.value = value + + def get_children(self): + yield self.value + + +class Subscript(NodeNG): + """Class representing an :class:`ast.Subscript` node. + + >>> node = astroid.extract_node('things[1:3]') + >>> node + + """ + _astroid_fields = ('value', 'slice') + _other_fields = ('ctx', ) + value = None + """What is being indexed. + + :type: NodeNG or None + """ + slice = None + """The slice being used to lookup. + + :type: NodeNG or None + """ + + def __init__(self, ctx=None, lineno=None, col_offset=None, parent=None): + """ + :param ctx: Whether the subscripted item is assigned to or loaded from. + :type ctx: Context or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.ctx = ctx + """Whether the subscripted item is assigned to or loaded from. + + :type: Context or None + """ + + super(Subscript, self).__init__(lineno=lineno, + col_offset=col_offset, parent=parent) + + # pylint: disable=redefined-builtin; had to use the same name as builtin ast module. + def postinit(self, value=None, slice=None): + """Do some setup after initialisation. + + :param value: What is being indexed. + :type value: NodeNG or None + + :param slice: The slice being used to lookup. + :type slice: NodeNG or None + """ + self.value = value + self.slice = slice + + def get_children(self): + yield self.value + yield self.slice + + +class TryExcept(mixins.MultiLineBlockMixin, mixins.BlockRangeMixIn, Statement): + """Class representing an :class:`ast.TryExcept` node. + + >>> node = astroid.extract_node(''' + try: + do_something() + except Exception as error: + print("Error!") + ''') + >>> node + + """ + _astroid_fields = ('body', 'handlers', 'orelse',) + _multi_line_block_fields = ('body', 'handlers', 'orelse') + body = None + """The contents of the block to catch exceptions from. + + :type: list(NodeNG) or None + """ + handlers = None + """The exception handlers. + + :type: list(ExceptHandler) or None + """ + orelse = None + """The contents of the ``else`` block. + + :type: list(NodeNG) or None + """ + + def postinit(self, body=None, handlers=None, orelse=None): + """Do some setup after initialisation. + + :param body: The contents of the block to catch exceptions from. + :type body: list(NodeNG) or None + + :param handlers: The exception handlers. + :type handlers: list(ExceptHandler) or None + + :param orelse: The contents of the ``else`` block. + :type orelse: list(NodeNG) or None + """ + self.body = body + self.handlers = handlers + self.orelse = orelse + + def _infer_name(self, frame, name): + return name + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: The line number to start the range at. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + starting at the given line number. + :rtype: tuple(int, int) + """ + last = None + for exhandler in self.handlers: + if exhandler.type and lineno == exhandler.type.fromlineno: + return lineno, lineno + if exhandler.body[0].fromlineno <= lineno <= exhandler.body[-1].tolineno: + return lineno, exhandler.body[-1].tolineno + if last is None: + last = exhandler.body[0].fromlineno - 1 + return self._elsed_block_range(lineno, self.orelse, last) + + def get_children(self): + yield from self.body + + yield from self.handlers or () + yield from self.orelse or () + + +class TryFinally(mixins.MultiLineBlockMixin, + mixins.BlockRangeMixIn, Statement): + """Class representing an :class:`ast.TryFinally` node. + + >>> node = astroid.extract_node(''' + try: + do_something() + except Exception as error: + print("Error!") + finally: + print("Cleanup!") + ''') + >>> node + + """ + _astroid_fields = ('body', 'finalbody',) + _multi_line_block_fields = ('body', 'finalbody') + body = None + """The try-except that the finally is attached to. + + :type: list(TryExcept) or None + """ + finalbody = None + """The contents of the ``finally`` block. + + :type: list(NodeNG) or None + """ + + def postinit(self, body=None, finalbody=None): + """Do some setup after initialisation. + + :param body: The try-except that the finally is attached to. + :type body: list(TryExcept) or None + + :param finalbody: The contents of the ``finally`` block. + :type finalbody: list(NodeNG) or None + """ + self.body = body + self.finalbody = finalbody + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: The line number to start the range at. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + starting at the given line number. + :rtype: tuple(int, int) + """ + child = self.body[0] + # py2.5 try: except: finally: + if (isinstance(child, TryExcept) and child.fromlineno == self.fromlineno + and lineno > self.fromlineno and lineno <= child.tolineno): + return child.block_range(lineno) + return self._elsed_block_range(lineno, self.finalbody) + + def get_children(self): + yield from self.body + yield from self.finalbody + + +class Tuple(_BaseContainer): + """Class representing an :class:`ast.Tuple` node. + + >>> node = astroid.extract_node('(1, 2, 3)') + >>> node + + """ + + _other_fields = ('ctx',) + + def __init__(self, ctx=None, lineno=None, + col_offset=None, parent=None): + """ + :param ctx: Whether the tuple is assigned to or loaded from. + :type ctx: Context or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.ctx = ctx + """Whether the tuple is assigned to or loaded from. + + :type: Context or None + """ + + super(Tuple, self).__init__(lineno, col_offset, parent) + + def pytype(self): + """Get the name of the type that this node represents. + + :returns: The name of the type. + :rtype: str + """ + return '%s.tuple' % BUILTINS + + def getitem(self, index, context=None): + """Get an item from this node. + + :param index: The node to use as a subscript index. + :type index: Const or Slice + """ + return _container_getitem(self, self.elts, index, context=context) + + +class UnaryOp(NodeNG): + """Class representing an :class:`ast.UnaryOp` node. + + >>> node = astroid.extract_node('-5') + >>> node + + """ + _astroid_fields = ('operand',) + _other_fields = ('op',) + operand = None + """What the unary operator is applied to. + + :type: NodeNG or None + """ + + def __init__(self, op=None, lineno=None, col_offset=None, parent=None): + """ + :param op: The operator. + :type: str or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.op = op + """The operator. + + :type: str or None + """ + + super(UnaryOp, self).__init__(lineno, col_offset, parent) + + def postinit(self, operand=None): + """Do some setup after initialisation. + + :param operand: What the unary operator is applied to. + :type operand: NodeNG or None + """ + self.operand = operand + + # This is set by inference.py + def _infer_unaryop(self, context=None): + raise NotImplementedError + + def type_errors(self, context=None): + """Get a list of type errors which can occur during inference. + + Each TypeError is represented by a :class:`BadBinaryOperationMessage`, + which holds the original exception. + + :returns: The list of possible type errors. + :rtype: list(BadBinaryOperationMessage) + """ + try: + results = self._infer_unaryop(context=context) + return [result for result in results + if isinstance(result, util.BadUnaryOperationMessage)] + except exceptions.InferenceError: + return [] + + def get_children(self): + yield self.operand + + def op_precedence(self): + if self.op == 'not': + return OP_PRECEDENCE[self.op] + + return super().op_precedence() + + +class While(mixins.MultiLineBlockMixin, mixins.BlockRangeMixIn, Statement): + """Class representing an :class:`ast.While` node. + + >>> node = astroid.extract_node(''' + while condition(): + print("True") + ''') + >>> node + + """ + _astroid_fields = ('test', 'body', 'orelse',) + _multi_line_block_fields = ('body', 'orelse') + test = None + """The condition that the loop tests. + + :type: NodeNG or None + """ + body = None + """The contents of the loop. + + :type: list(NodeNG) or None + """ + orelse = None + """The contents of the ``else`` block. + + :type: list(NodeNG) or None + """ + + def postinit(self, test=None, body=None, orelse=None): + """Do some setup after initialisation. + + :param test: The condition that the loop tests. + :type test: NodeNG or None + + :param body: The contents of the loop. + :type body: list(NodeNG) or None + + :param orelse: The contents of the ``else`` block. + :type orelse: list(NodeNG) or None + """ + self.test = test + self.body = body + self.orelse = orelse + + @decorators.cachedproperty + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + return self.test.tolineno + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: The line number to start the range at. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + starting at the given line number. + :rtype: tuple(int, int) + """ + return self. _elsed_block_range(lineno, self.orelse) + + def get_children(self): + yield self.test + + yield from self.body + yield from self.orelse + + +class With(mixins.MultiLineBlockMixin, mixins.BlockRangeMixIn, + mixins.AssignTypeMixin, Statement): + """Class representing an :class:`ast.With` node. + + >>> node = astroid.extract_node(''' + with open(file_path) as file_: + print(file_.read()) + ''') + >>> node + + """ + _astroid_fields = ('items', 'body',) + _other_other_fields = ('type_annotation',) + _multi_line_block_fields = ('body',) + items = None + """The pairs of context managers and the names they are assigned to. + + :type: list(tuple(NodeNG, AssignName or None)) or None + """ + body = None + """The contents of the ``with`` block. + + :type: list(NodeNG) or None + """ + type_annotation = None + """If present, this will contain the type annotation passed by a type comment + + :type: NodeNG or None + """ + + def postinit(self, items=None, body=None, type_annotation=None): + """Do some setup after initialisation. + + :param items: The pairs of context managers and the names + they are assigned to. + :type items: list(tuple(NodeNG, AssignName or None)) or None + + :param body: The contents of the ``with`` block. + :type body: list(NodeNG) or None + """ + self.items = items + self.body = body + self.type_annotation = type_annotation + + @decorators.cachedproperty + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + return self.items[-1][0].tolineno + + def get_children(self): + """Get the child nodes below this node. + + :returns: The children. + :rtype: iterable(NodeNG) + """ + for expr, var in self.items: + yield expr + if var: + yield var + yield from self.body + + +class AsyncWith(With): + """Asynchronous ``with`` built with the ``async`` keyword.""" + + +class Yield(NodeNG): + """Class representing an :class:`ast.Yield` node. + + >>> node = astroid.extract_node('yield True') + >>> node + + """ + _astroid_fields = ('value',) + value = None + """The value to yield. + + :type: NodeNG or None + """ + + def postinit(self, value=None): + """Do some setup after initialisation. + + :param value: The value to yield. + :type value: NodeNG or None + """ + self.value = value + + def get_children(self): + if self.value is not None: + yield self.value + + def _get_yield_nodes_skip_lambdas(self): + yield self + + +class YieldFrom(Yield): + """Class representing an :class:`ast.YieldFrom` node.""" + + +class DictUnpack(mixins.NoChildrenMixin, NodeNG): + """Represents the unpacking of dicts into dicts using :pep:`448`.""" + + +class FormattedValue(NodeNG): + """Class representing an :class:`ast.FormattedValue` node. + + Represents a :pep:`498` format string. + + >>> node = astroid.extract_node('f"Format {type_}"') + >>> node + + >>> node.values + [, ] + """ + _astroid_fields = ('value', 'format_spec') + value = None + """The value to be formatted into the string. + + :type: NodeNG or None + """ + conversion = None + """The type of formatting to be applied to the value. + + .. seealso:: + :class:`ast.FormattedValue` + + :type: int or None + """ + format_spec = None + """The formatting to be applied to the value. + + .. seealso:: + :class:`ast.FormattedValue` + + :type: JoinedStr or None + """ + + def postinit(self, value, conversion=None, format_spec=None): + """Do some setup after initialisation. + + :param value: The value to be formatted into the string. + :type value: NodeNG + + :param conversion: The type of formatting to be applied to the value. + :type conversion: int or None + + :param format_spec: The formatting to be applied to the value. + :type format_spec: JoinedStr or None + """ + self.value = value + self.conversion = conversion + self.format_spec = format_spec + + def get_children(self): + yield self.value + + if self.format_spec is not None: + yield self.format_spec + + +class JoinedStr(NodeNG): + """Represents a list of string expressions to be joined. + + >>> node = astroid.extract_node('f"Format {type_}"') + >>> node + + """ + _astroid_fields = ('values',) + values = None + """The string expressions to be joined. + + :type: list(FormattedValue or Const) or None + """ + + def postinit(self, values=None): + """Do some setup after initialisation. + + :param value: The string expressions to be joined. + + :type: list(FormattedValue or Const) or None + """ + self.values = values + + def get_children(self): + yield from self.values + + +class Unknown(mixins.AssignTypeMixin, NodeNG): + """This node represents a node in a constructed AST where + introspection is not possible. At the moment, it's only used in + the args attribute of FunctionDef nodes where function signature + introspection failed. + """ + name = "Unknown" + + def qname(self): + return "Unknown" + + def infer(self, context=None, **kwargs): + """Inference on an Unknown node immediately terminates.""" + yield util.Uninferable + + +# constants ############################################################## + +CONST_CLS = { + list: List, + tuple: Tuple, + dict: Dict, + set: Set, + type(None): Const, + type(NotImplemented): Const, + } + +def _update_const_classes(): + """update constant classes, so the keys of CONST_CLS can be reused""" + klasses = (bool, int, float, complex, str, bytes) + for kls in klasses: + CONST_CLS[kls] = Const +_update_const_classes() + + +def _two_step_initialization(cls, value): + instance = cls() + instance.postinit(value) + return instance + + +def _dict_initialization(cls, value): + if isinstance(value, dict): + value = tuple(value.items()) + return _two_step_initialization(cls, value) + + +_CONST_CLS_CONSTRUCTORS = { + List: _two_step_initialization, + Tuple: _two_step_initialization, + Dict: _dict_initialization, + Set: _two_step_initialization, + Const: lambda cls, value: cls(value) +} + + +def const_factory(value): + """return an astroid node for a python value""" + # XXX we should probably be stricter here and only consider stuff in + # CONST_CLS or do better treatment: in case where value is not in CONST_CLS, + # we should rather recall the builder on this value than returning an empty + # node (another option being that const_factory shouldn't be called with something + # not in CONST_CLS) + assert not isinstance(value, NodeNG) + + # Hack for ignoring elements of a sequence + # or a mapping, in order to avoid transforming + # each element to an AST. This is fixed in 2.0 + # and this approach is a temporary hack. + if isinstance(value, (list, set, tuple, dict)): + elts = [] + else: + elts = value + + try: + initializer_cls = CONST_CLS[value.__class__] + initializer = _CONST_CLS_CONSTRUCTORS[initializer_cls] + return initializer(initializer_cls, elts) + except (KeyError, AttributeError): + node = EmptyNode() + node.object = value + return node + + +def is_from_decorator(node): + """Return True if the given node is the child of a decorator""" + parent = node.parent + while parent is not None: + if isinstance(parent, Decorators): + return True + parent = parent.parent + return False diff --git a/venv/Lib/site-packages/astroid/nodes.py b/venv/Lib/site-packages/astroid/nodes.py new file mode 100644 index 00000000..eb20cc1a --- /dev/null +++ b/venv/Lib/site-packages/astroid/nodes.py @@ -0,0 +1,70 @@ +# Copyright (c) 2006-2011, 2013 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2010 Daniel Harding +# Copyright (c) 2014-2018 Claudiu Popa +# Copyright (c) 2014 Google, Inc. +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2016 Jared Garst +# Copyright (c) 2017 Ashley Whetter +# Copyright (c) 2017 rr- +# Copyright (c) 2018 Bryce Guinta + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Every available node class. + +.. seealso:: + :doc:`ast documentation ` + +All nodes inherit from :class:`~astroid.node_classes.NodeNG`. +""" +# pylint: disable=unused-import,redefined-builtin + +from astroid.node_classes import ( + Arguments, AssignAttr, Assert, Assign, AnnAssign, + AssignName, AugAssign, Repr, BinOp, BoolOp, Break, Call, Compare, + Comprehension, Const, Continue, Decorators, DelAttr, DelName, Delete, + Dict, Expr, Ellipsis, EmptyNode, ExceptHandler, Exec, ExtSlice, For, + ImportFrom, Attribute, Global, If, IfExp, Import, Index, Keyword, + List, Name, Nonlocal, Pass, Print, Raise, Return, Set, Slice, Starred, Subscript, + TryExcept, TryFinally, Tuple, UnaryOp, While, With, Yield, YieldFrom, + const_factory, + AsyncFor, Await, AsyncWith, + FormattedValue, JoinedStr, + # Node not present in the builtin ast module. + DictUnpack, + Unknown, +) +from astroid.scoped_nodes import ( + Module, GeneratorExp, Lambda, DictComp, + ListComp, SetComp, FunctionDef, ClassDef, + AsyncFunctionDef, +) + + + +ALL_NODE_CLASSES = ( + AsyncFunctionDef, AsyncFor, AsyncWith, Await, + + Arguments, AssignAttr, Assert, Assign, AnnAssign, AssignName, AugAssign, + Repr, BinOp, BoolOp, Break, + Call, ClassDef, Compare, Comprehension, Const, Continue, + Decorators, DelAttr, DelName, Delete, + Dict, DictComp, DictUnpack, Expr, + Ellipsis, EmptyNode, ExceptHandler, Exec, ExtSlice, + For, ImportFrom, FunctionDef, + Attribute, GeneratorExp, Global, + If, IfExp, Import, Index, + Keyword, + Lambda, List, ListComp, + Name, Nonlocal, + Module, + Pass, Print, + Raise, Return, + Set, SetComp, Slice, Starred, Subscript, + TryExcept, TryFinally, Tuple, + UnaryOp, + While, With, + Yield, YieldFrom, + FormattedValue, JoinedStr, + ) diff --git a/venv/Lib/site-packages/astroid/objects.py b/venv/Lib/site-packages/astroid/objects.py new file mode 100644 index 00000000..156ed520 --- /dev/null +++ b/venv/Lib/site-packages/astroid/objects.py @@ -0,0 +1,228 @@ +# Copyright (c) 2015-2016, 2018 Claudiu Popa +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2015 Florian Bruhin +# Copyright (c) 2016 Derek Gustafson +# Copyright (c) 2018 Bryce Guinta + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + + +""" +Inference objects are a way to represent composite AST nodes, +which are used only as inference results, so they can't be found in the +original AST tree. For instance, inferring the following frozenset use, +leads to an inferred FrozenSet: + + Call(func=Name('frozenset'), args=Tuple(...)) +""" + +import builtins + +from astroid import bases +from astroid import decorators +from astroid import exceptions +from astroid import MANAGER +from astroid import node_classes +from astroid import scoped_nodes +from astroid import util + + +BUILTINS = builtins.__name__ +objectmodel = util.lazy_import('interpreter.objectmodel') + + +class FrozenSet(node_classes._BaseContainer): + """class representing a FrozenSet composite node""" + + def pytype(self): + return '%s.frozenset' % BUILTINS + + def _infer(self, context=None): + yield self + + @decorators.cachedproperty + def _proxied(self): # pylint: disable=method-hidden + ast_builtins = MANAGER.astroid_cache[BUILTINS] + return ast_builtins.getattr('frozenset')[0] + + +class Super(node_classes.NodeNG): + """Proxy class over a super call. + + This class offers almost the same behaviour as Python's super, + which is MRO lookups for retrieving attributes from the parents. + + The *mro_pointer* is the place in the MRO from where we should + start looking, not counting it. *mro_type* is the object which + provides the MRO, it can be both a type or an instance. + *self_class* is the class where the super call is, while + *scope* is the function where the super call is. + """ + # pylint: disable=unnecessary-lambda + special_attributes = util.lazy_descriptor(lambda: objectmodel.SuperModel()) + + # pylint: disable=super-init-not-called + def __init__(self, mro_pointer, mro_type, self_class, scope): + self.type = mro_type + self.mro_pointer = mro_pointer + self._class_based = False + self._self_class = self_class + self._scope = scope + + def _infer(self, context=None): + yield self + + def super_mro(self): + """Get the MRO which will be used to lookup attributes in this super.""" + if not isinstance(self.mro_pointer, scoped_nodes.ClassDef): + raise exceptions.SuperError( + "The first argument to super must be a subtype of " + "type, not {mro_pointer}.", super_=self) + + if isinstance(self.type, scoped_nodes.ClassDef): + # `super(type, type)`, most likely in a class method. + self._class_based = True + mro_type = self.type + else: + mro_type = getattr(self.type, '_proxied', None) + if not isinstance(mro_type, (bases.Instance, scoped_nodes.ClassDef)): + raise exceptions.SuperError( + "The second argument to super must be an " + "instance or subtype of type, not {type}.", + super_=self) + + if not mro_type.newstyle: + raise exceptions.SuperError("Unable to call super on old-style classes.", super_=self) + + mro = mro_type.mro() + if self.mro_pointer not in mro: + raise exceptions.SuperError( + "The second argument to super must be an " + "instance or subtype of type, not {type}.", + super_=self) + + index = mro.index(self.mro_pointer) + return mro[index + 1:] + + @decorators.cachedproperty + def _proxied(self): + ast_builtins = MANAGER.astroid_cache[BUILTINS] + return ast_builtins.getattr('super')[0] + + def pytype(self): + return '%s.super' % BUILTINS + + def display_type(self): + return 'Super of' + + @property + def name(self): + """Get the name of the MRO pointer.""" + return self.mro_pointer.name + + def qname(self): + return "super" + + def igetattr(self, name, context=None): + """Retrieve the inferred values of the given attribute name.""" + + if name in self.special_attributes: + yield self.special_attributes.lookup(name) + return + + try: + mro = self.super_mro() + # Don't let invalid MROs or invalid super calls + # leak out as is from this function. + except exceptions.SuperError as exc: + raise exceptions.AttributeInferenceError( + ('Lookup for {name} on {target!r} because super call {super!r} ' + 'is invalid.'), + target=self, attribute=name, context=context, super_=exc.super_) from exc + except exceptions.MroError as exc: + raise exceptions.AttributeInferenceError( + ('Lookup for {name} on {target!r} failed because {cls!r} has an ' + 'invalid MRO.'), + target=self, attribute=name, context=context, mros=exc.mros, + cls=exc.cls) from exc + found = False + for cls in mro: + if name not in cls.locals: + continue + + found = True + for inferred in bases._infer_stmts([cls[name]], context, frame=self): + if not isinstance(inferred, scoped_nodes.FunctionDef): + yield inferred + continue + + # We can obtain different descriptors from a super depending + # on what we are accessing and where the super call is. + if inferred.type == 'classmethod': + yield bases.BoundMethod(inferred, cls) + elif self._scope.type == 'classmethod' and inferred.type == 'method': + yield inferred + elif self._class_based or inferred.type == 'staticmethod': + yield inferred + elif bases._is_property(inferred): + # TODO: support other descriptors as well. + try: + yield from inferred.infer_call_result(self, context) + except exceptions.InferenceError: + yield util.Uninferable + else: + yield bases.BoundMethod(inferred, cls) + + if not found: + raise exceptions.AttributeInferenceError(target=self, + attribute=name, + context=context) + + def getattr(self, name, context=None): + return list(self.igetattr(name, context=context)) + + +class ExceptionInstance(bases.Instance): + """Class for instances of exceptions + + It has special treatment for some of the exceptions's attributes, + which are transformed at runtime into certain concrete objects, such as + the case of .args. + """ + + # pylint: disable=unnecessary-lambda + special_attributes = util.lazy_descriptor(lambda: objectmodel.ExceptionInstanceModel()) + + +class DictInstance(bases.Instance): + """Special kind of instances for dictionaries + + This instance knows the underlying object model of the dictionaries, which means + that methods such as .values or .items can be properly inferred. + """ + + # pylint: disable=unnecessary-lambda + special_attributes = util.lazy_descriptor(lambda: objectmodel.DictModel()) + + +# Custom objects tailored for dictionaries, which are used to +# disambiguate between the types of Python 2 dict's method returns +# and Python 3 (where they return set like objects). +class DictItems(bases.Proxy): + __str__ = node_classes.NodeNG.__str__ + __repr__ = node_classes.NodeNG.__repr__ + + +class DictKeys(bases.Proxy): + __str__ = node_classes.NodeNG.__str__ + __repr__ = node_classes.NodeNG.__repr__ + + +class DictValues(bases.Proxy): + __str__ = node_classes.NodeNG.__str__ + __repr__ = node_classes.NodeNG.__repr__ + +# TODO: Hack to solve the circular import problem between node_classes and objects +# This is not needed in 2.0, which has a cleaner design overall +node_classes.Dict.__bases__ = (node_classes.NodeNG, DictInstance) diff --git a/venv/Lib/site-packages/astroid/protocols.py b/venv/Lib/site-packages/astroid/protocols.py new file mode 100644 index 00000000..91fe5a34 --- /dev/null +++ b/venv/Lib/site-packages/astroid/protocols.py @@ -0,0 +1,717 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2009-2011, 2013-2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2014-2018 Claudiu Popa +# Copyright (c) 2014 Google, Inc. +# Copyright (c) 2014 Eevee (Alex Munroe) +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2015 Dmitry Pribysh +# Copyright (c) 2016 Derek Gustafson +# Copyright (c) 2017-2018 Ashley Whetter +# Copyright (c) 2017 Łukasz Rogalski +# Copyright (c) 2017 rr- +# Copyright (c) 2018 Bryce Guinta +# Copyright (c) 2018 Nick Drozd +# Copyright (c) 2018 HoverHell + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""this module contains a set of functions to handle python protocols for nodes +where it makes sense. +""" + +import collections +import operator as operator_mod +import sys + +from astroid import Store +from astroid import arguments +from astroid import bases +from astroid import context as contextmod +from astroid import exceptions +from astroid import decorators +from astroid import node_classes +from astroid import helpers +from astroid import nodes +from astroid import util + +raw_building = util.lazy_import('raw_building') +objects = util.lazy_import('objects') + +def _reflected_name(name): + return "__r" + name[2:] + +def _augmented_name(name): + return "__i" + name[2:] + + +_CONTEXTLIB_MGR = 'contextlib.contextmanager' +BIN_OP_METHOD = {'+': '__add__', + '-': '__sub__', + '/': '__truediv__', + '//': '__floordiv__', + '*': '__mul__', + '**': '__pow__', + '%': '__mod__', + '&': '__and__', + '|': '__or__', + '^': '__xor__', + '<<': '__lshift__', + '>>': '__rshift__', + '@': '__matmul__' + } + +REFLECTED_BIN_OP_METHOD = { + key: _reflected_name(value) + for (key, value) in BIN_OP_METHOD.items() +} +AUGMENTED_OP_METHOD = { + key + "=": _augmented_name(value) + for (key, value) in BIN_OP_METHOD.items() +} + +UNARY_OP_METHOD = {'+': '__pos__', + '-': '__neg__', + '~': '__invert__', + 'not': None, # XXX not '__nonzero__' + } +_UNARY_OPERATORS = { + '+': operator_mod.pos, + '-': operator_mod.neg, + '~': operator_mod.invert, + 'not': operator_mod.not_, +} + + +def _infer_unary_op(obj, op): + func = _UNARY_OPERATORS[op] + value = func(obj) + return nodes.const_factory(value) + +nodes.Tuple.infer_unary_op = lambda self, op: _infer_unary_op(tuple(self.elts), op) +nodes.List.infer_unary_op = lambda self, op: _infer_unary_op(self.elts, op) +nodes.Set.infer_unary_op = lambda self, op: _infer_unary_op(set(self.elts), op) +nodes.Const.infer_unary_op = lambda self, op: _infer_unary_op(self.value, op) +nodes.Dict.infer_unary_op = lambda self, op: _infer_unary_op(dict(self.items), op) + +# Binary operations + +BIN_OP_IMPL = {'+': lambda a, b: a + b, + '-': lambda a, b: a - b, + '/': lambda a, b: a / b, + '//': lambda a, b: a // b, + '*': lambda a, b: a * b, + '**': lambda a, b: a ** b, + '%': lambda a, b: a % b, + '&': lambda a, b: a & b, + '|': lambda a, b: a | b, + '^': lambda a, b: a ^ b, + '<<': lambda a, b: a << b, + '>>': lambda a, b: a >> b, + } +if sys.version_info >= (3, 5): + # MatMult is available since Python 3.5+. + BIN_OP_IMPL['@'] = operator_mod.matmul + +for _KEY, _IMPL in list(BIN_OP_IMPL.items()): + BIN_OP_IMPL[_KEY + '='] = _IMPL + + +@decorators.yes_if_nothing_inferred +def const_infer_binary_op(self, opnode, operator, other, context, _): + not_implemented = nodes.Const(NotImplemented) + if isinstance(other, nodes.Const): + try: + impl = BIN_OP_IMPL[operator] + try: + yield nodes.const_factory(impl(self.value, other.value)) + except TypeError: + # ArithmeticError is not enough: float >> float is a TypeError + yield not_implemented + except Exception: # pylint: disable=broad-except + yield util.Uninferable + except TypeError: + yield not_implemented + elif isinstance(self.value, str) and operator == '%': + # TODO(cpopa): implement string interpolation later on. + yield util.Uninferable + else: + yield not_implemented + +nodes.Const.infer_binary_op = const_infer_binary_op + + +def _multiply_seq_by_int(self, opnode, other, context): + node = self.__class__(parent=opnode) + elts = [] + filtered_elts = (elt for elt in self.elts if elt is not util.Uninferable) + for elt in filtered_elts: + inferred = helpers.safe_infer(elt, context) + if inferred is None: + inferred = util.Uninferable + elts.append(inferred) + node.elts = elts * other.value + return node + + +def _filter_uninferable_nodes(elts, context): + for elt in elts: + if elt is util.Uninferable: + yield nodes.Unknown() + else: + for inferred in elt.infer(context): + if inferred is not util.Uninferable: + yield inferred + else: + yield nodes.Unknown() + + +@decorators.yes_if_nothing_inferred +def tl_infer_binary_op(self, opnode, operator, other, context, method): + not_implemented = nodes.Const(NotImplemented) + if isinstance(other, self.__class__) and operator == '+': + node = self.__class__(parent=opnode) + elts = list(_filter_uninferable_nodes(self.elts, context)) + elts += list(_filter_uninferable_nodes(other.elts, context)) + node.elts = elts + yield node + elif isinstance(other, nodes.Const) and operator == '*': + if not isinstance(other.value, int): + yield not_implemented + return + yield _multiply_seq_by_int(self, opnode, other, context) + elif isinstance(other, bases.Instance) and operator == '*': + # Verify if the instance supports __index__. + as_index = helpers.class_instance_as_index(other) + if not as_index: + yield util.Uninferable + else: + yield _multiply_seq_by_int(self, opnode, as_index, context) + else: + yield not_implemented + +nodes.Tuple.infer_binary_op = tl_infer_binary_op +nodes.List.infer_binary_op = tl_infer_binary_op + + +@decorators.yes_if_nothing_inferred +def instance_class_infer_binary_op(self, opnode, operator, other, context, method): + return method.infer_call_result(self, context) + +bases.Instance.infer_binary_op = instance_class_infer_binary_op +nodes.ClassDef.infer_binary_op = instance_class_infer_binary_op + + +# assignment ################################################################## + +"""the assigned_stmts method is responsible to return the assigned statement +(e.g. not inferred) according to the assignment type. + +The `asspath` argument is used to record the lhs path of the original node. +For instance if we want assigned statements for 'c' in 'a, (b,c)', asspath +will be [1, 1] once arrived to the Assign node. + +The `context` argument is the current inference context which should be given +to any intermediary inference necessary. +""" + +def _resolve_looppart(parts, asspath, context): + """recursive function to resolve multiple assignments on loops""" + asspath = asspath[:] + index = asspath.pop(0) + for part in parts: + if part is util.Uninferable: + continue + # XXX handle __iter__ and log potentially detected errors + if not hasattr(part, 'itered'): + continue + try: + itered = part.itered() + except TypeError: + continue # XXX log error + for stmt in itered: + index_node = nodes.Const(index) + try: + assigned = stmt.getitem(index_node, context) + except (AttributeError, + exceptions.AstroidTypeError, + exceptions.AstroidIndexError): + continue + if not asspath: + # we achieved to resolved the assignment path, + # don't infer the last part + yield assigned + elif assigned is util.Uninferable: + break + else: + # we are not yet on the last part of the path + # search on each possibly inferred value + try: + yield from _resolve_looppart(assigned.infer(context), asspath, context) + except exceptions.InferenceError: + break + +@decorators.raise_if_nothing_inferred +def for_assigned_stmts(self, node=None, context=None, asspath=None): + if isinstance(self, nodes.AsyncFor) or getattr(self, 'is_async', False): + # Skip inferring of async code for now + return dict(node=self, unknown=node, + assign_path=asspath, context=context) + if asspath is None: + for lst in self.iter.infer(context): + if isinstance(lst, (nodes.Tuple, nodes.List)): + yield from lst.elts + else: + yield from _resolve_looppart(self.iter.infer(context), asspath, context) + return dict(node=self, unknown=node, + assign_path=asspath, context=context) + +nodes.For.assigned_stmts = for_assigned_stmts +nodes.Comprehension.assigned_stmts = for_assigned_stmts + + +def sequence_assigned_stmts(self, node=None, context=None, asspath=None): + if asspath is None: + asspath = [] + try: + index = self.elts.index(node) + except ValueError as exc: + raise exceptions.InferenceError( + 'Tried to retrieve a node {node!r} which does not exist', + node=self, assign_path=asspath, context=context) from exc + + asspath.insert(0, index) + return self.parent.assigned_stmts(node=self, context=context, asspath=asspath) + +nodes.Tuple.assigned_stmts = sequence_assigned_stmts +nodes.List.assigned_stmts = sequence_assigned_stmts + + +def assend_assigned_stmts(self, node=None, context=None, asspath=None): + return self.parent.assigned_stmts(node=self, context=context) +nodes.AssignName.assigned_stmts = assend_assigned_stmts +nodes.AssignAttr.assigned_stmts = assend_assigned_stmts + + +def _arguments_infer_argname(self, name, context): + # arguments information may be missing, in which case we can't do anything + # more + if not (self.args or self.vararg or self.kwarg): + yield util.Uninferable + return + # first argument of instance/class method + if self.args and getattr(self.args[0], 'name', None) == name: + functype = self.parent.type + cls = self.parent.parent.scope() + is_metaclass = isinstance(cls, nodes.ClassDef) and cls.type == 'metaclass' + # If this is a metaclass, then the first argument will always + # be the class, not an instance. + if is_metaclass or functype == 'classmethod': + yield cls + return + if functype == 'method': + yield bases.Instance(self.parent.parent.frame()) + return + + if context and context.callcontext: + call_site = arguments.CallSite(context.callcontext, + context.extra_context) + for value in call_site.infer_argument(self.parent, name, context): + yield value + return + + if name == self.vararg: + vararg = nodes.const_factory(()) + vararg.parent = self + yield vararg + return + if name == self.kwarg: + kwarg = nodes.const_factory({}) + kwarg.parent = self + yield kwarg + return + # if there is a default value, yield it. And then yield Uninferable to reflect + # we can't guess given argument value + try: + context = contextmod.copy_context(context) + yield from self.default_value(name).infer(context) + yield util.Uninferable + except exceptions.NoDefault: + yield util.Uninferable + + +def arguments_assigned_stmts(self, node=None, context=None, asspath=None): + if context.callcontext: + # reset call context/name + callcontext = context.callcontext + context = contextmod.copy_context(context) + context.callcontext = None + args = arguments.CallSite(callcontext) + return args.infer_argument(self.parent, node.name, context) + return _arguments_infer_argname(self, node.name, context) + +nodes.Arguments.assigned_stmts = arguments_assigned_stmts + + +@decorators.raise_if_nothing_inferred +def assign_assigned_stmts(self, node=None, context=None, asspath=None): + if not asspath: + yield self.value + return None + yield from _resolve_asspart(self.value.infer(context), asspath, context) + + return dict(node=self, unknown=node, + assign_path=asspath, context=context) + + +def assign_annassigned_stmts(self, node=None, context=None, asspath=None): + for inferred in assign_assigned_stmts(self, node, context, asspath): + if inferred is None: + yield util.Uninferable + else: + yield inferred + +nodes.Assign.assigned_stmts = assign_assigned_stmts +nodes.AnnAssign.assigned_stmts = assign_annassigned_stmts +nodes.AugAssign.assigned_stmts = assign_assigned_stmts + + +def _resolve_asspart(parts, asspath, context): + """recursive function to resolve multiple assignments""" + asspath = asspath[:] + index = asspath.pop(0) + for part in parts: + assigned = None + if isinstance(part, nodes.Dict): + # A dictionary in an iterating context + try: + assigned, _ = part.items[index] + except IndexError: + return + + elif hasattr(part, 'getitem'): + index_node = nodes.Const(index) + try: + assigned = part.getitem(index_node, context) + # XXX raise a specific exception to avoid potential hiding of + # unexpected exception ? + except (exceptions.AstroidTypeError, exceptions.AstroidIndexError): + return + + if not assigned: + return + + if not asspath: + # we achieved to resolved the assignment path, don't infer the + # last part + yield assigned + elif assigned is util.Uninferable: + return + else: + # we are not yet on the last part of the path search on each + # possibly inferred value + try: + yield from _resolve_asspart(assigned.infer(context), asspath, context) + except exceptions.InferenceError: + return + + +@decorators.raise_if_nothing_inferred +def excepthandler_assigned_stmts(self, node=None, context=None, asspath=None): + for assigned in node_classes.unpack_infer(self.type): + if isinstance(assigned, nodes.ClassDef): + assigned = objects.ExceptionInstance(assigned) + + yield assigned + return dict(node=self, unknown=node, + assign_path=asspath, context=context) + + +nodes.ExceptHandler.assigned_stmts = excepthandler_assigned_stmts + + +def _infer_context_manager(self, mgr, context): + try: + inferred = next(mgr.infer(context=context)) + except (StopIteration, exceptions.InferenceError): + return + if isinstance(inferred, bases.Generator): + # Check if it is decorated with contextlib.contextmanager. + func = inferred.parent + if not func.decorators: + return + for decorator_node in func.decorators.nodes: + try: + decorator = next(decorator_node.infer(context)) + except StopIteration: + return + if isinstance(decorator, nodes.FunctionDef): + if decorator.qname() == _CONTEXTLIB_MGR: + break + else: + # It doesn't interest us. + return + + # Get the first yield point. If it has multiple yields, + # then a RuntimeError will be raised. + + possible_yield_points = func.nodes_of_class(nodes.Yield) + # Ignore yields in nested functions + yield_point = next((node for node in possible_yield_points + if node.scope() == func), + None) + if yield_point: + if not yield_point.value: + const = nodes.Const(None) + const.parent = yield_point + const.lineno = yield_point.lineno + yield const + else: + yield from yield_point.value.infer(context=context) + elif isinstance(inferred, bases.Instance): + try: + enter = next(inferred.igetattr('__enter__', context=context)) + except (StopIteration, exceptions.InferenceError, exceptions.AttributeInferenceError): + return + if not isinstance(enter, bases.BoundMethod): + return + if not context.callcontext: + context.callcontext = contextmod.CallContext(args=[inferred]) + yield from enter.infer_call_result(self, context) + + +@decorators.raise_if_nothing_inferred +def with_assigned_stmts(self, node=None, context=None, asspath=None): + """Infer names and other nodes from a *with* statement. + + This enables only inference for name binding in a *with* statement. + For instance, in the following code, inferring `func` will return + the `ContextManager` class, not whatever ``__enter__`` returns. + We are doing this intentionally, because we consider that the context + manager result is whatever __enter__ returns and what it is binded + using the ``as`` keyword. + + class ContextManager(object): + def __enter__(self): + return 42 + with ContextManager() as f: + pass + + # ContextManager().infer() will return ContextManager + # f.infer() will return 42. + + Arguments: + self: nodes.With + node: The target of the assignment, `as (a, b)` in `with foo as (a, b)`. + context: TODO + asspath: TODO + """ + try: + mgr = next(mgr for (mgr, vars) in self.items if vars == node) + except StopIteration: + return None + if asspath is None: + for result in _infer_context_manager(self, mgr, context): + yield result + else: + for result in _infer_context_manager(self, mgr, context): + # Walk the asspath and get the item at the final index. + obj = result + for index in asspath: + if not hasattr(obj, 'elts'): + raise exceptions.InferenceError( + 'Wrong type ({targets!r}) for {node!r} assignment', + node=self, targets=node, assign_path=asspath, + context=context) + try: + obj = obj.elts[index] + except IndexError as exc: + raise exceptions.InferenceError( + 'Tried to infer a nonexistent target with index {index} ' + 'in {node!r}.', node=self, targets=node, + assign_path=asspath, context=context) from exc + except TypeError as exc: + raise exceptions.InferenceError( + 'Tried to unpack a non-iterable value ' + 'in {node!r}.', node=self, targets=node, + assign_path=asspath, context=context) from exc + yield obj + return dict(node=self, unknown=node, + assign_path=asspath, context=context) + +nodes.With.assigned_stmts = with_assigned_stmts + + +@decorators.yes_if_nothing_inferred +def starred_assigned_stmts(self, node=None, context=None, asspath=None): + """ + Arguments: + self: nodes.Starred + node: TODO + context: TODO + asspath: TODO + """ + # pylint: disable=too-many-locals,too-many-branches,too-many-statements + def _determine_starred_iteration_lookups(starred, target, lookups): + # Determine the lookups for the rhs of the iteration + itered = target.itered() + for index, element in enumerate(itered): + if isinstance(element, nodes.Starred) and element.value.name == starred.value.name: + lookups.append((index, len(itered))) + break + if isinstance(element, nodes.Tuple): + lookups.append((index, len(element.itered()))) + _determine_starred_iteration_lookups(starred, element, lookups) + + stmt = self.statement() + if not isinstance(stmt, (nodes.Assign, nodes.For)): + raise exceptions.InferenceError('Statement {stmt!r} enclosing {node!r} ' + 'must be an Assign or For node.', + node=self, stmt=stmt, unknown=node, + context=context) + + if context is None: + context = contextmod.InferenceContext() + + if isinstance(stmt, nodes.Assign): + value = stmt.value + lhs = stmt.targets[0] + + if sum(1 for _ in lhs.nodes_of_class(nodes.Starred)) > 1: + raise exceptions.InferenceError('Too many starred arguments in the ' + ' assignment targets {lhs!r}.', + node=self, targets=lhs, + unknown=node, context=context) + + try: + rhs = next(value.infer(context)) + except exceptions.InferenceError: + yield util.Uninferable + return + if rhs is util.Uninferable or not hasattr(rhs, 'itered'): + yield util.Uninferable + return + + try: + elts = collections.deque(rhs.itered()) + except TypeError: + yield util.Uninferable + return + + # Unpack iteratively the values from the rhs of the assignment, + # until the find the starred node. What will remain will + # be the list of values which the Starred node will represent + # This is done in two steps, from left to right to remove + # anything before the starred node and from right to left + # to remove anything after the starred node. + + for index, left_node in enumerate(lhs.elts): + if not isinstance(left_node, nodes.Starred): + if not elts: + break + elts.popleft() + continue + lhs_elts = collections.deque(reversed(lhs.elts[index:])) + for right_node in lhs_elts: + if not isinstance(right_node, nodes.Starred): + if not elts: + break + elts.pop() + continue + # We're done + packed = nodes.List( + ctx=Store, + parent=self, + lineno=lhs.lineno, + col_offset=lhs.col_offset, + ) + packed.postinit(elts=elts) + yield packed + break + + if isinstance(stmt, nodes.For): + try: + inferred_iterable = next(stmt.iter.infer(context=context)) + except exceptions.InferenceError: + yield util.Uninferable + return + if inferred_iterable is util.Uninferable or not hasattr(inferred_iterable, 'itered'): + yield util.Uninferable + return + try: + itered = inferred_iterable.itered() + except TypeError: + yield util.Uninferable + return + + target = stmt.target + + if not isinstance(target, nodes.Tuple): + raise exceptions.InferenceError( + 'Could not make sense of this, the target must be a tuple', + context=context, + ) + + lookups = [] + _determine_starred_iteration_lookups(self, target, lookups) + if not lookups: + raise exceptions.InferenceError( + 'Could not make sense of this, needs at least a lookup', + context=context, + ) + + # Make the last lookup a slice, since that what we want for a Starred node + last_element_index, last_element_length = lookups[-1] + is_starred_last = last_element_index == (last_element_length - 1) + + lookup_slice = slice( + last_element_index, + None if is_starred_last else (last_element_length - last_element_index) + ) + lookups[-1] = lookup_slice + + for element in itered: + + # We probably want to infer the potential values *for each* element in an + # iterable, but we can't infer a list of all values, when only a list of + # step values are expected: + # + # for a, *b in [...]: + # b + # + # *b* should now point to just the elements at that particular iteration step, + # which astroid can't know about. + + found_element = None + for lookup in lookups: + if not hasattr(element, 'itered'): + break + if not isinstance(lookup, slice): + # Grab just the index, not the whole length + lookup = lookup[0] + try: + itered_inner_element = element.itered() + element = itered_inner_element[lookup] + except IndexError: + break + except TypeError: + # Most likely the itered() call failed, cannot make sense of this + yield util.Uninferable + return + else: + found_element = element + + unpacked = nodes.List( + ctx=Store, + parent=self, + lineno=self.lineno, + col_offset=self.col_offset, + ) + unpacked.postinit(elts=found_element or []) + yield unpacked + return + + yield util.Uninferable + + +nodes.Starred.assigned_stmts = starred_assigned_stmts diff --git a/venv/Lib/site-packages/astroid/raw_building.py b/venv/Lib/site-packages/astroid/raw_building.py new file mode 100644 index 00000000..1e437eac --- /dev/null +++ b/venv/Lib/site-packages/astroid/raw_building.py @@ -0,0 +1,419 @@ +# Copyright (c) 2006-2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2012 FELD Boris +# Copyright (c) 2014-2018 Claudiu Popa +# Copyright (c) 2014 Google, Inc. +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2015 Florian Bruhin +# Copyright (c) 2015 Ovidiu Sabou +# Copyright (c) 2016 Derek Gustafson +# Copyright (c) 2016 Jakub Wilk +# Copyright (c) 2018 Nick Drozd +# Copyright (c) 2018 Bryce Guinta + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""this module contains a set of functions to create astroid trees from scratch +(build_* functions) or from living object (object_build_* functions) +""" + +import builtins +import inspect +import logging +import os +import sys +import types + +from astroid import bases +from astroid import manager +from astroid import node_classes +from astroid import nodes + + +MANAGER = manager.AstroidManager() +# the keys of CONST_CLS eg python builtin types + +_CONSTANTS = tuple(node_classes.CONST_CLS) +_BUILTINS = vars(builtins) +_LOG = logging.getLogger(__name__) + + +def _io_discrepancy(member): + # _io module names itself `io`: http://bugs.python.org/issue18602 + member_self = getattr(member, '__self__', None) + return (member_self and + inspect.ismodule(member_self) and + member_self.__name__ == '_io' and + member.__module__ == 'io') + +def _attach_local_node(parent, node, name): + node.name = name # needed by add_local_node + parent.add_local_node(node) + + +def _add_dunder_class(func, member): + """Add a __class__ member to the given func node, if we can determine it.""" + python_cls = member.__class__ + cls_name = getattr(python_cls, '__name__', None) + if not cls_name: + return + cls_bases = [ancestor.__name__ for ancestor in python_cls.__bases__] + ast_klass = build_class(cls_name, cls_bases, python_cls.__doc__) + func.instance_attrs['__class__'] = [ast_klass] + + +_marker = object() + + +def attach_dummy_node(node, name, runtime_object=_marker): + """create a dummy node and register it in the locals of the given + node with the specified name + """ + enode = nodes.EmptyNode() + enode.object = runtime_object + _attach_local_node(node, enode, name) + +def _has_underlying_object(self): + return self.object is not None and self.object is not _marker + +nodes.EmptyNode.has_underlying_object = _has_underlying_object + +def attach_const_node(node, name, value): + """create a Const node and register it in the locals of the given + node with the specified name + """ + if name not in node.special_attributes: + _attach_local_node(node, nodes.const_factory(value), name) + +def attach_import_node(node, modname, membername): + """create a ImportFrom node and register it in the locals of the given + node with the specified name + """ + from_node = nodes.ImportFrom(modname, [(membername, None)]) + _attach_local_node(node, from_node, membername) + + +def build_module(name, doc=None): + """create and initialize an astroid Module node""" + node = nodes.Module(name, doc, pure_python=False) + node.package = False + node.parent = None + return node + + +def build_class(name, basenames=(), doc=None): + """create and initialize an astroid ClassDef node""" + node = nodes.ClassDef(name, doc) + for base in basenames: + basenode = nodes.Name() + basenode.name = base + node.bases.append(basenode) + basenode.parent = node + return node + + +def build_function(name, args=None, defaults=None, doc=None): + """create and initialize an astroid FunctionDef node""" + args, defaults = args or [], defaults or [] + # first argument is now a list of decorators + func = nodes.FunctionDef(name, doc) + func.args = argsnode = nodes.Arguments() + argsnode.args = [] + for arg in args: + argsnode.args.append(nodes.Name()) + argsnode.args[-1].name = arg + argsnode.args[-1].parent = argsnode + argsnode.defaults = [] + for default in defaults: + argsnode.defaults.append(nodes.const_factory(default)) + argsnode.defaults[-1].parent = argsnode + argsnode.kwarg = None + argsnode.vararg = None + argsnode.parent = func + if args: + register_arguments(func) + return func + + +def build_from_import(fromname, names): + """create and initialize an astroid ImportFrom import statement""" + return nodes.ImportFrom(fromname, [(name, None) for name in names]) + +def register_arguments(func, args=None): + """add given arguments to local + + args is a list that may contains nested lists + (i.e. def func(a, (b, c, d)): ...) + """ + if args is None: + args = func.args.args + if func.args.vararg: + func.set_local(func.args.vararg, func.args) + if func.args.kwarg: + func.set_local(func.args.kwarg, func.args) + for arg in args: + if isinstance(arg, nodes.Name): + func.set_local(arg.name, arg) + else: + register_arguments(func, arg.elts) + + +def object_build_class(node, member, localname): + """create astroid for a living class object""" + basenames = [base.__name__ for base in member.__bases__] + return _base_class_object_build(node, member, basenames, + localname=localname) + + +def object_build_function(node, member, localname): + """create astroid for a living function object""" + # pylint: disable=deprecated-method; completely removed in 2.0 + args, varargs, varkw, defaults = inspect.getargspec(member) + if varargs is not None: + args.append(varargs) + if varkw is not None: + args.append(varkw) + func = build_function(getattr(member, '__name__', None) or localname, args, + defaults, member.__doc__) + node.add_local_node(func, localname) + + +def object_build_datadescriptor(node, member, name): + """create astroid for a living data descriptor object""" + return _base_class_object_build(node, member, [], name) + + +def object_build_methoddescriptor(node, member, localname): + """create astroid for a living method descriptor object""" + # FIXME get arguments ? + func = build_function(getattr(member, '__name__', None) or localname, + doc=member.__doc__) + # set node's arguments to None to notice that we have no information, not + # and empty argument list + func.args.args = None + node.add_local_node(func, localname) + _add_dunder_class(func, member) + + +def _base_class_object_build(node, member, basenames, name=None, localname=None): + """create astroid for a living class object, with a given set of base names + (e.g. ancestors) + """ + klass = build_class(name or getattr(member, '__name__', None) or localname, + basenames, member.__doc__) + klass._newstyle = isinstance(member, type) + node.add_local_node(klass, localname) + try: + # limit the instantiation trick since it's too dangerous + # (such as infinite test execution...) + # this at least resolves common case such as Exception.args, + # OSError.errno + if issubclass(member, Exception): + instdict = member().__dict__ + else: + raise TypeError + except: # pylint: disable=bare-except + pass + else: + for item_name, obj in instdict.items(): + valnode = nodes.EmptyNode() + valnode.object = obj + valnode.parent = klass + valnode.lineno = 1 + klass.instance_attrs[item_name] = [valnode] + return klass + + +def _build_from_function(node, name, member, module): + # verify this is not an imported function + try: + code = member.__code__ + except AttributeError: + # Some implementations don't provide the code object, + # such as Jython. + code = None + filename = getattr(code, 'co_filename', None) + if filename is None: + assert isinstance(member, object) + object_build_methoddescriptor(node, member, name) + elif filename != getattr(module, '__file__', None): + attach_dummy_node(node, name, member) + else: + object_build_function(node, member, name) + + +class InspectBuilder: + """class for building nodes from living object + + this is actually a really minimal representation, including only Module, + FunctionDef and ClassDef nodes and some others as guessed. + """ + + # astroid from living objects ############################################### + + def __init__(self): + self._done = {} + self._module = None + + def inspect_build(self, module, modname=None, path=None): + """build astroid from a living module (i.e. using inspect) + this is used when there is no python source code available (either + because it's a built-in module or because the .py is not available) + """ + self._module = module + if modname is None: + modname = module.__name__ + try: + node = build_module(modname, module.__doc__) + except AttributeError: + # in jython, java modules have no __doc__ (see #109562) + node = build_module(modname) + node.file = node.path = os.path.abspath(path) if path else path + node.name = modname + MANAGER.cache_module(node) + node.package = hasattr(module, '__path__') + self._done = {} + self.object_build(node, module) + return node + + def object_build(self, node, obj): + """recursive method which create a partial ast from real objects + (only function, class, and method are handled) + """ + if obj in self._done: + return self._done[obj] + self._done[obj] = node + for name in dir(obj): + try: + member = getattr(obj, name) + except AttributeError: + # damned ExtensionClass.Base, I know you're there ! + attach_dummy_node(node, name) + continue + if inspect.ismethod(member): + member = member.__func__ + if inspect.isfunction(member): + _build_from_function(node, name, member, self._module) + elif inspect.isbuiltin(member): + if (not _io_discrepancy(member) and + self.imported_member(node, member, name)): + continue + object_build_methoddescriptor(node, member, name) + elif inspect.isclass(member): + if self.imported_member(node, member, name): + continue + if member in self._done: + class_node = self._done[member] + if class_node not in node.locals.get(name, ()): + node.add_local_node(class_node, name) + else: + class_node = object_build_class(node, member, name) + # recursion + self.object_build(class_node, member) + if name == '__class__' and class_node.parent is None: + class_node.parent = self._done[self._module] + elif inspect.ismethoddescriptor(member): + assert isinstance(member, object) + object_build_methoddescriptor(node, member, name) + elif inspect.isdatadescriptor(member): + assert isinstance(member, object) + object_build_datadescriptor(node, member, name) + elif isinstance(member, _CONSTANTS): + attach_const_node(node, name, member) + elif inspect.isroutine(member): + # This should be called for Jython, where some builtin + # methods aren't caught by isbuiltin branch. + _build_from_function(node, name, member, self._module) + else: + # create an empty node so that the name is actually defined + attach_dummy_node(node, name, member) + return None + + def imported_member(self, node, member, name): + """verify this is not an imported class or handle it""" + # /!\ some classes like ExtensionClass doesn't have a __module__ + # attribute ! Also, this may trigger an exception on badly built module + # (see http://www.logilab.org/ticket/57299 for instance) + try: + modname = getattr(member, '__module__', None) + except: # pylint: disable=bare-except + _LOG.exception('unexpected error while building ' + 'astroid from living object') + modname = None + if modname is None: + if name in ('__new__', '__subclasshook__'): + # Python 2.5.1 (r251:54863, Sep 1 2010, 22:03:14) + # >>> print object.__new__.__module__ + # None + modname = builtins.__name__ + else: + attach_dummy_node(node, name, member) + return True + + real_name = { + 'gtk': 'gtk_gtk', + '_io': 'io', + }.get(modname, modname) + + if real_name != self._module.__name__: + # check if it sounds valid and then add an import node, else use a + # dummy node + try: + getattr(sys.modules[modname], name) + except (KeyError, AttributeError): + attach_dummy_node(node, name, member) + else: + attach_import_node(node, modname, name) + return True + return False + + +### astroid bootstrapping ###################################################### +Astroid_BUILDER = InspectBuilder() + +_CONST_PROXY = {} +def _astroid_bootstrapping(astroid_builtin=None): + """astroid boot strapping the builtins module""" + # this boot strapping is necessary since we need the Const nodes to + # inspect_build builtins, and then we can proxy Const + if astroid_builtin is None: + astroid_builtin = Astroid_BUILDER.inspect_build(builtins) + + # pylint: disable=redefined-outer-name + for cls, node_cls in node_classes.CONST_CLS.items(): + if cls is type(None): + proxy = build_class('NoneType') + proxy.parent = astroid_builtin + elif cls is type(NotImplemented): + proxy = build_class('NotImplementedType') + proxy.parent = astroid_builtin + else: + proxy = astroid_builtin.getattr(cls.__name__)[0] + if cls in (dict, list, set, tuple): + node_cls._proxied = proxy + else: + _CONST_PROXY[cls] = proxy + +_astroid_bootstrapping() + +# TODO : find a nicer way to handle this situation; +def _set_proxied(const): + return _CONST_PROXY[const.value.__class__] +nodes.Const._proxied = property(_set_proxied) + +_GeneratorType = nodes.ClassDef(types.GeneratorType.__name__, types.GeneratorType.__doc__) +_GeneratorType.parent = MANAGER.astroid_cache[builtins.__name__] +bases.Generator._proxied = _GeneratorType +Astroid_BUILDER.object_build(bases.Generator._proxied, types.GeneratorType) + +_builtins = MANAGER.astroid_cache[builtins.__name__] +BUILTIN_TYPES = (types.GetSetDescriptorType, types.GeneratorType, + types.MemberDescriptorType, type(None), type(NotImplemented), + types.FunctionType, types.MethodType, + types.BuiltinFunctionType, types.ModuleType, types.TracebackType) +for _type in BUILTIN_TYPES: + if _type.__name__ not in _builtins: + cls = nodes.ClassDef(_type.__name__, _type.__doc__) + cls.parent = MANAGER.astroid_cache[builtins.__name__] + Astroid_BUILDER.object_build(cls, _type) + _builtins[_type.__name__] = cls diff --git a/venv/Lib/site-packages/astroid/rebuilder.py b/venv/Lib/site-packages/astroid/rebuilder.py new file mode 100644 index 00000000..c37128fa --- /dev/null +++ b/venv/Lib/site-packages/astroid/rebuilder.py @@ -0,0 +1,986 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2009-2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2013-2018 Claudiu Popa +# Copyright (c) 2013-2014 Google, Inc. +# Copyright (c) 2014 Alexander Presnyakov +# Copyright (c) 2014 Eevee (Alex Munroe) +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2016-2017 Derek Gustafson +# Copyright (c) 2016 Jared Garst +# Copyright (c) 2017 Hugo +# Copyright (c) 2017 Łukasz Rogalski +# Copyright (c) 2017 rr- +# Copyright (c) 2018 Nick Drozd +# Copyright (c) 2018 Bryce Guinta + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""this module contains utilities for rebuilding a _ast tree in +order to get a single Astroid representation +""" + +import sys + +import astroid +from astroid._ast import _parse, _get_parser_module, parse_function_type_comment +from astroid import nodes + + +CONST_NAME_TRANSFORMS = {'None': None, + 'True': True, + 'False': False, + } + +REDIRECT = {'arguments': 'Arguments', + 'comprehension': 'Comprehension', + "ListCompFor": 'Comprehension', + "GenExprFor": 'Comprehension', + 'excepthandler': 'ExceptHandler', + 'keyword': 'Keyword', + } +PY3 = sys.version_info >= (3, 0) +PY34 = sys.version_info >= (3, 4) +PY37 = sys.version_info >= (3, 7) + + +def _binary_operators_from_module(module): + binary_operators = { + module.Add: '+', + module.BitAnd: '&', + module.BitOr: '|', + module.BitXor: '^', + module.Div: '/', + module.FloorDiv: '//', + module.Mod: '%', + module.Mult: '*', + module.Pow: '**', + module.Sub: '-', + module.LShift: '<<', + module.RShift: '>>', + } + if sys.version_info >= (3, 5): + binary_operators[module.MatMult] = '@' + return binary_operators + + +def _bool_operators_from_module(module): + return { + module.And: 'and', + module.Or: 'or', + } + + +def _unary_operators_from_module(module): + return { + module.UAdd: '+', + module.USub: '-', + module.Not: 'not', + module.Invert: '~', + } + + +def _compare_operators_from_module(module): + return { + module.Eq: '==', + module.Gt: '>', + module.GtE: '>=', + module.In: 'in', + module.Is: 'is', + module.IsNot: 'is not', + module.Lt: '<', + module.LtE: '<=', + module.NotEq: '!=', + module.NotIn: 'not in', + } + + +def _contexts_from_module(module): + return { + module.Load: astroid.Load, + module.Store: astroid.Store, + module.Del: astroid.Del, + module.Param: astroid.Store, + } + + +def _visit_or_none(node, attr, visitor, parent, visit='visit', + **kws): + """If the given node has an attribute, visits the attribute, and + otherwise returns None. + + """ + value = getattr(node, attr, None) + if value: + return getattr(visitor, visit)(value, parent, **kws) + + return None + + +class TreeRebuilder: + """Rebuilds the _ast tree to become an Astroid tree""" + + def __init__(self, manager, parse_python_two: bool = False): + self._manager = manager + self._global_names = [] + self._import_from_nodes = [] + self._delayed_assattr = [] + self._visit_meths = {} + + # Configure the right classes for the right module + self._parser_module = _get_parser_module(parse_python_two=parse_python_two) + self._unary_op_classes = _unary_operators_from_module(self._parser_module) + self._cmp_op_classes = _compare_operators_from_module(self._parser_module) + self._bool_op_classes = _bool_operators_from_module(self._parser_module) + self._bin_op_classes = _binary_operators_from_module(self._parser_module) + self._context_classes = _contexts_from_module(self._parser_module) + + def _get_doc(self, node): + try: + if PY37 and hasattr(node, 'docstring'): + doc = node.docstring + return node, doc + if (node.body + and isinstance(node.body[0], self._parser_module.Expr) + and isinstance(node.body[0].value, self._parser_module.Str)): + doc = node.body[0].value.s + node.body = node.body[1:] + return node, doc + except IndexError: + pass # ast built from scratch + return node, None + + def _get_context(self, node): + return self._context_classes.get(type(node.ctx), astroid.Load) + + def visit_module(self, node, modname, modpath, package): + """visit a Module node by returning a fresh instance of it""" + node, doc = self._get_doc(node) + newnode = nodes.Module(name=modname, doc=doc, file=modpath, + path=[modpath], + package=package, parent=None) + newnode.postinit([self.visit(child, newnode) for child in node.body]) + return newnode + + def visit(self, node, parent): + cls = node.__class__ + if cls in self._visit_meths: + visit_method = self._visit_meths[cls] + else: + cls_name = cls.__name__ + visit_name = 'visit_' + REDIRECT.get(cls_name, cls_name).lower() + visit_method = getattr(self, visit_name) + self._visit_meths[cls] = visit_method + return visit_method(node, parent) + + def _save_assignment(self, node, name=None): + """save assignement situation since node.parent is not available yet""" + if self._global_names and node.name in self._global_names[-1]: + node.root().set_local(node.name, node) + else: + node.parent.set_local(node.name, node) + + def visit_arguments(self, node, parent): + """visit an Arguments node by returning a fresh instance of it""" + vararg, kwarg = node.vararg, node.kwarg + if PY34: + newnode = nodes.Arguments(vararg.arg if vararg else None, + kwarg.arg if kwarg else None, + parent) + else: + newnode = nodes.Arguments(vararg, kwarg, parent) + args = [self.visit(child, newnode) for child in node.args] + defaults = [self.visit(child, newnode) + for child in node.defaults] + varargannotation = None + kwargannotation = None + # change added in 82732 (7c5c678e4164), vararg and kwarg + # are instances of `_ast.arg`, not strings + if vararg: + if PY34: + if node.vararg.annotation: + varargannotation = self.visit(node.vararg.annotation, + newnode) + vararg = vararg.arg + if kwarg: + if PY34: + if node.kwarg.annotation: + kwargannotation = self.visit(node.kwarg.annotation, + newnode) + kwarg = kwarg.arg + if PY3: + kwonlyargs = [self.visit(child, newnode) for child + in node.kwonlyargs] + kw_defaults = [self.visit(child, newnode) if child else + None for child in node.kw_defaults] + annotations = [self.visit(arg.annotation, newnode) if + arg.annotation else None for arg in node.args] + kwonlyargs_annotations = [ + self.visit(arg.annotation, newnode) if arg.annotation else None + for arg in node.kwonlyargs + ] + else: + kwonlyargs = [] + kw_defaults = [] + annotations = [] + kwonlyargs_annotations = [] + + newnode.postinit( + args=args, + defaults=defaults, + kwonlyargs=kwonlyargs, + kw_defaults=kw_defaults, + annotations=annotations, + kwonlyargs_annotations=kwonlyargs_annotations, + varargannotation=varargannotation, + kwargannotation=kwargannotation + ) + # save argument names in locals: + if vararg: + newnode.parent.set_local(vararg, newnode) + if kwarg: + newnode.parent.set_local(kwarg, newnode) + return newnode + + def visit_assert(self, node, parent): + """visit a Assert node by returning a fresh instance of it""" + newnode = nodes.Assert(node.lineno, node.col_offset, parent) + if node.msg: + msg = self.visit(node.msg, newnode) + else: + msg = None + newnode.postinit(self.visit(node.test, newnode), msg) + return newnode + + def check_type_comment(self, node): + type_comment = getattr(node, 'type_comment', None) + if not type_comment: + return None + + try: + type_comment_ast = _parse(type_comment) + except SyntaxError: + # Invalid type comment, just skip it. + return None + + type_object = self.visit(type_comment_ast.body[0], node) + if not isinstance(type_object, nodes.Expr): + return None + + return type_object.value + + def check_function_type_comment(self, node): + type_comment = getattr(node, 'type_comment', None) + if not type_comment: + return None + + try: + type_comment_ast = parse_function_type_comment(type_comment) + except SyntaxError: + # Invalid type comment, just skip it. + return None + + returns = None + argtypes = [self.visit(elem, node) for elem in (type_comment_ast.argtypes or [])] + if type_comment_ast.returns: + returns = self.visit(type_comment_ast.returns, node) + + return returns, argtypes + + def visit_assign(self, node, parent): + """visit a Assign node by returning a fresh instance of it""" + type_annotation = self.check_type_comment(node) + newnode = nodes.Assign(node.lineno, node.col_offset, parent) + newnode.postinit( + targets=[self.visit(child, newnode) for child in node.targets], + value=self.visit(node.value, newnode), + type_annotation=type_annotation, + ) + return newnode + + def visit_assignname(self, node, parent, node_name=None): + '''visit a node and return a AssignName node''' + newnode = nodes.AssignName(node_name, getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), parent) + self._save_assignment(newnode) + return newnode + + def visit_augassign(self, node, parent): + """visit a AugAssign node by returning a fresh instance of it""" + newnode = nodes.AugAssign(self._bin_op_classes[type(node.op)] + "=", + node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.target, newnode), + self.visit(node.value, newnode)) + return newnode + + def visit_repr(self, node, parent): + """visit a Backquote node by returning a fresh instance of it""" + newnode = nodes.Repr(node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_binop(self, node, parent): + """visit a BinOp node by returning a fresh instance of it""" + newnode = nodes.BinOp(self._bin_op_classes[type(node.op)], + node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.left, newnode), + self.visit(node.right, newnode)) + return newnode + + def visit_boolop(self, node, parent): + """visit a BoolOp node by returning a fresh instance of it""" + newnode = nodes.BoolOp(self._bool_op_classes[type(node.op)], + node.lineno, node.col_offset, parent) + newnode.postinit([self.visit(child, newnode) + for child in node.values]) + return newnode + + def visit_break(self, node, parent): + """visit a Break node by returning a fresh instance of it""" + return nodes.Break(getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), + parent) + + def visit_call(self, node, parent): + """visit a CallFunc node by returning a fresh instance of it""" + newnode = nodes.Call(node.lineno, node.col_offset, parent) + starargs = _visit_or_none(node, 'starargs', self, newnode) + kwargs = _visit_or_none(node, 'kwargs', self, newnode) + args = [self.visit(child, newnode) + for child in node.args] + + if node.keywords: + keywords = [self.visit(child, newnode) + for child in node.keywords] + else: + keywords = None + if starargs: + new_starargs = nodes.Starred(col_offset=starargs.col_offset, + lineno=starargs.lineno, + parent=starargs.parent) + new_starargs.postinit(value=starargs) + args.append(new_starargs) + if kwargs: + new_kwargs = nodes.Keyword(arg=None, col_offset=kwargs.col_offset, + lineno=kwargs.lineno, + parent=kwargs.parent) + new_kwargs.postinit(value=kwargs) + if keywords: + keywords.append(new_kwargs) + else: + keywords = [new_kwargs] + + newnode.postinit(self.visit(node.func, newnode), + args, keywords) + return newnode + + def visit_classdef(self, node, parent, newstyle=None): + """visit a ClassDef node to become astroid""" + node, doc = self._get_doc(node) + newnode = nodes.ClassDef(node.name, doc, node.lineno, + node.col_offset, parent) + metaclass = None + if PY3: + for keyword in node.keywords: + if keyword.arg == 'metaclass': + metaclass = self.visit(keyword, newnode).value + break + if node.decorator_list: + decorators = self.visit_decorators(node, newnode) + else: + decorators = None + newnode.postinit([self.visit(child, newnode) + for child in node.bases], + [self.visit(child, newnode) + for child in node.body], + decorators, newstyle, metaclass, + [self.visit(kwd, newnode) for kwd in node.keywords + if kwd.arg != 'metaclass'] if PY3 else []) + return newnode + + def visit_const(self, node, parent): + """visit a Const node by returning a fresh instance of it""" + return nodes.Const(node.value, + getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), parent) + + def visit_continue(self, node, parent): + """visit a Continue node by returning a fresh instance of it""" + return nodes.Continue(getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), + parent) + + def visit_compare(self, node, parent): + """visit a Compare node by returning a fresh instance of it""" + newnode = nodes.Compare(node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.left, newnode), + [(self._cmp_op_classes[op.__class__], + self.visit(expr, newnode)) + for (op, expr) in zip(node.ops, node.comparators)]) + return newnode + + def visit_comprehension(self, node, parent): + """visit a Comprehension node by returning a fresh instance of it""" + newnode = nodes.Comprehension(parent) + newnode.postinit(self.visit(node.target, newnode), + self.visit(node.iter, newnode), + [self.visit(child, newnode) + for child in node.ifs], + getattr(node, 'is_async', None)) + return newnode + + def visit_decorators(self, node, parent): + """visit a Decorators node by returning a fresh instance of it""" + # /!\ node is actually a _ast.FunctionDef node while + # parent is an astroid.nodes.FunctionDef node + newnode = nodes.Decorators(node.lineno, node.col_offset, parent) + newnode.postinit([self.visit(child, newnode) + for child in node.decorator_list]) + return newnode + + def visit_delete(self, node, parent): + """visit a Delete node by returning a fresh instance of it""" + newnode = nodes.Delete(node.lineno, node.col_offset, parent) + newnode.postinit([self.visit(child, newnode) + for child in node.targets]) + return newnode + + def _visit_dict_items(self, node, parent, newnode): + for key, value in zip(node.keys, node.values): + rebuilt_value = self.visit(value, newnode) + if not key: + # Python 3.5 and extended unpacking + rebuilt_key = nodes.DictUnpack(rebuilt_value.lineno, + rebuilt_value.col_offset, + parent) + else: + rebuilt_key = self.visit(key, newnode) + yield rebuilt_key, rebuilt_value + + def visit_dict(self, node, parent): + """visit a Dict node by returning a fresh instance of it""" + newnode = nodes.Dict(node.lineno, node.col_offset, parent) + items = list(self._visit_dict_items(node, parent, newnode)) + newnode.postinit(items) + return newnode + + def visit_dictcomp(self, node, parent): + """visit a DictComp node by returning a fresh instance of it""" + newnode = nodes.DictComp(node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.key, newnode), + self.visit(node.value, newnode), + [self.visit(child, newnode) + for child in node.generators]) + return newnode + + def visit_expr(self, node, parent): + """visit a Expr node by returning a fresh instance of it""" + newnode = nodes.Expr(node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_ellipsis(self, node, parent): + """visit an Ellipsis node by returning a fresh instance of it""" + return nodes.Ellipsis(getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), parent) + + + def visit_emptynode(self, node, parent): + """visit an EmptyNode node by returning a fresh instance of it""" + return nodes.EmptyNode(getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), parent) + + + def visit_excepthandler(self, node, parent): + """visit an ExceptHandler node by returning a fresh instance of it""" + newnode = nodes.ExceptHandler(node.lineno, node.col_offset, parent) + # /!\ node.name can be a tuple + newnode.postinit(_visit_or_none(node, 'type', self, newnode), + _visit_or_none(node, 'name', self, newnode), + [self.visit(child, newnode) + for child in node.body]) + return newnode + + def visit_exec(self, node, parent): + """visit an Exec node by returning a fresh instance of it""" + newnode = nodes.Exec(node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.body, newnode), + _visit_or_none(node, 'globals', self, newnode), + _visit_or_none(node, 'locals', self, newnode)) + return newnode + + def visit_extslice(self, node, parent): + """visit an ExtSlice node by returning a fresh instance of it""" + newnode = nodes.ExtSlice(parent=parent) + newnode.postinit([self.visit(dim, newnode) + for dim in node.dims]) + return newnode + + def _visit_for(self, cls, node, parent): + """visit a For node by returning a fresh instance of it""" + newnode = cls(node.lineno, node.col_offset, parent) + type_annotation = self.check_type_comment(node) + newnode.postinit( + target=self.visit(node.target, newnode), + iter=self.visit(node.iter, newnode), + body=[self.visit(child, newnode) for child in node.body], + orelse=[self.visit(child, newnode) for child in node.orelse], + type_annotation=type_annotation, + ) + return newnode + + def visit_for(self, node, parent): + return self._visit_for(nodes.For, node, parent) + + def visit_importfrom(self, node, parent): + """visit an ImportFrom node by returning a fresh instance of it""" + names = [(alias.name, alias.asname) for alias in node.names] + newnode = nodes.ImportFrom(node.module or '', names, node.level or None, + getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), parent) + # store From names to add them to locals after building + self._import_from_nodes.append(newnode) + return newnode + + def _visit_functiondef(self, cls, node, parent): + """visit an FunctionDef node to become astroid""" + self._global_names.append({}) + node, doc = self._get_doc(node) + newnode = cls(node.name, doc, node.lineno, + node.col_offset, parent) + if node.decorator_list: + decorators = self.visit_decorators(node, newnode) + else: + decorators = None + if PY3 and node.returns: + returns = self.visit(node.returns, newnode) + else: + returns = None + + type_comment_args = type_comment_returns = None + type_comment_annotation = self.check_function_type_comment(node) + if type_comment_annotation: + type_comment_returns, type_comment_args = type_comment_annotation + newnode.postinit( + args=self.visit(node.args, newnode), + body=[self.visit(child, newnode) for child in node.body], + decorators=decorators, + returns=returns, + type_comment_returns=type_comment_returns, + type_comment_args=type_comment_args, + ) + self._global_names.pop() + return newnode + + def visit_functiondef(self, node, parent): + return self._visit_functiondef(nodes.FunctionDef, node, parent) + + def visit_generatorexp(self, node, parent): + """visit a GeneratorExp node by returning a fresh instance of it""" + newnode = nodes.GeneratorExp(node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.elt, newnode), + [self.visit(child, newnode) + for child in node.generators]) + return newnode + + def visit_attribute(self, node, parent): + """visit an Attribute node by returning a fresh instance of it""" + context = self._get_context(node) + if context == astroid.Del: + # FIXME : maybe we should reintroduce and visit_delattr ? + # for instance, deactivating assign_ctx + newnode = nodes.DelAttr(node.attr, node.lineno, node.col_offset, + parent) + elif context == astroid.Store: + newnode = nodes.AssignAttr(node.attr, node.lineno, node.col_offset, + parent) + # Prohibit a local save if we are in an ExceptHandler. + if not isinstance(parent, astroid.ExceptHandler): + self._delayed_assattr.append(newnode) + else: + newnode = nodes.Attribute(node.attr, node.lineno, node.col_offset, + parent) + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_global(self, node, parent): + """visit a Global node to become astroid""" + newnode = nodes.Global(node.names, getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), parent) + if self._global_names: # global at the module level, no effect + for name in node.names: + self._global_names[-1].setdefault(name, []).append(newnode) + return newnode + + def visit_if(self, node, parent): + """visit an If node by returning a fresh instance of it""" + newnode = nodes.If(node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.test, newnode), + [self.visit(child, newnode) + for child in node.body], + [self.visit(child, newnode) + for child in node.orelse]) + return newnode + + def visit_ifexp(self, node, parent): + """visit a IfExp node by returning a fresh instance of it""" + newnode = nodes.IfExp(node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.test, newnode), + self.visit(node.body, newnode), + self.visit(node.orelse, newnode)) + return newnode + + def visit_import(self, node, parent): + """visit a Import node by returning a fresh instance of it""" + names = [(alias.name, alias.asname) for alias in node.names] + newnode = nodes.Import(names, getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), parent) + # save import names in parent's locals: + for (name, asname) in newnode.names: + name = asname or name + parent.set_local(name.split('.')[0], newnode) + return newnode + + def visit_index(self, node, parent): + """visit a Index node by returning a fresh instance of it""" + newnode = nodes.Index(parent=parent) + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_keyword(self, node, parent): + """visit a Keyword node by returning a fresh instance of it""" + newnode = nodes.Keyword(node.arg, parent=parent) + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_lambda(self, node, parent): + """visit a Lambda node by returning a fresh instance of it""" + newnode = nodes.Lambda(node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.args, newnode), + self.visit(node.body, newnode)) + return newnode + + def visit_list(self, node, parent): + """visit a List node by returning a fresh instance of it""" + context = self._get_context(node) + newnode = nodes.List(ctx=context, + lineno=node.lineno, + col_offset=node.col_offset, + parent=parent) + newnode.postinit([self.visit(child, newnode) + for child in node.elts]) + return newnode + + def visit_listcomp(self, node, parent): + """visit a ListComp node by returning a fresh instance of it""" + newnode = nodes.ListComp(node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.elt, newnode), + [self.visit(child, newnode) + for child in node.generators]) + return newnode + + def visit_name(self, node, parent): + """visit a Name node by returning a fresh instance of it""" + context = self._get_context(node) + # True and False can be assigned to something in py2x, so we have to + # check first the context. + if context == astroid.Del: + newnode = nodes.DelName(node.id, node.lineno, node.col_offset, + parent) + elif context == astroid.Store: + newnode = nodes.AssignName(node.id, node.lineno, node.col_offset, + parent) + elif node.id in CONST_NAME_TRANSFORMS: + newnode = nodes.Const(CONST_NAME_TRANSFORMS[node.id], + getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), parent) + return newnode + else: + newnode = nodes.Name(node.id, node.lineno, node.col_offset, parent) + # XXX REMOVE me : + if context in (astroid.Del, astroid.Store): # 'Aug' ?? + self._save_assignment(newnode) + return newnode + + def visit_str(self, node, parent): + """visit a String/Bytes node by returning a fresh instance of Const""" + return nodes.Const(node.s, getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), parent) + visit_bytes = visit_str + + def visit_num(self, node, parent): + """visit a Num node by returning a fresh instance of Const""" + return nodes.Const(node.n, getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), parent) + + def visit_pass(self, node, parent): + """visit a Pass node by returning a fresh instance of it""" + return nodes.Pass(node.lineno, node.col_offset, parent) + + def visit_print(self, node, parent): + """visit a Print node by returning a fresh instance of it""" + newnode = nodes.Print(node.nl, node.lineno, node.col_offset, parent) + newnode.postinit(_visit_or_none(node, 'dest', self, newnode), + [self.visit(child, newnode) + for child in node.values]) + return newnode + + def visit_raise(self, node, parent): + """visit a Raise node by returning a fresh instance of it""" + newnode = nodes.Raise(node.lineno, node.col_offset, parent) + # pylint: disable=too-many-function-args + newnode.postinit(_visit_or_none(node, 'type', self, newnode), + _visit_or_none(node, 'inst', self, newnode), + _visit_or_none(node, 'tback', self, newnode)) + return newnode + + def visit_return(self, node, parent): + """visit a Return node by returning a fresh instance of it""" + newnode = nodes.Return(node.lineno, node.col_offset, parent) + if node.value is not None: + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_set(self, node, parent): + """visit a Set node by returning a fresh instance of it""" + newnode = nodes.Set(node.lineno, node.col_offset, parent) + newnode.postinit([self.visit(child, newnode) + for child in node.elts]) + return newnode + + def visit_setcomp(self, node, parent): + """visit a SetComp node by returning a fresh instance of it""" + newnode = nodes.SetComp(node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.elt, newnode), + [self.visit(child, newnode) + for child in node.generators]) + return newnode + + def visit_slice(self, node, parent): + """visit a Slice node by returning a fresh instance of it""" + newnode = nodes.Slice(parent=parent) + newnode.postinit(_visit_or_none(node, 'lower', self, newnode), + _visit_or_none(node, 'upper', self, newnode), + _visit_or_none(node, 'step', self, newnode)) + return newnode + + def visit_subscript(self, node, parent): + """visit a Subscript node by returning a fresh instance of it""" + context = self._get_context(node) + newnode = nodes.Subscript(ctx=context, + lineno=node.lineno, + col_offset=node.col_offset, + parent=parent) + newnode.postinit(self.visit(node.value, newnode), + self.visit(node.slice, newnode)) + return newnode + + def visit_tryexcept(self, node, parent): + """visit a TryExcept node by returning a fresh instance of it""" + newnode = nodes.TryExcept(node.lineno, node.col_offset, parent) + newnode.postinit([self.visit(child, newnode) + for child in node.body], + [self.visit(child, newnode) + for child in node.handlers], + [self.visit(child, newnode) + for child in node.orelse]) + return newnode + + def visit_tryfinally(self, node, parent): + """visit a TryFinally node by returning a fresh instance of it""" + newnode = nodes.TryFinally(node.lineno, node.col_offset, parent) + newnode.postinit([self.visit(child, newnode) + for child in node.body], + [self.visit(n, newnode) + for n in node.finalbody]) + return newnode + + def visit_tuple(self, node, parent): + """visit a Tuple node by returning a fresh instance of it""" + context = self._get_context(node) + newnode = nodes.Tuple(ctx=context, + lineno=node.lineno, + col_offset=node.col_offset, + parent=parent) + newnode.postinit([self.visit(child, newnode) + for child in node.elts]) + return newnode + + def visit_unaryop(self, node, parent): + """visit a UnaryOp node by returning a fresh instance of it""" + newnode = nodes.UnaryOp(self._unary_op_classes[node.op.__class__], + node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.operand, newnode)) + return newnode + + def visit_while(self, node, parent): + """visit a While node by returning a fresh instance of it""" + newnode = nodes.While(node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.test, newnode), + [self.visit(child, newnode) + for child in node.body], + [self.visit(child, newnode) + for child in node.orelse]) + return newnode + + def visit_with(self, node, parent): + newnode = nodes.With(node.lineno, node.col_offset, parent) + expr = self.visit(node.context_expr, newnode) + if node.optional_vars is not None: + optional_vars = self.visit(node.optional_vars, newnode) + else: + optional_vars = None + + type_annotation = self.check_type_comment(node) + newnode.postinit( + items=[(expr, optional_vars)], + body=[self.visit(child, newnode) for child in node.body], + type_annotation=type_annotation, + ) + return newnode + + def visit_yield(self, node, parent): + """visit a Yield node by returning a fresh instance of it""" + newnode = nodes.Yield(node.lineno, node.col_offset, parent) + if node.value is not None: + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + +class TreeRebuilder3(TreeRebuilder): + """extend and overwrite TreeRebuilder for python3k""" + + def visit_arg(self, node, parent): + """visit an arg node by returning a fresh AssName instance""" + return self.visit_assignname(node, parent, node.arg) + + def visit_nameconstant(self, node, parent): + # in Python 3.4 we have NameConstant for True / False / None + return nodes.Const(node.value, getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), parent) + + def visit_excepthandler(self, node, parent): + """visit an ExceptHandler node by returning a fresh instance of it""" + newnode = nodes.ExceptHandler(node.lineno, node.col_offset, parent) + if node.name: + name = self.visit_assignname(node, newnode, node.name) + else: + name = None + newnode.postinit(_visit_or_none(node, 'type', self, newnode), + name, + [self.visit(child, newnode) + for child in node.body]) + return newnode + + def visit_nonlocal(self, node, parent): + """visit a Nonlocal node and return a new instance of it""" + return nodes.Nonlocal(node.names, getattr(node, 'lineno', None), + getattr(node, 'col_offset', None), parent) + + def visit_raise(self, node, parent): + """visit a Raise node by returning a fresh instance of it""" + newnode = nodes.Raise(node.lineno, node.col_offset, parent) + # no traceback; anyway it is not used in Pylint + newnode.postinit(_visit_or_none(node, 'exc', self, newnode), + _visit_or_none(node, 'cause', self, newnode)) + return newnode + + def visit_starred(self, node, parent): + """visit a Starred node and return a new instance of it""" + context = self._get_context(node) + newnode = nodes.Starred(ctx=context, lineno=node.lineno, + col_offset=node.col_offset, + parent=parent) + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_try(self, node, parent): + # python 3.3 introduce a new Try node replacing + # TryFinally/TryExcept nodes + if node.finalbody: + newnode = nodes.TryFinally(node.lineno, node.col_offset, parent) + if node.handlers: + body = [self.visit_tryexcept(node, newnode)] + else: + body = [self.visit(child, newnode) + for child in node.body] + newnode.postinit(body, + [self.visit(n, newnode) + for n in node.finalbody]) + return newnode + elif node.handlers: + return self.visit_tryexcept(node, parent) + return None + + def visit_annassign(self, node, parent): + """visit an AnnAssign node by returning a fresh instance of it""" + newnode = nodes.AnnAssign(node.lineno, node.col_offset, parent) + annotation = _visit_or_none(node, 'annotation', self, newnode) + newnode.postinit(target=self.visit(node.target, newnode), + annotation=annotation, + simple=node.simple, + value=_visit_or_none(node, 'value', self, newnode)) + return newnode + + def _visit_with(self, cls, node, parent): + if 'items' not in node._fields: + # python < 3.3 + return super(TreeRebuilder3, self).visit_with(node, parent) + + newnode = cls(node.lineno, node.col_offset, parent) + def visit_child(child): + expr = self.visit(child.context_expr, newnode) + var = _visit_or_none(child, 'optional_vars', self, newnode) + return expr, var + + type_annotation = self.check_type_comment(node) + newnode.postinit( + items=[visit_child(child) for child in node.items], + body=[self.visit(child, newnode) for child in node.body], + type_annotation=type_annotation, + ) + return newnode + + def visit_with(self, node, parent): + return self._visit_with(nodes.With, node, parent) + + def visit_yieldfrom(self, node, parent): + newnode = nodes.YieldFrom(node.lineno, node.col_offset, parent) + if node.value is not None: + newnode.postinit(self.visit(node.value, newnode)) + return newnode + + def visit_classdef(self, node, parent, newstyle=True): + return super(TreeRebuilder3, self).visit_classdef(node, parent, + newstyle=newstyle) + + # Async structs added in Python 3.5 + def visit_asyncfunctiondef(self, node, parent): + return self._visit_functiondef(nodes.AsyncFunctionDef, node, parent) + + def visit_asyncfor(self, node, parent): + return self._visit_for(nodes.AsyncFor, node, parent) + + def visit_await(self, node, parent): + newnode = nodes.Await(node.lineno, node.col_offset, parent) + newnode.postinit(value=self.visit(node.value, newnode)) + return newnode + + def visit_asyncwith(self, node, parent): + return self._visit_with(nodes.AsyncWith, node, parent) + + def visit_joinedstr(self, node, parent): + newnode = nodes.JoinedStr(node.lineno, node.col_offset, parent) + newnode.postinit([self.visit(child, newnode) + for child in node.values]) + return newnode + + def visit_formattedvalue(self, node, parent): + newnode = nodes.FormattedValue(node.lineno, node.col_offset, parent) + newnode.postinit(self.visit(node.value, newnode), + node.conversion, + _visit_or_none(node, 'format_spec', self, newnode)) + return newnode + +if sys.version_info >= (3, 0): + TreeRebuilder = TreeRebuilder3 diff --git a/venv/Lib/site-packages/astroid/scoped_nodes.py b/venv/Lib/site-packages/astroid/scoped_nodes.py new file mode 100644 index 00000000..523562b2 --- /dev/null +++ b/venv/Lib/site-packages/astroid/scoped_nodes.py @@ -0,0 +1,2755 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2006-2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2010 Daniel Harding +# Copyright (c) 2011, 2013-2015 Google, Inc. +# Copyright (c) 2013-2018 Claudiu Popa +# Copyright (c) 2013 Phil Schaf +# Copyright (c) 2014 Eevee (Alex Munroe) +# Copyright (c) 2015-2016 Florian Bruhin +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2015 Rene Zhang +# Copyright (c) 2015 Philip Lorenz +# Copyright (c) 2016-2017 Derek Gustafson +# Copyright (c) 2017-2018 Bryce Guinta +# Copyright (c) 2017-2018 Ashley Whetter +# Copyright (c) 2017 Łukasz Rogalski +# Copyright (c) 2017 David Euresti +# Copyright (c) 2018 Nick Drozd +# Copyright (c) 2018 Anthony Sottile +# Copyright (c) 2018 HoverHell + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + + +""" +This module contains the classes for "scoped" node, i.e. which are opening a +new local scope in the language definition : Module, ClassDef, FunctionDef (and +Lambda, GeneratorExp, DictComp and SetComp to some extent). +""" + +import builtins +import sys +import io +import itertools +from typing import Optional, List + +from astroid import bases +from astroid import context as contextmod +from astroid import exceptions +from astroid import decorators as decorators_mod +from astroid.interpreter import objectmodel +from astroid.interpreter import dunder_lookup +from astroid import manager +from astroid import mixins +from astroid import node_classes +from astroid import util + + +BUILTINS = builtins.__name__ +ITER_METHODS = ('__iter__', '__getitem__') + + +def _c3_merge(sequences, cls, context): + """Merges MROs in *sequences* to a single MRO using the C3 algorithm. + + Adapted from http://www.python.org/download/releases/2.3/mro/. + + """ + result = [] + while True: + sequences = [s for s in sequences if s] # purge empty sequences + if not sequences: + return result + for s1 in sequences: # find merge candidates among seq heads + candidate = s1[0] + for s2 in sequences: + if candidate in s2[1:]: + candidate = None + break # reject the current head, it appears later + else: + break + if not candidate: + # Show all the remaining bases, which were considered as + # candidates for the next mro sequence. + raise exceptions.InconsistentMroError( + message="Cannot create a consistent method resolution order " + "for MROs {mros} of class {cls!r}.", + mros=sequences, cls=cls, context=context) + + result.append(candidate) + # remove the chosen candidate + for seq in sequences: + if seq[0] == candidate: + del seq[0] + return None + + +def _verify_duplicates_mro(sequences, cls, context): + for sequence in sequences: + names = [(node.lineno, node.qname()) for node in sequence if node.name] + if len(names) != len(set(names)): + raise exceptions.DuplicateBasesError( + message='Duplicates found in MROs {mros} for {cls!r}.', + mros=sequences, cls=cls, context=context) + + +def function_to_method(n, klass): + if isinstance(n, FunctionDef): + if n.type == 'classmethod': + return bases.BoundMethod(n, klass) + if n.type != 'staticmethod': + return bases.UnboundMethod(n) + return n + + +MANAGER = manager.AstroidManager() +def builtin_lookup(name): + """lookup a name into the builtin module + return the list of matching statements and the astroid for the builtin + module + """ + builtin_astroid = MANAGER.ast_from_module(builtins) + if name == '__dict__': + return builtin_astroid, () + try: + stmts = builtin_astroid.locals[name] + except KeyError: + stmts = () + return builtin_astroid, stmts + + +# TODO move this Mixin to mixins.py; problem: 'FunctionDef' in _scope_lookup +class LocalsDictNodeNG(node_classes.LookupMixIn, + node_classes.NodeNG): + """ this class provides locals handling common to Module, FunctionDef + and ClassDef nodes, including a dict like interface for direct access + to locals information + """ + + # attributes below are set by the builder module or by raw factories + + locals = {} + """A map of the name of a local variable to the node defining the local. + + :type: dict(str, NodeNG) + """ + + def qname(self): + """Get the 'qualified' name of the node. + + For example: module.name, module.class.name ... + + :returns: The qualified name. + :rtype: str + """ + # pylint: disable=no-member; github.com/pycqa/astroid/issues/278 + if self.parent is None: + return self.name + return '%s.%s' % (self.parent.frame().qname(), self.name) + + def frame(self): + """The first parent frame node. + + A frame node is a :class:`Module`, :class:`FunctionDef`, + or :class:`ClassDef`. + + :returns: The first parent frame node. + :rtype: Module or FunctionDef or ClassDef + """ + return self + + def scope(self): + """The first parent node defining a new scope. + + :returns: The first parent scope node. + :rtype: Module or FunctionDef or ClassDef or Lambda or GenExpr + """ + return self + + def _scope_lookup(self, node, name, offset=0): + """XXX method for interfacing the scope lookup""" + try: + stmts = node._filter_stmts(self.locals[name], self, offset) + except KeyError: + stmts = () + if stmts: + return self, stmts + if self.parent: # i.e. not Module + # nested scope: if parent scope is a function, that's fine + # else jump to the module + pscope = self.parent.scope() + if not pscope.is_function: + pscope = pscope.root() + return pscope.scope_lookup(node, name) + return builtin_lookup(name) # Module + + def set_local(self, name, stmt): + """Define that the given name is declared in the given statement node. + + .. seealso:: :meth:`scope` + + :param name: The name that is being defined. + :type name: str + + :param stmt: The statement that defines the given name. + :type stmt: NodeNG + """ + #assert not stmt in self.locals.get(name, ()), (self, stmt) + self.locals.setdefault(name, []).append(stmt) + + __setitem__ = set_local + + def _append_node(self, child): + """append a child, linking it in the tree""" + # pylint: disable=no-member; depending by the class + # which uses the current class as a mixin or base class. + # It's rewritten in 2.0, so it makes no sense for now + # to spend development time on it. + self.body.append(child) + child.parent = self + + def add_local_node(self, child_node, name=None): + """Append a child that should alter the locals of this scope node. + + :param child_node: The child node that will alter locals. + :type child_node: NodeNG + + :param name: The name of the local that will be altered by + the given child node. + :type name: str or None + """ + if name != '__class__': + # add __class__ node as a child will cause infinite recursion later! + self._append_node(child_node) + self.set_local(name or child_node.name, child_node) + + def __getitem__(self, item): + """The first node the defines the given local. + + :param item: The name of the locally defined object. + :type item: str + + :raises KeyError: If the name is not defined. + """ + return self.locals[item][0] + + def __iter__(self): + """Iterate over the names of locals defined in this scoped node. + + :returns: The names of the defined locals. + :rtype: iterable(str) + """ + return iter(self.keys()) + + def keys(self): + """The names of locals defined in this scoped node. + + :returns: The names of the defined locals. + :rtype: list(str) + """ + return list(self.locals.keys()) + + def values(self): + """The nodes that define the locals in this scoped node. + + :returns: The nodes that define locals. + :rtype: list(NodeNG) + """ + return [self[key] for key in self.keys()] + + def items(self): + """Get the names of the locals and the node that defines the local. + + :returns: The names of locals and their associated node. + :rtype: list(tuple(str, NodeNG)) + """ + return list(zip(self.keys(), self.values())) + + def __contains__(self, name): + """Check if a local is defined in this scope. + + :param name: The name of the local to check for. + :type name: str + + :returns: True if this node has a local of the given name, + False otherwise. + :rtype: bool + """ + return name in self.locals + + +class Module(LocalsDictNodeNG): + """Class representing an :class:`ast.Module` node. + + >>> node = astroid.extract_node('import astroid') + >>> node + + >>> node.parent + + """ + _astroid_fields = ('body',) + + fromlineno = 0 + """The first line that this node appears on in the source code. + + :type: int or None + """ + lineno = 0 + """The line that this node appears on in the source code. + + :type: int or None + """ + + # attributes below are set by the builder module or by raw factories + + file = None + """The path to the file that this ast has been extracted from. + + This will be ``None`` when the representation has been built from a + built-in module. + + :type: str or None + """ + file_bytes = None + """The string/bytes that this ast was built from. + + :type: str or bytes or None + """ + file_encoding = None + """The encoding of the source file. + + This is used to get unicode out of a source file. + Python 2 only. + + :type: str or None + """ + name = None + """The name of the module. + + :type: str or None + """ + pure_python = None + """Whether the ast was built from source. + + :type: bool or None + """ + package = None + """Whether the node represents a package or a module. + + :type: bool or None + """ + globals = None + """A map of the name of a global variable to the node defining the global. + + :type: dict(str, NodeNG) + """ + + # Future imports + future_imports = None + """The imports from ``__future__``. + + :type: set(str) or None + """ + special_attributes = objectmodel.ModuleModel() + """The names of special attributes that this module has. + + :type: objectmodel.ModuleModel + """ + + # names of module attributes available through the global scope + scope_attrs = {'__name__', '__doc__', '__file__', '__path__', '__package__'} + """The names of module attributes available through the global scope. + + :type: str(str) + """ + + _other_fields = ('name', 'doc', 'file', 'path', 'package', + 'pure_python', 'future_imports') + _other_other_fields = ('locals', 'globals') + + def __init__(self, name, doc, file=None, + path: Optional[List[str]] = None, + package=None, + parent=None, pure_python=True): + """ + :param name: The name of the module. + :type name: str + + :param doc: The module docstring. + :type doc: str + + :param file: The path to the file that this ast has been extracted from. + :type file: str or None + + :param path: + :type path: Optional[List[str]] + + :param package: Whether the node represents a package or a module. + :type package: bool or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + + :param pure_python: Whether the ast was built from source. + :type pure_python: bool or None + """ + self.name = name + self.doc = doc + self.file = file + self.path = path + self.package = package + self.parent = parent + self.pure_python = pure_python + self.locals = self.globals = {} + """A map of the name of a local variable to the node defining the local. + + :type: dict(str, NodeNG) + """ + self.body = [] + """The contents of the module. + + :type: list(NodeNG) or None + """ + self.future_imports = set() + # pylint: enable=redefined-builtin + + def postinit(self, body=None): + """Do some setup after initialisation. + + :param body: The contents of the module. + :type body: list(NodeNG) or None + """ + self.body = body + + def _get_stream(self): + if self.file_bytes is not None: + return io.BytesIO(self.file_bytes) + if self.file is not None: + stream = open(self.file, 'rb') + return stream + return None + + def stream(self): + """Get a stream to the underlying file or bytes. + + :type: file or io.BytesIO or None + """ + return self._get_stream() + + def block_range(self, lineno): + """Get a range from where this node starts to where this node ends. + + :param lineno: Unused. + :type lineno: int + + :returns: The range of line numbers that this node belongs to. + :rtype: tuple(int, int) + """ + return self.fromlineno, self.tolineno + + def scope_lookup(self, node, name, offset=0): + """Lookup where the given variable is assigned. + + :param node: The node to look for assignments up to. + Any assignments after the given node are ignored. + :type node: NodeNG + + :param name: The name of the variable to find assignments for. + :type name: str + + :param offset: The line offset to filter statements up to. + :type offset: int + + :returns: This scope node and the list of assignments associated to the + given name according to the scope where it has been found (locals, + globals or builtin). + :rtype: tuple(str, list(NodeNG)) + """ + if name in self.scope_attrs and name not in self.locals: + try: + return self, self.getattr(name) + except exceptions.AttributeInferenceError: + return self, () + return self._scope_lookup(node, name, offset) + + def pytype(self): + """Get the name of the type that this node represents. + + :returns: The name of the type. + :rtype: str + """ + return '%s.module' % BUILTINS + + def display_type(self): + """A human readable type of this node. + + :returns: The type of this node. + :rtype: str + """ + return 'Module' + + def getattr(self, name, context=None, ignore_locals=False): + result = [] + name_in_locals = name in self.locals + + if name in self.special_attributes and not ignore_locals and not name_in_locals: + result = [self.special_attributes.lookup(name)] + elif not ignore_locals and name_in_locals: + result = self.locals[name] + elif self.package: + try: + result = [self.import_module(name, relative_only=True)] + except (exceptions.AstroidBuildingError, SyntaxError) as exc: + raise exceptions.AttributeInferenceError( + target=self, + attribute=name, + context=context, + ) from exc + result = [n for n in result if not isinstance(n, node_classes.DelName)] + if result: + return result + raise exceptions.AttributeInferenceError(target=self, attribute=name, + context=context) + + def igetattr(self, name, context=None): + """Infer the possible values of the given variable. + + :param name: The name of the variable to infer. + :type name: str + + :returns: The inferred possible values. + :rtype: iterable(NodeNG) or None + """ + # set lookup name since this is necessary to infer on import nodes for + # instance + context = contextmod.copy_context(context) + context.lookupname = name + try: + return bases._infer_stmts(self.getattr(name, context), + context, frame=self) + except exceptions.AttributeInferenceError as error: + raise exceptions.InferenceError( + error.message, + target=self, + attribute=name, + context=context, + ) from error + + def fully_defined(self): + """Check if this module has been build from a .py file. + + If so, the module contains a complete representation, + including the code. + + :returns: True if the module has been built from a .py file. + :rtype: bool + """ + return self.file is not None and self.file.endswith('.py') + + def statement(self): + """The first parent node, including self, marked as statement node. + + :returns: The first parent statement. + :rtype: NodeNG + """ + return self + + def previous_sibling(self): + """The previous sibling statement. + + :returns: The previous sibling statement node. + :rtype: NodeNG or None + """ + + def next_sibling(self): + """The next sibling statement node. + + :returns: The next sibling statement node. + :rtype: NodeNG or None + """ + + _absolute_import_activated = True + + def absolute_import_activated(self): + """Whether :pep:`328` absolute import behaviour has been enabled. + + :returns: True if :pep:`328` has been enabled, False otherwise. + :rtype: bool + """ + return self._absolute_import_activated + + def import_module(self, modname, relative_only=False, level=None): + """Get the ast for a given module as if imported from this module. + + :param modname: The name of the module to "import". + :type modname: str + + :param relative_only: Whether to only consider relative imports. + :type relative_only: bool + + :param level: The level of relative import. + :type level: int or None + + :returns: The imported module ast. + :rtype: NodeNG + """ + if relative_only and level is None: + level = 0 + absmodname = self.relative_to_absolute_name(modname, level) + + try: + return MANAGER.ast_from_module_name(absmodname) + except exceptions.AstroidBuildingError: + # we only want to import a sub module or package of this module, + # skip here + if relative_only: + raise + return MANAGER.ast_from_module_name(modname) + + def relative_to_absolute_name(self, modname, level): + """Get the absolute module name for a relative import. + + The relative import can be implicit or explicit. + + :param modname: The module name to convert. + :type modname: str + + :param level: The level of relative import. + :type level: int + + :returns: The absolute module name. + :rtype: str + + :raises TooManyLevelsError: When the relative import refers to a + module too far above this one. + """ + # XXX this returns non sens when called on an absolute import + # like 'pylint.checkers.astroid.utils' + # XXX doesn't return absolute name if self.name isn't absolute name + if self.absolute_import_activated() and level is None: + return modname + if level: + if self.package: + level = level - 1 + if level and self.name.count('.') < level: + raise exceptions.TooManyLevelsError( + level=level, name=self.name) + + package_name = self.name.rsplit('.', level)[0] + elif self.package: + package_name = self.name + else: + package_name = self.name.rsplit('.', 1)[0] + + if package_name: + if not modname: + return package_name + return '%s.%s' % (package_name, modname) + return modname + + def wildcard_import_names(self): + """The list of imported names when this module is 'wildcard imported'. + + It doesn't include the '__builtins__' name which is added by the + current CPython implementation of wildcard imports. + + :returns: The list of imported names. + :rtype: list(str) + """ + # We separate the different steps of lookup in try/excepts + # to avoid catching too many Exceptions + default = [name for name in self.keys() if not name.startswith('_')] + try: + all_values = self['__all__'] + except KeyError: + return default + + try: + explicit = next(all_values.assigned_stmts()) + except exceptions.InferenceError: + return default + except AttributeError: + # not an assignment node + # XXX infer? + return default + + # Try our best to detect the exported name. + inferred = [] + try: + explicit = next(explicit.infer()) + except exceptions.InferenceError: + return default + if not isinstance(explicit, (node_classes.Tuple, node_classes.List)): + return default + + str_const = lambda node: (isinstance(node, node_classes.Const) and + isinstance(node.value, str)) + for node in explicit.elts: + if str_const(node): + inferred.append(node.value) + else: + try: + inferred_node = next(node.infer()) + except exceptions.InferenceError: + continue + if str_const(inferred_node): + inferred.append(inferred_node.value) + return inferred + + def public_names(self): + """The list of the names that are publicly available in this module. + + :returns: The list of publc names. + :rtype: list(str) + """ + return [name for name in self.keys() if not name.startswith('_')] + + def bool_value(self): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`Module` this is always ``True``. + :rtype: bool + """ + return True + + def get_children(self): + yield from self.body + + +class ComprehensionScope(LocalsDictNodeNG): + """Scoping for different types of comprehensions.""" + def frame(self): + """The first parent frame node. + + A frame node is a :class:`Module`, :class:`FunctionDef`, + or :class:`ClassDef`. + + :returns: The first parent frame node. + :rtype: Module or FunctionDef or ClassDef + """ + return self.parent.frame() + + scope_lookup = LocalsDictNodeNG._scope_lookup + + +class GeneratorExp(ComprehensionScope): + """Class representing an :class:`ast.GeneratorExp` node. + + >>> node = astroid.extract_node('(thing for thing in things if thing)') + >>> node + + """ + _astroid_fields = ('elt', 'generators') + _other_other_fields = ('locals',) + elt = None + """The element that forms the output of the expression. + + :type: NodeNG or None + """ + generators = None + """The generators that are looped through. + + :type: list(Comprehension) or None + """ + + def __init__(self, lineno=None, col_offset=None, parent=None): + """ + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.locals = {} + """A map of the name of a local variable to the node defining the local. + + :type: dict(str, NodeNG) + """ + + super(GeneratorExp, self).__init__(lineno, col_offset, parent) + + def postinit(self, elt=None, generators=None): + """Do some setup after initialisation. + + :param elt: The element that forms the output of the expression. + :type elt: NodeNG or None + + :param generators: The generators that are looped through. + :type generators: list(Comprehension) or None + """ + self.elt = elt + if generators is None: + self.generators = [] + else: + self.generators = generators + + def bool_value(self): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`GeneratorExp` this is always ``True``. + :rtype: bool + """ + return True + + def get_children(self): + yield self.elt + + yield from self.generators + + +class DictComp(ComprehensionScope): + """Class representing an :class:`ast.DictComp` node. + + >>> node = astroid.extract_node('{k:v for k, v in things if k > v}') + >>> node + + """ + _astroid_fields = ('key', 'value', 'generators') + _other_other_fields = ('locals',) + key = None + """What produces the keys. + + :type: NodeNG or None + """ + value = None + """What produces the values. + + :type: NodeNG or None + """ + generators = None + """The generators that are looped through. + + :type: list(Comprehension) or None + """ + + def __init__(self, lineno=None, col_offset=None, parent=None): + """ + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.locals = {} + """A map of the name of a local variable to the node defining the local. + + :type: dict(str, NodeNG) + """ + + super(DictComp, self).__init__(lineno, col_offset, parent) + + def postinit(self, key=None, value=None, generators=None): + """Do some setup after initialisation. + + :param key: What produces the keys. + :type key: NodeNG or None + + :param value: What produces the values. + :type value: NodeNG or None + + :param generators: The generators that are looped through. + :type generators: list(Comprehension) or None + """ + self.key = key + self.value = value + if generators is None: + self.generators = [] + else: + self.generators = generators + + def bool_value(self): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`DictComp` this is always :class:`Uninferable`. + :rtype: Uninferable + """ + return util.Uninferable + + def get_children(self): + yield self.key + yield self.value + + yield from self.generators + + +class SetComp(ComprehensionScope): + """Class representing an :class:`ast.SetComp` node. + + >>> node = astroid.extract_node('{thing for thing in things if thing}') + >>> node + + """ + _astroid_fields = ('elt', 'generators') + _other_other_fields = ('locals',) + elt = None + """The element that forms the output of the expression. + + :type: NodeNG or None + """ + generators = None + """The generators that are looped through. + + :type: list(Comprehension) or None + """ + + def __init__(self, lineno=None, col_offset=None, parent=None): + """ + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.locals = {} + """A map of the name of a local variable to the node defining the local. + + :type: dict(str, NodeNG) + """ + + super(SetComp, self).__init__(lineno, col_offset, parent) + + def postinit(self, elt=None, generators=None): + """Do some setup after initialisation. + + :param elt: The element that forms the output of the expression. + :type elt: NodeNG or None + + :param generators: The generators that are looped through. + :type generators: list(Comprehension) or None + """ + self.elt = elt + if generators is None: + self.generators = [] + else: + self.generators = generators + + def bool_value(self): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`SetComp` this is always :class:`Uninferable`. + :rtype: Uninferable + """ + return util.Uninferable + + def get_children(self): + yield self.elt + + yield from self.generators + + +class _ListComp(node_classes.NodeNG): + """Class representing an :class:`ast.ListComp` node. + + >>> node = astroid.extract_node('[thing for thing in things if thing]') + >>> node + + """ + _astroid_fields = ('elt', 'generators') + elt = None + """The element that forms the output of the expression. + + :type: NodeNG or None + """ + generators = None + """The generators that are looped through. + + :type: list(Comprehension) or None + """ + + def postinit(self, elt=None, generators=None): + """Do some setup after initialisation. + + :param elt: The element that forms the output of the expression. + :type elt: NodeNG or None + + :param generators: The generators that are looped through. + :type generators: list(Comprehension) or None + """ + self.elt = elt + self.generators = generators + + def bool_value(self): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`ListComp` this is always :class:`Uninferable`. + :rtype: Uninferable + """ + return util.Uninferable + + def get_children(self): + yield self.elt + + yield from self.generators + + +class ListComp(_ListComp, ComprehensionScope): + """Class representing an :class:`ast.ListComp` node. + + >>> node = astroid.extract_node('[thing for thing in things if thing]') + >>> node + + """ + _other_other_fields = ('locals',) + + def __init__(self, lineno=None, col_offset=None, parent=None): + self.locals = {} + """A map of the name of a local variable to the node defining it. + + :type: dict(str, NodeNG) + """ + + super(ListComp, self).__init__(lineno, col_offset, parent) + + +def _infer_decorator_callchain(node): + """Detect decorator call chaining and see if the end result is a + static or a classmethod. + """ + if not isinstance(node, FunctionDef): + return None + if not node.parent: + return None + try: + result = next(node.infer_call_result(node.parent)) + except exceptions.InferenceError: + return None + if isinstance(result, bases.Instance): + result = result._proxied + if isinstance(result, ClassDef): + if result.is_subtype_of('%s.classmethod' % BUILTINS): + return 'classmethod' + if result.is_subtype_of('%s.staticmethod' % BUILTINS): + return 'staticmethod' + return None + + +class Lambda(mixins.FilterStmtsMixin, LocalsDictNodeNG): + """Class representing an :class:`ast.Lambda` node. + + >>> node = astroid.extract_node('lambda arg: arg + 1') + >>> node + l.1 at 0x7f23b2e41518> + """ + _astroid_fields = ('args', 'body',) + _other_other_fields = ('locals',) + name = '' + is_lambda = True + + def implicit_parameters(self): + return 0 + + # function's type, 'function' | 'method' | 'staticmethod' | 'classmethod' + @property + def type(self): + """Whether this is a method or function. + + :returns: 'method' if this is a method, 'function' otherwise. + :rtype: str + """ + # pylint: disable=no-member + if self.args.args and self.args.args[0].name == 'self': + if isinstance(self.parent.scope(), ClassDef): + return 'method' + return 'function' + + def __init__(self, lineno=None, col_offset=None, parent=None): + """ + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.locals = {} + """A map of the name of a local variable to the node defining it. + + :type: dict(str, NodeNG) + """ + + self.args = [] + """The arguments that the function takes. + + :type: Arguments or list + """ + + self.body = [] + """The contents of the function body. + + :type: list(NodeNG) + """ + + super(Lambda, self).__init__(lineno, col_offset, parent) + + def postinit(self, args, body): + """Do some setup after initialisation. + + :param args: The arguments that the function takes. + :type args: Arguments + + :param body: The contents of the function body. + :type body: list(NodeNG) + """ + self.args = args + self.body = body + + def pytype(self): + """Get the name of the type that this node represents. + + :returns: The name of the type. + :rtype: str + """ + if 'method' in self.type: + return '%s.instancemethod' % BUILTINS + return '%s.function' % BUILTINS + + def display_type(self): + """A human readable type of this node. + + :returns: The type of this node. + :rtype: str + """ + if 'method' in self.type: + return 'Method' + return 'Function' + + def callable(self): + """Whether this node defines something that is callable. + + :returns: True if this defines something that is callable, + False otherwise. + For a :class:`Lambda` this is always ``True``. + :rtype: bool + """ + return True + + def argnames(self): + """Get the names of each of the arguments. + + :returns: The names of the arguments. + :rtype: list(str) + """ + # pylint: disable=no-member; github.com/pycqa/astroid/issues/291 + # args is in fact redefined later on by postinit. Can't be changed + # to None due to a strong interaction between Lambda and FunctionDef. + + if self.args.args: # maybe None with builtin functions + names = _rec_get_names(self.args.args) + else: + names = [] + if self.args.vararg: + names.append(self.args.vararg) + if self.args.kwarg: + names.append(self.args.kwarg) + return names + + def infer_call_result(self, caller, context=None): + """Infer what the function returns when called. + + :param caller: Unused + :type caller: object + """ + # pylint: disable=no-member; github.com/pycqa/astroid/issues/291 + # args is in fact redefined later on by postinit. Can't be changed + # to None due to a strong interaction between Lambda and FunctionDef. + return self.body.infer(context) + + def scope_lookup(self, node, name, offset=0): + """Lookup where the given names is assigned. + + :param node: The node to look for assignments up to. + Any assignments after the given node are ignored. + :type node: NodeNG + + :param name: The name to find assignments for. + :type name: str + + :param offset: The line offset to filter statements up to. + :type offset: int + + :returns: This scope node and the list of assignments associated to the + given name according to the scope where it has been found (locals, + globals or builtin). + :rtype: tuple(str, list(NodeNG)) + """ + # pylint: disable=no-member; github.com/pycqa/astroid/issues/291 + # args is in fact redefined later on by postinit. Can't be changed + # to None due to a strong interaction between Lambda and FunctionDef. + + if node in self.args.defaults or node in self.args.kw_defaults: + frame = self.parent.frame() + # line offset to avoid that def func(f=func) resolve the default + # value to the defined function + offset = -1 + else: + # check this is not used in function decorators + frame = self + return frame._scope_lookup(node, name, offset) + + def bool_value(self): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`Lambda` this is always ``True``. + :rtype: bool + """ + return True + + def get_children(self): + yield self.args + yield self.body + + +class FunctionDef(mixins.MultiLineBlockMixin, node_classes.Statement, Lambda): + """Class representing an :class:`ast.FunctionDef`. + + >>> node = astroid.extract_node(''' + ... def my_func(arg): + ... return arg + 1 + ... ''') + >>> node + + """ + _astroid_fields = ('decorators', 'args', 'returns', 'body') + _multi_line_block_fields = ('body',) + returns = None + decorators = None + """The decorators that are applied to this method or function. + + :type: Decorators or None + """ + special_attributes = objectmodel.FunctionModel() + """The names of special attributes that this function has. + + :type: objectmodel.FunctionModel + """ + is_function = True + """Whether this node indicates a function. + + For a :class:`FunctionDef` this is always ``True``. + + :type: bool + """ + type_annotation = None + """If present, this will contain the type annotation passed by a type comment + + :type: NodeNG or None + """ + type_comment_args = None + """ + If present, this will contain the type annotation for arguments + passed by a type comment + """ + type_comment_returns = None + """If present, this will contain the return type annotation, passed by a type comment""" + # attributes below are set by the builder module or by raw factories + _other_fields = ('name', 'doc') + _other_other_fields = ( + 'locals', + '_type', + 'type_comment_returns', + 'type_comment_args', + ) + _type = None + + def __init__(self, name=None, doc=None, lineno=None, + col_offset=None, parent=None): + """ + :param name: The name of the function. + :type name: str or None + + :param doc: The function's docstring. + :type doc: str or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.name = name + """The name of the function. + + :type name: str or None + """ + + self.doc = doc + """The function's docstring. + + :type doc: str or None + """ + + self.instance_attrs = {} + super(FunctionDef, self).__init__(lineno, col_offset, parent) + if parent: + frame = parent.frame() + frame.set_local(name, self) + + # pylint: disable=arguments-differ; different than Lambdas + def postinit(self, args, body, + decorators=None, + returns=None, + type_comment_returns=None, + type_comment_args=None): + """Do some setup after initialisation. + + :param args: The arguments that the function takes. + :type args: Arguments or list + + :param body: The contents of the function body. + :type body: list(NodeNG) + + :param decorators: The decorators that are applied to this + method or function. + :type decorators: Decorators or None + :params type_comment_returns: + The return type annotation passed via a type comment. + :params type_comment_args: + The args type annotation passed via a type comment. + """ + self.args = args + self.body = body + self.decorators = decorators + self.returns = returns + self.type_comment_returns = type_comment_returns + self.type_comment_args = type_comment_args + + if isinstance(self.parent.frame(), ClassDef): + self.set_local('__class__', self.parent.frame()) + + @decorators_mod.cachedproperty + def extra_decorators(self): + """The extra decorators that this function can have. + + Additional decorators are considered when they are used as + assignments, as in ``method = staticmethod(method)``. + The property will return all the callables that are used for + decoration. + + :type: list(NodeNG) + """ + frame = self.parent.frame() + if not isinstance(frame, ClassDef): + return [] + + decorators = [] + for assign in frame._get_assign_nodes(): + if (isinstance(assign.value, node_classes.Call) + and isinstance(assign.value.func, node_classes.Name)): + for assign_node in assign.targets: + if not isinstance(assign_node, node_classes.AssignName): + # Support only `name = callable(name)` + continue + + if assign_node.name != self.name: + # Interested only in the assignment nodes that + # decorates the current method. + continue + try: + meth = frame[self.name] + except KeyError: + continue + else: + # Must be a function and in the same frame as the + # original method. + if (isinstance(meth, FunctionDef) + and assign_node.frame() == frame): + decorators.append(assign.value) + return decorators + + @decorators_mod.cachedproperty + def type(self): + """The function type for this node. + + Possible values are: method, function, staticmethod, classmethod. + + :type: str + """ + builtin_descriptors = {'classmethod', 'staticmethod'} + + for decorator in self.extra_decorators: + if decorator.func.name in builtin_descriptors: + return decorator.func.name + + frame = self.parent.frame() + type_name = 'function' + if isinstance(frame, ClassDef): + if self.name == '__new__': + return 'classmethod' + if sys.version_info >= (3, 6) and self.name == '__init_subclass__': + return 'classmethod' + + type_name = 'method' + + if not self.decorators: + return type_name + + for node in self.decorators.nodes: + if isinstance(node, node_classes.Name): + if node.name in builtin_descriptors: + return node.name + + if isinstance(node, node_classes.Call): + # Handle the following case: + # @some_decorator(arg1, arg2) + # def func(...) + # + try: + current = next(node.func.infer()) + except exceptions.InferenceError: + continue + _type = _infer_decorator_callchain(current) + if _type is not None: + return _type + + try: + for inferred in node.infer(): + # Check to see if this returns a static or a class method. + _type = _infer_decorator_callchain(inferred) + if _type is not None: + return _type + + if not isinstance(inferred, ClassDef): + continue + for ancestor in inferred.ancestors(): + if not isinstance(ancestor, ClassDef): + continue + if ancestor.is_subtype_of('%s.classmethod' % BUILTINS): + return 'classmethod' + if ancestor.is_subtype_of('%s.staticmethod' % BUILTINS): + return 'staticmethod' + except exceptions.InferenceError: + pass + return type_name + + @decorators_mod.cachedproperty + def fromlineno(self): + """The first line that this node appears on in the source code. + + :type: int or None + """ + # lineno is the line number of the first decorator, we want the def + # statement lineno + lineno = self.lineno + if self.decorators is not None: + lineno += sum(node.tolineno - node.lineno + 1 + for node in self.decorators.nodes) + + return lineno + + @decorators_mod.cachedproperty + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + return self.args.tolineno + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: Unused. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + :rtype: tuple(int, int) + """ + return self.fromlineno, self.tolineno + + def getattr(self, name, context=None): + """this method doesn't look in the instance_attrs dictionary since it's + done by an Instance proxy at inference time. + """ + if name in self.instance_attrs: + return self.instance_attrs[name] + if name in self.special_attributes: + return [self.special_attributes.lookup(name)] + raise exceptions.AttributeInferenceError(target=self, attribute=name) + + def igetattr(self, name, context=None): + """Inferred getattr, which returns an iterator of inferred statements.""" + try: + return bases._infer_stmts(self.getattr(name, context), + context, frame=self) + except exceptions.AttributeInferenceError as error: + raise exceptions.InferenceError( + error.message, + target=self, + attribute=name, + context=context, + ) from error + + def is_method(self): + """Check if this function node represents a method. + + :returns: True if this is a method, False otherwise. + :rtype: bool + """ + # check we are defined in a ClassDef, because this is usually expected + # (e.g. pylint...) when is_method() return True + return self.type != 'function' and isinstance(self.parent.frame(), ClassDef) + + @decorators_mod.cached + def decoratornames(self): + """Get the qualified names of each of the decorators on this function. + + :returns: The names of the decorators. + :rtype: set(str) + """ + result = set() + decoratornodes = [] + if self.decorators is not None: + decoratornodes += self.decorators.nodes + decoratornodes += self.extra_decorators + for decnode in decoratornodes: + try: + for infnode in decnode.infer(): + result.add(infnode.qname()) + except exceptions.InferenceError: + continue + return result + + def is_bound(self): + """Check if the function is bound to an instance or class. + + :returns: True if the function is bound to an instance or class, + False otherwise. + :rtype: bool + """ + return self.type == 'classmethod' + + def is_abstract(self, pass_is_abstract=True): + """Check if the method is abstract. + + A method is considered abstract if any of the following is true: + * The only statement is 'raise NotImplementedError' + * The only statement is 'pass' and pass_is_abstract is True + * The method is annotated with abc.astractproperty/abc.abstractmethod + + :returns: True if the method is abstract, False otherwise. + :rtype: bool + """ + if self.decorators: + for node in self.decorators.nodes: + try: + inferred = next(node.infer()) + except exceptions.InferenceError: + continue + if inferred and inferred.qname() in ('abc.abstractproperty', + 'abc.abstractmethod'): + return True + + for child_node in self.body: + if isinstance(child_node, node_classes.Raise): + if child_node.raises_not_implemented(): + return True + return pass_is_abstract and isinstance(child_node, node_classes.Pass) + # empty function is the same as function with a single "pass" statement + if pass_is_abstract: + return True + + def is_generator(self): + """Check if this is a generator function. + + :returns: True is this is a generator function, False otherwise. + :rtype: bool + """ + return next(self._get_yield_nodes_skip_lambdas(), False) + + def infer_call_result(self, caller=None, context=None): + """Infer what the function returns when called. + + :returns: What the function returns. + :rtype: iterable(NodeNG or Uninferable) or None + """ + if self.is_generator(): + result = bases.Generator(self) + yield result + return + # This is really a gigantic hack to work around metaclass generators + # that return transient class-generating functions. Pylint's AST structure + # cannot handle a base class object that is only used for calling __new__, + # but does not contribute to the inheritance structure itself. We inject + # a fake class into the hierarchy here for several well-known metaclass + # generators, and filter it out later. + if (self.name == 'with_metaclass' and + len(self.args.args) == 1 and + self.args.vararg is not None): + metaclass = next(caller.args[0].infer(context)) + if isinstance(metaclass, ClassDef): + class_bases = [next(arg.infer(context)) for arg in caller.args[1:]] + new_class = ClassDef(name='temporary_class') + new_class.hide = True + new_class.parent = self + new_class.postinit( + bases=[base for base in class_bases if base != util.Uninferable], + body=[], + decorators=[], + metaclass=metaclass, + ) + yield new_class + return + returns = self._get_return_nodes_skip_functions() + + first_return = next(returns, None) + if not first_return: + raise exceptions.InferenceError('Empty return iterator') + + for returnnode in itertools.chain((first_return,), returns): + if returnnode.value is None: + yield node_classes.Const(None) + else: + try: + yield from returnnode.value.infer(context) + except exceptions.InferenceError: + yield util.Uninferable + + def bool_value(self): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`FunctionDef` this is always ``True``. + :rtype: bool + """ + return True + + def get_children(self): + if self.decorators is not None: + yield self.decorators + + yield self.args + + if self.returns is not None: + yield self.returns + + yield from self.body + + +class AsyncFunctionDef(FunctionDef): + """Class representing an :class:`ast.FunctionDef` node. + + A :class:`AsyncFunctionDef` is an asynchronous function + created with the `async` keyword. + + >>> node = astroid.extract_node(''' + async def func(things): + async for thing in things: + print(thing) + ''') + >>> node + + >>> node.body[0] + + """ + + +def _rec_get_names(args, names=None): + """return a list of all argument names""" + if names is None: + names = [] + for arg in args: + if isinstance(arg, node_classes.Tuple): + _rec_get_names(arg.elts, names) + else: + names.append(arg.name) + return names + + +def _is_metaclass(klass, seen=None): + """ Return if the given class can be + used as a metaclass. + """ + if klass.name == 'type': + return True + if seen is None: + seen = set() + for base in klass.bases: + try: + for baseobj in base.infer(): + baseobj_name = baseobj.qname() + if baseobj_name in seen: + continue + else: + seen.add(baseobj_name) + if isinstance(baseobj, bases.Instance): + # not abstract + return False + if baseobj is util.Uninferable: + continue + if baseobj is klass: + continue + if not isinstance(baseobj, ClassDef): + continue + if baseobj._type == 'metaclass': + return True + if _is_metaclass(baseobj, seen): + return True + except exceptions.InferenceError: + continue + return False + + +def _class_type(klass, ancestors=None): + """return a ClassDef node type to differ metaclass and exception + from 'regular' classes + """ + # XXX we have to store ancestors in case we have an ancestor loop + if klass._type is not None: + return klass._type + if _is_metaclass(klass): + klass._type = 'metaclass' + elif klass.name.endswith('Exception'): + klass._type = 'exception' + else: + if ancestors is None: + ancestors = set() + klass_name = klass.qname() + if klass_name in ancestors: + # XXX we are in loop ancestors, and have found no type + klass._type = 'class' + return 'class' + ancestors.add(klass_name) + for base in klass.ancestors(recurs=False): + name = _class_type(base, ancestors) + if name != 'class': + if name == 'metaclass' and not _is_metaclass(klass): + # don't propagate it if the current class + # can't be a metaclass + continue + klass._type = base.type + break + if klass._type is None: + klass._type = 'class' + return klass._type + + +def get_wrapping_class(node): + """Get the class that wraps the given node. + + We consider that a class wraps a node if the class + is a parent for the said node. + + :returns: The class that wraps the given node + :rtype: ClassDef or None + """ + + klass = node.frame() + while klass is not None and not isinstance(klass, ClassDef): + if klass.parent is None: + klass = None + else: + klass = klass.parent.frame() + return klass + + +class ClassDef(mixins.FilterStmtsMixin, LocalsDictNodeNG, + node_classes.Statement): + """Class representing an :class:`ast.ClassDef` node. + + >>> node = astroid.extract_node(''' + class Thing: + def my_meth(self, arg): + return arg + self.offset + ''') + >>> node + + """ + + # some of the attributes below are set by the builder module or + # by a raw factories + + # a dictionary of class instances attributes + _astroid_fields = ('decorators', 'bases', 'body') # name + + decorators = None + """The decorators that are applied to this class. + + :type: Decorators or None + """ + special_attributes = objectmodel.ClassModel() + """The names of special attributes that this class has. + + :type: objectmodel.ClassModel + """ + + _type = None + _metaclass_hack = False + hide = False + type = property(_class_type, + doc=("The class type for this node.\n\n" + "Possible values are: class, metaclass, exception.\n\n" + ":type: str")) + _other_fields = ('name', 'doc') + _other_other_fields = ('locals', '_newstyle') + _newstyle = None + + def __init__(self, name=None, doc=None, lineno=None, + col_offset=None, parent=None): + """ + :param name: The name of the class. + :type name: str or None + + :param doc: The function's docstring. + :type doc: str or None + + :param lineno: The line that this node appears on in the source code. + :type lineno: int or None + + :param col_offset: The column that this node appears on in the + source code. + :type col_offset: int or None + + :param parent: The parent node in the syntax tree. + :type parent: NodeNG or None + """ + self.instance_attrs = {} + self.locals = {} + """A map of the name of a local variable to the node defining it. + + :type: dict(str, NodeNG) + """ + + self.keywords = [] + """The keywords given to the class definition. + + This is usually for :pep:`3115` style metaclass declaration. + + :type: list(Keyword) or None + """ + + self.bases = [] + """What the class inherits from. + + :type: list(NodeNG) + """ + + self.body = [] + """The contents of the class body. + + :type: list(NodeNG) + """ + + self.name = name + """The name of the class. + + :type name: str or None + """ + + self.doc = doc + """The class' docstring. + + :type doc: str or None + """ + + super(ClassDef, self).__init__(lineno, col_offset, parent) + if parent is not None: + parent.frame().set_local(name, self) + + for local_name, node in self.implicit_locals(): + self.add_local_node(node, local_name) + + def implicit_parameters(self): + return 1 + + def implicit_locals(self): + """Get implicitly defined class definition locals. + + :returns: the the name and Const pair for each local + :rtype: tuple(tuple(str, node_classes.Const), ...) + """ + locals_ = (('__module__', self.special_attributes.py__module__),) + if sys.version_info >= (3, 3): + # __qualname__ is defined in PEP3155 + locals_ += (("__qualname__", self.special_attributes.py__qualname__),) + return locals_ + + # pylint: disable=redefined-outer-name + def postinit(self, bases, body, decorators, newstyle=None, metaclass=None, keywords=None): + """Do some setup after initialisation. + + :param bases: What the class inherits from. + :type bases: list(NodeNG) + + :param body: The contents of the class body. + :type body: list(NodeNG) + + :param decorators: The decorators that are applied to this class. + :type decorators: Decorators or None + + :param newstyle: Whether this is a new style class or not. + :type newstyle: bool or None + + :param metaclass: The metaclass of this class. + :type metaclass: NodeNG or None + + :param keywords: The keywords given to the class definition. + :type keywords: list(Keyword) or None + """ + self.keywords = keywords + self.bases = bases + self.body = body + self.decorators = decorators + if newstyle is not None: + self._newstyle = newstyle + if metaclass is not None: + self._metaclass = metaclass + + def _newstyle_impl(self, context=None): + if context is None: + context = contextmod.InferenceContext() + if self._newstyle is not None: + return self._newstyle + for base in self.ancestors(recurs=False, context=context): + if base._newstyle_impl(context): + self._newstyle = True + break + klass = self.declared_metaclass() + # could be any callable, we'd need to infer the result of klass(name, + # bases, dict). punt if it's not a class node. + if klass is not None and isinstance(klass, ClassDef): + self._newstyle = klass._newstyle_impl(context) + if self._newstyle is None: + self._newstyle = False + return self._newstyle + + _newstyle = None + newstyle = property(_newstyle_impl, + doc=("Whether this is a new style class or not\n\n" + ":type: bool or None")) + + @decorators_mod.cachedproperty + def blockstart_tolineno(self): + """The line on which the beginning of this block ends. + + :type: int + """ + if self.bases: + return self.bases[-1].tolineno + + return self.fromlineno + + def block_range(self, lineno): + """Get a range from the given line number to where this node ends. + + :param lineno: Unused. + :type lineno: int + + :returns: The range of line numbers that this node belongs to, + :rtype: tuple(int, int) + """ + return self.fromlineno, self.tolineno + + def pytype(self): + """Get the name of the type that this node represents. + + :returns: The name of the type. + :rtype: str + """ + if self.newstyle: + return '%s.type' % BUILTINS + return '%s.classobj' % BUILTINS + + def display_type(self): + """A human readable type of this node. + + :returns: The type of this node. + :rtype: str + """ + return 'Class' + + def callable(self): + """Whether this node defines something that is callable. + + :returns: True if this defines something that is callable, + False otherwise. + For a :class:`ClassDef` this is always ``True``. + :rtype: bool + """ + return True + + def is_subtype_of(self, type_name, context=None): + """Whether this class is a subtype of the given type. + + :param type_name: The name of the type of check against. + :type type_name: str + + :returns: True if this class is a subtype of the given type, + False otherwise. + :rtype: bool + """ + if self.qname() == type_name: + return True + for anc in self.ancestors(context=context): + if anc.qname() == type_name: + return True + return False + + def _infer_type_call(self, caller, context): + name_node = next(caller.args[0].infer(context)) + if (isinstance(name_node, node_classes.Const) and + isinstance(name_node.value, str)): + name = name_node.value + else: + return util.Uninferable + + result = ClassDef(name, None) + + # Get the bases of the class. + class_bases = next(caller.args[1].infer(context)) + if isinstance(class_bases, (node_classes.Tuple, node_classes.List)): + result.bases = class_bases.itered() + else: + # There is currently no AST node that can represent an 'unknown' + # node (Uninferable is not an AST node), therefore we simply return Uninferable here + # although we know at least the name of the class. + return util.Uninferable + + # Get the members of the class + try: + members = next(caller.args[2].infer(context)) + except exceptions.InferenceError: + members = None + + if members and isinstance(members, node_classes.Dict): + for attr, value in members.items: + if (isinstance(attr, node_classes.Const) and + isinstance(attr.value, str)): + result.locals[attr.value] = [value] + + result.parent = caller.parent + return result + + def infer_call_result(self, caller, context=None): + """infer what a class is returning when called""" + if (self.is_subtype_of('%s.type' % (BUILTINS,), context) + and len(caller.args) == 3): + result = self._infer_type_call(caller, context) + yield result + return + + dunder_call = None + try: + metaclass = self.metaclass(context=context) + if metaclass is not None: + dunder_call = next(metaclass.igetattr("__call__", context)) + except exceptions.AttributeInferenceError: + pass + if (dunder_call is not None and + dunder_call.qname() != "builtins.type.__call__"): + context = contextmod.bind_context_to_node(context, self) + yield from dunder_call.infer_call_result( + caller, context) + else: + # Call type.__call__ if not set metaclass + # (since type is the default metaclass) + yield bases.Instance(self) + + def scope_lookup(self, node, name, offset=0): + """Lookup where the given name is assigned. + + :param node: The node to look for assignments up to. + Any assignments after the given node are ignored. + :type node: NodeNG + + :param name: The name to find assignments for. + :type name: str + + :param offset: The line offset to filter statements up to. + :type offset: int + + :returns: This scope node and the list of assignments associated to the + given name according to the scope where it has been found (locals, + globals or builtin). + :rtype: tuple(str, list(NodeNG)) + """ + # If the name looks like a builtin name, just try to look + # into the upper scope of this class. We might have a + # decorator that it's poorly named after a builtin object + # inside this class. + lookup_upper_frame = ( + isinstance(node.parent, node_classes.Decorators) and + name in MANAGER.astroid_cache[builtins.__name__] + ) + if any(node == base or base.parent_of(node) + for base in self.bases) or lookup_upper_frame: + # Handle the case where we have either a name + # in the bases of a class, which exists before + # the actual definition or the case where we have + # a Getattr node, with that name. + # + # name = ... + # class A(name): + # def name(self): ... + # + # import name + # class A(name.Name): + # def name(self): ... + + frame = self.parent.frame() + # line offset to avoid that class A(A) resolve the ancestor to + # the defined class + offset = -1 + else: + frame = self + return frame._scope_lookup(node, name, offset) + + @property + def basenames(self): + """The names of the parent classes + + Names are given in the order they appear in the class definition. + + :type: list(str) + """ + return [bnode.as_string() for bnode in self.bases] + + def ancestors(self, recurs=True, context=None): + """Iterate over the base classes in prefixed depth first order. + + :param recurs: Whether to recurse or return direct ancestors only. + :type recurs: bool + + :returns: The base classes + :rtype: iterable(NodeNG) + """ + # FIXME: should be possible to choose the resolution order + # FIXME: inference make infinite loops possible here + yielded = {self} + if context is None: + context = contextmod.InferenceContext() + if not self.bases and self.qname() != 'builtins.object': + yield builtin_lookup("object")[1][0] + return + + for stmt in self.bases: + with context.restore_path(): + try: + for baseobj in stmt.infer(context): + if not isinstance(baseobj, ClassDef): + if isinstance(baseobj, bases.Instance): + baseobj = baseobj._proxied + else: + continue + if not baseobj.hide: + if baseobj in yielded: + continue + yielded.add(baseobj) + yield baseobj + if recurs: + for grandpa in baseobj.ancestors(recurs=True, + context=context): + if grandpa is self: + # This class is the ancestor of itself. + break + if grandpa in yielded: + continue + yielded.add(grandpa) + yield grandpa + except exceptions.InferenceError: + continue + + def local_attr_ancestors(self, name, context=None): + """Iterate over the parents that define the given name. + + :param name: The name to find definitions for. + :type name: str + + :returns: The parents that define the given name. + :rtype: iterable(NodeNG) + """ + if self.newstyle and all(n.newstyle for n in self.ancestors(context)): + # Look up in the mro if we can. This will result in the + # attribute being looked up just as Python does it. + try: + ancestors = self.mro(context)[1:] + except exceptions.MroError: + # Fallback to use ancestors, we can't determine + # a sane MRO. + ancestors = self.ancestors(context=context) + else: + ancestors = self.ancestors(context=context) + for astroid in ancestors: + if name in astroid: + yield astroid + + def instance_attr_ancestors(self, name, context=None): + """Iterate over the parents that define the given name as an attribute. + + :param name: The name to find definitions for. + :type name: str + + :returns: The parents that define the given name as + an instance attribute. + :rtype: iterable(NodeNG) + """ + for astroid in self.ancestors(context=context): + if name in astroid.instance_attrs: + yield astroid + + def has_base(self, node): + """Whether this class directly inherits from the given node. + + :param node: The node to check for. + :type node: NodeNG + + :returns: True if this class directly inherits from the given node. + :rtype: bool + """ + return node in self.bases + + def local_attr(self, name, context=None): + """Get the list of assign nodes associated to the given name. + + Assignments are looked for in both this class and in parents. + + :returns: The list of assignments to the given name. + :rtype: list(NodeNG) + + :raises AttributeInferenceError: If no attribute with this name + can be found in this class or parent classes. + """ + result = [] + if name in self.locals: + result = self.locals[name] + else: + class_node = next(self.local_attr_ancestors(name, context), ()) + if class_node: + result = class_node.locals[name] + result = [n for n in result if not isinstance(n, node_classes.DelAttr)] + if result: + return result + raise exceptions.AttributeInferenceError(target=self, attribute=name, + context=context) + + def instance_attr(self, name, context=None): + """Get the list of nodes associated to the given attribute name. + + Assignments are looked for in both this class and in parents. + + :returns: The list of assignments to the given name. + :rtype: list(NodeNG) + + :raises AttributeInferenceError: If no attribute with this name + can be found in this class or parent classes. + """ + # Return a copy, so we don't modify self.instance_attrs, + # which could lead to infinite loop. + values = list(self.instance_attrs.get(name, [])) + # get all values from parents + for class_node in self.instance_attr_ancestors(name, context): + values += class_node.instance_attrs[name] + values = [n for n in values if not isinstance(n, node_classes.DelAttr)] + if values: + return values + raise exceptions.AttributeInferenceError(target=self, attribute=name, + context=context) + + def instantiate_class(self): + """Get an :class:`Instance` of the :class:`ClassDef` node. + + :returns: An :class:`Instance` of the :class:`ClassDef` node, + or self if this is not possible. + :rtype: Instance or ClassDef + """ + return bases.Instance(self) + + def getattr(self, name, context=None, class_context=True): + """Get an attribute from this class, using Python's attribute semantic. + + This method doesn't look in the :attr:`instance_attrs` dictionary + since it is done by an :class:`Instance` proxy at inference time. + It may return an :class:`Uninferable` object if + the attribute has not been + found, but a ``__getattr__`` or ``__getattribute__`` method is defined. + If ``class_context`` is given, then it is considered that the + attribute is accessed from a class context, + e.g. ClassDef.attribute, otherwise it might have been accessed + from an instance as well. If ``class_context`` is used in that + case, then a lookup in the implicit metaclass and the explicit + metaclass will be done. + + :param name: The attribute to look for. + :type name: str + + :param class_context: Whether the attribute can be accessed statically. + :type class_context: bool + + :returns: The attribute. + :rtype: list(NodeNG) + + :raises AttributeInferenceError: If the attribute cannot be inferred. + """ + values = self.locals.get(name, []) + if name in self.special_attributes and class_context and not values: + result = [self.special_attributes.lookup(name)] + if name == '__bases__': + # Need special treatment, since they are mutable + # and we need to return all the values. + result += values + return result + + # don't modify the list in self.locals! + values = list(values) + for classnode in self.ancestors(recurs=True, context=context): + values += classnode.locals.get(name, []) + + if class_context: + values += self._metaclass_lookup_attribute(name, context) + + if not values: + raise exceptions.AttributeInferenceError(target=self, attribute=name, + context=context) + return values + + def _metaclass_lookup_attribute(self, name, context): + """Search the given name in the implicit and the explicit metaclass.""" + attrs = set() + implicit_meta = self.implicit_metaclass() + metaclass = self.metaclass() + for cls in {implicit_meta, metaclass}: + if cls and cls != self and isinstance(cls, ClassDef): + cls_attributes = self._get_attribute_from_metaclass( + cls, name, context) + attrs.update(set(cls_attributes)) + return attrs + + def _get_attribute_from_metaclass(self, cls, name, context): + try: + attrs = cls.getattr(name, context=context, + class_context=True) + except exceptions.AttributeInferenceError: + return + + for attr in bases._infer_stmts(attrs, context, frame=cls): + if not isinstance(attr, FunctionDef): + yield attr + continue + + if bases._is_property(attr): + yield from attr.infer_call_result(self, context) + continue + if attr.type == 'classmethod': + # If the method is a classmethod, then it will + # be bound to the metaclass, not to the class + # from where the attribute is retrieved. + # get_wrapping_class could return None, so just + # default to the current class. + frame = get_wrapping_class(attr) or self + yield bases.BoundMethod(attr, frame) + elif attr.type == 'staticmethod': + yield attr + else: + yield bases.BoundMethod(attr, self) + + def igetattr(self, name, context=None, class_context=True): + """Infer the possible values of the given variable. + + :param name: The name of the variable to infer. + :type name: str + + :returns: The inferred possible values. + :rtype: iterable(NodeNG or Uninferable) + """ + # set lookup name since this is necessary to infer on import nodes for + # instance + context = contextmod.copy_context(context) + context.lookupname = name + try: + attr = self.getattr(name, context, class_context=class_context)[0] + for inferred in bases._infer_stmts([attr], context, frame=self): + # yield Uninferable object instead of descriptors when necessary + if (not isinstance(inferred, node_classes.Const) + and isinstance(inferred, bases.Instance)): + try: + inferred._proxied.getattr('__get__', context) + except exceptions.AttributeInferenceError: + yield inferred + else: + yield util.Uninferable + else: + yield function_to_method(inferred, self) + except exceptions.AttributeInferenceError as error: + if not name.startswith('__') and self.has_dynamic_getattr(context): + # class handle some dynamic attributes, return a Uninferable object + yield util.Uninferable + else: + raise exceptions.InferenceError( + error.message, + target=self, + attribute=name, + context=context, + ) + + def has_dynamic_getattr(self, context=None): + """Check if the class has a custom __getattr__ or __getattribute__. + + If any such method is found and it is not from + builtins, nor from an extension module, then the function + will return True. + + :returns: True if the class has a custom + __getattr__ or __getattribute__, False otherwise. + :rtype: bool + """ + def _valid_getattr(node): + root = node.root() + return root.name != BUILTINS and getattr(root, 'pure_python', None) + + try: + return _valid_getattr(self.getattr('__getattr__', context)[0]) + except exceptions.AttributeInferenceError: + #if self.newstyle: XXX cause an infinite recursion error + try: + getattribute = self.getattr('__getattribute__', context)[0] + return _valid_getattr(getattribute) + except exceptions.AttributeInferenceError: + pass + return False + + def getitem(self, index, context=None): + """Return the inference of a subscript. + + This is basically looking up the method in the metaclass and calling it. + + :returns: The inferred value of a subscript to this class. + :rtype: NodeNG + + :raises AstroidTypeError: If this class does not define a + ``__getitem__`` method. + """ + try: + methods = dunder_lookup.lookup(self, '__getitem__') + except exceptions.AttributeInferenceError as exc: + raise exceptions.AstroidTypeError(node=self, context=context) from exc + + method = methods[0] + + # Create a new callcontext for providing index as an argument. + new_context = contextmod.bind_context_to_node(context, self) + new_context.callcontext = contextmod.CallContext(args=[index]) + + try: + return next(method.infer_call_result(self, new_context)) + except exceptions.InferenceError: + return util.Uninferable + + def methods(self): + """Iterate over all of the method defined in this class and its parents. + + :returns: The methods defined on the class. + :rtype: iterable(FunctionDef) + """ + done = {} + for astroid in itertools.chain(iter((self,)), self.ancestors()): + for meth in astroid.mymethods(): + if meth.name in done: + continue + done[meth.name] = None + yield meth + + def mymethods(self): + """Iterate over all of the method defined in this class only. + + :returns: The methods defined on the class. + :rtype: iterable(FunctionDef) + """ + for member in self.values(): + if isinstance(member, FunctionDef): + yield member + + def implicit_metaclass(self): + """Get the implicit metaclass of the current class. + + For newstyle classes, this will return an instance of builtins.type. + For oldstyle classes, it will simply return None, since there's + no implicit metaclass there. + + :returns: The metaclass. + :rtype: builtins.type or None + """ + if self.newstyle: + return builtin_lookup('type')[1][0] + return None + + _metaclass = None + def declared_metaclass(self, context=None): + """Return the explicit declared metaclass for the current class. + + An explicit declared metaclass is defined + either by passing the ``metaclass`` keyword argument + in the class definition line (Python 3) or (Python 2) by + having a ``__metaclass__`` class attribute, or if there are + no explicit bases but there is a global ``__metaclass__`` variable. + + :returns: The metaclass of this class, + or None if one could not be found. + :rtype: NodeNG or None + """ + for base in self.bases: + try: + for baseobj in base.infer(context=context): + if isinstance(baseobj, ClassDef) and baseobj.hide: + self._metaclass = baseobj._metaclass + self._metaclass_hack = True + break + except exceptions.InferenceError: + pass + + if self._metaclass: + # Expects this from Py3k TreeRebuilder + try: + return next(node for node in self._metaclass.infer(context=context) + if node is not util.Uninferable) + except (exceptions.InferenceError, StopIteration): + return None + + return None + + def _find_metaclass(self, seen=None, context=None): + if seen is None: + seen = set() + seen.add(self) + + klass = self.declared_metaclass(context=context) + if klass is None: + for parent in self.ancestors(context=context): + if parent not in seen: + klass = parent._find_metaclass(seen) + if klass is not None: + break + return klass + + def metaclass(self, context=None): + """Get the metaclass of this class. + + If this class does not define explicitly a metaclass, + then the first defined metaclass in ancestors will be used + instead. + + :returns: The metaclass of this class. + :rtype: NodeNG or None + """ + return self._find_metaclass(context=context) + + def has_metaclass_hack(self): + return self._metaclass_hack + + def _islots(self): + """ Return an iterator with the inferred slots. """ + if '__slots__' not in self.locals: + return None + for slots in self.igetattr('__slots__'): + # check if __slots__ is a valid type + for meth in ITER_METHODS: + try: + slots.getattr(meth) + break + except exceptions.AttributeInferenceError: + continue + else: + continue + + if isinstance(slots, node_classes.Const): + # a string. Ignore the following checks, + # but yield the node, only if it has a value + if slots.value: + yield slots + continue + if not hasattr(slots, 'itered'): + # we can't obtain the values, maybe a .deque? + continue + + if isinstance(slots, node_classes.Dict): + values = [item[0] for item in slots.items] + else: + values = slots.itered() + if values is util.Uninferable: + continue + if not values: + # Stop the iteration, because the class + # has an empty list of slots. + return values + + for elt in values: + try: + for inferred in elt.infer(): + if inferred is util.Uninferable: + continue + if (not isinstance(inferred, node_classes.Const) or + not isinstance(inferred.value, str)): + continue + if not inferred.value: + continue + yield inferred + except exceptions.InferenceError: + continue + + return None + + def _slots(self): + if not self.newstyle: + raise NotImplementedError( + "The concept of slots is undefined for old-style classes.") + + slots = self._islots() + try: + first = next(slots) + except StopIteration as exc: + # The class doesn't have a __slots__ definition or empty slots. + if exc.args and exc.args[0] not in ('', None): + return exc.args[0] + return None + return [first] + list(slots) + + # Cached, because inferring them all the time is expensive + @decorators_mod.cached + def slots(self): + """Get all the slots for this node. + + :returns: The names of slots for this class. + If the class doesn't define any slot, through the ``__slots__`` + variable, then this function will return a None. + Also, it will return None in the case the slots were not inferred. + :rtype: list(str) or None + """ + def grouped_slots(): + # Not interested in object, since it can't have slots. + for cls in self.mro()[:-1]: + try: + cls_slots = cls._slots() + except NotImplementedError: + continue + if cls_slots is not None: + yield from cls_slots + else: + yield None + + if not self.newstyle: + raise NotImplementedError( + "The concept of slots is undefined for old-style classes.") + + slots = list(grouped_slots()) + if not all(slot is not None for slot in slots): + return None + + return sorted(slots, key=lambda item: item.value) + + def _inferred_bases(self, context=None): + # Similar with .ancestors, but the difference is when one base is inferred, + # only the first object is wanted. That's because + # we aren't interested in superclasses, as in the following + # example: + # + # class SomeSuperClass(object): pass + # class SomeClass(SomeSuperClass): pass + # class Test(SomeClass): pass + # + # Inferring SomeClass from the Test's bases will give + # us both SomeClass and SomeSuperClass, but we are interested + # only in SomeClass. + + if context is None: + context = contextmod.InferenceContext() + if not self.bases and self.qname() != 'builtins.object': + yield builtin_lookup("object")[1][0] + return + + for stmt in self.bases: + try: + baseobj = next(stmt.infer(context=context)) + except exceptions.InferenceError: + continue + if isinstance(baseobj, bases.Instance): + baseobj = baseobj._proxied + if not isinstance(baseobj, ClassDef): + continue + if not baseobj.hide: + yield baseobj + else: + yield from baseobj.bases + + def _compute_mro(self, context=None): + inferred_bases = list(self._inferred_bases(context=context)) + bases_mro = [] + for base in inferred_bases: + if base is self: + continue + + try: + mro = base._compute_mro(context=context) + bases_mro.append(mro) + except NotImplementedError: + # Some classes have in their ancestors both newstyle and + # old style classes. For these we can't retrieve the .mro, + # although in Python it's possible, since the class we are + # currently working is in fact new style. + # So, we fallback to ancestors here. + ancestors = list(base.ancestors(context=context)) + bases_mro.append(ancestors) + + unmerged_mro = ([[self]] + bases_mro + [inferred_bases]) + _verify_duplicates_mro(unmerged_mro, self, context) + return _c3_merge(unmerged_mro, self, context) + + def mro(self, context=None): + """Get the method resolution order, using C3 linearization. + + :returns: The list of ancestors, sorted by the mro. + :rtype: list(NodeNG) + + :raises NotImplementedError: If this is an old style class, + since they don't have the concept of an MRO. + :raises DuplicateBasesError: Duplicate bases in the same class base + :raises InconsistentMroError: A class' MRO is inconsistent + """ + + if not self.newstyle: + raise NotImplementedError( + "Could not obtain mro for old-style classes.") + + return self._compute_mro(context=context) + + def bool_value(self): + """Determine the boolean value of this node. + + :returns: The boolean value of this node. + For a :class:`ClassDef` this is always ``True``. + :rtype: bool + """ + return True + + def get_children(self): + if self.decorators is not None: + yield self.decorators + + yield from self.bases + yield from self.body + + def _get_assign_nodes(self): + for child_node in self.body: + yield from child_node._get_assign_nodes() diff --git a/venv/Lib/site-packages/astroid/test_utils.py b/venv/Lib/site-packages/astroid/test_utils.py new file mode 100644 index 00000000..757fe8de --- /dev/null +++ b/venv/Lib/site-packages/astroid/test_utils.py @@ -0,0 +1,64 @@ +# Copyright (c) 2013-2014 Google, Inc. +# Copyright (c) 2014 LOGILAB S.A. (Paris, FRANCE) +# Copyright (c) 2015-2016, 2018 Claudiu Popa +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2016 Jakub Wilk +# Copyright (c) 2018 Anthony Sottile + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +"""Utility functions for test code that uses astroid ASTs as input.""" +import contextlib +import functools +import sys +import warnings + +from astroid import nodes + + +def require_version(minver=None, maxver=None): + """ Compare version of python interpreter to the given one. Skip the test + if older. + """ + def parse(string, default=None): + string = string or default + try: + return tuple(int(v) for v in string.split('.')) + except ValueError as exc: + raise ValueError( + '{string} is not a correct version : should be X.Y[.Z].'.format(string=string) + ) from exc + + def check_require_version(f): + current = sys.version_info[:3] + if parse(minver, "0") < current <= parse(maxver, "4"): + return f + + str_version = '.'.join(str(v) for v in sys.version_info) + @functools.wraps(f) + def new_f(self, *args, **kwargs): + if minver is not None: + self.skipTest('Needs Python > %s. Current version is %s.' + % (minver, str_version)) + elif maxver is not None: + self.skipTest('Needs Python <= %s. Current version is %s.' + % (maxver, str_version)) + return new_f + + + return check_require_version + +def get_name_node(start_from, name, index=0): + return [n for n in start_from.nodes_of_class(nodes.Name) if n.name == name][index] + + +@contextlib.contextmanager +def enable_warning(warning): + warnings.simplefilter('always', warning) + try: + yield + finally: + # Reset it to default value, so it will take + # into account the values from the -W flag. + warnings.simplefilter('default', warning) diff --git a/venv/Lib/site-packages/astroid/transforms.py b/venv/Lib/site-packages/astroid/transforms.py new file mode 100644 index 00000000..8ade6f64 --- /dev/null +++ b/venv/Lib/site-packages/astroid/transforms.py @@ -0,0 +1,83 @@ +# Copyright (c) 2015-2016, 2018 Claudiu Popa +# Copyright (c) 2016 Ceridwen +# Copyright (c) 2018 Nick Drozd + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + + +import collections + + +class TransformVisitor: + """A visitor for handling transforms. + + The standard approach of using it is to call + :meth:`~visit` with an *astroid* module and the class + will take care of the rest, walking the tree and running the + transforms for each encountered node. + """ + + def __init__(self): + self.transforms = collections.defaultdict(list) + + def _transform(self, node): + """Call matching transforms for the given node if any and return the + transformed node. + """ + cls = node.__class__ + if cls not in self.transforms: + # no transform registered for this class of node + return node + + transforms = self.transforms[cls] + for transform_func, predicate in transforms: + if predicate is None or predicate(node): + ret = transform_func(node) + # if the transformation function returns something, it's + # expected to be a replacement for the node + if ret is not None: + node = ret + if ret.__class__ != cls: + # Can no longer apply the rest of the transforms. + break + return node + + def _visit(self, node): + if hasattr(node, '_astroid_fields'): + for field in node._astroid_fields: + value = getattr(node, field) + visited = self._visit_generic(value) + setattr(node, field, visited) + return self._transform(node) + + def _visit_generic(self, node): + if isinstance(node, list): + return [self._visit_generic(child) for child in node] + if isinstance(node, tuple): + return tuple(self._visit_generic(child) for child in node) + + return self._visit(node) + + def register_transform(self, node_class, transform, predicate=None): + """Register `transform(node)` function to be applied on the given + astroid's `node_class` if `predicate` is None or returns true + when called with the node as argument. + + The transform function may return a value which is then used to + substitute the original node in the tree. + """ + self.transforms[node_class].append((transform, predicate)) + + def unregister_transform(self, node_class, transform, predicate=None): + """Unregister the given transform.""" + self.transforms[node_class].remove((transform, predicate)) + + def visit(self, module): + """Walk the given astroid *tree* and transform each encountered node + + Only the nodes which have transforms registered will actually + be replaced or changed. + """ + module.body = [self._visit(child) for child in module.body] + return self._transform(module) diff --git a/venv/Lib/site-packages/astroid/util.py b/venv/Lib/site-packages/astroid/util.py new file mode 100644 index 00000000..9fa4d358 --- /dev/null +++ b/venv/Lib/site-packages/astroid/util.py @@ -0,0 +1,156 @@ +# Copyright (c) 2015-2018 Claudiu Popa +# Copyright (c) 2015-2016 Ceridwen +# Copyright (c) 2018 Bryce Guinta +# Copyright (c) 2018 Nick Drozd + +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER + +import warnings +from itertools import islice + +import importlib +import lazy_object_proxy + + +def lazy_descriptor(obj): + class DescriptorProxy(lazy_object_proxy.Proxy): + def __get__(self, instance, owner=None): + return self.__class__.__get__(self, instance) + return DescriptorProxy(obj) + + +def lazy_import(module_name): + return lazy_object_proxy.Proxy( + lambda: importlib.import_module('.' + module_name, 'astroid')) + + +@object.__new__ +class Uninferable: + """Special inference object, which is returned when inference fails.""" + def __repr__(self): + return 'Uninferable' + __str__ = __repr__ + + def __getattribute__(self, name): + if name == 'next': + raise AttributeError('next method should not be called') + if name.startswith('__') and name.endswith('__'): + return object.__getattribute__(self, name) + if name == 'accept': + return object.__getattribute__(self, name) + return self + + def __call__(self, *args, **kwargs): + return self + + def __bool__(self): + return False + + __nonzero__ = __bool__ + + def accept(self, visitor): + func = getattr(visitor, "visit_uninferable") + return func(self) + +class BadOperationMessage: + """Object which describes a TypeError occurred somewhere in the inference chain + + This is not an exception, but a container object which holds the types and + the error which occurred. + """ + + +class BadUnaryOperationMessage(BadOperationMessage): + """Object which describes operational failures on UnaryOps.""" + + def __init__(self, operand, op, error): + self.operand = operand + self.op = op + self.error = error + + @property + def _object_type_helper(self): + helpers = lazy_import('helpers') + return helpers.object_type + + def _object_type(self, obj): + # pylint: disable=not-callable; can't infer lazy_import + objtype = self._object_type_helper(obj) + if objtype is Uninferable: + return None + + return objtype + + def __str__(self): + if hasattr(self.operand, 'name'): + operand_type = self.operand.name + else: + object_type = self._object_type(self.operand) + if hasattr(object_type, 'name'): + operand_type = object_type.name + else: + # Just fallback to as_string + operand_type = object_type.as_string() + + msg = "bad operand type for unary {}: {}" + return msg.format(self.op, operand_type) + + +class BadBinaryOperationMessage(BadOperationMessage): + """Object which describes type errors for BinOps.""" + + def __init__(self, left_type, op, right_type): + self.left_type = left_type + self.right_type = right_type + self.op = op + + def __str__(self): + msg = "unsupported operand type(s) for {}: {!r} and {!r}" + return msg.format(self.op, self.left_type.name, self.right_type.name) + + +def _instancecheck(cls, other): + wrapped = cls.__wrapped__ + other_cls = other.__class__ + is_instance_of = wrapped is other_cls or issubclass(other_cls, wrapped) + warnings.warn("%r is deprecated and slated for removal in astroid " + "2.0, use %r instead" % (cls.__class__.__name__, + wrapped.__name__), + PendingDeprecationWarning, stacklevel=2) + return is_instance_of + + +def proxy_alias(alias_name, node_type): + """Get a Proxy from the given name to the given node type.""" + proxy = type(alias_name, (lazy_object_proxy.Proxy,), + {'__class__': object.__dict__['__class__'], + '__instancecheck__': _instancecheck}) + return proxy(lambda: node_type) + + +def limit_inference(iterator, size): + """Limit inference amount. + + Limit inference amount to help with performance issues with + exponentially exploding possible results. + + :param iterator: Inference generator to limit + :type iterator: Iterator(NodeNG) + + :param size: Maximum mount of nodes yielded plus an + Uninferable at the end if limit reached + :type size: int + + :yields: A possibly modified generator + :rtype param: Iterable + """ + yield from islice(iterator, size) + has_more = next(iterator, False) + if has_more is not False: + yield Uninferable + return + + +# Backwards-compatibility aliases +YES = Uninferable diff --git a/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/INSTALLER b/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/METADATA b/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/METADATA new file mode 100644 index 00000000..a40ab31e --- /dev/null +++ b/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/METADATA @@ -0,0 +1,144 @@ +Metadata-Version: 2.1 +Name: atomicwrites +Version: 1.2.1 +Summary: Atomic file writes. +Home-page: https://github.com/untitaker/python-atomicwrites +Author: Markus Unterwaditzer +Author-email: markus@unterwaditzer.net +License: MIT +Platform: UNKNOWN +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* + +=================== +python-atomicwrites +=================== + +.. image:: https://travis-ci.org/untitaker/python-atomicwrites.svg?branch=master + :target: https://travis-ci.org/untitaker/python-atomicwrites + +.. image:: https://ci.appveyor.com/api/projects/status/vadc4le3c27to59x/branch/master?svg=true + :target: https://ci.appveyor.com/project/untitaker/python-atomicwrites/branch/master + +Atomic file writes. + +.. code-block:: python + + from atomicwrites import atomic_write + + with atomic_write('foo.txt', overwrite=True) as f: + f.write('Hello world.') + # "foo.txt" doesn't exist yet. + + # Now it does. + + +Features that distinguish it from other similar libraries (see `Alternatives and Credit`_): + +- Race-free assertion that the target file doesn't yet exist. This can be + controlled with the ``overwrite`` parameter. + +- Windows support, although not well-tested. The MSDN resources are not very + explicit about which operations are atomic. I'm basing my assumptions off `a + comment + `_ + by `Doug Crook + `_, who appears + to be a Microsoft employee: + + FAQ: Is MoveFileEx atomic + Frequently asked question: Is MoveFileEx atomic if the existing and new + files are both on the same drive? + + The simple answer is "usually, but in some cases it will silently fall-back + to a non-atomic method, so don't count on it". + + The implementation of MoveFileEx looks something like this: [...] + + The problem is if the rename fails, you might end up with a CopyFile, which + is definitely not atomic. + + If you really need atomic-or-nothing, you can try calling + NtSetInformationFile, which is unsupported but is much more likely to be + atomic. + +- Simple high-level API that wraps a very flexible class-based API. + +- Consistent error handling across platforms. + + +How it works +============ + +It uses a temporary file in the same directory as the given path. This ensures +that the temporary file resides on the same filesystem. + +The temporary file will then be atomically moved to the target location: On +POSIX, it will use ``rename`` if files should be overwritten, otherwise a +combination of ``link`` and ``unlink``. On Windows, it uses MoveFileEx_ through +stdlib's ``ctypes`` with the appropriate flags. + +Note that with ``link`` and ``unlink``, there's a timewindow where the file +might be available under two entries in the filesystem: The name of the +temporary file, and the name of the target file. + +Also note that the permissions of the target file may change this way. In some +situations a ``chmod`` can be issued without any concurrency problems, but +since that is not always the case, this library doesn't do it by itself. + +.. _MoveFileEx: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365240%28v=vs.85%29.aspx + +fsync +----- + +On POSIX, ``fsync`` is invoked on the temporary file after it is written (to +flush file content and metadata), and on the parent directory after the file is +moved (to flush filename). + +``fsync`` does not take care of disks' internal buffers, but there don't seem +to be any standard POSIX APIs for that. On OS X, ``fcntl`` is used with +``F_FULLFSYNC`` instead of ``fsync`` for that reason. + +On Windows, `_commit `_ +is used, but there are no guarantees about disk internal buffers. + +Alternatives and Credit +======================= + +Atomicwrites is directly inspired by the following libraries (and shares a +minimal amount of code): + +- The Trac project's `utility functions + `_, + also used in `Werkzeug `_ and + `mitsuhiko/python-atomicfile + `_. The idea to use + ``ctypes`` instead of ``PyWin32`` originated there. + +- `abarnert/fatomic `_. Windows support + (based on ``PyWin32``) was originally taken from there. + +Other alternatives to atomicwrites include: + +- `sashka/atomicfile `_. Originally I + considered using that, but at the time it was lacking a lot of features I + needed (Windows support, overwrite-parameter, overriding behavior through + subclassing). + +- The `Boltons library collection `_ + features a class for atomic file writes, which seems to have a very similar + ``overwrite`` parameter. It is lacking Windows support though. + +License +======= + +Licensed under the MIT, see ``LICENSE``. + + diff --git a/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/RECORD b/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/RECORD new file mode 100644 index 00000000..012e2409 --- /dev/null +++ b/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/RECORD @@ -0,0 +1,7 @@ +atomicwrites-1.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +atomicwrites-1.2.1.dist-info/METADATA,sha256=AonIELPa6iqBgB6sFxVLRkuOt7NMWuLI3mcG0YIFo1g,5535 +atomicwrites-1.2.1.dist-info/RECORD,, +atomicwrites-1.2.1.dist-info/WHEEL,sha256=gduuPyBvFJQSQ0zdyxF7k0zynDXbIbvg5ZBHoXum5uk,110 +atomicwrites-1.2.1.dist-info/top_level.txt,sha256=ks64zKVUkrl2ZrrP046CsytXlSGf8gLG-IcoXpNyeoc,13 +atomicwrites/__init__.py,sha256=6Z_VoDMWXYqHDnMDg6MBmXmMxf0xGUzsEgthbY9Zxxw,6428 +atomicwrites/__pycache__/__init__.cpython-37.pyc,, diff --git a/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/WHEEL b/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/WHEEL new file mode 100644 index 00000000..1316c41d --- /dev/null +++ b/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/top_level.txt b/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/top_level.txt new file mode 100644 index 00000000..5fa5a87d --- /dev/null +++ b/venv/Lib/site-packages/atomicwrites-1.2.1.dist-info/top_level.txt @@ -0,0 +1 @@ +atomicwrites diff --git a/venv/Lib/site-packages/atomicwrites/__init__.py b/venv/Lib/site-packages/atomicwrites/__init__.py new file mode 100644 index 00000000..768e2aed --- /dev/null +++ b/venv/Lib/site-packages/atomicwrites/__init__.py @@ -0,0 +1,214 @@ +import contextlib +import io +import os +import sys +import tempfile + +try: + import fcntl +except ImportError: + fcntl = None + +__version__ = '1.2.1' + + +PY2 = sys.version_info[0] == 2 + +text_type = unicode if PY2 else str # noqa + + +def _path_to_unicode(x): + if not isinstance(x, text_type): + return x.decode(sys.getfilesystemencoding()) + return x + + +DEFAULT_MODE = "wb" if PY2 else "w" + + +_proper_fsync = os.fsync + + +if sys.platform != 'win32': + if hasattr(fcntl, 'F_FULLFSYNC'): + def _proper_fsync(fd): + # https://lists.apple.com/archives/darwin-dev/2005/Feb/msg00072.html + # https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/fsync.2.html + # https://github.com/untitaker/python-atomicwrites/issues/6 + fcntl.fcntl(fd, fcntl.F_FULLFSYNC) + + def _sync_directory(directory): + # Ensure that filenames are written to disk + fd = os.open(directory, 0) + try: + _proper_fsync(fd) + finally: + os.close(fd) + + def _replace_atomic(src, dst): + os.rename(src, dst) + _sync_directory(os.path.normpath(os.path.dirname(dst))) + + def _move_atomic(src, dst): + os.link(src, dst) + os.unlink(src) + + src_dir = os.path.normpath(os.path.dirname(src)) + dst_dir = os.path.normpath(os.path.dirname(dst)) + _sync_directory(dst_dir) + if src_dir != dst_dir: + _sync_directory(src_dir) +else: + from ctypes import windll, WinError + + _MOVEFILE_REPLACE_EXISTING = 0x1 + _MOVEFILE_WRITE_THROUGH = 0x8 + _windows_default_flags = _MOVEFILE_WRITE_THROUGH + + def _handle_errors(rv): + if not rv: + raise WinError() + + def _replace_atomic(src, dst): + _handle_errors(windll.kernel32.MoveFileExW( + _path_to_unicode(src), _path_to_unicode(dst), + _windows_default_flags | _MOVEFILE_REPLACE_EXISTING + )) + + def _move_atomic(src, dst): + _handle_errors(windll.kernel32.MoveFileExW( + _path_to_unicode(src), _path_to_unicode(dst), + _windows_default_flags + )) + + +def replace_atomic(src, dst): + ''' + Move ``src`` to ``dst``. If ``dst`` exists, it will be silently + overwritten. + + Both paths must reside on the same filesystem for the operation to be + atomic. + ''' + return _replace_atomic(src, dst) + + +def move_atomic(src, dst): + ''' + Move ``src`` to ``dst``. There might a timewindow where both filesystem + entries exist. If ``dst`` already exists, :py:exc:`FileExistsError` will be + raised. + + Both paths must reside on the same filesystem for the operation to be + atomic. + ''' + return _move_atomic(src, dst) + + +class AtomicWriter(object): + ''' + A helper class for performing atomic writes. Usage:: + + with AtomicWriter(path).open() as f: + f.write(...) + + :param path: The destination filepath. May or may not exist. + :param mode: The filemode for the temporary file. This defaults to `wb` in + Python 2 and `w` in Python 3. + :param overwrite: If set to false, an error is raised if ``path`` exists. + Errors are only raised after the file has been written to. Either way, + the operation is atomic. + + If you need further control over the exact behavior, you are encouraged to + subclass. + ''' + + def __init__(self, path, mode=DEFAULT_MODE, overwrite=False, + **open_kwargs): + if 'a' in mode: + raise ValueError( + 'Appending to an existing file is not supported, because that ' + 'would involve an expensive `copy`-operation to a temporary ' + 'file. Open the file in normal `w`-mode and copy explicitly ' + 'if that\'s what you\'re after.' + ) + if 'x' in mode: + raise ValueError('Use the `overwrite`-parameter instead.') + if 'w' not in mode: + raise ValueError('AtomicWriters can only be written to.') + + self._path = path + self._mode = mode + self._overwrite = overwrite + self._open_kwargs = open_kwargs + + def open(self): + ''' + Open the temporary file. + ''' + return self._open(self.get_fileobject) + + @contextlib.contextmanager + def _open(self, get_fileobject): + f = None # make sure f exists even if get_fileobject() fails + try: + success = False + with get_fileobject(**self._open_kwargs) as f: + yield f + self.sync(f) + self.commit(f) + success = True + finally: + if not success: + try: + self.rollback(f) + except Exception: + pass + + def get_fileobject(self, dir=None, **kwargs): + '''Return the temporary file to use.''' + if dir is None: + dir = os.path.normpath(os.path.dirname(self._path)) + descriptor, name = tempfile.mkstemp(dir=dir) + # io.open() will take either the descriptor or the name, but we need + # the name later for commit()/replace_atomic() and couldn't find a way + # to get the filename from the descriptor. + os.close(descriptor) + kwargs['mode'] = self._mode + kwargs['file'] = name + return io.open(**kwargs) + + def sync(self, f): + '''responsible for clearing as many file caches as possible before + commit''' + f.flush() + _proper_fsync(f.fileno()) + + def commit(self, f): + '''Move the temporary file to the target location.''' + if self._overwrite: + replace_atomic(f.name, self._path) + else: + move_atomic(f.name, self._path) + + def rollback(self, f): + '''Clean up all temporary resources.''' + os.unlink(f.name) + + +def atomic_write(path, writer_cls=AtomicWriter, **cls_kwargs): + ''' + Simple atomic writes. This wraps :py:class:`AtomicWriter`:: + + with atomic_write(path) as f: + f.write(...) + + :param path: The target path to write to. + :param writer_cls: The writer class to use. This parameter is useful if you + subclassed :py:class:`AtomicWriter` to change some behavior and want to + use that new subclass. + + Additional keyword arguments are passed to the writer class. See + :py:class:`AtomicWriter`. + ''' + return writer_cls(path, **cls_kwargs).open() diff --git a/venv/Lib/site-packages/atomicwrites/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/atomicwrites/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..102b8c54eba3cb48411ab14ffcd9f0d1d0c3ccd5 GIT binary patch literal 6313 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/attr/__init__.py b/venv/Lib/site-packages/attr/__init__.py new file mode 100644 index 00000000..debfd57b --- /dev/null +++ b/venv/Lib/site-packages/attr/__init__.py @@ -0,0 +1,65 @@ +from __future__ import absolute_import, division, print_function + +from functools import partial + +from . import converters, exceptions, filters, validators +from ._config import get_run_validators, set_run_validators +from ._funcs import asdict, assoc, astuple, evolve, has +from ._make import ( + NOTHING, + Attribute, + Factory, + attrib, + attrs, + fields, + fields_dict, + make_class, + validate, +) + + +__version__ = "18.2.0" + +__title__ = "attrs" +__description__ = "Classes Without Boilerplate" +__url__ = "https://www.attrs.org/" +__uri__ = __url__ +__doc__ = __description__ + " <" + __uri__ + ">" + +__author__ = "Hynek Schlawack" +__email__ = "hs@ox.cx" + +__license__ = "MIT" +__copyright__ = "Copyright (c) 2015 Hynek Schlawack" + + +s = attributes = attrs +ib = attr = attrib +dataclass = partial(attrs, auto_attribs=True) # happy Easter ;) + +__all__ = [ + "Attribute", + "Factory", + "NOTHING", + "asdict", + "assoc", + "astuple", + "attr", + "attrib", + "attributes", + "attrs", + "converters", + "evolve", + "exceptions", + "fields", + "fields_dict", + "filters", + "get_run_validators", + "has", + "ib", + "make_class", + "s", + "set_run_validators", + "validate", + "validators", +] diff --git a/venv/Lib/site-packages/attr/__init__.pyi b/venv/Lib/site-packages/attr/__init__.pyi new file mode 100644 index 00000000..492fb85e --- /dev/null +++ b/venv/Lib/site-packages/attr/__init__.pyi @@ -0,0 +1,252 @@ +from typing import ( + Any, + Callable, + Dict, + Generic, + List, + Optional, + Sequence, + Mapping, + Tuple, + Type, + TypeVar, + Union, + overload, +) + +# `import X as X` is required to make these public +from . import exceptions as exceptions +from . import filters as filters +from . import converters as converters +from . import validators as validators + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_ValidatorType = Callable[[Any, Attribute, _T], Any] +_ConverterType = Callable[[Any], _T] +_FilterType = Callable[[Attribute, Any], bool] +# FIXME: in reality, if multiple validators are passed they must be in a list or tuple, +# but those are invariant and so would prevent subtypes of _ValidatorType from working +# when passed in a list or tuple. +_ValidatorArgType = Union[_ValidatorType[_T], Sequence[_ValidatorType[_T]]] + +# _make -- + +NOTHING: object + +# NOTE: Factory lies about its return type to make this possible: `x: List[int] = Factory(list)` +# Work around mypy issue #4554 in the common case by using an overload. +@overload +def Factory(factory: Callable[[], _T]) -> _T: ... +@overload +def Factory( + factory: Union[Callable[[Any], _T], Callable[[], _T]], + takes_self: bool = ..., +) -> _T: ... + +class Attribute(Generic[_T]): + name: str + default: Optional[_T] + validator: Optional[_ValidatorType[_T]] + repr: bool + cmp: bool + hash: Optional[bool] + init: bool + converter: Optional[_ConverterType[_T]] + metadata: Dict[Any, Any] + type: Optional[Type[_T]] + kw_only: bool + def __lt__(self, x: Attribute) -> bool: ... + def __le__(self, x: Attribute) -> bool: ... + def __gt__(self, x: Attribute) -> bool: ... + def __ge__(self, x: Attribute) -> bool: ... + +# NOTE: We had several choices for the annotation to use for type arg: +# 1) Type[_T] +# - Pros: Handles simple cases correctly +# - Cons: Might produce less informative errors in the case of conflicting TypeVars +# e.g. `attr.ib(default='bad', type=int)` +# 2) Callable[..., _T] +# - Pros: Better error messages than #1 for conflicting TypeVars +# - Cons: Terrible error messages for validator checks. +# e.g. attr.ib(type=int, validator=validate_str) +# -> error: Cannot infer function type argument +# 3) type (and do all of the work in the mypy plugin) +# - Pros: Simple here, and we could customize the plugin with our own errors. +# - Cons: Would need to write mypy plugin code to handle all the cases. +# We chose option #1. + +# `attr` lies about its return type to make the following possible: +# attr() -> Any +# attr(8) -> int +# attr(validator=) -> Whatever the callable expects. +# This makes this type of assignments possible: +# x: int = attr(8) +# +# This form catches explicit None or no default but with no other arguments returns Any. +@overload +def attrib( + default: None = ..., + validator: None = ..., + repr: bool = ..., + cmp: bool = ..., + hash: Optional[bool] = ..., + init: bool = ..., + convert: None = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + type: None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the other arguments. +@overload +def attrib( + default: None = ..., + validator: Optional[_ValidatorArgType[_T]] = ..., + repr: bool = ..., + cmp: bool = ..., + hash: Optional[bool] = ..., + init: bool = ..., + convert: Optional[_ConverterType[_T]] = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + type: Optional[Type[_T]] = ..., + converter: Optional[_ConverterType[_T]] = ..., + factory: Optional[Callable[[], _T]] = ..., + kw_only: bool = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def attrib( + default: _T, + validator: Optional[_ValidatorArgType[_T]] = ..., + repr: bool = ..., + cmp: bool = ..., + hash: Optional[bool] = ..., + init: bool = ..., + convert: Optional[_ConverterType[_T]] = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + type: Optional[Type[_T]] = ..., + converter: Optional[_ConverterType[_T]] = ..., + factory: Optional[Callable[[], _T]] = ..., + kw_only: bool = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def attrib( + default: Optional[_T] = ..., + validator: Optional[_ValidatorArgType[_T]] = ..., + repr: bool = ..., + cmp: bool = ..., + hash: Optional[bool] = ..., + init: bool = ..., + convert: Optional[_ConverterType[_T]] = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + type: object = ..., + converter: Optional[_ConverterType[_T]] = ..., + factory: Optional[Callable[[], _T]] = ..., + kw_only: bool = ..., +) -> Any: ... +@overload +def attrs( + maybe_cls: _C, + these: Optional[Dict[str, Any]] = ..., + repr_ns: Optional[str] = ..., + repr: bool = ..., + cmp: bool = ..., + hash: Optional[bool] = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., +) -> _C: ... +@overload +def attrs( + maybe_cls: None = ..., + these: Optional[Dict[str, Any]] = ..., + repr_ns: Optional[str] = ..., + repr: bool = ..., + cmp: bool = ..., + hash: Optional[bool] = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., +) -> Callable[[_C], _C]: ... + +# TODO: add support for returning NamedTuple from the mypy plugin +class _Fields(Tuple[Attribute, ...]): + def __getattr__(self, name: str) -> Attribute: ... + +def fields(cls: type) -> _Fields: ... +def fields_dict(cls: type) -> Dict[str, Attribute]: ... +def validate(inst: Any) -> None: ... + +# TODO: add support for returning a proper attrs class from the mypy plugin +# we use Any instead of _CountingAttr so that e.g. `make_class('Foo', [attr.ib()])` is valid +def make_class( + name: str, + attrs: Union[List[str], Tuple[str, ...], Dict[str, Any]], + bases: Tuple[type, ...] = ..., + repr_ns: Optional[str] = ..., + repr: bool = ..., + cmp: bool = ..., + hash: Optional[bool] = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., +) -> type: ... + +# _funcs -- + +# TODO: add support for returning TypedDict from the mypy plugin +# FIXME: asdict/astuple do not honor their factory args. waiting on one of these: +# https://github.com/python/mypy/issues/4236 +# https://github.com/python/typing/issues/253 +def asdict( + inst: Any, + recurse: bool = ..., + filter: Optional[_FilterType] = ..., + dict_factory: Type[Mapping[Any, Any]] = ..., + retain_collection_types: bool = ..., +) -> Dict[str, Any]: ... + +# TODO: add support for returning NamedTuple from the mypy plugin +def astuple( + inst: Any, + recurse: bool = ..., + filter: Optional[_FilterType] = ..., + tuple_factory: Type[Sequence] = ..., + retain_collection_types: bool = ..., +) -> Tuple[Any, ...]: ... +def has(cls: type) -> bool: ... +def assoc(inst: _T, **changes: Any) -> _T: ... +def evolve(inst: _T, **changes: Any) -> _T: ... + +# _config -- + +def set_run_validators(run: bool) -> None: ... +def get_run_validators() -> bool: ... + +# aliases -- + +s = attributes = attrs +ib = attr = attrib +dataclass = attrs # Technically, partial(attrs, auto_attribs=True) ;) diff --git a/venv/Lib/site-packages/attr/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/attr/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c717d9ea53c66cc222a31c24d8d9c757f092f2c GIT binary patch literal 1416 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 GrT+kiIuITJ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/attr/__pycache__/_config.cpython-37.pyc b/venv/Lib/site-packages/attr/__pycache__/_config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c77ea040b29b51958893e72445c07892845ca179 GIT binary patch literal 735 zcma)4&2AGh5cba|*{%qcQcj$Ft5%|ss`dgx75!6%fF7D~2`jCfwUe&!u2;4t2j@<}M=wC_AsB%K zR;a==T#*^6=!{|{h@eX{i$uhGq9@2_H0z7Lps)_aV1m;42i!y{_1k=IwQ8Nr%c{}F z`B;>z(w4gR4;xd~E?=~D;etQ1(&eVD^A%U6;7%LsN6UX=(*g%qcDbz!91cdiD;bs0_y9#(f|Me literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/attr/__pycache__/_funcs.cpython-37.pyc b/venv/Lib/site-packages/attr/__pycache__/_funcs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7196b4e188df40b9d75ab2bab2a0d2d92c069c4 GIT binary patch literal 7542 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 Gr~eMk?%wGD literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/attr/__pycache__/_make.cpython-37.pyc b/venv/Lib/site-packages/attr/__pycache__/_make.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..caf06258636801a8d278c66c1af554640516e66b GIT binary patch literal 50346 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/attr/__pycache__/converters.cpython-37.pyc b/venv/Lib/site-packages/attr/__pycache__/converters.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b62b8cd99ac5e796d05b81de7a90ade235c0bea2 GIT binary patch literal 2329 zcma)8-EQMV6!uS=INtO}yNd)8E6oKLB%;=K0RhpnYWIh3B{m?ni%^JUJNB5G+8%3W zoT^cl3tEZt7I3-Gzyt6OzU6A40EsKknK*G(Qx+8j31*02Trm9TlH z4K3OXTagi3Vf#!Uw!_xG*0ra1>_;q3S(coTLeQv4NWiiQ<&tvY*sow4t!tL+{#dZ2 zkkpOSoN-xNVLXXN%(8MV=W!<8sK^2d{Z~4!Fv`~8n}er&gWaOvARPBNBlE`q60c#esm6cpH01CB$0UZlWo z(rsvFknSUkcS3DnJBQvW5~UAbLQ|Ts0o>Zl%yH0-_V4pY{n2v)dySs$?C$RUyyZN8 zvOn6%^T)pQM_)5I-spg)`6!R`%{UVhj=Q;aG?{$Cicdz!uu$!28CN*@NqKX@wYwaD z2T?Ym(R531=+h4tQ=Iz=ZX+Hzi;;Sf0@*bL0hN#FS;6U^Sf#s?l5lRc-7yQ#!Nref77H1 zGmTS&N9Wp44gS4c2^%<1=@e_pdSPT8)oaarGXs)g`7Z&IO5^K<3rgcOPyB!`6<3La zj88}}q>*1FvPVEjpfeSUQvpMSMWh$a3#oTmq}8H6`3_Z9m4nh_9M!vkMsr_)N*(eo z+~e#=tRj{4EST>ELWN!WK?3jl9;V-^O4lQ>TogH0J`F!2hwPYwhE*+ip7f8Xa0N{w z&#OvLA%}Rdtd}tfh_MW=R#kPLKGyl7(o~tNh)_xrFhd7tUK@LuG`h;`F`(zKu>}50tj(M+lnfE2j2)?3hj{Y@q#!Mbw3gTyBoh#yVdTkh$ zts2jTWV|s8b427AurElsn1L@3cv0KfHCFSvbFZ?R!Sustg+PjhAagE=SBVMo$cb0w z$8)BizU52;j;!*Aq&U;9i`qawF{Mi#q2#Om+&FT(+ndJ%erl literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/attr/__pycache__/exceptions.cpython-37.pyc b/venv/Lib/site-packages/attr/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ed89cf01a807b5cdf643e58ae9dc2b9a224501e GIT binary patch literal 2138 zcmb_d%Wfk@6m7fh_z~O5JcI;nN^HPFF@zb-fCXsGWG0FP0g+@D#!|c7Rd!0#UDc_F z8D}vYSnwLl1vq#FfAazY3s@-$($cV$mWSmu9EPRfFkodC{ur>3SAGbGRlpTi1zhD@fNOxa zSPgK^<2v9vYXENW20U*9ZnAB_+a7NNZm~Atw#O~jISINuf57fRH_UhF#Hhqs9*Hzl z+U9j8=E4Xi^G>FPw9(Yb*aD96jn!3xn@8|BZ$aR}u*8C4nU#hiD-SEYGAj+MEQEb3 z`JJa)U2=IOjioZ?PqbG0^0y{|Ye1&{*#{y`ou!k66S15|&Z!|2&LyGN@-(xY5vyQ? zq>72D;H=m5YaCgU3S83=d(L6PIh_loiJFq}Skja;>#~HK@t8~F!HexiX#gyV}O z<;Kt%_sdbqh;frRp~g?`^A~Y{Jg`=a35euRKVEL#>ybIvC>3RlvwolKKj`iEKJ*J+ z-ifJv*Al}mQYcKGd~Bq z1ycL)*V*I#=*+<0qpt>shet2>dk0TWMuRLnpq7rlR549Pr=Z#>6WN}ZG)eaMpU>x? zD0hE^$1y&RfE~}!T+_=Ix(XX$dYUZ=^?IdTDfzMMo!^B?SDgpH!~AU&%d8bUR`#iK zk`=yR6uwLF#-9RQS)~_=l}i{(HWgq3_0AWvfnn5o*Bp>0)I5i5m@54$A3j?8aNMnE zq@!yX>KGar)?yZSZ5-=BxD9_(hET71d?W66f$czg0Ul!p6{JN$nn)%0HoSd`ZPGl0 z>A(sKP9gWryp=xxH`yKFh{d}ii}*%l-#Fk?>JmFhG^cEF!fiqKrzKrhJl;^mQYZ?r zVAm6q_qvb)SaZVstI#!v7yMeAs%1P@n%Y-c|8QM`H?ba*`JJ^ITN?3=)OhnuQYn?C z(5cqRUkLJYDM;b?_rji|z0Rr#Yd}oQXQ$e65CVJN+WVC{IA1wvBE&ATRg>}?LD~Ly zQatS4dyNXX1+?G)hYW~sB*U$57I0j7s?^uXvgUO`|4L4CYMtgp^9v{7BQpbbsqzCc zmzHFHkyUryWDu19s_$RZd_V5JPSIn*-(OR%YQ)FgHg@N!!&63)#(tnf4A>s?&Q*hb zkIb9TXyS?wgl`-g3o37Y>!cOwavZZtqo#hB>v~XL|Frlfe2!mOgI(%wxZByS!>_U1 F_#5#@76kwR literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/attr/__pycache__/filters.cpython-37.pyc b/venv/Lib/site-packages/attr/__pycache__/filters.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d56e7132e339cad0e5b5e8cc379752da8767eb6 GIT binary patch literal 1807 zcmbtUON-n_5bl=dq0!FTYiHv;2u6nx7=uMN$;Dz>yxt8a;P_xCF-#ORT6IsXOzYw9 z*2X)G17R0z|B?{MPslz0LD!u87ko-pk2E`WNHAE?)m5#kuE$r^w>CFj0^gsX|MmT^ z9YX#_q5UjiZo*P`fG{#9j515m%o|h`6 zOpm}i!Jqiy4yls^Sn6XS+9Y~L7UYne(o+hu&8%~IYC#H}`JwBt@V$Ttq_v>mL7o~kq zB(Vs;;aM4$X?Z=(m5znDzB4;MzEM*!a|H!^#`GY;k{;4Z>)ummne*nbhoI)1QQhSYcatP)KwsW26RMd zJ*UsfQ}UEfEgXq6=Luar*@E!p5bOBPM zyX=QRpOm~&2~6Vz6TE4Hjnp2X4jjOoG#X}5R-HWwJ=J)Ws2Z&F03s0|2|ii&9_EK1 z?zrB8r7iBuy-P%d> zL{yAN9y%~y>HLG{@Vs?eEog3p0YJY9n|v1uf({4U$eS)O7xxKga5^^ZJDaXju27h!sf`)oui@IJ~SpiX=9S z#J5r6n1W7HWF-tW+SlDEi)YJM!gP(nUgCXgL%){UZdR~L@ICX^;@i=&wyhx@+K%g7 F`Ukagti}KU literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/attr/__pycache__/validators.cpython-37.pyc b/venv/Lib/site-packages/attr/__pycache__/validators.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38332357da2913d0b81829faff907c1731fb2535 GIT binary patch literal 5747 zcmc&&Npl;=6`laP@T)DX4o8?1l8;q)p<4#s`-rSEW5yJpgK23wZJZd>S9JU$1brdsLr#W zJkT0%>|d$hiTeF04EF4y znbtD6d91Z8vL4P{A&cR^$|^W}HJNwsXWM?88OKf@Ib>g8HfTrQVJQguXELsMus7FafEnA0T>M(7l8F3ybPbMFN z@U9S%NUGgP^u1Wjsd?8`M{r%@DS6OMELsVB!@}YMX#TE=EBO1*XLp(#pGhv{#vj)1 z-MjzQ4d;Wq4>r~YgAcse+xRGgPBtF${$OL^53Z@*gW%eYo!#B{qT$UAfRwp^ z4)&57B!D(u_Z&8nh+`OTN;h=Nuyp!W4UF~uE2o*-$=7zsY3ZVW6HVEC1_M}GBa6be zI;?4~?>AO+)xcLzg2jefY*J@oi(3s{DX(FOOW>4_b@2v`Nh4|ZGmPjEshQu#om39^ zGNDu2^~MA(BtyDxQg_{c#D)Qlr(E|7*gAb8YP1(wQT&`bo4S+z)rf=;q`+x3Sw&Yf zszz;2&5bCBf=nrgxFR65V^WLmeGAPg2VEZSiHL!a@Z~GD4fBOkBIE;)C{3LVjk{>A-Izx}pB)N$;-Jw3eXzDiF>%;S$`$-1>kMfWo0cY~lJH+ui zIs~cqHGudVT`rG+Ge8@`3#cZFL-T(M%&ViooV~s51H2&Nj$TJ$@{^w5>6I{=MO=o9 zvC}X!Of9Gtey%qv;uknztDdoA@9&9=m`G8DV7OtWsB)QRe@Yzz@3?U&`hSNe3Dmw4sfXCB?F2GT|32N~c zb#GIraF8~51rELglK0R~aBx=8+-u?BWw^PDnjaqrLp$2sMzkVA@lq$Ru|vGffqxpm0N9h3_VAgI`{K9Iq{biTMOoCf>Z#k5~KNlMb1LB z0zQ>c1j0Ft+GY48SIWG8JVNR1`zd)IVdakipC4y=^y%X#!8 zZSV@Dc^4#`v{8|9RRztBAdQKM!c3HL#VA0;LTtn+MvisLzhb=GvOMfxFU-UG-VUW< zVJTnA)#upu8qg*4mJ$IHEhtd=bNbfmU_HtW$$>%ne7HR&uy`t#GN)tg4u9+GQYJf=N9)@KN-Xb8p#5F%jaTzG9Sn z6)_k_;k80eumwJr^Rm)LMNx)L@~nxrYSUi%Lo8OT9mn29Ekk80W1Kac_KjaVH=OHZ z57SysJ^n2{wyzc&UIkC3%+n5(C0mwQfb|oL#893g$W!39%DGOGc$Iuj;gLW~!)>~* zPw5@p78ilaZM4@%a?a>y^#zojs^Gj(*4-;0?({-)35BLxLN-+mW#W`|KsgkhFVCUW_{GTfR}#5E zwsA3Ej%iAbFRvo6g8ft4qQJCiL31ORMy{ybXRM0+{)Ol@Rz;o|@%76{MBb1-tCW+c zO&(Bf38x}J%9WcZLBPd_m{wIKN>dfv&nHhQU$DrQ)2A9m+Dt3NY#K-w1kn?~Q#MhC zp@N1Y9ii!7dcOn z>*UN-%A;;hfl7si>LGlWyd!hr@em`J`5RiA5Y4VP=93B6MPiwL@aPWXp}+?ZLH;C6 z>d3K^ic2p$g_Y_XW19L;(jzQaUyG7znoO%|R-B=w?@&i6Sc= (3, 6): + ordered_dict = dict +else: + from collections import OrderedDict + + ordered_dict = OrderedDict + + +if PY2: + from UserDict import IterableUserDict + + # We 'bundle' isclass instead of using inspect as importing inspect is + # fairly expensive (order of 10-15 ms for a modern machine in 2016) + def isclass(klass): + return isinstance(klass, (type, types.ClassType)) + + # TYPE is used in exceptions, repr(int) is different on Python 2 and 3. + TYPE = "type" + + def iteritems(d): + return d.iteritems() + + # Python 2 is bereft of a read-only dict proxy, so we make one! + class ReadOnlyDict(IterableUserDict): + """ + Best-effort read-only dict wrapper. + """ + + def __setitem__(self, key, val): + # We gently pretend we're a Python 3 mappingproxy. + raise TypeError( + "'mappingproxy' object does not support item assignment" + ) + + def update(self, _): + # We gently pretend we're a Python 3 mappingproxy. + raise AttributeError( + "'mappingproxy' object has no attribute 'update'" + ) + + def __delitem__(self, _): + # We gently pretend we're a Python 3 mappingproxy. + raise TypeError( + "'mappingproxy' object does not support item deletion" + ) + + def clear(self): + # We gently pretend we're a Python 3 mappingproxy. + raise AttributeError( + "'mappingproxy' object has no attribute 'clear'" + ) + + def pop(self, key, default=None): + # We gently pretend we're a Python 3 mappingproxy. + raise AttributeError( + "'mappingproxy' object has no attribute 'pop'" + ) + + def popitem(self): + # We gently pretend we're a Python 3 mappingproxy. + raise AttributeError( + "'mappingproxy' object has no attribute 'popitem'" + ) + + def setdefault(self, key, default=None): + # We gently pretend we're a Python 3 mappingproxy. + raise AttributeError( + "'mappingproxy' object has no attribute 'setdefault'" + ) + + def __repr__(self): + # Override to be identical to the Python 3 version. + return "mappingproxy(" + repr(self.data) + ")" + + def metadata_proxy(d): + res = ReadOnlyDict() + res.data.update(d) # We blocked update, so we have to do it like this. + return res + + +else: + + def isclass(klass): + return isinstance(klass, type) + + TYPE = "class" + + def iteritems(d): + return d.items() + + def metadata_proxy(d): + return types.MappingProxyType(dict(d)) + + +def import_ctypes(): + """ + Moved into a function for testability. + """ + import ctypes + + return ctypes + + +if not PY2: + + def just_warn(*args, **kw): + """ + We only warn on Python 3 because we are not aware of any concrete + consequences of not setting the cell on Python 2. + """ + warnings.warn( + "Missing ctypes. Some features like bare super() or accessing " + "__class__ will not work with slots classes.", + RuntimeWarning, + stacklevel=2, + ) + + +else: + + def just_warn(*args, **kw): # pragma: nocover + """ + We only warn on Python 3 because we are not aware of any concrete + consequences of not setting the cell on Python 2. + """ + + +def make_set_closure_cell(): + """ + Moved into a function for testability. + """ + if PYPY: # pragma: no cover + + def set_closure_cell(cell, value): + cell.__setstate__((value,)) + + else: + try: + ctypes = import_ctypes() + + set_closure_cell = ctypes.pythonapi.PyCell_Set + set_closure_cell.argtypes = (ctypes.py_object, ctypes.py_object) + set_closure_cell.restype = ctypes.c_int + except Exception: + # We try best effort to set the cell, but sometimes it's not + # possible. For example on Jython or on GAE. + set_closure_cell = just_warn + return set_closure_cell + + +set_closure_cell = make_set_closure_cell() diff --git a/venv/Lib/site-packages/attr/_config.py b/venv/Lib/site-packages/attr/_config.py new file mode 100644 index 00000000..8ec92096 --- /dev/null +++ b/venv/Lib/site-packages/attr/_config.py @@ -0,0 +1,23 @@ +from __future__ import absolute_import, division, print_function + + +__all__ = ["set_run_validators", "get_run_validators"] + +_run_validators = True + + +def set_run_validators(run): + """ + Set whether or not validators are run. By default, they are run. + """ + if not isinstance(run, bool): + raise TypeError("'run' must be bool.") + global _run_validators + _run_validators = run + + +def get_run_validators(): + """ + Return whether or not validators are run. + """ + return _run_validators diff --git a/venv/Lib/site-packages/attr/_funcs.py b/venv/Lib/site-packages/attr/_funcs.py new file mode 100644 index 00000000..b61d2394 --- /dev/null +++ b/venv/Lib/site-packages/attr/_funcs.py @@ -0,0 +1,290 @@ +from __future__ import absolute_import, division, print_function + +import copy + +from ._compat import iteritems +from ._make import NOTHING, _obj_setattr, fields +from .exceptions import AttrsAttributeNotFoundError + + +def asdict( + inst, + recurse=True, + filter=None, + dict_factory=dict, + retain_collection_types=False, +): + """ + Return the ``attrs`` attribute values of *inst* as a dict. + + Optionally recurse into other ``attrs``-decorated classes. + + :param inst: Instance of an ``attrs``-decorated class. + :param bool recurse: Recurse into classes that are also + ``attrs``-decorated. + :param callable filter: A callable whose return code determines whether an + attribute or element is included (``True``) or dropped (``False``). Is + called with the :class:`attr.Attribute` as the first argument and the + value as the second argument. + :param callable dict_factory: A callable to produce dictionaries from. For + example, to produce ordered dictionaries instead of normal Python + dictionaries, pass in ``collections.OrderedDict``. + :param bool retain_collection_types: Do not convert to ``list`` when + encountering an attribute whose type is ``tuple`` or ``set``. Only + meaningful if ``recurse`` is ``True``. + + :rtype: return type of *dict_factory* + + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + .. versionadded:: 16.0.0 *dict_factory* + .. versionadded:: 16.1.0 *retain_collection_types* + """ + attrs = fields(inst.__class__) + rv = dict_factory() + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + if recurse is True: + if has(v.__class__): + rv[a.name] = asdict( + v, True, filter, dict_factory, retain_collection_types + ) + elif isinstance(v, (tuple, list, set)): + cf = v.__class__ if retain_collection_types is True else list + rv[a.name] = cf( + [ + _asdict_anything( + i, filter, dict_factory, retain_collection_types + ) + for i in v + ] + ) + elif isinstance(v, dict): + df = dict_factory + rv[a.name] = df( + ( + _asdict_anything( + kk, filter, df, retain_collection_types + ), + _asdict_anything( + vv, filter, df, retain_collection_types + ), + ) + for kk, vv in iteritems(v) + ) + else: + rv[a.name] = v + else: + rv[a.name] = v + return rv + + +def _asdict_anything(val, filter, dict_factory, retain_collection_types): + """ + ``asdict`` only works on attrs instances, this works on anything. + """ + if getattr(val.__class__, "__attrs_attrs__", None) is not None: + # Attrs class. + rv = asdict(val, True, filter, dict_factory, retain_collection_types) + elif isinstance(val, (tuple, list, set)): + cf = val.__class__ if retain_collection_types is True else list + rv = cf( + [ + _asdict_anything( + i, filter, dict_factory, retain_collection_types + ) + for i in val + ] + ) + elif isinstance(val, dict): + df = dict_factory + rv = df( + ( + _asdict_anything(kk, filter, df, retain_collection_types), + _asdict_anything(vv, filter, df, retain_collection_types), + ) + for kk, vv in iteritems(val) + ) + else: + rv = val + return rv + + +def astuple( + inst, + recurse=True, + filter=None, + tuple_factory=tuple, + retain_collection_types=False, +): + """ + Return the ``attrs`` attribute values of *inst* as a tuple. + + Optionally recurse into other ``attrs``-decorated classes. + + :param inst: Instance of an ``attrs``-decorated class. + :param bool recurse: Recurse into classes that are also + ``attrs``-decorated. + :param callable filter: A callable whose return code determines whether an + attribute or element is included (``True``) or dropped (``False``). Is + called with the :class:`attr.Attribute` as the first argument and the + value as the second argument. + :param callable tuple_factory: A callable to produce tuples from. For + example, to produce lists instead of tuples. + :param bool retain_collection_types: Do not convert to ``list`` + or ``dict`` when encountering an attribute which type is + ``tuple``, ``dict`` or ``set``. Only meaningful if ``recurse`` is + ``True``. + + :rtype: return type of *tuple_factory* + + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + .. versionadded:: 16.2.0 + """ + attrs = fields(inst.__class__) + rv = [] + retain = retain_collection_types # Very long. :/ + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + if recurse is True: + if has(v.__class__): + rv.append( + astuple( + v, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + ) + elif isinstance(v, (tuple, list, set)): + cf = v.__class__ if retain is True else list + rv.append( + cf( + [ + astuple( + j, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(j.__class__) + else j + for j in v + ] + ) + ) + elif isinstance(v, dict): + df = v.__class__ if retain is True else dict + rv.append( + df( + ( + astuple( + kk, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(kk.__class__) + else kk, + astuple( + vv, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(vv.__class__) + else vv, + ) + for kk, vv in iteritems(v) + ) + ) + else: + rv.append(v) + else: + rv.append(v) + return rv if tuple_factory is list else tuple_factory(rv) + + +def has(cls): + """ + Check whether *cls* is a class with ``attrs`` attributes. + + :param type cls: Class to introspect. + :raise TypeError: If *cls* is not a class. + + :rtype: :class:`bool` + """ + return getattr(cls, "__attrs_attrs__", None) is not None + + +def assoc(inst, **changes): + """ + Copy *inst* and apply *changes*. + + :param inst: Instance of a class with ``attrs`` attributes. + :param changes: Keyword changes in the new copy. + + :return: A copy of inst with *changes* incorporated. + + :raise attr.exceptions.AttrsAttributeNotFoundError: If *attr_name* couldn't + be found on *cls*. + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + .. deprecated:: 17.1.0 + Use :func:`evolve` instead. + """ + import warnings + + warnings.warn( + "assoc is deprecated and will be removed after 2018/01.", + DeprecationWarning, + stacklevel=2, + ) + new = copy.copy(inst) + attrs = fields(inst.__class__) + for k, v in iteritems(changes): + a = getattr(attrs, k, NOTHING) + if a is NOTHING: + raise AttrsAttributeNotFoundError( + "{k} is not an attrs attribute on {cl}.".format( + k=k, cl=new.__class__ + ) + ) + _obj_setattr(new, k, v) + return new + + +def evolve(inst, **changes): + """ + Create a new instance, based on *inst* with *changes* applied. + + :param inst: Instance of a class with ``attrs`` attributes. + :param changes: Keyword changes in the new copy. + + :return: A copy of inst with *changes* incorporated. + + :raise TypeError: If *attr_name* couldn't be found in the class + ``__init__``. + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + .. versionadded:: 17.1.0 + """ + cls = inst.__class__ + attrs = fields(cls) + for a in attrs: + if not a.init: + continue + attr_name = a.name # To deal with private attributes. + init_name = attr_name if attr_name[0] != "_" else attr_name[1:] + if init_name not in changes: + changes[init_name] = getattr(inst, attr_name) + return cls(**changes) diff --git a/venv/Lib/site-packages/attr/_make.py b/venv/Lib/site-packages/attr/_make.py new file mode 100644 index 00000000..f7fd05e7 --- /dev/null +++ b/venv/Lib/site-packages/attr/_make.py @@ -0,0 +1,2034 @@ +from __future__ import absolute_import, division, print_function + +import copy +import hashlib +import linecache +import sys +import threading +import warnings + +from operator import itemgetter + +from . import _config +from ._compat import ( + PY2, + isclass, + iteritems, + metadata_proxy, + ordered_dict, + set_closure_cell, +) +from .exceptions import ( + DefaultAlreadySetError, + FrozenInstanceError, + NotAnAttrsClassError, + PythonTooOldError, + UnannotatedAttributeError, +) + + +# This is used at least twice, so cache it here. +_obj_setattr = object.__setattr__ +_init_converter_pat = "__attr_converter_{}" +_init_factory_pat = "__attr_factory_{}" +_tuple_property_pat = ( + " {attr_name} = _attrs_property(_attrs_itemgetter({index}))" +) +_classvar_prefixes = ("typing.ClassVar", "t.ClassVar", "ClassVar") +# we don't use a double-underscore prefix because that triggers +# name mangling when trying to create a slot for the field +# (when slots=True) +_hash_cache_field = "_attrs_cached_hash" + +_empty_metadata_singleton = metadata_proxy({}) + + +class _Nothing(object): + """ + Sentinel class to indicate the lack of a value when ``None`` is ambiguous. + + ``_Nothing`` is a singleton. There is only ever one of it. + """ + + _singleton = None + + def __new__(cls): + if _Nothing._singleton is None: + _Nothing._singleton = super(_Nothing, cls).__new__(cls) + return _Nothing._singleton + + def __repr__(self): + return "NOTHING" + + +NOTHING = _Nothing() +""" +Sentinel to indicate the lack of a value when ``None`` is ambiguous. +""" + + +def attrib( + default=NOTHING, + validator=None, + repr=True, + cmp=True, + hash=None, + init=True, + convert=None, + metadata=None, + type=None, + converter=None, + factory=None, + kw_only=False, +): + """ + Create a new attribute on a class. + + .. warning:: + + Does *not* do anything unless the class is also decorated with + :func:`attr.s`! + + :param default: A value that is used if an ``attrs``-generated ``__init__`` + is used and no value is passed while instantiating or the attribute is + excluded using ``init=False``. + + If the value is an instance of :class:`Factory`, its callable will be + used to construct a new value (useful for mutable data types like lists + or dicts). + + If a default is not set (or set manually to ``attr.NOTHING``), a value + *must* be supplied when instantiating; otherwise a :exc:`TypeError` + will be raised. + + The default can also be set using decorator notation as shown below. + + :type default: Any value. + + :param callable factory: Syntactic sugar for + ``default=attr.Factory(callable)``. + + :param validator: :func:`callable` that is called by ``attrs``-generated + ``__init__`` methods after the instance has been initialized. They + receive the initialized instance, the :class:`Attribute`, and the + passed value. + + The return value is *not* inspected so the validator has to throw an + exception itself. + + If a ``list`` is passed, its items are treated as validators and must + all pass. + + Validators can be globally disabled and re-enabled using + :func:`get_run_validators`. + + The validator can also be set using decorator notation as shown below. + + :type validator: ``callable`` or a ``list`` of ``callable``\\ s. + + :param bool repr: Include this attribute in the generated ``__repr__`` + method. + :param bool cmp: Include this attribute in the generated comparison methods + (``__eq__`` et al). + :param hash: Include this attribute in the generated ``__hash__`` + method. If ``None`` (default), mirror *cmp*'s value. This is the + correct behavior according the Python spec. Setting this value to + anything else than ``None`` is *discouraged*. + :type hash: ``bool`` or ``None`` + :param bool init: Include this attribute in the generated ``__init__`` + method. It is possible to set this to ``False`` and set a default + value. In that case this attributed is unconditionally initialized + with the specified default value or factory. + :param callable converter: :func:`callable` that is called by + ``attrs``-generated ``__init__`` methods to converter attribute's value + to the desired format. It is given the passed-in value, and the + returned value will be used as the new value of the attribute. The + value is converted before being passed to the validator, if any. + :param metadata: An arbitrary mapping, to be used by third-party + components. See :ref:`extending_metadata`. + :param type: The type of the attribute. In Python 3.6 or greater, the + preferred method to specify the type is using a variable annotation + (see `PEP 526 `_). + This argument is provided for backward compatibility. + Regardless of the approach used, the type will be stored on + ``Attribute.type``. + + Please note that ``attrs`` doesn't do anything with this metadata by + itself. You can use it as part of your own code or for + :doc:`static type checking `. + :param kw_only: Make this attribute keyword-only (Python 3+) + in the generated ``__init__`` (if ``init`` is ``False``, this + parameter is ignored). + + .. versionadded:: 15.2.0 *convert* + .. versionadded:: 16.3.0 *metadata* + .. versionchanged:: 17.1.0 *validator* can be a ``list`` now. + .. versionchanged:: 17.1.0 + *hash* is ``None`` and therefore mirrors *cmp* by default. + .. versionadded:: 17.3.0 *type* + .. deprecated:: 17.4.0 *convert* + .. versionadded:: 17.4.0 *converter* as a replacement for the deprecated + *convert* to achieve consistency with other noun-based arguments. + .. versionadded:: 18.1.0 + ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``. + .. versionadded:: 18.2.0 *kw_only* + """ + if hash is not None and hash is not True and hash is not False: + raise TypeError( + "Invalid value for hash. Must be True, False, or None." + ) + + if convert is not None: + if converter is not None: + raise RuntimeError( + "Can't pass both `convert` and `converter`. " + "Please use `converter` only." + ) + warnings.warn( + "The `convert` argument is deprecated in favor of `converter`. " + "It will be removed after 2019/01.", + DeprecationWarning, + stacklevel=2, + ) + converter = convert + + if factory is not None: + if default is not NOTHING: + raise ValueError( + "The `default` and `factory` arguments are mutually " + "exclusive." + ) + if not callable(factory): + raise ValueError("The `factory` argument must be a callable.") + default = Factory(factory) + + if metadata is None: + metadata = {} + + return _CountingAttr( + default=default, + validator=validator, + repr=repr, + cmp=cmp, + hash=hash, + init=init, + converter=converter, + metadata=metadata, + type=type, + kw_only=kw_only, + ) + + +def _make_attr_tuple_class(cls_name, attr_names): + """ + Create a tuple subclass to hold `Attribute`s for an `attrs` class. + + The subclass is a bare tuple with properties for names. + + class MyClassAttributes(tuple): + __slots__ = () + x = property(itemgetter(0)) + """ + attr_class_name = "{}Attributes".format(cls_name) + attr_class_template = [ + "class {}(tuple):".format(attr_class_name), + " __slots__ = ()", + ] + if attr_names: + for i, attr_name in enumerate(attr_names): + attr_class_template.append( + _tuple_property_pat.format(index=i, attr_name=attr_name) + ) + else: + attr_class_template.append(" pass") + globs = {"_attrs_itemgetter": itemgetter, "_attrs_property": property} + eval(compile("\n".join(attr_class_template), "", "exec"), globs) + + return globs[attr_class_name] + + +# Tuple class for extracted attributes from a class definition. +# `base_attrs` is a subset of `attrs`. +_Attributes = _make_attr_tuple_class( + "_Attributes", + [ + # all attributes to build dunder methods for + "attrs", + # attributes that have been inherited + "base_attrs", + # map inherited attributes to their originating classes + "base_attrs_map", + ], +) + + +def _is_class_var(annot): + """ + Check whether *annot* is a typing.ClassVar. + + The string comparison hack is used to avoid evaluating all string + annotations which would put attrs-based classes at a performance + disadvantage compared to plain old classes. + """ + return str(annot).startswith(_classvar_prefixes) + + +def _get_annotations(cls): + """ + Get annotations for *cls*. + """ + anns = getattr(cls, "__annotations__", None) + if anns is None: + return {} + + # Verify that the annotations aren't merely inherited. + for base_cls in cls.__mro__[1:]: + if anns is getattr(base_cls, "__annotations__", None): + return {} + + return anns + + +def _counter_getter(e): + """ + Key function for sorting to avoid re-creating a lambda for every class. + """ + return e[1].counter + + +def _transform_attrs(cls, these, auto_attribs, kw_only): + """ + Transform all `_CountingAttr`s on a class into `Attribute`s. + + If *these* is passed, use that and don't look for them on the class. + + Return an `_Attributes`. + """ + cd = cls.__dict__ + anns = _get_annotations(cls) + + if these is not None: + ca_list = [(name, ca) for name, ca in iteritems(these)] + + if not isinstance(these, ordered_dict): + ca_list.sort(key=_counter_getter) + elif auto_attribs is True: + ca_names = { + name + for name, attr in cd.items() + if isinstance(attr, _CountingAttr) + } + ca_list = [] + annot_names = set() + for attr_name, type in anns.items(): + if _is_class_var(type): + continue + annot_names.add(attr_name) + a = cd.get(attr_name, NOTHING) + if not isinstance(a, _CountingAttr): + if a is NOTHING: + a = attrib() + else: + a = attrib(default=a) + ca_list.append((attr_name, a)) + + unannotated = ca_names - annot_names + if len(unannotated) > 0: + raise UnannotatedAttributeError( + "The following `attr.ib`s lack a type annotation: " + + ", ".join( + sorted(unannotated, key=lambda n: cd.get(n).counter) + ) + + "." + ) + else: + ca_list = sorted( + ( + (name, attr) + for name, attr in cd.items() + if isinstance(attr, _CountingAttr) + ), + key=lambda e: e[1].counter, + ) + + own_attrs = [ + Attribute.from_counting_attr( + name=attr_name, ca=ca, type=anns.get(attr_name) + ) + for attr_name, ca in ca_list + ] + + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + taken_attr_names = {a.name: a for a in own_attrs} + + # Traverse the MRO and collect attributes. + for base_cls in cls.__mro__[1:-1]: + sub_attrs = getattr(base_cls, "__attrs_attrs__", None) + if sub_attrs is not None: + for a in sub_attrs: + prev_a = taken_attr_names.get(a.name) + # Only add an attribute if it hasn't been defined before. This + # allows for overwriting attribute definitions by subclassing. + if prev_a is None: + base_attrs.append(a) + taken_attr_names[a.name] = a + base_attr_map[a.name] = base_cls + + attr_names = [a.name for a in base_attrs + own_attrs] + + AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names) + + if kw_only: + own_attrs = [a._assoc(kw_only=True) for a in own_attrs] + base_attrs = [a._assoc(kw_only=True) for a in base_attrs] + + attrs = AttrsClass(base_attrs + own_attrs) + + had_default = False + was_kw_only = False + for a in attrs: + if ( + was_kw_only is False + and had_default is True + and a.default is NOTHING + and a.init is True + and a.kw_only is False + ): + raise ValueError( + "No mandatory attributes allowed after an attribute with a " + "default value or factory. Attribute in question: %r" % (a,) + ) + elif ( + had_default is False + and a.default is not NOTHING + and a.init is not False + and + # Keyword-only attributes without defaults can be specified + # after keyword-only attributes with defaults. + a.kw_only is False + ): + had_default = True + if was_kw_only is True and a.kw_only is False: + raise ValueError( + "Non keyword-only attributes are not allowed after a " + "keyword-only attribute. Attribute in question: {a!r}".format( + a=a + ) + ) + if was_kw_only is False and a.init is True and a.kw_only is True: + was_kw_only = True + + return _Attributes((attrs, base_attrs, base_attr_map)) + + +def _frozen_setattrs(self, name, value): + """ + Attached to frozen classes as __setattr__. + """ + raise FrozenInstanceError() + + +def _frozen_delattrs(self, name): + """ + Attached to frozen classes as __delattr__. + """ + raise FrozenInstanceError() + + +class _ClassBuilder(object): + """ + Iteratively build *one* class. + """ + + __slots__ = ( + "_cls", + "_cls_dict", + "_attrs", + "_base_names", + "_attr_names", + "_slots", + "_frozen", + "_weakref_slot", + "_cache_hash", + "_has_post_init", + "_delete_attribs", + "_base_attr_map", + ) + + def __init__( + self, + cls, + these, + slots, + frozen, + weakref_slot, + auto_attribs, + kw_only, + cache_hash, + ): + attrs, base_attrs, base_map = _transform_attrs( + cls, these, auto_attribs, kw_only + ) + + self._cls = cls + self._cls_dict = dict(cls.__dict__) if slots else {} + self._attrs = attrs + self._base_names = set(a.name for a in base_attrs) + self._base_attr_map = base_map + self._attr_names = tuple(a.name for a in attrs) + self._slots = slots + self._frozen = frozen or _has_frozen_base_class(cls) + self._weakref_slot = weakref_slot + self._cache_hash = cache_hash + self._has_post_init = bool(getattr(cls, "__attrs_post_init__", False)) + self._delete_attribs = not bool(these) + + self._cls_dict["__attrs_attrs__"] = self._attrs + + if frozen: + self._cls_dict["__setattr__"] = _frozen_setattrs + self._cls_dict["__delattr__"] = _frozen_delattrs + + def __repr__(self): + return "<_ClassBuilder(cls={cls})>".format(cls=self._cls.__name__) + + def build_class(self): + """ + Finalize class based on the accumulated configuration. + + Builder cannot be used after calling this method. + """ + if self._slots is True: + return self._create_slots_class() + else: + return self._patch_original_class() + + def _patch_original_class(self): + """ + Apply accumulated methods and return the class. + """ + cls = self._cls + base_names = self._base_names + + # Clean class of attribute definitions (`attr.ib()`s). + if self._delete_attribs: + for name in self._attr_names: + if ( + name not in base_names + and getattr(cls, name, None) is not None + ): + try: + delattr(cls, name) + except AttributeError: + # This can happen if a base class defines a class + # variable and we want to set an attribute with the + # same name by using only a type annotation. + pass + + # Attach our dunder methods. + for name, value in self._cls_dict.items(): + setattr(cls, name, value) + + return cls + + def _create_slots_class(self): + """ + Build and return a new class with a `__slots__` attribute. + """ + base_names = self._base_names + cd = { + k: v + for k, v in iteritems(self._cls_dict) + if k not in tuple(self._attr_names) + ("__dict__", "__weakref__") + } + + weakref_inherited = False + + # Traverse the MRO to check for an existing __weakref__. + for base_cls in self._cls.__mro__[1:-1]: + if "__weakref__" in getattr(base_cls, "__dict__", ()): + weakref_inherited = True + break + + names = self._attr_names + if ( + self._weakref_slot + and "__weakref__" not in getattr(self._cls, "__slots__", ()) + and "__weakref__" not in names + and not weakref_inherited + ): + names += ("__weakref__",) + + # We only add the names of attributes that aren't inherited. + # Settings __slots__ to inherited attributes wastes memory. + slot_names = [name for name in names if name not in base_names] + if self._cache_hash: + slot_names.append(_hash_cache_field) + cd["__slots__"] = tuple(slot_names) + + qualname = getattr(self._cls, "__qualname__", None) + if qualname is not None: + cd["__qualname__"] = qualname + + # __weakref__ is not writable. + state_attr_names = tuple( + an for an in self._attr_names if an != "__weakref__" + ) + + def slots_getstate(self): + """ + Automatically created by attrs. + """ + return tuple(getattr(self, name) for name in state_attr_names) + + def slots_setstate(self, state): + """ + Automatically created by attrs. + """ + __bound_setattr = _obj_setattr.__get__(self, Attribute) + for name, value in zip(state_attr_names, state): + __bound_setattr(name, value) + + # slots and frozen require __getstate__/__setstate__ to work + cd["__getstate__"] = slots_getstate + cd["__setstate__"] = slots_setstate + + # Create new class based on old class and our methods. + cls = type(self._cls)(self._cls.__name__, self._cls.__bases__, cd) + + # The following is a fix for + # https://github.com/python-attrs/attrs/issues/102. On Python 3, + # if a method mentions `__class__` or uses the no-arg super(), the + # compiler will bake a reference to the class in the method itself + # as `method.__closure__`. Since we replace the class with a + # clone, we rewrite these references so it keeps working. + for item in cls.__dict__.values(): + if isinstance(item, (classmethod, staticmethod)): + # Class- and staticmethods hide their functions inside. + # These might need to be rewritten as well. + closure_cells = getattr(item.__func__, "__closure__", None) + else: + closure_cells = getattr(item, "__closure__", None) + + if not closure_cells: # Catch None or the empty list. + continue + for cell in closure_cells: + if cell.cell_contents is self._cls: + set_closure_cell(cell, cls) + + return cls + + def add_repr(self, ns): + self._cls_dict["__repr__"] = self._add_method_dunders( + _make_repr(self._attrs, ns=ns) + ) + return self + + def add_str(self): + repr = self._cls_dict.get("__repr__") + if repr is None: + raise ValueError( + "__str__ can only be generated if a __repr__ exists." + ) + + def __str__(self): + return self.__repr__() + + self._cls_dict["__str__"] = self._add_method_dunders(__str__) + return self + + def make_unhashable(self): + self._cls_dict["__hash__"] = None + return self + + def add_hash(self): + self._cls_dict["__hash__"] = self._add_method_dunders( + _make_hash( + self._attrs, frozen=self._frozen, cache_hash=self._cache_hash + ) + ) + + return self + + def add_init(self): + self._cls_dict["__init__"] = self._add_method_dunders( + _make_init( + self._attrs, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + ) + ) + + return self + + def add_cmp(self): + cd = self._cls_dict + + cd["__eq__"], cd["__ne__"], cd["__lt__"], cd["__le__"], cd[ + "__gt__" + ], cd["__ge__"] = ( + self._add_method_dunders(meth) for meth in _make_cmp(self._attrs) + ) + + return self + + def _add_method_dunders(self, method): + """ + Add __module__ and __qualname__ to a *method* if possible. + """ + try: + method.__module__ = self._cls.__module__ + except AttributeError: + pass + + try: + method.__qualname__ = ".".join( + (self._cls.__qualname__, method.__name__) + ) + except AttributeError: + pass + + return method + + +def attrs( + maybe_cls=None, + these=None, + repr_ns=None, + repr=True, + cmp=True, + hash=None, + init=True, + slots=False, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=False, + kw_only=False, + cache_hash=False, +): + r""" + A class decorator that adds `dunder + `_\ -methods according to the + specified attributes using :func:`attr.ib` or the *these* argument. + + :param these: A dictionary of name to :func:`attr.ib` mappings. This is + useful to avoid the definition of your attributes within the class body + because you can't (e.g. if you want to add ``__repr__`` methods to + Django models) or don't want to. + + If *these* is not ``None``, ``attrs`` will *not* search the class body + for attributes and will *not* remove any attributes from it. + + If *these* is an ordered dict (:class:`dict` on Python 3.6+, + :class:`collections.OrderedDict` otherwise), the order is deduced from + the order of the attributes inside *these*. Otherwise the order + of the definition of the attributes is used. + + :type these: :class:`dict` of :class:`str` to :func:`attr.ib` + + :param str repr_ns: When using nested classes, there's no way in Python 2 + to automatically detect that. Therefore it's possible to set the + namespace explicitly for a more meaningful ``repr`` output. + :param bool repr: Create a ``__repr__`` method with a human readable + representation of ``attrs`` attributes.. + :param bool str: Create a ``__str__`` method that is identical to + ``__repr__``. This is usually not necessary except for + :class:`Exception`\ s. + :param bool cmp: Create ``__eq__``, ``__ne__``, ``__lt__``, ``__le__``, + ``__gt__``, and ``__ge__`` methods that compare the class as if it were + a tuple of its ``attrs`` attributes. But the attributes are *only* + compared, if the types of both classes are *identical*! + :param hash: If ``None`` (default), the ``__hash__`` method is generated + according how *cmp* and *frozen* are set. + + 1. If *both* are True, ``attrs`` will generate a ``__hash__`` for you. + 2. If *cmp* is True and *frozen* is False, ``__hash__`` will be set to + None, marking it unhashable (which it is). + 3. If *cmp* is False, ``__hash__`` will be left untouched meaning the + ``__hash__`` method of the base class will be used (if base class is + ``object``, this means it will fall back to id-based hashing.). + + Although not recommended, you can decide for yourself and force + ``attrs`` to create one (e.g. if the class is immutable even though you + didn't freeze it programmatically) by passing ``True`` or not. Both of + these cases are rather special and should be used carefully. + + See the `Python documentation \ + `_ + and the `GitHub issue that led to the default behavior \ + `_ for more details. + :type hash: ``bool`` or ``None`` + :param bool init: Create a ``__init__`` method that initializes the + ``attrs`` attributes. Leading underscores are stripped for the + argument name. If a ``__attrs_post_init__`` method exists on the + class, it will be called after the class is fully initialized. + :param bool slots: Create a slots_-style class that's more + memory-efficient. See :ref:`slots` for further ramifications. + :param bool frozen: Make instances immutable after initialization. If + someone attempts to modify a frozen instance, + :exc:`attr.exceptions.FrozenInstanceError` is raised. + + Please note: + + 1. This is achieved by installing a custom ``__setattr__`` method + on your class so you can't implement an own one. + + 2. True immutability is impossible in Python. + + 3. This *does* have a minor a runtime performance :ref:`impact + ` when initializing new instances. In other words: + ``__init__`` is slightly slower with ``frozen=True``. + + 4. If a class is frozen, you cannot modify ``self`` in + ``__attrs_post_init__`` or a self-written ``__init__``. You can + circumvent that limitation by using + ``object.__setattr__(self, "attribute_name", value)``. + + .. _slots: https://docs.python.org/3/reference/datamodel.html#slots + :param bool weakref_slot: Make instances weak-referenceable. This has no + effect unless ``slots`` is also enabled. + :param bool auto_attribs: If True, collect `PEP 526`_-annotated attributes + (Python 3.6 and later only) from the class body. + + In this case, you **must** annotate every field. If ``attrs`` + encounters a field that is set to an :func:`attr.ib` but lacks a type + annotation, an :exc:`attr.exceptions.UnannotatedAttributeError` is + raised. Use ``field_name: typing.Any = attr.ib(...)`` if you don't + want to set a type. + + If you assign a value to those attributes (e.g. ``x: int = 42``), that + value becomes the default value like if it were passed using + ``attr.ib(default=42)``. Passing an instance of :class:`Factory` also + works as expected. + + Attributes annotated as :data:`typing.ClassVar` are **ignored**. + + .. _`PEP 526`: https://www.python.org/dev/peps/pep-0526/ + :param bool kw_only: Make all attributes keyword-only (Python 3+) + in the generated ``__init__`` (if ``init`` is ``False``, this + parameter is ignored). + :param bool cache_hash: Ensure that the object's hash code is computed + only once and stored on the object. If this is set to ``True``, + hashing must be either explicitly or implicitly enabled for this + class. If the hash code is cached, then no attributes of this + class which participate in hash code computation may be mutated + after object creation. + + + .. versionadded:: 16.0.0 *slots* + .. versionadded:: 16.1.0 *frozen* + .. versionadded:: 16.3.0 *str* + .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``. + .. versionchanged:: 17.1.0 + *hash* supports ``None`` as value which is also the default now. + .. versionadded:: 17.3.0 *auto_attribs* + .. versionchanged:: 18.1.0 + If *these* is passed, no attributes are deleted from the class body. + .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained. + .. versionadded:: 18.2.0 *weakref_slot* + .. deprecated:: 18.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a + :class:`DeprecationWarning` if the classes compared are subclasses of + each other. ``__eq`` and ``__ne__`` never tried to compared subclasses + to each other. + .. versionadded:: 18.2.0 *kw_only* + .. versionadded:: 18.2.0 *cache_hash* + """ + + def wrap(cls): + if getattr(cls, "__class__", None) is None: + raise TypeError("attrs only works with new-style classes.") + + builder = _ClassBuilder( + cls, + these, + slots, + frozen, + weakref_slot, + auto_attribs, + kw_only, + cache_hash, + ) + + if repr is True: + builder.add_repr(repr_ns) + if str is True: + builder.add_str() + if cmp is True: + builder.add_cmp() + + if hash is not True and hash is not False and hash is not None: + # Can't use `hash in` because 1 == True for example. + raise TypeError( + "Invalid value for hash. Must be True, False, or None." + ) + elif hash is False or (hash is None and cmp is False): + if cache_hash: + raise TypeError( + "Invalid value for cache_hash. To use hash caching," + " hashing must be either explicitly or implicitly " + "enabled." + ) + elif hash is True or (hash is None and cmp is True and frozen is True): + builder.add_hash() + else: + if cache_hash: + raise TypeError( + "Invalid value for cache_hash. To use hash caching," + " hashing must be either explicitly or implicitly " + "enabled." + ) + builder.make_unhashable() + + if init is True: + builder.add_init() + else: + if cache_hash: + raise TypeError( + "Invalid value for cache_hash. To use hash caching," + " init must be True." + ) + + return builder.build_class() + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but ``None`` if used as `@attrs()`. + if maybe_cls is None: + return wrap + else: + return wrap(maybe_cls) + + +_attrs = attrs +""" +Internal alias so we can use it in functions that take an argument called +*attrs*. +""" + + +if PY2: + + def _has_frozen_base_class(cls): + """ + Check whether *cls* has a frozen ancestor by looking at its + __setattr__. + """ + return ( + getattr(cls.__setattr__, "__module__", None) + == _frozen_setattrs.__module__ + and cls.__setattr__.__name__ == _frozen_setattrs.__name__ + ) + + +else: + + def _has_frozen_base_class(cls): + """ + Check whether *cls* has a frozen ancestor by looking at its + __setattr__. + """ + return cls.__setattr__ == _frozen_setattrs + + +def _attrs_to_tuple(obj, attrs): + """ + Create a tuple of all values of *obj*'s *attrs*. + """ + return tuple(getattr(obj, a.name) for a in attrs) + + +def _make_hash(attrs, frozen, cache_hash): + attrs = tuple( + a + for a in attrs + if a.hash is True or (a.hash is None and a.cmp is True) + ) + + tab = " " + + # We cache the generated hash methods for the same kinds of attributes. + sha1 = hashlib.sha1() + sha1.update(repr(attrs).encode("utf-8")) + unique_filename = "" % (sha1.hexdigest(),) + type_hash = hash(unique_filename) + + method_lines = ["def __hash__(self):"] + + def append_hash_computation_lines(prefix, indent): + """ + Generate the code for actually computing the hash code. + Below this will either be returned directly or used to compute + a value which is then cached, depending on the value of cache_hash + """ + method_lines.extend( + [indent + prefix + "hash((", indent + " %d," % (type_hash,)] + ) + + for a in attrs: + method_lines.append(indent + " self.%s," % a.name) + + method_lines.append(indent + " ))") + + if cache_hash: + method_lines.append(tab + "if self.%s is None:" % _hash_cache_field) + if frozen: + append_hash_computation_lines( + "object.__setattr__(self, '%s', " % _hash_cache_field, tab * 2 + ) + method_lines.append(tab * 2 + ")") # close __setattr__ + else: + append_hash_computation_lines( + "self.%s = " % _hash_cache_field, tab * 2 + ) + method_lines.append(tab + "return self.%s" % _hash_cache_field) + else: + append_hash_computation_lines("return ", tab) + + script = "\n".join(method_lines) + globs = {} + locs = {} + bytecode = compile(script, unique_filename, "exec") + eval(bytecode, globs, locs) + + # In order of debuggers like PDB being able to step through the code, + # we add a fake linecache entry. + linecache.cache[unique_filename] = ( + len(script), + None, + script.splitlines(True), + unique_filename, + ) + + return locs["__hash__"] + + +def _add_hash(cls, attrs): + """ + Add a hash method to *cls*. + """ + cls.__hash__ = _make_hash(attrs, frozen=False, cache_hash=False) + return cls + + +def __ne__(self, other): + """ + Check equality and either forward a NotImplemented or return the result + negated. + """ + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + + return not result + + +WARNING_CMP_ISINSTANCE = ( + "Comparision of subclasses using __%s__ is deprecated and will be removed " + "in 2019." +) + + +def _make_cmp(attrs): + attrs = [a for a in attrs if a.cmp] + + # We cache the generated eq methods for the same kinds of attributes. + sha1 = hashlib.sha1() + sha1.update(repr(attrs).encode("utf-8")) + unique_filename = "" % (sha1.hexdigest(),) + lines = [ + "def __eq__(self, other):", + " if other.__class__ is not self.__class__:", + " return NotImplemented", + ] + # We can't just do a big self.x = other.x and... clause due to + # irregularities like nan == nan is false but (nan,) == (nan,) is true. + if attrs: + lines.append(" return (") + others = [" ) == ("] + for a in attrs: + lines.append(" self.%s," % (a.name,)) + others.append(" other.%s," % (a.name,)) + + lines += others + [" )"] + else: + lines.append(" return True") + + script = "\n".join(lines) + globs = {} + locs = {} + bytecode = compile(script, unique_filename, "exec") + eval(bytecode, globs, locs) + + # In order of debuggers like PDB being able to step through the code, + # we add a fake linecache entry. + linecache.cache[unique_filename] = ( + len(script), + None, + script.splitlines(True), + unique_filename, + ) + eq = locs["__eq__"] + ne = __ne__ + + def attrs_to_tuple(obj): + """ + Save us some typing. + """ + return _attrs_to_tuple(obj, attrs) + + def __lt__(self, other): + """ + Automatically created by attrs. + """ + if isinstance(other, self.__class__): + if other.__class__ is not self.__class__: + warnings.warn( + WARNING_CMP_ISINSTANCE % ("lt",), DeprecationWarning + ) + return attrs_to_tuple(self) < attrs_to_tuple(other) + else: + return NotImplemented + + def __le__(self, other): + """ + Automatically created by attrs. + """ + if isinstance(other, self.__class__): + if other.__class__ is not self.__class__: + warnings.warn( + WARNING_CMP_ISINSTANCE % ("le",), DeprecationWarning + ) + return attrs_to_tuple(self) <= attrs_to_tuple(other) + else: + return NotImplemented + + def __gt__(self, other): + """ + Automatically created by attrs. + """ + if isinstance(other, self.__class__): + if other.__class__ is not self.__class__: + warnings.warn( + WARNING_CMP_ISINSTANCE % ("gt",), DeprecationWarning + ) + return attrs_to_tuple(self) > attrs_to_tuple(other) + else: + return NotImplemented + + def __ge__(self, other): + """ + Automatically created by attrs. + """ + if isinstance(other, self.__class__): + if other.__class__ is not self.__class__: + warnings.warn( + WARNING_CMP_ISINSTANCE % ("ge",), DeprecationWarning + ) + return attrs_to_tuple(self) >= attrs_to_tuple(other) + else: + return NotImplemented + + return eq, ne, __lt__, __le__, __gt__, __ge__ + + +def _add_cmp(cls, attrs=None): + """ + Add comparison methods to *cls*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + cls.__eq__, cls.__ne__, cls.__lt__, cls.__le__, cls.__gt__, cls.__ge__ = _make_cmp( # noqa + attrs + ) + + return cls + + +_already_repring = threading.local() + + +def _make_repr(attrs, ns): + """ + Make a repr method for *attr_names* adding *ns* to the full name. + """ + attr_names = tuple(a.name for a in attrs if a.repr) + + def __repr__(self): + """ + Automatically created by attrs. + """ + try: + working_set = _already_repring.working_set + except AttributeError: + working_set = set() + _already_repring.working_set = working_set + + if id(self) in working_set: + return "..." + real_cls = self.__class__ + if ns is None: + qualname = getattr(real_cls, "__qualname__", None) + if qualname is not None: + class_name = qualname.rsplit(">.", 1)[-1] + else: + class_name = real_cls.__name__ + else: + class_name = ns + "." + real_cls.__name__ + + # Since 'self' remains on the stack (i.e.: strongly referenced) for the + # duration of this call, it's safe to depend on id(...) stability, and + # not need to track the instance and therefore worry about properties + # like weakref- or hash-ability. + working_set.add(id(self)) + try: + result = [class_name, "("] + first = True + for name in attr_names: + if first: + first = False + else: + result.append(", ") + result.extend((name, "=", repr(getattr(self, name, NOTHING)))) + return "".join(result) + ")" + finally: + working_set.remove(id(self)) + + return __repr__ + + +def _add_repr(cls, ns=None, attrs=None): + """ + Add a repr method to *cls*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + cls.__repr__ = _make_repr(attrs, ns) + return cls + + +def _make_init(attrs, post_init, frozen, slots, cache_hash, base_attr_map): + attrs = [a for a in attrs if a.init or a.default is not NOTHING] + + # We cache the generated init methods for the same kinds of attributes. + sha1 = hashlib.sha1() + sha1.update(repr(attrs).encode("utf-8")) + unique_filename = "".format(sha1.hexdigest()) + + script, globs, annotations = _attrs_to_init_script( + attrs, frozen, slots, post_init, cache_hash, base_attr_map + ) + locs = {} + bytecode = compile(script, unique_filename, "exec") + attr_dict = dict((a.name, a) for a in attrs) + globs.update({"NOTHING": NOTHING, "attr_dict": attr_dict}) + if frozen is True: + # Save the lookup overhead in __init__ if we need to circumvent + # immutability. + globs["_cached_setattr"] = _obj_setattr + eval(bytecode, globs, locs) + + # In order of debuggers like PDB being able to step through the code, + # we add a fake linecache entry. + linecache.cache[unique_filename] = ( + len(script), + None, + script.splitlines(True), + unique_filename, + ) + + __init__ = locs["__init__"] + __init__.__annotations__ = annotations + return __init__ + + +def _add_init(cls, frozen): + """ + Add a __init__ method to *cls*. If *frozen* is True, make it immutable. + """ + cls.__init__ = _make_init( + cls.__attrs_attrs__, + getattr(cls, "__attrs_post_init__", False), + frozen, + _is_slot_cls(cls), + cache_hash=False, + base_attr_map={}, + ) + return cls + + +def fields(cls): + """ + Return the tuple of ``attrs`` attributes for a class. + + The tuple also allows accessing the fields by their names (see below for + examples). + + :param type cls: Class to introspect. + + :raise TypeError: If *cls* is not a class. + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + :rtype: tuple (with name accessors) of :class:`attr.Attribute` + + .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields + by name. + """ + if not isclass(cls): + raise TypeError("Passed object must be a class.") + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is None: + raise NotAnAttrsClassError( + "{cls!r} is not an attrs-decorated class.".format(cls=cls) + ) + return attrs + + +def fields_dict(cls): + """ + Return an ordered dictionary of ``attrs`` attributes for a class, whose + keys are the attribute names. + + :param type cls: Class to introspect. + + :raise TypeError: If *cls* is not a class. + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + :rtype: an ordered dict where keys are attribute names and values are + :class:`attr.Attribute`\\ s. This will be a :class:`dict` if it's + naturally ordered like on Python 3.6+ or an + :class:`~collections.OrderedDict` otherwise. + + .. versionadded:: 18.1.0 + """ + if not isclass(cls): + raise TypeError("Passed object must be a class.") + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is None: + raise NotAnAttrsClassError( + "{cls!r} is not an attrs-decorated class.".format(cls=cls) + ) + return ordered_dict(((a.name, a) for a in attrs)) + + +def validate(inst): + """ + Validate all attributes on *inst* that have a validator. + + Leaves all exceptions through. + + :param inst: Instance of a class with ``attrs`` attributes. + """ + if _config._run_validators is False: + return + + for a in fields(inst.__class__): + v = a.validator + if v is not None: + v(inst, a, getattr(inst, a.name)) + + +def _is_slot_cls(cls): + return "__slots__" in cls.__dict__ + + +def _is_slot_attr(a_name, base_attr_map): + """ + Check if the attribute name comes from a slot class. + """ + return a_name in base_attr_map and _is_slot_cls(base_attr_map[a_name]) + + +def _attrs_to_init_script( + attrs, frozen, slots, post_init, cache_hash, base_attr_map +): + """ + Return a script of an initializer for *attrs* and a dict of globals. + + The globals are expected by the generated script. + + If *frozen* is True, we cannot set the attributes directly so we use + a cached ``object.__setattr__``. + """ + lines = [] + any_slot_ancestors = any( + _is_slot_attr(a.name, base_attr_map) for a in attrs + ) + if frozen is True: + if slots is True: + lines.append( + # Circumvent the __setattr__ descriptor to save one lookup per + # assignment. + # Note _setattr will be used again below if cache_hash is True + "_setattr = _cached_setattr.__get__(self, self.__class__)" + ) + + def fmt_setter(attr_name, value_var): + return "_setattr('%(attr_name)s', %(value_var)s)" % { + "attr_name": attr_name, + "value_var": value_var, + } + + def fmt_setter_with_converter(attr_name, value_var): + conv_name = _init_converter_pat.format(attr_name) + return "_setattr('%(attr_name)s', %(conv)s(%(value_var)s))" % { + "attr_name": attr_name, + "value_var": value_var, + "conv": conv_name, + } + + else: + # Dict frozen classes assign directly to __dict__. + # But only if the attribute doesn't come from an ancestor slot + # class. + # Note _inst_dict will be used again below if cache_hash is True + lines.append("_inst_dict = self.__dict__") + if any_slot_ancestors: + lines.append( + # Circumvent the __setattr__ descriptor to save one lookup + # per assignment. + "_setattr = _cached_setattr.__get__(self, self.__class__)" + ) + + def fmt_setter(attr_name, value_var): + if _is_slot_attr(attr_name, base_attr_map): + res = "_setattr('%(attr_name)s', %(value_var)s)" % { + "attr_name": attr_name, + "value_var": value_var, + } + else: + res = "_inst_dict['%(attr_name)s'] = %(value_var)s" % { + "attr_name": attr_name, + "value_var": value_var, + } + return res + + def fmt_setter_with_converter(attr_name, value_var): + conv_name = _init_converter_pat.format(attr_name) + if _is_slot_attr(attr_name, base_attr_map): + tmpl = "_setattr('%(attr_name)s', %(c)s(%(value_var)s))" + else: + tmpl = "_inst_dict['%(attr_name)s'] = %(c)s(%(value_var)s)" + return tmpl % { + "attr_name": attr_name, + "value_var": value_var, + "c": conv_name, + } + + else: + # Not frozen. + def fmt_setter(attr_name, value): + return "self.%(attr_name)s = %(value)s" % { + "attr_name": attr_name, + "value": value, + } + + def fmt_setter_with_converter(attr_name, value_var): + conv_name = _init_converter_pat.format(attr_name) + return "self.%(attr_name)s = %(conv)s(%(value_var)s)" % { + "attr_name": attr_name, + "value_var": value_var, + "conv": conv_name, + } + + args = [] + kw_only_args = [] + attrs_to_validate = [] + + # This is a dictionary of names to validator and converter callables. + # Injecting this into __init__ globals lets us avoid lookups. + names_for_globals = {} + annotations = {"return": None} + + for a in attrs: + if a.validator: + attrs_to_validate.append(a) + attr_name = a.name + arg_name = a.name.lstrip("_") + has_factory = isinstance(a.default, Factory) + if has_factory and a.default.takes_self: + maybe_self = "self" + else: + maybe_self = "" + if a.init is False: + if has_factory: + init_factory_name = _init_factory_pat.format(a.name) + if a.converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + init_factory_name + "({0})".format(maybe_self), + ) + ) + conv_name = _init_converter_pat.format(a.name) + names_for_globals[conv_name] = a.converter + else: + lines.append( + fmt_setter( + attr_name, + init_factory_name + "({0})".format(maybe_self), + ) + ) + names_for_globals[init_factory_name] = a.default.factory + else: + if a.converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + "attr_dict['{attr_name}'].default".format( + attr_name=attr_name + ), + ) + ) + conv_name = _init_converter_pat.format(a.name) + names_for_globals[conv_name] = a.converter + else: + lines.append( + fmt_setter( + attr_name, + "attr_dict['{attr_name}'].default".format( + attr_name=attr_name + ), + ) + ) + elif a.default is not NOTHING and not has_factory: + arg = "{arg_name}=attr_dict['{attr_name}'].default".format( + arg_name=arg_name, attr_name=attr_name + ) + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + if a.converter is not None: + lines.append(fmt_setter_with_converter(attr_name, arg_name)) + names_for_globals[ + _init_converter_pat.format(a.name) + ] = a.converter + else: + lines.append(fmt_setter(attr_name, arg_name)) + elif has_factory: + arg = "{arg_name}=NOTHING".format(arg_name=arg_name) + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + lines.append( + "if {arg_name} is not NOTHING:".format(arg_name=arg_name) + ) + init_factory_name = _init_factory_pat.format(a.name) + if a.converter is not None: + lines.append( + " " + fmt_setter_with_converter(attr_name, arg_name) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter_with_converter( + attr_name, + init_factory_name + "({0})".format(maybe_self), + ) + ) + names_for_globals[ + _init_converter_pat.format(a.name) + ] = a.converter + else: + lines.append(" " + fmt_setter(attr_name, arg_name)) + lines.append("else:") + lines.append( + " " + + fmt_setter( + attr_name, + init_factory_name + "({0})".format(maybe_self), + ) + ) + names_for_globals[init_factory_name] = a.default.factory + else: + if a.kw_only: + kw_only_args.append(arg_name) + else: + args.append(arg_name) + if a.converter is not None: + lines.append(fmt_setter_with_converter(attr_name, arg_name)) + names_for_globals[ + _init_converter_pat.format(a.name) + ] = a.converter + else: + lines.append(fmt_setter(attr_name, arg_name)) + + if a.init is True and a.converter is None and a.type is not None: + annotations[arg_name] = a.type + + if attrs_to_validate: # we can skip this if there are no validators. + names_for_globals["_config"] = _config + lines.append("if _config._run_validators is True:") + for a in attrs_to_validate: + val_name = "__attr_validator_{}".format(a.name) + attr_name = "__attr_{}".format(a.name) + lines.append( + " {}(self, {}, self.{})".format(val_name, attr_name, a.name) + ) + names_for_globals[val_name] = a.validator + names_for_globals[attr_name] = a + if post_init: + lines.append("self.__attrs_post_init__()") + + # because this is set only after __attrs_post_init is called, a crash + # will result if post-init tries to access the hash code. This seemed + # preferable to setting this beforehand, in which case alteration to + # field values during post-init combined with post-init accessing the + # hash code would result in silent bugs. + if cache_hash: + if frozen: + if slots: + # if frozen and slots, then _setattr defined above + init_hash_cache = "_setattr('%s', %s)" + else: + # if frozen and not slots, then _inst_dict defined above + init_hash_cache = "_inst_dict['%s'] = %s" + else: + init_hash_cache = "self.%s = %s" + lines.append(init_hash_cache % (_hash_cache_field, "None")) + + args = ", ".join(args) + if kw_only_args: + if PY2: + raise PythonTooOldError( + "Keyword-only arguments only work on Python 3 and later." + ) + + args += "{leading_comma}*, {kw_only_args}".format( + leading_comma=", " if args else "", + kw_only_args=", ".join(kw_only_args), + ) + return ( + """\ +def __init__(self, {args}): + {lines} +""".format( + args=args, lines="\n ".join(lines) if lines else "pass" + ), + names_for_globals, + annotations, + ) + + +class Attribute(object): + """ + *Read-only* representation of an attribute. + + :attribute name: The name of the attribute. + + Plus *all* arguments of :func:`attr.ib`. + + For the version history of the fields, see :func:`attr.ib`. + """ + + __slots__ = ( + "name", + "default", + "validator", + "repr", + "cmp", + "hash", + "init", + "metadata", + "type", + "converter", + "kw_only", + ) + + def __init__( + self, + name, + default, + validator, + repr, + cmp, + hash, + init, + convert=None, + metadata=None, + type=None, + converter=None, + kw_only=False, + ): + # Cache this descriptor here to speed things up later. + bound_setattr = _obj_setattr.__get__(self, Attribute) + + # Despite the big red warning, people *do* instantiate `Attribute` + # themselves. + if convert is not None: + if converter is not None: + raise RuntimeError( + "Can't pass both `convert` and `converter`. " + "Please use `converter` only." + ) + warnings.warn( + "The `convert` argument is deprecated in favor of `converter`." + " It will be removed after 2019/01.", + DeprecationWarning, + stacklevel=2, + ) + converter = convert + + bound_setattr("name", name) + bound_setattr("default", default) + bound_setattr("validator", validator) + bound_setattr("repr", repr) + bound_setattr("cmp", cmp) + bound_setattr("hash", hash) + bound_setattr("init", init) + bound_setattr("converter", converter) + bound_setattr( + "metadata", + ( + metadata_proxy(metadata) + if metadata + else _empty_metadata_singleton + ), + ) + bound_setattr("type", type) + bound_setattr("kw_only", kw_only) + + def __setattr__(self, name, value): + raise FrozenInstanceError() + + @property + def convert(self): + warnings.warn( + "The `convert` attribute is deprecated in favor of `converter`. " + "It will be removed after 2019/01.", + DeprecationWarning, + stacklevel=2, + ) + return self.converter + + @classmethod + def from_counting_attr(cls, name, ca, type=None): + # type holds the annotated value. deal with conflicts: + if type is None: + type = ca.type + elif ca.type is not None: + raise ValueError( + "Type annotation and type argument cannot both be present" + ) + inst_dict = { + k: getattr(ca, k) + for k in Attribute.__slots__ + if k + not in ( + "name", + "validator", + "default", + "type", + "convert", + ) # exclude methods and deprecated alias + } + return cls( + name=name, + validator=ca._validator, + default=ca._default, + type=type, + **inst_dict + ) + + # Don't use attr.assoc since fields(Attribute) doesn't work + def _assoc(self, **changes): + """ + Copy *self* and apply *changes*. + """ + new = copy.copy(self) + + new._setattrs(changes.items()) + + return new + + # Don't use _add_pickle since fields(Attribute) doesn't work + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple( + getattr(self, name) if name != "metadata" else dict(self.metadata) + for name in self.__slots__ + ) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + self._setattrs(zip(self.__slots__, state)) + + def _setattrs(self, name_values_pairs): + bound_setattr = _obj_setattr.__get__(self, Attribute) + for name, value in name_values_pairs: + if name != "metadata": + bound_setattr(name, value) + else: + bound_setattr( + name, + metadata_proxy(value) + if value + else _empty_metadata_singleton, + ) + + +_a = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=True, + hash=(name != "metadata"), + init=True, + ) + for name in Attribute.__slots__ + if name != "convert" # XXX: remove once `convert` is gone +] + +Attribute = _add_hash( + _add_cmp(_add_repr(Attribute, attrs=_a), attrs=_a), + attrs=[a for a in _a if a.hash], +) + + +class _CountingAttr(object): + """ + Intermediate representation of attributes that uses a counter to preserve + the order in which the attributes have been defined. + + *Internal* data structure of the attrs library. Running into is most + likely the result of a bug like a forgotten `@attr.s` decorator. + """ + + __slots__ = ( + "counter", + "_default", + "repr", + "cmp", + "hash", + "init", + "metadata", + "_validator", + "converter", + "type", + "kw_only", + ) + __attrs_attrs__ = tuple( + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=True, + hash=True, + init=True, + kw_only=False, + ) + for name in ("counter", "_default", "repr", "cmp", "hash", "init") + ) + ( + Attribute( + name="metadata", + default=None, + validator=None, + repr=True, + cmp=True, + hash=False, + init=True, + kw_only=False, + ), + ) + cls_counter = 0 + + def __init__( + self, + default, + validator, + repr, + cmp, + hash, + init, + converter, + metadata, + type, + kw_only, + ): + _CountingAttr.cls_counter += 1 + self.counter = _CountingAttr.cls_counter + self._default = default + # If validator is a list/tuple, wrap it using helper validator. + if validator and isinstance(validator, (list, tuple)): + self._validator = and_(*validator) + else: + self._validator = validator + self.repr = repr + self.cmp = cmp + self.hash = hash + self.init = init + self.converter = converter + self.metadata = metadata + self.type = type + self.kw_only = kw_only + + def validator(self, meth): + """ + Decorator that adds *meth* to the list of validators. + + Returns *meth* unchanged. + + .. versionadded:: 17.1.0 + """ + if self._validator is None: + self._validator = meth + else: + self._validator = and_(self._validator, meth) + return meth + + def default(self, meth): + """ + Decorator that allows to set the default for an attribute. + + Returns *meth* unchanged. + + :raises DefaultAlreadySetError: If default has been set before. + + .. versionadded:: 17.1.0 + """ + if self._default is not NOTHING: + raise DefaultAlreadySetError() + + self._default = Factory(meth, takes_self=True) + + return meth + + +_CountingAttr = _add_cmp(_add_repr(_CountingAttr)) + + +@attrs(slots=True, init=False, hash=True) +class Factory(object): + """ + Stores a factory callable. + + If passed as the default value to :func:`attr.ib`, the factory is used to + generate a new value. + + :param callable factory: A callable that takes either none or exactly one + mandatory positional argument depending on *takes_self*. + :param bool takes_self: Pass the partially initialized instance that is + being initialized as a positional argument. + + .. versionadded:: 17.1.0 *takes_self* + """ + + factory = attrib() + takes_self = attrib() + + def __init__(self, factory, takes_self=False): + """ + `Factory` is part of the default machinery so if we want a default + value here, we have to implement it ourselves. + """ + self.factory = factory + self.takes_self = takes_self + + +def make_class(name, attrs, bases=(object,), **attributes_arguments): + """ + A quick way to create a new class called *name* with *attrs*. + + :param name: The name for the new class. + :type name: str + + :param attrs: A list of names or a dictionary of mappings of names to + attributes. + + If *attrs* is a list or an ordered dict (:class:`dict` on Python 3.6+, + :class:`collections.OrderedDict` otherwise), the order is deduced from + the order of the names or attributes inside *attrs*. Otherwise the + order of the definition of the attributes is used. + :type attrs: :class:`list` or :class:`dict` + + :param tuple bases: Classes that the new class will subclass. + + :param attributes_arguments: Passed unmodified to :func:`attr.s`. + + :return: A new class with *attrs*. + :rtype: type + + .. versionadded:: 17.1.0 *bases* + .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. + """ + if isinstance(attrs, dict): + cls_dict = attrs + elif isinstance(attrs, (list, tuple)): + cls_dict = dict((a, attrib()) for a in attrs) + else: + raise TypeError("attrs argument must be a dict or a list.") + + post_init = cls_dict.pop("__attrs_post_init__", None) + type_ = type( + name, + bases, + {} if post_init is None else {"__attrs_post_init__": post_init}, + ) + # For pickling to work, the __module__ variable needs to be set to the + # frame where the class is created. Bypass this step in environments where + # sys._getframe is not defined (Jython for example) or sys._getframe is not + # defined for arguments greater than 0 (IronPython). + try: + type_.__module__ = sys._getframe(1).f_globals.get( + "__name__", "__main__" + ) + except (AttributeError, ValueError): + pass + + return _attrs(these=cls_dict, **attributes_arguments)(type_) + + +# These are required by within this module so we define them here and merely +# import into .validators. + + +@attrs(slots=True, hash=True) +class _AndValidator(object): + """ + Compose many validators to a single one. + """ + + _validators = attrib() + + def __call__(self, inst, attr, value): + for v in self._validators: + v(inst, attr, value) + + +def and_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators. + + :param validators: Arbitrary number of validators. + :type validators: callables + + .. versionadded:: 17.1.0 + """ + vals = [] + for validator in validators: + vals.extend( + validator._validators + if isinstance(validator, _AndValidator) + else [validator] + ) + + return _AndValidator(tuple(vals)) diff --git a/venv/Lib/site-packages/attr/converters.py b/venv/Lib/site-packages/attr/converters.py new file mode 100644 index 00000000..37c4a07a --- /dev/null +++ b/venv/Lib/site-packages/attr/converters.py @@ -0,0 +1,78 @@ +""" +Commonly useful converters. +""" + +from __future__ import absolute_import, division, print_function + +from ._make import NOTHING, Factory + + +def optional(converter): + """ + A converter that allows an attribute to be optional. An optional attribute + is one which can be set to ``None``. + + :param callable converter: the converter that is used for non-``None`` + values. + + .. versionadded:: 17.1.0 + """ + + def optional_converter(val): + if val is None: + return None + return converter(val) + + return optional_converter + + +def default_if_none(default=NOTHING, factory=None): + """ + A converter that allows to replace ``None`` values by *default* or the + result of *factory*. + + :param default: Value to be used if ``None`` is passed. Passing an instance + of :class:`attr.Factory` is supported, however the ``takes_self`` option + is *not*. + :param callable factory: A callable that takes not parameters whose result + is used if ``None`` is passed. + + :raises TypeError: If **neither** *default* or *factory* is passed. + :raises TypeError: If **both** *default* and *factory* are passed. + :raises ValueError: If an instance of :class:`attr.Factory` is passed with + ``takes_self=True``. + + .. versionadded:: 18.2.0 + """ + if default is NOTHING and factory is None: + raise TypeError("Must pass either `default` or `factory`.") + + if default is not NOTHING and factory is not None: + raise TypeError( + "Must pass either `default` or `factory` but not both." + ) + + if factory is not None: + default = Factory(factory) + + if isinstance(default, Factory): + if default.takes_self: + raise ValueError( + "`takes_self` is not supported by default_if_none." + ) + + def default_if_none_converter(val): + if val is not None: + return val + + return default.factory() + + else: + + def default_if_none_converter(val): + if val is not None: + return val + + return default + + return default_if_none_converter diff --git a/venv/Lib/site-packages/attr/converters.pyi b/venv/Lib/site-packages/attr/converters.pyi new file mode 100644 index 00000000..63b2a386 --- /dev/null +++ b/venv/Lib/site-packages/attr/converters.pyi @@ -0,0 +1,12 @@ +from typing import TypeVar, Optional, Callable, overload +from . import _ConverterType + +_T = TypeVar("_T") + +def optional( + converter: _ConverterType[_T] +) -> _ConverterType[Optional[_T]]: ... +@overload +def default_if_none(default: _T) -> _ConverterType[_T]: ... +@overload +def default_if_none(*, factory: Callable[[], _T]) -> _ConverterType[_T]: ... diff --git a/venv/Lib/site-packages/attr/exceptions.py b/venv/Lib/site-packages/attr/exceptions.py new file mode 100644 index 00000000..b12e41e9 --- /dev/null +++ b/venv/Lib/site-packages/attr/exceptions.py @@ -0,0 +1,57 @@ +from __future__ import absolute_import, division, print_function + + +class FrozenInstanceError(AttributeError): + """ + A frozen/immutable instance has been attempted to be modified. + + It mirrors the behavior of ``namedtuples`` by using the same error message + and subclassing :exc:`AttributeError`. + + .. versionadded:: 16.1.0 + """ + + msg = "can't set attribute" + args = [msg] + + +class AttrsAttributeNotFoundError(ValueError): + """ + An ``attrs`` function couldn't find an attribute that the user asked for. + + .. versionadded:: 16.2.0 + """ + + +class NotAnAttrsClassError(ValueError): + """ + A non-``attrs`` class has been passed into an ``attrs`` function. + + .. versionadded:: 16.2.0 + """ + + +class DefaultAlreadySetError(RuntimeError): + """ + A default has been set using ``attr.ib()`` and is attempted to be reset + using the decorator. + + .. versionadded:: 17.1.0 + """ + + +class UnannotatedAttributeError(RuntimeError): + """ + A class with ``auto_attribs=True`` has an ``attr.ib()`` without a type + annotation. + + .. versionadded:: 17.3.0 + """ + + +class PythonTooOldError(RuntimeError): + """ + An ``attrs`` feature requiring a more recent python version has been used. + + .. versionadded:: 18.2.0 + """ diff --git a/venv/Lib/site-packages/attr/exceptions.pyi b/venv/Lib/site-packages/attr/exceptions.pyi new file mode 100644 index 00000000..48fffcc1 --- /dev/null +++ b/venv/Lib/site-packages/attr/exceptions.pyi @@ -0,0 +1,7 @@ +class FrozenInstanceError(AttributeError): + msg: str = ... + +class AttrsAttributeNotFoundError(ValueError): ... +class NotAnAttrsClassError(ValueError): ... +class DefaultAlreadySetError(RuntimeError): ... +class UnannotatedAttributeError(RuntimeError): ... diff --git a/venv/Lib/site-packages/attr/filters.py b/venv/Lib/site-packages/attr/filters.py new file mode 100644 index 00000000..f1c69b8b --- /dev/null +++ b/venv/Lib/site-packages/attr/filters.py @@ -0,0 +1,52 @@ +""" +Commonly useful filters for :func:`attr.asdict`. +""" + +from __future__ import absolute_import, division, print_function + +from ._compat import isclass +from ._make import Attribute + + +def _split_what(what): + """ + Returns a tuple of `frozenset`s of classes and attributes. + """ + return ( + frozenset(cls for cls in what if isclass(cls)), + frozenset(cls for cls in what if isinstance(cls, Attribute)), + ) + + +def include(*what): + """ + Whitelist *what*. + + :param what: What to whitelist. + :type what: :class:`list` of :class:`type` or :class:`attr.Attribute`\\ s + + :rtype: :class:`callable` + """ + cls, attrs = _split_what(what) + + def include_(attribute, value): + return value.__class__ in cls or attribute in attrs + + return include_ + + +def exclude(*what): + """ + Blacklist *what*. + + :param what: What to blacklist. + :type what: :class:`list` of classes or :class:`attr.Attribute`\\ s. + + :rtype: :class:`callable` + """ + cls, attrs = _split_what(what) + + def exclude_(attribute, value): + return value.__class__ not in cls and attribute not in attrs + + return exclude_ diff --git a/venv/Lib/site-packages/attr/filters.pyi b/venv/Lib/site-packages/attr/filters.pyi new file mode 100644 index 00000000..a618140c --- /dev/null +++ b/venv/Lib/site-packages/attr/filters.pyi @@ -0,0 +1,5 @@ +from typing import Union +from . import Attribute, _FilterType + +def include(*what: Union[type, Attribute]) -> _FilterType: ... +def exclude(*what: Union[type, Attribute]) -> _FilterType: ... diff --git a/venv/Lib/site-packages/attr/py.typed b/venv/Lib/site-packages/attr/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/attr/validators.py b/venv/Lib/site-packages/attr/validators.py new file mode 100644 index 00000000..f12d0aa5 --- /dev/null +++ b/venv/Lib/site-packages/attr/validators.py @@ -0,0 +1,170 @@ +""" +Commonly useful validators. +""" + +from __future__ import absolute_import, division, print_function + +from ._make import _AndValidator, and_, attrib, attrs + + +__all__ = ["and_", "in_", "instance_of", "optional", "provides"] + + +@attrs(repr=False, slots=True, hash=True) +class _InstanceOfValidator(object): + type = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not isinstance(value, self.type): + raise TypeError( + "'{name}' must be {type!r} (got {value!r} that is a " + "{actual!r}).".format( + name=attr.name, + type=self.type, + actual=value.__class__, + value=value, + ), + attr, + self.type, + value, + ) + + def __repr__(self): + return "".format( + type=self.type + ) + + +def instance_of(type): + """ + A validator that raises a :exc:`TypeError` if the initializer is called + with a wrong type for this particular attribute (checks are performed using + :func:`isinstance` therefore it's also valid to pass a tuple of types). + + :param type: The type to check for. + :type type: type or tuple of types + + :raises TypeError: With a human readable error message, the attribute + (of type :class:`attr.Attribute`), the expected type, and the value it + got. + """ + return _InstanceOfValidator(type) + + +@attrs(repr=False, slots=True, hash=True) +class _ProvidesValidator(object): + interface = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.interface.providedBy(value): + raise TypeError( + "'{name}' must provide {interface!r} which {value!r} " + "doesn't.".format( + name=attr.name, interface=self.interface, value=value + ), + attr, + self.interface, + value, + ) + + def __repr__(self): + return "".format( + interface=self.interface + ) + + +def provides(interface): + """ + A validator that raises a :exc:`TypeError` if the initializer is called + with an object that does not provide the requested *interface* (checks are + performed using ``interface.providedBy(value)`` (see `zope.interface + `_). + + :param zope.interface.Interface interface: The interface to check for. + + :raises TypeError: With a human readable error message, the attribute + (of type :class:`attr.Attribute`), the expected interface, and the + value it got. + """ + return _ProvidesValidator(interface) + + +@attrs(repr=False, slots=True, hash=True) +class _OptionalValidator(object): + validator = attrib() + + def __call__(self, inst, attr, value): + if value is None: + return + + self.validator(inst, attr, value) + + def __repr__(self): + return "".format( + what=repr(self.validator) + ) + + +def optional(validator): + """ + A validator that makes an attribute optional. An optional attribute is one + which can be set to ``None`` in addition to satisfying the requirements of + the sub-validator. + + :param validator: A validator (or a list of validators) that is used for + non-``None`` values. + :type validator: callable or :class:`list` of callables. + + .. versionadded:: 15.1.0 + .. versionchanged:: 17.1.0 *validator* can be a list of validators. + """ + if isinstance(validator, list): + return _OptionalValidator(_AndValidator(validator)) + return _OptionalValidator(validator) + + +@attrs(repr=False, slots=True, hash=True) +class _InValidator(object): + options = attrib() + + def __call__(self, inst, attr, value): + try: + in_options = value in self.options + except TypeError as e: # e.g. `1 in "abc"` + in_options = False + + if not in_options: + raise ValueError( + "'{name}' must be in {options!r} (got {value!r})".format( + name=attr.name, options=self.options, value=value + ) + ) + + def __repr__(self): + return "".format( + options=self.options + ) + + +def in_(options): + """ + A validator that raises a :exc:`ValueError` if the initializer is called + with a value that does not belong in the options provided. The check is + performed using ``value in options``. + + :param options: Allowed options. + :type options: list, tuple, :class:`enum.Enum`, ... + + :raises ValueError: With a human readable error message, the attribute (of + type :class:`attr.Attribute`), the expected options, and the value it + got. + + .. versionadded:: 17.1.0 + """ + return _InValidator(options) diff --git a/venv/Lib/site-packages/attr/validators.pyi b/venv/Lib/site-packages/attr/validators.pyi new file mode 100644 index 00000000..abbaedf1 --- /dev/null +++ b/venv/Lib/site-packages/attr/validators.pyi @@ -0,0 +1,14 @@ +from typing import Container, List, Union, TypeVar, Type, Any, Optional, Tuple +from . import _ValidatorType + +_T = TypeVar("_T") + +def instance_of( + type: Union[Tuple[Type[_T], ...], Type[_T]] +) -> _ValidatorType[_T]: ... +def provides(interface: Any) -> _ValidatorType[Any]: ... +def optional( + validator: Union[_ValidatorType[_T], List[_ValidatorType[_T]]] +) -> _ValidatorType[Optional[_T]]: ... +def in_(options: Container[_T]) -> _ValidatorType[_T]: ... +def and_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... diff --git a/venv/Lib/site-packages/attrs-18.2.0.dist-info/INSTALLER b/venv/Lib/site-packages/attrs-18.2.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/Lib/site-packages/attrs-18.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/attrs-18.2.0.dist-info/LICENSE.txt b/venv/Lib/site-packages/attrs-18.2.0.dist-info/LICENSE.txt new file mode 100644 index 00000000..7ae3df93 --- /dev/null +++ b/venv/Lib/site-packages/attrs-18.2.0.dist-info/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Hynek Schlawack + +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/site-packages/attrs-18.2.0.dist-info/METADATA b/venv/Lib/site-packages/attrs-18.2.0.dist-info/METADATA new file mode 100644 index 00000000..8300b5cd --- /dev/null +++ b/venv/Lib/site-packages/attrs-18.2.0.dist-info/METADATA @@ -0,0 +1,260 @@ +Metadata-Version: 2.1 +Name: attrs +Version: 18.2.0 +Summary: Classes Without Boilerplate +Home-page: https://www.attrs.org/ +Author: Hynek Schlawack +Author-email: hs@ox.cx +Maintainer: Hynek Schlawack +Maintainer-email: hs@ox.cx +License: MIT +Project-URL: Documentation, https://www.attrs.org/ +Project-URL: Bug Tracker, https://github.com/python-attrs/attrs/issues +Project-URL: Source Code, https://github.com/python-attrs/attrs +Keywords: class,attribute,boilerplate +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: MIT 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.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Provides-Extra: docs +Provides-Extra: dev +Provides-Extra: tests +Provides-Extra: dev +Requires-Dist: coverage; extra == 'dev' +Requires-Dist: hypothesis; extra == 'dev' +Requires-Dist: pympler; extra == 'dev' +Requires-Dist: pytest; extra == 'dev' +Requires-Dist: six; extra == 'dev' +Requires-Dist: zope.interface; extra == 'dev' +Requires-Dist: sphinx; extra == 'dev' +Requires-Dist: zope.interface; extra == 'dev' +Requires-Dist: pre-commit; extra == 'dev' +Provides-Extra: docs +Requires-Dist: sphinx; extra == 'docs' +Requires-Dist: zope.interface; extra == 'docs' +Provides-Extra: tests +Requires-Dist: coverage; extra == 'tests' +Requires-Dist: hypothesis; extra == 'tests' +Requires-Dist: pympler; extra == 'tests' +Requires-Dist: pytest; extra == 'tests' +Requires-Dist: six; extra == 'tests' +Requires-Dist: zope.interface; extra == 'tests' + +.. image:: https://www.attrs.org/en/latest/_static/attrs_logo.png + :alt: attrs Logo + +====================================== +``attrs``: Classes Without Boilerplate +====================================== + +.. image:: https://readthedocs.org/projects/attrs/badge/?version=stable + :target: https://www.attrs.org/en/stable/?badge=stable + :alt: Documentation Status + +.. image:: https://travis-ci.org/python-attrs/attrs.svg?branch=master + :target: https://travis-ci.org/python-attrs/attrs + :alt: CI Status + +.. image:: https://codecov.io/github/python-attrs/attrs/branch/master/graph/badge.svg + :target: https://codecov.io/github/python-attrs/attrs + :alt: Test Coverage + +.. image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/ambv/black + :alt: Code style: black + +.. teaser-begin + +``attrs`` is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka `dunder `_ methods). + +Its main goal is to help you to write **concise** and **correct** software without slowing down your code. + +.. -spiel-end- + +For that, it gives you a class decorator and a way to declaratively define the attributes on that class: + +.. -code-begin- + +.. code-block:: pycon + + >>> import attr + + >>> @attr.s + ... class SomeClass(object): + ... a_number = attr.ib(default=42) + ... list_of_numbers = attr.ib(factory=list) + ... + ... def hard_math(self, another_number): + ... return self.a_number + sum(self.list_of_numbers) * another_number + + + >>> sc = SomeClass(1, [1, 2, 3]) + >>> sc + SomeClass(a_number=1, list_of_numbers=[1, 2, 3]) + + >>> sc.hard_math(3) + 19 + >>> sc == SomeClass(1, [1, 2, 3]) + True + >>> sc != SomeClass(2, [3, 2, 1]) + True + + >>> attr.asdict(sc) + {'a_number': 1, 'list_of_numbers': [1, 2, 3]} + + >>> SomeClass() + SomeClass(a_number=42, list_of_numbers=[]) + + >>> C = attr.make_class("C", ["a", "b"]) + >>> C("foo", "bar") + C(a='foo', b='bar') + + +After *declaring* your attributes ``attrs`` gives you: + +- a concise and explicit overview of the class's attributes, +- a nice human-readable ``__repr__``, +- a complete set of comparison methods, +- an initializer, +- and much more, + +*without* writing dull boilerplate code again and again and *without* runtime performance penalties. + +On Python 3.6 and later, you can often even drop the calls to ``attr.ib()`` by using `type annotations `_. + +This gives you the power to use actual classes with actual types in your code instead of confusing ``tuple``\ s or `confusingly behaving `_ ``namedtuple``\ s. +Which in turn encourages you to write *small classes* that do `one thing well `_. +Never again violate the `single responsibility principle `_ just because implementing ``__init__`` et al is a painful drag. + + +.. -testimonials- + +Testimonials +============ + +**Amber Hawkie Brown**, Twisted Release Manager and Computer Owl: + + Writing a fully-functional class using attrs takes me less time than writing this testimonial. + + +**Glyph Lefkowitz**, creator of `Twisted `_, `Automat `_, and other open source software, in `The One Python Library Everyone Needs `_: + + I’m looking forward to is being able to program in Python-with-attrs everywhere. + It exerts a subtle, but positive, design influence in all the codebases I’ve see it used in. + + +**Kenneth Reitz**, author of `Requests `_ and Developer Advocate at DigitalOcean, (`on paper no less `_!): + + attrs—classes for humans. I like it. + + +**Łukasz Langa**, prolific CPython core developer and Production Engineer at Facebook: + + I'm increasingly digging your attr.ocity. Good job! + + +.. -end- + +.. -project-information- + +Getting Help +============ + +Please use the ``python-attrs`` tag on `StackOverflow `_ to get help. + +Answering questions of your fellow developers is also great way to help the project! + + +Project Information +=================== + +``attrs`` is released under the `MIT `_ license, +its documentation lives at `Read the Docs `_, +the code on `GitHub `_, +and the latest release on `PyPI `_. +It’s rigorously tested on Python 2.7, 3.4+, and PyPy. + +We collect information on **third-party extensions** in our `wiki `_. +Feel free to browse and add your own! + +If you'd like to contribute to ``attrs`` you're most welcome and we've written `a little guide `_ to get you started! + + +Release Information +=================== + +18.2.0 (2018-09-01) +------------------- + +Deprecations +^^^^^^^^^^^^ + +- Comparing subclasses using ``<``, ``>``, ``<=``, and ``>=`` is now deprecated. + The docs always claimed that instances are only compared if the types are identical, so this is a first step to conform to the docs. + + Equality operators (``==`` and ``!=``) were always strict in this regard. + `#394 `_ + + +Changes +^^^^^^^ + +- ``attrs`` now ships its own `PEP 484 `_ type hints. + Together with `mypy `_'s ``attrs`` plugin, you've got all you need for writing statically typed code in both Python 2 and 3! + + At that occasion, we've also added `narrative docs `_ about type annotations in ``attrs``. + `#238 `_ +- Added *kw_only* arguments to ``attr.ib`` and ``attr.s``, and a corresponding *kw_only* attribute to ``attr.Attribute``. + This change makes it possible to have a generated ``__init__`` with keyword-only arguments on Python 3, relaxing the required ordering of default and non-default valued attributes. + `#281 `_, + `#411 `_ +- The test suite now runs with ``hypothesis.HealthCheck.too_slow`` disabled to prevent CI breakage on slower computers. + `#364 `_, + `#396 `_ +- ``attr.validators.in_()`` now raises a ``ValueError`` with a useful message even if the options are a string and the value is not a string. + `#383 `_ +- ``attr.asdict()`` now properly handles deeply nested lists and dictionaries. + `#395 `_ +- Added ``attr.converters.default_if_none()`` that allows to replace ``None`` values in attributes. + For example ``attr.ib(converter=default_if_none(""))`` replaces ``None`` by empty strings. + `#400 `_, + `#414 `_ +- Fixed a reference leak where the original class would remain live after being replaced when ``slots=True`` is set. + `#407 `_ +- Slotted classes can now be made weakly referenceable by passing ``@attr.s(weakref_slot=True)``. + `#420 `_ +- Added *cache_hash* option to ``@attr.s`` which causes the hash code to be computed once and stored on the object. + `#425 `_ +- Attributes can be named ``property`` and ``itemgetter`` now. + `#430 `_ +- It is now possible to override a base class' class variable using only class annotations. + `#431 `_ + +`Full changelog `_. + +Credits +======= + +``attrs`` is written and maintained by `Hynek Schlawack `_. + +The development is kindly supported by `Variomedia AG `_. + +A full list of contributors can be found in `GitHub's overview `_. + +It’s the spiritual successor of `characteristic `_ and aspires to fix some of it clunkiness and unfortunate decisions. +Both were inspired by Twisted’s `FancyEqMixin `_ but both are implemented using class decorators because `subclassing is bad for you `_, m’kay? + + diff --git a/venv/Lib/site-packages/attrs-18.2.0.dist-info/RECORD b/venv/Lib/site-packages/attrs-18.2.0.dist-info/RECORD new file mode 100644 index 00000000..9a08bc8e --- /dev/null +++ b/venv/Lib/site-packages/attrs-18.2.0.dist-info/RECORD @@ -0,0 +1,30 @@ +attr/__init__.py,sha256=5pRFI7J27MRSvdzcRiUMW6k2PEbU3-Jp3de4Iohg01I,1244 +attr/__init__.pyi,sha256=3OiFuXAVhhw599eaCQXidqay5ZgNhIGVOL9MEiGYU6k,7638 +attr/__pycache__/__init__.cpython-37.pyc,, +attr/__pycache__/_compat.cpython-37.pyc,, +attr/__pycache__/_config.cpython-37.pyc,, +attr/__pycache__/_funcs.cpython-37.pyc,, +attr/__pycache__/_make.cpython-37.pyc,, +attr/__pycache__/converters.cpython-37.pyc,, +attr/__pycache__/exceptions.cpython-37.pyc,, +attr/__pycache__/filters.cpython-37.pyc,, +attr/__pycache__/validators.cpython-37.pyc,, +attr/_compat.py,sha256=bIlOWj_fPcz9Z_kkXdKS_aQgx-olkY-3r3flW_PLqtI,4468 +attr/_config.py,sha256=_KvW0mQdH2PYjHc0YfIUaV_o2pVfM7ziMEYTxwmEhOA,514 +attr/_funcs.py,sha256=7v3MNMHdOUP2NkiLPwEiWAorBs3uNQq5Rn70Odr5uqo,9725 +attr/_make.py,sha256=WeQz2rBClF0EsgTGaxaiVf_mU9ijHh-lIOfaiBVfmx8,65714 +attr/converters.py,sha256=SFPiz6-hAs2pw3kn7SzkBcdpE9AjW8iT9wjpe2eLDrQ,2155 +attr/converters.pyi,sha256=wAhCoOT1MFV8t323rpD87O7bxQ8CYLTPiBQd-29BieI,351 +attr/exceptions.py,sha256=N0WQfKvBVd4GWgDxTbFScg4ajy7-HlyvXiwlSQBA0jA,1272 +attr/exceptions.pyi,sha256=sq7TbBEGGSf81uFXScW9_aO62vd0v6LAvqz0a8Hrsxw,257 +attr/filters.py,sha256=s6NrcRWJKlCQauPEH0S4lmgFwlCdUQcHKcNkDHpptN4,1153 +attr/filters.pyi,sha256=MwXtozGEyi1PwyxyOw1dzywWRM1u4LbSOcRkaDO0ayM,189 +attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attr/validators.py,sha256=ZEPSsWcH8XfM0JMmH0pE0yyg8hImm4LKM_FE8qncXVc,5174 +attr/validators.pyi,sha256=U_odr0Bg4-2lKD7Bn6nd9mPTybRBa0fJH-ecyljcdsQ,528 +attrs-18.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +attrs-18.2.0.dist-info/LICENSE.txt,sha256=v2WaKLSSQGAvVrvfSQy-LsUJsVuY-Z17GaUsdA4yeGM,1082 +attrs-18.2.0.dist-info/METADATA,sha256=FVn0_IbUZ--Lx-ovJJR0itwxYx9g2NDW37V-KjuKUhk,11173 +attrs-18.2.0.dist-info/RECORD,, +attrs-18.2.0.dist-info/WHEEL,sha256=gduuPyBvFJQSQ0zdyxF7k0zynDXbIbvg5ZBHoXum5uk,110 +attrs-18.2.0.dist-info/top_level.txt,sha256=tlRYMddkRlKPqJ96wP2_j9uEsmcNHgD2SbuWd4CzGVU,5 diff --git a/venv/Lib/site-packages/attrs-18.2.0.dist-info/WHEEL b/venv/Lib/site-packages/attrs-18.2.0.dist-info/WHEEL new file mode 100644 index 00000000..1316c41d --- /dev/null +++ b/venv/Lib/site-packages/attrs-18.2.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/attrs-18.2.0.dist-info/top_level.txt b/venv/Lib/site-packages/attrs-18.2.0.dist-info/top_level.txt new file mode 100644 index 00000000..66a062d8 --- /dev/null +++ b/venv/Lib/site-packages/attrs-18.2.0.dist-info/top_level.txt @@ -0,0 +1 @@ +attr diff --git a/venv/Lib/site-packages/click/__init__.py b/venv/Lib/site-packages/click/__init__.py new file mode 100644 index 00000000..d3c33660 --- /dev/null +++ b/venv/Lib/site-packages/click/__init__.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +""" +click +~~~~~ + +Click is a simple Python module inspired by the stdlib optparse to make +writing command line scripts fun. Unlike other modules, it's based +around a simple API that does not come with too much magic and is +composable. + +:copyright: © 2014 by the Pallets team. +:license: BSD, see LICENSE.rst for more details. +""" + +# Core classes +from .core import Context, BaseCommand, Command, MultiCommand, Group, \ + CommandCollection, Parameter, Option, Argument + +# Globals +from .globals import get_current_context + +# Decorators +from .decorators import pass_context, pass_obj, make_pass_decorator, \ + command, group, argument, option, confirmation_option, \ + password_option, version_option, help_option + +# Types +from .types import ParamType, File, Path, Choice, IntRange, Tuple, \ + DateTime, STRING, INT, FLOAT, BOOL, UUID, UNPROCESSED, FloatRange + +# Utilities +from .utils import echo, get_binary_stream, get_text_stream, open_file, \ + format_filename, get_app_dir, get_os_args + +# Terminal functions +from .termui import prompt, confirm, get_terminal_size, echo_via_pager, \ + progressbar, clear, style, unstyle, secho, edit, launch, getchar, \ + pause + +# Exceptions +from .exceptions import ClickException, UsageError, BadParameter, \ + FileError, Abort, NoSuchOption, BadOptionUsage, BadArgumentUsage, \ + MissingParameter + +# Formatting +from .formatting import HelpFormatter, wrap_text + +# Parsing +from .parser import OptionParser + + +__all__ = [ + # Core classes + 'Context', 'BaseCommand', 'Command', 'MultiCommand', 'Group', + 'CommandCollection', 'Parameter', 'Option', 'Argument', + + # Globals + 'get_current_context', + + # Decorators + 'pass_context', 'pass_obj', 'make_pass_decorator', 'command', 'group', + 'argument', 'option', 'confirmation_option', 'password_option', + 'version_option', 'help_option', + + # Types + 'ParamType', 'File', 'Path', 'Choice', 'IntRange', 'Tuple', + 'DateTime', 'STRING', 'INT', 'FLOAT', 'BOOL', 'UUID', 'UNPROCESSED', + 'FloatRange', + + # Utilities + 'echo', 'get_binary_stream', 'get_text_stream', 'open_file', + 'format_filename', 'get_app_dir', 'get_os_args', + + # Terminal functions + 'prompt', 'confirm', 'get_terminal_size', 'echo_via_pager', + 'progressbar', 'clear', 'style', 'unstyle', 'secho', 'edit', 'launch', + 'getchar', 'pause', + + # Exceptions + 'ClickException', 'UsageError', 'BadParameter', 'FileError', + 'Abort', 'NoSuchOption', 'BadOptionUsage', 'BadArgumentUsage', + 'MissingParameter', + + # Formatting + 'HelpFormatter', 'wrap_text', + + # Parsing + 'OptionParser', +] + + +# Controls if click should emit the warning about the use of unicode +# literals. +disable_unicode_literals_warning = False + + +__version__ = '7.0' diff --git a/venv/Lib/site-packages/click/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/click/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae0775365bc06278538d7a1b664a9bdffab79074 GIT binary patch literal 2659 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-37.pyc b/venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..983e10441a9346843cb55288c8036c0054524282 GIT binary patch literal 13950 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-37.pyc b/venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7696f357657e465e4cacb8b02ff2c71118582280 GIT binary patch literal 1333 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/click/__pycache__/core.cpython-37.pyc b/venv/Lib/site-packages/click/__pycache__/core.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe19a21a8033c2c0579977f571869bc98e94f5fa GIT binary patch literal 59830 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/click/__pycache__/decorators.cpython-37.pyc b/venv/Lib/site-packages/click/__pycache__/decorators.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0060f10b4c17a0ed4baa930fa9b4ab791384c7d9 GIT binary patch literal 11587 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/click/__pycache__/exceptions.cpython-37.pyc b/venv/Lib/site-packages/click/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1fb49612a377c6337a5a83947ed7bc703a45725 GIT binary patch literal 8613 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 F{1Huxuyp_c literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/click/__pycache__/formatting.cpython-37.pyc b/venv/Lib/site-packages/click/__pycache__/formatting.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e9807d8ae714b554925072a13e065901ce1842a GIT binary patch literal 8549 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 A=l}o! literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/click/__pycache__/globals.cpython-37.pyc b/venv/Lib/site-packages/click/__pycache__/globals.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55ec9ccff65aae8309b662daecfd5a1e2264d4b7 GIT binary patch literal 1880 zcmZuy-EJc_6t-uQG)>bY7Ip;}NM;3Ef_5W{gjhugQMx~>1QBY3w3JARGj=j=J>$Xl zq(2H=Z1fg3pX%hW;;b-ncceZ7b#SC8rEO-|kpa!ym4d=meM}Lap zI7TaE`nJKs3;Y!SfYRUzVhwQ7q)!8c_PNbCsM{Z z8w|*2{ZGoRK}I!Ah!GMZH~_mq)R+12ZwpZE3ma?4^vKdM`!y zs!vcDXhd`h`?8DosB-E8YTtlS)o?!mc^R`pWS}fVc1s+`xJh)~-pr z0SjK*@4&#KBm6vIc!4g1=iv%nVvJY-(hbi){tl9fJN=~mq>f#!mRiT2*S-$H)Uemk zE%+Ag$%Ki>P9{YM5~K=a(V|(#QwHpWkv;XqlwH@|>AK9VpYa~77$_VF1^Nc`ksH>{ zt$X-eFeu?)LIq+NKnLd^?(;+~0kum;t1=?_l7lK;ZE#B^-eE8FP(AJ<%v5#-j|-Xh zpf+Hm#&jE2YfNv$c=(c22gtqOgZc;tD*$u6uDdHJl@{1!;jj2-yn+G>s~@cJ5kU2D z8|S~@-gDYdsjP~I;}-(!vDN}8#iZtbF;Wt$!CcY>l%&0RC4`rHbLGpG5qrl}T7((Y zELT%FyGs<1pii8F{1K_tu{)4?hP+lBOLcVX`s_D`qaM~Sxq5+5s-o$!!0aY0>Nj2I zxqC(6O{i*0E;*10s3+Bf?!d`1OPg)T&<<{6eaqR!k9v66TPxOWtT|;+1GOW!43*1c kpAFj4?=M_&_sVDci$t+p@-N-rn0M0+TVdx`yV-932kaRMr2qf` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/click/__pycache__/parser.cpython-37.pyc b/venv/Lib/site-packages/click/__pycache__/parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6958ca6ea3f1cf788117f6176eba6c289253d06c GIT binary patch literal 11457 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 NZ(;uV`E&D){{id~@1Fnw literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/click/__pycache__/termui.cpython-37.pyc b/venv/Lib/site-packages/click/__pycache__/termui.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3ce0a9870396cec1f3d5cd5d520eedf21e3d97b GIT binary patch literal 20774 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 OzF2*(Sg1ZzDg7Ubh=ut8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/click/__pycache__/testing.cpython-37.pyc b/venv/Lib/site-packages/click/__pycache__/testing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed2ceb83e5f342fea919214cf282d29cbb8fa84a GIT binary patch literal 11622 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/click/__pycache__/types.cpython-37.pyc b/venv/Lib/site-packages/click/__pycache__/types.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa9e628eb5ab3f26e44a8f41f43eeb00c376da46 GIT binary patch literal 21800 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 BQ_=tc literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/click/__pycache__/utils.cpython-37.pyc b/venv/Lib/site-packages/click/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..622a8f8941552579f958d9fe66459fe2ccc29964 GIT binary patch literal 15245 zcmd5@OOqSdb?$CF2QwVLMN*Qbwj@e~O%C-cTQ!y$Q6z_=Ee#oSWXdpYpaSw^7)wHwY zDoEn~y`bHV`>|^KLC+iY)8?UUE)DLd?R0w>Wb^Sbh}uc20&kF=*a*^gFYE`&c9I5z zb`W)AKa4iA1AM?vfl{%`7I2B%GDDJ;ZhY_6Y;iq|Jhg3RO0or6LeHCIi<~s_20=TG z+oLc$;*D^zrMzLg2gtlA39|+#9qQ}D$!0w2`%g2uNWT4U>>{m6P`KXe{hI1y*{*Y-KARK633QC3NY{V>fc z{df!O+gX_?`729(34?$AyO)-4zn=sux&7Y7t5>gm^vcrZD>rXn91bsgsdxL`xa;+A zuLXnQ?O`}P7e-0y_50^u`7lYsH@<%VcDEmP@0xa$hW%t|xSh?lhj9|#4}06k38RC? zvemO_i%sxe$-I+8xcG_Hvwbkz$Ms!%Ork37ynG7>mAIbU8%5nTj3YOR-E`AS-7s~N zEx-ZvxxxKzFyzx@sf&5!#o6n4bIIfdG~11z0!3r{7nr$hrPkesdd3DOZR>kh|uJ|UVPIXA5jth6$=9%y8rz7$9I0+kZq_q_fn zaKk8#^_S3hHRmnuR7Pp<+#6X<1;f7A4Vu-g5hg+vQ8&mcn)<7L00s_J6<}ox??)lO zT_FoAZU%^~$PyZpq(Y6(`oOyzkokz4WC4xkG=R|sV06(|XYu{Bb7;CkQMe!iIHMrp zQ(Rzs)+1{dTih*eSi5E4*{$5)89SG)AE@2xxaybu@*g;-EWdKsQLp;d-O9ME-u7#$ zJ+3~mPguiu^wn-{TpHI-fMV{JRc~Ad(&~?FC;*IzPGU?d_vUzySL3Q&Rn*5fEROuT zwOjh|$y=7+cvu>jc?`|@ov(Z+NJlCHPP=jB2T>CEE>ND3vg4k+8T5xao)wRG<+K0B zYc;c%))aTVQ(9VD`nBz5R6TSVf|0LCEX{gW<~&(r;N5TI=|;MlRkmW~ zQ#8il-TY=1LK;#zEBkR2WMy_~HKJh4Jl}gXC*)|1C~redsN-oiU+p$RN#TdU>xcB=&aRP}4nIAy=?&p{hi z{Dwb|&#J%RAHZi#be`3!YmL{M)0(c;@Q?Y&@qAu1oz+_KOF;gqtp2XIv%La!u=DR1 z-9D~e>IN74zMHuH@NR%(QNhNj?1MFMA4CE4 z$^dd|5V-4J5_aA0X3)h7fu}GU43z}ntR9EUG`WIuhn|8^hJJ8mMWP#hK_g49yS5o7 zF8)VJ04Q86;Zi~vaG(*3sS$5z`K zJ7{fCu+?_PWwfO+L`1thhHM7MT!6r^(FZjBpnRKst9aL<=X_`E+^wp$w9e-boQHFd zAZ&c_V;eljJ|bbutLh}yQZT@*wPr&-jnAw+fON>}h0?EzvWM99(s&Sd6~WA$b`R=b zYv*o1PC&9eimW1EAco3G(C=mS9G~iUxXxQ_F0y%>jYyg)anlwp+it&yhY10*oT_d9 zK+aYBh*K{w;&bP4PCZNcm_i1TGfQ|2CKqu*K}=;lhA`Gz#mQ<=_+FYSbp;(D{IB9e zcE1;<`8I6>c5SykbTZ0w=hzegMTZ$>P{8m4hK;Q|!2aDibqw+h*A((TuW)8}NC6*{|Iu86`qs!t*mo(>)4+ z$@jF!1!+IVg#c^=;6uE+X>GqKfD5>|15&&LLcCM;olh#a9he9psasZb8Opq#&h;E< zxE&jU-?nz1qmb{z8s9BJID`1^IOzh2()KH#I6tx>ltIk9&PP!DTKOB&r;x7h{Oxt1 zBbl%_cr{F4(js6xNJRkTEJ^+D4#JI1NCz+MyIWzpDLh93;knB&O_n<=5Hq6tIvBPJ zL9*#Zejn_KHNewC>==oehAQ?)T?nE`-z}yRo97ZOEf*}Xm1xH1BCuFAX_E?Ry%ei8 zAv!mq!kY)=EQO0EN4b|XE@OCByLMdw&1%Wjw2xKgX=qH0{GEM$;5>Rx6C`u;3Q z2$hHEs+p<+Js@@w^}{jzE!Z!RsSXr0O%g0P{?-$r8Q@ zVqU|uC<#+!Wx9YuhM$86EYB|O_9t9k_G;JnC?I)`eSH&MR@DWxE6oELMvAN3&Km7D zbn2)dwAzgMvNa?uSZmVk;q`u9D%1>Yu$`F*P_j&JoY`)KC!rgL3A4SpS zAR{GDps82Nj%7EF)=TwD{RrMQT$Q9x7mte<@$?qn2}e)NJ$QW(j=FyU$GeydGJ&T!ex8U~e`m$fQT-{t;pvH5__gkA)nB&0vXJ701yKEH^ec!V0CIU_mh zU9KV6e5^qt6#eiE*4tx?aCb8#vv)oECSSB3dE}R0u%71U)#jYK&6$3{=7(%1OgLdU zVaLzqx(w&dvM^%Ii z@Hy7X_4O3S7J>#&@_Gt$>w&!sZ$RB1Tf+<>A~IK?%8%J5=Ks{VP2(`BmD0XJPM_(|PbM zSNkWJZURg6TzUZg7G=hNNf%`WJ6af*G0OD8O#gwk@-@t=Vk%TT2f>0H2p>v>V-O^X zw-LC*{)hn&_`R^m0{Umvyc^-YAkqdgU9FTMKPcVn+Vks$Dna~-X5U$@d;4*mJCPhd za1%#Nd)-ZZ~!CkUf_#fPe#Kb{Ah963Zu|OOJD@T5RllW>mv|{g%J0eIHNQ- zqgbXfHVzC!xST!>j5z9r8zTi%g5c<&D*VT#hV%y#2A&Gh5n;4JfFP)zd^;YwUD%!) z{OPp;_!cYz7oP?^nMmM5>|#AmH{Dm4?hDMX;d4J4!$?3G#K0WF6)MIeUJCcy(6XC>%2moMrMByzRswHL-*$xaMuOXD<`*5|{OGhTp z(zowO+}j&?oi@F86Eh8bQcK_l-OYHi8SX$9M2HZ<0Yeepz8G=^QD6fXS8ra!`hXdG zx{@F?!0@m>M2&_`6PfTe5%*%oM_~;w>tjDhpTq}AD4aN=4VYl!icA(j#9lAMy_J`TY6e_Ap$E)y8>{%blQ`p3l*GUT+AaO!TY^L~R8A^0JEq&KKE#?vKMg zoi0Re0DO-7X(|AyvxHz`_5~qmk4|_~BHo@TWgDv9xchP`N;~2o;VFwJmq=in$#c5z{K8gb-ezOmUI33hQ+QmX6!&dkBsRl*Tfh52}XE|Y?mJFqT`442>=>Oe83 zrkUU1De6yy-&q6v9rp}(kZ1X(v?{UW;!{KWpY!h;yy&B79hEJ z$cZ+|MGhzl(p-_iWy1wyOl`;jLdi?%Tcj_3sReG=-7+RN{9xW|(kPQQX>L{B7Xb_jI8ER7N z_?|gYKPv&fh+C2^vU!slH}b%pwV9sBZ?^yYXO%^I8v)C?PjB}|xW)`iOsQ#=@2)$rFr4Lar7 zAn7gG>O+i|U__VH#TTO&1*M(Amx9tto%h_{UJ&C_%6T+T2i? z;KPHAW{#}Df~R5x3qiy)hiS&3TMzUoBd28J%;r0}O)pj(jpkJHHB5_jNANH}XE{m8 zL`>OueXxp8^IR#2Bmg;Os2h6ve?dP+IOhqOWfvZcQZObo(`tzdH06>u?>M6=FapAQ z|5&L7F;QB%?{XNJ( z*UL#b2$@|3=WEYvfiuL?o20xh9Mgm5Wj2I!1o zVup;(Y2;#;M9E%xQd5(mo?zn6iJUpFO%-Zi$dYrED^%TpEbt9MUW3WPcyiG-nQ+UL zOvA8()wDw-+oXO6y9x-{7B+*Bd~T>p%z0WcdfhH)En=O?cD@^?Lt!3(Z$ggr&lwPb11i2vAJwqC|Vg}(-N@~ zM?6EtP08J)bKF}NuySJr+4{Yn%CvE>cUKOl`cSs0VrYlWCboSz19t6vaHO zXc49PW7u{gZl;Ya)Gm$0TZF3vml2!{|B^*##3RwYH!34|!ZB*IZpNa!#VC}Vt_~c5 z;l=rtTYAyFdWeA!nF;ke-1-6y$Sk5YlOYOcbSw(v znAJmO*6XHP=NDY7NpQyFHk^1p(z^|!d!dRWqD3pUy|BZxGFbZl@+&`pM1+&1qYRox z-a#oHv?66D<7PD5Kty?*h!m$rQAB}b?0{DV)ziz!wnPjTI{;sJC`LgH3&&J=?o#xq z<4E)a*HKpne&l>IMXrX|1By5x7J$g1ph7E^V?=xo-dBh*h1BIrh_~fZ5K%UWL`d91 z!0KZ($D89qm=~+$5wJ-JCKqgZ07eRyR+}~LH;F@Z0+g(nEmEus%u1M43heGpDQ;mL zCJnNAYVTO8Ba?5DYZ%eC4jn<_SZ(2ICgW3Zi=>Nfbtpvw231*fY7o;lMQ*nDZScp6 z5F=ffT{yGqKbO`X9j?KruaF);!Jew`>@EA5P!DHiJ=G2h{r7Xx8P1 zvRX4amfaUt)6WK2(2JrkOC zLE;N#I#XkkILVqXCUt0;Ucx*1b2Ly07sj?)@a^Fuk~5{$zT=?Kumo~1kIQ}uKK#qL zSAJOWQGAGW3a_gy=wjU`(mFrXcTArO5;pMlPk>!ms+iXA%=uNQnU7|A)gCcQfbqp$ ztm)Uy94Li+B)R=2CFuoSI6k>My+4j%3X z`bPv3Zx(?L5n#gRChm-(@Nsn}Mff5QO5%awGGB7~(||9E2yB|9G4rIr1NnKA;l!c` z^dGD-$bFFh=g#Mg{)B*$2))em!R4zaw4*14Nro64Qb&(>K?J(#6V5YH8W4?`takCn zjmsC;E@lhwUcYqlUGoh;^Z00|^wIgHtg4sT`O+84mFysZYhSv)x^nGm`iG=CUIb1R<}>1TKDP11&h>Po0FGlFboH5VoT8_%V^!KX>(#5Tl7E8~0)=xwynCQyBN# zvx@uzM5iDwZxye-yk%C?M#wmI027VL%NMnHiom zY6@T|F)+4QY@wp$hD&{RA?p1w%i1mC$lQ zS($Z8+o%Z5YgSRO{6-mtG^kZxL9MclTIDCaX2l%?v*S(V>~G%HE~?qPm)9ZgojK}B&^xpL#$jVp*-T;-FSZ2pkVY&b%3+~09$ zG*tPErA7Q=gWR=q@-cf9a-BgfHz^zB_|GYJBY+0GaPnCBz6S`_9{$4=dY^gB(o?nY zbR}I| zm~^2ekWIWveo&_iC2=SjNXbP?l2IfvGmWiz{!kDSnuRCgIcpzUylKj~Y>tUH`0w7f z3OMnzY)-Q|%jO$skk(me355=5b$FX8L7lRZC^!R9;#Z63A!1cfG<9qRMzi{xI!Skd yWS=adK?c%UaNenuMM57dFO=%#dZXTGoI3RGq2mp&eyDL61)^^Kc;j&6wf_NbEKv6V literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/click/_bashcomplete.py b/venv/Lib/site-packages/click/_bashcomplete.py new file mode 100644 index 00000000..a5f1084c --- /dev/null +++ b/venv/Lib/site-packages/click/_bashcomplete.py @@ -0,0 +1,293 @@ +import copy +import os +import re + +from .utils import echo +from .parser import split_arg_string +from .core import MultiCommand, Option, Argument +from .types import Choice + +try: + from collections import abc +except ImportError: + import collections as abc + +WORDBREAK = '=' + +# Note, only BASH version 4.4 and later have the nosort option. +COMPLETION_SCRIPT_BASH = ''' +%(complete_func)s() { + local IFS=$'\n' + COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + %(autocomplete_var)s=complete $1 ) ) + return 0 +} + +%(complete_func)setup() { + local COMPLETION_OPTIONS="" + local BASH_VERSION_ARR=(${BASH_VERSION//./ }) + # Only BASH version 4.4 and later have the nosort option. + if [ ${BASH_VERSION_ARR[0]} -gt 4 ] || ([ ${BASH_VERSION_ARR[0]} -eq 4 ] && [ ${BASH_VERSION_ARR[1]} -ge 4 ]); then + COMPLETION_OPTIONS="-o nosort" + fi + + complete $COMPLETION_OPTIONS -F %(complete_func)s %(script_names)s +} + +%(complete_func)setup +''' + +COMPLETION_SCRIPT_ZSH = ''' +%(complete_func)s() { + local -a completions + local -a completions_with_descriptions + local -a response + response=("${(@f)$( env COMP_WORDS=\"${words[*]}\" \\ + COMP_CWORD=$((CURRENT-1)) \\ + %(autocomplete_var)s=\"complete_zsh\" \\ + %(script_names)s )}") + + for key descr in ${(kv)response}; do + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + fi + done + + if [ -n "$completions_with_descriptions" ]; then + _describe -V unsorted completions_with_descriptions -U -Q + fi + + if [ -n "$completions" ]; then + compadd -U -V unsorted -Q -a completions + fi + compstate[insert]="automenu" +} + +compdef %(complete_func)s %(script_names)s +''' + +_invalid_ident_char_re = re.compile(r'[^a-zA-Z0-9_]') + + +def get_completion_script(prog_name, complete_var, shell): + cf_name = _invalid_ident_char_re.sub('', prog_name.replace('-', '_')) + script = COMPLETION_SCRIPT_ZSH if shell == 'zsh' else COMPLETION_SCRIPT_BASH + return (script % { + 'complete_func': '_%s_completion' % cf_name, + 'script_names': prog_name, + 'autocomplete_var': complete_var, + }).strip() + ';' + + +def resolve_ctx(cli, prog_name, args): + """ + Parse into a hierarchy of contexts. Contexts are connected through the parent variable. + :param cli: command definition + :param prog_name: the program that is running + :param args: full list of args + :return: the final context/command parsed + """ + ctx = cli.make_context(prog_name, args, resilient_parsing=True) + args = ctx.protected_args + ctx.args + while args: + if isinstance(ctx.command, MultiCommand): + if not ctx.command.chain: + cmd_name, cmd, args = ctx.command.resolve_command(ctx, args) + if cmd is None: + return ctx + ctx = cmd.make_context(cmd_name, args, parent=ctx, + resilient_parsing=True) + args = ctx.protected_args + ctx.args + else: + # Walk chained subcommand contexts saving the last one. + while args: + cmd_name, cmd, args = ctx.command.resolve_command(ctx, args) + if cmd is None: + return ctx + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + resilient_parsing=True) + args = sub_ctx.args + ctx = sub_ctx + args = sub_ctx.protected_args + sub_ctx.args + else: + break + return ctx + + +def start_of_option(param_str): + """ + :param param_str: param_str to check + :return: whether or not this is the start of an option declaration (i.e. starts "-" or "--") + """ + return param_str and param_str[:1] == '-' + + +def is_incomplete_option(all_args, cmd_param): + """ + :param all_args: the full original list of args supplied + :param cmd_param: the current command paramter + :return: whether or not the last option declaration (i.e. starts "-" or "--") is incomplete and + corresponds to this cmd_param. In other words whether this cmd_param option can still accept + values + """ + if not isinstance(cmd_param, Option): + return False + if cmd_param.is_flag: + return False + last_option = None + for index, arg_str in enumerate(reversed([arg for arg in all_args if arg != WORDBREAK])): + if index + 1 > cmd_param.nargs: + break + if start_of_option(arg_str): + last_option = arg_str + + return True if last_option and last_option in cmd_param.opts else False + + +def is_incomplete_argument(current_params, cmd_param): + """ + :param current_params: the current params and values for this argument as already entered + :param cmd_param: the current command parameter + :return: whether or not the last argument is incomplete and corresponds to this cmd_param. In + other words whether or not the this cmd_param argument can still accept values + """ + if not isinstance(cmd_param, Argument): + return False + current_param_values = current_params[cmd_param.name] + if current_param_values is None: + return True + if cmd_param.nargs == -1: + return True + if isinstance(current_param_values, abc.Iterable) \ + and cmd_param.nargs > 1 and len(current_param_values) < cmd_param.nargs: + return True + return False + + +def get_user_autocompletions(ctx, args, incomplete, cmd_param): + """ + :param ctx: context associated with the parsed command + :param args: full list of args + :param incomplete: the incomplete text to autocomplete + :param cmd_param: command definition + :return: all the possible user-specified completions for the param + """ + results = [] + if isinstance(cmd_param.type, Choice): + # Choices don't support descriptions. + results = [(c, None) + for c in cmd_param.type.choices if str(c).startswith(incomplete)] + elif cmd_param.autocompletion is not None: + dynamic_completions = cmd_param.autocompletion(ctx=ctx, + args=args, + incomplete=incomplete) + results = [c if isinstance(c, tuple) else (c, None) + for c in dynamic_completions] + return results + + +def get_visible_commands_starting_with(ctx, starts_with): + """ + :param ctx: context associated with the parsed command + :starts_with: string that visible commands must start with. + :return: all visible (not hidden) commands that start with starts_with. + """ + for c in ctx.command.list_commands(ctx): + if c.startswith(starts_with): + command = ctx.command.get_command(ctx, c) + if not command.hidden: + yield command + + +def add_subcommand_completions(ctx, incomplete, completions_out): + # Add subcommand completions. + if isinstance(ctx.command, MultiCommand): + completions_out.extend( + [(c.name, c.get_short_help_str()) for c in get_visible_commands_starting_with(ctx, incomplete)]) + + # Walk up the context list and add any other completion possibilities from chained commands + while ctx.parent is not None: + ctx = ctx.parent + if isinstance(ctx.command, MultiCommand) and ctx.command.chain: + remaining_commands = [c for c in get_visible_commands_starting_with(ctx, incomplete) + if c.name not in ctx.protected_args] + completions_out.extend([(c.name, c.get_short_help_str()) for c in remaining_commands]) + + +def get_choices(cli, prog_name, args, incomplete): + """ + :param cli: command definition + :param prog_name: the program that is running + :param args: full list of args + :param incomplete: the incomplete text to autocomplete + :return: all the possible completions for the incomplete + """ + all_args = copy.deepcopy(args) + + ctx = resolve_ctx(cli, prog_name, args) + if ctx is None: + return [] + + # In newer versions of bash long opts with '='s are partitioned, but it's easier to parse + # without the '=' + if start_of_option(incomplete) and WORDBREAK in incomplete: + partition_incomplete = incomplete.partition(WORDBREAK) + all_args.append(partition_incomplete[0]) + incomplete = partition_incomplete[2] + elif incomplete == WORDBREAK: + incomplete = '' + + completions = [] + if start_of_option(incomplete): + # completions for partial options + for param in ctx.command.params: + if isinstance(param, Option) and not param.hidden: + param_opts = [param_opt for param_opt in param.opts + + param.secondary_opts if param_opt not in all_args or param.multiple] + completions.extend([(o, param.help) for o in param_opts if o.startswith(incomplete)]) + return completions + # completion for option values from user supplied values + for param in ctx.command.params: + if is_incomplete_option(all_args, param): + return get_user_autocompletions(ctx, all_args, incomplete, param) + # completion for argument values from user supplied values + for param in ctx.command.params: + if is_incomplete_argument(ctx.params, param): + return get_user_autocompletions(ctx, all_args, incomplete, param) + + add_subcommand_completions(ctx, incomplete, completions) + # Sort before returning so that proper ordering can be enforced in custom types. + return sorted(completions) + + +def do_complete(cli, prog_name, include_descriptions): + cwords = split_arg_string(os.environ['COMP_WORDS']) + cword = int(os.environ['COMP_CWORD']) + args = cwords[1:cword] + try: + incomplete = cwords[cword] + except IndexError: + incomplete = '' + + for item in get_choices(cli, prog_name, args, incomplete): + echo(item[0]) + if include_descriptions: + # ZSH has trouble dealing with empty array parameters when returned from commands, so use a well defined character '_' to indicate no description is present. + echo(item[1] if item[1] else '_') + + return True + + +def bashcomplete(cli, prog_name, complete_var, complete_instr): + if complete_instr.startswith('source'): + shell = 'zsh' if complete_instr == 'source_zsh' else 'bash' + echo(get_completion_script(prog_name, complete_var, shell)) + return True + elif complete_instr == 'complete' or complete_instr == 'complete_zsh': + return do_complete(cli, prog_name, complete_instr == 'complete_zsh') + return False diff --git a/venv/Lib/site-packages/click/_compat.py b/venv/Lib/site-packages/click/_compat.py new file mode 100644 index 00000000..937e2301 --- /dev/null +++ b/venv/Lib/site-packages/click/_compat.py @@ -0,0 +1,703 @@ +import re +import io +import os +import sys +import codecs +from weakref import WeakKeyDictionary + + +PY2 = sys.version_info[0] == 2 +CYGWIN = sys.platform.startswith('cygwin') +# Determine local App Engine environment, per Google's own suggestion +APP_ENGINE = ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) +WIN = sys.platform.startswith('win') and not APP_ENGINE +DEFAULT_COLUMNS = 80 + + +_ansi_re = re.compile(r'\033\[((?:\d|;)*)([a-zA-Z])') + + +def get_filesystem_encoding(): + return sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def _make_text_stream(stream, encoding, errors, + force_readable=False, force_writable=False): + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = 'replace' + return _NonClosingTextIOWrapper(stream, encoding, errors, + line_buffering=True, + force_readable=force_readable, + force_writable=force_writable) + + +def is_ascii_encoding(encoding): + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == 'ascii' + except LookupError: + return False + + +def get_best_encoding(stream): + """Returns the default stream encoding if not found.""" + rv = getattr(stream, 'encoding', None) or sys.getdefaultencoding() + if is_ascii_encoding(rv): + return 'utf-8' + return rv + + +class _NonClosingTextIOWrapper(io.TextIOWrapper): + + def __init__(self, stream, encoding, errors, + force_readable=False, force_writable=False, **extra): + self._stream = stream = _FixupStream(stream, force_readable, + force_writable) + io.TextIOWrapper.__init__(self, stream, encoding, errors, **extra) + + # The io module is a place where the Python 3 text behavior + # was forced upon Python 2, so we need to unbreak + # it to look like Python 2. + if PY2: + def write(self, x): + if isinstance(x, str) or is_bytes(x): + try: + self.flush() + except Exception: + pass + return self.buffer.write(str(x)) + return io.TextIOWrapper.write(self, x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __del__(self): + try: + self.detach() + except Exception: + pass + + def isatty(self): + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream(object): + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + + The forcing of readable and writable flags are there because some tools + put badly patched objects on sys (one such offender are certain version + of jupyter notebook). + """ + + def __init__(self, stream, force_readable=False, force_writable=False): + self._stream = stream + self._force_readable = force_readable + self._force_writable = force_writable + + def __getattr__(self, name): + return getattr(self._stream, name) + + def read1(self, size): + f = getattr(self._stream, 'read1', None) + if f is not None: + return f(size) + # We only dispatch to readline instead of read in Python 2 as we + # do not want cause problems with the different implementation + # of line buffering. + if PY2: + return self._stream.readline(size) + return self._stream.read(size) + + def readable(self): + if self._force_readable: + return True + x = getattr(self._stream, 'readable', None) + if x is not None: + return x() + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self): + if self._force_writable: + return True + x = getattr(self._stream, 'writable', None) + if x is not None: + return x() + try: + self._stream.write('') + except Exception: + try: + self._stream.write(b'') + except Exception: + return False + return True + + def seekable(self): + x = getattr(self._stream, 'seekable', None) + if x is not None: + return x() + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +if PY2: + text_type = unicode + bytes = str + raw_input = raw_input + string_types = (str, unicode) + int_types = (int, long) + iteritems = lambda x: x.iteritems() + range_type = xrange + + def is_bytes(x): + return isinstance(x, (buffer, bytearray)) + + _identifier_re = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*$') + + # For Windows, we need to force stdout/stdin/stderr to binary if it's + # fetched for that. This obviously is not the most correct way to do + # it as it changes global state. Unfortunately, there does not seem to + # be a clear better way to do it as just reopening the file in binary + # mode does not change anything. + # + # An option would be to do what Python 3 does and to open the file as + # binary only, patch it back to the system, and then use a wrapper + # stream that converts newlines. It's not quite clear what's the + # correct option here. + # + # This code also lives in _winconsole for the fallback to the console + # emulation stream. + # + # There are also Windows environments where the `msvcrt` module is not + # available (which is why we use try-catch instead of the WIN variable + # here), such as the Google App Engine development server on Windows. In + # those cases there is just nothing we can do. + def set_binary_mode(f): + return f + + try: + import msvcrt + except ImportError: + pass + else: + def set_binary_mode(f): + try: + fileno = f.fileno() + except Exception: + pass + else: + msvcrt.setmode(fileno, os.O_BINARY) + return f + + try: + import fcntl + except ImportError: + pass + else: + def set_binary_mode(f): + try: + fileno = f.fileno() + except Exception: + pass + else: + flags = fcntl.fcntl(fileno, fcntl.F_GETFL) + fcntl.fcntl(fileno, fcntl.F_SETFL, flags & ~os.O_NONBLOCK) + return f + + def isidentifier(x): + return _identifier_re.search(x) is not None + + def get_binary_stdin(): + return set_binary_mode(sys.stdin) + + def get_binary_stdout(): + _wrap_std_stream('stdout') + return set_binary_mode(sys.stdout) + + def get_binary_stderr(): + _wrap_std_stream('stderr') + return set_binary_mode(sys.stderr) + + def get_text_stdin(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdin, encoding, errors, + force_readable=True) + + def get_text_stdout(encoding=None, errors=None): + _wrap_std_stream('stdout') + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdout, encoding, errors, + force_writable=True) + + def get_text_stderr(encoding=None, errors=None): + _wrap_std_stream('stderr') + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stderr, encoding, errors, + force_writable=True) + + def filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), 'replace') + return value +else: + import io + text_type = str + raw_input = input + string_types = (str,) + int_types = (int,) + range_type = range + isidentifier = lambda x: x.isidentifier() + iteritems = lambda x: iter(x.items()) + + def is_bytes(x): + return isinstance(x, (bytes, memoryview, bytearray)) + + def _is_binary_reader(stream, default=False): + try: + return isinstance(stream.read(0), bytes) + except Exception: + return default + # This happens in some cases where the stream was already + # closed. In this case, we assume the default. + + def _is_binary_writer(stream, default=False): + try: + stream.write(b'') + except Exception: + try: + stream.write('') + return False + except Exception: + pass + return default + return True + + def _find_binary_reader(stream): + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_reader(stream, False): + return stream + + buf = getattr(stream, 'buffer', None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_reader(buf, True): + return buf + + def _find_binary_writer(stream): + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detatching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_writer(stream, False): + return stream + + buf = getattr(stream, 'buffer', None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_writer(buf, True): + return buf + + def _stream_is_misconfigured(stream): + """A stream is misconfigured if its encoding is ASCII.""" + # If the stream does not have an encoding set, we assume it's set + # to ASCII. This appears to happen in certain unittest + # environments. It's not quite clear what the correct behavior is + # but this at least will force Click to recover somehow. + return is_ascii_encoding(getattr(stream, 'encoding', None) or 'ascii') + + def _is_compatible_text_stream(stream, encoding, errors): + stream_encoding = getattr(stream, 'encoding', None) + stream_errors = getattr(stream, 'errors', None) + + # Perfect match. + if stream_encoding == encoding and stream_errors == errors: + return True + + # Otherwise, it's only a compatible stream if we did not ask for + # an encoding. + if encoding is None: + return stream_encoding is not None + + return False + + def _force_correct_text_reader(text_reader, encoding, errors, + force_readable=False): + if _is_binary_reader(text_reader, False): + binary_reader = text_reader + else: + # If there is no target encoding set, we need to verify that the + # reader is not actually misconfigured. + if encoding is None and not _stream_is_misconfigured(text_reader): + return text_reader + + if _is_compatible_text_stream(text_reader, encoding, errors): + return text_reader + + # If the reader has no encoding, we try to find the underlying + # binary reader for it. If that fails because the environment is + # misconfigured, we silently go with the same reader because this + # is too common to happen. In that case, mojibake is better than + # exceptions. + binary_reader = _find_binary_reader(text_reader) + if binary_reader is None: + return text_reader + + # At this point, we default the errors to replace instead of strict + # because nobody handles those errors anyways and at this point + # we're so fundamentally fucked that nothing can repair it. + if errors is None: + errors = 'replace' + return _make_text_stream(binary_reader, encoding, errors, + force_readable=force_readable) + + def _force_correct_text_writer(text_writer, encoding, errors, + force_writable=False): + if _is_binary_writer(text_writer, False): + binary_writer = text_writer + else: + # If there is no target encoding set, we need to verify that the + # writer is not actually misconfigured. + if encoding is None and not _stream_is_misconfigured(text_writer): + return text_writer + + if _is_compatible_text_stream(text_writer, encoding, errors): + return text_writer + + # If the writer has no encoding, we try to find the underlying + # binary writer for it. If that fails because the environment is + # misconfigured, we silently go with the same writer because this + # is too common to happen. In that case, mojibake is better than + # exceptions. + binary_writer = _find_binary_writer(text_writer) + if binary_writer is None: + return text_writer + + # At this point, we default the errors to replace instead of strict + # because nobody handles those errors anyways and at this point + # we're so fundamentally fucked that nothing can repair it. + if errors is None: + errors = 'replace' + return _make_text_stream(binary_writer, encoding, errors, + force_writable=force_writable) + + def get_binary_stdin(): + reader = _find_binary_reader(sys.stdin) + if reader is None: + raise RuntimeError('Was not able to determine binary ' + 'stream for sys.stdin.') + return reader + + def get_binary_stdout(): + writer = _find_binary_writer(sys.stdout) + if writer is None: + raise RuntimeError('Was not able to determine binary ' + 'stream for sys.stdout.') + return writer + + def get_binary_stderr(): + writer = _find_binary_writer(sys.stderr) + if writer is None: + raise RuntimeError('Was not able to determine binary ' + 'stream for sys.stderr.') + return writer + + def get_text_stdin(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_reader(sys.stdin, encoding, errors, + force_readable=True) + + def get_text_stdout(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stdout, encoding, errors, + force_writable=True) + + def get_text_stderr(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stderr, encoding, errors, + force_writable=True) + + def filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), 'replace') + else: + value = value.encode('utf-8', 'surrogateescape') \ + .decode('utf-8', 'replace') + return value + + +def get_streerror(e, default=None): + if hasattr(e, 'strerror'): + msg = e.strerror + else: + if default is not None: + msg = default + else: + msg = str(e) + if isinstance(msg, bytes): + msg = msg.decode('utf-8', 'replace') + return msg + + +def open_stream(filename, mode='r', encoding=None, errors='strict', + atomic=False): + # Standard streams first. These are simple because they don't need + # special handling for the atomic flag. It's entirely ignored. + if filename == '-': + if any(m in mode for m in ['w', 'a', 'x']): + if 'b' in mode: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if 'b' in mode: + return get_binary_stdin(), False + return get_text_stdin(encoding=encoding, errors=errors), False + + # Non-atomic writes directly go out through the regular open functions. + if not atomic: + if encoding is None: + return open(filename, mode), True + return io.open(filename, mode, encoding=encoding, errors=errors), True + + # Some usability stuff for atomic writes + if 'a' in mode: + raise ValueError( + 'Appending to an existing file is not supported, because that ' + 'would involve an expensive `copy`-operation to a temporary ' + 'file. Open the file in normal `w`-mode and copy explicitly ' + 'if that\'s what you\'re after.' + ) + if 'x' in mode: + raise ValueError('Use the `overwrite`-parameter instead.') + if 'w' not in mode: + raise ValueError('Atomic writes only make sense with `w`-mode.') + + # Atomic writes are more complicated. They work by opening a file + # as a proxy in the same folder and then using the fdopen + # functionality to wrap it in a Python file. Then we wrap it in an + # atomic file that moves the file over on close. + import tempfile + fd, tmp_filename = tempfile.mkstemp(dir=os.path.dirname(filename), + prefix='.__atomic-write') + + if encoding is not None: + f = io.open(fd, mode, encoding=encoding, errors=errors) + else: + f = os.fdopen(fd, mode) + + return _AtomicFile(f, tmp_filename, os.path.realpath(filename)), True + + +# Used in a destructor call, needs extra protection from interpreter cleanup. +if hasattr(os, 'replace'): + _replace = os.replace + _can_replace = True +else: + _replace = os.rename + _can_replace = not WIN + + +class _AtomicFile(object): + + def __init__(self, f, tmp_filename, real_filename): + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self): + return self._real_filename + + def close(self, delete=False): + if self.closed: + return + self._f.close() + if not _can_replace: + try: + os.remove(self._real_filename) + except OSError: + pass + _replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name): + return getattr(self._f, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close(delete=exc_type is not None) + + def __repr__(self): + return repr(self._f) + + +auto_wrap_for_ansi = None +colorama = None +get_winterm_size = None + + +def strip_ansi(value): + return _ansi_re.sub('', value) + + +def should_strip_ansi(stream=None, color=None): + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) + return not color + + +# If we're on Windows, we provide transparent integration through +# colorama. This will make ANSI colors through the echo function +# work automatically. +if WIN: + # Windows has a smaller terminal + DEFAULT_COLUMNS = 79 + + from ._winconsole import _get_windows_console_stream, _wrap_std_stream + + def _get_argv_encoding(): + import locale + return locale.getpreferredencoding() + + if PY2: + def raw_input(prompt=''): + sys.stderr.flush() + if prompt: + stdout = _default_text_stdout() + stdout.write(prompt) + stdin = _default_text_stdin() + return stdin.readline().rstrip('\r\n') + + try: + import colorama + except ImportError: + pass + else: + _ansi_stream_wrappers = WeakKeyDictionary() + + def auto_wrap_for_ansi(stream, color=None): + """This function wraps a stream so that calls through colorama + are issued to the win32 console API to recolor on demand. It + also ensures to reset the colors if a write call is interrupted + to not destroy the console afterwards. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + if cached is not None: + return cached + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = ansi_wrapper.stream + _write = rv.write + + def _safe_write(s): + try: + return _write(s) + except: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + return rv + + def get_winterm_size(): + win = colorama.win32.GetConsoleScreenBufferInfo( + colorama.win32.STDOUT).srWindow + return win.Right - win.Left, win.Bottom - win.Top +else: + def _get_argv_encoding(): + return getattr(sys.stdin, 'encoding', None) or get_filesystem_encoding() + + _get_windows_console_stream = lambda *x: None + _wrap_std_stream = lambda *x: None + + +def term_len(x): + return len(strip_ansi(x)) + + +def isatty(stream): + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func(src_func, wrapper_func): + cache = WeakKeyDictionary() + def func(): + stream = src_func() + try: + rv = cache.get(stream) + except Exception: + rv = None + if rv is not None: + return rv + rv = wrapper_func() + try: + stream = src_func() # In case wrapper_func() modified the stream + cache[stream] = rv + except Exception: + pass + return rv + return func + + +_default_text_stdin = _make_cached_stream_func( + lambda: sys.stdin, get_text_stdin) +_default_text_stdout = _make_cached_stream_func( + lambda: sys.stdout, get_text_stdout) +_default_text_stderr = _make_cached_stream_func( + lambda: sys.stderr, get_text_stderr) + + +binary_streams = { + 'stdin': get_binary_stdin, + 'stdout': get_binary_stdout, + 'stderr': get_binary_stderr, +} + +text_streams = { + 'stdin': get_text_stdin, + 'stdout': get_text_stdout, + 'stderr': get_text_stderr, +} diff --git a/venv/Lib/site-packages/click/_termui_impl.py b/venv/Lib/site-packages/click/_termui_impl.py new file mode 100644 index 00000000..00a8e5ef --- /dev/null +++ b/venv/Lib/site-packages/click/_termui_impl.py @@ -0,0 +1,621 @@ +# -*- coding: utf-8 -*- +""" +click._termui_impl +~~~~~~~~~~~~~~~~~~ + +This module contains implementations for the termui module. To keep the +import time of Click down, some infrequently used functionality is +placed in this module and only imported as needed. + +:copyright: © 2014 by the Pallets team. +:license: BSD, see LICENSE.rst for more details. +""" + +import os +import sys +import time +import math +import contextlib +from ._compat import _default_text_stdout, range_type, PY2, isatty, \ + open_stream, strip_ansi, term_len, get_best_encoding, WIN, int_types, \ + CYGWIN +from .utils import echo +from .exceptions import ClickException + + +if os.name == 'nt': + BEFORE_BAR = '\r' + AFTER_BAR = '\n' +else: + BEFORE_BAR = '\r\033[?25l' + AFTER_BAR = '\033[?25h\n' + + +def _length_hint(obj): + """Returns the length hint of an object.""" + try: + return len(obj) + except (AttributeError, TypeError): + try: + get_hint = type(obj).__length_hint__ + except AttributeError: + return None + try: + hint = get_hint(obj) + except TypeError: + return None + if hint is NotImplemented or \ + not isinstance(hint, int_types) or \ + hint < 0: + return None + return hint + + +class ProgressBar(object): + + def __init__(self, iterable, length=None, fill_char='#', empty_char=' ', + bar_template='%(bar)s', info_sep=' ', show_eta=True, + show_percent=None, show_pos=False, item_show_func=None, + label=None, file=None, color=None, width=30): + self.fill_char = fill_char + self.empty_char = empty_char + self.bar_template = bar_template + self.info_sep = info_sep + self.show_eta = show_eta + self.show_percent = show_percent + self.show_pos = show_pos + self.item_show_func = item_show_func + self.label = label or '' + if file is None: + file = _default_text_stdout() + self.file = file + self.color = color + self.width = width + self.autowidth = width == 0 + + if length is None: + length = _length_hint(iterable) + if iterable is None: + if length is None: + raise TypeError('iterable or length is required') + iterable = range_type(length) + self.iter = iter(iterable) + self.length = length + self.length_known = length is not None + self.pos = 0 + self.avg = [] + self.start = self.last_eta = time.time() + self.eta_known = False + self.finished = False + self.max_width = None + self.entered = False + self.current_item = None + self.is_hidden = not isatty(self.file) + self._last_line = None + self.short_limit = 0.5 + + def __enter__(self): + self.entered = True + self.render_progress() + return self + + def __exit__(self, exc_type, exc_value, tb): + self.render_finish() + + def __iter__(self): + if not self.entered: + raise RuntimeError('You need to use progress bars in a with block.') + self.render_progress() + return self.generator() + + def is_fast(self): + return time.time() - self.start <= self.short_limit + + def render_finish(self): + if self.is_hidden or self.is_fast(): + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self): + if self.finished: + return 1.0 + return min(self.pos / (float(self.length) or 1), 1.0) + + @property + def time_per_iteration(self): + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self): + if self.length_known and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self): + if self.eta_known: + t = int(self.eta) + seconds = t % 60 + t //= 60 + minutes = t % 60 + t //= 60 + hours = t % 24 + t //= 24 + if t > 0: + days = t + return '%dd %02d:%02d:%02d' % (days, hours, minutes, seconds) + else: + return '%02d:%02d:%02d' % (hours, minutes, seconds) + return '' + + def format_pos(self): + pos = str(self.pos) + if self.length_known: + pos += '/%s' % self.length + return pos + + def format_pct(self): + return ('% 4d%%' % int(self.pct * 100))[1:] + + def format_bar(self): + if self.length_known: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + elif self.finished: + bar = self.fill_char * self.width + else: + bar = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + bar[int((math.cos(self.pos * self.time_per_iteration) + / 2.0 + 0.5) * self.width)] = self.fill_char + bar = ''.join(bar) + return bar + + def format_progress_line(self): + show_percent = self.show_percent + + info_bits = [] + if self.length_known and show_percent is None: + show_percent = not self.show_pos + + if self.show_pos: + info_bits.append(self.format_pos()) + if show_percent: + info_bits.append(self.format_pct()) + if self.show_eta and self.eta_known and not self.finished: + info_bits.append(self.format_eta()) + if self.item_show_func is not None: + item_info = self.item_show_func(self.current_item) + if item_info is not None: + info_bits.append(item_info) + + return (self.bar_template % { + 'label': self.label, + 'bar': self.format_bar(), + 'info': self.info_sep.join(info_bits) + }).rstrip() + + def render_progress(self): + from .termui import get_terminal_size + + if self.is_hidden: + return + + buf = [] + # Update width in case the terminal has been resized + if self.autowidth: + old_width = self.width + self.width = 0 + clutter_length = term_len(self.format_progress_line()) + new_width = max(0, get_terminal_size()[0] - clutter_length) + if new_width < old_width: + buf.append(BEFORE_BAR) + buf.append(' ' * self.max_width) + self.max_width = new_width + self.width = new_width + + clear_width = self.width + if self.max_width is not None: + clear_width = self.max_width + + buf.append(BEFORE_BAR) + line = self.format_progress_line() + line_len = term_len(line) + if self.max_width is None or self.max_width < line_len: + self.max_width = line_len + + buf.append(line) + buf.append(' ' * (clear_width - line_len)) + line = ''.join(buf) + # Render the line only if it changed. + + if line != self._last_line and not self.is_fast(): + self._last_line = line + echo(line, file=self.file, color=self.color, nl=False) + self.file.flush() + + def make_step(self, n_steps): + self.pos += n_steps + if self.length_known and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + + # self.avg is a rolling list of length <= 7 of steps where steps are + # defined as time elapsed divided by the total progress through + # self.length. + if self.pos: + step = (time.time() - self.start) / self.pos + else: + step = time.time() - self.start + + self.avg = self.avg[-6:] + [step] + + self.eta_known = self.length_known + + def update(self, n_steps): + self.make_step(n_steps) + self.render_progress() + + def finish(self): + self.eta_known = 0 + self.current_item = None + self.finished = True + + def generator(self): + """ + Returns a generator which yields the items added to the bar during + construction, and updates the progress bar *after* the yielded block + returns. + """ + if not self.entered: + raise RuntimeError('You need to use progress bars in a with block.') + + if self.is_hidden: + for rv in self.iter: + yield rv + else: + for rv in self.iter: + self.current_item = rv + yield rv + self.update(1) + self.finish() + self.render_progress() + + +def pager(generator, color=None): + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, generator, color) + pager_cmd = (os.environ.get('PAGER', None) or '').strip() + if pager_cmd: + if WIN: + return _tempfilepager(generator, pager_cmd, color) + return _pipepager(generator, pager_cmd, color) + if os.environ.get('TERM') in ('dumb', 'emacs'): + return _nullpager(stdout, generator, color) + if WIN or sys.platform.startswith('os2'): + return _tempfilepager(generator, 'more <', color) + if hasattr(os, 'system') and os.system('(less) 2>/dev/null') == 0: + return _pipepager(generator, 'less', color) + + import tempfile + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if hasattr(os, 'system') and os.system('more "%s"' % filename) == 0: + return _pipepager(generator, 'more', color) + return _nullpager(stdout, generator, color) + finally: + os.unlink(filename) + + +def _pipepager(generator, cmd, color): + """Page through text by feeding it to another program. Invoking a + pager through this might support colors. + """ + import subprocess + env = dict(os.environ) + + # If we're piping to less we might support colors under the + # condition that + cmd_detail = cmd.rsplit('/', 1)[-1].split() + if color is None and cmd_detail[0] == 'less': + less_flags = os.environ.get('LESS', '') + ' '.join(cmd_detail[1:]) + if not less_flags: + env['LESS'] = '-R' + color = True + elif 'r' in less_flags or 'R' in less_flags: + color = True + + c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, + env=env) + encoding = get_best_encoding(c.stdin) + try: + for text in generator: + if not color: + text = strip_ansi(text) + + c.stdin.write(text.encode(encoding, 'replace')) + except (IOError, KeyboardInterrupt): + pass + else: + c.stdin.close() + + # Less doesn't respect ^C, but catches it for its own UI purposes (aborting + # search or other commands inside less). + # + # That means when the user hits ^C, the parent process (click) terminates, + # but less is still alive, paging the output and messing up the terminal. + # + # If the user wants to make the pager exit on ^C, they should set + # `LESS='-K'`. It's not our decision to make. + while True: + try: + c.wait() + except KeyboardInterrupt: + pass + else: + break + + +def _tempfilepager(generator, cmd, color): + """Page through text by invoking a program on a temporary file.""" + import tempfile + filename = tempfile.mktemp() + # TODO: This never terminates if the passed generator never terminates. + text = "".join(generator) + if not color: + text = strip_ansi(text) + encoding = get_best_encoding(sys.stdout) + with open_stream(filename, 'wb')[0] as f: + f.write(text.encode(encoding)) + try: + os.system(cmd + ' "' + filename + '"') + finally: + os.unlink(filename) + + +def _nullpager(stream, generator, color): + """Simply print unformatted text. This is the ultimate fallback.""" + for text in generator: + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor(object): + + def __init__(self, editor=None, env=None, require_save=True, + extension='.txt'): + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self): + if self.editor is not None: + return self.editor + for key in 'VISUAL', 'EDITOR': + rv = os.environ.get(key) + if rv: + return rv + if WIN: + return 'notepad' + for editor in 'vim', 'nano': + if os.system('which %s >/dev/null 2>&1' % editor) == 0: + return editor + return 'vi' + + def edit_file(self, filename): + import subprocess + editor = self.get_editor() + if self.env: + environ = os.environ.copy() + environ.update(self.env) + else: + environ = None + try: + c = subprocess.Popen('%s "%s"' % (editor, filename), + env=environ, shell=True) + exit_code = c.wait() + if exit_code != 0: + raise ClickException('%s: Editing failed!' % editor) + except OSError as e: + raise ClickException('%s: Editing failed: %s' % (editor, e)) + + def edit(self, text): + import tempfile + + text = text or '' + if text and not text.endswith('\n'): + text += '\n' + + fd, name = tempfile.mkstemp(prefix='editor-', suffix=self.extension) + try: + if WIN: + encoding = 'utf-8-sig' + text = text.replace('\n', '\r\n') + else: + encoding = 'utf-8' + text = text.encode(encoding) + + f = os.fdopen(fd, 'wb') + f.write(text) + f.close() + timestamp = os.path.getmtime(name) + + self.edit_file(name) + + if self.require_save \ + and os.path.getmtime(name) == timestamp: + return None + + f = open(name, 'rb') + try: + rv = f.read() + finally: + f.close() + return rv.decode('utf-8-sig').replace('\r\n', '\n') + finally: + os.unlink(name) + + +def open_url(url, wait=False, locate=False): + import subprocess + + def _unquote_file(url): + try: + import urllib + except ImportError: + import urllib + if url.startswith('file://'): + url = urllib.unquote(url[7:]) + return url + + if sys.platform == 'darwin': + args = ['open'] + if wait: + args.append('-W') + if locate: + args.append('-R') + args.append(_unquote_file(url)) + null = open('/dev/null', 'w') + try: + return subprocess.Popen(args, stderr=null).wait() + finally: + null.close() + elif WIN: + if locate: + url = _unquote_file(url) + args = 'explorer /select,"%s"' % _unquote_file( + url.replace('"', '')) + else: + args = 'start %s "" "%s"' % ( + wait and '/WAIT' or '', url.replace('"', '')) + return os.system(args) + elif CYGWIN: + if locate: + url = _unquote_file(url) + args = 'cygstart "%s"' % (os.path.dirname(url).replace('"', '')) + else: + args = 'cygstart %s "%s"' % ( + wait and '-w' or '', url.replace('"', '')) + return os.system(args) + + try: + if locate: + url = os.path.dirname(_unquote_file(url)) or '.' + else: + url = _unquote_file(url) + c = subprocess.Popen(['xdg-open', url]) + if wait: + return c.wait() + return 0 + except OSError: + if url.startswith(('http://', 'https://')) and not locate and not wait: + import webbrowser + webbrowser.open(url) + return 0 + return 1 + + +def _translate_ch_to_exc(ch): + if ch == u'\x03': + raise KeyboardInterrupt() + if ch == u'\x04' and not WIN: # Unix-like, Ctrl+D + raise EOFError() + if ch == u'\x1a' and WIN: # Windows, Ctrl+Z + raise EOFError() + + +if WIN: + import msvcrt + + @contextlib.contextmanager + def raw_terminal(): + yield + + def getchar(echo): + # The function `getch` will return a bytes object corresponding to + # the pressed character. Since Windows 10 build 1803, it will also + # return \x00 when called a second time after pressing a regular key. + # + # `getwch` does not share this probably-bugged behavior. Moreover, it + # returns a Unicode object by default, which is what we want. + # + # Either of these functions will return \x00 or \xe0 to indicate + # a special key, and you need to call the same function again to get + # the "rest" of the code. The fun part is that \u00e0 is + # "latin small letter a with grave", so if you type that on a French + # keyboard, you _also_ get a \xe0. + # E.g., consider the Up arrow. This returns \xe0 and then \x48. The + # resulting Unicode string reads as "a with grave" + "capital H". + # This is indistinguishable from when the user actually types + # "a with grave" and then "capital H". + # + # When \xe0 is returned, we assume it's part of a special-key sequence + # and call `getwch` again, but that means that when the user types + # the \u00e0 character, `getchar` doesn't return until a second + # character is typed. + # The alternative is returning immediately, but that would mess up + # cross-platform handling of arrow keys and others that start with + # \xe0. Another option is using `getch`, but then we can't reliably + # read non-ASCII characters, because return values of `getch` are + # limited to the current 8-bit codepage. + # + # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` + # is doing the right thing in more situations than with `getch`. + if echo: + func = msvcrt.getwche + else: + func = msvcrt.getwch + + rv = func() + if rv in (u'\x00', u'\xe0'): + # \x00 and \xe0 are control characters that indicate special key, + # see above. + rv += func() + _translate_ch_to_exc(rv) + return rv +else: + import tty + import termios + + @contextlib.contextmanager + def raw_terminal(): + if not isatty(sys.stdin): + f = open('/dev/tty') + fd = f.fileno() + else: + fd = sys.stdin.fileno() + f = None + try: + old_settings = termios.tcgetattr(fd) + try: + tty.setraw(fd) + yield fd + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + if f is not None: + f.close() + except termios.error: + pass + + def getchar(echo): + with raw_terminal() as fd: + ch = os.read(fd, 32) + ch = ch.decode(get_best_encoding(sys.stdin), 'replace') + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + _translate_ch_to_exc(ch) + return ch diff --git a/venv/Lib/site-packages/click/_textwrap.py b/venv/Lib/site-packages/click/_textwrap.py new file mode 100644 index 00000000..7e776031 --- /dev/null +++ b/venv/Lib/site-packages/click/_textwrap.py @@ -0,0 +1,38 @@ +import textwrap +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + + def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width): + space_left = max(width - cur_len, 1) + + if self.break_long_words: + last = reversed_chunks[-1] + cut = last[:space_left] + res = last[space_left:] + cur_line.append(cut) + reversed_chunks[-1] = res + elif not cur_line: + cur_line.append(reversed_chunks.pop()) + + @contextmanager + def extra_indent(self, indent): + old_initial_indent = self.initial_indent + old_subsequent_indent = self.subsequent_indent + self.initial_indent += indent + self.subsequent_indent += indent + try: + yield + finally: + self.initial_indent = old_initial_indent + self.subsequent_indent = old_subsequent_indent + + def indent_only(self, text): + rv = [] + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + if idx > 0: + indent = self.subsequent_indent + rv.append(indent + line) + return '\n'.join(rv) diff --git a/venv/Lib/site-packages/click/_unicodefun.py b/venv/Lib/site-packages/click/_unicodefun.py new file mode 100644 index 00000000..620edff3 --- /dev/null +++ b/venv/Lib/site-packages/click/_unicodefun.py @@ -0,0 +1,125 @@ +import os +import sys +import codecs + +from ._compat import PY2 + + +# If someone wants to vendor click, we want to ensure the +# correct package is discovered. Ideally we could use a +# relative import here but unfortunately Python does not +# support that. +click = sys.modules[__name__.rsplit('.', 1)[0]] + + +def _find_unicode_literals_frame(): + import __future__ + if not hasattr(sys, '_getframe'): # not all Python implementations have it + return 0 + frm = sys._getframe(1) + idx = 1 + while frm is not None: + if frm.f_globals.get('__name__', '').startswith('click.'): + frm = frm.f_back + idx += 1 + elif frm.f_code.co_flags & __future__.unicode_literals.compiler_flag: + return idx + else: + break + return 0 + + +def _check_for_unicode_literals(): + if not __debug__: + return + if not PY2 or click.disable_unicode_literals_warning: + return + bad_frame = _find_unicode_literals_frame() + if bad_frame <= 0: + return + from warnings import warn + warn(Warning('Click detected the use of the unicode_literals ' + '__future__ import. This is heavily discouraged ' + 'because it can introduce subtle bugs in your ' + 'code. You should instead use explicit u"" literals ' + 'for your unicode strings. For more information see ' + 'https://click.palletsprojects.com/python3/'), + stacklevel=bad_frame) + + +def _verify_python3_env(): + """Ensures that the environment is good for unicode on Python 3.""" + if PY2: + return + try: + import locale + fs_enc = codecs.lookup(locale.getpreferredencoding()).name + except Exception: + fs_enc = 'ascii' + if fs_enc != 'ascii': + return + + extra = '' + if os.name == 'posix': + import subprocess + try: + rv = subprocess.Popen(['locale', '-a'], stdout=subprocess.PIPE, + stderr=subprocess.PIPE).communicate()[0] + except OSError: + rv = b'' + good_locales = set() + has_c_utf8 = False + + # Make sure we're operating on text here. + if isinstance(rv, bytes): + rv = rv.decode('ascii', 'replace') + + for line in rv.splitlines(): + locale = line.strip() + if locale.lower().endswith(('.utf-8', '.utf8')): + good_locales.add(locale) + if locale.lower() in ('c.utf8', 'c.utf-8'): + has_c_utf8 = True + + extra += '\n\n' + if not good_locales: + extra += ( + 'Additional information: on this system no suitable UTF-8\n' + 'locales were discovered. This most likely requires resolving\n' + 'by reconfiguring the locale system.' + ) + elif has_c_utf8: + extra += ( + 'This system supports the C.UTF-8 locale which is recommended.\n' + 'You might be able to resolve your issue by exporting the\n' + 'following environment variables:\n\n' + ' export LC_ALL=C.UTF-8\n' + ' export LANG=C.UTF-8' + ) + else: + extra += ( + 'This system lists a couple of UTF-8 supporting locales that\n' + 'you can pick from. The following suitable locales were\n' + 'discovered: %s' + ) % ', '.join(sorted(good_locales)) + + bad_locale = None + for locale in os.environ.get('LC_ALL'), os.environ.get('LANG'): + if locale and locale.lower().endswith(('.utf-8', '.utf8')): + bad_locale = locale + if locale is not None: + break + if bad_locale is not None: + extra += ( + '\n\nClick discovered that you exported a UTF-8 locale\n' + 'but the locale system could not pick up from it because\n' + 'it does not exist. The exported locale is "%s" but it\n' + 'is not supported' + ) % bad_locale + + raise RuntimeError( + 'Click will abort further execution because Python 3 was' + ' configured to use ASCII as encoding for the environment.' + ' Consult https://click.palletsprojects.com/en/7.x/python3/ for' + ' mitigation steps.' + extra + ) diff --git a/venv/Lib/site-packages/click/_winconsole.py b/venv/Lib/site-packages/click/_winconsole.py new file mode 100644 index 00000000..bbb080dd --- /dev/null +++ b/venv/Lib/site-packages/click/_winconsole.py @@ -0,0 +1,307 @@ +# -*- coding: utf-8 -*- +# This module is based on the excellent work by Adam Bartoš who +# provided a lot of what went into the implementation here in +# the discussion to issue1602 in the Python bug tracker. +# +# There are some general differences in regards to how this works +# compared to the original patches as we do not need to patch +# the entire interpreter but just work in our little world of +# echo and prmopt. + +import io +import os +import sys +import zlib +import time +import ctypes +import msvcrt +from ._compat import _NonClosingTextIOWrapper, text_type, PY2 +from ctypes import byref, POINTER, c_int, c_char, c_char_p, \ + c_void_p, py_object, c_ssize_t, c_ulong, windll, WINFUNCTYPE +try: + from ctypes import pythonapi + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release +except ImportError: + pythonapi = None +from ctypes.wintypes import LPWSTR, LPCWSTR + + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)( + ('GetCommandLineW', windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE( + POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ('CommandLineToArgvW', windll.shell32)) + + +STDIN_HANDLE = GetStdHandle(-10) +STDOUT_HANDLE = GetStdHandle(-11) +STDERR_HANDLE = GetStdHandle(-12) + + +PyBUF_SIMPLE = 0 +PyBUF_WRITABLE = 1 + +ERROR_SUCCESS = 0 +ERROR_NOT_ENOUGH_MEMORY = 8 +ERROR_OPERATION_ABORTED = 995 + +STDIN_FILENO = 0 +STDOUT_FILENO = 1 +STDERR_FILENO = 2 + +EOF = b'\x1a' +MAX_BYTES_WRITTEN = 32767 + + +class Py_buffer(ctypes.Structure): + _fields_ = [ + ('buf', c_void_p), + ('obj', py_object), + ('len', c_ssize_t), + ('itemsize', c_ssize_t), + ('readonly', c_int), + ('ndim', c_int), + ('format', c_char_p), + ('shape', c_ssize_p), + ('strides', c_ssize_p), + ('suboffsets', c_ssize_p), + ('internal', c_void_p) + ] + + if PY2: + _fields_.insert(-1, ('smalltable', c_ssize_t * 2)) + + +# On PyPy we cannot get buffers so our ability to operate here is +# serverly limited. +if pythonapi is None: + get_buffer = None +else: + def get_buffer(obj, writable=False): + buf = Py_buffer() + flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE + PyObject_GetBuffer(py_object(obj), byref(buf), flags) + try: + buffer_type = c_char * buf.len + return buffer_type.from_address(buf.buf) + finally: + PyBuffer_Release(byref(buf)) + + +class _WindowsConsoleRawIOBase(io.RawIOBase): + + def __init__(self, handle): + self.handle = handle + + def isatty(self): + io.RawIOBase.isatty(self) + return True + + +class _WindowsConsoleReader(_WindowsConsoleRawIOBase): + + def readable(self): + return True + + def readinto(self, b): + bytes_to_be_read = len(b) + if not bytes_to_be_read: + return 0 + elif bytes_to_be_read % 2: + raise ValueError('cannot read odd number of bytes from ' + 'UTF-16-LE encoded console') + + buffer = get_buffer(b, writable=True) + code_units_to_be_read = bytes_to_be_read // 2 + code_units_read = c_ulong() + + rv = ReadConsoleW(self.handle, buffer, code_units_to_be_read, + byref(code_units_read), None) + if GetLastError() == ERROR_OPERATION_ABORTED: + # wait for KeyboardInterrupt + time.sleep(0.1) + if not rv: + raise OSError('Windows error: %s' % GetLastError()) + + if buffer[0] == EOF: + return 0 + return 2 * code_units_read.value + + +class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): + + def writable(self): + return True + + @staticmethod + def _get_error_message(errno): + if errno == ERROR_SUCCESS: + return 'ERROR_SUCCESS' + elif errno == ERROR_NOT_ENOUGH_MEMORY: + return 'ERROR_NOT_ENOUGH_MEMORY' + return 'Windows error %s' % errno + + def write(self, b): + bytes_to_be_written = len(b) + buf = get_buffer(b) + code_units_to_be_written = min(bytes_to_be_written, + MAX_BYTES_WRITTEN) // 2 + code_units_written = c_ulong() + + WriteConsoleW(self.handle, buf, code_units_to_be_written, + byref(code_units_written), None) + bytes_written = 2 * code_units_written.value + + if bytes_written == 0 and bytes_to_be_written > 0: + raise OSError(self._get_error_message(GetLastError())) + return bytes_written + + +class ConsoleStream(object): + + def __init__(self, text_stream, byte_stream): + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self): + return self.buffer.name + + def write(self, x): + if isinstance(x, text_type): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __getattr__(self, name): + return getattr(self._text_stream, name) + + def isatty(self): + return self.buffer.isatty() + + def __repr__(self): + return '' % ( + self.name, + self.encoding, + ) + + +class WindowsChunkedWriter(object): + """ + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()' which we wrap to write in + limited chunks due to a Windows limitation on binary console streams. + """ + def __init__(self, wrapped): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def write(self, text): + total_to_write = len(text) + written = 0 + + while written < total_to_write: + to_write = min(total_to_write - written, MAX_BYTES_WRITTEN) + self.__wrapped.write(text[written:written+to_write]) + written += to_write + + +_wrapped_std_streams = set() + + +def _wrap_std_stream(name): + # Python 2 & Windows 7 and below + if PY2 and sys.getwindowsversion()[:2] <= (6, 1) and name not in _wrapped_std_streams: + setattr(sys, name, WindowsChunkedWriter(getattr(sys, name))) + _wrapped_std_streams.add(name) + + +def _get_text_stdin(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stdout(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stderr(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +if PY2: + def _hash_py_argv(): + return zlib.crc32('\x00'.join(sys.argv[1:])) + + _initial_argv_hash = _hash_py_argv() + + def _get_windows_argv(): + argc = c_int(0) + argv_unicode = CommandLineToArgvW(GetCommandLineW(), byref(argc)) + argv = [argv_unicode[i] for i in range(0, argc.value)] + + if not hasattr(sys, 'frozen'): + argv = argv[1:] + while len(argv) > 0: + arg = argv[0] + if not arg.startswith('-') or arg == '-': + break + argv = argv[1:] + if arg.startswith(('-c', '-m')): + break + + return argv[1:] + + +_stream_factories = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _get_windows_console_stream(f, encoding, errors): + if get_buffer is not None and \ + encoding in ('utf-16-le', None) \ + and errors in ('strict', None) and \ + hasattr(f, 'isatty') and f.isatty(): + func = _stream_factories.get(f.fileno()) + if func is not None: + if not PY2: + f = getattr(f, 'buffer', None) + if f is None: + return None + else: + # If we are on Python 2 we need to set the stream that we + # deal with to binary mode as otherwise the exercise if a + # bit moot. The same problems apply as for + # get_binary_stdin and friends from _compat. + msvcrt.setmode(f.fileno(), os.O_BINARY) + return func(f) diff --git a/venv/Lib/site-packages/click/core.py b/venv/Lib/site-packages/click/core.py new file mode 100644 index 00000000..7a1e3422 --- /dev/null +++ b/venv/Lib/site-packages/click/core.py @@ -0,0 +1,1856 @@ +import errno +import inspect +import os +import sys +from contextlib import contextmanager +from itertools import repeat +from functools import update_wrapper + +from .types import convert_type, IntRange, BOOL +from .utils import PacifyFlushWrapper, make_str, make_default_short_help, \ + echo, get_os_args +from .exceptions import ClickException, UsageError, BadParameter, Abort, \ + MissingParameter, Exit +from .termui import prompt, confirm, style +from .formatting import HelpFormatter, join_options +from .parser import OptionParser, split_opt +from .globals import push_context, pop_context + +from ._compat import PY2, isidentifier, iteritems, string_types +from ._unicodefun import _check_for_unicode_literals, _verify_python3_env + + +_missing = object() + + +SUBCOMMAND_METAVAR = 'COMMAND [ARGS]...' +SUBCOMMANDS_METAVAR = 'COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...' + +DEPRECATED_HELP_NOTICE = ' (DEPRECATED)' +DEPRECATED_INVOKE_NOTICE = 'DeprecationWarning: ' + \ + 'The command %(name)s is deprecated.' + + +def _maybe_show_deprecated_notice(cmd): + if cmd.deprecated: + echo(style(DEPRECATED_INVOKE_NOTICE % {'name': cmd.name}, fg='red'), err=True) + + +def fast_exit(code): + """Exit without garbage collection, this speeds up exit by about 10ms for + things like bash completion. + """ + sys.stdout.flush() + sys.stderr.flush() + os._exit(code) + + +def _bashcomplete(cmd, prog_name, complete_var=None): + """Internal handler for the bash completion support.""" + if complete_var is None: + complete_var = '_%s_COMPLETE' % (prog_name.replace('-', '_')).upper() + complete_instr = os.environ.get(complete_var) + if not complete_instr: + return + + from ._bashcomplete import bashcomplete + if bashcomplete(cmd, prog_name, complete_var, complete_instr): + fast_exit(1) + + +def _check_multicommand(base_command, cmd_name, cmd, register=False): + if not base_command.chain or not isinstance(cmd, MultiCommand): + return + if register: + hint = 'It is not possible to add multi commands as children to ' \ + 'another multi command that is in chain mode' + else: + hint = 'Found a multi command as subcommand to a multi command ' \ + 'that is in chain mode. This is not supported' + raise RuntimeError('%s. Command "%s" is set to chain and "%s" was ' + 'added as subcommand but it in itself is a ' + 'multi command. ("%s" is a %s within a chained ' + '%s named "%s").' % ( + hint, base_command.name, cmd_name, + cmd_name, cmd.__class__.__name__, + base_command.__class__.__name__, + base_command.name)) + + +def batch(iterable, batch_size): + return list(zip(*repeat(iter(iterable), batch_size))) + + +def invoke_param_callback(callback, ctx, param, value): + code = getattr(callback, '__code__', None) + args = getattr(code, 'co_argcount', 3) + + if args < 3: + # This will become a warning in Click 3.0: + from warnings import warn + warn(Warning('Invoked legacy parameter callback "%s". The new ' + 'signature for such callbacks starting with ' + 'click 2.0 is (ctx, param, value).' + % callback), stacklevel=3) + return callback(ctx, value) + return callback(ctx, param, value) + + +@contextmanager +def augment_usage_errors(ctx, param=None): + """Context manager that attaches extra information to exceptions that + fly. + """ + try: + yield + except BadParameter as e: + if e.ctx is None: + e.ctx = ctx + if param is not None and e.param is None: + e.param = param + raise + except UsageError as e: + if e.ctx is None: + e.ctx = ctx + raise + + +def iter_params_for_processing(invocation_order, declaration_order): + """Given a sequence of parameters in the order as should be considered + for processing and an iterable of parameters that exist, this returns + a list in the correct order as they should be processed. + """ + def sort_key(item): + try: + idx = invocation_order.index(item) + except ValueError: + idx = float('inf') + return (not item.is_eager, idx) + + return sorted(declaration_order, key=sort_key) + + +class Context(object): + """The context is a special internal object that holds state relevant + for the script execution at every single level. It's normally invisible + to commands unless they opt-in to getting access to it. + + The context is useful as it can pass internal objects around and can + control special execution features such as reading data from + environment variables. + + A context can be used as context manager in which case it will call + :meth:`close` on teardown. + + .. versionadded:: 2.0 + Added the `resilient_parsing`, `help_option_names`, + `token_normalize_func` parameters. + + .. versionadded:: 3.0 + Added the `allow_extra_args` and `allow_interspersed_args` + parameters. + + .. versionadded:: 4.0 + Added the `color`, `ignore_unknown_options`, and + `max_content_width` parameters. + + :param command: the command class for this context. + :param parent: the parent context. + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it is usually + the name of the script, for commands below it it's + the name of the script. + :param obj: an arbitrary object of user data. + :param auto_envvar_prefix: the prefix to use for automatic environment + variables. If this is `None` then reading + from environment variables is disabled. This + does not affect manually set environment + variables which are always read. + :param default_map: a dictionary (like object) with default values + for parameters. + :param terminal_width: the width of the terminal. The default is + inherit from parent context. If no context + defines the terminal width then auto + detection will be applied. + :param max_content_width: the maximum width for content rendered by + Click (this currently only affects help + pages). This defaults to 80 characters if + not overridden. In other words: even if the + terminal is larger than that, Click will not + format things wider than 80 characters by + default. In addition to that, formatters might + add some safety mapping on the right. + :param resilient_parsing: if this flag is enabled then Click will + parse without any interactivity or callback + invocation. Default values will also be + ignored. This is useful for implementing + things such as completion support. + :param allow_extra_args: if this is set to `True` then extra arguments + at the end will not raise an error and will be + kept on the context. The default is to inherit + from the command. + :param allow_interspersed_args: if this is set to `False` then options + and arguments cannot be mixed. The + default is to inherit from the command. + :param ignore_unknown_options: instructs click to ignore options it does + not know and keeps them for later + processing. + :param help_option_names: optionally a list of strings that define how + the default help parameter is named. The + default is ``['--help']``. + :param token_normalize_func: an optional function that is used to + normalize tokens (options, choices, + etc.). This for instance can be used to + implement case insensitive behavior. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are used in texts that Click prints which is by + default not the case. This for instance would affect + help output. + """ + + def __init__(self, command, parent=None, info_name=None, obj=None, + auto_envvar_prefix=None, default_map=None, + terminal_width=None, max_content_width=None, + resilient_parsing=False, allow_extra_args=None, + allow_interspersed_args=None, + ignore_unknown_options=None, help_option_names=None, + token_normalize_func=None, color=None): + #: the parent context or `None` if none exists. + self.parent = parent + #: the :class:`Command` for this context. + self.command = command + #: the descriptive information name + self.info_name = info_name + #: the parsed parameters except if the value is hidden in which + #: case it's not remembered. + self.params = {} + #: the leftover arguments. + self.args = [] + #: protected arguments. These are arguments that are prepended + #: to `args` when certain parsing scenarios are encountered but + #: must be never propagated to another arguments. This is used + #: to implement nested parsing. + self.protected_args = [] + if obj is None and parent is not None: + obj = parent.obj + #: the user object stored. + self.obj = obj + self._meta = getattr(parent, 'meta', {}) + + #: A dictionary (-like object) with defaults for parameters. + if default_map is None \ + and parent is not None \ + and parent.default_map is not None: + default_map = parent.default_map.get(info_name) + self.default_map = default_map + + #: This flag indicates if a subcommand is going to be executed. A + #: group callback can use this information to figure out if it's + #: being executed directly or because the execution flow passes + #: onwards to a subcommand. By default it's None, but it can be + #: the name of the subcommand to execute. + #: + #: If chaining is enabled this will be set to ``'*'`` in case + #: any commands are executed. It is however not possible to + #: figure out which ones. If you require this knowledge you + #: should use a :func:`resultcallback`. + self.invoked_subcommand = None + + if terminal_width is None and parent is not None: + terminal_width = parent.terminal_width + #: The width of the terminal (None is autodetection). + self.terminal_width = terminal_width + + if max_content_width is None and parent is not None: + max_content_width = parent.max_content_width + #: The maximum width of formatted content (None implies a sensible + #: default which is 80 for most things). + self.max_content_width = max_content_width + + if allow_extra_args is None: + allow_extra_args = command.allow_extra_args + #: Indicates if the context allows extra args or if it should + #: fail on parsing. + #: + #: .. versionadded:: 3.0 + self.allow_extra_args = allow_extra_args + + if allow_interspersed_args is None: + allow_interspersed_args = command.allow_interspersed_args + #: Indicates if the context allows mixing of arguments and + #: options or not. + #: + #: .. versionadded:: 3.0 + self.allow_interspersed_args = allow_interspersed_args + + if ignore_unknown_options is None: + ignore_unknown_options = command.ignore_unknown_options + #: Instructs click to ignore options that a command does not + #: understand and will store it on the context for later + #: processing. This is primarily useful for situations where you + #: want to call into external programs. Generally this pattern is + #: strongly discouraged because it's not possibly to losslessly + #: forward all arguments. + #: + #: .. versionadded:: 4.0 + self.ignore_unknown_options = ignore_unknown_options + + if help_option_names is None: + if parent is not None: + help_option_names = parent.help_option_names + else: + help_option_names = ['--help'] + + #: The names for the help options. + self.help_option_names = help_option_names + + if token_normalize_func is None and parent is not None: + token_normalize_func = parent.token_normalize_func + + #: An optional normalization function for tokens. This is + #: options, choices, commands etc. + self.token_normalize_func = token_normalize_func + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures and default values + #: will be ignored. Useful for completion. + self.resilient_parsing = resilient_parsing + + # If there is no envvar prefix yet, but the parent has one and + # the command on this level has a name, we can expand the envvar + # prefix automatically. + if auto_envvar_prefix is None: + if parent is not None \ + and parent.auto_envvar_prefix is not None and \ + self.info_name is not None: + auto_envvar_prefix = '%s_%s' % (parent.auto_envvar_prefix, + self.info_name.upper()) + else: + auto_envvar_prefix = auto_envvar_prefix.upper() + self.auto_envvar_prefix = auto_envvar_prefix + + if color is None and parent is not None: + color = parent.color + + #: Controls if styling output is wanted or not. + self.color = color + + self._close_callbacks = [] + self._depth = 0 + + def __enter__(self): + self._depth += 1 + push_context(self) + return self + + def __exit__(self, exc_type, exc_value, tb): + self._depth -= 1 + if self._depth == 0: + self.close() + pop_context() + + @contextmanager + def scope(self, cleanup=True): + """This helper method can be used with the context object to promote + it to the current thread local (see :func:`get_current_context`). + The default behavior of this is to invoke the cleanup functions which + can be disabled by setting `cleanup` to `False`. The cleanup + functions are typically used for things such as closing file handles. + + If the cleanup is intended the context object can also be directly + used as a context manager. + + Example usage:: + + with ctx.scope(): + assert get_current_context() is ctx + + This is equivalent:: + + with ctx: + assert get_current_context() is ctx + + .. versionadded:: 5.0 + + :param cleanup: controls if the cleanup functions should be run or + not. The default is to run these functions. In + some situations the context only wants to be + temporarily pushed in which case this can be disabled. + Nested pushes automatically defer the cleanup. + """ + if not cleanup: + self._depth += 1 + try: + with self as rv: + yield rv + finally: + if not cleanup: + self._depth -= 1 + + @property + def meta(self): + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utilities can store some + state here if they need to. It is however the responsibility of + that code to manage this dictionary well. + + The keys are supposed to be unique dotted strings. For instance + module paths are a good choice for it. What is stored in there is + irrelevant for the operation of click. However what is important is + that code that places data here adheres to the general semantics of + the system. + + Example usage:: + + LANG_KEY = __name__ + '.lang' + + def set_language(value): + ctx = get_current_context() + ctx.meta[LANG_KEY] = value + + def get_language(): + return get_current_context().meta.get(LANG_KEY, 'en_US') + + .. versionadded:: 5.0 + """ + return self._meta + + def make_formatter(self): + """Creates the formatter for the help and usage output.""" + return HelpFormatter(width=self.terminal_width, + max_width=self.max_content_width) + + def call_on_close(self, f): + """This decorator remembers a function as callback that should be + executed when the context tears down. This is most useful to bind + resource handling to the script execution. For instance, file objects + opened by the :class:`File` type will register their close callbacks + here. + + :param f: the function to execute on teardown. + """ + self._close_callbacks.append(f) + return f + + def close(self): + """Invokes all close callbacks.""" + for cb in self._close_callbacks: + cb() + self._close_callbacks = [] + + @property + def command_path(self): + """The computed command path. This is used for the ``usage`` + information on the help page. It's automatically created by + combining the info names of the chain of contexts to the root. + """ + rv = '' + if self.info_name is not None: + rv = self.info_name + if self.parent is not None: + rv = self.parent.command_path + ' ' + rv + return rv.lstrip() + + def find_root(self): + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type): + """Finds the closest object of a given type.""" + node = self + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + node = node.parent + + def ensure_object(self, object_type): + """Like :meth:`find_object` but sets the innermost object to a + new instance of `object_type` if it does not exist. + """ + rv = self.find_object(object_type) + if rv is None: + self.obj = rv = object_type() + return rv + + def lookup_default(self, name): + """Looks up the default for a parameter name. This by default + looks into the :attr:`default_map` if available. + """ + if self.default_map is not None: + rv = self.default_map.get(name) + if callable(rv): + rv = rv() + return rv + + def fail(self, message): + """Aborts the execution of the program with a specific error + message. + + :param message: the error message to fail with. + """ + raise UsageError(message, self) + + def abort(self): + """Aborts the script.""" + raise Abort() + + def exit(self, code=0): + """Exits the application with a given exit code.""" + raise Exit(code) + + def get_usage(self): + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self): + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def invoke(*args, **kwargs): + """Invokes a command callback in exactly the way it expects. There + are two ways to invoke this method: + + 1. the first argument can be a callback and all other arguments and + keyword arguments are forwarded directly to the function. + 2. the first argument is a click command object. In that case all + arguments are forwarded as well but proper click parameters + (options and click arguments) must be keyword arguments and Click + will fill in defaults. + + Note that before Click 3.2 keyword arguments were not properly filled + in against the intention of this code and no context was created. For + more information about this change and why it was done in a bugfix + release see :ref:`upgrade-to-3.2`. + """ + self, callback = args[:2] + ctx = self + + # It's also possible to invoke another command which might or + # might not have a callback. In that case we also fill + # in defaults and make a new context for this command. + if isinstance(callback, Command): + other_cmd = callback + callback = other_cmd.callback + ctx = Context(other_cmd, info_name=other_cmd.name, parent=self) + if callback is None: + raise TypeError('The given command does not have a ' + 'callback that can be invoked.') + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.get_default(ctx) + + args = args[2:] + with augment_usage_errors(self): + with ctx: + return callback(*args, **kwargs) + + def forward(*args, **kwargs): + """Similar to :meth:`invoke` but fills in default keyword + arguments from the current context if the other command expects + it. This cannot invoke callbacks directly, only other commands. + """ + self, cmd = args[:2] + + # It's also possible to invoke another command which might or + # might not have a callback. + if not isinstance(cmd, Command): + raise TypeError('Callback is not a command.') + + for param in self.params: + if param not in kwargs: + kwargs[param] = self.params[param] + + return self.invoke(cmd, **kwargs) + + +class BaseCommand(object): + """The base command implements the minimal API contract of commands. + Most code will never use this as it does not implement a lot of useful + functionality but it can act as the direct subclass of alternative + parsing methods that do not depend on the Click parser. + + For instance, this can be used to bridge Click and other systems like + argparse or docopt. + + Because base commands do not implement a lot of the API that other + parts of Click take for granted, they are not supported for all + operations. For instance, they cannot be used with the decorators + usually and they have no built-in callback system. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + """ + #: the default for the :attr:`Context.allow_extra_args` flag. + allow_extra_args = False + #: the default for the :attr:`Context.allow_interspersed_args` flag. + allow_interspersed_args = True + #: the default for the :attr:`Context.ignore_unknown_options` flag. + ignore_unknown_options = False + + def __init__(self, name, context_settings=None): + #: the name the command thinks it has. Upon registering a command + #: on a :class:`Group` the group will default the command name + #: with this information. You should instead use the + #: :class:`Context`\'s :attr:`~Context.info_name` attribute. + self.name = name + if context_settings is None: + context_settings = {} + #: an optional dictionary with defaults passed to the context. + self.context_settings = context_settings + + def get_usage(self, ctx): + raise NotImplementedError('Base commands cannot get usage') + + def get_help(self, ctx): + raise NotImplementedError('Base commands cannot get help') + + def make_context(self, info_name, args, parent=None, **extra): + """This function when given an info name and arguments will kick + off the parsing and create a new :class:`Context`. It does not + invoke the actual command callback though. + + :param info_name: the info name for this invokation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it's usually + the name of the script, for commands below it it's + the name of the script. + :param args: the arguments to parse as list of strings. + :param parent: the parent context if available. + :param extra: extra keyword arguments forwarded to the context + constructor. + """ + for key, value in iteritems(self.context_settings): + if key not in extra: + extra[key] = value + ctx = Context(self, info_name=info_name, parent=parent, **extra) + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx, args): + """Given a context and a list of arguments this creates the parser + and parses the arguments, then modifies the context as necessary. + This is automatically invoked by :meth:`make_context`. + """ + raise NotImplementedError('Base commands do not know how to parse ' + 'arguments.') + + def invoke(self, ctx): + """Given a context, this invokes the command. The default + implementation is raising a not implemented error. + """ + raise NotImplementedError('Base commands are not invokable by default') + + def main(self, args=None, prog_name=None, complete_var=None, + standalone_mode=True, **extra): + """This is the way to invoke a script with all the bells and + whistles as a command line application. This will always terminate + the application after a call. If this is not wanted, ``SystemExit`` + needs to be caught. + + This method is also available by directly calling the instance of + a :class:`Command`. + + .. versionadded:: 3.0 + Added the `standalone_mode` flag to control the standalone mode. + + :param args: the arguments that should be used for parsing. If not + provided, ``sys.argv[1:]`` is used. + :param prog_name: the program name that should be used. By default + the program name is constructed by taking the file + name from ``sys.argv[0]``. + :param complete_var: the environment variable that controls the + bash completion support. The default is + ``"__COMPLETE"`` with prog_name in + uppercase. + :param standalone_mode: the default behavior is to invoke the script + in standalone mode. Click will then + handle exceptions and convert them into + error messages and the function will never + return but shut down the interpreter. If + this is set to `False` they will be + propagated to the caller and the return + value of this function is the return value + of :meth:`invoke`. + :param extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + """ + # If we are in Python 3, we will verify that the environment is + # sane at this point or reject further execution to avoid a + # broken script. + if not PY2: + _verify_python3_env() + else: + _check_for_unicode_literals() + + if args is None: + args = get_os_args() + else: + args = list(args) + + if prog_name is None: + prog_name = make_str(os.path.basename( + sys.argv and sys.argv[0] or __file__)) + + # Hook for the Bash completion. This only activates if the Bash + # completion is actually enabled, otherwise this is quite a fast + # noop. + _bashcomplete(self, prog_name, complete_var) + + try: + try: + with self.make_context(prog_name, args, **extra) as ctx: + rv = self.invoke(ctx) + if not standalone_mode: + return rv + # it's not safe to `ctx.exit(rv)` here! + # note that `rv` may actually contain data like "1" which + # has obvious effects + # more subtle case: `rv=[None, None]` can come out of + # chained commands which all returned `None` -- so it's not + # even always obvious that `rv` indicates success/failure + # by its truthiness/falsiness + ctx.exit() + except (EOFError, KeyboardInterrupt): + echo(file=sys.stderr) + raise Abort() + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except IOError as e: + if e.errno == errno.EPIPE: + sys.stdout = PacifyFlushWrapper(sys.stdout) + sys.stderr = PacifyFlushWrapper(sys.stderr) + sys.exit(1) + else: + raise + except Exit as e: + if standalone_mode: + sys.exit(e.exit_code) + else: + # in non-standalone mode, return the exit code + # note that this is only reached if `self.invoke` above raises + # an Exit explicitly -- thus bypassing the check there which + # would return its result + # the results of non-standalone execution may therefore be + # somewhat ambiguous: if there are codepaths which lead to + # `ctx.exit(1)` and to `return 1`, the caller won't be able to + # tell the difference between the two + return e.exit_code + except Abort: + if not standalone_mode: + raise + echo('Aborted!', file=sys.stderr) + sys.exit(1) + + def __call__(self, *args, **kwargs): + """Alias for :meth:`main`.""" + return self.main(*args, **kwargs) + + +class Command(BaseCommand): + """Commands are the basic building block of command line interfaces in + Click. A basic command handles command line parsing and might dispatch + more parsing to commands nested below it. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + :param callback: the callback to invoke. This is optional. + :param params: the parameters to register with this command. This can + be either :class:`Option` or :class:`Argument` objects. + :param help: the help string to use for this command. + :param epilog: like the help string but it's printed at the end of the + help page after everything else. + :param short_help: the short help to use for this command. This is + shown on the command listing of the parent command. + :param add_help_option: by default each command registers a ``--help`` + option. This can be disabled by this parameter. + :param hidden: hide this command from help outputs. + + :param deprecated: issues a message indicating that + the command is deprecated. + """ + + def __init__(self, name, context_settings=None, callback=None, + params=None, help=None, epilog=None, short_help=None, + options_metavar='[OPTIONS]', add_help_option=True, + hidden=False, deprecated=False): + BaseCommand.__init__(self, name, context_settings) + #: the callback to execute when the command fires. This might be + #: `None` in which case nothing happens. + self.callback = callback + #: the list of parameters for this command in the order they + #: should show up in the help page and execute. Eager parameters + #: will automatically be handled before non eager ones. + self.params = params or [] + # if a form feed (page break) is found in the help text, truncate help + # text to the content preceding the first form feed + if help and '\f' in help: + help = help.split('\f', 1)[0] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + self.short_help = short_help + self.add_help_option = add_help_option + self.hidden = hidden + self.deprecated = deprecated + + def get_usage(self, ctx): + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip('\n') + + def get_params(self, ctx): + rv = self.params + help_option = self.get_help_option(ctx) + if help_option is not None: + rv = rv + [help_option] + return rv + + def format_usage(self, ctx, formatter): + """Writes the usage line into the formatter.""" + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, ' '.join(pieces)) + + def collect_usage_pieces(self, ctx): + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + return rv + + def get_help_option_names(self, ctx): + """Returns the names for the help option.""" + all_names = set(ctx.help_option_names) + for param in self.params: + all_names.difference_update(param.opts) + all_names.difference_update(param.secondary_opts) + return all_names + + def get_help_option(self, ctx): + """Returns the help option object.""" + help_options = self.get_help_option_names(ctx) + if not help_options or not self.add_help_option: + return + + def show_help(ctx, param, value): + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + return Option(help_options, is_flag=True, + is_eager=True, expose_value=False, + callback=show_help, + help='Show this message and exit.') + + def make_parser(self, ctx): + """Creates the underlying option parser for this command.""" + parser = OptionParser(ctx) + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx): + """Formats the help into a string and returns it. This creates a + formatter and will call into the following formatting methods: + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip('\n') + + def get_short_help_str(self, limit=45): + """Gets short help for the command or makes it by shortening the long help string.""" + return self.short_help or self.help and make_default_short_help(self.help, limit) or '' + + def format_help(self, ctx, formatter): + """Writes the help into the formatter if it exists. + + This calls into the following methods: + + - :meth:`format_usage` + - :meth:`format_help_text` + - :meth:`format_options` + - :meth:`format_epilog` + """ + self.format_usage(ctx, formatter) + self.format_help_text(ctx, formatter) + self.format_options(ctx, formatter) + self.format_epilog(ctx, formatter) + + def format_help_text(self, ctx, formatter): + """Writes the help text to the formatter if it exists.""" + if self.help: + formatter.write_paragraph() + with formatter.indentation(): + help_text = self.help + if self.deprecated: + help_text += DEPRECATED_HELP_NOTICE + formatter.write_text(help_text) + elif self.deprecated: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(DEPRECATED_HELP_NOTICE) + + def format_options(self, ctx, formatter): + """Writes all the options into the formatter if they exist.""" + opts = [] + for param in self.get_params(ctx): + rv = param.get_help_record(ctx) + if rv is not None: + opts.append(rv) + + if opts: + with formatter.section('Options'): + formatter.write_dl(opts) + + def format_epilog(self, ctx, formatter): + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(self.epilog) + + def parse_args(self, ctx, args): + parser = self.make_parser(ctx) + opts, args, param_order = parser.parse_args(args=args) + + for param in iter_params_for_processing( + param_order, self.get_params(ctx)): + value, args = param.handle_parse_result(ctx, opts, args) + + if args and not ctx.allow_extra_args and not ctx.resilient_parsing: + ctx.fail('Got unexpected extra argument%s (%s)' + % (len(args) != 1 and 's' or '', + ' '.join(map(make_str, args)))) + + ctx.args = args + return args + + def invoke(self, ctx): + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + _maybe_show_deprecated_notice(self) + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + +class MultiCommand(Command): + """A multi command is the basic implementation of a command that + dispatches to subcommands. The most common version is the + :class:`Group`. + + :param invoke_without_command: this controls how the multi command itself + is invoked. By default it's only invoked + if a subcommand is provided. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is enabled by default if + `invoke_without_command` is disabled or disabled + if it's enabled. If enabled this will add + ``--help`` as argument if no arguments are + passed. + :param subcommand_metavar: the string that is used in the documentation + to indicate the subcommand place. + :param chain: if this is set to `True` chaining of multiple subcommands + is enabled. This restricts the form of commands in that + they cannot have optional arguments but it allows + multiple commands to be chained together. + :param result_callback: the result callback to attach to this multi + command. + """ + allow_extra_args = True + allow_interspersed_args = False + + def __init__(self, name=None, invoke_without_command=False, + no_args_is_help=None, subcommand_metavar=None, + chain=False, result_callback=None, **attrs): + Command.__init__(self, name, **attrs) + if no_args_is_help is None: + no_args_is_help = not invoke_without_command + self.no_args_is_help = no_args_is_help + self.invoke_without_command = invoke_without_command + if subcommand_metavar is None: + if chain: + subcommand_metavar = SUBCOMMANDS_METAVAR + else: + subcommand_metavar = SUBCOMMAND_METAVAR + self.subcommand_metavar = subcommand_metavar + self.chain = chain + #: The result callback that is stored. This can be set or + #: overridden with the :func:`resultcallback` decorator. + self.result_callback = result_callback + + if self.chain: + for param in self.params: + if isinstance(param, Argument) and not param.required: + raise RuntimeError('Multi commands in chain mode cannot ' + 'have optional arguments.') + + def collect_usage_pieces(self, ctx): + rv = Command.collect_usage_pieces(self, ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx, formatter): + Command.format_options(self, ctx, formatter) + self.format_commands(ctx, formatter) + + def resultcallback(self, replace=False): + """Adds a result callback to the chain command. By default if a + result callback is already registered this will chain them but + this can be disabled with the `replace` parameter. The result + callback is invoked with the return value of the subcommand + (or the list of return values from all subcommands if chaining + is enabled) as well as the parameters as they would be passed + to the main callback. + + Example:: + + @click.group() + @click.option('-i', '--input', default=23) + def cli(input): + return 42 + + @cli.resultcallback() + def process_result(result, input): + return result + input + + .. versionadded:: 3.0 + + :param replace: if set to `True` an already existing result + callback will be removed. + """ + def decorator(f): + old_callback = self.result_callback + if old_callback is None or replace: + self.result_callback = f + return f + def function(__value, *args, **kwargs): + return f(old_callback(__value, *args, **kwargs), + *args, **kwargs) + self.result_callback = rv = update_wrapper(function, f) + return rv + return decorator + + def format_commands(self, ctx, formatter): + """Extra format methods for multi methods that adds all the commands + after the options. + """ + commands = [] + for subcommand in self.list_commands(ctx): + cmd = self.get_command(ctx, subcommand) + # What is this, the tool lied about a command. Ignore it + if cmd is None: + continue + if cmd.hidden: + continue + + commands.append((subcommand, cmd)) + + # allow for 3 times the default spacing + if len(commands): + limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) + + rows = [] + for subcommand, cmd in commands: + help = cmd.get_short_help_str(limit) + rows.append((subcommand, help)) + + if rows: + with formatter.section('Commands'): + formatter.write_dl(rows) + + def parse_args(self, ctx, args): + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + rest = Command.parse_args(self, ctx, args) + if self.chain: + ctx.protected_args = rest + ctx.args = [] + elif rest: + ctx.protected_args, ctx.args = rest[:1], rest[1:] + + return ctx.args + + def invoke(self, ctx): + def _process_result(value): + if self.result_callback is not None: + value = ctx.invoke(self.result_callback, value, + **ctx.params) + return value + + if not ctx.protected_args: + # If we are invoked without command the chain flag controls + # how this happens. If we are not in chain mode, the return + # value here is the return value of the command. + # If however we are in chain mode, the return value is the + # return value of the result processor invoked with an empty + # list (which means that no subcommand actually was executed). + if self.invoke_without_command: + if not self.chain: + return Command.invoke(self, ctx) + with ctx: + Command.invoke(self, ctx) + return _process_result([]) + ctx.fail('Missing command.') + + # Fetch args back out + args = ctx.protected_args + ctx.args + ctx.args = [] + ctx.protected_args = [] + + # If we're not in chain mode, we only allow the invocation of a + # single command but we also inform the current context about the + # name of the command to invoke. + if not self.chain: + # Make sure the context is entered so we do not clean up + # resources until the result processor has worked. + with ctx: + cmd_name, cmd, args = self.resolve_command(ctx, args) + ctx.invoked_subcommand = cmd_name + Command.invoke(self, ctx) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) + with sub_ctx: + return _process_result(sub_ctx.command.invoke(sub_ctx)) + + # In chain mode we create the contexts step by step, but after the + # base command has been invoked. Because at that point we do not + # know the subcommands yet, the invoked subcommand attribute is + # set to ``*`` to inform the command that subcommands are executed + # but nothing else. + with ctx: + ctx.invoked_subcommand = args and '*' or None + Command.invoke(self, ctx) + + # Otherwise we make every single context and invoke them in a + # chain. In that case the return value to the result processor + # is the list of all invoked subcommand's results. + contexts = [] + while args: + cmd_name, cmd, args = self.resolve_command(ctx, args) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False) + contexts.append(sub_ctx) + args, sub_ctx.args = sub_ctx.args, [] + + rv = [] + for sub_ctx in contexts: + with sub_ctx: + rv.append(sub_ctx.command.invoke(sub_ctx)) + return _process_result(rv) + + def resolve_command(self, ctx, args): + cmd_name = make_str(args[0]) + original_cmd_name = cmd_name + + # Get the command + cmd = self.get_command(ctx, cmd_name) + + # If we can't find the command but there is a normalization + # function available, we try with that one. + if cmd is None and ctx.token_normalize_func is not None: + cmd_name = ctx.token_normalize_func(cmd_name) + cmd = self.get_command(ctx, cmd_name) + + # If we don't find the command we want to show an error message + # to the user that it was not provided. However, there is + # something else we should do: if the first argument looks like + # an option we want to kick off parsing again for arguments to + # resolve things like --help which now should go to the main + # place. + if cmd is None and not ctx.resilient_parsing: + if split_opt(cmd_name)[0]: + self.parse_args(ctx, ctx.args) + ctx.fail('No such command "%s".' % original_cmd_name) + + return cmd_name, cmd, args[1:] + + def get_command(self, ctx, cmd_name): + """Given a context and a command name, this returns a + :class:`Command` object if it exists or returns `None`. + """ + raise NotImplementedError() + + def list_commands(self, ctx): + """Returns a list of subcommand names in the order they should + appear. + """ + return [] + + +class Group(MultiCommand): + """A group allows a command to have subcommands attached. This is the + most common way to implement nesting in Click. + + :param commands: a dictionary of commands. + """ + + def __init__(self, name=None, commands=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: the registered subcommands by their exported names. + self.commands = commands or {} + + def add_command(self, cmd, name=None): + """Registers another :class:`Command` with this group. If the name + is not provided, the name of the command is used. + """ + name = name or cmd.name + if name is None: + raise TypeError('Command has no name.') + _check_multicommand(self, name, cmd, register=True) + self.commands[name] = cmd + + def command(self, *args, **kwargs): + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + def decorator(f): + cmd = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + return decorator + + def group(self, *args, **kwargs): + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + def decorator(f): + cmd = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + return decorator + + def get_command(self, ctx, cmd_name): + return self.commands.get(cmd_name) + + def list_commands(self, ctx): + return sorted(self.commands) + + +class CommandCollection(MultiCommand): + """A command collection is a multi command that merges multiple multi + commands together into one. This is a straightforward implementation + that accepts a list of different multi commands as sources and + provides all the commands for each of them. + """ + + def __init__(self, name=None, sources=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: The list of registered multi commands. + self.sources = sources or [] + + def add_source(self, multi_cmd): + """Adds a new multi command to the chain dispatcher.""" + self.sources.append(multi_cmd) + + def get_command(self, ctx, cmd_name): + for source in self.sources: + rv = source.get_command(ctx, cmd_name) + if rv is not None: + if self.chain: + _check_multicommand(self, cmd_name, rv) + return rv + + def list_commands(self, ctx): + rv = set() + for source in self.sources: + rv.update(source.list_commands(ctx)) + return sorted(rv) + + +class Parameter(object): + r"""A parameter to a command comes in two versions: they are either + :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently + not supported by design as some of the internals for parsing are + intentionally not finalized. + + Some settings are supported by both options and arguments. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. In Click 2.0, the old callback format will still work, + but it will raise a warning to give you change to migrate the + code easier. + + :param param_decls: the parameter declarations for this option or + argument. This is a list of flags or argument + names. + :param type: the type that should be used. Either a :class:`ParamType` + or a Python type. The later is converted into the former + automatically if supported. + :param required: controls if this is optional or not. + :param default: the default value if omitted. This can also be a callable, + in which case it's invoked when the default is needed + without any arguments. + :param callback: a callback that should be executed after the parameter + was matched. This is called as ``fn(ctx, param, + value)`` and needs to return the value. Before Click + 2.0, the signature was ``(ctx, value)``. + :param nargs: the number of arguments to match. If not ``1`` the return + value is a tuple instead of single value. The default for + nargs is ``1`` (except if the type is a tuple, then it's + the arity of the tuple). + :param metavar: how the value is represented in the help page. + :param expose_value: if this is `True` then the value is passed onwards + to the command callback and stored on the context, + otherwise it's skipped. + :param is_eager: eager values are processed before non eager ones. This + should not be set for arguments or it will inverse the + order of processing. + :param envvar: a string or list of strings that are environment variables + that should be checked. + """ + param_type_name = 'parameter' + + def __init__(self, param_decls=None, type=None, required=False, + default=None, callback=None, nargs=None, metavar=None, + expose_value=True, is_eager=False, envvar=None, + autocompletion=None): + self.name, self.opts, self.secondary_opts = \ + self._parse_decls(param_decls or (), expose_value) + + self.type = convert_type(type, default) + + # Default nargs to what the type tells us if we have that + # information available. + if nargs is None: + if self.type.is_composite: + nargs = self.type.arity + else: + nargs = 1 + + self.required = required + self.callback = callback + self.nargs = nargs + self.multiple = False + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + self.autocompletion = autocompletion + + @property + def human_readable_name(self): + """Returns the human readable name of this parameter. This is the + same as the name for options, but the metavar for arguments. + """ + return self.name + + def make_metavar(self): + if self.metavar is not None: + return self.metavar + metavar = self.type.get_metavar(self) + if metavar is None: + metavar = self.type.name.upper() + if self.nargs != 1: + metavar += '...' + return metavar + + def get_default(self, ctx): + """Given a context variable this calculates the default value.""" + # Otherwise go with the regular default. + if callable(self.default): + rv = self.default() + else: + rv = self.default + return self.type_cast_value(ctx, rv) + + def add_to_parser(self, parser, ctx): + pass + + def consume_value(self, ctx, opts): + value = opts.get(self.name) + if value is None: + value = self.value_from_envvar(ctx) + if value is None: + value = ctx.lookup_default(self.name) + return value + + def type_cast_value(self, ctx, value): + """Given a value this runs it properly through the type system. + This automatically handles things like `nargs` and `multiple` as + well as composite types. + """ + if self.type.is_composite: + if self.nargs <= 1: + raise TypeError('Attempted to invoke composite type ' + 'but nargs has been set to %s. This is ' + 'not supported; nargs needs to be set to ' + 'a fixed value > 1.' % self.nargs) + if self.multiple: + return tuple(self.type(x or (), self, ctx) for x in value or ()) + return self.type(value or (), self, ctx) + + def _convert(value, level): + if level == 0: + return self.type(value, self, ctx) + return tuple(_convert(x, level - 1) for x in value or ()) + return _convert(value, (self.nargs != 1) + bool(self.multiple)) + + def process_value(self, ctx, value): + """Given a value and context this runs the logic to convert the + value as necessary. + """ + # If the value we were given is None we do nothing. This way + # code that calls this can easily figure out if something was + # not provided. Otherwise it would be converted into an empty + # tuple for multiple invocations which is inconvenient. + if value is not None: + return self.type_cast_value(ctx, value) + + def value_is_missing(self, value): + if value is None: + return True + if (self.nargs != 1 or self.multiple) and value == (): + return True + return False + + def full_process_value(self, ctx, value): + value = self.process_value(ctx, value) + + if value is None and not ctx.resilient_parsing: + value = self.get_default(ctx) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + return value + + def resolve_envvar_value(self, ctx): + if self.envvar is None: + return + if isinstance(self.envvar, (tuple, list)): + for envvar in self.envvar: + rv = os.environ.get(envvar) + if rv is not None: + return rv + else: + return os.environ.get(self.envvar) + + def value_from_envvar(self, ctx): + rv = self.resolve_envvar_value(ctx) + if rv is not None and self.nargs != 1: + rv = self.type.split_envvar_value(rv) + return rv + + def handle_parse_result(self, ctx, opts, args): + with augment_usage_errors(ctx, param=self): + value = self.consume_value(ctx, opts) + try: + value = self.full_process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + value = None + if self.callback is not None: + try: + value = invoke_param_callback( + self.callback, ctx, self, value) + except Exception: + if not ctx.resilient_parsing: + raise + + if self.expose_value: + ctx.params[self.name] = value + return value, args + + def get_help_record(self, ctx): + pass + + def get_usage_pieces(self, ctx): + return [] + + def get_error_hint(self, ctx): + """Get a stringified version of the param for use in error messages to + indicate which param caused the error. + """ + hint_list = self.opts or [self.human_readable_name] + return ' / '.join('"%s"' % x for x in hint_list) + + +class Option(Parameter): + """Options are usually optional values on the command line and + have some extra features that arguments don't have. + + All other parameters are passed onwards to the parameter constructor. + + :param show_default: controls if the default value should be shown on the + help page. Normally, defaults are not shown. If this + value is a string, it shows the string instead of the + value. This is particularly useful for dynamic options. + :param show_envvar: controls if an environment variable should be shown on + the help page. Normally, environment variables + are not shown. + :param prompt: if set to `True` or a non empty string then the user will be + prompted for input. If set to `True` the prompt will be the + option name capitalized. + :param confirmation_prompt: if set then the value will need to be confirmed + if it was prompted for. + :param hide_input: if this is `True` then the input on the prompt will be + hidden from the user. This is useful for password + input. + :param is_flag: forces this option to act as a flag. The default is + auto detection. + :param flag_value: which value should be used for this flag if it's + enabled. This is set to a boolean automatically if + the option string contains a slash to mark two options. + :param multiple: if this is set to `True` then the argument is accepted + multiple times and recorded. This is similar to ``nargs`` + in how it works but supports arbitrary number of + arguments. + :param count: this flag makes an option increment an integer. + :param allow_from_autoenv: if this is enabled then the value of this + parameter will be pulled from an environment + variable in case a prefix is defined on the + context. + :param help: the help string. + :param hidden: hide this option from help outputs. + """ + param_type_name = 'option' + + def __init__(self, param_decls=None, show_default=False, + prompt=False, confirmation_prompt=False, + hide_input=False, is_flag=None, flag_value=None, + multiple=False, count=False, allow_from_autoenv=True, + type=None, help=None, hidden=False, show_choices=True, + show_envvar=False, **attrs): + default_is_missing = attrs.get('default', _missing) is _missing + Parameter.__init__(self, param_decls, type=type, **attrs) + + if prompt is True: + prompt_text = self.name.replace('_', ' ').capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = prompt + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.hide_input = hide_input + self.hidden = hidden + + # Flags + if is_flag is None: + if flag_value is not None: + is_flag = True + else: + is_flag = bool(self.secondary_opts) + if is_flag and default_is_missing: + self.default = False + if flag_value is None: + flag_value = not self.default + self.is_flag = is_flag + self.flag_value = flag_value + if self.is_flag and isinstance(self.flag_value, bool) \ + and type is None: + self.type = BOOL + self.is_bool_flag = True + else: + self.is_bool_flag = False + + # Counting + self.count = count + if count: + if type is None: + self.type = IntRange(min=0) + if default_is_missing: + self.default = 0 + + self.multiple = multiple + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + self.show_choices = show_choices + self.show_envvar = show_envvar + + # Sanity check for stuff we don't support + if __debug__: + if self.nargs < 0: + raise TypeError('Options cannot have nargs < 0') + if self.prompt and self.is_flag and not self.is_bool_flag: + raise TypeError('Cannot prompt for flags that are not bools.') + if not self.is_bool_flag and self.secondary_opts: + raise TypeError('Got secondary option for non boolean flag.') + if self.is_bool_flag and self.hide_input \ + and self.prompt is not None: + raise TypeError('Hidden input does not work with boolean ' + 'flag prompts.') + if self.count: + if self.multiple: + raise TypeError('Options cannot be multiple and count ' + 'at the same time.') + elif self.is_flag: + raise TypeError('Options cannot be count and flags at ' + 'the same time.') + + def _parse_decls(self, decls, expose_value): + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if isidentifier(decl): + if name is not None: + raise TypeError('Name defined twice') + name = decl + else: + split_char = decl[:1] == '/' and ';' or '/' + if split_char in decl: + first, second = decl.split(split_char, 1) + first = first.rstrip() + if first: + possible_names.append(split_opt(first)) + opts.append(first) + second = second.lstrip() + if second: + secondary_opts.append(second.lstrip()) + else: + possible_names.append(split_opt(decl)) + opts.append(decl) + + if name is None and possible_names: + possible_names.sort(key=lambda x: -len(x[0])) # group long options first + name = possible_names[0][1].replace('-', '_').lower() + if not isidentifier(name): + name = None + + if name is None: + if not expose_value: + return None, opts, secondary_opts + raise TypeError('Could not determine name for option') + + if not opts and not secondary_opts: + raise TypeError('No options defined but a name was passed (%s). ' + 'Did you mean to declare an argument instead ' + 'of an option?' % name) + + return name, opts, secondary_opts + + def add_to_parser(self, parser, ctx): + kwargs = { + 'dest': self.name, + 'nargs': self.nargs, + 'obj': self, + } + + if self.multiple: + action = 'append' + elif self.count: + action = 'count' + else: + action = 'store' + + if self.is_flag: + kwargs.pop('nargs', None) + if self.is_bool_flag and self.secondary_opts: + parser.add_option(self.opts, action=action + '_const', + const=True, **kwargs) + parser.add_option(self.secondary_opts, action=action + + '_const', const=False, **kwargs) + else: + parser.add_option(self.opts, action=action + '_const', + const=self.flag_value, + **kwargs) + else: + kwargs['action'] = action + parser.add_option(self.opts, **kwargs) + + def get_help_record(self, ctx): + if self.hidden: + return + any_prefix_is_slash = [] + + def _write_opts(opts): + rv, any_slashes = join_options(opts) + if any_slashes: + any_prefix_is_slash[:] = [True] + if not self.is_flag and not self.count: + rv += ' ' + self.make_metavar() + return rv + + rv = [_write_opts(self.opts)] + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or '' + extra = [] + if self.show_envvar: + envvar = self.envvar + if envvar is None: + if self.allow_from_autoenv and \ + ctx.auto_envvar_prefix is not None: + envvar = '%s_%s' % (ctx.auto_envvar_prefix, self.name.upper()) + if envvar is not None: + extra.append('env var: %s' % ( + ', '.join('%s' % d for d in envvar) + if isinstance(envvar, (list, tuple)) + else envvar, )) + if self.default is not None and self.show_default: + if isinstance(self.show_default, string_types): + default_string = '({})'.format(self.show_default) + elif isinstance(self.default, (list, tuple)): + default_string = ', '.join('%s' % d for d in self.default) + elif inspect.isfunction(self.default): + default_string = "(dynamic)" + else: + default_string = self.default + extra.append('default: {}'.format(default_string)) + + if self.required: + extra.append('required') + if extra: + help = '%s[%s]' % (help and help + ' ' or '', '; '.join(extra)) + + return ((any_prefix_is_slash and '; ' or ' / ').join(rv), help) + + def get_default(self, ctx): + # If we're a non boolean flag out default is more complex because + # we need to look at all flags in the same group to figure out + # if we're the the default one in which case we return the flag + # value as default. + if self.is_flag and not self.is_bool_flag: + for param in ctx.command.params: + if param.name == self.name and param.default: + return param.flag_value + return None + return Parameter.get_default(self, ctx) + + def prompt_for_value(self, ctx): + """This is an alternative flow that can be activated in the full + value processing if a value does not exist. It will prompt the + user until a valid value exists and then returns the processed + value as result. + """ + # Calculate the default before prompting anything to be stable. + default = self.get_default(ctx) + + # If this is a prompt for a flag we need to handle this + # differently. + if self.is_bool_flag: + return confirm(self.prompt, default) + + return prompt(self.prompt, default=default, type=self.type, + hide_input=self.hide_input, show_choices=self.show_choices, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x)) + + def resolve_envvar_value(self, ctx): + rv = Parameter.resolve_envvar_value(self, ctx) + if rv is not None: + return rv + if self.allow_from_autoenv and \ + ctx.auto_envvar_prefix is not None: + envvar = '%s_%s' % (ctx.auto_envvar_prefix, self.name.upper()) + return os.environ.get(envvar) + + def value_from_envvar(self, ctx): + rv = self.resolve_envvar_value(ctx) + if rv is None: + return None + value_depth = (self.nargs != 1) + bool(self.multiple) + if value_depth > 0 and rv is not None: + rv = self.type.split_envvar_value(rv) + if self.multiple and self.nargs != 1: + rv = batch(rv, self.nargs) + return rv + + def full_process_value(self, ctx, value): + if value is None and self.prompt is not None \ + and not ctx.resilient_parsing: + return self.prompt_for_value(ctx) + return Parameter.full_process_value(self, ctx, value) + + +class Argument(Parameter): + """Arguments are positional parameters to a command. They generally + provide fewer features than options but can have infinite ``nargs`` + and are required by default. + + All parameters are passed onwards to the parameter constructor. + """ + param_type_name = 'argument' + + def __init__(self, param_decls, required=None, **attrs): + if required is None: + if attrs.get('default') is not None: + required = False + else: + required = attrs.get('nargs', 1) > 0 + Parameter.__init__(self, param_decls, required=required, **attrs) + if self.default is not None and self.nargs < 0: + raise TypeError('nargs=-1 in combination with a default value ' + 'is not supported.') + + @property + def human_readable_name(self): + if self.metavar is not None: + return self.metavar + return self.name.upper() + + def make_metavar(self): + if self.metavar is not None: + return self.metavar + var = self.type.get_metavar(self) + if not var: + var = self.name.upper() + if not self.required: + var = '[%s]' % var + if self.nargs != 1: + var += '...' + return var + + def _parse_decls(self, decls, expose_value): + if not decls: + if not expose_value: + return None, [], [] + raise TypeError('Could not determine name for argument') + if len(decls) == 1: + name = arg = decls[0] + name = name.replace('-', '_').lower() + else: + raise TypeError('Arguments take exactly one ' + 'parameter declaration, got %d' % len(decls)) + return name, [arg], [] + + def get_usage_pieces(self, ctx): + return [self.make_metavar()] + + def get_error_hint(self, ctx): + return '"%s"' % self.make_metavar() + + def add_to_parser(self, parser, ctx): + parser.add_argument(dest=self.name, nargs=self.nargs, + obj=self) + + +# Circular dependency between decorators and core +from .decorators import command, group diff --git a/venv/Lib/site-packages/click/decorators.py b/venv/Lib/site-packages/click/decorators.py new file mode 100644 index 00000000..c57c5308 --- /dev/null +++ b/venv/Lib/site-packages/click/decorators.py @@ -0,0 +1,311 @@ +import sys +import inspect + +from functools import update_wrapper + +from ._compat import iteritems +from ._unicodefun import _check_for_unicode_literals +from .utils import echo +from .globals import get_current_context + + +def pass_context(f): + """Marks a callback as wanting to receive the current context + object as first argument. + """ + def new_func(*args, **kwargs): + return f(get_current_context(), *args, **kwargs) + return update_wrapper(new_func, f) + + +def pass_obj(f): + """Similar to :func:`pass_context`, but only pass the object on the + context onwards (:attr:`Context.obj`). This is useful if that object + represents the state of a nested system. + """ + def new_func(*args, **kwargs): + return f(get_current_context().obj, *args, **kwargs) + return update_wrapper(new_func, f) + + +def make_pass_decorator(object_type, ensure=False): + """Given an object type this creates a decorator that will work + similar to :func:`pass_obj` but instead of passing the object of the + current context, it will find the innermost context of type + :func:`object_type`. + + This generates a decorator that works roughly like this:: + + from functools import update_wrapper + + def decorator(f): + @pass_context + def new_func(ctx, *args, **kwargs): + obj = ctx.find_object(object_type) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + :param object_type: the type of the object to pass. + :param ensure: if set to `True`, a new object will be created and + remembered on the context if it's not there yet. + """ + def decorator(f): + def new_func(*args, **kwargs): + ctx = get_current_context() + if ensure: + obj = ctx.ensure_object(object_type) + else: + obj = ctx.find_object(object_type) + if obj is None: + raise RuntimeError('Managed to invoke callback without a ' + 'context object of type %r existing' + % object_type.__name__) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + +def _make_command(f, name, attrs, cls): + if isinstance(f, Command): + raise TypeError('Attempted to convert a callback into a ' + 'command twice.') + try: + params = f.__click_params__ + params.reverse() + del f.__click_params__ + except AttributeError: + params = [] + help = attrs.get('help') + if help is None: + help = inspect.getdoc(f) + if isinstance(help, bytes): + help = help.decode('utf-8') + else: + help = inspect.cleandoc(help) + attrs['help'] = help + _check_for_unicode_literals() + return cls(name=name or f.__name__.lower().replace('_', '-'), + callback=f, params=params, **attrs) + + +def command(name=None, cls=None, **attrs): + r"""Creates a new :class:`Command` and uses the decorated function as + callback. This will also automatically attach all decorated + :func:`option`\s and :func:`argument`\s as parameters to the command. + + The name of the command defaults to the name of the function. If you + want to change that, you can pass the intended name as the first + argument. + + All keyword arguments are forwarded to the underlying command class. + + Once decorated the function turns into a :class:`Command` instance + that can be invoked as a command line utility or be attached to a + command :class:`Group`. + + :param name: the name of the command. This defaults to the function + name with underscores replaced by dashes. + :param cls: the command class to instantiate. This defaults to + :class:`Command`. + """ + if cls is None: + cls = Command + def decorator(f): + cmd = _make_command(f, name, attrs, cls) + cmd.__doc__ = f.__doc__ + return cmd + return decorator + + +def group(name=None, **attrs): + """Creates a new :class:`Group` with a function as callback. This + works otherwise the same as :func:`command` just that the `cls` + parameter is set to :class:`Group`. + """ + attrs.setdefault('cls', Group) + return command(name, **attrs) + + +def _param_memo(f, param): + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, '__click_params__'): + f.__click_params__ = [] + f.__click_params__.append(param) + + +def argument(*param_decls, **attrs): + """Attaches an argument to the command. All positional arguments are + passed as parameter declarations to :class:`Argument`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Argument` instance manually + and attaching it to the :attr:`Command.params` list. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + """ + def decorator(f): + ArgumentClass = attrs.pop('cls', Argument) + _param_memo(f, ArgumentClass(param_decls, **attrs)) + return f + return decorator + + +def option(*param_decls, **attrs): + """Attaches an option to the command. All positional arguments are + passed as parameter declarations to :class:`Option`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Option` instance manually + and attaching it to the :attr:`Command.params` list. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + """ + def decorator(f): + # Issue 926, copy attrs, so pre-defined options can re-use the same cls= + option_attrs = attrs.copy() + + if 'help' in option_attrs: + option_attrs['help'] = inspect.cleandoc(option_attrs['help']) + OptionClass = option_attrs.pop('cls', Option) + _param_memo(f, OptionClass(param_decls, **option_attrs)) + return f + return decorator + + +def confirmation_option(*param_decls, **attrs): + """Shortcut for confirmation prompts that can be ignored by passing + ``--yes`` as parameter. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + def callback(ctx, param, value): + if not value: + ctx.abort() + + @click.command() + @click.option('--yes', is_flag=True, callback=callback, + expose_value=False, prompt='Do you want to continue?') + def dropdb(): + pass + """ + def decorator(f): + def callback(ctx, param, value): + if not value: + ctx.abort() + attrs.setdefault('is_flag', True) + attrs.setdefault('callback', callback) + attrs.setdefault('expose_value', False) + attrs.setdefault('prompt', 'Do you want to continue?') + attrs.setdefault('help', 'Confirm the action without prompting.') + return option(*(param_decls or ('--yes',)), **attrs)(f) + return decorator + + +def password_option(*param_decls, **attrs): + """Shortcut for password prompts. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + @click.command() + @click.option('--password', prompt=True, confirmation_prompt=True, + hide_input=True) + def changeadmin(password): + pass + """ + def decorator(f): + attrs.setdefault('prompt', True) + attrs.setdefault('confirmation_prompt', True) + attrs.setdefault('hide_input', True) + return option(*(param_decls or ('--password',)), **attrs)(f) + return decorator + + +def version_option(version=None, *param_decls, **attrs): + """Adds a ``--version`` option which immediately ends the program + printing out the version number. This is implemented as an eager + option that prints the version and exits the program in the callback. + + :param version: the version number to show. If not provided Click + attempts an auto discovery via setuptools. + :param prog_name: the name of the program (defaults to autodetection) + :param message: custom message to show instead of the default + (``'%(prog)s, version %(version)s'``) + :param others: everything else is forwarded to :func:`option`. + """ + if version is None: + if hasattr(sys, '_getframe'): + module = sys._getframe(1).f_globals.get('__name__') + else: + module = '' + + def decorator(f): + prog_name = attrs.pop('prog_name', None) + message = attrs.pop('message', '%(prog)s, version %(version)s') + + def callback(ctx, param, value): + if not value or ctx.resilient_parsing: + return + prog = prog_name + if prog is None: + prog = ctx.find_root().info_name + ver = version + if ver is None: + try: + import pkg_resources + except ImportError: + pass + else: + for dist in pkg_resources.working_set: + scripts = dist.get_entry_map().get('console_scripts') or {} + for script_name, entry_point in iteritems(scripts): + if entry_point.module_name == module: + ver = dist.version + break + if ver is None: + raise RuntimeError('Could not determine version') + echo(message % { + 'prog': prog, + 'version': ver, + }, color=ctx.color) + ctx.exit() + + attrs.setdefault('is_flag', True) + attrs.setdefault('expose_value', False) + attrs.setdefault('is_eager', True) + attrs.setdefault('help', 'Show the version and exit.') + attrs['callback'] = callback + return option(*(param_decls or ('--version',)), **attrs)(f) + return decorator + + +def help_option(*param_decls, **attrs): + """Adds a ``--help`` option which immediately ends the program + printing out the help page. This is usually unnecessary to add as + this is added by default to all commands unless suppressed. + + Like :func:`version_option`, this is implemented as eager option that + prints in the callback and exits. + + All arguments are forwarded to :func:`option`. + """ + def decorator(f): + def callback(ctx, param, value): + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + attrs.setdefault('is_flag', True) + attrs.setdefault('expose_value', False) + attrs.setdefault('help', 'Show this message and exit.') + attrs.setdefault('is_eager', True) + attrs['callback'] = callback + return option(*(param_decls or ('--help',)), **attrs)(f) + return decorator + + +# Circular dependencies between core and decorators +from .core import Command, Group, Argument, Option diff --git a/venv/Lib/site-packages/click/exceptions.py b/venv/Lib/site-packages/click/exceptions.py new file mode 100644 index 00000000..6fa17658 --- /dev/null +++ b/venv/Lib/site-packages/click/exceptions.py @@ -0,0 +1,235 @@ +from ._compat import PY2, filename_to_ui, get_text_stderr +from .utils import echo + + +def _join_param_hints(param_hint): + if isinstance(param_hint, (tuple, list)): + return ' / '.join('"%s"' % x for x in param_hint) + return param_hint + + +class ClickException(Exception): + """An exception that Click can handle and show to the user.""" + + #: The exit code for this exception + exit_code = 1 + + def __init__(self, message): + ctor_msg = message + if PY2: + if ctor_msg is not None: + ctor_msg = ctor_msg.encode('utf-8') + Exception.__init__(self, ctor_msg) + self.message = message + + def format_message(self): + return self.message + + def __str__(self): + return self.message + + if PY2: + __unicode__ = __str__ + + def __str__(self): + return self.message.encode('utf-8') + + def show(self, file=None): + if file is None: + file = get_text_stderr() + echo('Error: %s' % self.format_message(), file=file) + + +class UsageError(ClickException): + """An internal exception that signals a usage error. This typically + aborts any further handling. + + :param message: the error message to display. + :param ctx: optionally the context that caused this error. Click will + fill in the context automatically in some situations. + """ + exit_code = 2 + + def __init__(self, message, ctx=None): + ClickException.__init__(self, message) + self.ctx = ctx + self.cmd = self.ctx and self.ctx.command or None + + def show(self, file=None): + if file is None: + file = get_text_stderr() + color = None + hint = '' + if (self.cmd is not None and + self.cmd.get_help_option(self.ctx) is not None): + hint = ('Try "%s %s" for help.\n' + % (self.ctx.command_path, self.ctx.help_option_names[0])) + if self.ctx is not None: + color = self.ctx.color + echo(self.ctx.get_usage() + '\n%s' % hint, file=file, color=color) + echo('Error: %s' % self.format_message(), file=file, color=color) + + +class BadParameter(UsageError): + """An exception that formats out a standardized error message for a + bad parameter. This is useful when thrown from a callback or type as + Click will attach contextual information to it (for instance, which + parameter it is). + + .. versionadded:: 2.0 + + :param param: the parameter object that caused this error. This can + be left out, and Click will attach this info itself + if possible. + :param param_hint: a string that shows up as parameter name. This + can be used as alternative to `param` in cases + where custom validation should happen. If it is + a string it's used as such, if it's a list then + each item is quoted and separated. + """ + + def __init__(self, message, ctx=None, param=None, + param_hint=None): + UsageError.__init__(self, message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self): + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) + else: + return 'Invalid value: %s' % self.message + param_hint = _join_param_hints(param_hint) + + return 'Invalid value for %s: %s' % (param_hint, self.message) + + +class MissingParameter(BadParameter): + """Raised if click required an option or argument but it was not + provided when invoking the script. + + .. versionadded:: 4.0 + + :param param_type: a string that indicates the type of the parameter. + The default is to inherit the parameter type from + the given `param`. Valid values are ``'parameter'``, + ``'option'`` or ``'argument'``. + """ + + def __init__(self, message=None, ctx=None, param=None, + param_hint=None, param_type=None): + BadParameter.__init__(self, message, ctx, param, param_hint) + self.param_type = param_type + + def format_message(self): + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) + else: + param_hint = None + param_hint = _join_param_hints(param_hint) + + param_type = self.param_type + if param_type is None and self.param is not None: + param_type = self.param.param_type_name + + msg = self.message + if self.param is not None: + msg_extra = self.param.type.get_missing_message(self.param) + if msg_extra: + if msg: + msg += '. ' + msg_extra + else: + msg = msg_extra + + return 'Missing %s%s%s%s' % ( + param_type, + param_hint and ' %s' % param_hint or '', + msg and '. ' or '.', + msg or '', + ) + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__(self, option_name, message=None, possibilities=None, + ctx=None): + if message is None: + message = 'no such option: %s' % option_name + UsageError.__init__(self, message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self): + bits = [self.message] + if self.possibilities: + if len(self.possibilities) == 1: + bits.append('Did you mean %s?' % self.possibilities[0]) + else: + possibilities = sorted(self.possibilities) + bits.append('(Possible options: %s)' % ', '.join(possibilities)) + return ' '.join(bits) + + +class BadOptionUsage(UsageError): + """Raised if an option is generally supplied but the use of the option + was incorrect. This is for instance raised if the number of arguments + for an option is not correct. + + .. versionadded:: 4.0 + + :param option_name: the name of the option being used incorrectly. + """ + + def __init__(self, option_name, message, ctx=None): + UsageError.__init__(self, message, ctx) + self.option_name = option_name + + +class BadArgumentUsage(UsageError): + """Raised if an argument is generally supplied but the use of the argument + was incorrect. This is for instance raised if the number of values + for an argument is not correct. + + .. versionadded:: 6.0 + """ + + def __init__(self, message, ctx=None): + UsageError.__init__(self, message, ctx) + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename, hint=None): + ui_filename = filename_to_ui(filename) + if hint is None: + hint = 'unknown error' + ClickException.__init__(self, hint) + self.ui_filename = ui_filename + self.filename = filename + + def format_message(self): + return 'Could not open file %s: %s' % (self.ui_filename, self.message) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" + + +class Exit(RuntimeError): + """An exception that indicates that the application should exit with some + status code. + + :param code: the status code to exit with. + """ + def __init__(self, code=0): + self.exit_code = code diff --git a/venv/Lib/site-packages/click/formatting.py b/venv/Lib/site-packages/click/formatting.py new file mode 100644 index 00000000..a3d6a4d3 --- /dev/null +++ b/venv/Lib/site-packages/click/formatting.py @@ -0,0 +1,256 @@ +from contextlib import contextmanager +from .termui import get_terminal_size +from .parser import split_opt +from ._compat import term_len + + +# Can force a width. This is used by the test system +FORCED_WIDTH = None + + +def measure_table(rows): + widths = {} + for row in rows: + for idx, col in enumerate(row): + widths[idx] = max(widths.get(idx, 0), term_len(col)) + return tuple(y for x, y in sorted(widths.items())) + + +def iter_rows(rows, col_count): + for row in rows: + row = tuple(row) + yield row + ('',) * (col_count - len(row)) + + +def wrap_text(text, width=78, initial_indent='', subsequent_indent='', + preserve_paragraphs=False): + """A helper function that intelligently wraps text. By default, it + assumes that it operates on a single paragraph of text but if the + `preserve_paragraphs` parameter is provided it will intelligently + handle paragraphs (defined by two empty lines). + + If paragraphs are handled, a paragraph can be prefixed with an empty + line containing the ``\\b`` character (``\\x08``) to indicate that + no rewrapping should happen in that block. + + :param text: the text that should be rewrapped. + :param width: the maximum width for the text. + :param initial_indent: the initial indent that should be placed on the + first line as a string. + :param subsequent_indent: the indent string that should be placed on + each consecutive line. + :param preserve_paragraphs: if this flag is set then the wrapping will + intelligently handle paragraphs. + """ + from ._textwrap import TextWrapper + text = text.expandtabs() + wrapper = TextWrapper(width, initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + replace_whitespace=False) + if not preserve_paragraphs: + return wrapper.fill(text) + + p = [] + buf = [] + indent = None + + def _flush_par(): + if not buf: + return + if buf[0].strip() == '\b': + p.append((indent or 0, True, '\n'.join(buf[1:]))) + else: + p.append((indent or 0, False, ' '.join(buf))) + del buf[:] + + for line in text.splitlines(): + if not line: + _flush_par() + indent = None + else: + if indent is None: + orig_len = term_len(line) + line = line.lstrip() + indent = orig_len - term_len(line) + buf.append(line) + _flush_par() + + rv = [] + for indent, raw, text in p: + with wrapper.extra_indent(' ' * indent): + if raw: + rv.append(wrapper.indent_only(text)) + else: + rv.append(wrapper.fill(text)) + + return '\n\n'.join(rv) + + +class HelpFormatter(object): + """This class helps with formatting text-based help pages. It's + usually just needed for very special internal cases, but it's also + exposed so that developers can write their own fancy outputs. + + At present, it always writes into memory. + + :param indent_increment: the additional increment for each level. + :param width: the width for the text. This defaults to the terminal + width clamped to a maximum of 78. + """ + + def __init__(self, indent_increment=2, width=None, max_width=None): + self.indent_increment = indent_increment + if max_width is None: + max_width = 80 + if width is None: + width = FORCED_WIDTH + if width is None: + width = max(min(get_terminal_size()[0], max_width) - 2, 50) + self.width = width + self.current_indent = 0 + self.buffer = [] + + def write(self, string): + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self): + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self): + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage(self, prog, args='', prefix='Usage: '): + """Writes a usage line into the buffer. + + :param prog: the program name. + :param args: whitespace separated list of arguments. + :param prefix: the prefix for the first line. + """ + usage_prefix = '%*s%s ' % (self.current_indent, prefix, prog) + text_width = self.width - self.current_indent + + if text_width >= (term_len(usage_prefix) + 20): + # The arguments will fit to the right of the prefix. + indent = ' ' * term_len(usage_prefix) + self.write(wrap_text(args, text_width, + initial_indent=usage_prefix, + subsequent_indent=indent)) + else: + # The prefix is too long, put the arguments on the next line. + self.write(usage_prefix) + self.write('\n') + indent = ' ' * (max(self.current_indent, term_len(prefix)) + 4) + self.write(wrap_text(args, text_width, + initial_indent=indent, + subsequent_indent=indent)) + + self.write('\n') + + def write_heading(self, heading): + """Writes a heading into the buffer.""" + self.write('%*s%s:\n' % (self.current_indent, '', heading)) + + def write_paragraph(self): + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write('\n') + + def write_text(self, text): + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + text_width = max(self.width - self.current_indent, 11) + indent = ' ' * self.current_indent + self.write(wrap_text(text, text_width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True)) + self.write('\n') + + def write_dl(self, rows, col_max=30, col_spacing=2): + """Writes a definition list into the buffer. This is how options + and commands are usually formatted. + + :param rows: a list of two item tuples for the terms and values. + :param col_max: the maximum width of the first column. + :param col_spacing: the number of spaces between the first and + second column. + """ + rows = list(rows) + widths = measure_table(rows) + if len(widths) != 2: + raise TypeError('Expected two columns for definition list') + + first_col = min(widths[0], col_max) + col_spacing + + for first, second in iter_rows(rows, len(widths)): + self.write('%*s%s' % (self.current_indent, '', first)) + if not second: + self.write('\n') + continue + if term_len(first) <= first_col - col_spacing: + self.write(' ' * (first_col - term_len(first))) + else: + self.write('\n') + self.write(' ' * (first_col + self.current_indent)) + + text_width = max(self.width - first_col - 2, 10) + lines = iter(wrap_text(second, text_width).splitlines()) + if lines: + self.write(next(lines) + '\n') + for line in lines: + self.write('%*s%s\n' % ( + first_col + self.current_indent, '', line)) + else: + self.write('\n') + + @contextmanager + def section(self, name): + """Helpful context manager that writes a paragraph, a heading, + and the indents. + + :param name: the section name that is written as heading. + """ + self.write_paragraph() + self.write_heading(name) + self.indent() + try: + yield + finally: + self.dedent() + + @contextmanager + def indentation(self): + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self): + """Returns the buffer contents.""" + return ''.join(self.buffer) + + +def join_options(options): + """Given a list of option strings this joins them in the most appropriate + way and returns them in the form ``(formatted_string, + any_prefix_is_slash)`` where the second item in the tuple is a flag that + indicates if any of the option prefixes was a slash. + """ + rv = [] + any_prefix_is_slash = False + for opt in options: + prefix = split_opt(opt)[0] + if prefix == '/': + any_prefix_is_slash = True + rv.append((len(prefix), opt)) + + rv.sort(key=lambda x: x[0]) + + rv = ', '.join(x[1] for x in rv) + return rv, any_prefix_is_slash diff --git a/venv/Lib/site-packages/click/globals.py b/venv/Lib/site-packages/click/globals.py new file mode 100644 index 00000000..843b594a --- /dev/null +++ b/venv/Lib/site-packages/click/globals.py @@ -0,0 +1,48 @@ +from threading import local + + +_local = local() + + +def get_current_context(silent=False): + """Returns the current click context. This can be used as a way to + access the current context object from anywhere. This is a more implicit + alternative to the :func:`pass_context` decorator. This function is + primarily useful for helpers such as :func:`echo` which might be + interested in changing its behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: is set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return getattr(_local, 'stack')[-1] + except (AttributeError, IndexError): + if not silent: + raise RuntimeError('There is no active click context.') + + +def push_context(ctx): + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault('stack', []).append(ctx) + + +def pop_context(): + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color=None): + """"Internal helper to get the default value of the color flag. If a + value is passed it's returned unchanged, otherwise it's looked up from + the current context. + """ + if color is not None: + return color + ctx = get_current_context(silent=True) + if ctx is not None: + return ctx.color diff --git a/venv/Lib/site-packages/click/parser.py b/venv/Lib/site-packages/click/parser.py new file mode 100644 index 00000000..1c3ae9c8 --- /dev/null +++ b/venv/Lib/site-packages/click/parser.py @@ -0,0 +1,427 @@ +# -*- coding: utf-8 -*- +""" +click.parser +~~~~~~~~~~~~ + +This module started out as largely a copy paste from the stdlib's +optparse module with the features removed that we do not need from +optparse because we implement them in Click on a higher level (for +instance type handling, help formatting and a lot more). + +The plan is to remove more and more from here over time. + +The reason this is a different module and not optparse from the stdlib +is that there are differences in 2.x and 3.x about the error messages +generated and optparse in the stdlib uses gettext for no good reason +and might cause us issues. +""" + +import re +from collections import deque +from .exceptions import UsageError, NoSuchOption, BadOptionUsage, \ + BadArgumentUsage + + +def _unpack_args(args, nargs_spec): + """Given an iterable of arguments and an iterable of nargs specifications, + it returns a tuple with all the unpacked arguments at the first index + and all remaining arguments as the second. + + The nargs specification is the number of arguments that should be consumed + or `-1` to indicate that this position should eat up all the remainders. + + Missing items are filled with `None`. + """ + args = deque(args) + nargs_spec = deque(nargs_spec) + rv = [] + spos = None + + def _fetch(c): + try: + if spos is None: + return c.popleft() + else: + return c.pop() + except IndexError: + return None + + while nargs_spec: + nargs = _fetch(nargs_spec) + if nargs == 1: + rv.append(_fetch(args)) + elif nargs > 1: + x = [_fetch(args) for _ in range(nargs)] + # If we're reversed, we're pulling in the arguments in reverse, + # so we need to turn them around. + if spos is not None: + x.reverse() + rv.append(tuple(x)) + elif nargs < 0: + if spos is not None: + raise TypeError('Cannot have two nargs < 0') + spos = len(rv) + rv.append(None) + + # spos is the position of the wildcard (star). If it's not `None`, + # we fill it with the remainder. + if spos is not None: + rv[spos] = tuple(args) + args = [] + rv[spos + 1:] = reversed(rv[spos + 1:]) + + return tuple(rv), list(args) + + +def _error_opt_args(nargs, opt): + if nargs == 1: + raise BadOptionUsage(opt, '%s option requires an argument' % opt) + raise BadOptionUsage(opt, '%s option requires %d arguments' % (opt, nargs)) + + +def split_opt(opt): + first = opt[:1] + if first.isalnum(): + return '', opt + if opt[1:2] == first: + return opt[:2], opt[2:] + return first, opt[1:] + + +def normalize_opt(opt, ctx): + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = split_opt(opt) + return prefix + ctx.token_normalize_func(opt) + + +def split_arg_string(string): + """Given an argument string this attempts to split it into small parts.""" + rv = [] + for match in re.finditer(r"('([^'\\]*(?:\\.[^'\\]*)*)'" + r'|"([^"\\]*(?:\\.[^"\\]*)*)"' + r'|\S+)\s*', string, re.S): + arg = match.group().strip() + if arg[:1] == arg[-1:] and arg[:1] in '"\'': + arg = arg[1:-1].encode('ascii', 'backslashreplace') \ + .decode('unicode-escape') + try: + arg = type(string)(arg) + except UnicodeError: + pass + rv.append(arg) + return rv + + +class Option(object): + + def __init__(self, opts, dest, action=None, nargs=1, const=None, obj=None): + self._short_opts = [] + self._long_opts = [] + self.prefixes = set() + + for opt in opts: + prefix, value = split_opt(opt) + if not prefix: + raise ValueError('Invalid start character for option (%s)' + % opt) + self.prefixes.add(prefix[0]) + if len(prefix) == 1 and len(value) == 1: + self._short_opts.append(opt) + else: + self._long_opts.append(opt) + self.prefixes.add(prefix) + + if action is None: + action = 'store' + + self.dest = dest + self.action = action + self.nargs = nargs + self.const = const + self.obj = obj + + @property + def takes_value(self): + return self.action in ('store', 'append') + + def process(self, value, state): + if self.action == 'store': + state.opts[self.dest] = value + elif self.action == 'store_const': + state.opts[self.dest] = self.const + elif self.action == 'append': + state.opts.setdefault(self.dest, []).append(value) + elif self.action == 'append_const': + state.opts.setdefault(self.dest, []).append(self.const) + elif self.action == 'count': + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 + else: + raise ValueError('unknown action %r' % self.action) + state.order.append(self.obj) + + +class Argument(object): + + def __init__(self, dest, nargs=1, obj=None): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process(self, value, state): + if self.nargs > 1: + holes = sum(1 for x in value if x is None) + if holes == len(value): + value = None + elif holes != 0: + raise BadArgumentUsage('argument %s takes %d values' + % (self.dest, self.nargs)) + state.opts[self.dest] = value + state.order.append(self.obj) + + +class ParsingState(object): + + def __init__(self, rargs): + self.opts = {} + self.largs = [] + self.rargs = rargs + self.order = [] + + +class OptionParser(object): + """The option parser is an internal class that is ultimately used to + parse options and arguments. It's modelled after optparse and brings + a similar but vastly simplified API. It should generally not be used + directly as the high level Click classes wrap it for you. + + It's not nearly as extensible as optparse or argparse as it does not + implement features that are implemented on a higher level (such as + types or defaults). + + :param ctx: optionally the :class:`~click.Context` where this parser + should go with. + """ + + def __init__(self, ctx=None): + #: The :class:`~click.Context` for this parser. This might be + #: `None` for some advanced use cases. + self.ctx = ctx + #: This controls how the parser deals with interspersed arguments. + #: If this is set to `False`, the parser will stop on the first + #: non-option. Click uses this to implement nested subcommands + #: safely. + self.allow_interspersed_args = True + #: This tells the parser how to deal with unknown options. By + #: default it will error out (which is sensible), but there is a + #: second mode where it will ignore it and continue processing + #: after shifting all the unknown options into the resulting args. + self.ignore_unknown_options = False + if ctx is not None: + self.allow_interspersed_args = ctx.allow_interspersed_args + self.ignore_unknown_options = ctx.ignore_unknown_options + self._short_opt = {} + self._long_opt = {} + self._opt_prefixes = set(['-', '--']) + self._args = [] + + def add_option(self, opts, dest, action=None, nargs=1, const=None, + obj=None): + """Adds a new option named `dest` to the parser. The destination + is not inferred (unlike with optparse) and needs to be explicitly + provided. Action can be any of ``store``, ``store_const``, + ``append``, ``appnd_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + if obj is None: + obj = dest + opts = [normalize_opt(opt, self.ctx) for opt in opts] + option = Option(opts, dest, action=action, nargs=nargs, + const=const, obj=obj) + self._opt_prefixes.update(option.prefixes) + for opt in option._short_opts: + self._short_opt[opt] = option + for opt in option._long_opts: + self._long_opt[opt] = option + + def add_argument(self, dest, nargs=1, obj=None): + """Adds a positional argument named `dest` to the parser. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + if obj is None: + obj = dest + self._args.append(Argument(dest=dest, nargs=nargs, obj=obj)) + + def parse_args(self, args): + """Parses positional arguments and returns ``(values, args, order)`` + for the parsed options and arguments as well as the leftover + arguments if there are any. The order is a list of objects as they + appear on the command line. If arguments appear multiple times they + will be memorized multiple times as well. + """ + state = ParsingState(args) + try: + self._process_args_for_options(state) + self._process_args_for_args(state) + except UsageError: + if self.ctx is None or not self.ctx.resilient_parsing: + raise + return state.opts, state.largs, state.order + + def _process_args_for_args(self, state): + pargs, args = _unpack_args(state.largs + state.rargs, + [x.nargs for x in self._args]) + + for idx, arg in enumerate(self._args): + arg.process(pargs[idx], state) + + state.largs = args + state.rargs = [] + + def _process_args_for_options(self, state): + while state.rargs: + arg = state.rargs.pop(0) + arglen = len(arg) + # Double dashes always handled explicitly regardless of what + # prefixes are valid. + if arg == '--': + return + elif arg[:1] in self._opt_prefixes and arglen > 1: + self._process_opts(arg, state) + elif self.allow_interspersed_args: + state.largs.append(arg) + else: + state.rargs.insert(0, arg) + return + + # Say this is the original argument list: + # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] + # ^ + # (we are about to process arg(i)). + # + # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of + # [arg0, ..., arg(i-1)] (any options and their arguments will have + # been removed from largs). + # + # The while loop will usually consume 1 or more arguments per pass. + # If it consumes 1 (eg. arg is an option that takes no arguments), + # then after _process_arg() is done the situation is: + # + # largs = subset of [arg0, ..., arg(i)] + # rargs = [arg(i+1), ..., arg(N-1)] + # + # If allow_interspersed_args is false, largs will always be + # *empty* -- still a subset of [arg0, ..., arg(i-1)], but + # not a very interesting subset! + + def _match_long_opt(self, opt, explicit_value, state): + if opt not in self._long_opt: + possibilities = [word for word in self._long_opt + if word.startswith(opt)] + raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) + + option = self._long_opt[opt] + if option.takes_value: + # At this point it's safe to modify rargs by injecting the + # explicit value, because no exception is raised in this + # branch. This means that the inserted value will be fully + # consumed. + if explicit_value is not None: + state.rargs.insert(0, explicit_value) + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + elif explicit_value is not None: + raise BadOptionUsage(opt, '%s option does not take a value' % opt) + + else: + value = None + + option.process(value, state) + + def _match_short_opt(self, arg, state): + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = normalize_opt(prefix + ch, self.ctx) + option = self._short_opt.get(opt) + i += 1 + + if not option: + if self.ignore_unknown_options: + unknown_options.append(ch) + continue + raise NoSuchOption(opt, ctx=self.ctx) + if option.takes_value: + # Any characters left in arg? Pretend they're the + # next arg, and stop consuming characters of arg. + if i < len(arg): + state.rargs.insert(0, arg[i:]) + stop = True + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + else: + value = None + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we re-combinate the string of the + # remaining options and re-attach the prefix, then report that + # to the state as new larg. This way there is basic combinatorics + # that can be achieved while still ignoring unknown arguments. + if self.ignore_unknown_options and unknown_options: + state.largs.append(prefix + ''.join(unknown_options)) + + def _process_opts(self, arg, state): + explicit_value = None + # Long option handling happens in two parts. The first part is + # supporting explicitly attached values. In any case, we will try + # to long match the option first. + if '=' in arg: + long_opt, explicit_value = arg.split('=', 1) + else: + long_opt = arg + norm_long_opt = normalize_opt(long_opt, self.ctx) + + # At this point we will match the (assumed) long option through + # the long option matching code. Note that this allows options + # like "-foo" to be matched as long options. + try: + self._match_long_opt(norm_long_opt, explicit_value, state) + except NoSuchOption: + # At this point the long option matching failed, and we need + # to try with short options. However there is a special rule + # which says, that if we have a two character options prefix + # (applies to "--foo" for instance), we do not dispatch to the + # short option code and will instead raise the no option + # error. + if arg[:2] not in self._opt_prefixes: + return self._match_short_opt(arg, state) + if not self.ignore_unknown_options: + raise + state.largs.append(arg) diff --git a/venv/Lib/site-packages/click/termui.py b/venv/Lib/site-packages/click/termui.py new file mode 100644 index 00000000..bf9a3aa1 --- /dev/null +++ b/venv/Lib/site-packages/click/termui.py @@ -0,0 +1,606 @@ +import os +import sys +import struct +import inspect +import itertools + +from ._compat import raw_input, text_type, string_types, \ + isatty, strip_ansi, get_winterm_size, DEFAULT_COLUMNS, WIN +from .utils import echo +from .exceptions import Abort, UsageError +from .types import convert_type, Choice, Path +from .globals import resolve_color_default + + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func = raw_input + +_ansi_colors = { + 'black': 30, + 'red': 31, + 'green': 32, + 'yellow': 33, + 'blue': 34, + 'magenta': 35, + 'cyan': 36, + 'white': 37, + 'reset': 39, + 'bright_black': 90, + 'bright_red': 91, + 'bright_green': 92, + 'bright_yellow': 93, + 'bright_blue': 94, + 'bright_magenta': 95, + 'bright_cyan': 96, + 'bright_white': 97, +} +_ansi_reset_all = '\033[0m' + + +def hidden_prompt_func(prompt): + import getpass + return getpass.getpass(prompt) + + +def _build_prompt(text, suffix, show_default=False, default=None, show_choices=True, type=None): + prompt = text + if type is not None and show_choices and isinstance(type, Choice): + prompt += ' (' + ", ".join(map(str, type.choices)) + ')' + if default is not None and show_default: + prompt = '%s [%s]' % (prompt, default) + return prompt + suffix + + +def prompt(text, default=None, hide_input=False, confirmation_prompt=False, + type=None, value_proc=None, prompt_suffix=': ', show_default=True, + err=False, show_choices=True): + """Prompts a user for input. This is a convenience function that can + be used to prompt a user for input later. + + If the user aborts the input by sending a interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + .. versionadded:: 7.0 + Added the show_choices parameter. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param text: the text to show for the prompt. + :param default: the default value to use if no input happens. If this + is not given it will prompt until it's aborted. + :param hide_input: if this is set to true then the input value will + be hidden. + :param confirmation_prompt: asks for confirmation for the value. + :param type: the type to use to check the value against. + :param value_proc: if this parameter is provided it's a function that + is invoked instead of the type conversion to + convert a value. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + :param show_choices: Show or hide choices if the passed type is a Choice. + For example if type is a Choice of either day or week, + show_choices is true and text is "Group by" then the + prompt will be "Group by (day, week): ". + """ + result = None + + def prompt_func(text): + f = hide_input and hidden_prompt_func or visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text, nl=False, err=err) + return f('') + except (KeyboardInterrupt, EOFError): + # getpass doesn't print a newline if the user aborts input with ^C. + # Allegedly this behavior is inherited from getpass(3). + # A doc bug has been filed at https://bugs.python.org/issue24711 + if hide_input: + echo(None, err=err) + raise Abort() + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt(text, prompt_suffix, show_default, default, show_choices, type) + + while 1: + while 1: + value = prompt_func(prompt) + if value: + break + elif default is not None: + if isinstance(value_proc, Path): + # validate Path default value(exists, dir_okay etc.) + value = default + break + return default + try: + result = value_proc(value) + except UsageError as e: + echo('Error: %s' % e.message, err=err) + continue + if not confirmation_prompt: + return result + while 1: + value2 = prompt_func('Repeat for confirmation: ') + if value2: + break + if value == value2: + return result + echo('Error: the two entered values do not match', err=err) + + +def confirm(text, default=False, abort=False, prompt_suffix=': ', + show_default=True, err=False): + """Prompts for confirmation (yes/no question). + + If the user aborts the input by sending a interrupt signal this + function will catch it and raise a :exc:`Abort` exception. + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param text: the question to ask. + :param default: the default for the prompt. + :param abort: if this is set to `True` a negative answer aborts the + exception by raising :exc:`Abort`. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + prompt = _build_prompt(text, prompt_suffix, show_default, + default and 'Y/n' or 'y/N') + while 1: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt, nl=False, err=err) + value = visible_prompt_func('').lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() + if value in ('y', 'yes'): + rv = True + elif value in ('n', 'no'): + rv = False + elif value == '': + rv = default + else: + echo('Error: invalid input', err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def get_terminal_size(): + """Returns the current size of the terminal as tuple in the form + ``(width, height)`` in columns and rows. + """ + # If shutil has get_terminal_size() (Python 3.3 and later) use that + if sys.version_info >= (3, 3): + import shutil + shutil_get_terminal_size = getattr(shutil, 'get_terminal_size', None) + if shutil_get_terminal_size: + sz = shutil_get_terminal_size() + return sz.columns, sz.lines + + # We provide a sensible default for get_winterm_size() when being invoked + # inside a subprocess. Without this, it would not provide a useful input. + if get_winterm_size is not None: + size = get_winterm_size() + if size == (0, 0): + return (79, 24) + else: + return size + + def ioctl_gwinsz(fd): + try: + import fcntl + import termios + cr = struct.unpack( + 'hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) + except Exception: + return + return cr + + cr = ioctl_gwinsz(0) or ioctl_gwinsz(1) or ioctl_gwinsz(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + try: + cr = ioctl_gwinsz(fd) + finally: + os.close(fd) + except Exception: + pass + if not cr or not cr[0] or not cr[1]: + cr = (os.environ.get('LINES', 25), + os.environ.get('COLUMNS', DEFAULT_COLUMNS)) + return int(cr[1]), int(cr[0]) + + +def echo_via_pager(text_or_generator, color=None): + """This function takes a text and shows it via an environment specific + pager on stdout. + + .. versionchanged:: 3.0 + Added the `color` flag. + + :param text_or_generator: the text to page, or alternatively, a + generator emitting the text to page. + :param color: controls if the pager supports ANSI colors or not. The + default is autodetection. + """ + color = resolve_color_default(color) + + if inspect.isgeneratorfunction(text_or_generator): + i = text_or_generator() + elif isinstance(text_or_generator, string_types): + i = [text_or_generator] + else: + i = iter(text_or_generator) + + # convert every element of i to a text type if necessary + text_generator = (el if isinstance(el, string_types) else text_type(el) + for el in i) + + from ._termui_impl import pager + return pager(itertools.chain(text_generator, "\n"), color) + + +def progressbar(iterable=None, length=None, label=None, show_eta=True, + show_percent=None, show_pos=False, + item_show_func=None, fill_char='#', empty_char='-', + bar_template='%(label)s [%(bar)s] %(info)s', + info_sep=' ', width=36, file=None, color=None): + """This function creates an iterable context manager that can be used + to iterate over something while showing a progress bar. It will + either iterate over the `iterable` or `length` items (that are counted + up). While iteration happens, this function will print a rendered + progress bar to the given `file` (defaults to stdout) and will attempt + to calculate remaining time and more. By default, this progress bar + will not be rendered if the file is not a terminal. + + The context manager creates the progress bar. When the context + manager is entered the progress bar is already displayed. With every + iteration over the progress bar, the iterable passed to the bar is + advanced and the bar is updated. When the context manager exits, + a newline is printed and the progress bar is finalized on screen. + + No printing must happen or the progress bar will be unintentionally + destroyed. + + Example usage:: + + with progressbar(items) as bar: + for item in bar: + do_something_with(item) + + Alternatively, if no iterable is specified, one can manually update the + progress bar through the `update()` method instead of directly + iterating over the progress bar. The update method accepts the number + of steps to increment the bar with:: + + with progressbar(length=chunks.total_bytes) as bar: + for chunk in chunks: + process_chunk(chunk) + bar.update(chunks.bytes) + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `color` parameter. Added a `update` method to the + progressbar object. + + :param iterable: an iterable to iterate over. If not provided the length + is required. + :param length: the number of items to iterate over. By default the + progressbar will attempt to ask the iterator about its + length, which might or might not work. If an iterable is + also provided this parameter can be used to override the + length. If an iterable is not provided the progress bar + will iterate over a range of that length. + :param label: the label to show next to the progress bar. + :param show_eta: enables or disables the estimated time display. This is + automatically disabled if the length cannot be + determined. + :param show_percent: enables or disables the percentage display. The + default is `True` if the iterable has a length or + `False` if not. + :param show_pos: enables or disables the absolute position display. The + default is `False`. + :param item_show_func: a function called with the current item which + can return a string to show the current item + next to the progress bar. Note that the current + item can be `None`! + :param fill_char: the character to use to show the filled part of the + progress bar. + :param empty_char: the character to use to show the non-filled part of + the progress bar. + :param bar_template: the format string to use as template for the bar. + The parameters in it are ``label`` for the label, + ``bar`` for the progress bar and ``info`` for the + info section. + :param info_sep: the separator between multiple info items (eta etc.) + :param width: the width of the progress bar in characters, 0 means full + terminal width + :param file: the file to write to. If this is not a terminal then + only the label is printed. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are included anywhere in the progress bar output + which is not the case by default. + """ + from ._termui_impl import ProgressBar + color = resolve_color_default(color) + return ProgressBar(iterable=iterable, length=length, show_eta=show_eta, + show_percent=show_percent, show_pos=show_pos, + item_show_func=item_show_func, fill_char=fill_char, + empty_char=empty_char, bar_template=bar_template, + info_sep=info_sep, file=file, label=label, + width=width, color=color) + + +def clear(): + """Clears the terminal screen. This will have the effect of clearing + the whole visible space of the terminal and moving the cursor to the + top left. This does not do anything if not connected to a terminal. + + .. versionadded:: 2.0 + """ + if not isatty(sys.stdout): + return + # If we're on Windows and we don't have colorama available, then we + # clear the screen by shelling out. Otherwise we can use an escape + # sequence. + if WIN: + os.system('cls') + else: + sys.stdout.write('\033[2J\033[1;1H') + + +def style(text, fg=None, bg=None, bold=None, dim=None, underline=None, + blink=None, reverse=None, reset=True): + """Styles a text with ANSI styles and returns the new string. By + default the styling is self contained which means that at the end + of the string a reset code is issued. This can be prevented by + passing ``reset=False``. + + Examples:: + + click.echo(click.style('Hello World!', fg='green')) + click.echo(click.style('ATTENTION!', blink=True)) + click.echo(click.style('Some things', reverse=True, fg='cyan')) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``bright_black`` + * ``bright_red`` + * ``bright_green`` + * ``bright_yellow`` + * ``bright_blue`` + * ``bright_magenta`` + * ``bright_cyan`` + * ``bright_white`` + * ``reset`` (reset the color code only) + + .. versionadded:: 2.0 + + .. versionadded:: 7.0 + Added support for bright colors. + + :param text: the string to style with ansi codes. + :param fg: if provided this will become the foreground color. + :param bg: if provided this will become the background color. + :param bold: if provided this will enable or disable bold mode. + :param dim: if provided this will enable or disable dim mode. This is + badly supported. + :param underline: if provided this will enable or disable underline. + :param blink: if provided this will enable or disable blinking. + :param reverse: if provided this will enable or disable inverse + rendering (foreground becomes background and the + other way round). + :param reset: by default a reset-all code is added at the end of the + string which means that styles do not carry over. This + can be disabled to compose styles. + """ + bits = [] + if fg: + try: + bits.append('\033[%dm' % (_ansi_colors[fg])) + except KeyError: + raise TypeError('Unknown color %r' % fg) + if bg: + try: + bits.append('\033[%dm' % (_ansi_colors[bg] + 10)) + except KeyError: + raise TypeError('Unknown color %r' % bg) + if bold is not None: + bits.append('\033[%dm' % (1 if bold else 22)) + if dim is not None: + bits.append('\033[%dm' % (2 if dim else 22)) + if underline is not None: + bits.append('\033[%dm' % (4 if underline else 24)) + if blink is not None: + bits.append('\033[%dm' % (5 if blink else 25)) + if reverse is not None: + bits.append('\033[%dm' % (7 if reverse else 27)) + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return ''.join(bits) + + +def unstyle(text): + """Removes ANSI styling information from a string. Usually it's not + necessary to use this function as Click's echo function will + automatically remove styling if necessary. + + .. versionadded:: 2.0 + + :param text: the text to remove style information from. + """ + return strip_ansi(text) + + +def secho(message=None, file=None, nl=True, err=False, color=None, **styles): + """This function combines :func:`echo` and :func:`style` into one + call. As such the following two calls are the same:: + + click.secho('Hello World!', fg='green') + click.echo(click.style('Hello World!', fg='green')) + + All keyword arguments are forwarded to the underlying functions + depending on which one they go with. + + .. versionadded:: 2.0 + """ + if message is not None: + message = style(message, **styles) + return echo(message, file=file, nl=nl, err=err, color=color) + + +def edit(text=None, editor=None, env=None, require_save=True, + extension='.txt', filename=None): + r"""Edits the given text in the defined editor. If an editor is given + (should be the full path to the executable but the regular operating + system search path is used for finding the executable) it overrides + the detected editor. Optionally, some environment variables can be + used. If the editor is closed without changes, `None` is returned. In + case a file is edited directly the return value is always `None` and + `require_save` and `extension` are ignored. + + If the editor cannot be opened a :exc:`UsageError` is raised. + + Note for Windows: to simplify cross-platform usage, the newlines are + automatically converted from POSIX to Windows and vice versa. As such, + the message here will have ``\n`` as newline markers. + + :param text: the text to edit. + :param editor: optionally the editor to use. Defaults to automatic + detection. + :param env: environment variables to forward to the editor. + :param require_save: if this is true, then not saving in the editor + will make the return value become `None`. + :param extension: the extension to tell the editor about. This defaults + to `.txt` but changing this might change syntax + highlighting. + :param filename: if provided it will edit this file instead of the + provided text contents. It will not use a temporary + file as an indirection in that case. + """ + from ._termui_impl import Editor + editor = Editor(editor=editor, env=env, require_save=require_save, + extension=extension) + if filename is None: + return editor.edit(text) + editor.edit_file(filename) + + +def launch(url, wait=False, locate=False): + """This function launches the given URL (or filename) in the default + viewer application for this file type. If this is an executable, it + might launch the executable in a new session. The return value is + the exit code of the launched application. Usually, ``0`` indicates + success. + + Examples:: + + click.launch('https://click.palletsprojects.com/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: waits for the program to stop. + :param locate: if this is set to `True` then instead of launching the + application associated with the URL it will attempt to + launch a file manager with the file located. This + might have weird effects if the URL does not point to + the filesystem. + """ + from ._termui_impl import open_url + return open_url(url, wait=wait, locate=locate) + + +# If this is provided, getchar() calls into this instead. This is used +# for unittesting purposes. +_getchar = None + + +def getchar(echo=False): + """Fetches a single character from the terminal and returns it. This + will always return a unicode character and under certain rare + circumstances this might return more than one character. The + situations which more than one character is returned is when for + whatever reason multiple characters end up in the terminal buffer or + standard input was not actually a terminal. + + Note that this will always read from the terminal, even if something + is piped into the standard input. + + Note for Windows: in rare cases when typing non-ASCII characters, this + function might wait for a second character and then return both at once. + This is because certain Unicode characters look like special-key markers. + + .. versionadded:: 2.0 + + :param echo: if set to `True`, the character read will also show up on + the terminal. The default is to not show it. + """ + f = _getchar + if f is None: + from ._termui_impl import getchar as f + return f(echo) + + +def raw_terminal(): + from ._termui_impl import raw_terminal as f + return f() + + +def pause(info='Press any key to continue ...', err=False): + """This command stops execution and waits for the user to press any + key to continue. This is similar to the Windows batch "pause" + command. If the program is not run through a terminal, this command + will instead do nothing. + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param info: the info string to print before pausing. + :param err: if set to message goes to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + if not isatty(sys.stdin) or not isatty(sys.stdout): + return + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/venv/Lib/site-packages/click/testing.py b/venv/Lib/site-packages/click/testing.py new file mode 100644 index 00000000..1b2924e0 --- /dev/null +++ b/venv/Lib/site-packages/click/testing.py @@ -0,0 +1,374 @@ +import os +import sys +import shutil +import tempfile +import contextlib +import shlex + +from ._compat import iteritems, PY2, string_types + + +# If someone wants to vendor click, we want to ensure the +# correct package is discovered. Ideally we could use a +# relative import here but unfortunately Python does not +# support that. +clickpkg = sys.modules[__name__.rsplit('.', 1)[0]] + + +if PY2: + from cStringIO import StringIO +else: + import io + from ._compat import _find_binary_reader + + +class EchoingStdin(object): + + def __init__(self, input, output): + self._input = input + self._output = output + + def __getattr__(self, x): + return getattr(self._input, x) + + def _echo(self, rv): + self._output.write(rv) + return rv + + def read(self, n=-1): + return self._echo(self._input.read(n)) + + def readline(self, n=-1): + return self._echo(self._input.readline(n)) + + def readlines(self): + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self): + return iter(self._echo(x) for x in self._input) + + def __repr__(self): + return repr(self._input) + + +def make_input_stream(input, charset): + # Is already an input stream. + if hasattr(input, 'read'): + if PY2: + return input + rv = _find_binary_reader(input) + if rv is not None: + return rv + raise TypeError('Could not find binary reader for input stream.') + + if input is None: + input = b'' + elif not isinstance(input, bytes): + input = input.encode(charset) + if PY2: + return StringIO(input) + return io.BytesIO(input) + + +class Result(object): + """Holds the captured result of an invoked CLI script.""" + + def __init__(self, runner, stdout_bytes, stderr_bytes, exit_code, + exception, exc_info=None): + #: The runner that created the result + self.runner = runner + #: The standard output as bytes. + self.stdout_bytes = stdout_bytes + #: The standard error as bytes, or False(y) if not available + self.stderr_bytes = stderr_bytes + #: The exit code as integer. + self.exit_code = exit_code + #: The exception that happened if one did. + self.exception = exception + #: The traceback + self.exc_info = exc_info + + @property + def output(self): + """The (standard) output as unicode string.""" + return self.stdout + + @property + def stdout(self): + """The standard output as unicode string.""" + return self.stdout_bytes.decode(self.runner.charset, 'replace') \ + .replace('\r\n', '\n') + + @property + def stderr(self): + """The standard error as unicode string.""" + if not self.stderr_bytes: + raise ValueError("stderr not separately captured") + return self.stderr_bytes.decode(self.runner.charset, 'replace') \ + .replace('\r\n', '\n') + + + def __repr__(self): + return '<%s %s>' % ( + type(self).__name__, + self.exception and repr(self.exception) or 'okay', + ) + + +class CliRunner(object): + """The CLI runner provides functionality to invoke a Click command line + script for unittesting purposes in a isolated environment. This only + works in single-threaded systems without any concurrency as it changes the + global interpreter state. + + :param charset: the character set for the input and output data. This is + UTF-8 by default and should not be changed currently as + the reporting to Click only works in Python 2 properly. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from stdin writes + to stdout. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + :param mix_stderr: if this is set to `False`, then stdout and stderr are + preserved as independent streams. This is useful for + Unix-philosophy apps that have predictable stdout and + noisy stderr, such that each may be measured + independently + """ + + def __init__(self, charset=None, env=None, echo_stdin=False, + mix_stderr=True): + if charset is None: + charset = 'utf-8' + self.charset = charset + self.env = env or {} + self.echo_stdin = echo_stdin + self.mix_stderr = mix_stderr + + def get_default_prog_name(self, cli): + """Given a command object it will return the default program name + for it. The default is the `name` attribute or ``"root"`` if not + set. + """ + return cli.name or 'root' + + def make_env(self, overrides=None): + """Returns the environment overrides for invoking a script.""" + rv = dict(self.env) + if overrides: + rv.update(overrides) + return rv + + @contextlib.contextmanager + def isolation(self, input=None, env=None, color=False): + """A context manager that sets up the isolation for invoking of a + command line tool. This sets up stdin with the given input data + and `os.environ` with the overrides from the given dictionary. + This also rebinds some internals in Click to be mocked (like the + prompt functionality). + + This is automatically done in the :meth:`invoke` method. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :param input: the input stream to put into sys.stdin. + :param env: the environment overrides as dictionary. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + """ + input = make_input_stream(input, self.charset) + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = clickpkg.formatting.FORCED_WIDTH + clickpkg.formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + if PY2: + bytes_output = StringIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + sys.stdout = bytes_output + if not self.mix_stderr: + bytes_error = StringIO() + sys.stderr = bytes_error + else: + bytes_output = io.BytesIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + input = io.TextIOWrapper(input, encoding=self.charset) + sys.stdout = io.TextIOWrapper( + bytes_output, encoding=self.charset) + if not self.mix_stderr: + bytes_error = io.BytesIO() + sys.stderr = io.TextIOWrapper( + bytes_error, encoding=self.charset) + + if self.mix_stderr: + sys.stderr = sys.stdout + + sys.stdin = input + + def visible_input(prompt=None): + sys.stdout.write(prompt or '') + val = input.readline().rstrip('\r\n') + sys.stdout.write(val + '\n') + sys.stdout.flush() + return val + + def hidden_input(prompt=None): + sys.stdout.write((prompt or '') + '\n') + sys.stdout.flush() + return input.readline().rstrip('\r\n') + + def _getchar(echo): + char = sys.stdin.read(1) + if echo: + sys.stdout.write(char) + sys.stdout.flush() + return char + + default_color = color + + def should_strip_ansi(stream=None, color=None): + if color is None: + return not default_color + return not color + + old_visible_prompt_func = clickpkg.termui.visible_prompt_func + old_hidden_prompt_func = clickpkg.termui.hidden_prompt_func + old__getchar_func = clickpkg.termui._getchar + old_should_strip_ansi = clickpkg.utils.should_strip_ansi + clickpkg.termui.visible_prompt_func = visible_input + clickpkg.termui.hidden_prompt_func = hidden_input + clickpkg.termui._getchar = _getchar + clickpkg.utils.should_strip_ansi = should_strip_ansi + + old_env = {} + try: + for key, value in iteritems(env): + old_env[key] = os.environ.get(key) + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + yield (bytes_output, not self.mix_stderr and bytes_error) + finally: + for key, value in iteritems(old_env): + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + sys.stdout = old_stdout + sys.stderr = old_stderr + sys.stdin = old_stdin + clickpkg.termui.visible_prompt_func = old_visible_prompt_func + clickpkg.termui.hidden_prompt_func = old_hidden_prompt_func + clickpkg.termui._getchar = old__getchar_func + clickpkg.utils.should_strip_ansi = old_should_strip_ansi + clickpkg.formatting.FORCED_WIDTH = old_forced_width + + def invoke(self, cli, args=None, input=None, env=None, + catch_exceptions=True, color=False, mix_stderr=False, **extra): + """Invokes a command in an isolated environment. The arguments are + forwarded directly to the command line script, the `extra` keyword + arguments are passed to the :meth:`~clickpkg.Command.main` function of + the command. + + This returns a :class:`Result` object. + + .. versionadded:: 3.0 + The ``catch_exceptions`` parameter was added. + + .. versionchanged:: 3.0 + The result object now has an `exc_info` attribute with the + traceback if available. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :param cli: the command to invoke + :param args: the arguments to invoke. It may be given as an iterable + or a string. When given as string it will be interpreted + as a Unix shell command. More details at + :func:`shlex.split`. + :param input: the input data for `sys.stdin`. + :param env: the environment overrides. + :param catch_exceptions: Whether to catch any other exceptions than + ``SystemExit``. + :param extra: the keyword arguments to pass to :meth:`main`. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + """ + exc_info = None + with self.isolation(input=input, env=env, color=color) as outstreams: + exception = None + exit_code = 0 + + if isinstance(args, string_types): + args = shlex.split(args) + + try: + prog_name = extra.pop("prog_name") + except KeyError: + prog_name = self.get_default_prog_name(cli) + + try: + cli.main(args=args or (), prog_name=prog_name, **extra) + except SystemExit as e: + exc_info = sys.exc_info() + exit_code = e.code + if exit_code is None: + exit_code = 0 + + if exit_code != 0: + exception = e + + if not isinstance(exit_code, int): + sys.stdout.write(str(exit_code)) + sys.stdout.write('\n') + exit_code = 1 + + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = 1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + stdout = outstreams[0].getvalue() + stderr = outstreams[1] and outstreams[1].getvalue() + + return Result(runner=self, + stdout_bytes=stdout, + stderr_bytes=stderr, + exit_code=exit_code, + exception=exception, + exc_info=exc_info) + + @contextlib.contextmanager + def isolated_filesystem(self): + """A context manager that creates a temporary folder and changes + the current working directory to it for isolated filesystem tests. + """ + cwd = os.getcwd() + t = tempfile.mkdtemp() + os.chdir(t) + try: + yield t + finally: + os.chdir(cwd) + try: + shutil.rmtree(t) + except (OSError, IOError): + pass diff --git a/venv/Lib/site-packages/click/types.py b/venv/Lib/site-packages/click/types.py new file mode 100644 index 00000000..1f88032f --- /dev/null +++ b/venv/Lib/site-packages/click/types.py @@ -0,0 +1,668 @@ +import os +import stat +from datetime import datetime + +from ._compat import open_stream, text_type, filename_to_ui, \ + get_filesystem_encoding, get_streerror, _get_argv_encoding, PY2 +from .exceptions import BadParameter +from .utils import safecall, LazyFile + + +class ParamType(object): + """Helper for converting values through types. The following is + necessary for a valid type: + + * it needs a name + * it needs to pass through None unchanged + * it needs to convert from a string + * it needs to convert its result type through unchanged + (eg: needs to be idempotent) + * it needs to be able to deal with param and context being `None`. + This can be the case when the object is used with prompt + inputs. + """ + is_composite = False + + #: the descriptive name of this type + name = None + + #: if a list of this type is expected and the value is pulled from a + #: string environment variable, this is what splits it up. `None` + #: means any whitespace. For all parameters the general rule is that + #: whitespace splits them up. The exception are paths and files which + #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on + #: Windows). + envvar_list_splitter = None + + def __call__(self, value, param=None, ctx=None): + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param): + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param): + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert(self, value, param, ctx): + """Converts the value. This is not invoked for values that are + `None` (the missing value). + """ + return value + + def split_envvar_value(self, rv): + """Given a value from an environment variable this splits it up + into small chunks depending on the defined envvar list splitter. + + If the splitter is set to `None`, which means that whitespace splits, + then leading and trailing whitespace is ignored. Otherwise, leading + and trailing splitters usually lead to empty items being included. + """ + return (rv or '').split(self.envvar_list_splitter) + + def fail(self, message, param=None, ctx=None): + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self): + raise NotImplementedError() + + +class FuncParamType(ParamType): + + def __init__(self, func): + self.name = func.__name__ + self.func = func + + def convert(self, value, param, ctx): + try: + return self.func(value) + except ValueError: + try: + value = text_type(value) + except UnicodeError: + value = str(value).decode('utf-8', 'replace') + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = 'text' + + def convert(self, value, param, ctx): + return value + + def __repr__(self): + return 'UNPROCESSED' + + +class StringParamType(ParamType): + name = 'text' + + def convert(self, value, param, ctx): + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = get_filesystem_encoding() + if fs_enc != enc: + try: + value = value.decode(fs_enc) + except UnicodeError: + value = value.decode('utf-8', 'replace') + return value + return value + + def __repr__(self): + return 'STRING' + + +class Choice(ParamType): + """The choice type allows a value to be checked against a fixed set + of supported values. All of these values have to be strings. + + You should only pass a list or tuple of choices. Other iterables + (like generators) may lead to surprising results. + + See :ref:`choice-opts` for an example. + + :param case_sensitive: Set to false to make choices case + insensitive. Defaults to true. + """ + + name = 'choice' + + def __init__(self, choices, case_sensitive=True): + self.choices = choices + self.case_sensitive = case_sensitive + + def get_metavar(self, param): + return '[%s]' % '|'.join(self.choices) + + def get_missing_message(self, param): + return 'Choose from:\n\t%s.' % ',\n\t'.join(self.choices) + + def convert(self, value, param, ctx): + # Exact match + if value in self.choices: + return value + + # Match through normalization and case sensitivity + # first do token_normalize_func, then lowercase + # preserve original `value` to produce an accurate message in + # `self.fail` + normed_value = value + normed_choices = self.choices + + if ctx is not None and \ + ctx.token_normalize_func is not None: + normed_value = ctx.token_normalize_func(value) + normed_choices = [ctx.token_normalize_func(choice) for choice in + self.choices] + + if not self.case_sensitive: + normed_value = normed_value.lower() + normed_choices = [choice.lower() for choice in normed_choices] + + if normed_value in normed_choices: + return normed_value + + self.fail('invalid choice: %s. (choose from %s)' % + (value, ', '.join(self.choices)), param, ctx) + + def __repr__(self): + return 'Choice(%r)' % list(self.choices) + + +class DateTime(ParamType): + """The DateTime type converts date strings into `datetime` objects. + + The format strings which are checked are configurable, but default to some + common (non-timezone aware) ISO 8601 formats. + + When specifying *DateTime* formats, you should only pass a list or a tuple. + Other iterables, like generators, may lead to surprising results. + + The format strings are processed using ``datetime.strptime``, and this + consequently defines the format strings which are allowed. + + Parsing is tried using each format, in order, and the first format which + parses successfully is used. + + :param formats: A list or tuple of date format strings, in the order in + which they should be tried. Defaults to + ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, + ``'%Y-%m-%d %H:%M:%S'``. + """ + name = 'datetime' + + def __init__(self, formats=None): + self.formats = formats or [ + '%Y-%m-%d', + '%Y-%m-%dT%H:%M:%S', + '%Y-%m-%d %H:%M:%S' + ] + + def get_metavar(self, param): + return '[{}]'.format('|'.join(self.formats)) + + def _try_to_convert_date(self, value, format): + try: + return datetime.strptime(value, format) + except ValueError: + return None + + def convert(self, value, param, ctx): + # Exact match + for format in self.formats: + dtime = self._try_to_convert_date(value, format) + if dtime: + return dtime + + self.fail( + 'invalid datetime format: {}. (choose from {})'.format( + value, ', '.join(self.formats))) + + def __repr__(self): + return 'DateTime' + + +class IntParamType(ParamType): + name = 'integer' + + def convert(self, value, param, ctx): + try: + return int(value) + except (ValueError, UnicodeError): + self.fail('%s is not a valid integer' % value, param, ctx) + + def __repr__(self): + return 'INT' + + +class IntRange(IntParamType): + """A parameter that works similar to :data:`click.INT` but restricts + the value to fit into a range. The default behavior is to fail if the + value falls outside the range, but it can also be silently clamped + between the two edges. + + See :ref:`ranges` for an example. + """ + name = 'integer range' + + def __init__(self, min=None, max=None, clamp=False): + self.min = min + self.max = max + self.clamp = clamp + + def convert(self, value, param, ctx): + rv = IntParamType.convert(self, value, param, ctx) + if self.clamp: + if self.min is not None and rv < self.min: + return self.min + if self.max is not None and rv > self.max: + return self.max + if self.min is not None and rv < self.min or \ + self.max is not None and rv > self.max: + if self.min is None: + self.fail('%s is bigger than the maximum valid value ' + '%s.' % (rv, self.max), param, ctx) + elif self.max is None: + self.fail('%s is smaller than the minimum valid value ' + '%s.' % (rv, self.min), param, ctx) + else: + self.fail('%s is not in the valid range of %s to %s.' + % (rv, self.min, self.max), param, ctx) + return rv + + def __repr__(self): + return 'IntRange(%r, %r)' % (self.min, self.max) + + +class FloatParamType(ParamType): + name = 'float' + + def convert(self, value, param, ctx): + try: + return float(value) + except (UnicodeError, ValueError): + self.fail('%s is not a valid floating point value' % + value, param, ctx) + + def __repr__(self): + return 'FLOAT' + + +class FloatRange(FloatParamType): + """A parameter that works similar to :data:`click.FLOAT` but restricts + the value to fit into a range. The default behavior is to fail if the + value falls outside the range, but it can also be silently clamped + between the two edges. + + See :ref:`ranges` for an example. + """ + name = 'float range' + + def __init__(self, min=None, max=None, clamp=False): + self.min = min + self.max = max + self.clamp = clamp + + def convert(self, value, param, ctx): + rv = FloatParamType.convert(self, value, param, ctx) + if self.clamp: + if self.min is not None and rv < self.min: + return self.min + if self.max is not None and rv > self.max: + return self.max + if self.min is not None and rv < self.min or \ + self.max is not None and rv > self.max: + if self.min is None: + self.fail('%s is bigger than the maximum valid value ' + '%s.' % (rv, self.max), param, ctx) + elif self.max is None: + self.fail('%s is smaller than the minimum valid value ' + '%s.' % (rv, self.min), param, ctx) + else: + self.fail('%s is not in the valid range of %s to %s.' + % (rv, self.min, self.max), param, ctx) + return rv + + def __repr__(self): + return 'FloatRange(%r, %r)' % (self.min, self.max) + + +class BoolParamType(ParamType): + name = 'boolean' + + def convert(self, value, param, ctx): + if isinstance(value, bool): + return bool(value) + value = value.lower() + if value in ('true', 't', '1', 'yes', 'y'): + return True + elif value in ('false', 'f', '0', 'no', 'n'): + return False + self.fail('%s is not a valid boolean' % value, param, ctx) + + def __repr__(self): + return 'BOOL' + + +class UUIDParameterType(ParamType): + name = 'uuid' + + def convert(self, value, param, ctx): + import uuid + try: + if PY2 and isinstance(value, text_type): + value = value.encode('ascii') + return uuid.UUID(value) + except (UnicodeError, ValueError): + self.fail('%s is not a valid UUID value' % value, param, ctx) + + def __repr__(self): + return 'UUID' + + +class File(ParamType): + """Declares a parameter to be a file for reading or writing. The file + is automatically closed once the context tears down (after the command + finished working). + + Files can be opened for reading or writing. The special value ``-`` + indicates stdin or stdout depending on the mode. + + By default, the file is opened for reading text data, but it can also be + opened in binary mode or for writing. The encoding parameter can be used + to force a specific encoding. + + The `lazy` flag controls if the file should be opened immediately or upon + first IO. The default is to be non-lazy for standard input and output + streams as well as files opened for reading, `lazy` otherwise. When opening a + file lazily for reading, it is still opened temporarily for validation, but + will not be held open until first IO. lazy is mainly useful when opening + for writing to avoid creating the file until it is needed. + + Starting with Click 2.0, files can also be opened atomically in which + case all writes go into a separate file in the same folder and upon + completion the file will be moved over to the original location. This + is useful if a file regularly read by other users is modified. + + See :ref:`file-args` for more information. + """ + name = 'filename' + envvar_list_splitter = os.path.pathsep + + def __init__(self, mode='r', encoding=None, errors='strict', lazy=None, + atomic=False): + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def resolve_lazy_flag(self, value): + if self.lazy is not None: + return self.lazy + if value == '-': + return False + elif 'w' in self.mode: + return True + return False + + def convert(self, value, param, ctx): + try: + if hasattr(value, 'read') or hasattr(value, 'write'): + return value + + lazy = self.resolve_lazy_flag(value) + + if lazy: + f = LazyFile(value, self.mode, self.encoding, self.errors, + atomic=self.atomic) + if ctx is not None: + ctx.call_on_close(f.close_intelligently) + return f + + f, should_close = open_stream(value, self.mode, + self.encoding, self.errors, + atomic=self.atomic) + # If a context is provided, we automatically close the file + # at the end of the context execution (or flush out). If a + # context does not exist, it's the caller's responsibility to + # properly close the file. This for instance happens when the + # type is used with prompts. + if ctx is not None: + if should_close: + ctx.call_on_close(safecall(f.close)) + else: + ctx.call_on_close(safecall(f.flush)) + return f + except (IOError, OSError) as e: + self.fail('Could not open file: %s: %s' % ( + filename_to_ui(value), + get_streerror(e), + ), param, ctx) + + +class Path(ParamType): + """The path type is similar to the :class:`File` type but it performs + different checks. First of all, instead of returning an open file + handle it returns just the filename. Secondly, it can perform various + basic checks about what the file or directory should be. + + .. versionchanged:: 6.0 + `allow_dash` was added. + + :param exists: if set to true, the file or directory needs to exist for + this value to be valid. If this is not required and a + file does indeed not exist, then all further checks are + silently skipped. + :param file_okay: controls if a file is a possible value. + :param dir_okay: controls if a directory is a possible value. + :param writable: if true, a writable check is performed. + :param readable: if true, a readable check is performed. + :param resolve_path: if this is true, then the path is fully resolved + before the value is passed onwards. This means + that it's absolute and symlinks are resolved. It + will not expand a tilde-prefix, as this is + supposed to be done by the shell only. + :param allow_dash: If this is set to `True`, a single dash to indicate + standard streams is permitted. + :param path_type: optionally a string type that should be used to + represent the path. The default is `None` which + means the return value will be either bytes or + unicode depending on what makes most sense given the + input data Click deals with. + """ + envvar_list_splitter = os.path.pathsep + + def __init__(self, exists=False, file_okay=True, dir_okay=True, + writable=False, readable=True, resolve_path=False, + allow_dash=False, path_type=None): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.writable = writable + self.readable = readable + self.resolve_path = resolve_path + self.allow_dash = allow_dash + self.type = path_type + + if self.file_okay and not self.dir_okay: + self.name = 'file' + self.path_type = 'File' + elif self.dir_okay and not self.file_okay: + self.name = 'directory' + self.path_type = 'Directory' + else: + self.name = 'path' + self.path_type = 'Path' + + def coerce_path_result(self, rv): + if self.type is not None and not isinstance(rv, self.type): + if self.type is text_type: + rv = rv.decode(get_filesystem_encoding()) + else: + rv = rv.encode(get_filesystem_encoding()) + return rv + + def convert(self, value, param, ctx): + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b'-', '-') + + if not is_dash: + if self.resolve_path: + rv = os.path.realpath(rv) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail('%s "%s" does not exist.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail('%s "%s" is a file.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail('%s "%s" is a directory.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if self.writable and not os.access(value, os.W_OK): + self.fail('%s "%s" is not writable.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if self.readable and not os.access(value, os.R_OK): + self.fail('%s "%s" is not readable.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + + return self.coerce_path_result(rv) + + +class Tuple(CompositeParamType): + """The default behavior of Click is to apply a type on a value directly. + This works well in most cases, except for when `nargs` is set to a fixed + count and different types should be used for different items. In this + case the :class:`Tuple` type can be used. This type can only be used + if `nargs` is set to a fixed number. + + For more information see :ref:`tuple-type`. + + This can be selected by using a Python tuple literal as a type. + + :param types: a list of types that should be used for the tuple items. + """ + + def __init__(self, types): + self.types = [convert_type(ty) for ty in types] + + @property + def name(self): + return "<" + " ".join(ty.name for ty in self.types) + ">" + + @property + def arity(self): + return len(self.types) + + def convert(self, value, param, ctx): + if len(value) != len(self.types): + raise TypeError('It would appear that nargs is set to conflict ' + 'with the composite type arity.') + return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) + + +def convert_type(ty, default=None): + """Converts a callable or python ty into the most appropriate param + ty. + """ + guessed_type = False + if ty is None and default is not None: + if isinstance(default, tuple): + ty = tuple(map(type, default)) + else: + ty = type(default) + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + if isinstance(ty, ParamType): + return ty + if ty is text_type or ty is str or ty is None: + return STRING + if ty is int: + return INT + # Booleans are only okay if not guessed. This is done because for + # flags the default value is actually a bit of a lie in that it + # indicates which of the flags is the one we want. See get_default() + # for more information. + if ty is bool and not guessed_type: + return BOOL + if ty is float: + return FLOAT + if guessed_type: + return STRING + + # Catch a common mistake + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError('Attempted to use an uninstantiated ' + 'parameter type (%s).' % ty) + except TypeError: + pass + return FuncParamType(ty) + + +#: A dummy parameter type that just does nothing. From a user's +#: perspective this appears to just be the same as `STRING` but internally +#: no string conversion takes place. This is necessary to achieve the +#: same bytes/unicode behavior on Python 2/3 in situations where you want +#: to not convert argument types. This is usually useful when working +#: with file paths as they can appear in bytes and unicode. +#: +#: For path related uses the :class:`Path` type is a better choice but +#: there are situations where an unprocessed type is useful which is why +#: it is is provided. +#: +#: .. versionadded:: 4.0 +UNPROCESSED = UnprocessedParamType() + +#: A unicode string parameter type which is the implicit default. This +#: can also be selected by using ``str`` as type. +STRING = StringParamType() + +#: An integer parameter. This can also be selected by using ``int`` as +#: type. +INT = IntParamType() + +#: A floating point value parameter. This can also be selected by using +#: ``float`` as type. +FLOAT = FloatParamType() + +#: A boolean parameter. This is the default for boolean flags. This can +#: also be selected by using ``bool`` as a type. +BOOL = BoolParamType() + +#: A UUID parameter. +UUID = UUIDParameterType() diff --git a/venv/Lib/site-packages/click/utils.py b/venv/Lib/site-packages/click/utils.py new file mode 100644 index 00000000..fc84369f --- /dev/null +++ b/venv/Lib/site-packages/click/utils.py @@ -0,0 +1,440 @@ +import os +import sys + +from .globals import resolve_color_default + +from ._compat import text_type, open_stream, get_filesystem_encoding, \ + get_streerror, string_types, PY2, binary_streams, text_streams, \ + filename_to_ui, auto_wrap_for_ansi, strip_ansi, should_strip_ansi, \ + _default_text_stdout, _default_text_stderr, is_bytes, WIN + +if not PY2: + from ._compat import _find_binary_writer +elif WIN: + from ._winconsole import _get_windows_argv, \ + _hash_py_argv, _initial_argv_hash + + +echo_native_types = string_types + (bytes, bytearray) + + +def _posixify(name): + return '-'.join(name.split()).lower() + + +def safecall(func): + """Wraps a function so that it swallows exceptions.""" + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception: + pass + return wrapper + + +def make_str(value): + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(get_filesystem_encoding()) + except UnicodeError: + return value.decode('utf-8', 'replace') + return text_type(value) + + +def make_default_short_help(help, max_length=45): + """Return a condensed version of help string.""" + words = help.split() + total_length = 0 + result = [] + done = False + + for word in words: + if word[-1:] == '.': + done = True + new_length = result and 1 + len(word) or len(word) + if total_length + new_length > max_length: + result.append('...') + done = True + else: + if result: + result.append(' ') + result.append(word) + if done: + break + total_length += new_length + + return ''.join(result) + + +class LazyFile(object): + """A lazy file works like a regular file but it does not fully open + the file but it does perform some basic checks early to see if the + filename parameter does make sense. This is useful for safely opening + files for writing. + """ + + def __init__(self, filename, mode='r', encoding=None, errors='strict', + atomic=False): + self.name = filename + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + + if filename == '-': + self._f, self.should_close = open_stream(filename, mode, + encoding, errors) + else: + if 'r' in mode: + # Open and close the file in case we're opening it for + # reading so that we can catch at least some errors in + # some cases early. + open(filename, mode).close() + self._f = None + self.should_close = True + + def __getattr__(self, name): + return getattr(self.open(), name) + + def __repr__(self): + if self._f is not None: + return repr(self._f) + return '' % (self.name, self.mode) + + def open(self): + """Opens the file if it's not yet open. This call might fail with + a :exc:`FileError`. Not handling this error will produce an error + that Click shows. + """ + if self._f is not None: + return self._f + try: + rv, self.should_close = open_stream(self.name, self.mode, + self.encoding, + self.errors, + atomic=self.atomic) + except (IOError, OSError) as e: + from .exceptions import FileError + raise FileError(self.name, hint=get_streerror(e)) + self._f = rv + return rv + + def close(self): + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self): + """This function only closes the file if it was opened by the lazy + file wrapper. For instance this will never close stdin. + """ + if self.should_close: + self.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close_intelligently() + + def __iter__(self): + self.open() + return iter(self._f) + + +class KeepOpenFile(object): + + def __init__(self, file): + self._file = file + + def __getattr__(self, name): + return getattr(self._file, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + pass + + def __repr__(self): + return repr(self._file) + + def __iter__(self): + return iter(self._file) + + +def echo(message=None, file=None, nl=True, err=False, color=None): + """Prints a message plus a newline to the given file or stdout. On + first sight, this looks like the print function, but it has improved + support for handling Unicode and binary data that does not fail no + matter how badly configured the system is. + + Primarily it means that you can print binary data as well as Unicode + data on both 2.x and 3.x to the given file in the most appropriate way + possible. This is a very carefree function in that it will try its + best to not fail. As of Click 6.0 this includes support for unicode + output on the Windows console. + + In addition to that, if `colorama`_ is installed, the echo function will + also support clever handling of ANSI codes. Essentially it will then + do the following: + + - add transparent handling of ANSI color codes on Windows. + - hide ANSI codes automatically if the destination file is not a + terminal. + + .. _colorama: https://pypi.org/project/colorama/ + + .. versionchanged:: 6.0 + As of Click 6.0 the echo function will properly support unicode + output on the windows console. Not that click does not modify + the interpreter in any way which means that `sys.stdout` or the + print statement or function will still not provide unicode support. + + .. versionchanged:: 2.0 + Starting with version 2.0 of Click, the echo function will work + with colorama if it's installed. + + .. versionadded:: 3.0 + The `err` parameter was added. + + .. versionchanged:: 4.0 + Added the `color` flag. + + :param message: the message to print + :param file: the file to write to (defaults to ``stdout``) + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``. This is faster and easier than calling + :func:`get_text_stderr` yourself. + :param nl: if set to `True` (the default) a newline is printed afterwards. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, echo_native_types): + message = text_type(message) + + if nl: + message = message or u'' + if isinstance(message, text_type): + message += u'\n' + else: + message += b'\n' + + # If there is a message, and we're in Python 3, and the value looks + # like bytes, we manually need to find the binary stream and write the + # message in there. This is done separately so that most stream + # types will work as you would expect. Eg: you can write to StringIO + # for other cases. + if message and not PY2 and is_bytes(message): + binary_file = _find_binary_writer(file) + if binary_file is not None: + file.flush() + binary_file.write(message) + binary_file.flush() + return + + # ANSI-style support. If there is no message or we are dealing with + # bytes nothing is happening. If we are connected to a file we want + # to strip colors. If we are on windows we either wrap the stream + # to strip the color or we use the colorama support to translate the + # ansi codes to API calls. + if message and not is_bytes(message): + color = resolve_color_default(color) + if should_strip_ansi(file, color): + message = strip_ansi(message) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file) + elif not color: + message = strip_ansi(message) + + if message: + file.write(message) + file.flush() + + +def get_binary_stream(name): + """Returns a system stream for byte processing. This essentially + returns the stream from the sys module with the given name but it + solves some compatibility issues between different Python versions. + Primarily this function is necessary for getting binary streams on + Python 3. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + """ + opener = binary_streams.get(name) + if opener is None: + raise TypeError('Unknown standard stream %r' % name) + return opener() + + +def get_text_stream(name, encoding=None, errors='strict'): + """Returns a system stream for text processing. This usually returns + a wrapped stream around a binary stream returned from + :func:`get_binary_stream` but it also can take shortcuts on Python 3 + for already correctly configured streams. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + :param encoding: overrides the detected default encoding. + :param errors: overrides the default error mode. + """ + opener = text_streams.get(name) + if opener is None: + raise TypeError('Unknown standard stream %r' % name) + return opener(encoding, errors) + + +def open_file(filename, mode='r', encoding=None, errors='strict', + lazy=False, atomic=False): + """This is similar to how the :class:`File` works but for manual + usage. Files are opened non lazy by default. This can open regular + files as well as stdin/stdout if ``'-'`` is passed. + + If stdin/stdout is returned the stream is wrapped so that the context + manager will not close the stream accidentally. This makes it possible + to always use the function like this without having to worry to + accidentally close a standard stream:: + + with open_file(filename) as f: + ... + + .. versionadded:: 3.0 + + :param filename: the name of the file to open (or ``'-'`` for stdin/stdout). + :param mode: the mode in which to open the file. + :param encoding: the encoding to use. + :param errors: the error handling for this file. + :param lazy: can be flipped to true to open the file lazily. + :param atomic: in atomic mode writes go into a temporary file and it's + moved on close. + """ + if lazy: + return LazyFile(filename, mode, encoding, errors, atomic=atomic) + f, should_close = open_stream(filename, mode, encoding, errors, + atomic=atomic) + if not should_close: + f = KeepOpenFile(f) + return f + + +def get_os_args(): + """This returns the argument part of sys.argv in the most appropriate + form for processing. What this means is that this return value is in + a format that works for Click to process but does not necessarily + correspond well to what's actually standard for the interpreter. + + On most environments the return value is ``sys.argv[:1]`` unchanged. + However if you are on Windows and running Python 2 the return value + will actually be a list of unicode strings instead because the + default behavior on that platform otherwise will not be able to + carry all possible values that sys.argv can have. + + .. versionadded:: 6.0 + """ + # We can only extract the unicode argv if sys.argv has not been + # changed since the startup of the application. + if PY2 and WIN and _initial_argv_hash == _hash_py_argv(): + return _get_windows_argv() + return sys.argv[1:] + + +def format_filename(filename, shorten=False): + """Formats a filename for user display. The main purpose of this + function is to ensure that the filename can be displayed at all. This + will decode the filename to unicode if necessary in a way that it will + not fail. Optionally, it can shorten the filename to not include the + full path to the filename. + + :param filename: formats a filename for UI display. This will also convert + the filename into unicode without failing. + :param shorten: this optionally shortens the filename to strip of the + path that leads up to it. + """ + if shorten: + filename = os.path.basename(filename) + return filename_to_ui(filename) + + +def get_app_dir(app_name, roaming=True, force_posix=False): + r"""Returns the config folder for the application. The default behavior + is to return whatever is most appropriate for the operating system. + + To give you an idea, for an app called ``"Foo Bar"``, something like + the following folders could be returned: + + Mac OS X: + ``~/Library/Application Support/Foo Bar`` + Mac OS X (POSIX): + ``~/.foo-bar`` + Unix: + ``~/.config/foo-bar`` + Unix (POSIX): + ``~/.foo-bar`` + Win XP (roaming): + ``C:\Documents and Settings\\Local Settings\Application Data\Foo Bar`` + Win XP (not roaming): + ``C:\Documents and Settings\\Application Data\Foo Bar`` + Win 7 (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Win 7 (not roaming): + ``C:\Users\\AppData\Local\Foo Bar`` + + .. versionadded:: 2.0 + + :param app_name: the application name. This should be properly capitalized + and can contain whitespace. + :param roaming: controls if the folder should be roaming or not on Windows. + Has no affect otherwise. + :param force_posix: if this is set to `True` then on any POSIX system the + folder will be stored in the home folder with a leading + dot instead of the XDG config home or darwin's + application support folder. + """ + if WIN: + key = roaming and 'APPDATA' or 'LOCALAPPDATA' + folder = os.environ.get(key) + if folder is None: + folder = os.path.expanduser('~') + return os.path.join(folder, app_name) + if force_posix: + return os.path.join(os.path.expanduser('~/.' + _posixify(app_name))) + if sys.platform == 'darwin': + return os.path.join(os.path.expanduser( + '~/Library/Application Support'), app_name) + return os.path.join( + os.environ.get('XDG_CONFIG_HOME', os.path.expanduser('~/.config')), + _posixify(app_name)) + + +class PacifyFlushWrapper(object): + """This wrapper is used to catch and suppress BrokenPipeErrors resulting + from ``.flush()`` being called on broken pipe during the shutdown/final-GC + of the Python interpreter. Notably ``.flush()`` is always called on + ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any + other cleanup code, and the case where the underlying file is not a broken + pipe, all calls and attributes are proxied. + """ + + def __init__(self, wrapped): + self.wrapped = wrapped + + def flush(self): + try: + self.wrapped.flush() + except IOError as e: + import errno + if e.errno != errno.EPIPE: + raise + + def __getattr__(self, attr): + return getattr(self.wrapped, attr) diff --git a/venv/Lib/site-packages/colorama-0.4.0.dist-info/DESCRIPTION.rst b/venv/Lib/site-packages/colorama-0.4.0.dist-info/DESCRIPTION.rst new file mode 100644 index 00000000..33ab1028 --- /dev/null +++ b/venv/Lib/site-packages/colorama-0.4.0.dist-info/DESCRIPTION.rst @@ -0,0 +1,348 @@ +.. image:: https://img.shields.io/pypi/v/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Latest Version + +.. image:: https://img.shields.io/pypi/pyversions/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Supported Python versions + +.. image:: https://travis-ci.org/tartley/colorama.svg?branch=master + :target: https://travis-ci.org/tartley/colorama + :alt: Build Status + +Download and docs: + https://pypi.org/project/colorama/ +Source code & Development: + https://github.com/tartley/colorama + +Description +=========== + +Makes ANSI escape character sequences (for producing colored terminal text and +cursor positioning) work under MS Windows. + +ANSI escape character sequences have long been used to produce colored terminal +text and cursor positioning on Unix and Macs. Colorama makes this work on +Windows, too, by wrapping ``stdout``, stripping ANSI sequences it finds (which +would appear as gobbledygook in the output), and converting them into the +appropriate win32 calls to modify the state of the terminal. On other platforms, +Colorama does nothing. + +Colorama also provides some shortcuts to help generate ANSI sequences +but works fine in conjunction with any other ANSI sequence generation library, +such as the venerable Termcolor (https://pypi.org/project/termcolor/) +or the fabulous Blessings (https://pypi.org/project/blessings/). + +This has the upshot of providing a simple cross-platform API for printing +colored terminal text from Python, and has the happy side-effect that existing +applications or libraries which use ANSI sequences to produce colored output on +Linux or Macs can now also work on Windows, simply by calling +``colorama.init()``. + +An alternative approach is to install ``ansi.sys`` on Windows machines, which +provides the same behaviour for all applications running in terminals. Colorama +is intended for situations where that isn't easy (e.g., maybe your app doesn't +have an installer.) + +Demo scripts in the source code repository print some colored text using +ANSI sequences. Compare their output under Gnome-terminal's built in ANSI +handling, versus on Windows Command-Prompt using Colorama: + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/ubuntu-demo.png + :width: 661 + :height: 357 + :alt: ANSI sequences on Ubuntu under gnome-terminal. + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/windows-demo.png + :width: 668 + :height: 325 + :alt: Same ANSI sequences on Windows, using Colorama. + +These screengrabs show that, on Windows, Colorama does not support ANSI 'dim +text'; it looks the same as 'normal text'. + + +License +======= + +Copyright Jonathan Hartley 2013. BSD 3-Clause license; see LICENSE file. + + +Dependencies +============ + +None, other than Python. Tested on Python 2.7, 3.4, 3.5 and 3.6. + +Usage +===== + +Initialisation +-------------- + +Applications should initialise Colorama using: + +.. code-block:: python + + from colorama import init + init() + +On Windows, calling ``init()`` will filter ANSI escape sequences out of any +text sent to ``stdout`` or ``stderr``, and replace them with equivalent Win32 +calls. + +On other platforms, calling ``init()`` has no effect (unless you request other +optional functionality; see "Init Keyword Args", below). By design, this permits +applications to call ``init()`` unconditionally on all platforms, after which +ANSI output should just work. + +To stop using colorama before your program exits, simply call ``deinit()``. +This will restore ``stdout`` and ``stderr`` to their original values, so that +Colorama is disabled. To resume using Colorama again, call ``reinit()``; it is +cheaper to calling ``init()`` again (but does the same thing). + + +Colored Output +-------------- + +Cross-platform printing of colored text can then be done using Colorama's +constant shorthand for ANSI escape sequences: + +.. code-block:: python + + from colorama import Fore, Back, Style + print(Fore.RED + 'some red text') + print(Back.GREEN + 'and with a green background') + print(Style.DIM + 'and in dim text') + print(Style.RESET_ALL) + print('back to normal now') + +...or simply by manually printing ANSI sequences from your own code: + +.. code-block:: python + + print('\033[31m' + 'some red text') + print('\033[30m') # and reset to default color + +...or, Colorama can be used happily in conjunction with existing ANSI libraries +such as Termcolor: + +.. code-block:: python + + from colorama import init + from termcolor import colored + + # use Colorama to make Termcolor work on Windows too + init() + + # then use Termcolor for all colored text output + print(colored('Hello, World!', 'green', 'on_red')) + +Available formatting constants are:: + + Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Style: DIM, NORMAL, BRIGHT, RESET_ALL + +``Style.RESET_ALL`` resets foreground, background, and brightness. Colorama will +perform this reset automatically on program exit. + + +Cursor Positioning +------------------ + +ANSI codes to reposition the cursor are supported. See ``demos/demo06.py`` for +an example of how to generate them. + + +Init Keyword Args +----------------- + +``init()`` accepts some ``**kwargs`` to override default behaviour. + +init(autoreset=False): + If you find yourself repeatedly sending reset sequences to turn off color + changes at the end of every print, then ``init(autoreset=True)`` will + automate that: + + .. code-block:: python + + from colorama import init + init(autoreset=True) + print(Fore.RED + 'some red text') + print('automatically back to default color again') + +init(strip=None): + Pass ``True`` or ``False`` to override whether ansi codes should be + stripped from the output. The default behaviour is to strip if on Windows + or if output is redirected (not a tty). + +init(convert=None): + Pass ``True`` or ``False`` to override whether to convert ANSI codes in the + output into win32 calls. The default behaviour is to convert if on Windows + and output is to a tty (terminal). + +init(wrap=True): + On Windows, colorama works by replacing ``sys.stdout`` and ``sys.stderr`` + with proxy objects, which override the ``.write()`` method to do their work. + If this wrapping causes you problems, then this can be disabled by passing + ``init(wrap=False)``. The default behaviour is to wrap if ``autoreset`` or + ``strip`` or ``convert`` are True. + + When wrapping is disabled, colored printing on non-Windows platforms will + continue to work as normal. To do cross-platform colored output, you can + use Colorama's ``AnsiToWin32`` proxy directly: + + .. code-block:: python + + import sys + from colorama import init, AnsiToWin32 + init(wrap=False) + stream = AnsiToWin32(sys.stderr).stream + + # Python 2 + print >>stream, Fore.BLUE + 'blue text on stderr' + + # Python 3 + print(Fore.BLUE + 'blue text on stderr', file=stream) + + +Status & Known Problems +======================= + +I've personally only tested it on Windows XP (CMD, Console2), Ubuntu +(gnome-terminal, xterm), and OS X. + +Some presumably valid ANSI sequences aren't recognised (see details below), +but to my knowledge nobody has yet complained about this. Puzzling. + +See outstanding issues and wishlist: +https://github.com/tartley/colorama/issues + +If anything doesn't work for you, or doesn't do what you expected or hoped for, +I'd love to hear about it on that issues list, would be delighted by patches, +and would be happy to grant commit access to anyone who submits a working patch +or two. + + +Recognised ANSI Sequences +========================= + +ANSI sequences generally take the form: + + ESC [ ; ... + +Where ```` is an integer, and ```` is a single letter. Zero or +more params are passed to a ````. If no params are passed, it is +generally synonymous with passing a single zero. No spaces exist in the +sequence; they have been inserted here simply to read more easily. + +The only ANSI sequences that colorama converts into win32 calls are:: + + ESC [ 0 m # reset all (colors and brightness) + ESC [ 1 m # bright + ESC [ 2 m # dim (looks same as normal brightness) + ESC [ 22 m # normal brightness + + # FOREGROUND: + ESC [ 30 m # black + ESC [ 31 m # red + ESC [ 32 m # green + ESC [ 33 m # yellow + ESC [ 34 m # blue + ESC [ 35 m # magenta + ESC [ 36 m # cyan + ESC [ 37 m # white + ESC [ 39 m # reset + + # BACKGROUND + ESC [ 40 m # black + ESC [ 41 m # red + ESC [ 42 m # green + ESC [ 43 m # yellow + ESC [ 44 m # blue + ESC [ 45 m # magenta + ESC [ 46 m # cyan + ESC [ 47 m # white + ESC [ 49 m # reset + + # cursor positioning + ESC [ y;x H # position cursor at x across, y down + ESC [ y;x f # position cursor at x across, y down + ESC [ n A # move cursor n lines up + ESC [ n B # move cursor n lines down + ESC [ n C # move cursor n characters forward + ESC [ n D # move cursor n characters backward + + # clear the screen + ESC [ mode J # clear the screen + + # clear the line + ESC [ mode K # clear the line + +Multiple numeric params to the ``'m'`` command can be combined into a single +sequence:: + + ESC [ 36 ; 45 ; 1 m # bright cyan text on magenta background + +All other ANSI sequences of the form ``ESC [ ; ... `` +are silently stripped from the output on Windows. + +Any other form of ANSI sequence, such as single-character codes or alternative +initial characters, are not recognised or stripped. It would be cool to add +them though. Let me know if it would be useful for you, via the Issues on +GitHub. + + +Development +=========== + +Help and fixes welcome! + +Running tests requires: + +- Michael Foord's ``mock`` module to be installed. +- Tests are written using 2010-era updates to ``unittest`` + +To run tests:: + + python -m unittest discover -p *_test.py + +This, like a few other handy commands, is captured in a ``Makefile``. + +If you use nose to run the tests, you must pass the ``-s`` flag; otherwise, +``nosetests`` applies its own proxy to ``stdout``, which confuses the unit +tests. + + +Thanks +====== +* Marc Schlaich (schlamar) for a ``setup.py`` fix for Python2.5. +* Marc Abramowitz, reported & fixed a crash on exit with closed ``stdout``, + providing a solution to issue #7's setuptools/distutils debate, + and other fixes. +* User 'eryksun', for guidance on correctly instantiating ``ctypes.windll``. +* Matthew McCormick for politely pointing out a longstanding crash on non-Win. +* Ben Hoyt, for a magnificent fix under 64-bit Windows. +* Jesse at Empty Square for submitting a fix for examples in the README. +* User 'jamessp', an observant documentation fix for cursor positioning. +* User 'vaal1239', Dave Mckee & Lackner Kristof for a tiny but much-needed Win7 + fix. +* Julien Stuyck, for wisely suggesting Python3 compatible updates to README. +* Daniel Griffith for multiple fabulous patches. +* Oscar Lesta for a valuable fix to stop ANSI chars being sent to non-tty + output. +* Roger Binns, for many suggestions, valuable feedback, & bug reports. +* Tim Golden for thought and much appreciated feedback on the initial idea. +* User 'Zearin' for updates to the README file. +* John Szakmeister for adding support for light colors +* Charles Merriam for adding documentation to demos +* Jurko for a fix on 64-bit Windows CPython2.5 w/o ctypes +* Florian Bruhin for a fix when stdout or stderr are None +* Thomas Weininger for fixing ValueError on Windows +* Remi Rampin for better Github integration and fixes to the README file +* Simeon Visser for closing a file handle using 'with' and updating classifiers + to include Python 3.3 and 3.4 +* Andy Neff for fixing RESET of LIGHT_EX colors. +* Jonathan Hartley for the initial idea and implementation. + + diff --git a/venv/Lib/site-packages/colorama-0.4.0.dist-info/INSTALLER b/venv/Lib/site-packages/colorama-0.4.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/Lib/site-packages/colorama-0.4.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/colorama-0.4.0.dist-info/LICENSE.txt b/venv/Lib/site-packages/colorama-0.4.0.dist-info/LICENSE.txt new file mode 100644 index 00000000..3105888e --- /dev/null +++ b/venv/Lib/site-packages/colorama-0.4.0.dist-info/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2010 Jonathan Hartley +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holders, nor those of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/Lib/site-packages/colorama-0.4.0.dist-info/METADATA b/venv/Lib/site-packages/colorama-0.4.0.dist-info/METADATA new file mode 100644 index 00000000..7438d3db --- /dev/null +++ b/venv/Lib/site-packages/colorama-0.4.0.dist-info/METADATA @@ -0,0 +1,376 @@ +Metadata-Version: 2.0 +Name: colorama +Version: 0.4.0 +Summary: Cross-platform colored terminal text. +Home-page: https://github.com/tartley/colorama +Author: Jonathan Hartley +Author-email: tartley@tartley.com +Maintainer: Arnon Yaari +License: BSD +Keywords: color colour terminal text ansi windows crossplatform xplatform +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD 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.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Terminals +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* + +.. image:: https://img.shields.io/pypi/v/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Latest Version + +.. image:: https://img.shields.io/pypi/pyversions/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Supported Python versions + +.. image:: https://travis-ci.org/tartley/colorama.svg?branch=master + :target: https://travis-ci.org/tartley/colorama + :alt: Build Status + +Download and docs: + https://pypi.org/project/colorama/ +Source code & Development: + https://github.com/tartley/colorama + +Description +=========== + +Makes ANSI escape character sequences (for producing colored terminal text and +cursor positioning) work under MS Windows. + +ANSI escape character sequences have long been used to produce colored terminal +text and cursor positioning on Unix and Macs. Colorama makes this work on +Windows, too, by wrapping ``stdout``, stripping ANSI sequences it finds (which +would appear as gobbledygook in the output), and converting them into the +appropriate win32 calls to modify the state of the terminal. On other platforms, +Colorama does nothing. + +Colorama also provides some shortcuts to help generate ANSI sequences +but works fine in conjunction with any other ANSI sequence generation library, +such as the venerable Termcolor (https://pypi.org/project/termcolor/) +or the fabulous Blessings (https://pypi.org/project/blessings/). + +This has the upshot of providing a simple cross-platform API for printing +colored terminal text from Python, and has the happy side-effect that existing +applications or libraries which use ANSI sequences to produce colored output on +Linux or Macs can now also work on Windows, simply by calling +``colorama.init()``. + +An alternative approach is to install ``ansi.sys`` on Windows machines, which +provides the same behaviour for all applications running in terminals. Colorama +is intended for situations where that isn't easy (e.g., maybe your app doesn't +have an installer.) + +Demo scripts in the source code repository print some colored text using +ANSI sequences. Compare their output under Gnome-terminal's built in ANSI +handling, versus on Windows Command-Prompt using Colorama: + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/ubuntu-demo.png + :width: 661 + :height: 357 + :alt: ANSI sequences on Ubuntu under gnome-terminal. + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/windows-demo.png + :width: 668 + :height: 325 + :alt: Same ANSI sequences on Windows, using Colorama. + +These screengrabs show that, on Windows, Colorama does not support ANSI 'dim +text'; it looks the same as 'normal text'. + + +License +======= + +Copyright Jonathan Hartley 2013. BSD 3-Clause license; see LICENSE file. + + +Dependencies +============ + +None, other than Python. Tested on Python 2.7, 3.4, 3.5 and 3.6. + +Usage +===== + +Initialisation +-------------- + +Applications should initialise Colorama using: + +.. code-block:: python + + from colorama import init + init() + +On Windows, calling ``init()`` will filter ANSI escape sequences out of any +text sent to ``stdout`` or ``stderr``, and replace them with equivalent Win32 +calls. + +On other platforms, calling ``init()`` has no effect (unless you request other +optional functionality; see "Init Keyword Args", below). By design, this permits +applications to call ``init()`` unconditionally on all platforms, after which +ANSI output should just work. + +To stop using colorama before your program exits, simply call ``deinit()``. +This will restore ``stdout`` and ``stderr`` to their original values, so that +Colorama is disabled. To resume using Colorama again, call ``reinit()``; it is +cheaper to calling ``init()`` again (but does the same thing). + + +Colored Output +-------------- + +Cross-platform printing of colored text can then be done using Colorama's +constant shorthand for ANSI escape sequences: + +.. code-block:: python + + from colorama import Fore, Back, Style + print(Fore.RED + 'some red text') + print(Back.GREEN + 'and with a green background') + print(Style.DIM + 'and in dim text') + print(Style.RESET_ALL) + print('back to normal now') + +...or simply by manually printing ANSI sequences from your own code: + +.. code-block:: python + + print('\033[31m' + 'some red text') + print('\033[30m') # and reset to default color + +...or, Colorama can be used happily in conjunction with existing ANSI libraries +such as Termcolor: + +.. code-block:: python + + from colorama import init + from termcolor import colored + + # use Colorama to make Termcolor work on Windows too + init() + + # then use Termcolor for all colored text output + print(colored('Hello, World!', 'green', 'on_red')) + +Available formatting constants are:: + + Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Style: DIM, NORMAL, BRIGHT, RESET_ALL + +``Style.RESET_ALL`` resets foreground, background, and brightness. Colorama will +perform this reset automatically on program exit. + + +Cursor Positioning +------------------ + +ANSI codes to reposition the cursor are supported. See ``demos/demo06.py`` for +an example of how to generate them. + + +Init Keyword Args +----------------- + +``init()`` accepts some ``**kwargs`` to override default behaviour. + +init(autoreset=False): + If you find yourself repeatedly sending reset sequences to turn off color + changes at the end of every print, then ``init(autoreset=True)`` will + automate that: + + .. code-block:: python + + from colorama import init + init(autoreset=True) + print(Fore.RED + 'some red text') + print('automatically back to default color again') + +init(strip=None): + Pass ``True`` or ``False`` to override whether ansi codes should be + stripped from the output. The default behaviour is to strip if on Windows + or if output is redirected (not a tty). + +init(convert=None): + Pass ``True`` or ``False`` to override whether to convert ANSI codes in the + output into win32 calls. The default behaviour is to convert if on Windows + and output is to a tty (terminal). + +init(wrap=True): + On Windows, colorama works by replacing ``sys.stdout`` and ``sys.stderr`` + with proxy objects, which override the ``.write()`` method to do their work. + If this wrapping causes you problems, then this can be disabled by passing + ``init(wrap=False)``. The default behaviour is to wrap if ``autoreset`` or + ``strip`` or ``convert`` are True. + + When wrapping is disabled, colored printing on non-Windows platforms will + continue to work as normal. To do cross-platform colored output, you can + use Colorama's ``AnsiToWin32`` proxy directly: + + .. code-block:: python + + import sys + from colorama import init, AnsiToWin32 + init(wrap=False) + stream = AnsiToWin32(sys.stderr).stream + + # Python 2 + print >>stream, Fore.BLUE + 'blue text on stderr' + + # Python 3 + print(Fore.BLUE + 'blue text on stderr', file=stream) + + +Status & Known Problems +======================= + +I've personally only tested it on Windows XP (CMD, Console2), Ubuntu +(gnome-terminal, xterm), and OS X. + +Some presumably valid ANSI sequences aren't recognised (see details below), +but to my knowledge nobody has yet complained about this. Puzzling. + +See outstanding issues and wishlist: +https://github.com/tartley/colorama/issues + +If anything doesn't work for you, or doesn't do what you expected or hoped for, +I'd love to hear about it on that issues list, would be delighted by patches, +and would be happy to grant commit access to anyone who submits a working patch +or two. + + +Recognised ANSI Sequences +========================= + +ANSI sequences generally take the form: + + ESC [ ; ... + +Where ```` is an integer, and ```` is a single letter. Zero or +more params are passed to a ````. If no params are passed, it is +generally synonymous with passing a single zero. No spaces exist in the +sequence; they have been inserted here simply to read more easily. + +The only ANSI sequences that colorama converts into win32 calls are:: + + ESC [ 0 m # reset all (colors and brightness) + ESC [ 1 m # bright + ESC [ 2 m # dim (looks same as normal brightness) + ESC [ 22 m # normal brightness + + # FOREGROUND: + ESC [ 30 m # black + ESC [ 31 m # red + ESC [ 32 m # green + ESC [ 33 m # yellow + ESC [ 34 m # blue + ESC [ 35 m # magenta + ESC [ 36 m # cyan + ESC [ 37 m # white + ESC [ 39 m # reset + + # BACKGROUND + ESC [ 40 m # black + ESC [ 41 m # red + ESC [ 42 m # green + ESC [ 43 m # yellow + ESC [ 44 m # blue + ESC [ 45 m # magenta + ESC [ 46 m # cyan + ESC [ 47 m # white + ESC [ 49 m # reset + + # cursor positioning + ESC [ y;x H # position cursor at x across, y down + ESC [ y;x f # position cursor at x across, y down + ESC [ n A # move cursor n lines up + ESC [ n B # move cursor n lines down + ESC [ n C # move cursor n characters forward + ESC [ n D # move cursor n characters backward + + # clear the screen + ESC [ mode J # clear the screen + + # clear the line + ESC [ mode K # clear the line + +Multiple numeric params to the ``'m'`` command can be combined into a single +sequence:: + + ESC [ 36 ; 45 ; 1 m # bright cyan text on magenta background + +All other ANSI sequences of the form ``ESC [ ; ... `` +are silently stripped from the output on Windows. + +Any other form of ANSI sequence, such as single-character codes or alternative +initial characters, are not recognised or stripped. It would be cool to add +them though. Let me know if it would be useful for you, via the Issues on +GitHub. + + +Development +=========== + +Help and fixes welcome! + +Running tests requires: + +- Michael Foord's ``mock`` module to be installed. +- Tests are written using 2010-era updates to ``unittest`` + +To run tests:: + + python -m unittest discover -p *_test.py + +This, like a few other handy commands, is captured in a ``Makefile``. + +If you use nose to run the tests, you must pass the ``-s`` flag; otherwise, +``nosetests`` applies its own proxy to ``stdout``, which confuses the unit +tests. + + +Thanks +====== +* Marc Schlaich (schlamar) for a ``setup.py`` fix for Python2.5. +* Marc Abramowitz, reported & fixed a crash on exit with closed ``stdout``, + providing a solution to issue #7's setuptools/distutils debate, + and other fixes. +* User 'eryksun', for guidance on correctly instantiating ``ctypes.windll``. +* Matthew McCormick for politely pointing out a longstanding crash on non-Win. +* Ben Hoyt, for a magnificent fix under 64-bit Windows. +* Jesse at Empty Square for submitting a fix for examples in the README. +* User 'jamessp', an observant documentation fix for cursor positioning. +* User 'vaal1239', Dave Mckee & Lackner Kristof for a tiny but much-needed Win7 + fix. +* Julien Stuyck, for wisely suggesting Python3 compatible updates to README. +* Daniel Griffith for multiple fabulous patches. +* Oscar Lesta for a valuable fix to stop ANSI chars being sent to non-tty + output. +* Roger Binns, for many suggestions, valuable feedback, & bug reports. +* Tim Golden for thought and much appreciated feedback on the initial idea. +* User 'Zearin' for updates to the README file. +* John Szakmeister for adding support for light colors +* Charles Merriam for adding documentation to demos +* Jurko for a fix on 64-bit Windows CPython2.5 w/o ctypes +* Florian Bruhin for a fix when stdout or stderr are None +* Thomas Weininger for fixing ValueError on Windows +* Remi Rampin for better Github integration and fixes to the README file +* Simeon Visser for closing a file handle using 'with' and updating classifiers + to include Python 3.3 and 3.4 +* Andy Neff for fixing RESET of LIGHT_EX colors. +* Jonathan Hartley for the initial idea and implementation. + + diff --git a/venv/Lib/site-packages/colorama-0.4.0.dist-info/RECORD b/venv/Lib/site-packages/colorama-0.4.0.dist-info/RECORD new file mode 100644 index 00000000..854786f5 --- /dev/null +++ b/venv/Lib/site-packages/colorama-0.4.0.dist-info/RECORD @@ -0,0 +1,20 @@ +colorama-0.4.0.dist-info/DESCRIPTION.rst,sha256=P3gDHIes9Rs3d-5CZP5FQDdysvchP4ot6Dy_ejaTviE,12026 +colorama-0.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +colorama-0.4.0.dist-info/LICENSE.txt,sha256=ysNcAmhuXQSlpxQL-zs25zrtSWZW6JEQLkKIhteTAxg,1491 +colorama-0.4.0.dist-info/METADATA,sha256=q9EpNWu1xgF9XSDZ1m6iSqdV8OhQK2Oy9r6ixdjDKF4,13164 +colorama-0.4.0.dist-info/RECORD,, +colorama-0.4.0.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +colorama-0.4.0.dist-info/metadata.json,sha256=GiqAuIaXQqxz4CekgpR5n7HmNPJVRH1tFOLupL1H13w,1288 +colorama-0.4.0.dist-info/top_level.txt,sha256=_Kx6-Cni2BT1PEATPhrSRxo0d7kSgfBbHf5o7IF1ABw,9 +colorama/__init__.py,sha256=fdOYYad1zwDOTIP5pfI0PHTTk9OmRueBceMXA5Nl4ag,239 +colorama/__pycache__/__init__.cpython-37.pyc,, +colorama/__pycache__/ansi.cpython-37.pyc,, +colorama/__pycache__/ansitowin32.cpython-37.pyc,, +colorama/__pycache__/initialise.cpython-37.pyc,, +colorama/__pycache__/win32.cpython-37.pyc,, +colorama/__pycache__/winterm.cpython-37.pyc,, +colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 +colorama/ansitowin32.py,sha256=iWLxF6prjichjNFjh_2-YEmN09wvw_3jxXpqNafhx7A,10326 +colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 +colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 +colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 diff --git a/venv/Lib/site-packages/colorama-0.4.0.dist-info/WHEEL b/venv/Lib/site-packages/colorama-0.4.0.dist-info/WHEEL new file mode 100644 index 00000000..8b6dd1b5 --- /dev/null +++ b/venv/Lib/site-packages/colorama-0.4.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/colorama-0.4.0.dist-info/metadata.json b/venv/Lib/site-packages/colorama-0.4.0.dist-info/metadata.json new file mode 100644 index 00000000..770f8465 --- /dev/null +++ b/venv/Lib/site-packages/colorama-0.4.0.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Terminals"], "extensions": {"python.details": {"contacts": [{"email": "tartley@tartley.com", "name": "Jonathan Hartley", "role": "author"}, {"name": "Arnon Yaari", "role": "maintainer"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "https://github.com/tartley/colorama"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["color", "colour", "terminal", "text", "ansi", "windows", "crossplatform", "xplatform"], "license": "BSD", "metadata_version": "2.0", "name": "colorama", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "summary": "Cross-platform colored terminal text.", "version": "0.4.0"} \ No newline at end of file diff --git a/venv/Lib/site-packages/colorama-0.4.0.dist-info/top_level.txt b/venv/Lib/site-packages/colorama-0.4.0.dist-info/top_level.txt new file mode 100644 index 00000000..3fcfb51b --- /dev/null +++ b/venv/Lib/site-packages/colorama-0.4.0.dist-info/top_level.txt @@ -0,0 +1 @@ +colorama diff --git a/venv/Lib/site-packages/colorama/__init__.py b/venv/Lib/site-packages/colorama/__init__.py new file mode 100644 index 00000000..818d88c5 --- /dev/null +++ b/venv/Lib/site-packages/colorama/__init__.py @@ -0,0 +1,6 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from .initialise import init, deinit, reinit, colorama_text +from .ansi import Fore, Back, Style, Cursor +from .ansitowin32 import AnsiToWin32 + +__version__ = '0.4.0' diff --git a/venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4cb5729f60e176c8522bc10aa0d74a8fb55a36e2 GIT binary patch literal 428 zcmYL_%}N6?5P(YWUH+Q-^VBM9dh;L z$-5^rmf}FZ`ORb|XT4s>u_E)2`){j1!P$vtjZ=H{)S`4smpj5muJDj2eB_G&1un!r z9*PJ>qJ>%_MzLt4_FvrR9g(2K+5zg8;oM21FW0t80~4@{H6|+QR;#V>i%Bqkrb;teVf^l>JtzhIpvh5jYah_X^>{YB zd>duc^La6@>nUkSaV3|87Yi!tqGt7gRk|UZ4<7TJj@E|{#cs`i17nyP+jqO(FAE%Vp8x;= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-37.pyc b/venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0f66834dbb6cf9de0df858e9c049fb5d1faa74b GIT binary patch literal 3326 zcmcguTXWM!6xK@eO|c!5grv}$TYAB5aZ2e+p~J*CLclmQPMRV@Rn@yB0>?Hhr9dWh zIum{fee5skf7t0;pY#`a>iO2WI3bCxMA6{#?5yaO9|sSEf#88(?#uOANVAyN6Jf_6 z2oIAw+veMMsoi_YQXNJy!-c0stwt>@5JX1Ac8py%L*bk;XyIl{vCWdHtXg|PSz#ng zOxc+44?`yDgO}geF0ZYGLWXO%D)aLTzg{fY8|}5qU{LoXf34Z?_}#T-u{l^91cM7f zFO2+d_rk`dOXA{_Z|<*Y=lo6o@Wtc*Fzrk9dHU z?-(=W$({$>=2utX!eYCotZJi4E+nEL>I&__5K=UU%7h~Fv}T;deS5GS!^RP#{~fj) zB~xOQM5!Wdl>1jqW;jeF;x zu^sk;arQe4oygoVcG#}@%#19&MfQ%l%XTehJaSfv&wHikl@iM0fm99^j*P;`LA0S# z>mu@_NU9X&3op7PN|v%i(Y>$ip1&zn;upWW^-8$Yo)`3j$n(x(fv67=HamXCxP@tVVc zs{{vO&T-nsXpgdZUhia#cCvB3moeJQ3Ovm-dM`W09X^J=jAtoc6UxypY{{@MV^F(; zEaJiwrgT~kc+QUTymF*|Oo^2%)*JCmv&3Av{V{3w3UxboXtca?`wdN2PcSLZ(d@^K z+V#cN)~6$8$4AUU_lAaRuWLAUZE*jgR9p`zsz{lx7UT`P)DR+`j5Z5ME8vbAFOA*797@ovM0HP3o2sj78Vq@?nM)k%n z;4WYda1Zb!zytgQ@CjO_sbgVMiE5M5t*oU+T_xt18jY4p-f1+Oi>u16Hdh)dML*z1 zYq_HA+MP;EC04I5EH_kQsnKpMt6Xzo{`#_>!fX7X#~OH4ZtZ+763R4sbv4>2ci?{KepanbQwwnM9;2laG#h*Wug+=OO>qY pU&2Z2ROxSrXNRi^njtI_*ru*?D^0g!Id);JkSk2nolG*^{{RJEf;|8L literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-37.pyc b/venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45b3bbe4b69e71265b31a0360299342daa7bacc9 GIT binary patch literal 7516 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 Ct>D%G literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-37.pyc b/venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4454f41ef4b7f2f69d91b6ee9ff96e0bfb581416 GIT binary patch literal 1647 zcma)6&2Aev5GJ`lTCINk)6{JZ7ZrRcAfO452nf)iDe5M1(4y5PY7(dd1Xg6^bymB= zkgDTU>7n+am-ZR#W1pn&z-v!=g`PS?MY0{VKzG663^^o+-+aR_8;z9VS9bpV{-+9K zf042LLR7xMW-JQD6wg_I(epm{w&)8bRFDUgupe^tkP)^RTLoL9LRnRjiceWTRhueN z)l=TDsZ`Z)q^|j4L)BH|l%4Q?Q#I8Zj;^V7wSoP*;*VJSo!59W>%QhF+uYUm3X}E9 zCt1N@a^8ihhP1C^Tz!Lj|O|w>3wPC;G1$J^FdEfrh{oV zy`B}u;s)0bIvsuU#i!2(qcSf+PUMA>6`9Rso*8{(dJGYsvx&_R%8V!6kMu^~#1ZN# z7JsW>QJDv3+p;;E^SKxYCmgmdS9rf)xD|(i3{gfhCLM2|z-`53rP#8G4QU0g3r?bt zSuqS`g?zo&0KKZ-D}Ku>l2x0UQ(HT$+r~LZ1cgjJib40~Cr2QsclTv(bZb-=&+=?! zP3tJL2Q66~w@Q1Up(SB_w+A!bYd2kh!!CU+^O=4CP=X80v2pPt0YG>4h6cDu4H->3 zXsXpRRW-8F04*n1CjClj^^437Ras~kFASG}9%shlJR#l=T~*F(=`-#s82gVJtc!5R zZ0bVV{el621;JcMd3z5vvyFm@O`b$Ck44JkV2gVhgxCX7@83z;!kIUuY!WGl!cvl| zuww(X!X-H)j|5OfLXAX&M4iNnmJ7{C7AsA$b#UG!D2PQdG3f);SCLR@kb8;E?4nqZ z=yy!%OHAlvERH8w9#|@m#>dfEa(#&S+dFiQ4+kL< zJQc8mBdc&wXRB&$q4EEKX`<&PVAjd}Z(zU!<4flXFdyQw5%GXNf^=13AEPl3VRu6+46+?*w!pt9gDM-&opZnyqNvUSJ{+x1Z ZXhDL3CZdit5enaeBuaOZO0$|&{sHo=7f4 z=xMF7OXOm%N#&L+d(6L)Oa6zx=Ct?ZvKR7R&scZ?CnL}6?)Tnwzy7_CZm&*H7Yumf zhyVP;;swL_7YH~9xK3}$!+BOW=dGRn+|dK6kKqJ7gdiNQ@yd)6`WY~b3! zbv%a{+s2@389c|`E`3oDj2QT1CTKY<_r~z@%++n-TjQ@};C*Aj*LnDQ%A4vJy<&gb zo9@qeGcdo?JLi?w4OU=NZwxlYi^rxn%kAD=Z{9l((hGZppZ709?-H~NT5{RDqQ^6Q z_L%HZenrc#LYvC--lCQ}z0W|pm`N8i={4`VmX<(vJ(FF}WM%J$mQ4e_z)O4vTUf*9 zH!{r|ndXvrQ)|K+AL-uAbZ=(5pL@4J=Qix*RwlXSFR&t;2Bf}VGwd9+1#WZ+E3w%( z#JkMq*t|yZGj@Sp1kN>fi7f!<4!g{*K)b}QvPEbs%xoEzYvF(1y?Yn_8^{mn<7S1Z z=|;FK0&&=g1I7g~+=Fl+4~IPIpb9?VeEqINn^-`Y0h5vD-+?IN3uI~X<96+Gax01XEMsIE~JR2 z76hULBOBTrv<`CjY!AYox!{;Q%LA4Lb)~l1Y;88`eyg@suQ&bG=Z_!PxBQLfU!H9%w=9 z6?(KgbrHjaHjkF>++uhC=U=5VC8l9jMZQ(!8-Y$1=o(Q%rrC~%%4+bgRL*KFW!zWx zR=Bq>#Vm*+2Calg-4EQWa=s6^`TjM~NpNolp`-{ui!6|%rL*y_W*;`eEw1kmf7GiM+*miAmb8AhQu#~d4p{ok5rz?$yzg4fbVXAJ(BbNB$ zGANv~R)?jINVF1au#q4DF0rUX9OA;SKn2Ps?!qPTGwrTL=t$$(cugd@OVTkpCdc$O zmFAcp6P>9QOMkDf`s-ZQ;z1Heywwq$4^~IrE*BevZY*4wM_IdZ992x^><0rDabN5#*fooo=f6MvRr09ykb(4*j2iat%f34R5yp7``G zXllobCF~*gU~3-2o(FwDWa4vV-$HU52`-Tm?Y%2!2SXP$6MZoNTQhIo2VMse!w21g zZw=mL4oGG(g&4#L%xt6rZBz?>YZ7;D{z^^?RK*luqJkYj$x2dtKd|!B8K3rXWz^Mh z{sP)|2Q9(}w}&Ea-FMKzQ27gF$e8p9BQHp@2tBCQFNi2(=%5@VbOBqq*en<+(t=4- z!nLMnzqZDvg$2>-IlnTf;S)WkFwW^Ql~4r1XSU3b?Xjs5Fq;A^>kmjO1%Xj75G*l| z1OXNIkYJe;=aFFgrrZEY z2^J)13*bu66U({?g{VMEq(mWXe*^rEMjbkM1mmk=UWHB;1QrAVc}u@fL)d(4jp_FU z3({MQ5$M^{9$RA!6jM558xr1r4Q(%{&kGG%#nmVXj6vmaIQ8Img6>uJnl7!2{^Kx; zvRbw|lEaa#!C4)2Bo`}bEwjH1q7kp;QnW06lsge0?8$v)!`(wjjf|QajQak82&LqM zPbbRROC5trx?E!v7D)k0H6?RItO5ViIDG|@_c*+j@5Oi@J$!~$c5pwqGX$3mL8&g`W;D;C*Db#sn>Z^&sp!ujGojv!TK|R4k(10)m zm^IJ>uPT!&idlyB31`*^Q3`WfEs2^vl~CyRg?qwtF=Z$IZ*pq6s1u+GjUN}h*+qpjs7qeQV#?cFMS|r z00sWrr2}6~>G}NhUZJZ8BB0zCTnu>h@PR6xK9N#?X)n2f*wZE{=gCTQtx;Dw0Y@}k z>(i>Ugwt57o0|>s09Vug#oQLZM9I~U{BSC_mQf9X7j@JveSp=r*g$r!@vOGpYH#WD zSf_(V?iA8kMf6P^ZujZcY8hEc4~PXdhh`a7f_$=|U!n`tp`|&O7N`q9ixji=WQ<(o bQ_!bmCL6(AlabbRT&tLKt-_pJa0~whhVF18 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-37.pyc b/venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..629e7d9159150216d94c3843ef35279b95b3e7c3 GIT binary patch literal 4589 zcmc&&TXWmS6~^L55TqnZRwBi595qgyFikvl)HbP`CX%R&-N;l*NlnG5gQ2*fO&TKA z1z6h}DASqxHR)fF-kSW8%;cdzU|;*BzmTVXX90pD!^vx@!P(o{#kqXvoQ2k=rd$ob z-tzZf-hM^X{!4?w&qQYhPe_DooCVr3t23r;Xx42oixmC|` zyYBE@Jf{wb>i5Nskhf9lyO(X|WEf=KYdELgb?|IVo zyyG742h=Zm-rxF-AYHN6wpS~kNpo#`e?wYZwT+FcG%E+IRcX{V)@APD>efbeZ&lg{ z8{6AEUq}-y2j6PqWxPX?9}g<`4);S}goohWdhpfVJL?;}hpQ(i>y4;!xZP_ug2O%k z_~h`Uee!<08%B*Fc>nS8vVZs4?^=gVQmS#>7pj%;E`2`b2OwHzF=+w?a(cfDFau`U?%1Ft~{ph~qX|i!X79 z=U*@&qvb?_KN0nYT>;?XA zQ}}*&t>0?-;z767llJc3`p*8IEIeI}BGEqTM}7!&bHCN-2a(K&e&jW<5=zT!^@J~{ z25ZUC@{StKCs$_G(Dp(Cft=2mldGG0h}%ToA@VNGGVx35 zXHh7WX!%D2L(ra(?5eTT*?~maYE!LXk=o3scQA+{%nC&DsHcC5bf`uwW|7`8@R)0w znz57*jjEu`Dk$S1c!rXaZ3O8kUL!(+mvtqxwEo@*`u>>c;ubjG#-k!eV=kM%B6#NC z>SW33y+EHbW{N&CC3N{3Smfw?Mk+6*W(Ac5e5QJ_cmoH>0==f0Krpd#DsjHo1yr~% z#F*4FFMK6i5KvA}WiO7%o^fn8P4Li<+RWt^B*Q-zGBK(98A zX(@gUX4()=gJ^)c&1~IdbNU=REe^m%hx{KjB+MkiG1O2&ZbU~v~iezh@^j}S&r1yA@ZkQ8AhijoUpEMgt~%mBug&@;}Ah@G3U5wi;&@j|k)YS|K$ z5ma^-OX#UIyiu#kh21Pw@A=Q7EGMUc67)i)gR~zvx*TilVk64`ojw%pjCS71@#0uizLy8J$hLM?$%vewA4V5scMOjb04kAnZX{9g1 zp7^{Mwxf2hE7@NpJ18ga5ci13IZ4;Xw2(#0r-Q|Pu%@ml8q<^k<_D@=Wt;3F(k1nf zs*R|sOnK)9)mL~&J2%F?V-6i7J|a06hh7=gY2X&B*$K2ruW@azsqCkWkty|8@C|%q zkbjhqUL7blVMmq$s3OpfR3UH;9itx-A$n?h0pCY<1uv6hI4^j4fy_{mcfB z9hR=ed zjLnV-GZ3}sH5g|w&e0g7T*q3_&TPPiJ<&y-X3lc472Av2nbZ9U^E&1uK*oXb5YSk) zv2qhD23EcqS+THUQov(2k1}G$PMo_i8I4^)PCGALXoI=*gdeb01h17P3p=^Wsm~HY zUjLCTq1;orDU#mtR2ETSO`^}{Pj}m=e&R0WxZh)kv?@D0wRL%YvmFHKjc}(Qo%Ey1 zmWa7xDO6Dcr zlx|D(j&UjI2`;A-hN$QHqJa;d(WEAeYBoKshxdnc>(R^t?E2%>Px5cC}eKZBqI8TSY|3O^Qw65$C5vAg$EgdD<)Ib6qS#Q{oE%z@)} z>gTT}aNsO(j3UO4t)Cz!ol~X68b^nqI#w=@$1i1MK?o4{iKrlcKs^PGKT_{AB2<;q zz!r3S8oE|cQ4yaL`4f>b54nkHgLc>d7nZ{%kjy{IH*=sRTs{?5zB!#6#P@J>R*RH07t>M9L4iPVVf68STcp^a6K zzC*-K5E_N_1>opT(J>s$wcG;!Y}aud*L59t$$dp};X*jyirbQlIw8ZIzCi X^bYBKocu@Q6LNyOc^A!6p=A9JmJ6@F literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/colorama/ansi.py b/venv/Lib/site-packages/colorama/ansi.py new file mode 100644 index 00000000..78776588 --- /dev/null +++ b/venv/Lib/site-packages/colorama/ansi.py @@ -0,0 +1,102 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +''' +This module generates ANSI character codes to printing colors to terminals. +See: http://en.wikipedia.org/wiki/ANSI_escape_code +''' + +CSI = '\033[' +OSC = '\033]' +BEL = '\007' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/venv/Lib/site-packages/colorama/ansitowin32.py b/venv/Lib/site-packages/colorama/ansitowin32.py new file mode 100644 index 00000000..7d56622e --- /dev/null +++ b/venv/Lib/site-packages/colorama/ansitowin32.py @@ -0,0 +1,249 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style +from .winterm import WinTerm, WinColor, WinStyle +from .win32 import windll, winapi_test + + +winterm = None +if windll is not None: + winterm = WinTerm() + + +class StreamWrapper(object): + ''' + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()', which is delegated to our + Converter instance. + ''' + def __init__(self, wrapped, converter): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + self.__convertor = converter + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def __enter__(self, *args, **kwargs): + # special method lookup bypasses __getattr__/__getattribute__, see + # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit + # thus, contextlib magic methods are not proxied via __getattr__ + return self.__wrapped.__enter__(*args, **kwargs) + + def __exit__(self, *args, **kwargs): + return self.__wrapped.__exit__(*args, **kwargs) + + def write(self, text): + self.__convertor.write(text) + + def isatty(self): + stream = self.__wrapped + if 'PYCHARM_HOSTED' in os.environ: + if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): + return True + return (hasattr(stream, 'isatty') and stream.isatty()) + + @property + def closed(self): + stream = self.__wrapped + return not hasattr(stream, 'closed') or stream.closed + + +class AnsiToWin32(object): + ''' + Implements a 'write()' method which, on Windows, will strip ANSI character + sequences from the text, and if outputting to a tty, will convert them into + win32 function calls. + ''' + ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer + ANSI_OSC_RE = re.compile('\001?\033\\]((?:.|;)*?)(\x07)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + + # should we strip ANSI sequences from our output? + if strip is None: + strip = conversion_supported or (not self.stream.closed and not self.stream.isatty()) + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = conversion_supported and not self.stream.closed and self.stream.isatty() + self.convert = convert + + # dict of ansi codes to win32 functions and parameters + self.win32_calls = self.get_win32_calls() + + # are we wrapping stderr? + self.on_stderr = self.wrapped is sys.stderr + + def should_wrap(self): + ''' + True if this class is actually needed. If false, then the output + stream will not be affected, nor will win32 calls be issued, so + wrapping stdout is not actually required. This will generally be + False on non-Windows platforms, unless optional functionality like + autoreset has been requested using kwargs to init() + ''' + return self.convert or self.strip or self.autoreset + + def get_win32_calls(self): + if self.convert and winterm: + return { + AnsiStyle.RESET_ALL: (winterm.reset_all, ), + AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), + AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), + AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), + AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), + AnsiFore.RED: (winterm.fore, WinColor.RED), + AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), + AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), + AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), + AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), + AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), + AnsiFore.WHITE: (winterm.fore, WinColor.GREY), + AnsiFore.RESET: (winterm.fore, ), + AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), + AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), + AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), + AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), + AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), + AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), + AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), + AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), + AnsiBack.BLACK: (winterm.back, WinColor.BLACK), + AnsiBack.RED: (winterm.back, WinColor.RED), + AnsiBack.GREEN: (winterm.back, WinColor.GREEN), + AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), + AnsiBack.BLUE: (winterm.back, WinColor.BLUE), + AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), + AnsiBack.CYAN: (winterm.back, WinColor.CYAN), + AnsiBack.WHITE: (winterm.back, WinColor.GREY), + AnsiBack.RESET: (winterm.back, ), + AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), + AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), + AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), + AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), + AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), + AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), + AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), + AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), + } + return dict() + + def write(self, text): + if self.strip or self.convert: + self.write_and_convert(text) + else: + self.wrapped.write(text) + self.wrapped.flush() + if self.autoreset: + self.reset_all() + + + def reset_all(self): + if self.convert: + self.call_win32('m', (0,)) + elif not self.strip and not self.stream.closed: + self.wrapped.write(Style.RESET_ALL) + + + def write_and_convert(self, text): + ''' + Write the given text to our wrapped stream, stripping any ANSI + sequences from the text, and optionally converting them into win32 + calls. + ''' + cursor = 0 + text = self.convert_osc(text) + for match in self.ANSI_CSI_RE.finditer(text): + start, end = match.span() + self.write_plain_text(text, cursor, start) + self.convert_ansi(*match.groups()) + cursor = end + self.write_plain_text(text, cursor, len(text)) + + + def write_plain_text(self, text, start, end): + if start < end: + self.wrapped.write(text[start:end]) + self.wrapped.flush() + + + def convert_ansi(self, paramstring, command): + if self.convert: + params = self.extract_params(command, paramstring) + self.call_win32(command, params) + + + def extract_params(self, command, paramstring): + if command in 'Hf': + params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) + while len(params) < 2: + # defaults: + params = params + (1,) + else: + params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) + if len(params) == 0: + # defaults: + if command in 'JKm': + params = (0,) + elif command in 'ABCD': + params = (1,) + + return params + + + def call_win32(self, command, params): + if command == 'm': + for param in params: + if param in self.win32_calls: + func_args = self.win32_calls[param] + func = func_args[0] + args = func_args[1:] + kwargs = dict(on_stderr=self.on_stderr) + func(*args, **kwargs) + elif command in 'J': + winterm.erase_screen(params[0], on_stderr=self.on_stderr) + elif command in 'K': + winterm.erase_line(params[0], on_stderr=self.on_stderr) + elif command in 'Hf': # cursor position - absolute + winterm.set_cursor_position(params, on_stderr=self.on_stderr) + elif command in 'ABCD': # cursor position - relative + n = params[0] + # A - up, B - down, C - forward, D - back + x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] + winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) + + + def convert_osc(self, text): + for match in self.ANSI_OSC_RE.finditer(text): + start, end = match.span() + text = text[:start] + text[end:] + paramstring, command = match.groups() + if command in '\x07': # \x07 = BEL + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text diff --git a/venv/Lib/site-packages/colorama/initialise.py b/venv/Lib/site-packages/colorama/initialise.py new file mode 100644 index 00000000..430d0668 --- /dev/null +++ b/venv/Lib/site-packages/colorama/initialise.py @@ -0,0 +1,80 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import atexit +import contextlib +import sys + +from .ansitowin32 import AnsiToWin32 + + +orig_stdout = None +orig_stderr = None + +wrapped_stdout = None +wrapped_stderr = None + +atexit_done = False + + +def reset_all(): + if AnsiToWin32 is not None: # Issue #74: objects might become None at exit + AnsiToWin32(orig_stdout).reset_all() + + +def init(autoreset=False, convert=None, strip=None, wrap=True): + + if not wrap and any([autoreset, convert, strip]): + raise ValueError('wrap=False conflicts with any other arg=True') + + global wrapped_stdout, wrapped_stderr + global orig_stdout, orig_stderr + + orig_stdout = sys.stdout + orig_stderr = sys.stderr + + if sys.stdout is None: + wrapped_stdout = None + else: + sys.stdout = wrapped_stdout = \ + wrap_stream(orig_stdout, convert, strip, autoreset, wrap) + if sys.stderr is None: + wrapped_stderr = None + else: + sys.stderr = wrapped_stderr = \ + wrap_stream(orig_stderr, convert, strip, autoreset, wrap) + + global atexit_done + if not atexit_done: + atexit.register(reset_all) + atexit_done = True + + +def deinit(): + if orig_stdout is not None: + sys.stdout = orig_stdout + if orig_stderr is not None: + sys.stderr = orig_stderr + + +@contextlib.contextmanager +def colorama_text(*args, **kwargs): + init(*args, **kwargs) + try: + yield + finally: + deinit() + + +def reinit(): + if wrapped_stdout is not None: + sys.stdout = wrapped_stdout + if wrapped_stderr is not None: + sys.stderr = wrapped_stderr + + +def wrap_stream(stream, convert, strip, autoreset, wrap): + if wrap: + wrapper = AnsiToWin32(stream, + convert=convert, strip=strip, autoreset=autoreset) + if wrapper.should_wrap(): + stream = wrapper.stream + return stream diff --git a/venv/Lib/site-packages/colorama/win32.py b/venv/Lib/site-packages/colorama/win32.py new file mode 100644 index 00000000..c2d83603 --- /dev/null +++ b/venv/Lib/site-packages/colorama/win32.py @@ -0,0 +1,152 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. + +# from winbase.h +STDOUT = -11 +STDERR = -12 + +try: + import ctypes + from ctypes import LibraryLoader + windll = LibraryLoader(ctypes.WinDLL) + from ctypes import wintypes +except (AttributeError, ImportError): + windll = None + SetConsoleTextAttribute = lambda *_: None + winapi_test = lambda *_: None +else: + from ctypes import byref, Structure, c_char, POINTER + + COORD = wintypes._COORD + + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + def __str__(self): + return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( + self.dwSize.Y, self.dwSize.X + , self.dwCursorPosition.Y, self.dwCursorPosition.X + , self.wAttributes + , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right + , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X + ) + + _GetStdHandle = windll.kernel32.GetStdHandle + _GetStdHandle.argtypes = [ + wintypes.DWORD, + ] + _GetStdHandle.restype = wintypes.HANDLE + + _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo + _GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + POINTER(CONSOLE_SCREEN_BUFFER_INFO), + ] + _GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute + _SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + ] + _SetConsoleTextAttribute.restype = wintypes.BOOL + + _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition + _SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + COORD, + ] + _SetConsoleCursorPosition.restype = wintypes.BOOL + + _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA + _FillConsoleOutputCharacterA.argtypes = [ + wintypes.HANDLE, + c_char, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputCharacterA.restype = wintypes.BOOL + + _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute + _FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputAttribute.restype = wintypes.BOOL + + _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW + _SetConsoleTitleW.argtypes = [ + wintypes.LPCWSTR + ] + _SetConsoleTitleW.restype = wintypes.BOOL + + def _winapi_test(handle): + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return bool(success) + + def winapi_test(): + return any(_winapi_test(h) for h in + (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = _GetStdHandle(stream_id) + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = _GetStdHandle(stream_id) + return _SetConsoleTextAttribute(handle, attrs) + + def SetConsoleCursorPosition(stream_id, position, adjust=True): + position = COORD(*position) + # If the position is out of range, do nothing. + if position.Y <= 0 or position.X <= 0: + return + # Adjust for Windows' SetConsoleCursorPosition: + # 1. being 0-based, while ANSI is 1-based. + # 2. expecting (x,y), while ANSI uses (y,x). + adjusted_position = COORD(position.Y - 1, position.X - 1) + if adjust: + # Adjust for viewport's scroll position + sr = GetConsoleScreenBufferInfo(STDOUT).srWindow + adjusted_position.Y += sr.Top + adjusted_position.X += sr.Left + # Resume normal processing + handle = _GetStdHandle(stream_id) + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = _GetStdHandle(stream_id) + char = c_char(char.encode()) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + success = _FillConsoleOutputCharacterA( + handle, char, length, start, byref(num_written)) + return num_written.value + + def FillConsoleOutputAttribute(stream_id, attr, length, start): + ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' + handle = _GetStdHandle(stream_id) + attribute = wintypes.WORD(attr) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + return _FillConsoleOutputAttribute( + handle, attribute, length, start, byref(num_written)) + + def SetConsoleTitle(title): + return _SetConsoleTitleW(title) diff --git a/venv/Lib/site-packages/colorama/winterm.py b/venv/Lib/site-packages/colorama/winterm.py new file mode 100644 index 00000000..0fdb4ec4 --- /dev/null +++ b/venv/Lib/site-packages/colorama/winterm.py @@ -0,0 +1,169 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from . import win32 + + +# from wincon.h +class WinColor(object): + BLACK = 0 + BLUE = 1 + GREEN = 2 + CYAN = 3 + RED = 4 + MAGENTA = 5 + YELLOW = 6 + GREY = 7 + +# from wincon.h +class WinStyle(object): + NORMAL = 0x00 # dim text, dim background + BRIGHT = 0x08 # bright text, dim background + BRIGHT_BACKGROUND = 0x80 # dim text, bright background + +class WinTerm(object): + + def __init__(self): + self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes + self.set_attrs(self._default) + self._default_fore = self._fore + self._default_back = self._back + self._default_style = self._style + # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. + # So that LIGHT_EX colors and BRIGHT style do not clobber each other, + # we track them separately, since LIGHT_EX is overwritten by Fore/Back + # and BRIGHT is overwritten by Style codes. + self._light = 0 + + def get_attrs(self): + return self._fore + self._back * 16 + (self._style | self._light) + + def set_attrs(self, value): + self._fore = value & 7 + self._back = (value >> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + self._light = 0 + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + elif mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + elif mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) diff --git a/venv/Lib/site-packages/dotenv/__init__.py b/venv/Lib/site-packages/dotenv/__init__.py new file mode 100644 index 00000000..50f27cd4 --- /dev/null +++ b/venv/Lib/site-packages/dotenv/__init__.py @@ -0,0 +1,40 @@ +from .main import load_dotenv, get_key, set_key, unset_key, find_dotenv, dotenv_values + + +def load_ipython_extension(ipython): + from .ipython import load_ipython_extension + load_ipython_extension(ipython) + + +def get_cli_string(path=None, action=None, key=None, value=None, quote=None): + """Returns a string suitable for running as a shell script. + + Useful for converting a arguments passed to a fabric task + to be passed to a `local` or `run` command. + """ + command = ['dotenv'] + if quote: + command.append('-q %s' % quote) + if path: + command.append('-f %s' % path) + if action: + command.append(action) + if key: + command.append(key) + if value: + if ' ' in value: + command.append('"%s"' % value) + else: + command.append(value) + + return ' '.join(command).strip() + + +__all__ = ['get_cli_string', + 'load_dotenv', + 'dotenv_values', + 'get_key', + 'set_key', + 'unset_key', + 'find_dotenv', + 'load_ipython_extension'] diff --git a/venv/Lib/site-packages/dotenv/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/dotenv/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8d42cf9eb5d7e3e99d04a395824a6119d1ad4cd GIT binary patch literal 1081 zcmZuw&2H2%5VrHXo9$K{P}Kv6s8SD$v@3B%2vJ&8fuIKpmk^Zo#@^k~#7XUB)vi)5 z^vFZBM(4!7@X^-})M+bC+nu}i0 zr`9nVZT`j(aO5);kbOlLqUM_PUu`{SdCOID&joT@O>cYqn zeGq#84GGnpUiD_>N^oSR}#?qukbDN<_H=7}R_+RLuZ){A@E$5d9- zy27=6jjxPr)lX;r{Vgji!KF`pS&D=&d|4$WnWfC1=fW2i=SoSm!IGt^FJqAu<;3%R zAn4<~O0{X6^A!`Nw)TlwR2k!?^a~;-qkfq~hB=vuB=$=pPqa5EXY3z~X{y>k^&#~X za!>s@&oaX4MB4{W+wZkKKJ|Ach&hNG?60kzUAZ$d8;2AHafUJWyZWI9+qv%eV3erN? a+Iy1av`X1i^^3^+zLb8*G1#8s~v*Ss3RH7A;n>s}r9nd2*GFzzid zmzB7&cXfP?8{_L|1}mSLFu%y=Sml(kDyyA3T5q1!*%jD#gI!?@?CLI9W!EOFOT5mm zpAyhpW{d2`PsRzE{=5~wGG5iTme~?pF4nxY^I6z+ldXWg)l;;5ldTmpyUEti|H)hb z^BwFKyFJzNZv7vfJB-eBZu6DBRd$!ng@oNJeAZS!U?0Ns4%;}j*nRfVOrP?*?7_bI zPa=NiD<^*q!%_2vjn07|^|@4~ zU7mOL`9PKAM40O*Q?V-gNhe6-*iTr4sA{Kkz=Z?{I-Q}}><-;#vl~WyXt%)Ym!RSD zqfq8@xcw{*eDsv2T`QoP>jy%J%ztI(+lG$HBfpV_J=- zLSu_g9rz;j-$W=N7A?A2xJKiYaZEz-k1hHV0HiGCMOyrB7yP1`4^Sk#EeN|bfhDjo zuW;cL?9aB$SV zz_)fmsy5KBl?}jT6kfs5T^Nk2ODaUHf)pSJ@p9nCHI2{bAQZT)8pk9jBPjo4^XUG_ z9Ghpxrt!mC+dQ_8?c5sM%p6%GyK62P*tXuTznYO zTjDC%89E#Cvkkf3aKv?Z6__ODggMlpa=`0gU)en9rLew;>o;({J}DVrc32qXitH}S>OdEq%8Q`K9HIzN4qqm3qpaAXgHpMFoVM? zXad040E`6$GDr4_-L{UMV*qL7h%a(;Y%#qug(WHHHnUFvAm#wM+~L{|f}vsA4G(y7 z85MC2Y)+sNCde~<&?|8hhjkbLo1-vqxCJ(Mary%s5GApM3MJVO0xsocbS&U;0~BNp z2E(lYBNmBG7EN&<-UGCWmksv}h)>{U280RWo4^cU!pIU2b7Z>0+8J)V z;JFB)7wEV(;Is=>gq1%-;Q}izhK|0Rhb}&Z*M|LG`%MteL!RZ{DuN$bCl-`~eN0BS_+*;*q7?p+^Q9L&P7k1E{Ykt< zzL$53Ty^_VG@wGOGrA!!!hqbo48x>2Gy!J07aORFo#nl%aCFbwg2^KD8iWOaVZjs+ zVAfj-cN5@dr=RR6>0#0-4mjB$-a?QjIX}ufK%E>KtyI;?Q51yGQ8YXmmU+hYO z-$NH5#lqH*Ug$2GMbKTKT;zj-L)b^4Tr_iX2N?w%vvV8D3=62>(#Lq*POKM)F`Q?i zNRt>3tm!!d$GG4UW+tqr?Ed#bVLdR|5rgEnf`ym|IjeE*WrLyEeYMZM1G|p0yZwZkK<;t9KA(V3{ zpc!hiD;qcJ4k>gkAX9~=13D=daKK)toL!OjGvyY!Q+DR(J!S8uVWM0pf#8rS`x}_^ z+$X&>47gXHenu2Kyjtc<2_G6d-}~av!nQ?LuGy74)gT+WzLn^Cw$7 zJ6oHxfD=FFoz8nuY0z|+Ez7O;RIuQZpCKbyBljvI6kop;g!8 cQrRU7b1nc|BkMJMuECK8W33M3?OKKW4#KhN{r~^~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/dotenv/__pycache__/compat.cpython-37.pyc b/venv/Lib/site-packages/dotenv/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5847a15237ae979ab3e6039e8dc99e0f0eeebb05 GIT binary patch literal 270 zcmZ?b<>g`kf-OBKqSJx&V-N=hIDiZXATBlo5|sie3@MB`47m(Z42%rn40#GH45^IS zTtx{1T{_L6h+oM{r3|W?s6dzn>;^5ff1C7Pn_^ zL4Hw*Yf({t(JiLT{FMwvtUz%v@hjTdDkiizwWv78*U{bGv(8Y@#Wgs_v7o>uu_Q6Z zCqFqcCnh8{w;-kg5B$yZl82K0h%11>j literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/dotenv/__pycache__/ipython.cpython-37.pyc b/venv/Lib/site-packages/dotenv/__pycache__/ipython.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36cc9e1843911ae3996ca92b5101560511ba9062 GIT binary patch literal 1512 zcmZWpOOG5i5VqU>nw}@oCLCB$ODKxwFe7mV6cVzl)ka7a_2|z8+_%IzmOAU_Y5rH?kc;w+~umzpZ$5iA0TMI|NO`I0|%i$wXttt zqbDGOf})7x92GdiSdXpTDo8{MJF*KWa?Cf9yM-5dg&+AvC+fgAn>u+=bfa$3i+UI_ z=LAugdN+uAjBLpkM}6wk&JBtNG&o1&?i*MMjj zhc{@8_fO=}5mfz->Yu(?%SBZlRr0u8HP)nRg2|*>G0ro}R3K!d-PUPY({;aX5095nIIZJrD2(uF2l(R&@+W9(MWS0xZ!+Dic#s%~|lnWNV zx)bEp*j7%d_d(fmT{GoTHcythas~i;dldXV(Blr*St+-zh>yVFnjOkJ{qmUeiYv!Zmv^=2zE%%FLD9Bg z`CQqWzRK41o1cF}{C)7hojv<__O$@eX3w9VoSgpj(e&u}eD<`ij}n>8zNlbtW-nP$ z&+4q6WTlX>SCd6~mDTIj)vPw`nY2mGb{)7hr>6CqzY9zBL4?j1^?R0!Ej+>l>|>WS z2mfN?=Qx%cNj&tb#Z$D!R<|xEIGiE|a|Va1R1<7nCA!vbf$ivz#gGj`~15 zdZ08~;sBISY{IjJga%{D|QLY2hM4p zJ#14C&EcP(jjd?NcmDRq5GMW@N8S#c|0Jj$m>Xc{jM)`j3j*$+N3gaq)U^1AFg_a( zH6-(;T*A4GxpqbOb}&v;IIL5X1J~KNnCQziI{g2Xf9@!QVvDEYm|Y}UX~@-*NrPur gzmv4)4%g5s|I>DZfc%iFp4+ny@BtZ-9`+Ca0vOhkEC2ui literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/dotenv/__pycache__/main.cpython-37.pyc b/venv/Lib/site-packages/dotenv/__pycache__/main.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..351d8b3d6f939d1083eec1cf86c085d8742454b3 GIT binary patch literal 7727 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 RZhlH>PO2Tqg~dS3003xEH|hWY literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/dotenv/cli.py b/venv/Lib/site-packages/dotenv/cli.py new file mode 100644 index 00000000..4e03c12a --- /dev/null +++ b/venv/Lib/site-packages/dotenv/cli.py @@ -0,0 +1,98 @@ +import os +import sys + +try: + import click +except ImportError: + sys.stderr.write('It seems python-dotenv is not installed with cli option. \n' + 'Run pip install "python-dotenv[cli]" to fix this.') + sys.exit(1) + +from .main import dotenv_values, get_key, set_key, unset_key, run_command +from .version import __version__ + + +@click.group() +@click.option('-f', '--file', default=os.path.join(os.getcwd(), '.env'), + type=click.Path(exists=True), + help="Location of the .env file, defaults to .env file in current working directory.") +@click.option('-q', '--quote', default='always', + type=click.Choice(['always', 'never', 'auto']), + help="Whether to quote or not the variable values. Default mode is always. This does not affect parsing.") +@click.version_option(version=__version__) +@click.pass_context +def cli(ctx, file, quote): + '''This script is used to set, get or unset values from a .env file.''' + ctx.obj = {} + ctx.obj['FILE'] = file + ctx.obj['QUOTE'] = quote + + +@cli.command() +@click.pass_context +def list(ctx): + '''Display all the stored key/value.''' + file = ctx.obj['FILE'] + dotenv_as_dict = dotenv_values(file) + for k, v in dotenv_as_dict.items(): + click.echo('%s=%s' % (k, v)) + + +@cli.command() +@click.pass_context +@click.argument('key', required=True) +@click.argument('value', required=True) +def set(ctx, key, value): + '''Store the given key/value.''' + file = ctx.obj['FILE'] + quote = ctx.obj['QUOTE'] + success, key, value = set_key(file, key, value, quote) + if success: + click.echo('%s=%s' % (key, value)) + else: + exit(1) + + +@cli.command() +@click.pass_context +@click.argument('key', required=True) +def get(ctx, key): + '''Retrieve the value for the given key.''' + file = ctx.obj['FILE'] + stored_value = get_key(file, key) + if stored_value: + click.echo('%s=%s' % (key, stored_value)) + else: + exit(1) + + +@cli.command() +@click.pass_context +@click.argument('key', required=True) +def unset(ctx, key): + '''Removes the given key.''' + file = ctx.obj['FILE'] + quote = ctx.obj['QUOTE'] + success, key = unset_key(file, key, quote) + if success: + click.echo("Successfully removed %s" % key) + else: + exit(1) + + +@cli.command(context_settings={'ignore_unknown_options': True}) +@click.pass_context +@click.argument('commandline', nargs=-1, type=click.UNPROCESSED) +def run(ctx, commandline): + """Run command with environment variables present.""" + file = ctx.obj['FILE'] + dotenv_as_dict = dotenv_values(file) + if not commandline: + click.echo('No command given.') + exit(1) + ret = run_command(commandline, dotenv_as_dict) + exit(ret) + + +if __name__ == "__main__": + cli() diff --git a/venv/Lib/site-packages/dotenv/compat.py b/venv/Lib/site-packages/dotenv/compat.py new file mode 100644 index 00000000..c4a481e6 --- /dev/null +++ b/venv/Lib/site-packages/dotenv/compat.py @@ -0,0 +1,4 @@ +try: + from StringIO import StringIO # noqa +except ImportError: + from io import StringIO # noqa diff --git a/venv/Lib/site-packages/dotenv/ipython.py b/venv/Lib/site-packages/dotenv/ipython.py new file mode 100644 index 00000000..06252f1e --- /dev/null +++ b/venv/Lib/site-packages/dotenv/ipython.py @@ -0,0 +1,41 @@ +from __future__ import print_function + +from IPython.core.magic import Magics, line_magic, magics_class +from IPython.core.magic_arguments import (argument, magic_arguments, + parse_argstring) + +from .main import find_dotenv, load_dotenv + + +@magics_class +class IPythonDotEnv(Magics): + + @magic_arguments() + @argument( + '-o', '--override', action='store_true', + help="Indicate to override existing variables" + ) + @argument( + '-v', '--verbose', action='store_true', + help="Indicate function calls to be verbose" + ) + @argument('dotenv_path', nargs='?', type=str, default='.env', + help='Search in increasingly higher folders for the `dotenv_path`') + @line_magic + def dotenv(self, line): + args = parse_argstring(self.dotenv, line) + # Locate the .env file + dotenv_path = args.dotenv_path + try: + dotenv_path = find_dotenv(dotenv_path, True, True) + except IOError: + print("cannot find .env file") + return + + # Load the .env file + load_dotenv(dotenv_path, verbose=args.verbose, override=args.override) + + +def load_ipython_extension(ipython): + """Register the %dotenv magic.""" + ipython.register_magics(IPythonDotEnv) diff --git a/venv/Lib/site-packages/dotenv/main.py b/venv/Lib/site-packages/dotenv/main.py new file mode 100644 index 00000000..4bf72946 --- /dev/null +++ b/venv/Lib/site-packages/dotenv/main.py @@ -0,0 +1,303 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import, print_function, unicode_literals + +import codecs +import fileinput +import io +import os +import re +import sys +from subprocess import Popen, PIPE, STDOUT +import warnings +from collections import OrderedDict + +from .compat import StringIO + +__escape_decoder = codecs.getdecoder('unicode_escape') +__posix_variable = re.compile('\$\{[^\}]*\}') + + +def decode_escaped(escaped): + return __escape_decoder(escaped)[0] + + +def parse_line(line): + line = line.strip() + + # Ignore lines with `#` or which doesn't have `=` in it. + if not line or line.startswith('#') or '=' not in line: + return None, None + + k, v = line.split('=', 1) + + if k.startswith('export '): + (_, _, k) = k.partition('export ') + + # Remove any leading and trailing spaces in key, value + k, v = k.strip(), v.strip() + + if v: + v = v.encode('unicode-escape').decode('ascii') + quoted = v[0] == v[-1] in ['"', "'"] + if quoted: + v = decode_escaped(v[1:-1]) + + return k, v + + +class DotEnv(): + + def __init__(self, dotenv_path, verbose=False): + self.dotenv_path = dotenv_path + self._dict = None + self.verbose = verbose + + def _get_stream(self): + self._is_file = False + if isinstance(self.dotenv_path, StringIO): + return self.dotenv_path + + if os.path.exists(self.dotenv_path): + self._is_file = True + return io.open(self.dotenv_path) + + if self.verbose: + warnings.warn("File doesn't exist {}".format(self.dotenv_path)) + + return StringIO('') + + def dict(self): + """Return dotenv as dict""" + if self._dict: + return self._dict + + values = OrderedDict(self.parse()) + self._dict = resolve_nested_variables(values) + return self._dict + + def parse(self): + f = self._get_stream() + + for line in f: + key, value = parse_line(line) + if not key: + continue + + yield key, value + + if self._is_file: + f.close() + + def set_as_environment_variables(self, override=False): + """ + Load the current dotenv as system environemt variable. + """ + for k, v in self.dict().items(): + if k in os.environ and not override: + continue + os.environ[k] = v + + return True + + def get(self, key): + """ + """ + data = self.dict() + + if key in data: + return data[key] + + if self.verbose: + warnings.warn("key %s not found in %s." % (key, self.dotenv_path)) + + +def get_key(dotenv_path, key_to_get): + """ + Gets the value of a given key from the given .env + + If the .env path given doesn't exist, fails + """ + return DotEnv(dotenv_path, verbose=True).get(key_to_get) + + +def set_key(dotenv_path, key_to_set, value_to_set, quote_mode="always"): + """ + Adds or Updates a key/value to the given .env + + If the .env path given doesn't exist, fails instead of risking creating + an orphan .env somewhere in the filesystem + """ + value_to_set = value_to_set.strip("'").strip('"') + if not os.path.exists(dotenv_path): + warnings.warn("can't write to %s - it doesn't exist." % dotenv_path) + return None, key_to_set, value_to_set + + if " " in value_to_set: + quote_mode = "always" + + line_template = '{}="{}"' if quote_mode == "always" else '{}={}' + line_out = line_template.format(key_to_set, value_to_set) + + replaced = False + for line in fileinput.input(dotenv_path, inplace=True): + k, v = parse_line(line) + if k == key_to_set: + replaced = True + line = line_out + print(line, end='') + + if not replaced: + with io.open(dotenv_path, "a") as f: + f.write("{}\n".format(line_out)) + + return True, key_to_set, value_to_set + + +def unset_key(dotenv_path, key_to_unset, quote_mode="always"): + """ + Removes a given key from the given .env + + If the .env path given doesn't exist, fails + If the given key doesn't exist in the .env, fails + """ + removed = False + + if not os.path.exists(dotenv_path): + warnings.warn("can't delete from %s - it doesn't exist." % dotenv_path) + return None, key_to_unset + + for line in fileinput.input(dotenv_path, inplace=True): + k, v = parse_line(line) + if k == key_to_unset: + removed = True + line = '' + print(line, end='') + + if not removed: + warnings.warn("key %s not removed from %s - key doesn't exist." % (key_to_unset, dotenv_path)) + return None, key_to_unset + + return removed, key_to_unset + + +def resolve_nested_variables(values): + def _replacement(name): + """ + get appropriate value for a variable name. + first search in environ, if not found, + then look into the dotenv variables + """ + ret = os.getenv(name, values.get(name, "")) + return ret + + def _re_sub_callback(match_object): + """ + From a match object gets the variable name and returns + the correct replacement + """ + return _replacement(match_object.group()[2:-1]) + + for k, v in values.items(): + values[k] = __posix_variable.sub(_re_sub_callback, v) + + return values + + +def _walk_to_root(path): + """ + Yield directories starting from the given directory up to the root + """ + if not os.path.exists(path): + raise IOError('Starting path not found') + + if os.path.isfile(path): + path = os.path.dirname(path) + + last_dir = None + current_dir = os.path.abspath(path) + while last_dir != current_dir: + yield current_dir + parent_dir = os.path.abspath(os.path.join(current_dir, os.path.pardir)) + last_dir, current_dir = current_dir, parent_dir + + +def find_dotenv(filename='.env', raise_error_if_not_found=False, usecwd=False): + """ + Search in increasingly higher folders for the given file + + Returns path to the file if found, or an empty string otherwise + """ + if usecwd or '__file__' not in globals(): + # should work without __file__, e.g. in REPL or IPython notebook + path = os.getcwd() + else: + # will work for .py files + frame = sys._getframe() + # find first frame that is outside of this file + while frame.f_code.co_filename == __file__: + frame = frame.f_back + frame_filename = frame.f_code.co_filename + path = os.path.dirname(os.path.abspath(frame_filename)) + + for dirname in _walk_to_root(path): + check_path = os.path.join(dirname, filename) + if os.path.exists(check_path): + return check_path + + if raise_error_if_not_found: + raise IOError('File not found') + + return '' + + +def load_dotenv(dotenv_path=None, stream=None, verbose=False, override=False): + f = dotenv_path or stream or find_dotenv() + return DotEnv(f, verbose=verbose).set_as_environment_variables(override=override) + + +def dotenv_values(dotenv_path=None, stream=None, verbose=False): + f = dotenv_path or stream or find_dotenv() + return DotEnv(f, verbose=verbose).dict() + + +def run_command(command, env): + """Run command in sub process. + + Runs the command in a sub process with the variables from `env` + added in the current environment variables. + + Parameters + ---------- + command: List[str] + The command and it's parameters + env: Dict + The additional environment variables + + Returns + ------- + int + The return code of the command + + """ + # copy the current environment variables and add the vales from + # `env` + cmd_env = os.environ.copy() + cmd_env.update(env) + + p = Popen(command, + stdin=PIPE, + stdout=PIPE, + stderr=STDOUT, + universal_newlines=True, + bufsize=0, + shell=False, + env=cmd_env) + try: + out, _ = p.communicate() + print(out) + except Exception: + warnings.warn('An error occured, running the command:') + out, _ = p.communicate() + warnings.warn(out) + + return p.returncode diff --git a/venv/Lib/site-packages/dotenv/version.py b/venv/Lib/site-packages/dotenv/version.py new file mode 100644 index 00000000..d69d16e9 --- /dev/null +++ b/venv/Lib/site-packages/dotenv/version.py @@ -0,0 +1 @@ +__version__ = "0.9.1" diff --git a/venv/Lib/site-packages/easy_install.py b/venv/Lib/site-packages/easy_install.py new file mode 100644 index 00000000..d87e9840 --- /dev/null +++ b/venv/Lib/site-packages/easy_install.py @@ -0,0 +1,5 @@ +"""Run the EasyInstall command""" + +if __name__ == '__main__': + from setuptools.command.easy_install import main + main() diff --git a/venv/Lib/site-packages/flask/__init__.py b/venv/Lib/site-packages/flask/__init__.py new file mode 100644 index 00000000..ded19822 --- /dev/null +++ b/venv/Lib/site-packages/flask/__init__.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +""" + flask + ~~~~~ + + A microframework based on Werkzeug. It's extensively documented + and follows best practice patterns. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +__version__ = '1.0.2' + +# utilities we import from Werkzeug and Jinja2 that are unused +# in the module but are exported as public interface. +from werkzeug.exceptions import abort +from werkzeug.utils import redirect +from jinja2 import Markup, escape + +from .app import Flask, Request, Response +from .config import Config +from .helpers import url_for, flash, send_file, send_from_directory, \ + get_flashed_messages, get_template_attribute, make_response, safe_join, \ + stream_with_context +from .globals import current_app, g, request, session, _request_ctx_stack, \ + _app_ctx_stack +from .ctx import has_request_context, has_app_context, \ + after_this_request, copy_current_request_context +from .blueprints import Blueprint +from .templating import render_template, render_template_string + +# the signals +from .signals import signals_available, template_rendered, request_started, \ + request_finished, got_request_exception, request_tearing_down, \ + appcontext_tearing_down, appcontext_pushed, \ + appcontext_popped, message_flashed, before_render_template + +# We're not exposing the actual json module but a convenient wrapper around +# it. +from . import json + +# This was the only thing that Flask used to export at one point and it had +# a more generic name. +jsonify = json.jsonify + +# backwards compat, goes away in 1.0 +from .sessions import SecureCookieSession as Session +json_available = True diff --git a/venv/Lib/site-packages/flask/__main__.py b/venv/Lib/site-packages/flask/__main__.py new file mode 100644 index 00000000..4aee6543 --- /dev/null +++ b/venv/Lib/site-packages/flask/__main__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +""" + flask.__main__ + ~~~~~~~~~~~~~~ + + Alias for flask.run for the command line. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +if __name__ == '__main__': + from .cli import main + main(as_module=True) diff --git a/venv/Lib/site-packages/flask/__pycache__/__init__.cpython-37.pyc b/venv/Lib/site-packages/flask/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d02511d57016d5aa81871ad73021d468936b64f GIT binary patch literal 1833 zcmZ8hTW=Fb6kcD~v7L+K+<*YX9YbQ`01ZuPRR|Oz0jda9rKzRScz0}XJhQvZj7h=+ z@BJzKh`#it|6v~6C;md8dd|iU(2@N4oNvya`|jh}*{TQUkIrAe{a*IGe^8m8JP1F+ z&)mv+Ug%LT%+Xw!4+}D{3bc^(KrYInD$!CVmt0Nb?-c$GK{p^`}`HkA4J2_A696X>8 zpvndLt=gsE!EJ*+3>WvkR&)F}bgfF@^d&c=O!|PQnu(8yiUOVVHCN&=(Ie91Mua4Z z$*)3>-iz^|O~`Y5!w_*~MQoyXLLQSa3C2pqR)m=o9*3l#NSPcO(i6s#RP(?_fgmZj zR_NHYPonJxNqVfK!O-rKKR=S~t?XC9qCn(lyZvW8Rw6+WDwVtu#ZDG zV?-RXek6r!o`^b8>?BsAkKNKhSeBWJkSSpd9|+@CkhMakl3T%`IXdc%t#Gr7j|9_` zz~G$s1v^Nh7@S)TEn$a|9kL*So*&s(+0}xv)-VCa)70e#&exOdeFL$gBzBA7E-Q!y z_J|qFgOQs<^Ur##=$b=rJ{z96ck@VQmJ?!;_hF384x>|Jw~n)9(=<+FO)|{6na6T0 zQXR$E`gzDTL=ThF-OB$6NDxd1t(t3?Xb^J=3A}^R@*Xs}F?|d&MK>ZuhbP5BVH)<( zEli1i6h~$V%<>?yr=^LbK%^G?vNSb>O~a5ZOb%nW3gu3^3rT))(fHyb9cPZeqLMVl zbS4v?PTZ~Z1S|`V^sBmIrHTh8iQ&JwFQ9p1FG)s`*gqNCn^&#xozEbpfH7BN?48g! zOvY&QaQZ%;mSQx173tjR&Dg@bpbJQr52E;hZ|fo`x`a#t3ei5Q6@(c8SB8>dy)}M! zoj(*Zg?PG#_jQC>ggJzHgaw2K!XiQw!1)82^k7_i38`g-6@*oUHH0$&t^iA@&!Tz` zVIAQ-0Il|>Yhv_;jF=1?Mx!sH89~;cY=ypr)MbP#2v-rVAzVkefp8O{g>VbuHh}Z= z2K-SUn;-R$U1jo`7`=(t{$v1j4h=r9-bYXGpbvz9-|X#ne=*RZ?#oBdo<0B2X+L?o z-+h#(Pq^jX7fHZn_YEv~H;vNGD2C0Ha4?0E+oyv7W2v7V=Ag8wHYI%Y#<9=hutnLOu5%7T-Aj literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/flask/__pycache__/__main__.cpython-37.pyc b/venv/Lib/site-packages/flask/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b668d5be2da2aeee6910bcb060f64c0972d28cb8 GIT binary patch literal 460 zcmY*W-AcnS6i(XeW^wNj6oi5+t2as!aes`#975;KEQHu(E-Yzl(}BC$8~7l50584q z#&_tgSH6N*rrmbo2l;Z&;XBEflTM>y1C0;w>+uu<@LeW*m^!%COPy(=Uk|h~kBGuDp-aKWj#bn! zrb&cx*$@-SbYw$oM1&J2 t(=g>}lgBF84`_NXO7W}9*RY!3j`z;obXC-^w^nY-pHqjLETayO;UD|wgcAS& literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/flask/__pycache__/_compat.cpython-37.pyc b/venv/Lib/site-packages/flask/__pycache__/_compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27349ad76e3e470dc728ed5a67faa81e02ef46b0 GIT binary patch literal 3237 zcmbVO-EtH+7M8kuei;uKjKSb+lZ2)D!I!(0=~>cRewPV5u`^16<$JnRMJPDpmRj{+g{HXfhavAy+Hc0{im3JE)L^`XI4|c%Z?c94&P>)y)Qy<-@D*=fl6T;;->WoWy3x^iG~<%CL=4OTn^~g-jb2=Q)f-_9S)t zA4{cUSj+lM$Gc2t?1_Zc^v{NEg^wjO851&>=^;QaqqrYOY`o85z~0!j3w;)&EFY?P zbIUBUfB(R)URk)pHipb>Nwyj$i8PuS84lWR<6;s=GSzaC-Rj=H#I%&`?wzIOPIsC0 zGsOm(0$rpD<3zXXKcO3Te)2#@K#?ohVqJo&0}%TJIHa8)Kv=q~e3)|Lf8C|U^?zu% z?E1Z%D=T-tS!my0?yld=^V^{b*Y9Rgn5?hKLB5{H`Q(h8XRHDitj;V(#IQ1IPF`(dcdO$|hsoC;u5F4p%uq}rgRTeK) zR;5F{Ip{d_-vO*Du*sGmhsllvWQDQ&D(nmYH+Bg$AN&^d#Y1SgSaVaF{!WsFYEy#? z!A!LazL;*_`8+~~uwXl3YaRys^by(jwrgr;pFXGi-T{3|_o0fy$iUtd=SGE*+z6v> z&TaEaY_?v^w0!HC+?E^((A{{609#Q~g|U_l4%28kLhJBTXP|eCYjiqi#42>agydkX z0^9=)SeWluNxlTTerdqp0IehFYi)P=_rlf?_H|}!AEJVh>R`69$@V@Fvd_kZy=U@E z%;|TDnT=06St?tLbykphZ0*%F&N>>wx`b1FM4n*}Dny0fIkp8IqKg_e-4(D789FC}PT;*JyhkZbfA0_%FY&-KRv=8vG!o8~KUg+DCOX3A_4dYe6 z3u1+QOTMLjcu;|ts_+aM`Co&?2oUhN#^fM?%a``vSyD1Il7%kAvk0CG%`gIBW&n0` z6YU5fCj}3~qA~0x=|L#+J)0u=kb=r57+0LMBrYa*G99tQa*Kv)p$OrQeZ# ze}qu9<2Y&s3iE*t(r_Sc-E7608 z??B(4ge(ZpY^a9Z5k7{off?q~0k`}D&H>||U!LTyT4b-uNgv}$j^om-uik^vr*=9Y z=0iSydwHDpvt#B(es174^sqzo7V(9K6#;&hi4s_)Yy*C8Q%$_^*B;VBRcZq*lfD}i z!YN$i9KuFINUY(ZW9u{#7z{98njC@4=zlBtUrYdo7>MMNr%oIC+&h4W+$DCeV{39Z z0ybr+Aca@9LLC~TtgnY!Va{uL>aWn)08`V;N`blMZfrRJ0?%>$(Ym)cb*PnF>$FPh zZCF=-MDZsSn4{GK3RLolz^kgifapSXfK^)c+{_wyck4~`QISQE7~Y3}*v3)wSbz25 zRa@h+06O5K3@!mTsTsLzI68=J6bZ)-wDsfE*eMWl6KKUhXf=c9pGASB*$RA|zzb>= zMw&W@Q(l~@DI8%0y6j>r<78-qBuh7KE$WV6TN}t-898_Aox64a^Usz$eD&e#L%y{3 z;NHr8zWm_Mn!+c*ma~mVcn)6OHg9V9crx&%xU5tLH&_GRT=xi5jyUHT)oVqdT}LJL zT@Zm+^_sNm2Q;8%TK0fLV6j0PUcFR?SscBXgMPU>8_)(lRq?0?t23|*M$kJ&e+EAA B$^HNU literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/flask/__pycache__/app.cpython-37.pyc b/venv/Lib/site-packages/flask/__pycache__/app.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..118e98df1421418cce4f8605feca44016bdde4dd GIT binary patch literal 70883 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/flask/__pycache__/blueprints.cpython-37.pyc b/venv/Lib/site-packages/flask/__pycache__/blueprints.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41e8f810a4dde086cdf27139da7fd2cf1ba5d736 GIT binary patch literal 20501 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/flask/__pycache__/cli.cpython-37.pyc b/venv/Lib/site-packages/flask/__pycache__/cli.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..174176194405c36dc9c932add11c1ee37b9fe4b8 GIT binary patch literal 24789 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 wOFucZ6Tf;vycYCa;A21iG literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/flask/__pycache__/config.cpython-37.pyc b/venv/Lib/site-packages/flask/__pycache__/config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ca97ae8652e6054a0a7145a66644a47df7d631c GIT binary patch literal 9999 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 P=&oc`kx{F;xr=`S#!we` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/flask/__pycache__/ctx.cpython-37.pyc b/venv/Lib/site-packages/flask/__pycache__/ctx.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f2370811217eb7a67bba0c96fcea25aba84e23d GIT binary patch literal 13969 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 LxvyH&xykLN literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/flask/__pycache__/logging.cpython-37.pyc b/venv/Lib/site-packages/flask/__pycache__/logging.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b95d70ba11525df1a6ce496784b8566fc66c6b3 GIT binary patch literal 2389 zcmZuzO>f&a7$)U!#ZEu4Zry1dup%*#s!a!UgAfF3^VI@bSHS5CxGpS4q+}(sH{DPUlzix_5BjE7d&!g^kcOWl(BEqBZCTaGKkYPSmSDy$mUhV^b8 zBVJ`SR)34$;BJF8nEe)YZC*N?3s&=N?i`uuA^g2@`(@)H;o67ve}VTM0P9i*&1U7tmN1qYi^!c4xy zR4PJ8Bax0oL=`7o2*^w-0R@;ObyZ*hl~5I>i9;R-gpx^co4^%GLVXpz;!6YoBPu1H zcPPWiF}|edEs+$wh{H&7lELkHax5LG7#Mh-V;e8vcARF!Pm>@DGXMrwf~1EDaeX)p z>3WmXa5^TrM>JtE7vNlP8`3d3q=|y)#+weK29TM?S(i{$WU|-x6ar)t&XxpG%n2B= z$XB!Irc?qEj5D7m3yKt{QFvvM;J%8-MR0fzfCL;Or6dA8rP=0r{7AWX?p)xKqmk(s z$n=Y(Gz1#Q9VuF(dj)Hjn=86Jwu${4j+zsqiA$HN~8jc-d;YCGWzzLqn=4_GEM;=jq~f5)6|rb znqbHlb1?dvi2Bmc%5az9mg_K_pfhxieu3ZD_~_mV7OM*XgaRNUv)+}|frpbrqvOY@8jieo2HVvco^GVur0JfVsl zMsYkb( z7i!maf30i3X=;CY^)-fC(9dWe|A;U;uo%d%jkS&|CQ#eTE$41to7B?Aq6s^TBh{Vp zpT>yVP~^l$*)~XJTK8?oYyD&WZuw< zry(dluZ}KxsJx+nOouAuQ_V3=uu+VvKPRsn6n^A-wuLW^7Qya`3L z@@KsOhzH^iNWwYeY|^cs4}ecDRZ6(tY2jhhd@>l{%|cIel_zvJ=1jN!B36O!glm&N z<&y!Ns?6Q?H^j?ObJOklftyc75;(V|Kar#p^On~gfQ);Gp1i` zrn+4gc0rc-v(mI@=#~H1yFhMg0J_|zGV=BIA%%2JJ8R64ZQFTm;v;VWH@A(v@`?e= zkUy_J`C+HCv6I)KTqCu-V!$vY%5A9NQK9_&3gZFIVl@>(+v=9|7wiUb<3n2%hOaFj zzGLtuEudM^6w*>dwryRjlf*~Ko9=EZ fsIL_AScN}INPY@K+0u#EVQiL~t@;fc!>ar*6|%R! literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/flask/__pycache__/sessions.cpython-37.pyc b/venv/Lib/site-packages/flask/__pycache__/sessions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a9ef0f387190033743a91d6f88c503e78f33932 GIT binary patch literal 12234 zcmb_i-H#jBb>|F+<)vkF;l3uTa`mazI)f)mVi`}CFl_n6i)hKavKaBFA9Y_*pn(4g$@1jS~nOTD{rqCtvUbnx%1uY zH?BK7$4=Cf&I8x?B|43y+i&nlYrfZ&gHWzHx0<)FVgTvf-CW<;YHm2YfpYqRl8%s( z>-p&Zx0ps@t8T>0_ePPsti>(e-;Y9}}lSaeN`q zu15Asmz(hh{UyOL4_0vz6(+`0V*)|+l3xTkt2Y3tC$M%S+5cmBvjk5%vx!=VwJ3tqLwa> z>__saU-%HGyiy9Y1+{FIMD6E=T{tgMdbZFi^L1HNp4m{$CBC!80$Oab%y(6>h`WWK zL$O*_aBn3(*OXnD*gCt2L>le_bnh0th0}$v3E7HMSx((X2=jzL(at4x9ITVcyLh#G zAO`}f?)y;ni1l!dbbYOp@~Y#&K(rgt4Jqr;Ff|HiGjh7_U=T!5c;AEHfHP9)-Z|?js!;h5?B5YsQ*Mo1640>7l>} zZGDETVNKqK_P&lLMJ7@=Sd()aM9LE{1cUZyNS^YCxD8oBjIuF)YmOWn?Y1}YqISFS zu1{tgzSqdUt{3A{ID#sxOVlllK)+fqY6Gg!E&Qx{gK3Eu+HF>bb~|TJ-$dIFrexUG z_|jLAk?}D#Yv$txbfB3L8Ij3cEKZCUM#2({xuJ;Ln$*R18(zzcWWU``&AkXm2ZsGV zy)-qn%eeg!jwzSEIiI|&zb;WkzZprBv7V-ode)V`pXwS(G$o8ZD5>oCaD>!iSFDOvw#?;9&04lt zN4j{N{Ycr~$8jpK>#*Lkqy=wS!coRi!C~WAz)@{2eryQ~LN3LNTO;33{Nwmn>+Bat zgr}mw*^>jQV3E!MKu9^TDS|x+0Pda)9d9=c^S}XsLU3a2X52#{B0@k7$N4dP$cWB} zroj=slPj(T1GqWu4`~>R@a)Xe{b zHU27fJLA9HM$b9dIT~cNIXklJVxFKHZ*&!$IAMw-H>ANpc{6eAy0J}-AcRN-t^+W1 z3GWc~VbF)C26fJ8;C(VeJ0gSrs)6WTdpH^p_S+!lrB29l)m|8v502>XNl#d6)3gOm zie^_Z#%FReYH;gTy*5_|zk~NSUr-(@8{YNv931WpPfNNBfF+MO?t&RdG?gioa*XYtZD^rhF!B~#=u85EG$x(Mxxy%Yovo3TxovmO1 zAm-emoLA#W;257+p}CbXweKFt_5dC_lPzf{+!c9cHKMhUD z-UT=s1}cM{M}a!XoFVx#eE-SF1B%4=4&lwjtwVQq;m4&&ls7erR17&E)k!$VWT6X9 zuSUa+nIRq67bkGwyQXf&2NNJBKdjlgJ!6pBOs0ARPwe7<&M^}+^A;sETR{x?2RQ-b zr>I%i9as`+^#PbMQOQnTA25LPCt7B2rpZ-3QvtM|{vPk&J5DrcGwt-vx}H~~;T*z5 zDRCCS>1%7w^~O8g-<=sqNnv0e2RmTOmR}IAHr#(hI}&R`rO=Lnu5>xTj}3}EUZI4#ubO`Zz&i?RVt z3}2>6Sh&2VE2c`OkreX1!oKm8G67@!@9RC;Jz&V^I(y!sM5xrk079A7JV>5AL8^$%?Tmk< zNN{*M&OoCmYMo|hHWq0`Zk(58Z#LXqHk)zP3sX6%w=wIC#~AA*k5^E4%S+`~8HX$5 zG!|rb-8k`b#$Vu&LMi3%Z*Va&_JLJjLxw#ug?X@`zA-_HJOQ_C2rv5H6b?MkdTYbsB2bc4Z0f07W5s-=N_!;)tTaa7< zo~cBtJv)cbq@I$qokt;}d#BUfXf`+RZ?)I&-~Zv}M*H^tdp9??5E|j0JPtsqn~~zG z!kP6_2$KolL(QJmGp0scYb5F==?haYV`Y;WDXw?So)OjGWY z&FYWw>YE@P!zV!q^%_cEP-*!JVs*Wm2-0Yp^C$N(@C01%H8mOxQlk7|&+AUjzV*sn z25hw!bF|+1!dUw)IA2h7ijBtjmzV!s9e#Q_3DB@X)CDnCQW4h^ze)`36957WQKm+O zbS^h8H=LUSz-Qnfz@uIZt|3q=rx%344+!z{D$7njaS0kbJWzw{EV|pvSMjkRSFXiQ zwuG#Xk{weWj{kl;2R3HtA!0G?<^w`q3aF|96wE>5n0d`m1OSGD?|>o=C}u>mqk#qMRC~=QNbR@Hc~YbVHjI<6_=sjeK%4SlE(^) z7;Qb(_Rx)bbxW7HD3w?5(i^6C+I#0d(v1CEycu4_sZgz2wox;yMa!rfmUY2I)`fa% z)x@1?o47X0_F2Qm{Tx4ks^iQLQE14(1eGsRKQuhcSLSP6-E&dro3V156f1>>6=c?l zWT!UI3aGJRW>zUioXvi8wnUw9G26)y{VDr;aC7^^PABV5%LZSud3q5iTEOI_jn%3JW8Olo}j$sd)`X@40`G$m^^2i=T4X=k<(f|*)u9Q?}3#` z6j3a6PM)V3^lh~NCk|Z;D?@6hV@FPE#P0brqe6NrGx%e3{5PpH-d2ERC!qc*8TF!Q zNJ(b`&oXu(Syk``Kx&*XrD@7kL>iZ!c7PvlZ$G%db@!)pg_Psu#S@%Nzx#UL#piO2 zN$LM@;w9sp()e4aaL$|$UXq)?n8(diT-3>Z3UM>uW!(H7dDz@ofAkRHh@$4S%0;2% zRBX_%z68_GpfXq;$dD#Wyo9pr2C zxF6Su~OAUISOB7%Ogp6$QbKI+Vo@!Whtc3->*|15X~ z!NrPx;U?!TNU4%?3n$#E^-_d?GW2wM=FrN@NlccpjU|?pBu@Ac#An|dB#@ohn*`$& z;J=*5PiY#U1pFO_h1r^D+EGS~@9pwxIiVKLFEx0hv2z*z)VXXS+|t66BJQD@8FevA z{CYM(S~_W`9j6NzzuHj9-x?<2D)i{ zo?>!{H0?JrOO4g>9Hy2bO4f+o^?mXORe%Ri)x&C4M;l__1Z8RxtCs7}rM2K-G#>={L{Ui5S7w@OAUZ>}j zPZABI5DVXkap8eC91^^onIhNzQ7T6UkxxnI)o5Y-`8?#b%OAR$?o zVvul`ly(*=#Amd?ptC8W#BQ8K>1t5A(^>tg4`x&jAM4T)x$da&w1CwS?LWSaCJn#2 z0G*U-sm_z3HSma_6{ipq+dANAv>`)i+FN9N095ZH&0^E0IuT_%x>}Oecz_{J)Qpm9 z3%rjz$n`WWp}3i%CS?GPKQjWU_>kLrLe=D4KWSB2JDjA3%rnYDOh{>ATER?!L{do3 zI>M4)d~PdJ3G! zeKQFbnNe(~p6iqV@+%{x^ItB2{F__#vvU{NXw{30My=Y=>mFcB4ObV`AJOx7=yZop z1o+hlbo!7^n{>KIr!6|s+P$I;6FFk1$-;Nh(8m$dYOs9?OTZN*eKmW*Uc*tb%QzP7 zRohndW*0~HBi(u*M|caT{1O~(tC1yH-mhS{mo18|1&KvqS;OKQZLuj}agDau(Bc|x ztf9p<+D5Y&&)fHqsqA>P4F{ekd1*|c^qtq=ba^0*uum?FIF#KxvpZ~9)=>|;^!9q} zKh_Xi);js!dmRcl*uSJTVZ5xv&9!92*y{D6P;6M3cM(S!$2yMiI!=@@g;m;%LYrCk zu@z&#D2&fcY;WP>8173rP#P2FXBMVi+`^8#Wi0t(=~Q`#T;GnDgojn{sIC17wwYL= z>qoTdAlWnxWA%=0q6F)7nF z7^@K32UWFiz{7D7lE3^(y8jJsx6*f?w6WQszMvk1h`6E!AM(D6_*^3YwDdxI+8_gs z=XCj8(Igb@D2huImO@1iwO+~9XC6?a5ynLnBh;VLjYSE>3I4OqZV|HymKRW#!3H;D z8HbH)6IWFnbc?fz-&`p2Q#sYXdldGh8FdX zEVPx>9ki97SA?0=bZxz7EBuH>Rd~L@eUSjFd{x2KB463Ks_C~sUBLAcJ$=3$tx&ZX zqOGFmRUWlES(ub*>`7$;Kk^yvBZj!^7MV<0*Rf)Y3K(&DoiS;>99I|=%P_Xn1YSu@ zRPEwKTMcQgJhszpsD38rLkT{?Nii%-EtGWeu=U^qtm5vRl{k8bzrbU>#bow{_IwN7^Ck4Zbek4DmtDhhUFkYti} z(JGcv&Z|)gkJ^lyaXx7?(XRh}jqc0_r!#Yd6M2)k2KW?tUG1jg3IKc0_jcf|dhQMF zdB_LF7gIag53zS{>QLAl@n$2{!Fz0XUlXvl@!k!Z{8?PkWHHU6#T83?(Oy>6Ucaa} zNqs_n-oz;}LrylpsCtrxs`+GB-U%3g>ZIgG&ylDx@}|I49yPHplk6IuN}_UGPpx cgl4#a8pOM*kK*d3vwyg{vicW=Tjk>a0XHi%C;$Ke literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/flask/__pycache__/signals.cpython-37.pyc b/venv/Lib/site-packages/flask/__pycache__/signals.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a01660c06ce995942a6c66c8bc61e1944f92529 GIT binary patch literal 2421 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 OcYa}Z;l4ZNF8mvRSmk8^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/flask/__pycache__/testing.cpython-37.pyc b/venv/Lib/site-packages/flask/__pycache__/testing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54514f8a0152656392bcf85c770e58f77d87b20e GIT binary patch literal 7869 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', + endpoint='static', + host=static_host, + view_func=self.send_static_file + ) + + #: The click command line context for this application. Commands + #: registered here show up in the :command:`flask` command once the + #: application has been discovered. The default commands are + #: provided by Flask itself and can be overridden. + #: + #: This is an instance of a :class:`click.Group` object. + self.cli = cli.AppGroup(self.name) + + @locked_cached_property + def name(self): + """The name of the application. This is usually the import name + with the difference that it's guessed from the run file if the + import name is main. This name is used as a display name when + Flask needs the name of the application. It can be set and overridden + to change the value. + + .. versionadded:: 0.8 + """ + if self.import_name == '__main__': + fn = getattr(sys.modules['__main__'], '__file__', None) + if fn is None: + return '__main__' + return os.path.splitext(os.path.basename(fn))[0] + return self.import_name + + @property + def propagate_exceptions(self): + """Returns the value of the ``PROPAGATE_EXCEPTIONS`` configuration + value in case it's set, otherwise a sensible default is returned. + + .. versionadded:: 0.7 + """ + rv = self.config['PROPAGATE_EXCEPTIONS'] + if rv is not None: + return rv + return self.testing or self.debug + + @property + def preserve_context_on_exception(self): + """Returns the value of the ``PRESERVE_CONTEXT_ON_EXCEPTION`` + configuration value in case it's set, otherwise a sensible default + is returned. + + .. versionadded:: 0.7 + """ + rv = self.config['PRESERVE_CONTEXT_ON_EXCEPTION'] + if rv is not None: + return rv + return self.debug + + @locked_cached_property + def logger(self): + """The ``'flask.app'`` logger, a standard Python + :class:`~logging.Logger`. + + In debug mode, the logger's :attr:`~logging.Logger.level` will be set + to :data:`~logging.DEBUG`. + + If there are no handlers configured, a default handler will be added. + See :ref:`logging` for more information. + + .. versionchanged:: 1.0 + Behavior was simplified. The logger is always named + ``flask.app``. The level is only set during configuration, it + doesn't check ``app.debug`` each time. Only one format is used, + not different ones depending on ``app.debug``. No handlers are + removed, and a handler is only added if no handlers are already + configured. + + .. versionadded:: 0.3 + """ + return create_logger(self) + + @locked_cached_property + def jinja_env(self): + """The Jinja2 environment used to load templates.""" + return self.create_jinja_environment() + + @property + def got_first_request(self): + """This attribute is set to ``True`` if the application started + handling the first request. + + .. versionadded:: 0.8 + """ + return self._got_first_request + + def make_config(self, instance_relative=False): + """Used to create the config attribute by the Flask constructor. + The `instance_relative` parameter is passed in from the constructor + of Flask (there named `instance_relative_config`) and indicates if + the config should be relative to the instance path or the root path + of the application. + + .. versionadded:: 0.8 + """ + root_path = self.root_path + if instance_relative: + root_path = self.instance_path + defaults = dict(self.default_config) + defaults['ENV'] = get_env() + defaults['DEBUG'] = get_debug_flag() + return self.config_class(root_path, defaults) + + def auto_find_instance_path(self): + """Tries to locate the instance path if it was not provided to the + constructor of the application class. It will basically calculate + the path to a folder named ``instance`` next to your main file or + the package. + + .. versionadded:: 0.8 + """ + prefix, package_path = find_package(self.import_name) + if prefix is None: + return os.path.join(package_path, 'instance') + return os.path.join(prefix, 'var', self.name + '-instance') + + def open_instance_resource(self, resource, mode='rb'): + """Opens a resource from the application's instance folder + (:attr:`instance_path`). Otherwise works like + :meth:`open_resource`. Instance resources can also be opened for + writing. + + :param resource: the name of the resource. To access resources within + subfolders use forward slashes as separator. + :param mode: resource file opening mode, default is 'rb'. + """ + return open(os.path.join(self.instance_path, resource), mode) + + def _get_templates_auto_reload(self): + """Reload templates when they are changed. Used by + :meth:`create_jinja_environment`. + + This attribute can be configured with :data:`TEMPLATES_AUTO_RELOAD`. If + not set, it will be enabled in debug mode. + + .. versionadded:: 1.0 + This property was added but the underlying config and behavior + already existed. + """ + rv = self.config['TEMPLATES_AUTO_RELOAD'] + return rv if rv is not None else self.debug + + def _set_templates_auto_reload(self, value): + self.config['TEMPLATES_AUTO_RELOAD'] = value + + templates_auto_reload = property( + _get_templates_auto_reload, _set_templates_auto_reload + ) + del _get_templates_auto_reload, _set_templates_auto_reload + + def create_jinja_environment(self): + """Creates the Jinja2 environment based on :attr:`jinja_options` + and :meth:`select_jinja_autoescape`. Since 0.7 this also adds + the Jinja2 globals and filters after initialization. Override + this function to customize the behavior. + + .. versionadded:: 0.5 + .. versionchanged:: 0.11 + ``Environment.auto_reload`` set in accordance with + ``TEMPLATES_AUTO_RELOAD`` configuration option. + """ + options = dict(self.jinja_options) + + if 'autoescape' not in options: + options['autoescape'] = self.select_jinja_autoescape + + if 'auto_reload' not in options: + options['auto_reload'] = self.templates_auto_reload + + rv = self.jinja_environment(self, **options) + rv.globals.update( + url_for=url_for, + get_flashed_messages=get_flashed_messages, + config=self.config, + # request, session and g are normally added with the + # context processor for efficiency reasons but for imported + # templates we also want the proxies in there. + request=request, + session=session, + g=g + ) + rv.filters['tojson'] = json.tojson_filter + return rv + + def create_global_jinja_loader(self): + """Creates the loader for the Jinja2 environment. Can be used to + override just the loader and keeping the rest unchanged. It's + discouraged to override this function. Instead one should override + the :meth:`jinja_loader` function instead. + + The global loader dispatches between the loaders of the application + and the individual blueprints. + + .. versionadded:: 0.7 + """ + return DispatchingJinjaLoader(self) + + def select_jinja_autoescape(self, filename): + """Returns ``True`` if autoescaping should be active for the given + template name. If no template name is given, returns `True`. + + .. versionadded:: 0.5 + """ + if filename is None: + return True + return filename.endswith(('.html', '.htm', '.xml', '.xhtml')) + + def update_template_context(self, context): + """Update the template context with some commonly used variables. + This injects request, session, config and g into the template + context as well as everything template context processors want + to inject. Note that the as of Flask 0.6, the original values + in the context will not be overridden if a context processor + decides to return a value with the same key. + + :param context: the context as a dictionary that is updated in place + to add extra variables. + """ + funcs = self.template_context_processors[None] + reqctx = _request_ctx_stack.top + if reqctx is not None: + bp = reqctx.request.blueprint + if bp is not None and bp in self.template_context_processors: + funcs = chain(funcs, self.template_context_processors[bp]) + orig_ctx = context.copy() + for func in funcs: + context.update(func()) + # make sure the original values win. This makes it possible to + # easier add new variables in context processors without breaking + # existing views. + context.update(orig_ctx) + + def make_shell_context(self): + """Returns the shell context for an interactive shell for this + application. This runs all the registered shell context + processors. + + .. versionadded:: 0.11 + """ + rv = {'app': self, 'g': g} + for processor in self.shell_context_processors: + rv.update(processor()) + return rv + + #: What environment the app is running in. Flask and extensions may + #: enable behaviors based on the environment, such as enabling debug + #: mode. This maps to the :data:`ENV` config key. This is set by the + #: :envvar:`FLASK_ENV` environment variable and may not behave as + #: expected if set in code. + #: + #: **Do not enable development when deploying in production.** + #: + #: Default: ``'production'`` + env = ConfigAttribute('ENV') + + def _get_debug(self): + return self.config['DEBUG'] + + def _set_debug(self, value): + self.config['DEBUG'] = value + self.jinja_env.auto_reload = self.templates_auto_reload + + #: Whether debug mode is enabled. When using ``flask run`` to start + #: the development server, an interactive debugger will be shown for + #: unhandled exceptions, and the server will be reloaded when code + #: changes. This maps to the :data:`DEBUG` config key. This is + #: enabled when :attr:`env` is ``'development'`` and is overridden + #: by the ``FLASK_DEBUG`` environment variable. It may not behave as + #: expected if set in code. + #: + #: **Do not enable debug mode when deploying in production.** + #: + #: Default: ``True`` if :attr:`env` is ``'development'``, or + #: ``False`` otherwise. + debug = property(_get_debug, _set_debug) + del _get_debug, _set_debug + + def run(self, host=None, port=None, debug=None, + load_dotenv=True, **options): + """Runs the application on a local development server. + + Do not use ``run()`` in a production setting. It is not intended to + meet security and performance requirements for a production server. + Instead, see :ref:`deployment` for WSGI server recommendations. + + If the :attr:`debug` flag is set the server will automatically reload + for code changes and show a debugger in case an exception happened. + + If you want to run the application in debug mode, but disable the + code execution on the interactive debugger, you can pass + ``use_evalex=False`` as parameter. This will keep the debugger's + traceback screen active, but disable code execution. + + It is not recommended to use this function for development with + automatic reloading as this is badly supported. Instead you should + be using the :command:`flask` command line script's ``run`` support. + + .. admonition:: Keep in Mind + + Flask will suppress any server error with a generic error page + unless it is in debug mode. As such to enable just the + interactive debugger without the code reloading, you have to + invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. + Setting ``use_debugger`` to ``True`` without being in debug mode + won't catch any exceptions because there won't be any to + catch. + + :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to + have the server available externally as well. Defaults to + ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable + if present. + :param port: the port of the webserver. Defaults to ``5000`` or the + port defined in the ``SERVER_NAME`` config variable if present. + :param debug: if given, enable or disable debug mode. See + :attr:`debug`. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param options: the options to be forwarded to the underlying Werkzeug + server. See :func:`werkzeug.serving.run_simple` for more + information. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment + variables from :file:`.env` and :file:`.flaskenv` files. + + If set, the :envvar:`FLASK_ENV` and :envvar:`FLASK_DEBUG` + environment variables will override :attr:`env` and + :attr:`debug`. + + Threaded mode is enabled by default. + + .. versionchanged:: 0.10 + The default port is now picked from the ``SERVER_NAME`` + variable. + """ + # Change this into a no-op if the server is invoked from the + # command line. Have a look at cli.py for more information. + if os.environ.get('FLASK_RUN_FROM_CLI') == 'true': + from .debughelpers import explain_ignored_app_run + explain_ignored_app_run() + return + + if get_load_dotenv(load_dotenv): + cli.load_dotenv() + + # if set, let env vars override previous values + if 'FLASK_ENV' in os.environ: + self.env = get_env() + self.debug = get_debug_flag() + elif 'FLASK_DEBUG' in os.environ: + self.debug = get_debug_flag() + + # debug passed to method overrides all other sources + if debug is not None: + self.debug = bool(debug) + + _host = '127.0.0.1' + _port = 5000 + server_name = self.config.get('SERVER_NAME') + sn_host, sn_port = None, None + + if server_name: + sn_host, _, sn_port = server_name.partition(':') + + host = host or sn_host or _host + port = int(port or sn_port or _port) + + options.setdefault('use_reloader', self.debug) + options.setdefault('use_debugger', self.debug) + options.setdefault('threaded', True) + + cli.show_server_banner(self.env, self.debug, self.name, False) + + from werkzeug.serving import run_simple + + try: + run_simple(host, port, self, **options) + finally: + # reset the first request information if the development server + # reset normally. This makes it possible to restart the server + # without reloader and that stuff from an interactive shell. + self._got_first_request = False + + def test_client(self, use_cookies=True, **kwargs): + """Creates a test client for this application. For information + about unit testing head over to :ref:`testing`. + + Note that if you are testing for assertions or exceptions in your + application code, you must set ``app.testing = True`` in order for the + exceptions to propagate to the test client. Otherwise, the exception + will be handled by the application (not visible to the test client) and + the only indication of an AssertionError or other exception will be a + 500 status code response to the test client. See the :attr:`testing` + attribute. For example:: + + app.testing = True + client = app.test_client() + + The test client can be used in a ``with`` block to defer the closing down + of the context until the end of the ``with`` block. This is useful if + you want to access the context locals for testing:: + + with app.test_client() as c: + rv = c.get('/?vodka=42') + assert request.args['vodka'] == '42' + + Additionally, you may pass optional keyword arguments that will then + be passed to the application's :attr:`test_client_class` constructor. + For example:: + + from flask.testing import FlaskClient + + class CustomClient(FlaskClient): + def __init__(self, *args, **kwargs): + self._authentication = kwargs.pop("authentication") + super(CustomClient,self).__init__( *args, **kwargs) + + app.test_client_class = CustomClient + client = app.test_client(authentication='Basic ....') + + See :class:`~flask.testing.FlaskClient` for more information. + + .. versionchanged:: 0.4 + added support for ``with`` block usage for the client. + + .. versionadded:: 0.7 + The `use_cookies` parameter was added as well as the ability + to override the client to be used by setting the + :attr:`test_client_class` attribute. + + .. versionchanged:: 0.11 + Added `**kwargs` to support passing additional keyword arguments to + the constructor of :attr:`test_client_class`. + """ + cls = self.test_client_class + if cls is None: + from flask.testing import FlaskClient as cls + return cls(self, self.response_class, use_cookies=use_cookies, **kwargs) + + def test_cli_runner(self, **kwargs): + """Create a CLI runner for testing CLI commands. + See :ref:`testing-cli`. + + Returns an instance of :attr:`test_cli_runner_class`, by default + :class:`~flask.testing.FlaskCliRunner`. The Flask app object is + passed as the first argument. + + .. versionadded:: 1.0 + """ + cls = self.test_cli_runner_class + + if cls is None: + from flask.testing import FlaskCliRunner as cls + + return cls(self, **kwargs) + + def open_session(self, request): + """Creates or opens a new session. Default implementation stores all + session data in a signed cookie. This requires that the + :attr:`secret_key` is set. Instead of overriding this method + we recommend replacing the :class:`session_interface`. + + .. deprecated: 1.0 + Will be removed in 1.1. Use ``session_interface.open_session`` + instead. + + :param request: an instance of :attr:`request_class`. + """ + + warnings.warn(DeprecationWarning( + '"open_session" is deprecated and will be removed in 1.1. Use' + ' "session_interface.open_session" instead.' + )) + return self.session_interface.open_session(self, request) + + def save_session(self, session, response): + """Saves the session if it needs updates. For the default + implementation, check :meth:`open_session`. Instead of overriding this + method we recommend replacing the :class:`session_interface`. + + .. deprecated: 1.0 + Will be removed in 1.1. Use ``session_interface.save_session`` + instead. + + :param session: the session to be saved (a + :class:`~werkzeug.contrib.securecookie.SecureCookie` + object) + :param response: an instance of :attr:`response_class` + """ + + warnings.warn(DeprecationWarning( + '"save_session" is deprecated and will be removed in 1.1. Use' + ' "session_interface.save_session" instead.' + )) + return self.session_interface.save_session(self, session, response) + + def make_null_session(self): + """Creates a new instance of a missing session. Instead of overriding + this method we recommend replacing the :class:`session_interface`. + + .. deprecated: 1.0 + Will be removed in 1.1. Use ``session_interface.make_null_session`` + instead. + + .. versionadded:: 0.7 + """ + + warnings.warn(DeprecationWarning( + '"make_null_session" is deprecated and will be removed in 1.1. Use' + ' "session_interface.make_null_session" instead.' + )) + return self.session_interface.make_null_session(self) + + @setupmethod + def register_blueprint(self, blueprint, **options): + """Register a :class:`~flask.Blueprint` on the application. Keyword + arguments passed to this method will override the defaults set on the + blueprint. + + Calls the blueprint's :meth:`~flask.Blueprint.register` method after + recording the blueprint in the application's :attr:`blueprints`. + + :param blueprint: The blueprint to register. + :param url_prefix: Blueprint routes will be prefixed with this. + :param subdomain: Blueprint routes will match on this subdomain. + :param url_defaults: Blueprint routes will use these default values for + view arguments. + :param options: Additional keyword arguments are passed to + :class:`~flask.blueprints.BlueprintSetupState`. They can be + accessed in :meth:`~flask.Blueprint.record` callbacks. + + .. versionadded:: 0.7 + """ + first_registration = False + + if blueprint.name in self.blueprints: + assert self.blueprints[blueprint.name] is blueprint, ( + 'A name collision occurred between blueprints %r and %r. Both' + ' share the same name "%s". Blueprints that are created on the' + ' fly need unique names.' % ( + blueprint, self.blueprints[blueprint.name], blueprint.name + ) + ) + else: + self.blueprints[blueprint.name] = blueprint + self._blueprint_order.append(blueprint) + first_registration = True + + blueprint.register(self, options, first_registration) + + def iter_blueprints(self): + """Iterates over all blueprints by the order they were registered. + + .. versionadded:: 0.11 + """ + return iter(self._blueprint_order) + + @setupmethod + def add_url_rule(self, rule, endpoint=None, view_func=None, + provide_automatic_options=None, **options): + """Connects a URL rule. Works exactly like the :meth:`route` + decorator. If a view_func is provided it will be registered with the + endpoint. + + Basically this example:: + + @app.route('/') + def index(): + pass + + Is equivalent to the following:: + + def index(): + pass + app.add_url_rule('/', 'index', index) + + If the view_func is not provided you will need to connect the endpoint + to a view function like so:: + + app.view_functions['index'] = index + + Internally :meth:`route` invokes :meth:`add_url_rule` so if you want + to customize the behavior via subclassing you only need to change + this method. + + For more information refer to :ref:`url-route-registrations`. + + .. versionchanged:: 0.2 + `view_func` parameter added. + + .. versionchanged:: 0.6 + ``OPTIONS`` is added automatically as method. + + :param rule: the URL rule as string + :param endpoint: the endpoint for the registered URL rule. Flask + itself assumes the name of the view function as + endpoint + :param view_func: the function to call when serving a request to the + provided endpoint + :param provide_automatic_options: controls whether the ``OPTIONS`` + method should be added automatically. This can also be controlled + by setting the ``view_func.provide_automatic_options = False`` + before adding the rule. + :param options: the options to be forwarded to the underlying + :class:`~werkzeug.routing.Rule` object. A change + to Werkzeug is handling of method options. methods + is a list of methods this rule should be limited + to (``GET``, ``POST`` etc.). By default a rule + just listens for ``GET`` (and implicitly ``HEAD``). + Starting with Flask 0.6, ``OPTIONS`` is implicitly + added and handled by the standard request handling. + """ + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) + options['endpoint'] = endpoint + methods = options.pop('methods', None) + + # if the methods are not given and the view_func object knows its + # methods we can use that instead. If neither exists, we go with + # a tuple of only ``GET`` as default. + if methods is None: + methods = getattr(view_func, 'methods', None) or ('GET',) + if isinstance(methods, string_types): + raise TypeError('Allowed methods have to be iterables of strings, ' + 'for example: @app.route(..., methods=["POST"])') + methods = set(item.upper() for item in methods) + + # Methods that should always be added + required_methods = set(getattr(view_func, 'required_methods', ())) + + # starting with Flask 0.8 the view_func object can disable and + # force-enable the automatic options handling. + if provide_automatic_options is None: + provide_automatic_options = getattr(view_func, + 'provide_automatic_options', None) + + if provide_automatic_options is None: + if 'OPTIONS' not in methods: + provide_automatic_options = True + required_methods.add('OPTIONS') + else: + provide_automatic_options = False + + # Add the required methods now. + methods |= required_methods + + rule = self.url_rule_class(rule, methods=methods, **options) + rule.provide_automatic_options = provide_automatic_options + + self.url_map.add(rule) + if view_func is not None: + old_func = self.view_functions.get(endpoint) + if old_func is not None and old_func != view_func: + raise AssertionError('View function mapping is overwriting an ' + 'existing endpoint function: %s' % endpoint) + self.view_functions[endpoint] = view_func + + def route(self, rule, **options): + """A decorator that is used to register a view function for a + given URL rule. This does the same thing as :meth:`add_url_rule` + but is intended for decorator usage:: + + @app.route('/') + def index(): + return 'Hello World' + + For more information refer to :ref:`url-route-registrations`. + + :param rule: the URL rule as string + :param endpoint: the endpoint for the registered URL rule. Flask + itself assumes the name of the view function as + endpoint + :param options: the options to be forwarded to the underlying + :class:`~werkzeug.routing.Rule` object. A change + to Werkzeug is handling of method options. methods + is a list of methods this rule should be limited + to (``GET``, ``POST`` etc.). By default a rule + just listens for ``GET`` (and implicitly ``HEAD``). + Starting with Flask 0.6, ``OPTIONS`` is implicitly + added and handled by the standard request handling. + """ + def decorator(f): + endpoint = options.pop('endpoint', None) + self.add_url_rule(rule, endpoint, f, **options) + return f + return decorator + + @setupmethod + def endpoint(self, endpoint): + """A decorator to register a function as an endpoint. + Example:: + + @app.endpoint('example.endpoint') + def example(): + return "example" + + :param endpoint: the name of the endpoint + """ + def decorator(f): + self.view_functions[endpoint] = f + return f + return decorator + + @staticmethod + def _get_exc_class_and_code(exc_class_or_code): + """Ensure that we register only exceptions as handler keys""" + if isinstance(exc_class_or_code, integer_types): + exc_class = default_exceptions[exc_class_or_code] + else: + exc_class = exc_class_or_code + + assert issubclass(exc_class, Exception) + + if issubclass(exc_class, HTTPException): + return exc_class, exc_class.code + else: + return exc_class, None + + @setupmethod + def errorhandler(self, code_or_exception): + """Register a function to handle errors by code or exception class. + + A decorator that is used to register a function given an + error code. Example:: + + @app.errorhandler(404) + def page_not_found(error): + return 'This page does not exist', 404 + + You can also register handlers for arbitrary exceptions:: + + @app.errorhandler(DatabaseError) + def special_exception_handler(error): + return 'Database connection failed', 500 + + .. versionadded:: 0.7 + Use :meth:`register_error_handler` instead of modifying + :attr:`error_handler_spec` directly, for application wide error + handlers. + + .. versionadded:: 0.7 + One can now additionally also register custom exception types + that do not necessarily have to be a subclass of the + :class:`~werkzeug.exceptions.HTTPException` class. + + :param code_or_exception: the code as integer for the handler, or + an arbitrary exception + """ + def decorator(f): + self._register_error_handler(None, code_or_exception, f) + return f + return decorator + + @setupmethod + def register_error_handler(self, code_or_exception, f): + """Alternative error attach function to the :meth:`errorhandler` + decorator that is more straightforward to use for non decorator + usage. + + .. versionadded:: 0.7 + """ + self._register_error_handler(None, code_or_exception, f) + + @setupmethod + def _register_error_handler(self, key, code_or_exception, f): + """ + :type key: None|str + :type code_or_exception: int|T<=Exception + :type f: callable + """ + if isinstance(code_or_exception, HTTPException): # old broken behavior + raise ValueError( + 'Tried to register a handler for an exception instance {0!r}.' + ' Handlers can only be registered for exception classes or' + ' HTTP error codes.'.format(code_or_exception) + ) + + try: + exc_class, code = self._get_exc_class_and_code(code_or_exception) + except KeyError: + raise KeyError( + "'{0}' is not a recognized HTTP error code. Use a subclass of" + " HTTPException with that code instead.".format(code_or_exception) + ) + + handlers = self.error_handler_spec.setdefault(key, {}).setdefault(code, {}) + handlers[exc_class] = f + + @setupmethod + def template_filter(self, name=None): + """A decorator that is used to register custom template filter. + You can specify a name for the filter, otherwise the function + name will be used. Example:: + + @app.template_filter() + def reverse(s): + return s[::-1] + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + def decorator(f): + self.add_template_filter(f, name=name) + return f + return decorator + + @setupmethod + def add_template_filter(self, f, name=None): + """Register a custom template filter. Works exactly like the + :meth:`template_filter` decorator. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + self.jinja_env.filters[name or f.__name__] = f + + @setupmethod + def template_test(self, name=None): + """A decorator that is used to register custom template test. + You can specify a name for the test, otherwise the function + name will be used. Example:: + + @app.template_test() + def is_prime(n): + if n == 2: + return True + for i in range(2, int(math.ceil(math.sqrt(n))) + 1): + if n % i == 0: + return False + return True + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + def decorator(f): + self.add_template_test(f, name=name) + return f + return decorator + + @setupmethod + def add_template_test(self, f, name=None): + """Register a custom template test. Works exactly like the + :meth:`template_test` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + self.jinja_env.tests[name or f.__name__] = f + + @setupmethod + def template_global(self, name=None): + """A decorator that is used to register a custom template global function. + You can specify a name for the global function, otherwise the function + name will be used. Example:: + + @app.template_global() + def double(n): + return 2 * n + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + def decorator(f): + self.add_template_global(f, name=name) + return f + return decorator + + @setupmethod + def add_template_global(self, f, name=None): + """Register a custom template global function. Works exactly like the + :meth:`template_global` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + self.jinja_env.globals[name or f.__name__] = f + + @setupmethod + def before_request(self, f): + """Registers a function to run before each request. + + For example, this can be used to open a database connection, or to load + the logged in user from the session. + + The function will be called without any arguments. If it returns a + non-None value, the value is handled as if it was the return value from + the view, and further request handling is stopped. + """ + self.before_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def before_first_request(self, f): + """Registers a function to be run before the first request to this + instance of the application. + + The function will be called without any arguments and its return + value is ignored. + + .. versionadded:: 0.8 + """ + self.before_first_request_funcs.append(f) + return f + + @setupmethod + def after_request(self, f): + """Register a function to be run after each request. + + Your function must take one parameter, an instance of + :attr:`response_class` and return a new response object or the + same (see :meth:`process_response`). + + As of Flask 0.7 this function might not be executed at the end of the + request in case an unhandled exception occurred. + """ + self.after_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def teardown_request(self, f): + """Register a function to be run at the end of each request, + regardless of whether there was an exception or not. These functions + are executed when the request context is popped, even if not an + actual request was performed. + + Example:: + + ctx = app.test_request_context() + ctx.push() + ... + ctx.pop() + + When ``ctx.pop()`` is executed in the above example, the teardown + functions are called just before the request context moves from the + stack of active contexts. This becomes relevant if you are using + such constructs in tests. + + Generally teardown functions must take every necessary step to avoid + that they will fail. If they do execute code that might fail they + will have to surround the execution of these code by try/except + statements and log occurring errors. + + When a teardown function was called because of an exception it will + be passed an error object. + + The return values of teardown functions are ignored. + + .. admonition:: Debug Note + + In debug mode Flask will not tear down a request on an exception + immediately. Instead it will keep it alive so that the interactive + debugger can still access it. This behavior can be controlled + by the ``PRESERVE_CONTEXT_ON_EXCEPTION`` configuration variable. + """ + self.teardown_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def teardown_appcontext(self, f): + """Registers a function to be called when the application context + ends. These functions are typically also called when the request + context is popped. + + Example:: + + ctx = app.app_context() + ctx.push() + ... + ctx.pop() + + When ``ctx.pop()`` is executed in the above example, the teardown + functions are called just before the app context moves from the + stack of active contexts. This becomes relevant if you are using + such constructs in tests. + + Since a request context typically also manages an application + context it would also be called when you pop a request context. + + When a teardown function was called because of an unhandled exception + it will be passed an error object. If an :meth:`errorhandler` is + registered, it will handle the exception and the teardown will not + receive it. + + The return values of teardown functions are ignored. + + .. versionadded:: 0.9 + """ + self.teardown_appcontext_funcs.append(f) + return f + + @setupmethod + def context_processor(self, f): + """Registers a template context processor function.""" + self.template_context_processors[None].append(f) + return f + + @setupmethod + def shell_context_processor(self, f): + """Registers a shell context processor function. + + .. versionadded:: 0.11 + """ + self.shell_context_processors.append(f) + return f + + @setupmethod + def url_value_preprocessor(self, f): + """Register a URL value preprocessor function for all view + functions in the application. These functions will be called before the + :meth:`before_request` functions. + + The function can modify the values captured from the matched url before + they are passed to the view. For example, this can be used to pop a + common language code value and place it in ``g`` rather than pass it to + every view. + + The function is passed the endpoint name and values dict. The return + value is ignored. + """ + self.url_value_preprocessors.setdefault(None, []).append(f) + return f + + @setupmethod + def url_defaults(self, f): + """Callback function for URL defaults for all view functions of the + application. It's called with the endpoint and values and should + update the values passed in place. + """ + self.url_default_functions.setdefault(None, []).append(f) + return f + + def _find_error_handler(self, e): + """Return a registered error handler for an exception in this order: + blueprint handler for a specific code, app handler for a specific code, + blueprint handler for an exception class, app handler for an exception + class, or ``None`` if a suitable handler is not found. + """ + exc_class, code = self._get_exc_class_and_code(type(e)) + + for name, c in ( + (request.blueprint, code), (None, code), + (request.blueprint, None), (None, None) + ): + handler_map = self.error_handler_spec.setdefault(name, {}).get(c) + + if not handler_map: + continue + + for cls in exc_class.__mro__: + handler = handler_map.get(cls) + + if handler is not None: + return handler + + def handle_http_exception(self, e): + """Handles an HTTP exception. By default this will invoke the + registered error handlers and fall back to returning the + exception as response. + + .. versionadded:: 0.3 + """ + # Proxy exceptions don't have error codes. We want to always return + # those unchanged as errors + if e.code is None: + return e + + handler = self._find_error_handler(e) + if handler is None: + return e + return handler(e) + + def trap_http_exception(self, e): + """Checks if an HTTP exception should be trapped or not. By default + this will return ``False`` for all exceptions except for a bad request + key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It + also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. + + This is called for all HTTP exceptions raised by a view function. + If it returns ``True`` for any exception the error handler for this + exception is not called and it shows up as regular exception in the + traceback. This is helpful for debugging implicitly raised HTTP + exceptions. + + .. versionchanged:: 1.0 + Bad request errors are not trapped by default in debug mode. + + .. versionadded:: 0.8 + """ + if self.config['TRAP_HTTP_EXCEPTIONS']: + return True + + trap_bad_request = self.config['TRAP_BAD_REQUEST_ERRORS'] + + # if unset, trap key errors in debug mode + if ( + trap_bad_request is None and self.debug + and isinstance(e, BadRequestKeyError) + ): + return True + + if trap_bad_request: + return isinstance(e, BadRequest) + + return False + + def handle_user_exception(self, e): + """This method is called whenever an exception occurs that should be + handled. A special case are + :class:`~werkzeug.exception.HTTPException`\s which are forwarded by + this function to the :meth:`handle_http_exception` method. This + function will either return a response value or reraise the + exception with the same traceback. + + .. versionchanged:: 1.0 + Key errors raised from request data like ``form`` show the the bad + key in debug mode rather than a generic bad request message. + + .. versionadded:: 0.7 + """ + exc_type, exc_value, tb = sys.exc_info() + assert exc_value is e + # ensure not to trash sys.exc_info() at that point in case someone + # wants the traceback preserved in handle_http_exception. Of course + # we cannot prevent users from trashing it themselves in a custom + # trap_http_exception method so that's their fault then. + + # MultiDict passes the key to the exception, but that's ignored + # when generating the response message. Set an informative + # description for key errors in debug mode or when trapping errors. + if ( + (self.debug or self.config['TRAP_BAD_REQUEST_ERRORS']) + and isinstance(e, BadRequestKeyError) + # only set it if it's still the default description + and e.description is BadRequestKeyError.description + ): + e.description = "KeyError: '{0}'".format(*e.args) + + if isinstance(e, HTTPException) and not self.trap_http_exception(e): + return self.handle_http_exception(e) + + handler = self._find_error_handler(e) + + if handler is None: + reraise(exc_type, exc_value, tb) + return handler(e) + + def handle_exception(self, e): + """Default exception handling that kicks in when an exception + occurs that is not caught. In debug mode the exception will + be re-raised immediately, otherwise it is logged and the handler + for a 500 internal server error is used. If no such handler + exists, a default 500 internal server error message is displayed. + + .. versionadded:: 0.3 + """ + exc_type, exc_value, tb = sys.exc_info() + + got_request_exception.send(self, exception=e) + handler = self._find_error_handler(InternalServerError()) + + if self.propagate_exceptions: + # if we want to repropagate the exception, we can attempt to + # raise it with the whole traceback in case we can do that + # (the function was actually called from the except part) + # otherwise, we just raise the error again + if exc_value is e: + reraise(exc_type, exc_value, tb) + else: + raise e + + self.log_exception((exc_type, exc_value, tb)) + if handler is None: + return InternalServerError() + return self.finalize_request(handler(e), from_error_handler=True) + + def log_exception(self, exc_info): + """Logs an exception. This is called by :meth:`handle_exception` + if debugging is disabled and right before the handler is called. + The default implementation logs the exception as error on the + :attr:`logger`. + + .. versionadded:: 0.8 + """ + self.logger.error('Exception on %s [%s]' % ( + request.path, + request.method + ), exc_info=exc_info) + + def raise_routing_exception(self, request): + """Exceptions that are recording during routing are reraised with + this method. During debug we are not reraising redirect requests + for non ``GET``, ``HEAD``, or ``OPTIONS`` requests and we're raising + a different error instead to help debug situations. + + :internal: + """ + if not self.debug \ + or not isinstance(request.routing_exception, RequestRedirect) \ + or request.method in ('GET', 'HEAD', 'OPTIONS'): + raise request.routing_exception + + from .debughelpers import FormDataRoutingRedirect + raise FormDataRoutingRedirect(request) + + def dispatch_request(self): + """Does the request dispatching. Matches the URL and returns the + return value of the view or error handler. This does not have to + be a response object. In order to convert the return value to a + proper response object, call :func:`make_response`. + + .. versionchanged:: 0.7 + This no longer does the exception handling, this code was + moved to the new :meth:`full_dispatch_request`. + """ + req = _request_ctx_stack.top.request + if req.routing_exception is not None: + self.raise_routing_exception(req) + rule = req.url_rule + # if we provide automatic options for this URL and the + # request came with the OPTIONS method, reply automatically + if getattr(rule, 'provide_automatic_options', False) \ + and req.method == 'OPTIONS': + return self.make_default_options_response() + # otherwise dispatch to the handler for that endpoint + return self.view_functions[rule.endpoint](**req.view_args) + + def full_dispatch_request(self): + """Dispatches the request and on top of that performs request + pre and postprocessing as well as HTTP exception catching and + error handling. + + .. versionadded:: 0.7 + """ + self.try_trigger_before_first_request_functions() + try: + request_started.send(self) + rv = self.preprocess_request() + if rv is None: + rv = self.dispatch_request() + except Exception as e: + rv = self.handle_user_exception(e) + return self.finalize_request(rv) + + def finalize_request(self, rv, from_error_handler=False): + """Given the return value from a view function this finalizes + the request by converting it into a response and invoking the + postprocessing functions. This is invoked for both normal + request dispatching as well as error handlers. + + Because this means that it might be called as a result of a + failure a special safe mode is available which can be enabled + with the `from_error_handler` flag. If enabled, failures in + response processing will be logged and otherwise ignored. + + :internal: + """ + response = self.make_response(rv) + try: + response = self.process_response(response) + request_finished.send(self, response=response) + except Exception: + if not from_error_handler: + raise + self.logger.exception('Request finalizing failed with an ' + 'error while handling an error') + return response + + def try_trigger_before_first_request_functions(self): + """Called before each request and will ensure that it triggers + the :attr:`before_first_request_funcs` and only exactly once per + application instance (which means process usually). + + :internal: + """ + if self._got_first_request: + return + with self._before_request_lock: + if self._got_first_request: + return + for func in self.before_first_request_funcs: + func() + self._got_first_request = True + + def make_default_options_response(self): + """This method is called to create the default ``OPTIONS`` response. + This can be changed through subclassing to change the default + behavior of ``OPTIONS`` responses. + + .. versionadded:: 0.7 + """ + adapter = _request_ctx_stack.top.url_adapter + if hasattr(adapter, 'allowed_methods'): + methods = adapter.allowed_methods() + else: + # fallback for Werkzeug < 0.7 + methods = [] + try: + adapter.match(method='--') + except MethodNotAllowed as e: + methods = e.valid_methods + except HTTPException as e: + pass + rv = self.response_class() + rv.allow.update(methods) + return rv + + def should_ignore_error(self, error): + """This is called to figure out if an error should be ignored + or not as far as the teardown system is concerned. If this + function returns ``True`` then the teardown handlers will not be + passed the error. + + .. versionadded:: 0.10 + """ + return False + + def make_response(self, rv): + """Convert the return value from a view function to an instance of + :attr:`response_class`. + + :param rv: the return value from the view function. The view function + must return a response. Returning ``None``, or the view ending + without returning, is not allowed. The following types are allowed + for ``view_rv``: + + ``str`` (``unicode`` in Python 2) + A response object is created with the string encoded to UTF-8 + as the body. + + ``bytes`` (``str`` in Python 2) + A response object is created with the bytes as the body. + + ``tuple`` + Either ``(body, status, headers)``, ``(body, status)``, or + ``(body, headers)``, where ``body`` is any of the other types + allowed here, ``status`` is a string or an integer, and + ``headers`` is a dictionary or a list of ``(key, value)`` + tuples. If ``body`` is a :attr:`response_class` instance, + ``status`` overwrites the exiting value and ``headers`` are + extended. + + :attr:`response_class` + The object is returned unchanged. + + other :class:`~werkzeug.wrappers.Response` class + The object is coerced to :attr:`response_class`. + + :func:`callable` + The function is called as a WSGI application. The result is + used to create a response object. + + .. versionchanged:: 0.9 + Previously a tuple was interpreted as the arguments for the + response object. + """ + + status = headers = None + + # unpack tuple returns + if isinstance(rv, tuple): + len_rv = len(rv) + + # a 3-tuple is unpacked directly + if len_rv == 3: + rv, status, headers = rv + # decide if a 2-tuple has status or headers + elif len_rv == 2: + if isinstance(rv[1], (Headers, dict, tuple, list)): + rv, headers = rv + else: + rv, status = rv + # other sized tuples are not allowed + else: + raise TypeError( + 'The view function did not return a valid response tuple.' + ' The tuple must have the form (body, status, headers),' + ' (body, status), or (body, headers).' + ) + + # the body must not be None + if rv is None: + raise TypeError( + 'The view function did not return a valid response. The' + ' function either returned None or ended without a return' + ' statement.' + ) + + # make sure the body is an instance of the response class + if not isinstance(rv, self.response_class): + if isinstance(rv, (text_type, bytes, bytearray)): + # let the response class set the status and headers instead of + # waiting to do it manually, so that the class can handle any + # special logic + rv = self.response_class(rv, status=status, headers=headers) + status = headers = None + else: + # evaluate a WSGI callable, or coerce a different response + # class to the correct type + try: + rv = self.response_class.force_type(rv, request.environ) + except TypeError as e: + new_error = TypeError( + '{e}\nThe view function did not return a valid' + ' response. The return type must be a string, tuple,' + ' Response instance, or WSGI callable, but it was a' + ' {rv.__class__.__name__}.'.format(e=e, rv=rv) + ) + reraise(TypeError, new_error, sys.exc_info()[2]) + + # prefer the status if it was provided + if status is not None: + if isinstance(status, (text_type, bytes, bytearray)): + rv.status = status + else: + rv.status_code = status + + # extend existing headers with provided headers + if headers: + rv.headers.extend(headers) + + return rv + + def create_url_adapter(self, request): + """Creates a URL adapter for the given request. The URL adapter + is created at a point where the request context is not yet set + up so the request is passed explicitly. + + .. versionadded:: 0.6 + + .. versionchanged:: 0.9 + This can now also be called without a request object when the + URL adapter is created for the application context. + + .. versionchanged:: 1.0 + :data:`SERVER_NAME` no longer implicitly enables subdomain + matching. Use :attr:`subdomain_matching` instead. + """ + if request is not None: + # If subdomain matching is disabled (the default), use the + # default subdomain in all cases. This should be the default + # in Werkzeug but it currently does not have that feature. + subdomain = ((self.url_map.default_subdomain or None) + if not self.subdomain_matching else None) + return self.url_map.bind_to_environ( + request.environ, + server_name=self.config['SERVER_NAME'], + subdomain=subdomain) + # We need at the very least the server name to be set for this + # to work. + if self.config['SERVER_NAME'] is not None: + return self.url_map.bind( + self.config['SERVER_NAME'], + script_name=self.config['APPLICATION_ROOT'], + url_scheme=self.config['PREFERRED_URL_SCHEME']) + + def inject_url_defaults(self, endpoint, values): + """Injects the URL defaults for the given endpoint directly into + the values dictionary passed. This is used internally and + automatically called on URL building. + + .. versionadded:: 0.7 + """ + funcs = self.url_default_functions.get(None, ()) + if '.' in endpoint: + bp = endpoint.rsplit('.', 1)[0] + funcs = chain(funcs, self.url_default_functions.get(bp, ())) + for func in funcs: + func(endpoint, values) + + def handle_url_build_error(self, error, endpoint, values): + """Handle :class:`~werkzeug.routing.BuildError` on :meth:`url_for`. + """ + exc_type, exc_value, tb = sys.exc_info() + for handler in self.url_build_error_handlers: + try: + rv = handler(error, endpoint, values) + if rv is not None: + return rv + except BuildError as e: + # make error available outside except block (py3) + error = e + + # At this point we want to reraise the exception. If the error is + # still the same one we can reraise it with the original traceback, + # otherwise we raise it from here. + if error is exc_value: + reraise(exc_type, exc_value, tb) + raise error + + def preprocess_request(self): + """Called before the request is dispatched. Calls + :attr:`url_value_preprocessors` registered with the app and the + current blueprint (if any). Then calls :attr:`before_request_funcs` + registered with the app and the blueprint. + + If any :meth:`before_request` handler returns a non-None value, the + value is handled as if it was the return value from the view, and + further request handling is stopped. + """ + + bp = _request_ctx_stack.top.request.blueprint + + funcs = self.url_value_preprocessors.get(None, ()) + if bp is not None and bp in self.url_value_preprocessors: + funcs = chain(funcs, self.url_value_preprocessors[bp]) + for func in funcs: + func(request.endpoint, request.view_args) + + funcs = self.before_request_funcs.get(None, ()) + if bp is not None and bp in self.before_request_funcs: + funcs = chain(funcs, self.before_request_funcs[bp]) + for func in funcs: + rv = func() + if rv is not None: + return rv + + def process_response(self, response): + """Can be overridden in order to modify the response object + before it's sent to the WSGI server. By default this will + call all the :meth:`after_request` decorated functions. + + .. versionchanged:: 0.5 + As of Flask 0.5 the functions registered for after request + execution are called in reverse order of registration. + + :param response: a :attr:`response_class` object. + :return: a new response object or the same, has to be an + instance of :attr:`response_class`. + """ + ctx = _request_ctx_stack.top + bp = ctx.request.blueprint + funcs = ctx._after_request_functions + if bp is not None and bp in self.after_request_funcs: + funcs = chain(funcs, reversed(self.after_request_funcs[bp])) + if None in self.after_request_funcs: + funcs = chain(funcs, reversed(self.after_request_funcs[None])) + for handler in funcs: + response = handler(response) + if not self.session_interface.is_null_session(ctx.session): + self.session_interface.save_session(self, ctx.session, response) + return response + + def do_teardown_request(self, exc=_sentinel): + """Called after the request is dispatched and the response is + returned, right before the request context is popped. + + This calls all functions decorated with + :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` + if a blueprint handled the request. Finally, the + :data:`request_tearing_down` signal is sent. + + This is called by + :meth:`RequestContext.pop() `, + which may be delayed during testing to maintain access to + resources. + + :param exc: An unhandled exception raised while dispatching the + request. Detected from the current exception information if + not passed. Passed to each teardown function. + + .. versionchanged:: 0.9 + Added the ``exc`` argument. + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + funcs = reversed(self.teardown_request_funcs.get(None, ())) + bp = _request_ctx_stack.top.request.blueprint + if bp is not None and bp in self.teardown_request_funcs: + funcs = chain(funcs, reversed(self.teardown_request_funcs[bp])) + for func in funcs: + func(exc) + request_tearing_down.send(self, exc=exc) + + def do_teardown_appcontext(self, exc=_sentinel): + """Called right before the application context is popped. + + When handling a request, the application context is popped + after the request context. See :meth:`do_teardown_request`. + + This calls all functions decorated with + :meth:`teardown_appcontext`. Then the + :data:`appcontext_tearing_down` signal is sent. + + This is called by + :meth:`AppContext.pop() `. + + .. versionadded:: 0.9 + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + for func in reversed(self.teardown_appcontext_funcs): + func(exc) + appcontext_tearing_down.send(self, exc=exc) + + def app_context(self): + """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` + block to push the context, which will make :data:`current_app` + point at this application. + + An application context is automatically pushed by + :meth:`RequestContext.push() ` + when handling a request, and when running a CLI command. Use + this to manually create a context outside of these situations. + + :: + + with app.app_context(): + init_db() + + See :doc:`/appcontext`. + + .. versionadded:: 0.9 + """ + return AppContext(self) + + def request_context(self, environ): + """Create a :class:`~flask.ctx.RequestContext` representing a + WSGI environment. Use a ``with`` block to push the context, + which will make :data:`request` point at this request. + + See :doc:`/reqcontext`. + + Typically you should not call this from your own code. A request + context is automatically pushed by the :meth:`wsgi_app` when + handling a request. Use :meth:`test_request_context` to create + an environment and context instead of this method. + + :param environ: a WSGI environment + """ + return RequestContext(self, environ) + + def test_request_context(self, *args, **kwargs): + """Create a :class:`~flask.ctx.RequestContext` for a WSGI + environment created from the given values. This is mostly useful + during testing, where you may want to run a function that uses + request data without dispatching a full request. + + See :doc:`/reqcontext`. + + Use a ``with`` block to push the context, which will make + :data:`request` point at the request for the created + environment. :: + + with test_request_context(...): + generate_report() + + When using the shell, it may be easier to push and pop the + context manually to avoid indentation. :: + + ctx = app.test_request_context(...) + ctx.push() + ... + ctx.pop() + + Takes the same arguments as Werkzeug's + :class:`~werkzeug.test.EnvironBuilder`, with some defaults from + the application. See the linked Werkzeug docs for most of the + available arguments. Flask-specific behavior is listed here. + + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to + :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param data: The request body, either as a string or a dict of + form keys and values. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + from flask.testing import make_test_environ_builder + + builder = make_test_environ_builder(self, *args, **kwargs) + + try: + return self.request_context(builder.get_environ()) + finally: + builder.close() + + def wsgi_app(self, environ, start_response): + """The actual WSGI application. This is not implemented in + :meth:`__call__` so that middlewares can be applied without + losing a reference to the app object. Instead of doing this:: + + app = MyMiddleware(app) + + It's a better idea to do this instead:: + + app.wsgi_app = MyMiddleware(app.wsgi_app) + + Then you still have the original application object around and + can continue to call methods on it. + + .. versionchanged:: 0.7 + Teardown events for the request and app contexts are called + even if an unhandled error occurs. Other events may not be + called depending on when an error occurs during dispatch. + See :ref:`callbacks-and-errors`. + + :param environ: A WSGI environment. + :param start_response: A callable accepting a status code, + a list of headers, and an optional exception context to + start the response. + """ + ctx = self.request_context(environ) + error = None + try: + try: + ctx.push() + response = self.full_dispatch_request() + except Exception as e: + error = e + response = self.handle_exception(e) + except: + error = sys.exc_info()[1] + raise + return response(environ, start_response) + finally: + if self.should_ignore_error(error): + error = None + ctx.auto_pop(error) + + def __call__(self, environ, start_response): + """The WSGI server calls the Flask application object as the + WSGI application. This calls :meth:`wsgi_app` which can be + wrapped to applying middleware.""" + return self.wsgi_app(environ, start_response) + + def __repr__(self): + return '<%s %r>' % ( + self.__class__.__name__, + self.name, + ) diff --git a/venv/Lib/site-packages/flask/blueprints.py b/venv/Lib/site-packages/flask/blueprints.py new file mode 100644 index 00000000..5ce5561e --- /dev/null +++ b/venv/Lib/site-packages/flask/blueprints.py @@ -0,0 +1,448 @@ +# -*- coding: utf-8 -*- +""" + flask.blueprints + ~~~~~~~~~~~~~~~~ + + Blueprints are the recommended way to implement larger or more + pluggable applications in Flask 0.7 and later. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" +from functools import update_wrapper +from werkzeug.urls import url_join + +from .helpers import _PackageBoundObject, _endpoint_from_view_func + + +class BlueprintSetupState(object): + """Temporary holder object for registering a blueprint with the + application. An instance of this class is created by the + :meth:`~flask.Blueprint.make_setup_state` method and later passed + to all register callback functions. + """ + + def __init__(self, blueprint, app, options, first_registration): + #: a reference to the current application + self.app = app + + #: a reference to the blueprint that created this setup state. + self.blueprint = blueprint + + #: a dictionary with all options that were passed to the + #: :meth:`~flask.Flask.register_blueprint` method. + self.options = options + + #: as blueprints can be registered multiple times with the + #: application and not everything wants to be registered + #: multiple times on it, this attribute can be used to figure + #: out if the blueprint was registered in the past already. + self.first_registration = first_registration + + subdomain = self.options.get('subdomain') + if subdomain is None: + subdomain = self.blueprint.subdomain + + #: The subdomain that the blueprint should be active for, ``None`` + #: otherwise. + self.subdomain = subdomain + + url_prefix = self.options.get('url_prefix') + if url_prefix is None: + url_prefix = self.blueprint.url_prefix + #: The prefix that should be used for all URLs defined on the + #: blueprint. + self.url_prefix = url_prefix + + #: A dictionary with URL defaults that is added to each and every + #: URL that was defined with the blueprint. + self.url_defaults = dict(self.blueprint.url_values_defaults) + self.url_defaults.update(self.options.get('url_defaults', ())) + + def add_url_rule(self, rule, endpoint=None, view_func=None, **options): + """A helper method to register a rule (and optionally a view function) + to the application. The endpoint is automatically prefixed with the + blueprint's name. + """ + if self.url_prefix is not None: + if rule: + rule = '/'.join(( + self.url_prefix.rstrip('/'), rule.lstrip('/'))) + else: + rule = self.url_prefix + options.setdefault('subdomain', self.subdomain) + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) + defaults = self.url_defaults + if 'defaults' in options: + defaults = dict(defaults, **options.pop('defaults')) + self.app.add_url_rule(rule, '%s.%s' % (self.blueprint.name, endpoint), + view_func, defaults=defaults, **options) + + +class Blueprint(_PackageBoundObject): + """Represents a blueprint. A blueprint is an object that records + functions that will be called with the + :class:`~flask.blueprints.BlueprintSetupState` later to register functions + or other things on the main application. See :ref:`blueprints` for more + information. + + .. versionadded:: 0.7 + """ + + warn_on_modifications = False + _got_registered_once = False + + #: Blueprint local JSON decoder class to use. + #: Set to ``None`` to use the app's :class:`~flask.app.Flask.json_encoder`. + json_encoder = None + #: Blueprint local JSON decoder class to use. + #: Set to ``None`` to use the app's :class:`~flask.app.Flask.json_decoder`. + json_decoder = None + + # TODO remove the next three attrs when Sphinx :inherited-members: works + # https://github.com/sphinx-doc/sphinx/issues/741 + + #: The name of the package or module that this app belongs to. Do not + #: change this once it is set by the constructor. + import_name = None + + #: Location of the template files to be added to the template lookup. + #: ``None`` if templates should not be added. + template_folder = None + + #: Absolute path to the package on the filesystem. Used to look up + #: resources contained in the package. + root_path = None + + def __init__(self, name, import_name, static_folder=None, + static_url_path=None, template_folder=None, + url_prefix=None, subdomain=None, url_defaults=None, + root_path=None): + _PackageBoundObject.__init__(self, import_name, template_folder, + root_path=root_path) + self.name = name + self.url_prefix = url_prefix + self.subdomain = subdomain + self.static_folder = static_folder + self.static_url_path = static_url_path + self.deferred_functions = [] + if url_defaults is None: + url_defaults = {} + self.url_values_defaults = url_defaults + + def record(self, func): + """Registers a function that is called when the blueprint is + registered on the application. This function is called with the + state as argument as returned by the :meth:`make_setup_state` + method. + """ + if self._got_registered_once and self.warn_on_modifications: + from warnings import warn + warn(Warning('The blueprint was already registered once ' + 'but is getting modified now. These changes ' + 'will not show up.')) + self.deferred_functions.append(func) + + def record_once(self, func): + """Works like :meth:`record` but wraps the function in another + function that will ensure the function is only called once. If the + blueprint is registered a second time on the application, the + function passed is not called. + """ + def wrapper(state): + if state.first_registration: + func(state) + return self.record(update_wrapper(wrapper, func)) + + def make_setup_state(self, app, options, first_registration=False): + """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` + object that is later passed to the register callback functions. + Subclasses can override this to return a subclass of the setup state. + """ + return BlueprintSetupState(self, app, options, first_registration) + + def register(self, app, options, first_registration=False): + """Called by :meth:`Flask.register_blueprint` to register all views + and callbacks registered on the blueprint with the application. Creates + a :class:`.BlueprintSetupState` and calls each :meth:`record` callback + with it. + + :param app: The application this blueprint is being registered with. + :param options: Keyword arguments forwarded from + :meth:`~Flask.register_blueprint`. + :param first_registration: Whether this is the first time this + blueprint has been registered on the application. + """ + self._got_registered_once = True + state = self.make_setup_state(app, options, first_registration) + + if self.has_static_folder: + state.add_url_rule( + self.static_url_path + '/', + view_func=self.send_static_file, endpoint='static' + ) + + for deferred in self.deferred_functions: + deferred(state) + + def route(self, rule, **options): + """Like :meth:`Flask.route` but for a blueprint. The endpoint for the + :func:`url_for` function is prefixed with the name of the blueprint. + """ + def decorator(f): + endpoint = options.pop("endpoint", f.__name__) + self.add_url_rule(rule, endpoint, f, **options) + return f + return decorator + + def add_url_rule(self, rule, endpoint=None, view_func=None, **options): + """Like :meth:`Flask.add_url_rule` but for a blueprint. The endpoint for + the :func:`url_for` function is prefixed with the name of the blueprint. + """ + if endpoint: + assert '.' not in endpoint, "Blueprint endpoints should not contain dots" + if view_func and hasattr(view_func, '__name__'): + assert '.' not in view_func.__name__, "Blueprint view function name should not contain dots" + self.record(lambda s: + s.add_url_rule(rule, endpoint, view_func, **options)) + + def endpoint(self, endpoint): + """Like :meth:`Flask.endpoint` but for a blueprint. This does not + prefix the endpoint with the blueprint name, this has to be done + explicitly by the user of this method. If the endpoint is prefixed + with a `.` it will be registered to the current blueprint, otherwise + it's an application independent endpoint. + """ + def decorator(f): + def register_endpoint(state): + state.app.view_functions[endpoint] = f + self.record_once(register_endpoint) + return f + return decorator + + def app_template_filter(self, name=None): + """Register a custom template filter, available application wide. Like + :meth:`Flask.template_filter` but for a blueprint. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + def decorator(f): + self.add_app_template_filter(f, name=name) + return f + return decorator + + def add_app_template_filter(self, f, name=None): + """Register a custom template filter, available application wide. Like + :meth:`Flask.add_template_filter` but for a blueprint. Works exactly + like the :meth:`app_template_filter` decorator. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + def register_template(state): + state.app.jinja_env.filters[name or f.__name__] = f + self.record_once(register_template) + + def app_template_test(self, name=None): + """Register a custom template test, available application wide. Like + :meth:`Flask.template_test` but for a blueprint. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + def decorator(f): + self.add_app_template_test(f, name=name) + return f + return decorator + + def add_app_template_test(self, f, name=None): + """Register a custom template test, available application wide. Like + :meth:`Flask.add_template_test` but for a blueprint. Works exactly + like the :meth:`app_template_test` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + def register_template(state): + state.app.jinja_env.tests[name or f.__name__] = f + self.record_once(register_template) + + def app_template_global(self, name=None): + """Register a custom template global, available application wide. Like + :meth:`Flask.template_global` but for a blueprint. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + def decorator(f): + self.add_app_template_global(f, name=name) + return f + return decorator + + def add_app_template_global(self, f, name=None): + """Register a custom template global, available application wide. Like + :meth:`Flask.add_template_global` but for a blueprint. Works exactly + like the :meth:`app_template_global` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + def register_template(state): + state.app.jinja_env.globals[name or f.__name__] = f + self.record_once(register_template) + + def before_request(self, f): + """Like :meth:`Flask.before_request` but for a blueprint. This function + is only executed before each request that is handled by a function of + that blueprint. + """ + self.record_once(lambda s: s.app.before_request_funcs + .setdefault(self.name, []).append(f)) + return f + + def before_app_request(self, f): + """Like :meth:`Flask.before_request`. Such a function is executed + before each request, even if outside of a blueprint. + """ + self.record_once(lambda s: s.app.before_request_funcs + .setdefault(None, []).append(f)) + return f + + def before_app_first_request(self, f): + """Like :meth:`Flask.before_first_request`. Such a function is + executed before the first request to the application. + """ + self.record_once(lambda s: s.app.before_first_request_funcs.append(f)) + return f + + def after_request(self, f): + """Like :meth:`Flask.after_request` but for a blueprint. This function + is only executed after each request that is handled by a function of + that blueprint. + """ + self.record_once(lambda s: s.app.after_request_funcs + .setdefault(self.name, []).append(f)) + return f + + def after_app_request(self, f): + """Like :meth:`Flask.after_request` but for a blueprint. Such a function + is executed after each request, even if outside of the blueprint. + """ + self.record_once(lambda s: s.app.after_request_funcs + .setdefault(None, []).append(f)) + return f + + def teardown_request(self, f): + """Like :meth:`Flask.teardown_request` but for a blueprint. This + function is only executed when tearing down requests handled by a + function of that blueprint. Teardown request functions are executed + when the request context is popped, even when no actual request was + performed. + """ + self.record_once(lambda s: s.app.teardown_request_funcs + .setdefault(self.name, []).append(f)) + return f + + def teardown_app_request(self, f): + """Like :meth:`Flask.teardown_request` but for a blueprint. Such a + function is executed when tearing down each request, even if outside of + the blueprint. + """ + self.record_once(lambda s: s.app.teardown_request_funcs + .setdefault(None, []).append(f)) + return f + + def context_processor(self, f): + """Like :meth:`Flask.context_processor` but for a blueprint. This + function is only executed for requests handled by a blueprint. + """ + self.record_once(lambda s: s.app.template_context_processors + .setdefault(self.name, []).append(f)) + return f + + def app_context_processor(self, f): + """Like :meth:`Flask.context_processor` but for a blueprint. Such a + function is executed each request, even if outside of the blueprint. + """ + self.record_once(lambda s: s.app.template_context_processors + .setdefault(None, []).append(f)) + return f + + def app_errorhandler(self, code): + """Like :meth:`Flask.errorhandler` but for a blueprint. This + handler is used for all requests, even if outside of the blueprint. + """ + def decorator(f): + self.record_once(lambda s: s.app.errorhandler(code)(f)) + return f + return decorator + + def url_value_preprocessor(self, f): + """Registers a function as URL value preprocessor for this + blueprint. It's called before the view functions are called and + can modify the url values provided. + """ + self.record_once(lambda s: s.app.url_value_preprocessors + .setdefault(self.name, []).append(f)) + return f + + def url_defaults(self, f): + """Callback function for URL defaults for this blueprint. It's called + with the endpoint and values and should update the values passed + in place. + """ + self.record_once(lambda s: s.app.url_default_functions + .setdefault(self.name, []).append(f)) + return f + + def app_url_value_preprocessor(self, f): + """Same as :meth:`url_value_preprocessor` but application wide. + """ + self.record_once(lambda s: s.app.url_value_preprocessors + .setdefault(None, []).append(f)) + return f + + def app_url_defaults(self, f): + """Same as :meth:`url_defaults` but application wide. + """ + self.record_once(lambda s: s.app.url_default_functions + .setdefault(None, []).append(f)) + return f + + def errorhandler(self, code_or_exception): + """Registers an error handler that becomes active for this blueprint + only. Please be aware that routing does not happen local to a + blueprint so an error handler for 404 usually is not handled by + a blueprint unless it is caused inside a view function. Another + special case is the 500 internal server error which is always looked + up from the application. + + Otherwise works as the :meth:`~flask.Flask.errorhandler` decorator + of the :class:`~flask.Flask` object. + """ + def decorator(f): + self.record_once(lambda s: s.app._register_error_handler( + self.name, code_or_exception, f)) + return f + return decorator + + def register_error_handler(self, code_or_exception, f): + """Non-decorator version of the :meth:`errorhandler` error attach + function, akin to the :meth:`~flask.Flask.register_error_handler` + application-wide function of the :class:`~flask.Flask` object but + for error handlers limited to this blueprint. + + .. versionadded:: 0.11 + """ + self.record_once(lambda s: s.app._register_error_handler( + self.name, code_or_exception, f)) diff --git a/venv/Lib/site-packages/flask/cli.py b/venv/Lib/site-packages/flask/cli.py new file mode 100644 index 00000000..efc1733e --- /dev/null +++ b/venv/Lib/site-packages/flask/cli.py @@ -0,0 +1,898 @@ +# -*- coding: utf-8 -*- +""" + flask.cli + ~~~~~~~~~ + + A simple command line application to run flask apps. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +from __future__ import print_function + +import ast +import inspect +import os +import re +import ssl +import sys +import traceback +from functools import update_wrapper +from operator import attrgetter +from threading import Lock, Thread + +import click +from werkzeug.utils import import_string + +from . import __version__ +from ._compat import getargspec, iteritems, reraise, text_type +from .globals import current_app +from .helpers import get_debug_flag, get_env, get_load_dotenv + +try: + import dotenv +except ImportError: + dotenv = None + + +class NoAppException(click.UsageError): + """Raised if an application cannot be found or loaded.""" + + +def find_best_app(script_info, module): + """Given a module instance this tries to find the best possible + application in the module or raises an exception. + """ + from . import Flask + + # Search for the most common names first. + for attr_name in ('app', 'application'): + app = getattr(module, attr_name, None) + + if isinstance(app, Flask): + return app + + # Otherwise find the only object that is a Flask instance. + matches = [ + v for k, v in iteritems(module.__dict__) if isinstance(v, Flask) + ] + + if len(matches) == 1: + return matches[0] + elif len(matches) > 1: + raise NoAppException( + 'Detected multiple Flask applications in module "{module}". Use ' + '"FLASK_APP={module}:name" to specify the correct ' + 'one.'.format(module=module.__name__) + ) + + # Search for app factory functions. + for attr_name in ('create_app', 'make_app'): + app_factory = getattr(module, attr_name, None) + + if inspect.isfunction(app_factory): + try: + app = call_factory(script_info, app_factory) + + if isinstance(app, Flask): + return app + except TypeError: + if not _called_with_wrong_args(app_factory): + raise + raise NoAppException( + 'Detected factory "{factory}" in module "{module}", but ' + 'could not call it without arguments. Use ' + '"FLASK_APP=\'{module}:{factory}(args)\'" to specify ' + 'arguments.'.format( + factory=attr_name, module=module.__name__ + ) + ) + + raise NoAppException( + 'Failed to find Flask application or factory in module "{module}". ' + 'Use "FLASK_APP={module}:name to specify one.'.format( + module=module.__name__ + ) + ) + + +def call_factory(script_info, app_factory, arguments=()): + """Takes an app factory, a ``script_info` object and optionally a tuple + of arguments. Checks for the existence of a script_info argument and calls + the app_factory depending on that and the arguments provided. + """ + args_spec = getargspec(app_factory) + arg_names = args_spec.args + arg_defaults = args_spec.defaults + + if 'script_info' in arg_names: + return app_factory(*arguments, script_info=script_info) + elif arguments: + return app_factory(*arguments) + elif not arguments and len(arg_names) == 1 and arg_defaults is None: + return app_factory(script_info) + + return app_factory() + + +def _called_with_wrong_args(factory): + """Check whether calling a function raised a ``TypeError`` because + the call failed or because something in the factory raised the + error. + + :param factory: the factory function that was called + :return: true if the call failed + """ + tb = sys.exc_info()[2] + + try: + while tb is not None: + if tb.tb_frame.f_code is factory.__code__: + # in the factory, it was called successfully + return False + + tb = tb.tb_next + + # didn't reach the factory + return True + finally: + del tb + + +def find_app_by_string(script_info, module, app_name): + """Checks if the given string is a variable name or a function. If it is a + function, it checks for specified arguments and whether it takes a + ``script_info`` argument and calls the function with the appropriate + arguments. + """ + from flask import Flask + match = re.match(r'^ *([^ ()]+) *(?:\((.*?) *,? *\))? *$', app_name) + + if not match: + raise NoAppException( + '"{name}" is not a valid variable name or function ' + 'expression.'.format(name=app_name) + ) + + name, args = match.groups() + + try: + attr = getattr(module, name) + except AttributeError as e: + raise NoAppException(e.args[0]) + + if inspect.isfunction(attr): + if args: + try: + args = ast.literal_eval('({args},)'.format(args=args)) + except (ValueError, SyntaxError)as e: + raise NoAppException( + 'Could not parse the arguments in ' + '"{app_name}".'.format(e=e, app_name=app_name) + ) + else: + args = () + + try: + app = call_factory(script_info, attr, args) + except TypeError as e: + if not _called_with_wrong_args(attr): + raise + + raise NoAppException( + '{e}\nThe factory "{app_name}" in module "{module}" could not ' + 'be called with the specified arguments.'.format( + e=e, app_name=app_name, module=module.__name__ + ) + ) + else: + app = attr + + if isinstance(app, Flask): + return app + + raise NoAppException( + 'A valid Flask application was not obtained from ' + '"{module}:{app_name}".'.format( + module=module.__name__, app_name=app_name + ) + ) + + +def prepare_import(path): + """Given a filename this will try to calculate the python path, add it + to the search path and return the actual module name that is expected. + """ + path = os.path.realpath(path) + + if os.path.splitext(path)[1] == '.py': + path = os.path.splitext(path)[0] + + if os.path.basename(path) == '__init__': + path = os.path.dirname(path) + + module_name = [] + + # move up until outside package structure (no __init__.py) + while True: + path, name = os.path.split(path) + module_name.append(name) + + if not os.path.exists(os.path.join(path, '__init__.py')): + break + + if sys.path[0] != path: + sys.path.insert(0, path) + + return '.'.join(module_name[::-1]) + + +def locate_app(script_info, module_name, app_name, raise_if_not_found=True): + __traceback_hide__ = True + + try: + __import__(module_name) + except ImportError: + # Reraise the ImportError if it occurred within the imported module. + # Determine this by checking whether the trace has a depth > 1. + if sys.exc_info()[-1].tb_next: + raise NoAppException( + 'While importing "{name}", an ImportError was raised:' + '\n\n{tb}'.format(name=module_name, tb=traceback.format_exc()) + ) + elif raise_if_not_found: + raise NoAppException( + 'Could not import "{name}".'.format(name=module_name) + ) + else: + return + + module = sys.modules[module_name] + + if app_name is None: + return find_best_app(script_info, module) + else: + return find_app_by_string(script_info, module, app_name) + + +def get_version(ctx, param, value): + if not value or ctx.resilient_parsing: + return + message = 'Flask %(version)s\nPython %(python_version)s' + click.echo(message % { + 'version': __version__, + 'python_version': sys.version, + }, color=ctx.color) + ctx.exit() + + +version_option = click.Option( + ['--version'], + help='Show the flask version', + expose_value=False, + callback=get_version, + is_flag=True, + is_eager=True +) + + +class DispatchingApp(object): + """Special application that dispatches to a Flask application which + is imported by name in a background thread. If an error happens + it is recorded and shown as part of the WSGI handling which in case + of the Werkzeug debugger means that it shows up in the browser. + """ + + def __init__(self, loader, use_eager_loading=False): + self.loader = loader + self._app = None + self._lock = Lock() + self._bg_loading_exc_info = None + if use_eager_loading: + self._load_unlocked() + else: + self._load_in_background() + + def _load_in_background(self): + def _load_app(): + __traceback_hide__ = True + with self._lock: + try: + self._load_unlocked() + except Exception: + self._bg_loading_exc_info = sys.exc_info() + t = Thread(target=_load_app, args=()) + t.start() + + def _flush_bg_loading_exception(self): + __traceback_hide__ = True + exc_info = self._bg_loading_exc_info + if exc_info is not None: + self._bg_loading_exc_info = None + reraise(*exc_info) + + def _load_unlocked(self): + __traceback_hide__ = True + self._app = rv = self.loader() + self._bg_loading_exc_info = None + return rv + + def __call__(self, environ, start_response): + __traceback_hide__ = True + if self._app is not None: + return self._app(environ, start_response) + self._flush_bg_loading_exception() + with self._lock: + if self._app is not None: + rv = self._app + else: + rv = self._load_unlocked() + return rv(environ, start_response) + + +class ScriptInfo(object): + """Help object to deal with Flask applications. This is usually not + necessary to interface with as it's used internally in the dispatching + to click. In future versions of Flask this object will most likely play + a bigger role. Typically it's created automatically by the + :class:`FlaskGroup` but you can also manually create it and pass it + onwards as click object. + """ + + def __init__(self, app_import_path=None, create_app=None): + #: Optionally the import path for the Flask application. + self.app_import_path = app_import_path or os.environ.get('FLASK_APP') + #: Optionally a function that is passed the script info to create + #: the instance of the application. + self.create_app = create_app + #: A dictionary with arbitrary data that can be associated with + #: this script info. + self.data = {} + self._loaded_app = None + + def load_app(self): + """Loads the Flask app (if not yet loaded) and returns it. Calling + this multiple times will just result in the already loaded app to + be returned. + """ + __traceback_hide__ = True + + if self._loaded_app is not None: + return self._loaded_app + + app = None + + if self.create_app is not None: + app = call_factory(self, self.create_app) + else: + if self.app_import_path: + path, name = (self.app_import_path.split(':', 1) + [None])[:2] + import_name = prepare_import(path) + app = locate_app(self, import_name, name) + else: + for path in ('wsgi.py', 'app.py'): + import_name = prepare_import(path) + app = locate_app(self, import_name, None, + raise_if_not_found=False) + + if app: + break + + if not app: + raise NoAppException( + 'Could not locate a Flask application. You did not provide ' + 'the "FLASK_APP" environment variable, and a "wsgi.py" or ' + '"app.py" module was not found in the current directory.' + ) + + debug = get_debug_flag() + + # Update the app's debug flag through the descriptor so that other + # values repopulate as well. + if debug is not None: + app.debug = debug + + self._loaded_app = app + return app + + +pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) + + +def with_appcontext(f): + """Wraps a callback so that it's guaranteed to be executed with the + script's application context. If callbacks are registered directly + to the ``app.cli`` object then they are wrapped with this function + by default unless it's disabled. + """ + @click.pass_context + def decorator(__ctx, *args, **kwargs): + with __ctx.ensure_object(ScriptInfo).load_app().app_context(): + return __ctx.invoke(f, *args, **kwargs) + return update_wrapper(decorator, f) + + +class AppGroup(click.Group): + """This works similar to a regular click :class:`~click.Group` but it + changes the behavior of the :meth:`command` decorator so that it + automatically wraps the functions in :func:`with_appcontext`. + + Not to be confused with :class:`FlaskGroup`. + """ + + def command(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` + unless it's disabled by passing ``with_appcontext=False``. + """ + wrap_for_ctx = kwargs.pop('with_appcontext', True) + def decorator(f): + if wrap_for_ctx: + f = with_appcontext(f) + return click.Group.command(self, *args, **kwargs)(f) + return decorator + + def group(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it defaults the group class to + :class:`AppGroup`. + """ + kwargs.setdefault('cls', AppGroup) + return click.Group.group(self, *args, **kwargs) + + +class FlaskGroup(AppGroup): + """Special subclass of the :class:`AppGroup` group that supports + loading more commands from the configured Flask app. Normally a + developer does not have to interface with this class but there are + some very advanced use cases for which it makes sense to create an + instance of this. + + For information as of why this is useful see :ref:`custom-scripts`. + + :param add_default_commands: if this is True then the default run and + shell commands wil be added. + :param add_version_option: adds the ``--version`` option. + :param create_app: an optional callback that is passed the script info and + returns the loaded app. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment variables + from :file:`.env` and :file:`.flaskenv` files. + """ + + def __init__(self, add_default_commands=True, create_app=None, + add_version_option=True, load_dotenv=True, **extra): + params = list(extra.pop('params', None) or ()) + + if add_version_option: + params.append(version_option) + + AppGroup.__init__(self, params=params, **extra) + self.create_app = create_app + self.load_dotenv = load_dotenv + + if add_default_commands: + self.add_command(run_command) + self.add_command(shell_command) + self.add_command(routes_command) + + self._loaded_plugin_commands = False + + def _load_plugin_commands(self): + if self._loaded_plugin_commands: + return + try: + import pkg_resources + except ImportError: + self._loaded_plugin_commands = True + return + + for ep in pkg_resources.iter_entry_points('flask.commands'): + self.add_command(ep.load(), ep.name) + self._loaded_plugin_commands = True + + def get_command(self, ctx, name): + self._load_plugin_commands() + + # We load built-in commands first as these should always be the + # same no matter what the app does. If the app does want to + # override this it needs to make a custom instance of this group + # and not attach the default commands. + # + # This also means that the script stays functional in case the + # application completely fails. + rv = AppGroup.get_command(self, ctx, name) + if rv is not None: + return rv + + info = ctx.ensure_object(ScriptInfo) + try: + rv = info.load_app().cli.get_command(ctx, name) + if rv is not None: + return rv + except NoAppException: + pass + + def list_commands(self, ctx): + self._load_plugin_commands() + + # The commands available is the list of both the application (if + # available) plus the builtin commands. + rv = set(click.Group.list_commands(self, ctx)) + info = ctx.ensure_object(ScriptInfo) + try: + rv.update(info.load_app().cli.list_commands(ctx)) + except Exception: + # Here we intentionally swallow all exceptions as we don't + # want the help page to break if the app does not exist. + # If someone attempts to use the command we try to create + # the app again and this will give us the error. + # However, we will not do so silently because that would confuse + # users. + traceback.print_exc() + return sorted(rv) + + def main(self, *args, **kwargs): + # Set a global flag that indicates that we were invoked from the + # command line interface. This is detected by Flask.run to make the + # call into a no-op. This is necessary to avoid ugly errors when the + # script that is loaded here also attempts to start a server. + os.environ['FLASK_RUN_FROM_CLI'] = 'true' + + if get_load_dotenv(self.load_dotenv): + load_dotenv() + + obj = kwargs.get('obj') + + if obj is None: + obj = ScriptInfo(create_app=self.create_app) + + kwargs['obj'] = obj + kwargs.setdefault('auto_envvar_prefix', 'FLASK') + return super(FlaskGroup, self).main(*args, **kwargs) + + +def _path_is_ancestor(path, other): + """Take ``other`` and remove the length of ``path`` from it. Then join it + to ``path``. If it is the original value, ``path`` is an ancestor of + ``other``.""" + return os.path.join(path, other[len(path):].lstrip(os.sep)) == other + + +def load_dotenv(path=None): + """Load "dotenv" files in order of precedence to set environment variables. + + If an env var is already set it is not overwritten, so earlier files in the + list are preferred over later files. + + Changes the current working directory to the location of the first file + found, with the assumption that it is in the top level project directory + and will be where the Python path should import local packages from. + + This is a no-op if `python-dotenv`_ is not installed. + + .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme + + :param path: Load the file at this location instead of searching. + :return: ``True`` if a file was loaded. + + .. versionadded:: 1.0 + """ + if dotenv is None: + if path or os.path.exists('.env') or os.path.exists('.flaskenv'): + click.secho( + ' * Tip: There are .env files present.' + ' Do "pip install python-dotenv" to use them.', + fg='yellow') + return + + if path is not None: + return dotenv.load_dotenv(path) + + new_dir = None + + for name in ('.env', '.flaskenv'): + path = dotenv.find_dotenv(name, usecwd=True) + + if not path: + continue + + if new_dir is None: + new_dir = os.path.dirname(path) + + dotenv.load_dotenv(path) + + if new_dir and os.getcwd() != new_dir: + os.chdir(new_dir) + + return new_dir is not None # at least one file was located and loaded + + +def show_server_banner(env, debug, app_import_path, eager_loading): + """Show extra startup messages the first time the server is run, + ignoring the reloader. + """ + if os.environ.get('WERKZEUG_RUN_MAIN') == 'true': + return + + if app_import_path is not None: + message = ' * Serving Flask app "{0}"'.format(app_import_path) + + if not eager_loading: + message += ' (lazy loading)' + + click.echo(message) + + click.echo(' * Environment: {0}'.format(env)) + + if env == 'production': + click.secho( + ' WARNING: Do not use the development server in a production' + ' environment.', fg='red') + click.secho(' Use a production WSGI server instead.', dim=True) + + if debug is not None: + click.echo(' * Debug mode: {0}'.format('on' if debug else 'off')) + + +class CertParamType(click.ParamType): + """Click option type for the ``--cert`` option. Allows either an + existing file, the string ``'adhoc'``, or an import for a + :class:`~ssl.SSLContext` object. + """ + + name = 'path' + + def __init__(self): + self.path_type = click.Path( + exists=True, dir_okay=False, resolve_path=True) + + def convert(self, value, param, ctx): + try: + return self.path_type(value, param, ctx) + except click.BadParameter: + value = click.STRING(value, param, ctx).lower() + + if value == 'adhoc': + try: + import OpenSSL + except ImportError: + raise click.BadParameter( + 'Using ad-hoc certificates requires pyOpenSSL.', + ctx, param) + + return value + + obj = import_string(value, silent=True) + + if sys.version_info < (2, 7): + if obj: + return obj + else: + if isinstance(obj, ssl.SSLContext): + return obj + + raise + + +def _validate_key(ctx, param, value): + """The ``--key`` option must be specified when ``--cert`` is a file. + Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. + """ + cert = ctx.params.get('cert') + is_adhoc = cert == 'adhoc' + + if sys.version_info < (2, 7): + is_context = cert and not isinstance(cert, (text_type, bytes)) + else: + is_context = isinstance(cert, ssl.SSLContext) + + if value is not None: + if is_adhoc: + raise click.BadParameter( + 'When "--cert" is "adhoc", "--key" is not used.', + ctx, param) + + if is_context: + raise click.BadParameter( + 'When "--cert" is an SSLContext object, "--key is not used.', + ctx, param) + + if not cert: + raise click.BadParameter( + '"--cert" must also be specified.', + ctx, param) + + ctx.params['cert'] = cert, value + + else: + if cert and not (is_adhoc or is_context): + raise click.BadParameter( + 'Required when using "--cert".', + ctx, param) + + return value + + +@click.command('run', short_help='Runs a development server.') +@click.option('--host', '-h', default='127.0.0.1', + help='The interface to bind to.') +@click.option('--port', '-p', default=5000, + help='The port to bind to.') +@click.option('--cert', type=CertParamType(), + help='Specify a certificate file to use HTTPS.') +@click.option('--key', + type=click.Path(exists=True, dir_okay=False, resolve_path=True), + callback=_validate_key, expose_value=False, + help='The key file to use when specifying a certificate.') +@click.option('--reload/--no-reload', default=None, + help='Enable or disable the reloader. By default the reloader ' + 'is active if debug is enabled.') +@click.option('--debugger/--no-debugger', default=None, + help='Enable or disable the debugger. By default the debugger ' + 'is active if debug is enabled.') +@click.option('--eager-loading/--lazy-loader', default=None, + help='Enable or disable eager loading. By default eager ' + 'loading is enabled if the reloader is disabled.') +@click.option('--with-threads/--without-threads', default=True, + help='Enable or disable multithreading.') +@pass_script_info +def run_command(info, host, port, reload, debugger, eager_loading, + with_threads, cert): + """Run a local development server. + + This server is for development purposes only. It does not provide + the stability, security, or performance of production WSGI servers. + + The reloader and debugger are enabled by default if + FLASK_ENV=development or FLASK_DEBUG=1. + """ + debug = get_debug_flag() + + if reload is None: + reload = debug + + if debugger is None: + debugger = debug + + if eager_loading is None: + eager_loading = not reload + + show_server_banner(get_env(), debug, info.app_import_path, eager_loading) + app = DispatchingApp(info.load_app, use_eager_loading=eager_loading) + + from werkzeug.serving import run_simple + run_simple(host, port, app, use_reloader=reload, use_debugger=debugger, + threaded=with_threads, ssl_context=cert) + + +@click.command('shell', short_help='Runs a shell in the app context.') +@with_appcontext +def shell_command(): + """Runs an interactive Python shell in the context of a given + Flask application. The application will populate the default + namespace of this shell according to it's configuration. + + This is useful for executing small snippets of management code + without having to manually configure the application. + """ + import code + from flask.globals import _app_ctx_stack + app = _app_ctx_stack.top.app + banner = 'Python %s on %s\nApp: %s [%s]\nInstance: %s' % ( + sys.version, + sys.platform, + app.import_name, + app.env, + app.instance_path, + ) + ctx = {} + + # Support the regular Python interpreter startup script if someone + # is using it. + startup = os.environ.get('PYTHONSTARTUP') + if startup and os.path.isfile(startup): + with open(startup, 'r') as f: + eval(compile(f.read(), startup, 'exec'), ctx) + + ctx.update(app.make_shell_context()) + + code.interact(banner=banner, local=ctx) + + +@click.command('routes', short_help='Show the routes for the app.') +@click.option( + '--sort', '-s', + type=click.Choice(('endpoint', 'methods', 'rule', 'match')), + default='endpoint', + help=( + 'Method to sort routes by. "match" is the order that Flask will match ' + 'routes when dispatching a request.' + ) +) +@click.option( + '--all-methods', + is_flag=True, + help="Show HEAD and OPTIONS methods." +) +@with_appcontext +def routes_command(sort, all_methods): + """Show all registered routes with endpoints and methods.""" + + rules = list(current_app.url_map.iter_rules()) + if not rules: + click.echo('No routes were registered.') + return + + ignored_methods = set(() if all_methods else ('HEAD', 'OPTIONS')) + + if sort in ('endpoint', 'rule'): + rules = sorted(rules, key=attrgetter(sort)) + elif sort == 'methods': + rules = sorted(rules, key=lambda rule: sorted(rule.methods)) + + rule_methods = [ + ', '.join(sorted(rule.methods - ignored_methods)) for rule in rules + ] + + headers = ('Endpoint', 'Methods', 'Rule') + widths = ( + max(len(rule.endpoint) for rule in rules), + max(len(methods) for methods in rule_methods), + max(len(rule.rule) for rule in rules), + ) + widths = [max(len(h), w) for h, w in zip(headers, widths)] + row = '{{0:<{0}}} {{1:<{1}}} {{2:<{2}}}'.format(*widths) + + click.echo(row.format(*headers).strip()) + click.echo(row.format(*('-' * width for width in widths))) + + for rule, methods in zip(rules, rule_methods): + click.echo(row.format(rule.endpoint, methods, rule.rule).rstrip()) + + +cli = FlaskGroup(help="""\ +A general utility script for Flask applications. + +Provides commands from Flask, extensions, and the application. Loads the +application defined in the FLASK_APP environment variable, or from a wsgi.py +file. Setting the FLASK_ENV environment variable to 'development' will enable +debug mode. + +\b + {prefix}{cmd} FLASK_APP=hello.py + {prefix}{cmd} FLASK_ENV=development + {prefix}flask run +""".format( + cmd='export' if os.name == 'posix' else 'set', + prefix='$ ' if os.name == 'posix' else '> ' +)) + + +def main(as_module=False): + args = sys.argv[1:] + + if as_module: + this_module = 'flask' + + if sys.version_info < (2, 7): + this_module += '.cli' + + name = 'python -m ' + this_module + + # Python rewrites "python -m flask" to the path to the file in argv. + # Restore the original command so that the reloader works. + sys.argv = ['-m', this_module] + args + else: + name = None + + cli.main(args=args, prog_name=name) + + +if __name__ == '__main__': + main(as_module=True) diff --git a/venv/Lib/site-packages/flask/config.py b/venv/Lib/site-packages/flask/config.py new file mode 100644 index 00000000..d6074baa --- /dev/null +++ b/venv/Lib/site-packages/flask/config.py @@ -0,0 +1,265 @@ +# -*- coding: utf-8 -*- +""" + flask.config + ~~~~~~~~~~~~ + + Implements the configuration related objects. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import os +import types +import errno + +from werkzeug.utils import import_string +from ._compat import string_types, iteritems +from . import json + + +class ConfigAttribute(object): + """Makes an attribute forward to the config""" + + def __init__(self, name, get_converter=None): + self.__name__ = name + self.get_converter = get_converter + + def __get__(self, obj, type=None): + if obj is None: + return self + rv = obj.config[self.__name__] + if self.get_converter is not None: + rv = self.get_converter(rv) + return rv + + def __set__(self, obj, value): + obj.config[self.__name__] = value + + +class Config(dict): + """Works exactly like a dict but provides ways to fill it from files + or special dictionaries. There are two common patterns to populate the + config. + + Either you can fill the config from a config file:: + + app.config.from_pyfile('yourconfig.cfg') + + Or alternatively you can define the configuration options in the + module that calls :meth:`from_object` or provide an import path to + a module that should be loaded. It is also possible to tell it to + use the same module and with that provide the configuration values + just before the call:: + + DEBUG = True + SECRET_KEY = 'development key' + app.config.from_object(__name__) + + In both cases (loading from any Python file or loading from modules), + only uppercase keys are added to the config. This makes it possible to use + lowercase values in the config file for temporary values that are not added + to the config or to define the config keys in the same file that implements + the application. + + Probably the most interesting way to load configurations is from an + environment variable pointing to a file:: + + app.config.from_envvar('YOURAPPLICATION_SETTINGS') + + In this case before launching the application you have to set this + environment variable to the file you want to use. On Linux and OS X + use the export statement:: + + export YOURAPPLICATION_SETTINGS='/path/to/config/file' + + On windows use `set` instead. + + :param root_path: path to which files are read relative from. When the + config object is created by the application, this is + the application's :attr:`~flask.Flask.root_path`. + :param defaults: an optional dictionary of default values + """ + + def __init__(self, root_path, defaults=None): + dict.__init__(self, defaults or {}) + self.root_path = root_path + + def from_envvar(self, variable_name, silent=False): + """Loads a configuration from an environment variable pointing to + a configuration file. This is basically just a shortcut with nicer + error messages for this line of code:: + + app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) + + :param variable_name: name of the environment variable + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: bool. ``True`` if able to load config, ``False`` otherwise. + """ + rv = os.environ.get(variable_name) + if not rv: + if silent: + return False + raise RuntimeError('The environment variable %r is not set ' + 'and as such configuration could not be ' + 'loaded. Set this variable and make it ' + 'point to a configuration file' % + variable_name) + return self.from_pyfile(rv, silent=silent) + + def from_pyfile(self, filename, silent=False): + """Updates the values in the config from a Python file. This function + behaves as if the file was imported as module with the + :meth:`from_object` function. + + :param filename: the filename of the config. This can either be an + absolute filename or a filename relative to the + root path. + :param silent: set to ``True`` if you want silent failure for missing + files. + + .. versionadded:: 0.7 + `silent` parameter. + """ + filename = os.path.join(self.root_path, filename) + d = types.ModuleType('config') + d.__file__ = filename + try: + with open(filename, mode='rb') as config_file: + exec(compile(config_file.read(), filename, 'exec'), d.__dict__) + except IOError as e: + if silent and e.errno in ( + errno.ENOENT, errno.EISDIR, errno.ENOTDIR + ): + return False + e.strerror = 'Unable to load configuration file (%s)' % e.strerror + raise + self.from_object(d) + return True + + def from_object(self, obj): + """Updates the values from the given object. An object can be of one + of the following two types: + + - a string: in this case the object with that name will be imported + - an actual object reference: that object is used directly + + Objects are usually either modules or classes. :meth:`from_object` + loads only the uppercase attributes of the module/class. A ``dict`` + object will not work with :meth:`from_object` because the keys of a + ``dict`` are not attributes of the ``dict`` class. + + Example of module-based configuration:: + + app.config.from_object('yourapplication.default_config') + from yourapplication import default_config + app.config.from_object(default_config) + + You should not use this function to load the actual configuration but + rather configuration defaults. The actual config should be loaded + with :meth:`from_pyfile` and ideally from a location not within the + package because the package might be installed system wide. + + See :ref:`config-dev-prod` for an example of class-based configuration + using :meth:`from_object`. + + :param obj: an import name or object + """ + if isinstance(obj, string_types): + obj = import_string(obj) + for key in dir(obj): + if key.isupper(): + self[key] = getattr(obj, key) + + def from_json(self, filename, silent=False): + """Updates the values in the config from a JSON file. This function + behaves as if the JSON object was a dictionary and passed to the + :meth:`from_mapping` function. + + :param filename: the filename of the JSON file. This can either be an + absolute filename or a filename relative to the + root path. + :param silent: set to ``True`` if you want silent failure for missing + files. + + .. versionadded:: 0.11 + """ + filename = os.path.join(self.root_path, filename) + + try: + with open(filename) as json_file: + obj = json.loads(json_file.read()) + except IOError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR): + return False + e.strerror = 'Unable to load configuration file (%s)' % e.strerror + raise + return self.from_mapping(obj) + + def from_mapping(self, *mapping, **kwargs): + """Updates the config like :meth:`update` ignoring items with non-upper + keys. + + .. versionadded:: 0.11 + """ + mappings = [] + if len(mapping) == 1: + if hasattr(mapping[0], 'items'): + mappings.append(mapping[0].items()) + else: + mappings.append(mapping[0]) + elif len(mapping) > 1: + raise TypeError( + 'expected at most 1 positional argument, got %d' % len(mapping) + ) + mappings.append(kwargs.items()) + for mapping in mappings: + for (key, value) in mapping: + if key.isupper(): + self[key] = value + return True + + def get_namespace(self, namespace, lowercase=True, trim_namespace=True): + """Returns a dictionary containing a subset of configuration options + that match the specified namespace/prefix. Example usage:: + + app.config['IMAGE_STORE_TYPE'] = 'fs' + app.config['IMAGE_STORE_PATH'] = '/var/app/images' + app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' + image_store_config = app.config.get_namespace('IMAGE_STORE_') + + The resulting dictionary `image_store_config` would look like:: + + { + 'type': 'fs', + 'path': '/var/app/images', + 'base_url': 'http://img.website.com' + } + + This is often useful when configuration options map directly to + keyword arguments in functions or class constructors. + + :param namespace: a configuration namespace + :param lowercase: a flag indicating if the keys of the resulting + dictionary should be lowercase + :param trim_namespace: a flag indicating if the keys of the resulting + dictionary should not include the namespace + + .. versionadded:: 0.11 + """ + rv = {} + for k, v in iteritems(self): + if not k.startswith(namespace): + continue + if trim_namespace: + key = k[len(namespace):] + else: + key = k + if lowercase: + key = key.lower() + rv[key] = v + return rv + + def __repr__(self): + return '<%s %s>' % (self.__class__.__name__, dict.__repr__(self)) diff --git a/venv/Lib/site-packages/flask/ctx.py b/venv/Lib/site-packages/flask/ctx.py new file mode 100644 index 00000000..8472c920 --- /dev/null +++ b/venv/Lib/site-packages/flask/ctx.py @@ -0,0 +1,457 @@ +# -*- coding: utf-8 -*- +""" + flask.ctx + ~~~~~~~~~ + + Implements the objects required to keep the context. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import sys +from functools import update_wrapper + +from werkzeug.exceptions import HTTPException + +from .globals import _request_ctx_stack, _app_ctx_stack +from .signals import appcontext_pushed, appcontext_popped +from ._compat import BROKEN_PYPY_CTXMGR_EXIT, reraise + + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +class _AppCtxGlobals(object): + """A plain object. Used as a namespace for storing data during an + application context. + + Creating an app context automatically creates this object, which is + made available as the :data:`g` proxy. + + .. describe:: 'key' in g + + Check whether an attribute is present. + + .. versionadded:: 0.10 + + .. describe:: iter(g) + + Return an iterator over the attribute names. + + .. versionadded:: 0.10 + """ + + def get(self, name, default=None): + """Get an attribute by name, or a default value. Like + :meth:`dict.get`. + + :param name: Name of attribute to get. + :param default: Value to return if the attribute is not present. + + .. versionadded:: 0.10 + """ + return self.__dict__.get(name, default) + + def pop(self, name, default=_sentinel): + """Get and remove an attribute by name. Like :meth:`dict.pop`. + + :param name: Name of attribute to pop. + :param default: Value to return if the attribute is not present, + instead of raise a ``KeyError``. + + .. versionadded:: 0.11 + """ + if default is _sentinel: + return self.__dict__.pop(name) + else: + return self.__dict__.pop(name, default) + + def setdefault(self, name, default=None): + """Get the value of an attribute if it is present, otherwise + set and return a default value. Like :meth:`dict.setdefault`. + + :param name: Name of attribute to get. + :param: default: Value to set and return if the attribute is not + present. + + .. versionadded:: 0.11 + """ + return self.__dict__.setdefault(name, default) + + def __contains__(self, item): + return item in self.__dict__ + + def __iter__(self): + return iter(self.__dict__) + + def __repr__(self): + top = _app_ctx_stack.top + if top is not None: + return '' % top.app.name + return object.__repr__(self) + + +def after_this_request(f): + """Executes a function after this request. This is useful to modify + response objects. The function is passed the response object and has + to return the same or a new one. + + Example:: + + @app.route('/') + def index(): + @after_this_request + def add_header(response): + response.headers['X-Foo'] = 'Parachute' + return response + return 'Hello World!' + + This is more useful if a function other than the view function wants to + modify a response. For instance think of a decorator that wants to add + some headers without converting the return value into a response object. + + .. versionadded:: 0.9 + """ + _request_ctx_stack.top._after_request_functions.append(f) + return f + + +def copy_current_request_context(f): + """A helper function that decorates a function to retain the current + request context. This is useful when working with greenlets. The moment + the function is decorated a copy of the request context is created and + then pushed when the function is called. + + Example:: + + import gevent + from flask import copy_current_request_context + + @app.route('/') + def index(): + @copy_current_request_context + def do_some_work(): + # do some work here, it can access flask.request like you + # would otherwise in the view function. + ... + gevent.spawn(do_some_work) + return 'Regular response' + + .. versionadded:: 0.10 + """ + top = _request_ctx_stack.top + if top is None: + raise RuntimeError('This decorator can only be used at local scopes ' + 'when a request context is on the stack. For instance within ' + 'view functions.') + reqctx = top.copy() + def wrapper(*args, **kwargs): + with reqctx: + return f(*args, **kwargs) + return update_wrapper(wrapper, f) + + +def has_request_context(): + """If you have code that wants to test if a request context is there or + not this function can be used. For instance, you may want to take advantage + of request information if the request object is available, but fail + silently if it is unavailable. + + :: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and has_request_context(): + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + Alternatively you can also just test any of the context bound objects + (such as :class:`request` or :class:`g` for truthness):: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and request: + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + .. versionadded:: 0.7 + """ + return _request_ctx_stack.top is not None + + +def has_app_context(): + """Works like :func:`has_request_context` but for the application + context. You can also just do a boolean check on the + :data:`current_app` object instead. + + .. versionadded:: 0.9 + """ + return _app_ctx_stack.top is not None + + +class AppContext(object): + """The application context binds an application object implicitly + to the current thread or greenlet, similar to how the + :class:`RequestContext` binds request information. The application + context is also implicitly created if a request context is created + but the application is not on top of the individual application + context. + """ + + def __init__(self, app): + self.app = app + self.url_adapter = app.create_url_adapter(None) + self.g = app.app_ctx_globals_class() + + # Like request context, app contexts can be pushed multiple times + # but there a basic "refcount" is enough to track them. + self._refcnt = 0 + + def push(self): + """Binds the app context to the current context.""" + self._refcnt += 1 + if hasattr(sys, 'exc_clear'): + sys.exc_clear() + _app_ctx_stack.push(self) + appcontext_pushed.send(self.app) + + def pop(self, exc=_sentinel): + """Pops the app context.""" + try: + self._refcnt -= 1 + if self._refcnt <= 0: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_appcontext(exc) + finally: + rv = _app_ctx_stack.pop() + assert rv is self, 'Popped wrong app context. (%r instead of %r)' \ + % (rv, self) + appcontext_popped.send(self.app) + + def __enter__(self): + self.push() + return self + + def __exit__(self, exc_type, exc_value, tb): + self.pop(exc_value) + + if BROKEN_PYPY_CTXMGR_EXIT and exc_type is not None: + reraise(exc_type, exc_value, tb) + + +class RequestContext(object): + """The request context contains all request relevant information. It is + created at the beginning of the request and pushed to the + `_request_ctx_stack` and removed at the end of it. It will create the + URL adapter and request object for the WSGI environment provided. + + Do not attempt to use this class directly, instead use + :meth:`~flask.Flask.test_request_context` and + :meth:`~flask.Flask.request_context` to create this object. + + When the request context is popped, it will evaluate all the + functions registered on the application for teardown execution + (:meth:`~flask.Flask.teardown_request`). + + The request context is automatically popped at the end of the request + for you. In debug mode the request context is kept around if + exceptions happen so that interactive debuggers have a chance to + introspect the data. With 0.4 this can also be forced for requests + that did not fail and outside of ``DEBUG`` mode. By setting + ``'flask._preserve_context'`` to ``True`` on the WSGI environment the + context will not pop itself at the end of the request. This is used by + the :meth:`~flask.Flask.test_client` for example to implement the + deferred cleanup functionality. + + You might find this helpful for unittests where you need the + information from the context local around for a little longer. Make + sure to properly :meth:`~werkzeug.LocalStack.pop` the stack yourself in + that situation, otherwise your unittests will leak memory. + """ + + def __init__(self, app, environ, request=None): + self.app = app + if request is None: + request = app.request_class(environ) + self.request = request + self.url_adapter = app.create_url_adapter(self.request) + self.flashes = None + self.session = None + + # Request contexts can be pushed multiple times and interleaved with + # other request contexts. Now only if the last level is popped we + # get rid of them. Additionally if an application context is missing + # one is created implicitly so for each level we add this information + self._implicit_app_ctx_stack = [] + + # indicator if the context was preserved. Next time another context + # is pushed the preserved context is popped. + self.preserved = False + + # remembers the exception for pop if there is one in case the context + # preservation kicks in. + self._preserved_exc = None + + # Functions that should be executed after the request on the response + # object. These will be called before the regular "after_request" + # functions. + self._after_request_functions = [] + + self.match_request() + + def _get_g(self): + return _app_ctx_stack.top.g + def _set_g(self, value): + _app_ctx_stack.top.g = value + g = property(_get_g, _set_g) + del _get_g, _set_g + + def copy(self): + """Creates a copy of this request context with the same request object. + This can be used to move a request context to a different greenlet. + Because the actual request object is the same this cannot be used to + move a request context to a different thread unless access to the + request object is locked. + + .. versionadded:: 0.10 + """ + return self.__class__(self.app, + environ=self.request.environ, + request=self.request + ) + + def match_request(self): + """Can be overridden by a subclass to hook into the matching + of the request. + """ + try: + url_rule, self.request.view_args = \ + self.url_adapter.match(return_rule=True) + self.request.url_rule = url_rule + except HTTPException as e: + self.request.routing_exception = e + + def push(self): + """Binds the request context to the current context.""" + # If an exception occurs in debug mode or if context preservation is + # activated under exception situations exactly one context stays + # on the stack. The rationale is that you want to access that + # information under debug situations. However if someone forgets to + # pop that context again we want to make sure that on the next push + # it's invalidated, otherwise we run at risk that something leaks + # memory. This is usually only a problem in test suite since this + # functionality is not active in production environments. + top = _request_ctx_stack.top + if top is not None and top.preserved: + top.pop(top._preserved_exc) + + # Before we push the request context we have to ensure that there + # is an application context. + app_ctx = _app_ctx_stack.top + if app_ctx is None or app_ctx.app != self.app: + app_ctx = self.app.app_context() + app_ctx.push() + self._implicit_app_ctx_stack.append(app_ctx) + else: + self._implicit_app_ctx_stack.append(None) + + if hasattr(sys, 'exc_clear'): + sys.exc_clear() + + _request_ctx_stack.push(self) + + # Open the session at the moment that the request context is available. + # This allows a custom open_session method to use the request context. + # Only open a new session if this is the first time the request was + # pushed, otherwise stream_with_context loses the session. + if self.session is None: + session_interface = self.app.session_interface + self.session = session_interface.open_session( + self.app, self.request + ) + + if self.session is None: + self.session = session_interface.make_null_session(self.app) + + def pop(self, exc=_sentinel): + """Pops the request context and unbinds it by doing that. This will + also trigger the execution of functions registered by the + :meth:`~flask.Flask.teardown_request` decorator. + + .. versionchanged:: 0.9 + Added the `exc` argument. + """ + app_ctx = self._implicit_app_ctx_stack.pop() + + try: + clear_request = False + if not self._implicit_app_ctx_stack: + self.preserved = False + self._preserved_exc = None + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_request(exc) + + # If this interpreter supports clearing the exception information + # we do that now. This will only go into effect on Python 2.x, + # on 3.x it disappears automatically at the end of the exception + # stack. + if hasattr(sys, 'exc_clear'): + sys.exc_clear() + + request_close = getattr(self.request, 'close', None) + if request_close is not None: + request_close() + clear_request = True + finally: + rv = _request_ctx_stack.pop() + + # get rid of circular dependencies at the end of the request + # so that we don't require the GC to be active. + if clear_request: + rv.request.environ['werkzeug.request'] = None + + # Get rid of the app as well if necessary. + if app_ctx is not None: + app_ctx.pop(exc) + + assert rv is self, 'Popped wrong request context. ' \ + '(%r instead of %r)' % (rv, self) + + def auto_pop(self, exc): + if self.request.environ.get('flask._preserve_context') or \ + (exc is not None and self.app.preserve_context_on_exception): + self.preserved = True + self._preserved_exc = exc + else: + self.pop(exc) + + def __enter__(self): + self.push() + return self + + def __exit__(self, exc_type, exc_value, tb): + # do not pop the request stack if we are in debug mode and an + # exception happened. This will allow the debugger to still + # access the request object in the interactive shell. Furthermore + # the context can be force kept alive for the test client. + # See flask.testing for how this works. + self.auto_pop(exc_value) + + if BROKEN_PYPY_CTXMGR_EXIT and exc_type is not None: + reraise(exc_type, exc_value, tb) + + def __repr__(self): + return '<%s \'%s\' [%s] of %s>' % ( + self.__class__.__name__, + self.request.url, + self.request.method, + self.app.name, + ) diff --git a/venv/Lib/site-packages/flask/debughelpers.py b/venv/Lib/site-packages/flask/debughelpers.py new file mode 100644 index 00000000..e9765f20 --- /dev/null +++ b/venv/Lib/site-packages/flask/debughelpers.py @@ -0,0 +1,168 @@ +# -*- coding: utf-8 -*- +""" + flask.debughelpers + ~~~~~~~~~~~~~~~~~~ + + Various helpers to make the development experience better. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import os +from warnings import warn + +from ._compat import implements_to_string, text_type +from .app import Flask +from .blueprints import Blueprint +from .globals import _request_ctx_stack + + +class UnexpectedUnicodeError(AssertionError, UnicodeError): + """Raised in places where we want some better error reporting for + unexpected unicode or binary data. + """ + + +@implements_to_string +class DebugFilesKeyError(KeyError, AssertionError): + """Raised from request.files during debugging. The idea is that it can + provide a better error message than just a generic KeyError/BadRequest. + """ + + def __init__(self, request, key): + form_matches = request.form.getlist(key) + buf = ['You tried to access the file "%s" in the request.files ' + 'dictionary but it does not exist. The mimetype for the request ' + 'is "%s" instead of "multipart/form-data" which means that no ' + 'file contents were transmitted. To fix this error you should ' + 'provide enctype="multipart/form-data" in your form.' % + (key, request.mimetype)] + if form_matches: + buf.append('\n\nThe browser instead transmitted some file names. ' + 'This was submitted: %s' % ', '.join('"%s"' % x + for x in form_matches)) + self.msg = ''.join(buf) + + def __str__(self): + return self.msg + + +class FormDataRoutingRedirect(AssertionError): + """This exception is raised by Flask in debug mode if it detects a + redirect caused by the routing system when the request method is not + GET, HEAD or OPTIONS. Reasoning: form data will be dropped. + """ + + def __init__(self, request): + exc = request.routing_exception + buf = ['A request was sent to this URL (%s) but a redirect was ' + 'issued automatically by the routing system to "%s".' + % (request.url, exc.new_url)] + + # In case just a slash was appended we can be extra helpful + if request.base_url + '/' == exc.new_url.split('?')[0]: + buf.append(' The URL was defined with a trailing slash so ' + 'Flask will automatically redirect to the URL ' + 'with the trailing slash if it was accessed ' + 'without one.') + + buf.append(' Make sure to directly send your %s-request to this URL ' + 'since we can\'t make browsers or HTTP clients redirect ' + 'with form data reliably or without user interaction.' % + request.method) + buf.append('\n\nNote: this exception is only raised in debug mode') + AssertionError.__init__(self, ''.join(buf).encode('utf-8')) + + +def attach_enctype_error_multidict(request): + """Since Flask 0.8 we're monkeypatching the files object in case a + request is detected that does not use multipart form data but the files + object is accessed. + """ + oldcls = request.files.__class__ + class newcls(oldcls): + def __getitem__(self, key): + try: + return oldcls.__getitem__(self, key) + except KeyError: + if key not in request.form: + raise + raise DebugFilesKeyError(request, key) + newcls.__name__ = oldcls.__name__ + newcls.__module__ = oldcls.__module__ + request.files.__class__ = newcls + + +def _dump_loader_info(loader): + yield 'class: %s.%s' % (type(loader).__module__, type(loader).__name__) + for key, value in sorted(loader.__dict__.items()): + if key.startswith('_'): + continue + if isinstance(value, (tuple, list)): + if not all(isinstance(x, (str, text_type)) for x in value): + continue + yield '%s:' % key + for item in value: + yield ' - %s' % item + continue + elif not isinstance(value, (str, text_type, int, float, bool)): + continue + yield '%s: %r' % (key, value) + + +def explain_template_loading_attempts(app, template, attempts): + """This should help developers understand what failed""" + info = ['Locating template "%s":' % template] + total_found = 0 + blueprint = None + reqctx = _request_ctx_stack.top + if reqctx is not None and reqctx.request.blueprint is not None: + blueprint = reqctx.request.blueprint + + for idx, (loader, srcobj, triple) in enumerate(attempts): + if isinstance(srcobj, Flask): + src_info = 'application "%s"' % srcobj.import_name + elif isinstance(srcobj, Blueprint): + src_info = 'blueprint "%s" (%s)' % (srcobj.name, + srcobj.import_name) + else: + src_info = repr(srcobj) + + info.append('% 5d: trying loader of %s' % ( + idx + 1, src_info)) + + for line in _dump_loader_info(loader): + info.append(' %s' % line) + + if triple is None: + detail = 'no match' + else: + detail = 'found (%r)' % (triple[1] or '') + total_found += 1 + info.append(' -> %s' % detail) + + seems_fishy = False + if total_found == 0: + info.append('Error: the template could not be found.') + seems_fishy = True + elif total_found > 1: + info.append('Warning: multiple loaders returned a match for the template.') + seems_fishy = True + + if blueprint is not None and seems_fishy: + info.append(' The template was looked up from an endpoint that ' + 'belongs to the blueprint "%s".' % blueprint) + info.append(' Maybe you did not place a template in the right folder?') + info.append(' See http://flask.pocoo.org/docs/blueprints/#templates') + + app.logger.info('\n'.join(info)) + + +def explain_ignored_app_run(): + if os.environ.get('WERKZEUG_RUN_MAIN') != 'true': + warn(Warning('Silently ignoring app.run() because the ' + 'application is run from the flask command line ' + 'executable. Consider putting app.run() behind an ' + 'if __name__ == "__main__" guard to silence this ' + 'warning.'), stacklevel=3) diff --git a/venv/Lib/site-packages/flask/globals.py b/venv/Lib/site-packages/flask/globals.py new file mode 100644 index 00000000..7d50a6f6 --- /dev/null +++ b/venv/Lib/site-packages/flask/globals.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +""" + flask.globals + ~~~~~~~~~~~~~ + + Defines all the global objects that are proxies to the current + active context. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +from functools import partial +from werkzeug.local import LocalStack, LocalProxy + + +_request_ctx_err_msg = '''\ +Working outside of request context. + +This typically means that you attempted to use functionality that needed +an active HTTP request. Consult the documentation on testing for +information about how to avoid this problem.\ +''' +_app_ctx_err_msg = '''\ +Working outside of application context. + +This typically means that you attempted to use functionality that needed +to interface with the current application object in some way. To solve +this, set up an application context with app.app_context(). See the +documentation for more information.\ +''' + + +def _lookup_req_object(name): + top = _request_ctx_stack.top + if top is None: + raise RuntimeError(_request_ctx_err_msg) + return getattr(top, name) + + +def _lookup_app_object(name): + top = _app_ctx_stack.top + if top is None: + raise RuntimeError(_app_ctx_err_msg) + return getattr(top, name) + + +def _find_app(): + top = _app_ctx_stack.top + if top is None: + raise RuntimeError(_app_ctx_err_msg) + return top.app + + +# context locals +_request_ctx_stack = LocalStack() +_app_ctx_stack = LocalStack() +current_app = LocalProxy(_find_app) +request = LocalProxy(partial(_lookup_req_object, 'request')) +session = LocalProxy(partial(_lookup_req_object, 'session')) +g = LocalProxy(partial(_lookup_app_object, 'g')) diff --git a/venv/Lib/site-packages/flask/helpers.py b/venv/Lib/site-packages/flask/helpers.py new file mode 100644 index 00000000..df0b91fc --- /dev/null +++ b/venv/Lib/site-packages/flask/helpers.py @@ -0,0 +1,1044 @@ +# -*- coding: utf-8 -*- +""" + flask.helpers + ~~~~~~~~~~~~~ + + Implements various helpers. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import os +import socket +import sys +import pkgutil +import posixpath +import mimetypes +from time import time +from zlib import adler32 +from threading import RLock +import unicodedata +from werkzeug.routing import BuildError +from functools import update_wrapper + +from werkzeug.urls import url_quote +from werkzeug.datastructures import Headers, Range +from werkzeug.exceptions import BadRequest, NotFound, \ + RequestedRangeNotSatisfiable + +from werkzeug.wsgi import wrap_file +from jinja2 import FileSystemLoader + +from .signals import message_flashed +from .globals import session, _request_ctx_stack, _app_ctx_stack, \ + current_app, request +from ._compat import string_types, text_type, PY2 + +# sentinel +_missing = object() + + +# what separators does this operating system provide that are not a slash? +# this is used by the send_from_directory function to ensure that nobody is +# able to access files from outside the filesystem. +_os_alt_seps = list(sep for sep in [os.path.sep, os.path.altsep] + if sep not in (None, '/')) + + +def get_env(): + """Get the environment the app is running in, indicated by the + :envvar:`FLASK_ENV` environment variable. The default is + ``'production'``. + """ + return os.environ.get('FLASK_ENV') or 'production' + + +def get_debug_flag(): + """Get whether debug mode should be enabled for the app, indicated + by the :envvar:`FLASK_DEBUG` environment variable. The default is + ``True`` if :func:`.get_env` returns ``'development'``, or ``False`` + otherwise. + """ + val = os.environ.get('FLASK_DEBUG') + + if not val: + return get_env() == 'development' + + return val.lower() not in ('0', 'false', 'no') + + +def get_load_dotenv(default=True): + """Get whether the user has disabled loading dotenv files by setting + :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load the + files. + + :param default: What to return if the env var isn't set. + """ + val = os.environ.get('FLASK_SKIP_DOTENV') + + if not val: + return default + + return val.lower() in ('0', 'false', 'no') + + +def _endpoint_from_view_func(view_func): + """Internal helper that returns the default endpoint for a given + function. This always is the function name. + """ + assert view_func is not None, 'expected view func if endpoint ' \ + 'is not provided.' + return view_func.__name__ + + +def stream_with_context(generator_or_function): + """Request contexts disappear when the response is started on the server. + This is done for efficiency reasons and to make it less likely to encounter + memory leaks with badly written WSGI middlewares. The downside is that if + you are using streamed responses, the generator cannot access request bound + information any more. + + This function however can help you keep the context around for longer:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + @stream_with_context + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(generate()) + + Alternatively it can also be used around a specific generator:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(stream_with_context(generate())) + + .. versionadded:: 0.9 + """ + try: + gen = iter(generator_or_function) + except TypeError: + def decorator(*args, **kwargs): + gen = generator_or_function(*args, **kwargs) + return stream_with_context(gen) + return update_wrapper(decorator, generator_or_function) + + def generator(): + ctx = _request_ctx_stack.top + if ctx is None: + raise RuntimeError('Attempted to stream with context but ' + 'there was no context in the first place to keep around.') + with ctx: + # Dummy sentinel. Has to be inside the context block or we're + # not actually keeping the context around. + yield None + + # The try/finally is here so that if someone passes a WSGI level + # iterator in we're still running the cleanup logic. Generators + # don't need that because they are closed on their destruction + # automatically. + try: + for item in gen: + yield item + finally: + if hasattr(gen, 'close'): + gen.close() + + # The trick is to start the generator. Then the code execution runs until + # the first dummy None is yielded at which point the context was already + # pushed. This item is discarded. Then when the iteration continues the + # real generator is executed. + wrapped_g = generator() + next(wrapped_g) + return wrapped_g + + +def make_response(*args): + """Sometimes it is necessary to set additional headers in a view. Because + views do not have to return response objects but can return a value that + is converted into a response object by Flask itself, it becomes tricky to + add headers to it. This function can be called instead of using a return + and you will get a response object which you can use to attach headers. + + If view looked like this and you want to add a new header:: + + def index(): + return render_template('index.html', foo=42) + + You can now do something like this:: + + def index(): + response = make_response(render_template('index.html', foo=42)) + response.headers['X-Parachutes'] = 'parachutes are cool' + return response + + This function accepts the very same arguments you can return from a + view function. This for example creates a response with a 404 error + code:: + + response = make_response(render_template('not_found.html'), 404) + + The other use case of this function is to force the return value of a + view function into a response which is helpful with view + decorators:: + + response = make_response(view_function()) + response.headers['X-Parachutes'] = 'parachutes are cool' + + Internally this function does the following things: + + - if no arguments are passed, it creates a new response argument + - if one argument is passed, :meth:`flask.Flask.make_response` + is invoked with it. + - if more than one argument is passed, the arguments are passed + to the :meth:`flask.Flask.make_response` function as tuple. + + .. versionadded:: 0.6 + """ + if not args: + return current_app.response_class() + if len(args) == 1: + args = args[0] + return current_app.make_response(args) + + +def url_for(endpoint, **values): + """Generates a URL to the given endpoint with the method provided. + + Variable arguments that are unknown to the target endpoint are appended + to the generated URL as query arguments. If the value of a query argument + is ``None``, the whole pair is skipped. In case blueprints are active + you can shortcut references to the same blueprint by prefixing the + local endpoint with a dot (``.``). + + This will reference the index function local to the current blueprint:: + + url_for('.index') + + For more information, head over to the :ref:`Quickstart `. + + To integrate applications, :class:`Flask` has a hook to intercept URL build + errors through :attr:`Flask.url_build_error_handlers`. The `url_for` + function results in a :exc:`~werkzeug.routing.BuildError` when the current + app does not have a URL for the given endpoint and values. When it does, the + :data:`~flask.current_app` calls its :attr:`~Flask.url_build_error_handlers` if + it is not ``None``, which can return a string to use as the result of + `url_for` (instead of `url_for`'s default to raise the + :exc:`~werkzeug.routing.BuildError` exception) or re-raise the exception. + An example:: + + def external_url_handler(error, endpoint, values): + "Looks up an external URL when `url_for` cannot build a URL." + # This is an example of hooking the build_error_handler. + # Here, lookup_url is some utility function you've built + # which looks up the endpoint in some external URL registry. + url = lookup_url(endpoint, **values) + if url is None: + # External lookup did not have a URL. + # Re-raise the BuildError, in context of original traceback. + exc_type, exc_value, tb = sys.exc_info() + if exc_value is error: + raise exc_type, exc_value, tb + else: + raise error + # url_for will use this result, instead of raising BuildError. + return url + + app.url_build_error_handlers.append(external_url_handler) + + Here, `error` is the instance of :exc:`~werkzeug.routing.BuildError`, and + `endpoint` and `values` are the arguments passed into `url_for`. Note + that this is for building URLs outside the current application, and not for + handling 404 NotFound errors. + + .. versionadded:: 0.10 + The `_scheme` parameter was added. + + .. versionadded:: 0.9 + The `_anchor` and `_method` parameters were added. + + .. versionadded:: 0.9 + Calls :meth:`Flask.handle_build_error` on + :exc:`~werkzeug.routing.BuildError`. + + :param endpoint: the endpoint of the URL (name of the function) + :param values: the variable arguments of the URL rule + :param _external: if set to ``True``, an absolute URL is generated. Server + address can be changed via ``SERVER_NAME`` configuration variable which + defaults to `localhost`. + :param _scheme: a string specifying the desired URL scheme. The `_external` + parameter must be set to ``True`` or a :exc:`ValueError` is raised. The default + behavior uses the same scheme as the current request, or + ``PREFERRED_URL_SCHEME`` from the :ref:`app configuration ` if no + request context is available. As of Werkzeug 0.10, this also can be set + to an empty string to build protocol-relative URLs. + :param _anchor: if provided this is added as anchor to the URL. + :param _method: if provided this explicitly specifies an HTTP method. + """ + appctx = _app_ctx_stack.top + reqctx = _request_ctx_stack.top + + if appctx is None: + raise RuntimeError( + 'Attempted to generate a URL without the application context being' + ' pushed. This has to be executed when application context is' + ' available.' + ) + + # If request specific information is available we have some extra + # features that support "relative" URLs. + if reqctx is not None: + url_adapter = reqctx.url_adapter + blueprint_name = request.blueprint + + if endpoint[:1] == '.': + if blueprint_name is not None: + endpoint = blueprint_name + endpoint + else: + endpoint = endpoint[1:] + + external = values.pop('_external', False) + + # Otherwise go with the url adapter from the appctx and make + # the URLs external by default. + else: + url_adapter = appctx.url_adapter + + if url_adapter is None: + raise RuntimeError( + 'Application was not able to create a URL adapter for request' + ' independent URL generation. You might be able to fix this by' + ' setting the SERVER_NAME config variable.' + ) + + external = values.pop('_external', True) + + anchor = values.pop('_anchor', None) + method = values.pop('_method', None) + scheme = values.pop('_scheme', None) + appctx.app.inject_url_defaults(endpoint, values) + + # This is not the best way to deal with this but currently the + # underlying Werkzeug router does not support overriding the scheme on + # a per build call basis. + old_scheme = None + if scheme is not None: + if not external: + raise ValueError('When specifying _scheme, _external must be True') + old_scheme = url_adapter.url_scheme + url_adapter.url_scheme = scheme + + try: + try: + rv = url_adapter.build(endpoint, values, method=method, + force_external=external) + finally: + if old_scheme is not None: + url_adapter.url_scheme = old_scheme + except BuildError as error: + # We need to inject the values again so that the app callback can + # deal with that sort of stuff. + values['_external'] = external + values['_anchor'] = anchor + values['_method'] = method + values['_scheme'] = scheme + return appctx.app.handle_url_build_error(error, endpoint, values) + + if anchor is not None: + rv += '#' + url_quote(anchor) + return rv + + +def get_template_attribute(template_name, attribute): + """Loads a macro (or variable) a template exports. This can be used to + invoke a macro from within Python code. If you for example have a + template named :file:`_cider.html` with the following contents: + + .. sourcecode:: html+jinja + + {% macro hello(name) %}Hello {{ name }}!{% endmacro %} + + You can access this from Python code like this:: + + hello = get_template_attribute('_cider.html', 'hello') + return hello('World') + + .. versionadded:: 0.2 + + :param template_name: the name of the template + :param attribute: the name of the variable of macro to access + """ + return getattr(current_app.jinja_env.get_template(template_name).module, + attribute) + + +def flash(message, category='message'): + """Flashes a message to the next request. In order to remove the + flashed message from the session and to display it to the user, + the template has to call :func:`get_flashed_messages`. + + .. versionchanged:: 0.3 + `category` parameter added. + + :param message: the message to be flashed. + :param category: the category for the message. The following values + are recommended: ``'message'`` for any kind of message, + ``'error'`` for errors, ``'info'`` for information + messages and ``'warning'`` for warnings. However any + kind of string can be used as category. + """ + # Original implementation: + # + # session.setdefault('_flashes', []).append((category, message)) + # + # This assumed that changes made to mutable structures in the session are + # always in sync with the session object, which is not true for session + # implementations that use external storage for keeping their keys/values. + flashes = session.get('_flashes', []) + flashes.append((category, message)) + session['_flashes'] = flashes + message_flashed.send(current_app._get_current_object(), + message=message, category=category) + + +def get_flashed_messages(with_categories=False, category_filter=[]): + """Pulls all flashed messages from the session and returns them. + Further calls in the same request to the function will return + the same messages. By default just the messages are returned, + but when `with_categories` is set to ``True``, the return value will + be a list of tuples in the form ``(category, message)`` instead. + + Filter the flashed messages to one or more categories by providing those + categories in `category_filter`. This allows rendering categories in + separate html blocks. The `with_categories` and `category_filter` + arguments are distinct: + + * `with_categories` controls whether categories are returned with message + text (``True`` gives a tuple, where ``False`` gives just the message text). + * `category_filter` filters the messages down to only those matching the + provided categories. + + See :ref:`message-flashing-pattern` for examples. + + .. versionchanged:: 0.3 + `with_categories` parameter added. + + .. versionchanged:: 0.9 + `category_filter` parameter added. + + :param with_categories: set to ``True`` to also receive categories. + :param category_filter: whitelist of categories to limit return values + """ + flashes = _request_ctx_stack.top.flashes + if flashes is None: + _request_ctx_stack.top.flashes = flashes = session.pop('_flashes') \ + if '_flashes' in session else [] + if category_filter: + flashes = list(filter(lambda f: f[0] in category_filter, flashes)) + if not with_categories: + return [x[1] for x in flashes] + return flashes + + +def send_file(filename_or_fp, mimetype=None, as_attachment=False, + attachment_filename=None, add_etags=True, + cache_timeout=None, conditional=False, last_modified=None): + """Sends the contents of a file to the client. This will use the + most efficient method available and configured. By default it will + try to use the WSGI server's file_wrapper support. Alternatively + you can set the application's :attr:`~Flask.use_x_sendfile` attribute + to ``True`` to directly emit an ``X-Sendfile`` header. This however + requires support of the underlying webserver for ``X-Sendfile``. + + By default it will try to guess the mimetype for you, but you can + also explicitly provide one. For extra security you probably want + to send certain files as attachment (HTML for instance). The mimetype + guessing requires a `filename` or an `attachment_filename` to be + provided. + + ETags will also be attached automatically if a `filename` is provided. You + can turn this off by setting `add_etags=False`. + + If `conditional=True` and `filename` is provided, this method will try to + upgrade the response stream to support range requests. This will allow + the request to be answered with partial content response. + + Please never pass filenames to this function from user sources; + you should use :func:`send_from_directory` instead. + + .. versionadded:: 0.2 + + .. versionadded:: 0.5 + The `add_etags`, `cache_timeout` and `conditional` parameters were + added. The default behavior is now to attach etags. + + .. versionchanged:: 0.7 + mimetype guessing and etag support for file objects was + deprecated because it was unreliable. Pass a filename if you are + able to, otherwise attach an etag yourself. This functionality + will be removed in Flask 1.0 + + .. versionchanged:: 0.9 + cache_timeout pulls its default from application config, when None. + + .. versionchanged:: 0.12 + The filename is no longer automatically inferred from file objects. If + you want to use automatic mimetype and etag support, pass a filepath via + `filename_or_fp` or `attachment_filename`. + + .. versionchanged:: 0.12 + The `attachment_filename` is preferred over `filename` for MIME-type + detection. + + .. versionchanged:: 1.0 + UTF-8 filenames, as specified in `RFC 2231`_, are supported. + + .. _RFC 2231: https://tools.ietf.org/html/rfc2231#section-4 + + :param filename_or_fp: the filename of the file to send. + This is relative to the :attr:`~Flask.root_path` + if a relative path is specified. + Alternatively a file object might be provided in + which case ``X-Sendfile`` might not work and fall + back to the traditional method. Make sure that the + file pointer is positioned at the start of data to + send before calling :func:`send_file`. + :param mimetype: the mimetype of the file if provided. If a file path is + given, auto detection happens as fallback, otherwise an + error will be raised. + :param as_attachment: set to ``True`` if you want to send this file with + a ``Content-Disposition: attachment`` header. + :param attachment_filename: the filename for the attachment if it + differs from the file's filename. + :param add_etags: set to ``False`` to disable attaching of etags. + :param conditional: set to ``True`` to enable conditional responses. + + :param cache_timeout: the timeout in seconds for the headers. When ``None`` + (default), this value is set by + :meth:`~Flask.get_send_file_max_age` of + :data:`~flask.current_app`. + :param last_modified: set the ``Last-Modified`` header to this value, + a :class:`~datetime.datetime` or timestamp. + If a file was passed, this overrides its mtime. + """ + mtime = None + fsize = None + if isinstance(filename_or_fp, string_types): + filename = filename_or_fp + if not os.path.isabs(filename): + filename = os.path.join(current_app.root_path, filename) + file = None + if attachment_filename is None: + attachment_filename = os.path.basename(filename) + else: + file = filename_or_fp + filename = None + + if mimetype is None: + if attachment_filename is not None: + mimetype = mimetypes.guess_type(attachment_filename)[0] \ + or 'application/octet-stream' + + if mimetype is None: + raise ValueError( + 'Unable to infer MIME-type because no filename is available. ' + 'Please set either `attachment_filename`, pass a filepath to ' + '`filename_or_fp` or set your own MIME-type via `mimetype`.' + ) + + headers = Headers() + if as_attachment: + if attachment_filename is None: + raise TypeError('filename unavailable, required for ' + 'sending as attachment') + + try: + attachment_filename = attachment_filename.encode('latin-1') + except UnicodeEncodeError: + filenames = { + 'filename': unicodedata.normalize( + 'NFKD', attachment_filename).encode('latin-1', 'ignore'), + 'filename*': "UTF-8''%s" % url_quote(attachment_filename), + } + else: + filenames = {'filename': attachment_filename} + + headers.add('Content-Disposition', 'attachment', **filenames) + + if current_app.use_x_sendfile and filename: + if file is not None: + file.close() + headers['X-Sendfile'] = filename + fsize = os.path.getsize(filename) + headers['Content-Length'] = fsize + data = None + else: + if file is None: + file = open(filename, 'rb') + mtime = os.path.getmtime(filename) + fsize = os.path.getsize(filename) + headers['Content-Length'] = fsize + data = wrap_file(request.environ, file) + + rv = current_app.response_class(data, mimetype=mimetype, headers=headers, + direct_passthrough=True) + + if last_modified is not None: + rv.last_modified = last_modified + elif mtime is not None: + rv.last_modified = mtime + + rv.cache_control.public = True + if cache_timeout is None: + cache_timeout = current_app.get_send_file_max_age(filename) + if cache_timeout is not None: + rv.cache_control.max_age = cache_timeout + rv.expires = int(time() + cache_timeout) + + if add_etags and filename is not None: + from warnings import warn + + try: + rv.set_etag('%s-%s-%s' % ( + os.path.getmtime(filename), + os.path.getsize(filename), + adler32( + filename.encode('utf-8') if isinstance(filename, text_type) + else filename + ) & 0xffffffff + )) + except OSError: + warn('Access %s failed, maybe it does not exist, so ignore etags in ' + 'headers' % filename, stacklevel=2) + + if conditional: + try: + rv = rv.make_conditional(request, accept_ranges=True, + complete_length=fsize) + except RequestedRangeNotSatisfiable: + if file is not None: + file.close() + raise + # make sure we don't send x-sendfile for servers that + # ignore the 304 status code for x-sendfile. + if rv.status_code == 304: + rv.headers.pop('x-sendfile', None) + return rv + + +def safe_join(directory, *pathnames): + """Safely join `directory` and zero or more untrusted `pathnames` + components. + + Example usage:: + + @app.route('/wiki/') + def wiki_page(filename): + filename = safe_join(app.config['WIKI_FOLDER'], filename) + with open(filename, 'rb') as fd: + content = fd.read() # Read and process the file content... + + :param directory: the trusted base directory. + :param pathnames: the untrusted pathnames relative to that directory. + :raises: :class:`~werkzeug.exceptions.NotFound` if one or more passed + paths fall out of its boundaries. + """ + + parts = [directory] + + for filename in pathnames: + if filename != '': + filename = posixpath.normpath(filename) + + if ( + any(sep in filename for sep in _os_alt_seps) + or os.path.isabs(filename) + or filename == '..' + or filename.startswith('../') + ): + raise NotFound() + + parts.append(filename) + + return posixpath.join(*parts) + + +def send_from_directory(directory, filename, **options): + """Send a file from a given directory with :func:`send_file`. This + is a secure way to quickly expose static files from an upload folder + or something similar. + + Example usage:: + + @app.route('/uploads/') + def download_file(filename): + return send_from_directory(app.config['UPLOAD_FOLDER'], + filename, as_attachment=True) + + .. admonition:: Sending files and Performance + + It is strongly recommended to activate either ``X-Sendfile`` support in + your webserver or (if no authentication happens) to tell the webserver + to serve files for the given path on its own without calling into the + web application for improved performance. + + .. versionadded:: 0.5 + + :param directory: the directory where all the files are stored. + :param filename: the filename relative to that directory to + download. + :param options: optional keyword arguments that are directly + forwarded to :func:`send_file`. + """ + filename = safe_join(directory, filename) + if not os.path.isabs(filename): + filename = os.path.join(current_app.root_path, filename) + try: + if not os.path.isfile(filename): + raise NotFound() + except (TypeError, ValueError): + raise BadRequest() + options.setdefault('conditional', True) + return send_file(filename, **options) + + +def get_root_path(import_name): + """Returns the path to a package or cwd if that cannot be found. This + returns the path of a package or the folder that contains a module. + + Not to be confused with the package path returned by :func:`find_package`. + """ + # Module already imported and has a file attribute. Use that first. + mod = sys.modules.get(import_name) + if mod is not None and hasattr(mod, '__file__'): + return os.path.dirname(os.path.abspath(mod.__file__)) + + # Next attempt: check the loader. + loader = pkgutil.get_loader(import_name) + + # Loader does not exist or we're referring to an unloaded main module + # or a main module without path (interactive sessions), go with the + # current working directory. + if loader is None or import_name == '__main__': + return os.getcwd() + + # For .egg, zipimporter does not have get_filename until Python 2.7. + # Some other loaders might exhibit the same behavior. + if hasattr(loader, 'get_filename'): + filepath = loader.get_filename(import_name) + else: + # Fall back to imports. + __import__(import_name) + mod = sys.modules[import_name] + filepath = getattr(mod, '__file__', None) + + # If we don't have a filepath it might be because we are a + # namespace package. In this case we pick the root path from the + # first module that is contained in our package. + if filepath is None: + raise RuntimeError('No root path can be found for the provided ' + 'module "%s". This can happen because the ' + 'module came from an import hook that does ' + 'not provide file name information or because ' + 'it\'s a namespace package. In this case ' + 'the root path needs to be explicitly ' + 'provided.' % import_name) + + # filepath is import_name.py for a module, or __init__.py for a package. + return os.path.dirname(os.path.abspath(filepath)) + + +def _matching_loader_thinks_module_is_package(loader, mod_name): + """Given the loader that loaded a module and the module this function + attempts to figure out if the given module is actually a package. + """ + # If the loader can tell us if something is a package, we can + # directly ask the loader. + if hasattr(loader, 'is_package'): + return loader.is_package(mod_name) + # importlib's namespace loaders do not have this functionality but + # all the modules it loads are packages, so we can take advantage of + # this information. + elif (loader.__class__.__module__ == '_frozen_importlib' and + loader.__class__.__name__ == 'NamespaceLoader'): + return True + # Otherwise we need to fail with an error that explains what went + # wrong. + raise AttributeError( + ('%s.is_package() method is missing but is required by Flask of ' + 'PEP 302 import hooks. If you do not use import hooks and ' + 'you encounter this error please file a bug against Flask.') % + loader.__class__.__name__) + + +def find_package(import_name): + """Finds a package and returns the prefix (or None if the package is + not installed) as well as the folder that contains the package or + module as a tuple. The package path returned is the module that would + have to be added to the pythonpath in order to make it possible to + import the module. The prefix is the path below which a UNIX like + folder structure exists (lib, share etc.). + """ + root_mod_name = import_name.split('.')[0] + loader = pkgutil.get_loader(root_mod_name) + if loader is None or import_name == '__main__': + # import name is not found, or interactive/main module + package_path = os.getcwd() + else: + # For .egg, zipimporter does not have get_filename until Python 2.7. + if hasattr(loader, 'get_filename'): + filename = loader.get_filename(root_mod_name) + elif hasattr(loader, 'archive'): + # zipimporter's loader.archive points to the .egg or .zip + # archive filename is dropped in call to dirname below. + filename = loader.archive + else: + # At least one loader is missing both get_filename and archive: + # Google App Engine's HardenedModulesHook + # + # Fall back to imports. + __import__(import_name) + filename = sys.modules[import_name].__file__ + package_path = os.path.abspath(os.path.dirname(filename)) + + # In case the root module is a package we need to chop of the + # rightmost part. This needs to go through a helper function + # because of python 3.3 namespace packages. + if _matching_loader_thinks_module_is_package( + loader, root_mod_name): + package_path = os.path.dirname(package_path) + + site_parent, site_folder = os.path.split(package_path) + py_prefix = os.path.abspath(sys.prefix) + if package_path.startswith(py_prefix): + return py_prefix, package_path + elif site_folder.lower() == 'site-packages': + parent, folder = os.path.split(site_parent) + # Windows like installations + if folder.lower() == 'lib': + base_dir = parent + # UNIX like installations + elif os.path.basename(parent).lower() == 'lib': + base_dir = os.path.dirname(parent) + else: + base_dir = site_parent + return base_dir, package_path + return None, package_path + + +class locked_cached_property(object): + """A decorator that converts a function into a lazy property. The + function wrapped is called the first time to retrieve the result + and then that calculated result is used the next time you access + the value. Works like the one in Werkzeug but has a lock for + thread safety. + """ + + def __init__(self, func, name=None, doc=None): + self.__name__ = name or func.__name__ + self.__module__ = func.__module__ + self.__doc__ = doc or func.__doc__ + self.func = func + self.lock = RLock() + + def __get__(self, obj, type=None): + if obj is None: + return self + with self.lock: + value = obj.__dict__.get(self.__name__, _missing) + if value is _missing: + value = self.func(obj) + obj.__dict__[self.__name__] = value + return value + + +class _PackageBoundObject(object): + #: The name of the package or module that this app belongs to. Do not + #: change this once it is set by the constructor. + import_name = None + + #: Location of the template files to be added to the template lookup. + #: ``None`` if templates should not be added. + template_folder = None + + #: Absolute path to the package on the filesystem. Used to look up + #: resources contained in the package. + root_path = None + + def __init__(self, import_name, template_folder=None, root_path=None): + self.import_name = import_name + self.template_folder = template_folder + + if root_path is None: + root_path = get_root_path(self.import_name) + + self.root_path = root_path + self._static_folder = None + self._static_url_path = None + + def _get_static_folder(self): + if self._static_folder is not None: + return os.path.join(self.root_path, self._static_folder) + + def _set_static_folder(self, value): + self._static_folder = value + + static_folder = property( + _get_static_folder, _set_static_folder, + doc='The absolute path to the configured static folder.' + ) + del _get_static_folder, _set_static_folder + + def _get_static_url_path(self): + if self._static_url_path is not None: + return self._static_url_path + + if self.static_folder is not None: + return '/' + os.path.basename(self.static_folder) + + def _set_static_url_path(self, value): + self._static_url_path = value + + static_url_path = property( + _get_static_url_path, _set_static_url_path, + doc='The URL prefix that the static route will be registered for.' + ) + del _get_static_url_path, _set_static_url_path + + @property + def has_static_folder(self): + """This is ``True`` if the package bound object's container has a + folder for static files. + + .. versionadded:: 0.5 + """ + return self.static_folder is not None + + @locked_cached_property + def jinja_loader(self): + """The Jinja loader for this package bound object. + + .. versionadded:: 0.5 + """ + if self.template_folder is not None: + return FileSystemLoader(os.path.join(self.root_path, + self.template_folder)) + + def get_send_file_max_age(self, filename): + """Provides default cache_timeout for the :func:`send_file` functions. + + By default, this function returns ``SEND_FILE_MAX_AGE_DEFAULT`` from + the configuration of :data:`~flask.current_app`. + + Static file functions such as :func:`send_from_directory` use this + function, and :func:`send_file` calls this function on + :data:`~flask.current_app` when the given cache_timeout is ``None``. If a + cache_timeout is given in :func:`send_file`, that timeout is used; + otherwise, this method is called. + + This allows subclasses to change the behavior when sending files based + on the filename. For example, to set the cache timeout for .js files + to 60 seconds:: + + class MyFlask(flask.Flask): + def get_send_file_max_age(self, name): + if name.lower().endswith('.js'): + return 60 + return flask.Flask.get_send_file_max_age(self, name) + + .. versionadded:: 0.9 + """ + return total_seconds(current_app.send_file_max_age_default) + + def send_static_file(self, filename): + """Function used internally to send static files from the static + folder to the browser. + + .. versionadded:: 0.5 + """ + if not self.has_static_folder: + raise RuntimeError('No static folder for this object') + # Ensure get_send_file_max_age is called in all cases. + # Here, we ensure get_send_file_max_age is called for Blueprints. + cache_timeout = self.get_send_file_max_age(filename) + return send_from_directory(self.static_folder, filename, + cache_timeout=cache_timeout) + + def open_resource(self, resource, mode='rb'): + """Opens a resource from the application's resource folder. To see + how this works, consider the following folder structure:: + + /myapplication.py + /schema.sql + /static + /style.css + /templates + /layout.html + /index.html + + If you want to open the :file:`schema.sql` file you would do the + following:: + + with app.open_resource('schema.sql') as f: + contents = f.read() + do_something_with(contents) + + :param resource: the name of the resource. To access resources within + subfolders use forward slashes as separator. + :param mode: resource file opening mode, default is 'rb'. + """ + if mode not in ('r', 'rb'): + raise ValueError('Resources can only be opened for reading') + return open(os.path.join(self.root_path, resource), mode) + + +def total_seconds(td): + """Returns the total seconds from a timedelta object. + + :param timedelta td: the timedelta to be converted in seconds + + :returns: number of seconds + :rtype: int + """ + return td.days * 60 * 60 * 24 + td.seconds + + +def is_ip(value): + """Determine if the given string is an IP address. + + Python 2 on Windows doesn't provide ``inet_pton``, so this only + checks IPv4 addresses in that environment. + + :param value: value to check + :type value: str + + :return: True if string is an IP address + :rtype: bool + """ + if PY2 and os.name == 'nt': + try: + socket.inet_aton(value) + return True + except socket.error: + return False + + for family in (socket.AF_INET, socket.AF_INET6): + try: + socket.inet_pton(family, value) + except socket.error: + pass + else: + return True + + return False diff --git a/venv/Lib/site-packages/flask/json/__init__.py b/venv/Lib/site-packages/flask/json/__init__.py new file mode 100644 index 00000000..fbe6b92f --- /dev/null +++ b/venv/Lib/site-packages/flask/json/__init__.py @@ -0,0 +1,327 @@ +# -*- coding: utf-8 -*- +""" +flask.json +~~~~~~~~~~ + +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. +""" +import codecs +import io +import uuid +from datetime import date, datetime +from flask.globals import current_app, request +from flask._compat import text_type, PY2 + +from werkzeug.http import http_date +from jinja2 import Markup + +# Use the same json implementation as itsdangerous on which we +# depend anyways. +from itsdangerous import json as _json + + +# Figure out if simplejson escapes slashes. This behavior was changed +# from one version to another without reason. +_slash_escape = '\\/' not in _json.dumps('/') + + +__all__ = ['dump', 'dumps', 'load', 'loads', 'htmlsafe_dump', + 'htmlsafe_dumps', 'JSONDecoder', 'JSONEncoder', + 'jsonify'] + + +def _wrap_reader_for_text(fp, encoding): + if isinstance(fp.read(0), bytes): + fp = io.TextIOWrapper(io.BufferedReader(fp), encoding) + return fp + + +def _wrap_writer_for_text(fp, encoding): + try: + fp.write('') + except TypeError: + fp = io.TextIOWrapper(fp, encoding) + return fp + + +class JSONEncoder(_json.JSONEncoder): + """The default Flask JSON encoder. This one extends the default simplejson + encoder by also supporting ``datetime`` objects, ``UUID`` as well as + ``Markup`` objects which are serialized as RFC 822 datetime strings (same + as the HTTP date format). In order to support more data types override the + :meth:`default` method. + """ + + def default(self, o): + """Implement this method in a subclass such that it returns a + serializable object for ``o``, or calls the base implementation (to + raise a :exc:`TypeError`). + + For example, to support arbitrary iterators, you could implement + default like this:: + + def default(self, o): + try: + iterable = iter(o) + except TypeError: + pass + else: + return list(iterable) + return JSONEncoder.default(self, o) + """ + if isinstance(o, datetime): + return http_date(o.utctimetuple()) + if isinstance(o, date): + return http_date(o.timetuple()) + if isinstance(o, uuid.UUID): + return str(o) + if hasattr(o, '__html__'): + return text_type(o.__html__()) + return _json.JSONEncoder.default(self, o) + + +class JSONDecoder(_json.JSONDecoder): + """The default JSON decoder. This one does not change the behavior from + the default simplejson decoder. Consult the :mod:`json` documentation + for more information. This decoder is not only used for the load + functions of this module but also :attr:`~flask.Request`. + """ + + +def _dump_arg_defaults(kwargs): + """Inject default arguments for dump functions.""" + if current_app: + bp = current_app.blueprints.get(request.blueprint) if request else None + kwargs.setdefault( + 'cls', + bp.json_encoder if bp and bp.json_encoder + else current_app.json_encoder + ) + + if not current_app.config['JSON_AS_ASCII']: + kwargs.setdefault('ensure_ascii', False) + + kwargs.setdefault('sort_keys', current_app.config['JSON_SORT_KEYS']) + else: + kwargs.setdefault('sort_keys', True) + kwargs.setdefault('cls', JSONEncoder) + + +def _load_arg_defaults(kwargs): + """Inject default arguments for load functions.""" + if current_app: + bp = current_app.blueprints.get(request.blueprint) if request else None + kwargs.setdefault( + 'cls', + bp.json_decoder if bp and bp.json_decoder + else current_app.json_decoder + ) + else: + kwargs.setdefault('cls', JSONDecoder) + + +def detect_encoding(data): + """Detect which UTF codec was used to encode the given bytes. + + The latest JSON standard (:rfc:`8259`) suggests that only UTF-8 is + accepted. Older documents allowed 8, 16, or 32. 16 and 32 can be big + or little endian. Some editors or libraries may prepend a BOM. + + :param data: Bytes in unknown UTF encoding. + :return: UTF encoding name + """ + head = data[:4] + + if head[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' + + if b'\x00' not in head: + return 'utf-8' + + if head in (codecs.BOM_UTF32_BE, codecs.BOM_UTF32_LE): + return 'utf-32' + + if head[:2] in (codecs.BOM_UTF16_BE, codecs.BOM_UTF16_LE): + return 'utf-16' + + if len(head) == 4: + if head[:3] == b'\x00\x00\x00': + return 'utf-32-be' + + if head[::2] == b'\x00\x00': + return 'utf-16-be' + + if head[1:] == b'\x00\x00\x00': + return 'utf-32-le' + + if head[1::2] == b'\x00\x00': + return 'utf-16-le' + + if len(head) == 2: + return 'utf-16-be' if head.startswith(b'\x00') else 'utf-16-le' + + return 'utf-8' + + +def dumps(obj, **kwargs): + """Serialize ``obj`` to a JSON formatted ``str`` by using the application's + configured encoder (:attr:`~flask.Flask.json_encoder`) if there is an + application on the stack. + + This function can return ``unicode`` strings or ascii-only bytestrings by + default which coerce into unicode strings automatically. That behavior by + default is controlled by the ``JSON_AS_ASCII`` configuration variable + and can be overridden by the simplejson ``ensure_ascii`` parameter. + """ + _dump_arg_defaults(kwargs) + encoding = kwargs.pop('encoding', None) + rv = _json.dumps(obj, **kwargs) + if encoding is not None and isinstance(rv, text_type): + rv = rv.encode(encoding) + return rv + + +def dump(obj, fp, **kwargs): + """Like :func:`dumps` but writes into a file object.""" + _dump_arg_defaults(kwargs) + encoding = kwargs.pop('encoding', None) + if encoding is not None: + fp = _wrap_writer_for_text(fp, encoding) + _json.dump(obj, fp, **kwargs) + + +def loads(s, **kwargs): + """Unserialize a JSON object from a string ``s`` by using the application's + configured decoder (:attr:`~flask.Flask.json_decoder`) if there is an + application on the stack. + """ + _load_arg_defaults(kwargs) + if isinstance(s, bytes): + encoding = kwargs.pop('encoding', None) + if encoding is None: + encoding = detect_encoding(s) + s = s.decode(encoding) + return _json.loads(s, **kwargs) + + +def load(fp, **kwargs): + """Like :func:`loads` but reads from a file object. + """ + _load_arg_defaults(kwargs) + if not PY2: + fp = _wrap_reader_for_text(fp, kwargs.pop('encoding', None) or 'utf-8') + return _json.load(fp, **kwargs) + + +def htmlsafe_dumps(obj, **kwargs): + """Works exactly like :func:`dumps` but is safe for use in ``') + # => <script> do_nasty_stuff() </script> + # sanitize_html('Click here for $100') + # => Click here for $100 + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in ("StartTag", "EndTag", "EmptyTag"): + name = token["name"] + namespace = token["namespace"] + if ((namespace, name) in self.allowed_elements or + (namespace is None and + (namespaces["html"], name) in self.allowed_elements)): + return self.allowed_token(token) + else: + return self.disallowed_token(token) + elif token_type == "Comment": + pass + else: + return token + + def allowed_token(self, token): + if "data" in token: + attrs = token["data"] + attr_names = set(attrs.keys()) + + # Remove forbidden attributes + for to_remove in (attr_names - self.allowed_attributes): + del token["data"][to_remove] + attr_names.remove(to_remove) + + # Remove attributes with disallowed URL values + for attr in (attr_names & self.attr_val_is_uri): + assert attr in attrs + # I don't have a clue where this regexp comes from or why it matches those + # characters, nor why we call unescape. I just know it's always been here. + # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all + # this will do is remove *more* than it otherwise would. + val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + try: + uri = urlparse.urlparse(val_unescaped) + except ValueError: + uri = None + del attrs[attr] + if uri and uri.scheme: + if uri.scheme not in self.allowed_protocols: + del attrs[attr] + if uri.scheme == 'data': + m = data_content_type.match(uri.path) + if not m: + del attrs[attr] + elif m.group('content_type') not in self.allowed_content_types: + del attrs[attr] + + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', + attrs[(namespaces['xlink'], 'href')])): + del attrs[(namespaces['xlink'], 'href')] + if (None, 'style') in attrs: + attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) + token["data"] = attrs + return token + + def disallowed_token(self, token): + token_type = token["type"] + if token_type == "EndTag": + token["data"] = "" % token["name"] + elif token["data"]: + assert token_type in ("StartTag", "EmptyTag") + attrs = [] + for (ns, name), v in token["data"].items(): + attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) + token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + token["type"] = "Characters" + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if keyword not in self.allowed_css_keywords and \ + not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 00000000..0d12584b --- /dev/null +++ b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +from __future__ import absolute_import, division, unicode_literals + +import re + +from . import base +from ..constants import rcdataElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) + + +class Filter(base.Filter): + """Collapses whitespace except in pre, textarea, and script elements""" + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py b/venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 00000000..ae41a133 --- /dev/null +++ b/venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py @@ -0,0 +1,2791 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import with_metaclass, viewkeys + +import types +from collections import OrderedDict + +from . import _inputstream +from . import _tokenizer + +from . import treebuilders +from .treebuilders.base import Marker + +from . import _utils +from .constants import ( + spaceCharacters, asciiUpper2Lower, + specialElements, headingElements, cdataElements, rcdataElements, + tokenTypes, tagTokenTypes, + namespaces, + htmlIntegrationPointElements, mathmlTextIntegrationPointElements, + adjustForeignAttributes as adjustForeignAttributesMap, + adjustMathMLAttributes, adjustSVGAttributes, + E, + _ReparseException +) + + +def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML document as a string or file-like object into a tree + + :arg doc: the document to parse as a string or file-like object + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import parse + >>> parse('

|Y=X?V=_5K{q#D3k?`Mi5IA%W^{638tEgI{{2RLgh8fDrji^L$+uG3}t7k zxhcjyp~1z;YF=8>Iw69!e$1wX_zO_U()?qVu?ek&4R73@A93hn5Ga(b5qpQB&AN|>pMQ9d}2E4YP(xT!t$un=1w0?n4*>_HoP`-+4$ z(S!IFjHM=497K_t5{O=vF`YVx_--E0wSsEsAaaz)b)1i(yM5ifLL)2R+mGWt_Raku zvgUf81eO3?|3#1s{fP=q5+~tKheHb=6QkfpsZT!EqR&2wa5|MIOwVig~U7_6n?h1@ue*yqN%(%ZC2&9XUqSjHU zV=I@Ci_Z#E$f4SxmeoJwOF7x8$h_&@jO=kINE+ zf%-E%O;Mh7B{da%12;5KwP31}UwB&Jh=M(wTz(C%Y>_1_@N}s9hl=2E8(~$|Z$}3FFB(`H-9_Te0rFc^S0Fd6Rxc z9yx?d_+$^6IJDs~-IWZn6<&F`F9Ao`Gf0`s!xS`NytMFHzb`rnD?)_jEgfNrXNbg% zpFJKwo6*le&S2dqDb(Kvg+~YNoH3F+kS?qH=kch;r#qei1oixidmKmc(*+(}sk7RX z%^(EW>EdONKcJXNRa9$ZTowXAvRJ=WZ|aXg4z?)U!S*OOvbH`PDl+57{Q#JZZ5(qV zQ1Vr}KX+hF)rUx;;;a6$9AOm9gaebz36a8xFMzR8f6cM#a1`*D$M$*o#A7s)tb_jW zqxw^}naOR%c$NkPw_^KM+7JVEoL@AQEbT}eL>*vCfwZ;C;$od z`@ljXOX<^~gD;7S zZK?7OIp9KztT(HGLgB>m2SsTT!)nveIxh4G!u1G`u833#AtemD`;t**A0d@h?^@$- zcT@`@jJeYmE%kRX6CC=U#*Yqw+sE8%NUC|X3X-n=Ep8%*<}C>mQ#$l)*WQ&?KGe^3^O{Y9g%!*_!HxS~2s%h$nOH8~@RtU@4XbW}{{h$vX$SMZ~S_P=0G zJch&s?2RnG%wli{w6TSJ?Z0C#nj{X7!ps7KXpQdM^TaSDd%E=Wk!`HX9n^)|H&OYl z9I>MpQ_f6RA#@Q``PorL-7XrsEFszgEwDOGHiX3Eh(`wj-!kbyG5o#?y=Ot;`=4?? z4-JMhh5~rIw%pbbXka<3o{hqUCkgp`0jTPU7+u zgPJH~BHRiWQ(R*WLPDH2QYd}==q!OL_$CskOyDnC7K~jy)PPf9h$9#-JC JiY~=8J?M4E>{#K%ZlTVrY#0Wjd)W>sDuVZoivRi$$}5H14)1jRyDEW45gLG zU3zAyh{Cdms=XCG7d_cPFa1km(fAC-{v9vHT1;^zdc4JbEm}eaDpWNUsk(~QlxnDH)l@UP)2%?w zs_;*&6{>5hfx4#V)D-GST~{&cx|&yY)UkR;)lg5V8!AHGQ17Y$^|ZRFW>7cPEj5jL zM%`9T)U)c2`T^=|>OJ*C)N@K~vgAj{e`|b^x;@fy9!*L+(4DNCb+Anhd)msZKPZgD0a~Vmfhh(i zOPy|Xhk0l6rLHOZn9l6!7Fyc3x_7AULgOoFjy7&d#TgAKD0d8OW z7LGe@^?j?3S(_c}s+L*ctfI_zvmVykw2x!ZYEla_=dZ^t4(xFHC?2X~lob?vAFt7@ zV=sBhUUANzvHV8JoH%HhyBte7th>p6%e+Q|t^?J7 z7FQo`FR!jFZEtQp-B|nZH_K0!*Vi^aT>j$m_My%Xw|m*n_O8yg$vU)cVK6cQ_RW!4 z-g|}Mv-m~)Ty%lCbJ2f>&TG-f{3_8Me;Jf~KYRs6B;xqqn^XWZr_$)%VJ|h3^!_NR znHhY*%+l)`UR8aw{djX@ZM~{n*M=YIL>K~F3G2MXlh-_Ln8NEll46%-{l6P407bec#=l?-lxd5$~B2ZvuVhv9|lEU{}f{n>jXkWt39YDDZ zG{V?NDBl+7uPy^kI~{Fd?ze;J+3E_2A>ciH3y8}XAof9sDs`#sfUkE!+iwTcQ|T2j zYk>IcH^8KE62W_84~>%9m?+VqrNkZPxD#D*BJ2lFxWI+`wUV8P6Fz1xLW_^NtNU6U zJ#cZ!PxvbPz1$Y#U>ufVDazmuI|$5b$yHDWf5wTM?8WLcRubEU$Ls4E$PNzP!`(pM za~7eNynRBqbP4qeC#XFbXlEP*U#S#-R5wfs0 z&*ylI-#l-k)$xHvbEn0t_cl5u+lT1;>_8MZ(dKCLgGu0j^flsjUlx+$TkZ_Io~k@! zX$a+sjP5{B3Lv5gQIzF{ua!Oo?GpbOy8137C%$=xV#(%AG+!g7fdIuL{V^J6v@{mJ z#b5Dp-~<`;WPOmEyJ?CreM%{|>dYmhL)S8~mOgb?>J!#FH-J`yHDWs~Ywk5^jupz!8b9&~jJY1RX2(N34SZg?U~E<~de`lTiiYO=?dbZ5@Ab&)!dDYIebR zITSdAF`z+YX_8Xfk<%bw`mb=$951Y-`TJOt9nn0jgG4Z=`~!<*mQNDoa~8HqWQaSU zXlJULUsX+QjRx9hz|d8@1KZnnyNcUw@|bozskLJITS2`l1S;E#_OQm8R*c%8VQ%5j z%Zi_CclLDWpp7kUhfmnQkRm-LgNTVAA}S)}H_Y>7)!S`VblUBUDO0Q;mCK+NILy>97R)z@OhrA&^G8EF@s{Z&32z^pWscsd2GWk#SDebr9iy_?< Zp1`77JRLXVskr8UQ9K{l(VLBL{TGNWiS_^h literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/hashlib.cpython-37.pyc b/venv/Lib/__pycache__/hashlib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25e73f964060fbf16fbb0766de355590ee8d2ac6 GIT binary patch literal 6533 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 ZeHLNu>V1My(&mhuhE=EncUdo}{|hNfub}_{ literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/heapq.cpython-37.pyc b/venv/Lib/__pycache__/heapq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d705e48a1ce428fea878f16ff247c527d8570b81 GIT binary patch literal 14360 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 E20H@wE&u=k literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/hmac.cpython-37.pyc b/venv/Lib/__pycache__/hmac.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97bdb36b57884c31132e13612f71eab964f1a28a GIT binary patch literal 6111 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/imp.cpython-37.pyc b/venv/Lib/__pycache__/imp.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ce04eb159bb7ce044c43f8173385746a23529bc GIT binary patch literal 9704 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 g!BVYMt{tqM7|&N~WBJN(X}t7mH*-xO;iW zEr@k-&o8<~^S9)d@b|u749adfsJNA&>Q;lATMHK4g}`y0V9{L+mfWSF?$(24cR5&b zSAtb{HCS`kY)cm3*4#VdGggZYt8M6f9 zlSwj&LZ-q*>OSw0G-7e0B@ftuhr(CkWrIP1(;X>4Q6Y^`jG2&q6-oge z(1>w%Ov7=Si8&&PhAirvZu_^#Y@np(x;L26UV^~8IFI)d*5$EeJ)g%hYaj1p&|vMv z$<${{u|oCcUK&-&=6ns?V-`kEEQefkgSsn|v4j~gQ@}t5 zL)lm>n0Gn1KmHw4!O)k13=^|0W?V~$`#z2kv`%vc#5`ojr!B1`&6F{7!bF4v6Bdt# z!$>EqJ{ZYR!wG=tD43t6B zH8bQiFoDkyO!>1lJ87FD89Q?jJ8Y`;9B!v@O~)OCgvJz-ne6<8E6uXwoQ$1B2m}}r zF;V1QAHgSgWIfv6jo>jY%M819OkQ0bKQ={|EedL2d2lMsih_Z-BN1Wg1hjcSs zS)uzPo^gj%QHjeltuX})WLf>9l%n8vyD1Js)kVjsmuONs_&xso#xAUw*yAUaKp~{wTGGLdkXmj2b9~G}^lixbhpl zD4=CrU$M?8j-~Ho8Ac7AjrQKl5Q`e4D=ce*UqHrARHCC1+l?b%4PzDW4UM1?%7j)0 zd<3Q+0)a$K#TQN8W4qi)`~23q`!amX16&g)5-Ap=X6$xz(M>zjm3=?zT^VwjvYM7C z=xHS*VY)CYD`_RGZfP}7$h0!3TO89c|asyC0#X#w*FvE7TOI!3}Qd z3N=+~7O0`emR_W02~E1u4tqMgsr(~3#;q+6sANd3@ffq*f{H$n)(@nxhu`c&(mnj* zbu`k#y9}%GiYdLt3rpB|LlkroQ%BpCwB~t~!Jd~oo|my7{Uy))VZ{A>rs%0Ct$KN^ zs-7pJp6C6;(odnpH2>W?`0Ap0@bb%x)3f7F>&5HlQS()+^P+juzQ8Scec`L_g^C)( zi8=W91dd?W>}?y5JehElU!QD6DYHU9ARrsmJf!9k8rU-R140jzkp`TEN!jF$fcMg3P$EP8X6|1tv7@a-JIww_B!V^=2C?Er_4$m_#cZrMWd~=-&?g z7>!$P?!SBu;uu0{Msf0&#er<|!rA0tOv z+szWSq+`~>F_ev%&Hseb`pIJ*h7JfodG(m6Ue9eqci%*_P^hyVMvhZk#v{82Ff zj7400jK3Zu0TL0QzN2O*q?CM?1QxY%2a7r83m%P<7Ce;yjGIhO2OQC=w8|SDFfmqD=8(BbE@Vp}Y|UA&%9x z6AxdC-L?Mlc~`ShU~593u-5M%BtjeOeHtg4TX!>+NVnCHM-Fg9Yg4BDw|D9B<*U!!r|AxC6$f!RTu4PiJBF zSPR$!naq}wxns#>F0bW&KAX=yWjE1YF1y6c^@Cri+M;Mr3D&7TJq7h5Moy-UA~Gf4 z5y>8qvKFU`hJNNeZOjclm_Ek^YX**n~&aaHOJnMA1sH>aVG(%d$ zrhpvf6OhiW&k(uJviYn>x!m@5={o^xOCX=XwNo6YS zS?@SWx2&XxN5sr9W2}^QFuPxgT1CHqu58@cS>L#QZRg(h*IRd1zFOa0|Lo4z%KF{U zclNp5-$}&o&daC8x&y4)hiIs;BO$cG>a;;;NkCn?Nn#x(90aQfGc oj0YTL#c^ICYh{p|gA|4dzcquLzKg_VRhQBK|M_mfs+X$tZ+7PV(f|Me literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/linecache.cpython-37.pyc b/venv/Lib/__pycache__/linecache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..482d9e474306f3e9d66814316ef760936c821f88 GIT binary patch literal 3787 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/ntpath.cpython-37.pyc b/venv/Lib/__pycache__/ntpath.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16bc138054ef6bbd5bb398888c87aecec9603f70 GIT binary patch literal 12917 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 F{15lGcWeLv literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/operator.cpython-37.pyc b/venv/Lib/__pycache__/operator.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96295f125bd90e7a618a725baaa5ce60c8cd9abc GIT binary patch literal 13898 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 bb7}nNRLOVo{|s+iZo#JJhzZZ}7y17m+w)%+ literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/os.cpython-37.pyc b/venv/Lib/__pycache__/os.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f534578633027b6676a23216f612f5fab261bb5 GIT binary patch literal 29691 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 Grv5Ka(+phz literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/posixpath.cpython-37.pyc b/venv/Lib/__pycache__/posixpath.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a8842cdf180d515d303e2f5f6e2108d1b72f800 GIT binary patch literal 10394 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 Wn-hmh)0G)*9r=GuG1hplV*X#SPE3yg literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/re.cpython-37.pyc b/venv/Lib/__pycache__/re.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d3fdeb8120c4411a1b0b87effe0efbceb227eb3 GIT binary patch literal 13802 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/reprlib.cpython-37.pyc b/venv/Lib/__pycache__/reprlib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b592b9117375ce956b75a15df264c15ae7a920df GIT binary patch literal 5348 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 ClXt!V literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/shutil.cpython-37.pyc b/venv/Lib/__pycache__/shutil.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87f530f5c3dcb11ce122d902d64e502f84faa410 GIT binary patch literal 30543 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 M`pF literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/sre_compile.cpython-37.pyc b/venv/Lib/__pycache__/sre_compile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ec0168432735827b561af032e708881c7531c14 GIT binary patch literal 15201 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 Y*qaiSnY1(m|0RM;nh{4XE;%dx7g(cVga7~l literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/sre_parse.cpython-37.pyc b/venv/Lib/__pycache__/sre_parse.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0c4302d0e7824e2c7476dc0cbaee64c387e5ae3 GIT binary patch literal 21355 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/struct.cpython-37.pyc b/venv/Lib/__pycache__/struct.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdc87998f4f02b5f87c95532ea7c26878d705229 GIT binary patch literal 332 zcmXw!%}T^D5P*}W+jjc{zDC9MuqP1_tGkE?SK00<7D7#;7PIY=whQYU`ARwJ$ye~? zq{V@J^Uc5vnd>A85rp?Oe>%blecR$c0+1_s?HNEIfrTT8aK%J;!ha1Y5`ma1ys!nhRQJ=NLy!K&G+lxMtwkHqx zJz1O=+2Uqi1Q**z^h#b5SkT6R5Ie*n J9tm)a{{TiNR!9H< literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/tarfile.cpython-37.pyc b/venv/Lib/__pycache__/tarfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4f336a496ee960d60ccf32b1be88794ee8a8df6 GIT binary patch literal 61783 zcmd4436xyddEZ%kRadWQHdcaU5hRu-fhGV_Bn6Qab`m1kfBx!X~69LL8e%Z$b|o@C^a<9M=-V|#RFDxO4+oQ&x>iAQ!e z#j)o1|L%LQUNstAbWU=nfqKh*_uYHnz2E)z``x4c{lx@-xqp7}V}GHMOnh56;ol$^ zhxs-9bRyv;CK6t9BI%_jQeJu@?Pa{|Z02fqB9}~Xotw>17YqQ}m~iK3l* zCwlGNH_>P3{)v7&4@?Z$d2nLzrh76pG4yhxz9o~WZn#qP-%KX-&&y2=y_%?}UP%PG zh9`z&xqd#%HSBU#@2ZYWrzSSu9H?%rZkkR$k(k&>{t-&uOsQ>`-{tl4Ucu|}ie9hR z=k++ZSaP@ySx!^xKe5Z(F|pfwU}BH=;KZo6bK)Uy*Tlo#?uotL zo{4?l=){=!(8MENW@5kh@WcUc@5I6Cfr&?}_g8mRAE-W9-Cf;N9j)%H?y5dieYm=J zx^Ln!dp62-X5s@uYI@>vZ{Nfd-kA4@x8FN(IWzHO^@H~BP?dk)!7t?|K2$BtJmo!l zCG}R)|4r|)iKpv@YJTOJ)x^Zp-UqzL-$+b+*n7fzlJjBjgWe&|N4yVJADvElPkB$j zk(@Z{J>z|t)MH+*y2;B;r@h185z>!)N4;aDpYV=*Cpe#cHsPK0if<&mV)fZu>51pK zf7Tn|exUjs_oujj&gU{VA`H`#!sWp8Jn@{oME4{b}x>_XfEiwEGvhKkdE1 z{R`C>C~utmaqkTGXYBqA_h-G2a{p1gKg<0&?>zVC?f#?OU+`Y!{zbb#$Nfv*%iOZSRyH~tdxqFqn3*1e3ALH(0)fcJjCGKDIKFLT>ORwJ}y~W%rMLaBTm=4yNqs zir*+byU=KU<13TZ+0vd_?hjw$zEb6W%&U$rJVrL6{_=i0?uqf7&*l~~~E z3E!Xd+dcXecR6%y?&`c>Z8U0gb(hk6zUfyhSKUqDiN&U0nQ8`)p5wi0P)Om#_^~s` zPmMp@?tAh4g(K(6C(oRF;mCz{@!9bgqwBLrUJ0)Uj-NPr`^&dgVum)nKeTK$S$Wg4|swVl1%tX-|P(+f4Poxa2&yHKx? zkiDdnzms?UT{=9h!(J7Yo5)t|rRc5`T_>djVmp*g+p$*BzY`qNpz zWBeL=XDP9gSV}FWS5wPed&#Bbr&C)KOUY((DRC>gCDBZcBsM1i(p2loV{`TERUc3+ zHJW~{en}8oDb*KdXZJO${?%H&(yV%=$(zk;qck@;Q=Mv#6-)e$kEYwXYJF%vv#nYpicCyjVaeGNUVvi}4i~^&^UrG3n)4cEQJAUZ3Bgc;&eC_;&Gv`k1d*R6V zk!Mew+jr#bsn@Po>(^hKtxdib0O8pD&33xctbbYGW*?mHOZrc8Hw9g@zpl?$N9psu z4-MfH}Es0)o)eqm?(M(YjWc5~hInhkhVVTv${HGwYnOmvl zB!qZ-Ceh47h`-_paWm%?ZzW$(I)c2Eq+@$qk8~ibzHoK23ep2Td9EYpZ#FN_)d4d- z2>Mf>J(_y^Q=H!Z9tZycU8w{759hIT^>d_A!hNVW+HgxS|y`8MBGiJ4) zqrk>C4vB1EGLziIxQ#G!TT&^Go00?k^H1~CKg=P5(JVJPem0c9#YK~$xRqSih`JGfs`!y?VLI89n>wmVH@$#3F)Ss?z;=16j^#*_dYFJJzKHki_QUkEcETva+ z%pz#x;lyexDNstCCg-)E2OtW~yw@WTSV}Ya#rWWN4RwfJI`9x1eCskB^;Tx*{)guL zqjZ#iM2BZ|5EQhw%z>_^XXkE|Y9ahMz#1+1C&|#x8m{sW=#2p-^eCa?`<0vi3Ek&v z&_ciIKgZ2z*8hm5d9_QmCaB91W;cDG=gDm#P;1t|PPzku-a@jJ+@3tB$(t(j8%_=- z2U3NUe~vs|6FC}vfu)z!#9c`-;`HUMBt4#t(&*zL4R}~eO&gx7{0z{4tTH>bFbhI1 zH7{37Qh4A`4?x)^9)iFxl@{hpmDyQC+hA_71W@QIOh$Ea zsyg4a0$ho%Je#LCF2g*OYK@YpyJ$eAQL0Uch18m*8zjId%<||)t$DfBn6FI1%9M^w zP0jgUKuT0B^xc@A#@vEWj=fJxiDIqioSE|vbD&SU%OPN zE;T+ttd@aOI~eyy6RW!O&Y2$@~d!I>L}F#xTrCc3(8|H4%?yR%e70FOOt$6 zquLxRou4b+;Jv6B%^P!3cQ^Ky7U~Vx7Wlfb5SJ1_vtV|jc;K-ok3PBh=m#D@YS)u? zJqg`RGcbn27C>RW3w1i~N?DAep3%UG!LWw1>wt-VSA1~07AX7F(%@O+{}yx#+7dk@ zpeFxiuBL>4^w+~r*Bz3Qna@E=G7yRsxMaj*{)%W^DfnYeQA!BIQf4)c4961)Luv^k z@LFm)yPR8m65^0G{IGX9FET;SNx>P;@)5Y`fhnf%PT#CU7dLcO{;59b5)!9S%K2z z8kZNEwb^#B$_lE538-DaI_EiLlVS3BMvB^5lK@707=C}Mou+mEqm-X<>JR#%Iu>-}gI?Eb)5tEq`m!stug@6GwhK2ZejOarXlHcQ9uDiI zj+fn|c1CZu3t>It!c?E{QN-GAx=b2C9I#t-M~-gsmD<%684_%6h{F_)o=MRm2^b;R zDKBxQ$KM0Yrn!cHq)WtQ!U{nPf%DHn6+N-l*>Pk2+C!5}?8a=RaoMlV&w?Gln=B!G zr2(SRTswcMO8c8W@Ng5#(`b5g3r+tKD)v9bp`D$FA8(GPV!WidXZK~sL-v*%mFa5P z@)e_xW7G@D;iP|!%v1cLKSA?hevKgx)dcFG1nQt9>L8Jrv@fL58a!HI03(nb8;7Sa zl*^J?%H?*kT&9Z`W_8_HE?--y%mz>L<+3+7RW8Rm-dd}MTFD#KK=rQx^nJCfsCMmq zwpy?HmDx_yjBHh%xLI-nhFa_Us-M^n!soc%qcdH6&)!5orRjyZRv(~Jsj_?k{01xgp-dCTg{B7TN>qLE8 zPp@rVV_|-N&KGh;Dd8IyLDZ~E9!0INZ?<-&T0#?X5_IzZ8msE=`Mw+5tH$2nJsWJ4 zot*LgK%9y!eZLKA51qI=-@F-H6aFOY%tiF zE@ft4Hrf3BwfrXSe59-8O6h93xR=BH8WO6yDVmo?HJiaWk>#BAa#G_?S<|x)0XEJBj-pntHOu9vG{Al2NTf1ID>>NIVzRZV zYh1>{%n_@`OV%^TI2$+PM3tG81PuGWB>GAJlRR!`r)KAn_ut@pH0ghu)0)QkZ<2OG z?GQL6lC8VCYq$5O>=}=Bj<`hW7s9IH1;s{175g9Kp{q9Ks+InBZQaWBT&(Wl?z#nV z>sLLzrs}od?Z39RdQ(YukAr1;K34sjPdABW9L>slJk<}Y0`;ByQme01yj>ad*CNZ~ zszVG{A(KfJdJ5@6+E;qlY!<8^=GPG4_WowGOj4LGF#vMzkr9w{QHDUyz20^i12K2? zdG~mmyvJc{sfgn^G3B=54jVezGyOcu`hw*yi~e?xEbeb0(>x6pS>BrS+7<-DxE7`u3Sfd zVK`^cXbD-#MuSVoxH&{idkk$Wh*Ij`qMlwe{T>Qx z+PIvjrhC!CQxhg(gg^aj4tRYrJ-n67(=luPrltJK=2g_T>KB z$4XGg-OGipI_gm!1MAfBg`keY%63=cQeozvpq9eQy+JLTsAcdvx`na}N<(JZf>(YLmHPhFLOWi}6A(*>I7Pd$3D zo#q4&WRzHxrhKW@&YC3cmz8b6JuQHpzGK$o3YjIfOMIKmlyy8i`Q;Qu)tF6!{(I;d6t zS9Iu5A0s>>P_K&c%yN-POXE{a=28%!WC3k`F8&YhqmYydM@qAtDb2{8;-96W)z`cH z3Mpy&m9vvpw6vjAP(!jc6b$3La4y?vmJC5&5{_*PFrRF2TuB++n|*fN|MTR5mAS>q zu3g8h%g8{y%3gK0T>dG2w3w6xjcg5e8e>l*E=sJ7)D4C`U*|%z53L_~X$B6{j%k^c zxC5iE3KM3Vxs^P6!9ufVrDv7di;bE5E4T?QVaD*Xo6!>5JnmiT6OQwzdB0cIM6*FB z%Du|1w3U9j?X0Gn1MVF!FP^;h_$e5}8Wz2lBQ^n_?Q9H2$wH_@?Gh2K(%Yg1rfF=Y zo;qz`f8UQ53dYl=zSl~RU22WL{a>)wws3Kn+xO&?ANb(D1MPgEm>V55Sdt<)fauAY zb^!;3(?>3xINt7g0k?#gkDj`4zTHn^`GpfNluw^{>BMP&RkdE=ATNNaE6xO!F(dv! z(C_84O(2`VvWa^QnKPWCPgW{4eBw&mJ$eh3CJk5v$TEKaC5@?=zC>F3J%QQ?T0X!q z1-tC9##r}!U7vA0M-duQEP*M1J6G7DAd`p_t0I1oz6`@H>)$Q>u2Le3$}KzkajqDC z(|T&q3%UYDOFN%w?RwcfT)@i`k&K0rcAb0FIGus=KSu-nw>XS5zimR>H2w)C|D+CI z)Ik!R^{zvA@;LGT25CWWIi={Dei94%*VRuZP+(IZ=ASg+t^TlwY$&=qCX%jP$MEr( zJnX|0i_geHJ_D3QuC;0hA}M;RfePU!H1x{GB>Rrm9Nm z#^pJr!+P~b$=J7uh9L?%$K4byQnKekm`(g=qw=%>x^Gi zhlwgAG6QtimM(P-LPs+pg%s>(Lt6Pmjj+RJ{lgTBPl1b6jr8@0WeOW zLXC2aU+|ac7XxqqPw7g~E{rsr=Hh!l_`M%YCq@SxCO5&@CV-9KDjC|@>DdL$1IlO~F`^y?u5tu|Khb<@v$-*3%644SF+myVQw9dS6LT)(Fq8;L~ zjWT?P3%b#afuak&K)i;>I5UvLN*3Cn!A$%6@dR<^KBZjyMC9%?j;|>GN8@;^owM7t^D^boq{$E>4H^oi=#M#8P zpTNwR^!mv4TWfNCGsyLIa(&%$rO5SftR$yF=x5#zv<|JIM4E=C{c!?SNGeeH1Z-Fb z4&2y3NY5Doy6;C@gT`mNHiA7s+>QU>ZBU6W)yuWgH#KOwU#>O=K3a zv#yI}zoaq+U1MA%(kN|=B0-g~I2JLjmBc0iZ^FEyQ=O~U#t;v8F`W@dBKXtK;7(sH zxMM7mtw+yQn+v`(;X8_gr-S+t`BieGFF6*zApCs)}vpPHbpY$E#gA(ah z$a|0JfpHQMoe+&s|699+SdCyNwt!M_rx`anla_8V8erz})N*=pJLYkmJMhXHLe`Xd zoY^Djy*4IKEba~2;XK0(()Zq%eO;_DREFk^C}?XH6CBq$9!;e5&KLPv}a@DqnmSBu6ZZ%T&?T zqz>yj%%BOZUilMs^8i^yW8@??gs)5?+39j+8jreLT^)6|+Q39kBG4bY1QJ**(RJ$R zz{9UmI*Z2wJdAbbwE=K{3JWbAjdv4_CV5@XkgrKce2w^)bnA;T(8AD#923OFLKw;RpxQrMX;Lz>N|`QR!zu$I$Kzd%YJeaU6X|L8CZZY~7+6305E1EvAjw-mIY$x?s^>?@l*p*p@tv_r5%hK_$05wCb&wOVnJM~*?yML88C5B{&FSIA zEIVDfsHgvR9ezm%Yp_P&H=uf4SDk~YF@A)!aUsxcToiiHpPwvb3Il~Adh|_&`wH1& ze{s05(O14He$gLal{n1r`?QYvKgPSQ#`&wlU-ME(m8Loh@oHTT1@aE8)bac?ue)%* zK!ro(=2e?GPKlS1;#i~Tco7E;)A+=c_Q+|cwA){LX!oc?e-T9M3nGZ#!j0%IdR*g1 zo1l2(Lybd_k3|Fm?Vh8j&m4RH{Hci(HtwMuWEs|U?+;V#vs4r)Okj#bCdHI+9Tkom zqd%SXvuP$aOwD2XB+4S-kqsznOjiqpq1O(uVBq;q3$TA}2-qao0z<}vIsNGzb;((7 zTxZDN-5-)8kM8A-Btg`ZqxX}Rf&tW0q_BR{>v8!|_7r)K6+K9Bef-pw{o@T)fcC_R z>Z z44SI#B3cf=X=;%5nKS>-lI@JT#Fz%dgAXz*!H22Vmafi;sYtun$Y_LAg6pG5t%i** z<$&c)9^Rn|di1KAppvi(4tG^+^3pq6#%yNmJKVhQK%HIL%+>@usw&JfmS$#W_*b-v zH>Fy`KlT1$evKIpU6!%U8fxrW*txwNcC4&4ZJcw`t#Qt4Ssdqrmd0`JsTOB?r;}PF zXZElyS}JGuFj>fC58LQ%;yh?RVOvpApM=RiRoAiggGZRbc>LY)#fIQ??9VM=?Z+Zk zU92@^4ezpY%WxLr0r1E5nkNfd31rcfRSJJ=BddW?4KK$US@0;cLc$m0TK(}U0hRvp z!S5L7#y{c^AO>k6AW0lkCZ497@}5u0gO9YVnQk!b;K^6;pCLzjI&}#{kmb!^0!}dX zB$v@X%p~z|y|9#lc|VP}E9^W3G>Z!8lRT3i0?$`WH;HMO8&h{GP39vQl+74%f^-<2 zClbp!m%5z2HUT+R=_%NwzZWZsl&~zDgLn{X+L_Mq<{=jx` zb>CrL{tsmPLA8UQ=H-TX4W>Qm!UNsKn?epHjppF`<+lq$x1w#Y$13Uij4;Ey)^qY5 z>yd6v^?dqH^@JI^>d{wQcL`?zK``K}0ReP4tzD2XrGnT0K>s&*@y$Ec8NS<9XViyX zBKboxxoK*_Hx3|>$k&m?HA(N#ps(}jN23O%v7U5rjtS#k-Y}71_!h63mx~nHr6!AE z#FyTZ9D<9wrh9$HdBO1fH9cd}oz!}!8I;@DDlBg~d+oC(yI5N6-7$MN&%3WT@q^YA zz2$O*?;^Vg@`_3|adOXjx?j>9m@ZIB!0Z_7qu%KVcup1{3f3TjOfM~5#l=bvIJLQU z;rxjc&zH}ixWFW?vAXVRWzpuWuZ|3!9((azaCKt*xLePXcJtgaKfuVa3QJ zjE1Wg@+d6-X|soQR#M2MmI~nSRJ{*iz+66p_F4<M3W)j9(Vp&U^pbU~2tWduQK%8DRp7dO(-NP%`sS{l($+|s#6A@=FiQ^6IzYCN0q zRQhf#qMzpE+WnHQx*PAXI1=aF|DrDt-by&x`8G_hOkLQH7djZ$I0HwPQsWmuV1J&c zcfe!f7=KySsf4wZ$rwg`1^?ecZWML%|FI6gu7hy3lNNtdSO13&ozecMx>c>QueW}% z@%slnxTxlA;zE8`#jWzYvVYlup(2u_uRI$2=ug9=KQkSKoaPTF;24?0ZxkldKMc@M zWQ6J3to0V6J~OFR!4ZxYe%1i1q=p6Q_T(U`3$rZ|myA zBsM+|8VI}Ev*j4D^B2r@H93*3=A85Dt>i?$nx84)!kT{rlO%Tmlh1Vz5ey2j`mp@E z3moB!fg@aRwXfRm4H5OhG5Z7N4rfkp#_SJyo4qYC{Tr&o-d1m$m2sDMx3`_Nk?KaA z=I*t$O#bbx^mf_xHm-Mjd+hpdZ`6B;^0s>qdwV(G zkn_aW~op6~RY_MYLq%loi* znDcJ$hvm&$N6F6RD6Wr=Gtk`-;=M?R7op|=bt7lL6zssHf zwhqxy_`j#yf2D&l0pHS<_4)5}6{^cVqttG~YH0Vjh1PcPP`2ee{KLAOlZAOG=!giX zcF|hC%MF%LF}ztI$t3Oj?m%XDlJ!5U1sdr@s?`_Ppx_(pgM!IQ($IwhCPnMx-swYC z&G$Ohytihnm+#Q*T|7#sJI#(dCX5^M-kWZ<1Wx5Pu4~3fRpmQXbv0e2*`|loshSv0 zcgcbRfc{o;8kbCfIW^uIcxq<@H^map&pRJjdgkPTo75rujhJ*)@JuRm)Fi8 zKXuOL{@1}d1iy$|AwLREC{-47b zU9C2z@bsP%_0*rBErPfU+=$!9!8(qlhI zsw6~<+=5F962t2tb%rqAdMX&gF2ZWV2Gx*W63qI60|(6v>j-YlX{QrH#8G;wb^jf0 z_4_%r?{WmOY*B^+`s4yjYzUrQsxO4;fJ34krg!LB7;C~N%STo8V>*05hdSL!&4$sQsq)@$|zK8MA$H*m2-0}EU#a(`Owa>=zO}ih<>E^?3weYUMatDJo%Db0yIKO3n}aS@IbdXkKd1}H2x z8XB#qq#ebUc3=0L7Z5@iC!T8uI zd`Eob@E*}xz^S+@>p$}ePNiY=Ncd~C*zQqeuQj9O{|V39o5POR+|dvR6R17JD?(i5 z(`Uw?wSoMe@^>X`H2tJlB2kUd7iGRNmn zfo+`Oc7bK^y(3fwr6Kf0!d{2{_6@p?ChuhU9V@+yE3{C?QS0z_$tCRNWYUgLY|VrV zVI+VV%|M1n_3*InQZA%haJ`$Pw}nYa-^0nz>s@{>x2Xu-^!lsHH0b{qJ^FnP?TkW? z_?jd(v&^l$J^W(5ra)vTEIykpurNHS@P1mHT4DCe)pU;d8AMm}+uOqVD4KOikrrxG z;grn3^4xLbC2Y!xCSs2=O4gZjYKmd$iR@)zR*P)npH&0XMCURMThi-rf=r z2kUODB zob{4;0BKEJ*7>h569PynOBhIllq7HDAT}ZpVi&RmDBC8*dMqucG!*mOP`T$l=l4qp zF$-9gZM}G2bhbn+K}o*C@l`p1U@Shce}5E{$=OMau*c`6lor98G8f0@;&=Eun-Aly zp|yMhu^6*P-7WTx;|zXT`Hem357>jV=T4kF^@^J^&+#<0joJi{2!6XLZx+10iPPsC z8~<1(tziS?j`0}{*)R{~J)|`m!yNI71&%uqdK>T2HFkIL@-cpmmnaXaVykczVumqd z1a4*Md8I*9NXs22Iv)yivr3U#u+(@8<_q%0Q;L=X1&H42>!f)7R{B7bu?}j-{@)mreEbDib(ky!0mvX#w&#e?zx~zAv%egs$IbW8!`&w^A zLPC5(j~UXJY9=n@x#dREDaXMwMjrOcp-C}ZuR^-CT-6o^IQ`8-LC8{;{TZ@t#)J(g z+x;km?Q7JXlqXDYvZN7*wL+f}1Ca$=rXjgge=!Nr=#x<*qd7)`Itm_x+Yw%GrFVJ_ zBO~LrFZ>BBp|U&oKR)MZRP858z@7X_@)52S#o9Tp{C}&15t|FT`fED;stz`-Ue?tM z9GF6Xr0Z_ch6qM-^Kr;uDyg-zC&_nzQL{(HG?5#@j-=V6fASe0v7eh!Thg0&x{J^N zAyNz}mK)1RnLu%7da&s<#!VO^v&lkW7$UPVVG7Rp4=q_dGs2;!&8`PH8bR=41R;>E@~V?oFlK4c;-snkvVa-4FR* zV&SzSJ)S0Re_bYxiDpEkLj_v>V~>nIa`-ev(9w6@KmtOBH+nF+IAIT<)jI{6DLwhsc)5!i3P*@^mS%1fq4{+8$pc+(al} zoL(eI9HLB5g!-`he>DM#e$2(!!&y29dWQ%&(cszuqCpDL;II=7yv#Co@mCYq243NZ z-+NZfzW)-8d=9xVzqk^W_yt$uQdZ@`7G%lyhDu*bdwI}n4o`Wji)T5Ft26{lIYp-Q z3cv#5NhYz}vs_%;j8TDm9;l7Z;e{me4i#LrUO~Mhxel3^+tzNa=!M;KoKS4<0C8_6Pwkvu5*Y7lftg z|9hVJ|CpJF8<6gR_fN#P=v7IIG_|=A+4m|>Q zn+|=t67qKVea*z^a}&e(dMi~Eqn(>19<+b6oe#RDowZ)jGFrv_Y_yZJ7EjfGO63|! z=*C;dA^$_oAmzX+ZKz(3);Jb0n{a_7hH5dHNe{60dW5+pkw8aSf744wvu(%P*=D?S zm*^5rI5GawglocHOLB*YkP31{{IMy)ER6}4Mlr^^0&@U?-)*8hCNWc}`3Y zZ__dkn9GGlzq#GpY^$cGmwRsRS4~TKP}-Kw30K>4(WNPc^sP~PFWM6}o@m}|K6-4MzHQl!1g7txuKuOMQr}Ylw8pIj z`n-P?-zk6GzGjEMhVuT-qhhQa;OO{)Pyu@ifdLorNc*cP+*1HA93&{k=0(;mHfg@b@8^0OSONlEZ^4Q z-*Omz(BYly%Ji!`+~7bc3Vev0j!Z8q^|TJgS)S6>(>fS(tLbV~hlg~K&crE8jI}f* z^|sQC5#Fn-hzD*Lj)cZg8ASX)!1d;)96tBKUUfob(`m1nXjEJ`45#;&>Az1 zveYu6wyIs2^J|y1SZOWGm)8#XBs>6?K~QIqEo(|HcIlD2(xJYo?|Z%3tbJI!cS^EL|ar_L7D} zYLte1LbEU}HSS5C^n_0cq+xl2Km)HHyF3>zZ3l=hH??d>LFHrt3!+95gcsysCb4=~ zZ^F`8WE!bnh$lUZe}1QHwbIyTSXMog;eZpAbs;>inP~PYE$CL~u;C9V?~u|5&!0Jc z(gHeB$2m^p5+Lg`&Z!!NRiY?!2gQeyKL#XAl)=`#N<0YXnpoBfcDf&% zb8-f4%1qxXGJy$>$=38)*W0BEOWf>hT#v$lqV) zFfK2eCZTVo4S`-*GZXx07>7z{9JI)L81$3NjHFr{yT>8uhiD))3p8(z@oNaH8-lcf^2YL zx6><7CQT_E zu}=ofSP#&!322acthJWC^M7oqhhGXW@4`|~z~=EbQ#W^QKTKXh+6rUx(%0C1Ow+rp zshnIXuF`e|CIV^_D}9{%C0#Bh%LB5NmQjzIF5}4%MjSXeG#6S2<_X*(q0_GfDKP=i zB)PXY(nrp+^ANpX`;Qzj<@{@#!JVNKx_ep=?R8pq3VT~LR1HnswTuXzv0^)7op_KDZ(AAflCwfeYQi{ZA{ zY8N}YnTecJ&KT#hhxbQIy!A9MJ?)e<4^r&AWBZmwjxjeo##oxy8jRhGhrwF}G8Gl}!fN2xsatdyuhmbKbTY@HZ)& zs7X67ix<4M9CDiE%2}?4#WeG0Rpf6e+XjNn$+&F%gYD^LQcrtOd$&okTRwT}#OdSb z{cbAO9*!7B*8}DK2i8g3e|y@2{f?DSspVxB* z_jR9`g-@z3y1*HaD${*>RMO#?4py*X!wyP(ng?GIO1#JmiR?&LK>&++$z68MT_%Uh z3W>_%HP{-M2Ya-pN=pkA$wAiZJ|nTHy3)mzlv_io66Yb*U6h6&?IuI0tqt7_6g*m_ z#mZB?euhWqxj)070T529P6^CwbMEqN1IV7Pp-y>a7vZ(9mlm zZ9K2wWFqhCM=}=#tVa~j@}P+P5cmyAX}N{*wqR-7y2lG9DTMC*k>e1+(;2wK+}L6o zI1qVqt*`^@D%=pnCM}szq|B6yJd<`lybcC}rwl~l`x}S@oq?F*o9r(XPS11K7~!C0 z&>!zxCd#;UntvvBjgdDF0dHUREq)EDvHk7j;u@avyTzx}-$EkKY*BBiWO)dM-C%a`B?qW8t3c9oEq?sP?^pi8#-tB6s`4?o0gMASi$ft}`G=Fh~MaiUsuD68iXXTm++aa<4V zkH$5}`#t;&oBj$Hi(iY(Wj|}92qrZP!5$nk72q&?D-9+s%5w%j^{A!FGlTJso`{2e zZM`Qr+~$1VZDu%s@h09B^8C}g%h^D0Eg|;{j#1({1}1_YUMk3y*9VdWzd57+?o06 zppq^&#=O6F(w$wYrq7gU+qx@;_*rQ*Yfl(dr$<(ZC2iS)y3}osGl1BQgJ#)__6GMTB(NS#oai~Y=_*hA@X7?9u{2fAa5cgXp*F( zvwqGFC5@AaIzI3n>w32?C93r3){K_JmH1sLOuer-H?zqK8E z&KC5n-;dG&PhIvuzJ6^ydB3$CJ^e1<{i4y0CIY+605HZ zAgAA9{l4az_U#Md{v z3Ny}Xa*51-O@}KS?ohw1jO;xWt2{m%s@Dk};6g$kSi2~Ff!ejyy)ir2Y_Rt3hjm|= z_qCr|^QLVzF43R3(Z0WnXa4`I!@tu(4fp$W_^uBBL5KgSgS@i|hpvEc&T`}rtNr@y zb{`((&DvCuj(F+3smwjfJUo0eyqWwjqm5Y%d{a3~zvxS%_9avqOYV!Ob8@{%i&JWv zTtBH>p$Om8VOodFI?U)WtHV_t>N<1?dPj8E`1}TV(u{6}Tt(|{z?mppScyYIhyRuu_&z%ozEC8?R}H>Scy~4*AL_4QY7q| zqHMFD46AzH!lybtQ*8D&`=+&L*ju_o?$`4^?thwlN+FaQ1`teaN&gqDKJ>J!$vV5s zkXl3ooRFD>vU~hrH*?7#(x~pfr64@)aKrBK-2EFQUe?Ovd84~O#-}HN2M{iOS9;Jr z_o4S@*Bh-GDodB{Qup%>gUyYmjoy#Hd8>W5igB{^8CO@pR|U$U`LJ2p|ulC@`# z?p8)u)v6(`2UZ?h8d9s4AXqc^HXmLZ3PK>?i{!a0Y8{?S4TahtSlPP@p0|>>MLX|k z$GoA+H$iP@@F0*ydk-5v22sZe86BSqrHc{+caN1WDz@itIoDU&^MVB+yZzn7#wwON ze~Jzi2%)h!g29y9TiRXG3ndr#*u_-RZ6|BIEc185O0fHez2sb^ODrT|V+HpNrKG~D z$^Ri%hMf1q#>UGdl5=HYmN2w^xn5v-V%JGdK=n)D7FrhVxnhi zh8E6Q;2{cAFt7-z@yw-nJ_!TCWQzrDlkL zrB7^xIMCzj_{H7+4N>DI-aI+(Y}0bwx?pADS`a<;Ro>`6=W(Sh1iDt?wrgL&vshS3 zcEO&UZPv?hGj;#ZkkM_1Q&csd(QV|(+Rj%dVd2^7cRAn^!c1``$4)LzJuMlU6{qZa~^82k%ra=R6VEj zk_7<~s?L`*@EO8gIEd5Y3=F@dN{li3hOW%x%?$lgF*+8@bQrJc*3@Zlay7caX*29| z)mLji5IZMn%Q|#)9j5yDq|$y+hfi^s$f}2N)2%v#aEE6y><(~ zxaih6kt83)cA{{SQsPmzDO-XVBBI5e7$P*%{={;Ln5qjKU*ijxk`1;MYYag?4TYjm zkdM_@ErgXqr4}%PG@Hpc6;=W!>vJ-iOfKh}={FOWmd8UNwJZ{tgG{}GNi>5Ax(8o; zTzpwl1#`cY{XD)}pl(bg7(*kaUGUE5c_+Vw!8n47v3F2K&yR6tLo*?ACTY3TD%{8iB> z;W7WvLtKc^#aiGrsqYf;TE+7EZk_G#woTUPCkp9Oae(Re>wAG6hbwgBrG-i8UkSP&Ed0QD} zu1!Ow<*Ug0g07YXgylw8Q6VI#BNTG$PVKm{UN6R9?%v8}?PuILv`#N}z5dR5)@$yXGCHFjeBy0m{T>SGjFv0p_OW``LT%Goverg5AL?z(&Vx&IRV+>&_lOre(w@vCe;TF0P-iXw^(xp!B34_ ztWJ%D!gQWFdt#hj6)!x8j`IuT=43AUkt(k}fGkrE(R|h0o}=8r0`g#>su@#h9hZXc z7pNu8sx_yPY3(!&>NYiY(M60*2^trsM1`goh=usw1Y7G-YAMJhBuh)p#Z5#<6-p^4ZI$O4FMX>l`@$XkjaUzC^3Nq>V zzodhi-+x3`5*3_;^cmiu6zjt^Lc>KewR76`=~BagQzfgz+nH%5`9x2HO{YBtEATH{ zJ~t)&zr&4bSi^xac|raE9mxx4xk&89Op1E6k7avWvgb^uGM>r{N}HxyDlrm<;qr&< z9`}9ojvBJnDB|}eNf4=)JQml_xPA?5WVRRQFSV}RSQ{k{G8v*U6UT4M_%M!#d}c;` zI?=(7oe?9~g~VcNI~Slrpnkis-Vu)jX?TtN`X1zAdQ5|f>2vQf@c#;rB4e|Fp@*M!${%pCwo`5nOT##e`!)MZr%XRpLV#f*uL&?% zzx59h1%HIlwf^Q7d{S_wr!1E3qS+%8)sdRpj~*DqhP`R3rZX~5(X+X6Tj{3=l`?{Gdv++>L3PO z=GKA2c7KRiP1)faP`;%Xqj~RORI?tp(3T+ZMM3C65)`_JkUcihhY1p%!Z}XcRJl~` z_9h6{#11F8naK^BT~X`9@z*H&HaPAJ;TZ9AI}jxC8xxcMv1T_0y}&sTJAd5ZF5~4s z$7(c#M6~5=An~Liv6;7-@Wluk3o&R!Qyzoq4m4Vxb)j+Apz$^~<$a@_|BB%FP8*zq zwEnEd-{5gb6cXnP!0w<4Yau|ot+xe*Za>L9yM7yB8qf&_+XeQtb8z{lvKdH9hqpc; zx=IcFKCkTSfnOd5Nbq+<@VAFtA^h3i-EzJK0=3}rHmK90MuWPbg!RGh7bx++3D`ZC zVRg$)2zWofF5vyx`vyFR2G@~7{{Mppt#NligRp6e^N6uJ4toKsJ`K`~VDBpekPhq> zw10dD_`a&AOy&Uhy&K%o`)t*#gB80T+~pPx?R`ODw~Nxd!EVHWP5}$9L4+Wyp3LROYk;ED47y_8n0W~rs)gzQqHwzk41Ya zhm)&xN*hGsj=fJLac`-4V-BQIuQg0&a8Yx#uOC{5PVjL_uueTBkr}HhYN5ac)San71 zlRB*7%9QCBHTdRvio?F!RM|p)rA6(wDBQJNHVns@c_ngv(-`V!W4MD0d1Kka9$ekv zUkey~F#|6p18uH(09NvRSQOlZf)xxd3Ksys>MRhEvF#KVDYLtoEy;;Baq)B79O;6+ zXd(mK^VOS%pv94x#>g|{R3$8ZZi>x)WN7LhEsNwfM;yV@+5)w&mo}3s*_&(&q&$pv zqrv_*HoBO(7~pu*uFjEvVSZn8ZXf0`f~&Z-1F^AhZPe`7=P4+)KF&S|XY?Wg3j-TV zyAXa&IGmrMugwOuW;okD(M!LkLDd9Hu!=+L>1_>$4Pulhnv4Rq6h9lt?OZswI@wld zk_|Xr#R0WDMHfuAJ|A1-9vF;FG1Gx>7a%u`H`6`JF4RoCqb%QL);(#4G}IdwSW1N` zC9I-*Ogh~-nqfV#g?{i~=Tk7b$#&)c5Z93WPxC!%`>7c9LF1o99feE+FPCZ!htS^1 z)YVfF$PZJp{2bm0`b*0lOf>t^_t`&uWX(l`qHj*II=9m0vAlk-Sf}~s9|{0sKCTM~h51dH7g-3uZFUr7Eh(ShrMng0q8w12nhDp(8==_+V~ zfVt7pS9F#@FchnI9+5)$>c0rfO=K)4cL=gpZX__vG$!aah@Iur1hI+@36!#C0m*HP z{5<$LnaT?OgG(&IZn9I0B0a7q%@ZCZwUQ-`CAqAY)Lot{7x4ieSiTR$LBX5EO89KE z*h~=*GG&|P^)^1)OtGkz8d-?@<6N8n2&*y&xE{b*HfWv-7~?Q^Xh=Utq4vsQGodANLq zls%-3*75Y$nfr%0KaANeTi%N?E?eH$9OE0lb8}O3Y~>N+%j{&eCf~&qmN?tu=mYWS zH$lAMgZPH*;+=ylkMhp$=pD?G(K{*sLC1my>kf+SK)xeb>v`Em6n24f+%-{w?K-vc z0b2PuD`KF!ckHbjrc&f?Hfcl)&KakLSx zYp?AL7cVU$%(e&e4NN%jP;`;K%jY#KS7en8dv3R@GTNkN+Ud%T#c_-M)6ULn#LPFL)C5tc1 zoIiTV|0z>NCb7OmCuv4vW&GJ+9T=i52TBhHS)r{7lQTRNDJ!&g+wB`beg zwQA)M5HhFuI_5rt7kK&9c^v7{o@!%*IXmN6%f5(2eOH_Y|CS1=>Y(_R?hQ6faAAQ8 zdS4#N=Bw)-;_7WK)NWfbmEqEH%J${k>+W!xc22(X&}ggrg_>s(i|pnSHxF5TJc$;> zShKD+Ys5_6!$apU{I;^C=WlpzA^Z6oD(7K6{fnwBeaWAn(1T09%G|35f0+jp>I1?| zUUz|yzN!!WS3HC@Hp(tqg^P@XQu830NPGTu>u0^o7*-n=L}G&d;jVgkmCKFAHL05$ zZi_8wx~+u%mB^6BG|^KOV_;j$E2Nvbo zS;{N8K=_PQ7S*o|Q{pdp1)MJlKwz~c{XZc6F4EhSfCtFTNbn@RvXRt3AXPO7sm)Ed zU{4jY*_H?PRkqMAXPMj5@Yr^wLc$7!sKCb(#Tqw-kv**JCKp^}s!kGQ$b8;TvVIHn zG*_SPve}2|su8lfAzO;X$3ipt&pIK)Im=z}7bpZ&d66x&_Ra3zH(R^XB^^-rJVt(y zA5IVJ17*(M~acuS;8NzWQMzl1nqn$V zE2YT~ntPth`&rRK6bD2+ZOh)ltG??U7fIx+wwBVx3{l>%2Ib@L94kMoHJ1LbE6yXD z;MAWU#*(5)P=u*bolK|HM-%5*yjS;@vYPmCX$s;+4##P8|M=o__*w_Num!+*NTtm5 z+cyr-X37e#aZXzW&EQwv^SKNY_K)Gz;AzA1Y>8m8azE_+5l>qn1YR_O{J%zn5~>BR zR&E+~uip#;Q@IF%@tLuQWmoLxIOnsS!gOtVZZGry>g3#PZHkbn^(%Wz)#lXLs9}P& zY)`zH_ss#_uI(w6O2>n?)U*c^sH5WHW(lt-g@kjTLY51Bbj8PjAObJi%Jn&R8yEZ6 z)hcL~c*cuS5#}arSPYEfK-CZmJRjyl?a~&1-{L`47vUU1jkhtg;Re27GBvWf;1fw! zBSU~!g5P`bl9(kiJ{YfIZHFGcG_F|Udb2wl?q`H$>)r^%oPhMD5kna8j~!Oc|4U3W zw}ifR7lcs^)1lJ&D>ckq9?BHs*;?D9Cok5uR@f}h4or6Xt&!;I2|2H+LSAfAFckJ1 zIt{MJ;Q2qmqjsk3Ok?>!S|MU3&3;!u%P@mSCYyLMCJE*TYUtaRP>nGU?!<;vc?3L0X|-u0W}jtuP_ck-CE4{ z>fD0O`M?3I`xClULk_Xcg4Ym)z#DjAf(klpY+MuMrVOBckukRQJT^(#chRI6^U${S zav#-m!I)cK-qAaowt2rEe2O0SU)9xa9inB%F68MC>FGCk5Q4h=)tz_uOS-zKLq&&4 z9lE)2|L^ejPYcYYi9~&AF_RUMQcl#)4MQdgoGBvP7u~37*G`T>o%;#0U|YS+-C)ZX z19M6=bx|*8Bhs*o7HB5WQ?sB14*8^U$j^wtYE`lJrULwp)Is1-b}$jNv1Yc+@*t*x zjINfmPf8~P>1&%<$dZ}CPT^(WV6oHZG&M2`7Me^fes)P)CcRDoWp=z(z(v#+_((73 zZbDSyq!lra*eIV%8@cZb$uQHgKfHc9aqT*W-2n{5|DMG)=+av|cz4h%Fmb;5dZNyk ztPE+P!MVuB!kkG+!+Upf$^l=(C3#T3r zz34@)f#_00uzTUOt$%286%hD%NlYsQe*3uQ+<#T(+K@*V*j*H3?__{=1qp)WVhu30 z3Cn8yM=UCpsY4uBU~6rJA!HN~o{};n7JP5KCenkUpogw5OHtDB|2`>G{OnI>{Y>2} z^bVMCW1DrG#sWlO%T~H)U%T+sY~|{tS9#_)GzC>uN4*>LCXfM(W1sxJ0FzE=Isz?#ax$_B(`40NTxNIsLGdtsWy?!fFj)i zT7FUG*;~s6sL&(^wcL=AmiokLF7YF@a8)BQf)zuAc#s*c9u@F^nw?2Recoa6|-x%SR-K9_(u~JO|31ME# zRgaYd3LnQ-PP))G+UuaTfUr9pI93u57vIZukHfX`;!OKy*tg1d*{~r($qV&a+(1hg zBb?DucsM;sHx7%J*M-g;MtVOuEMC+)=*;{gFgg7L&Bnj413&ot2ROFkXrwg|!zr-q zA@^bn=QNT0FY92+fk-9maENIQ{tX4P&rC2cgIL*4gZtAwGEAb_YtAa`3#Uk#=~uOC z&X7&O)3kGrSeni^)^1~U)%(|ijDSIeKZHFnzNhxU z?iePCSe&56UB>q;1sMi;or`zGASuHjvT=by8jmlfW?1HhgXvM;V$HJj3bN;{VE1aA zkRC$=E0!upM7T7UfRlU5VT%{gb8 zxNY*pLB-{~^E{GwfE$NE!i`6l7EfG>m*#|hbaJ)1v7-ydJFqX3b{YvC5Pmu60fR*;3YZx^(8DDO=#(npAC|#}r-46?Xf0qHZ z2$1cfUU6?YsP^>Sc=8`nCh48py+LKlODIb`Q@r?o@}b|r|D{(AK)VT^|4(?(gFUse ziPDVa7Hp>QX%>~s6w||*)?J7pCnCi}BBy|I+zd-76lsZW&YUjqUavtI7H+i}-dWzqrwd-GU zR=fU)r)c&xdnj=it=P=YAX;*$c5RKGuy&vM66CYpMbDD5O(|?HC3fG+dn?&c`rT1Z zMXC+n3L;g$7S1o>&~CX<%acUK#H$lY>+;P8O!sUAoTZWjK1IQo$cbVHBMdBcOsDc4 zM$w_%0^6jc-`&|5AHBx~A^WR(W*GHn1Vv)7+G3(KH~pI=wF_4<;*rvb!Kv`4!>)#X z1=}v4Ak`Scc0PE`LZ5^WA;y>W>Wp4+Ib`foR!ybY{ODC$5Qg6W$9m^CbdZ5I43{Q| zZx=gX+`-oE9+W~=-x|GUN_>+7_Gn6&vZbI+BtXzhmL2(=fC41v&Jb6fuz`Ft3g~H&0-J1@%E({b zt7|0Y9k^@caHGibUQTZj2!!>z?8wE=V7Ia;k{?Iv*3%>mu}aNqdNL)4gPf#?c{@t& zpdWV!{V0fhr!Mpt`1*0eksI#)B|gXhmJXj%M@jqV;yjvC1Tyb5Bke-CjZG+-M4gNI zbZ)_CiOfYZw{s3WU98^SdVNjb|1)ZsQr{bjw)o{TD%wsFun%0hJ?stQG!purXeb0~ z5x1~|8}JNR$6+q6WttNf4fy(in!g(F8som#as z1)tE>XX-ZtU-g+bT@;x5o6w8GO9|BKY#iq}qoB_^-~=juhZza~cty5|)^;6D%eCOj#(gI7$C;cF0B=J;SudlB4UquIV3~ZMlc80adoI$g0I>59rua z0c2^LIFwIfz=B1cm_Dx8rrvQT3V&h4_y0K`+1hP#6X8GIdoDc4x;@z!>q*lZ)c8^t zb?XvW=I(G3cL#SNFNlAw{#GrWO_u^=qvN6sM_MUsCad1LrS2c1;6xgArCIw~F9zXQ zgD|VtqjAu9L@LUk;O6FO`Z+;AZ!?HX&ZGlgV}FzVh!i7f288H8$x|$QXxAMlqDcJc z-_`e67%dGA0IvDXBE;kij+kiO$U3>UldG3ppLe<7`*9EmS5G-FssM5R_rVy7!8K#r zs9Dq20eY#&PERpV%Izaa*{y1Bb6yM(ui7ztX`xt(^U8d%ptd%!pg z4UN+_f|=(NjqflnM!b))JibYj1muPz5x?O77KiqRATwk?SRHO2F7IvPewz}0OpvpU zN)lP^4nD*-oI@-Dfdw%sQRj|pr20h-h+HGZhDVe6|Kui`%)cohTE(b~!TC1<7wu>Q z7(sK>jn{8(X=eSWnpv5dwKBj5Ui z^P!&EU?SparLw_=Shf&`87gCT8G&J!f+J3-BK-!M*U}g+NRN!+pd_dWA!+QAcwLfp zGIhy26&84rDC}%Wp=i~RPO%oZNIbmTyMP=Gm~y-TRd&2t)0Nt6Ozqpw!?joCIR%`! z(A9XBnO?NDsk8Fe8E2gaejLr~EoC<5{SO7E;x*l-bAL+!>%6Y0+4*P49n1g4@WK2I zJ$P7e*nIdSJvBbt^d&}(g0RF9YhxOmcJfj?xv-Xv(VKro@V$o;6FC=wN4pGUU}6T$ z1FCa{O9qj7fcDM;1ZjY~@a6y4*tx~Vag}j=clP4hwX@kcS2s@Lm^P^!Y?4-rswhOX zQB5la6BVne3}vx9Zc^8=li79R40a2IauKRp`oaSh#ChTsoSY z1(}(zY{~BZfDpgMeitQdbBumbyEr;Z$ zjYWNaBJc_B1@?6hK~XP&xX{)BdbkTf?S>X{W^o220gC)WFtW+q6Q~}{KxJEh*YaPE z9u%nFt=wVBegCi$mo^oRZUwAfoly_q)XUiwzJI`}&(8(8fdp{EIk|M^xMgaEOn)Mp zNI*WzxBXXovs)%wahMio$D_Pz=*FR(70nP?7{95@%6vmM+cQ>I3_WP4eTmx=XJv6- zY|r2gOgw#p1tAxCskl0KgMHf+gNkwIUBKEV+p}Loo{pR#I!=rJ@O#_~If0PT>w3I4 zCrvlqxYyZcdU5aioLC*kEHNRJe-wwZ;Ymh2r_uP0M*sbcCp`d9f0BXaYPci?}D?IxiS5S<>LA%2Dlb+4@ zXpLUseBmnaaMlRi{hM58C)tV|4PUh=io4h3pj3~(^Qa5DZDMLzkW~F3%+3u4oQ3st zk9C2IN0%)HBO?;gh#`|oLGGQb@m((YX_TiCCtbAR5!BOm33_LfYtn4$Q=OACGhR5G zh{*S>kPl5JJY0cHh}sPmkW5xlsa1?tLa$QI;vr)9%SQx&B_nJ)` z1eB~}R!@=xwr6?rl|3=2qia`kkghWDcNNd&g2 z#Z%%l#W>hN(F4v5YHqpHkz;`bd{=TL0LdV0c-1ER19x&`6@EB1va{I27CJObu`A0M ztL7t2q0!h7%(09P$RlKQf@oZFxk8XjMko_;)5``Ws06R}!X;^r z`<-OIrDxdul3$@gv&Ku_!-eoVH9ZKg&&)5Iye#;n%=S6=h0B&_k6!xP@;pjqRqTvj z8w;`d9(qi97E!l2n_X}zx*%ykvzSCt7cbdt#+m{7Sq6C9`lWVXTwZ=Ao2%j%x@UD_ zCea1LX>?b@TZiOHx=))in~?h!jgIQMZ38bWz<{j4^Igb%*D@`S92;Je26uPj#%$2IaHznq{twl3(7ea4b6!qOUE_niYk&8 zuj2e%Z}WuVUsQxDL>vLw=hOOTB>FbMJRxARS|G)!GV=#rx&ke_6V4|vgJp#_n(Kx# zpP>R%BHnr;z{(Bj1~JZao?1+h;sLP|-b#TXTyV#b%4@w}9vgmEAX^kcMJMQwycnVuxCCrPAgYel$OZ)uczq20;) zdF@q9t_v+28%3r_xSp}HMY_mH66+{Ak>!U7DU@% zZH18iTq?hNOXs&(CSt$U(luJGj|r?t=u&VgE6ZhK4cVH3)>tYBd6ASUtDfcRP-uUL z{K)`4yg-?84E=|xuo(f3XNnOoHMIUSdR9iY6||-yN|UQDZNPlTI8KnDB}B z1Um8j$uYbuYxR`G(&DqqG(XgKDnB7qtYPxdAQF4YVqCi1zPNcpi=J526YECB-sD@h z%xyDlp;^BAi=uaHzX;9L#7S!d#z?ky^rEYh3b5=8y3(GyYXQaFLpnR3(FnSqY`c*; z5NJ}sT1JvK))3^tY(Mx)3&A{hL@RWw6zGOLrfE5kSK~AY-(Zwfn)o;Bmas3b$zE+< z0)tJk5lRp_xYKG~(@opi^dmfy2|2oSM|B`?t#7;ILqgJ}!pubE-)m8k&8n-ddNDsQ~O| z!tYdz)%eS*X+nkHR3Z3p6=}jn68nnIn(c>ZneeuXS5?4*6wGwm3`@gb>!)lnOzG{! zcE8t8Qz!gcwLhr%ql!PN=v6AZZQj<&TRJN|Gr3Yhi>VCBzG)J2E)rXpQ zH;?#-=yjZpuVrQU)75TCKq^)QK2a=vI?nBA+6!iy#?pGL+^p`9Y~WASrI#L zKT`GLq#hg&M%}RudLV501#Pz{SN)Xg=~cOl$xc(o8NmlOycc&Vg7d<5jU3!53+Mc5 z|6}B9wB2DNd*KH=gZg!|7#uc10#?zS)BarP>|EHj?l0vn?y?p*GcD{u2VCJ?)7?2G zet^1f2N&G7_jTRjpxxmf5-}X7_8Tp27)owadgKmADGr| z@@!i@(UR_HZ}L2(hgjHqYoCG-;6}f5VF<&H`bLra?Oz`V?%{JxNkx*+_$$6r2d{0j zLCX_IEsIa$y_v431l)+f*+wDo}YYkvMvfj74Z*4n_Ws|fAeHe#W(u0@0tKYiN z1^48+e#v`2&NFa*-Mei*Cmc-@-S+?~*DjMTPjQ7WGu!Y;#3Luq`yt5$lhs%t=yKw@ z$(o)h^U6hR5p^SP{905SA5R?Z;(8kzXugGtdww!%Jm!2T6FOn66j#yg!9ZXp;xZ1z zVYD&jhLOAPxz` z0cI^D%@4_}ZD2^=Z4M%toiaE3b~ z7y#mY?Z%KRMLp4;&mIof#W?jWo)gY8XMcK9HfFsI>K3h(QC`!Ybf+8fF817jm;dL4v+xmo1V|m2RWi}=gE}oM@Ia!=Ea<-NxE=Ey#qC;7lShcE^#3R$;xhSfr zbU*Hmyz8gJHM&QG`Bf8j;KbN)>;rtuS49ZG#F_v6tPH~A0h~NqoW;3gsS^+D*X5PY z3i_2B(zLnY<1MqJkLxysTDRk}U>|BfaNEa*fRhoYp{Mt3025gfmqk7~nxUjFMk$D7 zca}3%EP-V@(=S!!Y^NoJHj*N)x`)8Qoe1p$I%cC+7NMX)I5}>ih1sD?`4mJ0vu8>Y z`sy~rCv=UMC}zCQQ{g@}EmO?+pp{8b;$kZcX68g85 z+$Anwo_%`h>)IH#brw)eI|p^~X)X_>i+Siu7!4&afX_jb`*c2m$SFf8^J_2S(D!y-GWI}r4Qqk;+at?sSW8f%3s+?x6G zD%UcxkXo}VghYp6kNaCK08L_KQi8?)+zO7ksOa3AH6t8x98QGwE7cxXaZ$y0RZOe! zg#jN`AuX2+xAp_oUZ#k5PAzvH(K;zSn-9z~D*T5|-==e1n_}|YL2_iYz&^N$6B_jm z6^>9<lqp`_xcI4PAm^6CgjLV7hbVK6~j9IYhY13Nh<2aC<2+YWB99rCFcIF`Cwf{u{ zoej%et_Y_$eZWygT$EnT{v($3P`{&?gc-HA74;R%os8nf((m-+j&zsBa@7TTfKe~e zn=k*%0~JThJ9?gZ=0TfRq1$&g4*1)eLw=v%*DP)E>1*t3JXct09&BD3>~B6-NI(0# Q>h9R6-%m1=3-#iE0U>1QcmMzZ literal 0 HcmV?d00001 diff --git a/venv/Lib/__pycache__/tempfile.cpython-37.pyc b/venv/Lib/__pycache__/tempfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17d6f73f0ff4337f01aa4b0f68f2b9c114157d90 GIT binary patch literal 22143 zcmb_^Yj7M_c3!{cfx&|y_>lMzHIgWSkVuH4UKAy934)}Su{6+<(2|;^GTWGL00RtW zz}pRi7!P*WqAJqHwX!zlY{jnK1YB=y$F4ZBlXd0c@^h22|Kw4Xa;o}AT;(KH*-fgF z@{hPmKazakx!pZ8(14<>05v_`x9{`Z^FHU!`QhP$fxqmZpZdzzmkr}T^C9^g#?3i= zf+5Q=Jfm!Qre}G!=Xe<}>*c(>H{cb#L2t+#UKlQ$-iWuWZk28McFGy~&X#lXoi7i_ zccDBe-$UhLe2>;gR(6#~O+(6dm&fFLPkE2OXK8PFpFgm)AD;)#8@N7r-Y6gN5BdY% z?mL$HMgIWG4$ZLaK>4tgkD>gx{KF`J2<5sgkFp=380Dh0 z*@yT41@9jzKiW7bCHqnGzftlSO7h+V-h=NMkaq;%PrPP$ z4|~P;46k^{Dvx`Qc#op=nD>}>6yFoxF84|AaqkJ-Kjn>k$MAjJoA3tkeZqUv8^ZS_ z>OAc|55pd$wWB`YWqV z<*JS1e68*WlZC?UVl61HG`+RDUtCqqTQ$!QiVJ?jSGDT#V!gS3qUbif;$m%K@kHIf z<=2a~M(C?~w~Bi6O;xBW-wkVxg<{y-w>0x=%CCk^Rl``t;#9p}Y|as_g%#<6oxNWn+>lP)|!o=;NPzLt9ad1#qpJ8 z&SV_pCAUR%8m!GNVJgM2xxFzbS_sg6-77YlVKU~+#ahUQ>Gat7oLgO9ca?{+S5~p? zxmvvzZWNo1`i8*LFM9sGyH*d2c)M6^xGR8?tNfz!!!^~wN?c4ORG8f5`Qk=%4f9%E zt#4rMA!`POT4QxBJYIAGD&3}d%dM~B-Fgj0fJY5bVP$l2@%EWQp@_e;XU_`wxv7&Y z%K-s!Y(icgd+vB~{ONFIm7j2R?WIPoae7?8+t$pJX2IJ0eC_tDbK`NPxwQ4_T5ZurO`23ZC@aBGF7nMwQ_Ki0yZ%kb;7Ecsc+}pL4wUuIH zZDr1vZPoA!7u_&jZV21~YWRS@FAL&&l9mvLR0a!sJZn`fU?h@pz ztGkg2&DT^Aa#}#A-hSQ2Mo|ITY7M_QubL~}NO_z{k?aKUF95kH+12fRG_h(`1P*&O zK*I+mRe>+f1_2U)BK+<2GFgbmO28LyHld?S*v)9T_i^vl)n>E4z0z1(=|W6!8&NLC z1K!BaMp;c6Q7+ztXn4U73Ak0|W6Pr)?*YW95SR0Qq^HhYG}w7J_hX8k(u5ghuV9_c zm8dXNDa~A(dHwa7Yf*lta{h8@>dM=-(Q(5l+d#i4Qx8Hnj2vF8CR^hVlFD%KnZ_qL zj7w;2nQdH`th?5xi6^^l-Zdd{4Dd0tG~q;cr5Qv{bJcHfm@5}%O0T~iWvcaN;7?eQ zHQ&I;`v-){S~??gm#b z#Iw2)Wh$KBo16`&WtbzT;lmTATu?>R;J;^H zHLe?;byZK_E?t_Pu%y2zH*@u(QcX2sst3`F%vN6x;W5fp{M)r43}*2Vh{!iBa|pA^ zTIvYOs`$ts___e_HGBtO#l&D(#iZCo(kIlpPOEzexes|RluFiR^mAuLa~&Co*G zsnGVUJLbD)h!!^sC}qtrrlkP?&B8UKZAuR}Lad^V^-S2U^RG9X%SF&Bi96g_B^e3R za@7L(7$k;A^2EDEA7oiuS*??fW0uASlcm-(({5utEUwgUC;SiX8qLND%?-ingo~2b zHXD8;3?{Mng<4Q+V22u2KgvkO$Od^w1GDHH zy6U|{Aac76%P|XP9x&%MZ)GiB@i84!J&yNP!kvG_k`#eGJP;e&X4|@BZvu4%b_d(` z9b*${El+3Kwm|x1Xl)veLTGO}p>@~X#Qw