@rowstile/cli-win32-x64 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +5 -0
- package/package.json +23 -0
- package/python/DLLs/_asyncio.pyd +0 -0
- package/python/DLLs/_bz2.pyd +0 -0
- package/python/DLLs/_ctypes.pyd +0 -0
- package/python/DLLs/_ctypes_test.pyd +0 -0
- package/python/DLLs/_decimal.pyd +0 -0
- package/python/DLLs/_elementtree.pyd +0 -0
- package/python/DLLs/_hashlib.pyd +0 -0
- package/python/DLLs/_lzma.pyd +0 -0
- package/python/DLLs/_multiprocessing.pyd +0 -0
- package/python/DLLs/_overlapped.pyd +0 -0
- package/python/DLLs/_queue.pyd +0 -0
- package/python/DLLs/_socket.pyd +0 -0
- package/python/DLLs/_sqlite3.pyd +0 -0
- package/python/DLLs/_ssl.pyd +0 -0
- package/python/DLLs/_testbuffer.pyd +0 -0
- package/python/DLLs/_testcapi.pyd +0 -0
- package/python/DLLs/_testclinic.pyd +0 -0
- package/python/DLLs/_testclinic_limited.pyd +0 -0
- package/python/DLLs/_testconsole.pyd +0 -0
- package/python/DLLs/_testimportmultiple.pyd +0 -0
- package/python/DLLs/_testinternalcapi.pyd +0 -0
- package/python/DLLs/_testlimitedcapi.pyd +0 -0
- package/python/DLLs/_testmultiphase.pyd +0 -0
- package/python/DLLs/_testsinglephase.pyd +0 -0
- package/python/DLLs/_uuid.pyd +0 -0
- package/python/DLLs/_wmi.pyd +0 -0
- package/python/DLLs/_zoneinfo.pyd +0 -0
- package/python/DLLs/libcrypto-3-x64.dll +0 -0
- package/python/DLLs/libffi-8.dll +0 -0
- package/python/DLLs/libssl-3-x64.dll +0 -0
- package/python/DLLs/pyexpat.pyd +0 -0
- package/python/DLLs/select.pyd +0 -0
- package/python/DLLs/sqlite3.dll +0 -0
- package/python/DLLs/unicodedata.pyd +0 -0
- package/python/DLLs/winsound.pyd +0 -0
- package/python/DLLs/zlib1.dll +0 -0
- package/python/LICENSE.txt +445 -0
- package/python/Lib/__future__.py +147 -0
- package/python/Lib/__hello__.py +16 -0
- package/python/Lib/__pycache__/__future__.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_colorize.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_compat_pickle.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_compression.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_markupbase.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_opcode_metadata.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_weakrefset.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/ast.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/base64.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/bisect.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/bz2.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/calendar.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/colorsys.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/compileall.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/configparser.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/contextlib.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/copy.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/copyreg.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/csv.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/dataclasses.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/datetime.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/decimal.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/dis.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/enum.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/filecmp.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/fnmatch.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/fractions.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/functools.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/getpass.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/gettext.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/glob.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/gzip.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/hashlib.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/heapq.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/hmac.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/inspect.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/ipaddress.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/keyword.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/linecache.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/locale.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/lzma.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/mimetypes.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/nturl2path.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/numbers.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/opcode.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/operator.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/optparse.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/pickle.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/pkgutil.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/platform.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/py_compile.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/queue.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/quopri.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/random.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/reprlib.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/selectors.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/shlex.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/shutil.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/signal.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/socket.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/socketserver.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/ssl.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/string.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/stringprep.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/struct.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/subprocess.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/tarfile.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/tempfile.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/textwrap.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/threading.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/token.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/tokenize.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/traceback.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/types.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/typing.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/uuid.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/warnings.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/weakref.cpython-313.pyc +0 -0
- package/python/Lib/_aix_support.py +108 -0
- package/python/Lib/_android_support.py +192 -0
- package/python/Lib/_apple_support.py +66 -0
- package/python/Lib/_collections_abc.py +1187 -0
- package/python/Lib/_colorize.py +119 -0
- package/python/Lib/_compat_pickle.py +251 -0
- package/python/Lib/_compression.py +162 -0
- package/python/Lib/_ios_support.py +71 -0
- package/python/Lib/_markupbase.py +396 -0
- package/python/Lib/_opcode_metadata.py +343 -0
- package/python/Lib/_osx_support.py +579 -0
- package/python/Lib/_py_abc.py +147 -0
- package/python/Lib/_pydatetime.py +2640 -0
- package/python/Lib/_pydecimal.py +6356 -0
- package/python/Lib/_pyio.py +2714 -0
- package/python/Lib/_pylong.py +363 -0
- package/python/Lib/_pyrepl/__init__.py +19 -0
- package/python/Lib/_pyrepl/__main__.py +10 -0
- package/python/Lib/_pyrepl/_minimal_curses.py +68 -0
- package/python/Lib/_pyrepl/_threading_handler.py +74 -0
- package/python/Lib/_pyrepl/base_eventqueue.py +110 -0
- package/python/Lib/_pyrepl/commands.py +492 -0
- package/python/Lib/_pyrepl/completing_reader.py +295 -0
- package/python/Lib/_pyrepl/console.py +229 -0
- package/python/Lib/_pyrepl/curses.py +33 -0
- package/python/Lib/_pyrepl/fancy_termios.py +82 -0
- package/python/Lib/_pyrepl/historical_reader.py +419 -0
- package/python/Lib/_pyrepl/input.py +114 -0
- package/python/Lib/_pyrepl/keymap.py +213 -0
- package/python/Lib/_pyrepl/main.py +59 -0
- package/python/Lib/_pyrepl/mypy.ini +29 -0
- package/python/Lib/_pyrepl/pager.py +175 -0
- package/python/Lib/_pyrepl/reader.py +764 -0
- package/python/Lib/_pyrepl/readline.py +599 -0
- package/python/Lib/_pyrepl/simple_interact.py +180 -0
- package/python/Lib/_pyrepl/trace.py +21 -0
- package/python/Lib/_pyrepl/types.py +10 -0
- package/python/Lib/_pyrepl/unix_console.py +852 -0
- package/python/Lib/_pyrepl/unix_eventqueue.py +76 -0
- package/python/Lib/_pyrepl/utils.py +83 -0
- package/python/Lib/_pyrepl/windows_console.py +687 -0
- package/python/Lib/_pyrepl/windows_eventqueue.py +42 -0
- package/python/Lib/_sitebuiltins.py +91 -0
- package/python/Lib/_strptime.py +800 -0
- package/python/Lib/_threading_local.py +120 -0
- package/python/Lib/_weakrefset.py +205 -0
- package/python/Lib/abc.py +188 -0
- package/python/Lib/antigravity.py +17 -0
- package/python/Lib/argparse.py +2690 -0
- package/python/Lib/ast.py +1865 -0
- package/python/Lib/asyncio/__init__.py +47 -0
- package/python/Lib/asyncio/__main__.py +211 -0
- package/python/Lib/asyncio/base_events.py +2086 -0
- package/python/Lib/asyncio/base_futures.py +67 -0
- package/python/Lib/asyncio/base_subprocess.py +312 -0
- package/python/Lib/asyncio/base_tasks.py +94 -0
- package/python/Lib/asyncio/constants.py +41 -0
- package/python/Lib/asyncio/coroutines.py +109 -0
- package/python/Lib/asyncio/events.py +885 -0
- package/python/Lib/asyncio/exceptions.py +62 -0
- package/python/Lib/asyncio/format_helpers.py +84 -0
- package/python/Lib/asyncio/futures.py +425 -0
- package/python/Lib/asyncio/locks.py +617 -0
- package/python/Lib/asyncio/log.py +7 -0
- package/python/Lib/asyncio/mixins.py +21 -0
- package/python/Lib/asyncio/proactor_events.py +891 -0
- package/python/Lib/asyncio/protocols.py +216 -0
- package/python/Lib/asyncio/queues.py +309 -0
- package/python/Lib/asyncio/runners.py +217 -0
- package/python/Lib/asyncio/selector_events.py +1328 -0
- package/python/Lib/asyncio/sslproto.py +929 -0
- package/python/Lib/asyncio/staggered.py +174 -0
- package/python/Lib/asyncio/streams.py +787 -0
- package/python/Lib/asyncio/subprocess.py +229 -0
- package/python/Lib/asyncio/taskgroups.py +278 -0
- package/python/Lib/asyncio/tasks.py +1121 -0
- package/python/Lib/asyncio/threads.py +26 -0
- package/python/Lib/asyncio/timeouts.py +185 -0
- package/python/Lib/asyncio/transports.py +337 -0
- package/python/Lib/asyncio/trsock.py +98 -0
- package/python/Lib/asyncio/unix_events.py +1550 -0
- package/python/Lib/asyncio/windows_events.py +906 -0
- package/python/Lib/asyncio/windows_utils.py +181 -0
- package/python/Lib/base64.py +628 -0
- package/python/Lib/bdb.py +973 -0
- package/python/Lib/bisect.py +118 -0
- package/python/Lib/bz2.py +352 -0
- package/python/Lib/cProfile.py +197 -0
- package/python/Lib/calendar.py +813 -0
- package/python/Lib/cmd.py +409 -0
- package/python/Lib/code.py +386 -0
- package/python/Lib/codecs.py +1132 -0
- package/python/Lib/codeop.py +155 -0
- package/python/Lib/collections/__init__.py +1603 -0
- package/python/Lib/collections/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/colorsys.py +166 -0
- package/python/Lib/compileall.py +470 -0
- package/python/Lib/concurrent/__init__.py +1 -0
- package/python/Lib/concurrent/futures/__init__.py +54 -0
- package/python/Lib/concurrent/futures/_base.py +660 -0
- package/python/Lib/concurrent/futures/process.py +892 -0
- package/python/Lib/concurrent/futures/thread.py +240 -0
- package/python/Lib/configparser.py +1396 -0
- package/python/Lib/contextlib.py +814 -0
- package/python/Lib/contextvars.py +4 -0
- package/python/Lib/copy.py +306 -0
- package/python/Lib/copyreg.py +217 -0
- package/python/Lib/csv.py +527 -0
- package/python/Lib/ctypes/__init__.py +602 -0
- package/python/Lib/ctypes/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/ctypes/__pycache__/_endian.cpython-313.pyc +0 -0
- package/python/Lib/ctypes/__pycache__/wintypes.cpython-313.pyc +0 -0
- package/python/Lib/ctypes/_aix.py +327 -0
- package/python/Lib/ctypes/_endian.py +78 -0
- package/python/Lib/ctypes/macholib/README.ctypes +7 -0
- package/python/Lib/ctypes/macholib/__init__.py +9 -0
- package/python/Lib/ctypes/macholib/dyld.py +165 -0
- package/python/Lib/ctypes/macholib/dylib.py +42 -0
- package/python/Lib/ctypes/macholib/fetch_macholib +2 -0
- package/python/Lib/ctypes/macholib/fetch_macholib.bat +1 -0
- package/python/Lib/ctypes/macholib/framework.py +42 -0
- package/python/Lib/ctypes/util.py +387 -0
- package/python/Lib/ctypes/wintypes.py +202 -0
- package/python/Lib/curses/__init__.py +101 -0
- package/python/Lib/curses/ascii.py +99 -0
- package/python/Lib/curses/has_key.py +192 -0
- package/python/Lib/curses/panel.py +6 -0
- package/python/Lib/curses/textpad.py +236 -0
- package/python/Lib/dataclasses.py +1679 -0
- package/python/Lib/datetime.py +9 -0
- package/python/Lib/dbm/__init__.py +194 -0
- package/python/Lib/dbm/dumb.py +319 -0
- package/python/Lib/dbm/gnu.py +3 -0
- package/python/Lib/dbm/ndbm.py +3 -0
- package/python/Lib/dbm/sqlite3.py +144 -0
- package/python/Lib/decimal.py +109 -0
- package/python/Lib/difflib.py +2058 -0
- package/python/Lib/dis.py +1075 -0
- package/python/Lib/doctest.py +2919 -0
- package/python/Lib/email/__init__.py +61 -0
- package/python/Lib/email/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/_encoded_words.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/_parseaddr.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/_policybase.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/base64mime.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/charset.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/encoders.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/errors.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/feedparser.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/header.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/iterators.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/message.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/parser.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/quoprimime.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/utils.cpython-313.pyc +0 -0
- package/python/Lib/email/_encoded_words.py +233 -0
- package/python/Lib/email/_header_value_parser.py +3153 -0
- package/python/Lib/email/_parseaddr.py +563 -0
- package/python/Lib/email/_policybase.py +382 -0
- package/python/Lib/email/architecture.rst +216 -0
- package/python/Lib/email/base64mime.py +115 -0
- package/python/Lib/email/charset.py +396 -0
- package/python/Lib/email/contentmanager.py +254 -0
- package/python/Lib/email/encoders.py +65 -0
- package/python/Lib/email/errors.py +117 -0
- package/python/Lib/email/feedparser.py +536 -0
- package/python/Lib/email/generator.py +530 -0
- package/python/Lib/email/header.py +582 -0
- package/python/Lib/email/headerregistry.py +618 -0
- package/python/Lib/email/iterators.py +68 -0
- package/python/Lib/email/message.py +1217 -0
- package/python/Lib/email/mime/__init__.py +0 -0
- package/python/Lib/email/mime/application.py +37 -0
- package/python/Lib/email/mime/audio.py +97 -0
- package/python/Lib/email/mime/base.py +29 -0
- package/python/Lib/email/mime/image.py +152 -0
- package/python/Lib/email/mime/message.py +33 -0
- package/python/Lib/email/mime/multipart.py +47 -0
- package/python/Lib/email/mime/nonmultipart.py +21 -0
- package/python/Lib/email/mime/text.py +40 -0
- package/python/Lib/email/parser.py +127 -0
- package/python/Lib/email/policy.py +232 -0
- package/python/Lib/email/quoprimime.py +300 -0
- package/python/Lib/email/utils.py +497 -0
- package/python/Lib/encodings/__init__.py +179 -0
- package/python/Lib/encodings/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/aliases.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/cp1252.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/cp437.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/hex_codec.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/idna.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/utf_8.cpython-313.pyc +0 -0
- package/python/Lib/encodings/aliases.py +560 -0
- package/python/Lib/encodings/ascii.py +50 -0
- package/python/Lib/encodings/base64_codec.py +55 -0
- package/python/Lib/encodings/big5.py +39 -0
- package/python/Lib/encodings/big5hkscs.py +39 -0
- package/python/Lib/encodings/bz2_codec.py +78 -0
- package/python/Lib/encodings/charmap.py +69 -0
- package/python/Lib/encodings/cp037.py +307 -0
- package/python/Lib/encodings/cp1006.py +307 -0
- package/python/Lib/encodings/cp1026.py +307 -0
- package/python/Lib/encodings/cp1125.py +698 -0
- package/python/Lib/encodings/cp1140.py +307 -0
- package/python/Lib/encodings/cp1250.py +307 -0
- package/python/Lib/encodings/cp1251.py +307 -0
- package/python/Lib/encodings/cp1252.py +307 -0
- package/python/Lib/encodings/cp1253.py +307 -0
- package/python/Lib/encodings/cp1254.py +307 -0
- package/python/Lib/encodings/cp1255.py +307 -0
- package/python/Lib/encodings/cp1256.py +307 -0
- package/python/Lib/encodings/cp1257.py +307 -0
- package/python/Lib/encodings/cp1258.py +307 -0
- package/python/Lib/encodings/cp273.py +307 -0
- package/python/Lib/encodings/cp424.py +307 -0
- package/python/Lib/encodings/cp437.py +698 -0
- package/python/Lib/encodings/cp500.py +307 -0
- package/python/Lib/encodings/cp720.py +309 -0
- package/python/Lib/encodings/cp737.py +698 -0
- package/python/Lib/encodings/cp775.py +697 -0
- package/python/Lib/encodings/cp850.py +698 -0
- package/python/Lib/encodings/cp852.py +698 -0
- package/python/Lib/encodings/cp855.py +698 -0
- package/python/Lib/encodings/cp856.py +307 -0
- package/python/Lib/encodings/cp857.py +694 -0
- package/python/Lib/encodings/cp858.py +698 -0
- package/python/Lib/encodings/cp860.py +698 -0
- package/python/Lib/encodings/cp861.py +698 -0
- package/python/Lib/encodings/cp862.py +698 -0
- package/python/Lib/encodings/cp863.py +698 -0
- package/python/Lib/encodings/cp864.py +690 -0
- package/python/Lib/encodings/cp865.py +698 -0
- package/python/Lib/encodings/cp866.py +698 -0
- package/python/Lib/encodings/cp869.py +689 -0
- package/python/Lib/encodings/cp874.py +307 -0
- package/python/Lib/encodings/cp875.py +307 -0
- package/python/Lib/encodings/cp932.py +39 -0
- package/python/Lib/encodings/cp949.py +39 -0
- package/python/Lib/encodings/cp950.py +39 -0
- package/python/Lib/encodings/euc_jis_2004.py +39 -0
- package/python/Lib/encodings/euc_jisx0213.py +39 -0
- package/python/Lib/encodings/euc_jp.py +39 -0
- package/python/Lib/encodings/euc_kr.py +39 -0
- package/python/Lib/encodings/gb18030.py +39 -0
- package/python/Lib/encodings/gb2312.py +39 -0
- package/python/Lib/encodings/gbk.py +39 -0
- package/python/Lib/encodings/hex_codec.py +55 -0
- package/python/Lib/encodings/hp_roman8.py +314 -0
- package/python/Lib/encodings/hz.py +39 -0
- package/python/Lib/encodings/idna.py +387 -0
- package/python/Lib/encodings/iso2022_jp.py +39 -0
- package/python/Lib/encodings/iso2022_jp_1.py +39 -0
- package/python/Lib/encodings/iso2022_jp_2.py +39 -0
- package/python/Lib/encodings/iso2022_jp_2004.py +39 -0
- package/python/Lib/encodings/iso2022_jp_3.py +39 -0
- package/python/Lib/encodings/iso2022_jp_ext.py +39 -0
- package/python/Lib/encodings/iso2022_kr.py +39 -0
- package/python/Lib/encodings/iso8859_1.py +307 -0
- package/python/Lib/encodings/iso8859_10.py +307 -0
- package/python/Lib/encodings/iso8859_11.py +307 -0
- package/python/Lib/encodings/iso8859_13.py +307 -0
- package/python/Lib/encodings/iso8859_14.py +307 -0
- package/python/Lib/encodings/iso8859_15.py +307 -0
- package/python/Lib/encodings/iso8859_16.py +307 -0
- package/python/Lib/encodings/iso8859_2.py +307 -0
- package/python/Lib/encodings/iso8859_3.py +307 -0
- package/python/Lib/encodings/iso8859_4.py +307 -0
- package/python/Lib/encodings/iso8859_5.py +307 -0
- package/python/Lib/encodings/iso8859_6.py +307 -0
- package/python/Lib/encodings/iso8859_7.py +307 -0
- package/python/Lib/encodings/iso8859_8.py +307 -0
- package/python/Lib/encodings/iso8859_9.py +307 -0
- package/python/Lib/encodings/johab.py +39 -0
- package/python/Lib/encodings/koi8_r.py +307 -0
- package/python/Lib/encodings/koi8_t.py +308 -0
- package/python/Lib/encodings/koi8_u.py +307 -0
- package/python/Lib/encodings/kz1048.py +307 -0
- package/python/Lib/encodings/latin_1.py +50 -0
- package/python/Lib/encodings/mac_arabic.py +698 -0
- package/python/Lib/encodings/mac_croatian.py +307 -0
- package/python/Lib/encodings/mac_cyrillic.py +307 -0
- package/python/Lib/encodings/mac_farsi.py +307 -0
- package/python/Lib/encodings/mac_greek.py +307 -0
- package/python/Lib/encodings/mac_iceland.py +307 -0
- package/python/Lib/encodings/mac_latin2.py +312 -0
- package/python/Lib/encodings/mac_roman.py +307 -0
- package/python/Lib/encodings/mac_romanian.py +307 -0
- package/python/Lib/encodings/mac_turkish.py +307 -0
- package/python/Lib/encodings/mbcs.py +47 -0
- package/python/Lib/encodings/oem.py +41 -0
- package/python/Lib/encodings/palmos.py +308 -0
- package/python/Lib/encodings/ptcp154.py +312 -0
- package/python/Lib/encodings/punycode.py +253 -0
- package/python/Lib/encodings/quopri_codec.py +56 -0
- package/python/Lib/encodings/raw_unicode_escape.py +46 -0
- package/python/Lib/encodings/rot_13.py +113 -0
- package/python/Lib/encodings/shift_jis.py +39 -0
- package/python/Lib/encodings/shift_jis_2004.py +39 -0
- package/python/Lib/encodings/shift_jisx0213.py +39 -0
- package/python/Lib/encodings/tis_620.py +307 -0
- package/python/Lib/encodings/undefined.py +49 -0
- package/python/Lib/encodings/unicode_escape.py +46 -0
- package/python/Lib/encodings/utf_16.py +155 -0
- package/python/Lib/encodings/utf_16_be.py +42 -0
- package/python/Lib/encodings/utf_16_le.py +42 -0
- package/python/Lib/encodings/utf_32.py +150 -0
- package/python/Lib/encodings/utf_32_be.py +37 -0
- package/python/Lib/encodings/utf_32_le.py +37 -0
- package/python/Lib/encodings/utf_7.py +38 -0
- package/python/Lib/encodings/utf_8.py +42 -0
- package/python/Lib/encodings/utf_8_sig.py +130 -0
- package/python/Lib/encodings/uu_codec.py +103 -0
- package/python/Lib/encodings/zlib_codec.py +77 -0
- package/python/Lib/enum.py +2183 -0
- package/python/Lib/filecmp.py +320 -0
- package/python/Lib/fileinput.py +442 -0
- package/python/Lib/fnmatch.py +192 -0
- package/python/Lib/fractions.py +1043 -0
- package/python/Lib/ftplib.py +975 -0
- package/python/Lib/functools.py +1036 -0
- package/python/Lib/genericpath.py +200 -0
- package/python/Lib/getopt.py +215 -0
- package/python/Lib/getpass.py +192 -0
- package/python/Lib/gettext.py +657 -0
- package/python/Lib/glob.py +572 -0
- package/python/Lib/graphlib.py +250 -0
- package/python/Lib/gzip.py +693 -0
- package/python/Lib/hashlib.py +255 -0
- package/python/Lib/heapq.py +603 -0
- package/python/Lib/hmac.py +220 -0
- package/python/Lib/html/__init__.py +132 -0
- package/python/Lib/html/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/html/__pycache__/entities.cpython-313.pyc +0 -0
- package/python/Lib/html/__pycache__/parser.cpython-313.pyc +0 -0
- package/python/Lib/html/entities.py +2513 -0
- package/python/Lib/html/parser.py +583 -0
- package/python/Lib/http/__init__.py +202 -0
- package/python/Lib/http/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/http/__pycache__/client.cpython-313.pyc +0 -0
- package/python/Lib/http/__pycache__/cookiejar.cpython-313.pyc +0 -0
- package/python/Lib/http/__pycache__/cookies.cpython-313.pyc +0 -0
- package/python/Lib/http/client.py +1598 -0
- package/python/Lib/http/cookiejar.py +2122 -0
- package/python/Lib/http/cookies.py +635 -0
- package/python/Lib/http/server.py +1355 -0
- package/python/Lib/imaplib.py +1769 -0
- package/python/Lib/importlib/__init__.py +136 -0
- package/python/Lib/importlib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/importlib/__pycache__/_abc.cpython-313.pyc +0 -0
- package/python/Lib/importlib/__pycache__/abc.cpython-313.pyc +0 -0
- package/python/Lib/importlib/__pycache__/readers.cpython-313.pyc +0 -0
- package/python/Lib/importlib/_abc.py +39 -0
- package/python/Lib/importlib/_bootstrap.py +1559 -0
- package/python/Lib/importlib/_bootstrap_external.py +1826 -0
- package/python/Lib/importlib/abc.py +243 -0
- package/python/Lib/importlib/machinery.py +21 -0
- package/python/Lib/importlib/metadata/__init__.py +1093 -0
- package/python/Lib/importlib/metadata/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_adapters.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_collections.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_functools.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_itertools.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_meta.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_text.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/_adapters.py +89 -0
- package/python/Lib/importlib/metadata/_collections.py +30 -0
- package/python/Lib/importlib/metadata/_functools.py +104 -0
- package/python/Lib/importlib/metadata/_itertools.py +73 -0
- package/python/Lib/importlib/metadata/_meta.py +67 -0
- package/python/Lib/importlib/metadata/_text.py +99 -0
- package/python/Lib/importlib/metadata/diagnose.py +21 -0
- package/python/Lib/importlib/readers.py +12 -0
- package/python/Lib/importlib/resources/__init__.py +43 -0
- package/python/Lib/importlib/resources/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_adapters.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_common.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_functional.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_itertools.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/abc.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/readers.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/_adapters.py +168 -0
- package/python/Lib/importlib/resources/_common.py +211 -0
- package/python/Lib/importlib/resources/_functional.py +81 -0
- package/python/Lib/importlib/resources/_itertools.py +38 -0
- package/python/Lib/importlib/resources/abc.py +173 -0
- package/python/Lib/importlib/resources/readers.py +203 -0
- package/python/Lib/importlib/resources/simple.py +106 -0
- package/python/Lib/importlib/simple.py +14 -0
- package/python/Lib/importlib/util.py +274 -0
- package/python/Lib/inspect.py +3479 -0
- package/python/Lib/io.py +99 -0
- package/python/Lib/ipaddress.py +2440 -0
- package/python/Lib/json/__init__.py +365 -0
- package/python/Lib/json/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/json/__pycache__/decoder.cpython-313.pyc +0 -0
- package/python/Lib/json/__pycache__/encoder.cpython-313.pyc +0 -0
- package/python/Lib/json/__pycache__/scanner.cpython-313.pyc +0 -0
- package/python/Lib/json/decoder.py +364 -0
- package/python/Lib/json/encoder.py +446 -0
- package/python/Lib/json/scanner.py +73 -0
- package/python/Lib/json/tool.py +90 -0
- package/python/Lib/keyword.py +64 -0
- package/python/Lib/linecache.py +236 -0
- package/python/Lib/locale.py +1987 -0
- package/python/Lib/logging/__init__.py +2330 -0
- package/python/Lib/logging/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/logging/__pycache__/config.cpython-313.pyc +0 -0
- package/python/Lib/logging/__pycache__/handlers.cpython-313.pyc +0 -0
- package/python/Lib/logging/config.py +1080 -0
- package/python/Lib/logging/handlers.py +1629 -0
- package/python/Lib/lzma.py +364 -0
- package/python/Lib/mailbox.py +2219 -0
- package/python/Lib/mimetypes.py +679 -0
- package/python/Lib/modulefinder.py +671 -0
- package/python/Lib/multiprocessing/__init__.py +37 -0
- package/python/Lib/multiprocessing/connection.py +1216 -0
- package/python/Lib/multiprocessing/context.py +383 -0
- package/python/Lib/multiprocessing/dummy/__init__.py +126 -0
- package/python/Lib/multiprocessing/dummy/connection.py +75 -0
- package/python/Lib/multiprocessing/forkserver.py +373 -0
- package/python/Lib/multiprocessing/heap.py +337 -0
- package/python/Lib/multiprocessing/managers.py +1397 -0
- package/python/Lib/multiprocessing/pool.py +957 -0
- package/python/Lib/multiprocessing/popen_fork.py +97 -0
- package/python/Lib/multiprocessing/popen_forkserver.py +74 -0
- package/python/Lib/multiprocessing/popen_spawn_posix.py +76 -0
- package/python/Lib/multiprocessing/popen_spawn_win32.py +147 -0
- package/python/Lib/multiprocessing/process.py +436 -0
- package/python/Lib/multiprocessing/queues.py +399 -0
- package/python/Lib/multiprocessing/reduction.py +281 -0
- package/python/Lib/multiprocessing/resource_sharer.py +154 -0
- package/python/Lib/multiprocessing/resource_tracker.py +499 -0
- package/python/Lib/multiprocessing/shared_memory.py +544 -0
- package/python/Lib/multiprocessing/sharedctypes.py +240 -0
- package/python/Lib/multiprocessing/spawn.py +307 -0
- package/python/Lib/multiprocessing/synchronize.py +404 -0
- package/python/Lib/multiprocessing/util.py +562 -0
- package/python/Lib/netrc.py +199 -0
- package/python/Lib/ntpath.py +872 -0
- package/python/Lib/nturl2path.py +69 -0
- package/python/Lib/numbers.py +427 -0
- package/python/Lib/opcode.py +115 -0
- package/python/Lib/operator.py +467 -0
- package/python/Lib/optparse.py +1681 -0
- package/python/Lib/os.py +1184 -0
- package/python/Lib/pathlib/__init__.py +12 -0
- package/python/Lib/pathlib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/pathlib/__pycache__/_abc.cpython-313.pyc +0 -0
- package/python/Lib/pathlib/__pycache__/_local.cpython-313.pyc +0 -0
- package/python/Lib/pathlib/_abc.py +930 -0
- package/python/Lib/pathlib/_local.py +861 -0
- package/python/Lib/pdb.py +2550 -0
- package/python/Lib/pickle.py +1860 -0
- package/python/Lib/pickletools.py +2904 -0
- package/python/Lib/pkgutil.py +529 -0
- package/python/Lib/platform.py +1454 -0
- package/python/Lib/plistlib.py +948 -0
- package/python/Lib/poplib.py +477 -0
- package/python/Lib/posixpath.py +578 -0
- package/python/Lib/pprint.py +658 -0
- package/python/Lib/profile.py +616 -0
- package/python/Lib/pstats.py +778 -0
- package/python/Lib/pty.py +211 -0
- package/python/Lib/py_compile.py +212 -0
- package/python/Lib/pyclbr.py +314 -0
- package/python/Lib/pydoc.py +2861 -0
- package/python/Lib/queue.py +383 -0
- package/python/Lib/quopri.py +237 -0
- package/python/Lib/random.py +1078 -0
- package/python/Lib/re/__init__.py +428 -0
- package/python/Lib/re/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_casefix.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_compiler.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_constants.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_parser.cpython-313.pyc +0 -0
- package/python/Lib/re/_casefix.py +106 -0
- package/python/Lib/re/_compiler.py +768 -0
- package/python/Lib/re/_constants.py +222 -0
- package/python/Lib/re/_parser.py +1081 -0
- package/python/Lib/reprlib.py +230 -0
- package/python/Lib/rlcompleter.py +222 -0
- package/python/Lib/runpy.py +326 -0
- package/python/Lib/sched.py +167 -0
- package/python/Lib/secrets.py +71 -0
- package/python/Lib/selectors.py +603 -0
- package/python/Lib/shelve.py +250 -0
- package/python/Lib/shlex.py +345 -0
- package/python/Lib/shutil.py +1569 -0
- package/python/Lib/signal.py +94 -0
- package/python/Lib/site.py +773 -0
- package/python/Lib/smtplib.py +1123 -0
- package/python/Lib/socket.py +988 -0
- package/python/Lib/socketserver.py +863 -0
- package/python/Lib/sqlite3/__init__.py +70 -0
- package/python/Lib/sqlite3/__main__.py +139 -0
- package/python/Lib/sqlite3/dbapi2.py +108 -0
- package/python/Lib/sqlite3/dump.py +118 -0
- package/python/Lib/sre_compile.py +7 -0
- package/python/Lib/sre_constants.py +7 -0
- package/python/Lib/sre_parse.py +7 -0
- package/python/Lib/ssl.py +1529 -0
- package/python/Lib/stat.py +212 -0
- package/python/Lib/statistics.py +1817 -0
- package/python/Lib/string.py +314 -0
- package/python/Lib/stringprep.py +272 -0
- package/python/Lib/struct.py +15 -0
- package/python/Lib/subprocess.py +2258 -0
- package/python/Lib/symtable.py +414 -0
- package/python/Lib/sysconfig/__init__.py +734 -0
- package/python/Lib/sysconfig/__main__.py +248 -0
- package/python/Lib/sysconfig/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/tabnanny.py +340 -0
- package/python/Lib/tarfile.py +3136 -0
- package/python/Lib/tempfile.py +958 -0
- package/python/Lib/textwrap.py +497 -0
- package/python/Lib/this.py +28 -0
- package/python/Lib/threading.py +1602 -0
- package/python/Lib/timeit.py +381 -0
- package/python/Lib/token.py +141 -0
- package/python/Lib/tokenize.py +592 -0
- package/python/Lib/tomllib/__init__.py +10 -0
- package/python/Lib/tomllib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/__pycache__/_parser.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/__pycache__/_re.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/__pycache__/_types.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/_parser.py +703 -0
- package/python/Lib/tomllib/_re.py +107 -0
- package/python/Lib/tomllib/_types.py +10 -0
- package/python/Lib/tomllib/mypy.ini +15 -0
- package/python/Lib/trace.py +754 -0
- package/python/Lib/traceback.py +1639 -0
- package/python/Lib/tracemalloc.py +560 -0
- package/python/Lib/tty.py +73 -0
- package/python/Lib/types.py +346 -0
- package/python/Lib/typing.py +3846 -0
- package/python/Lib/unittest/__init__.py +80 -0
- package/python/Lib/unittest/__main__.py +18 -0
- package/python/Lib/unittest/_log.py +86 -0
- package/python/Lib/unittest/async_case.py +146 -0
- package/python/Lib/unittest/case.py +1478 -0
- package/python/Lib/unittest/loader.py +460 -0
- package/python/Lib/unittest/main.py +280 -0
- package/python/Lib/unittest/mock.py +3189 -0
- package/python/Lib/unittest/result.py +256 -0
- package/python/Lib/unittest/runner.py +292 -0
- package/python/Lib/unittest/signals.py +71 -0
- package/python/Lib/unittest/suite.py +379 -0
- package/python/Lib/unittest/util.py +170 -0
- package/python/Lib/urllib/__init__.py +0 -0
- package/python/Lib/urllib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/error.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/parse.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/request.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/response.cpython-313.pyc +0 -0
- package/python/Lib/urllib/error.py +74 -0
- package/python/Lib/urllib/parse.py +1264 -0
- package/python/Lib/urllib/request.py +2796 -0
- package/python/Lib/urllib/response.py +84 -0
- package/python/Lib/urllib/robotparser.py +363 -0
- package/python/Lib/uuid.py +784 -0
- package/python/Lib/warnings.py +735 -0
- package/python/Lib/wave.py +665 -0
- package/python/Lib/weakref.py +674 -0
- package/python/Lib/webbrowser.py +724 -0
- package/python/Lib/wsgiref/__init__.py +25 -0
- package/python/Lib/wsgiref/handlers.py +575 -0
- package/python/Lib/wsgiref/headers.py +192 -0
- package/python/Lib/wsgiref/simple_server.py +161 -0
- package/python/Lib/wsgiref/types.py +54 -0
- package/python/Lib/wsgiref/util.py +159 -0
- package/python/Lib/wsgiref/validate.py +438 -0
- package/python/Lib/xml/__init__.py +20 -0
- package/python/Lib/xml/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/xml/dom/NodeFilter.py +27 -0
- package/python/Lib/xml/dom/__init__.py +140 -0
- package/python/Lib/xml/dom/domreg.py +99 -0
- package/python/Lib/xml/dom/expatbuilder.py +962 -0
- package/python/Lib/xml/dom/minicompat.py +109 -0
- package/python/Lib/xml/dom/minidom.py +2024 -0
- package/python/Lib/xml/dom/pulldom.py +336 -0
- package/python/Lib/xml/dom/xmlbuilder.py +389 -0
- package/python/Lib/xml/etree/ElementInclude.py +186 -0
- package/python/Lib/xml/etree/ElementPath.py +430 -0
- package/python/Lib/xml/etree/ElementTree.py +2116 -0
- package/python/Lib/xml/etree/__init__.py +33 -0
- package/python/Lib/xml/etree/cElementTree.py +3 -0
- package/python/Lib/xml/parsers/__init__.py +8 -0
- package/python/Lib/xml/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/xml/parsers/__pycache__/expat.cpython-313.pyc +0 -0
- package/python/Lib/xml/parsers/expat.py +8 -0
- package/python/Lib/xml/sax/__init__.py +94 -0
- package/python/Lib/xml/sax/_exceptions.py +127 -0
- package/python/Lib/xml/sax/expatreader.py +454 -0
- package/python/Lib/xml/sax/handler.py +387 -0
- package/python/Lib/xml/sax/saxutils.py +369 -0
- package/python/Lib/xml/sax/xmlreader.py +378 -0
- package/python/Lib/xmlrpc/__init__.py +1 -0
- package/python/Lib/xmlrpc/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/xmlrpc/__pycache__/client.cpython-313.pyc +0 -0
- package/python/Lib/xmlrpc/client.py +1503 -0
- package/python/Lib/xmlrpc/server.py +1002 -0
- package/python/Lib/zipapp.py +229 -0
- package/python/Lib/zipfile/__init__.py +2391 -0
- package/python/Lib/zipfile/__main__.py +4 -0
- package/python/Lib/zipfile/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/zipfile/_path/__init__.py +452 -0
- package/python/Lib/zipfile/_path/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/zipfile/_path/__pycache__/glob.cpython-313.pyc +0 -0
- package/python/Lib/zipfile/_path/glob.py +113 -0
- package/python/Lib/zipimport.py +803 -0
- package/python/Lib/zoneinfo/__init__.py +34 -0
- package/python/Lib/zoneinfo/_common.py +172 -0
- package/python/Lib/zoneinfo/_tzpath.py +189 -0
- package/python/Lib/zoneinfo/_zoneinfo.py +779 -0
- package/python/licenses/LICENSE.bdb.txt +126 -0
- package/python/licenses/LICENSE.bzip2.txt +37 -0
- package/python/licenses/LICENSE.cpython.txt +771 -0
- package/python/licenses/LICENSE.expat.txt +21 -0
- package/python/licenses/LICENSE.libX11.txt +942 -0
- package/python/licenses/LICENSE.libXau.txt +21 -0
- package/python/licenses/LICENSE.libedit.txt +29 -0
- package/python/licenses/LICENSE.libffi.txt +21 -0
- package/python/licenses/LICENSE.liblzma.txt +13 -0
- package/python/licenses/LICENSE.libuuid.txt +27 -0
- package/python/licenses/LICENSE.libxcb.txt +30 -0
- package/python/licenses/LICENSE.mpdecimal.txt +24 -0
- package/python/licenses/LICENSE.ncurses.txt +29 -0
- package/python/licenses/LICENSE.openssl-1.1.txt +124 -0
- package/python/licenses/LICENSE.openssl-3.txt +177 -0
- package/python/licenses/LICENSE.sqlite.txt +23 -0
- package/python/licenses/LICENSE.tcl.txt +40 -0
- package/python/licenses/LICENSE.tix.txt +54 -0
- package/python/licenses/LICENSE.zlib.txt +21 -0
- package/python/python.exe +0 -0
- package/python/python3.dll +0 -0
- package/python/python313.dll +0 -0
- package/python/pythonw.exe +0 -0
- package/python/vcruntime140.dll +0 -0
- package/python/vcruntime140_1.dll +0 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"""This will be the home for the policy that hooks in the new
|
|
2
|
+
code that adds all the email6 features.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
import sys
|
|
7
|
+
from email._policybase import Policy, Compat32, compat32, _extend_docstrings
|
|
8
|
+
from email.utils import _has_surrogates
|
|
9
|
+
from email.headerregistry import HeaderRegistry as HeaderRegistry
|
|
10
|
+
from email.contentmanager import raw_data_manager
|
|
11
|
+
from email.message import EmailMessage
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
'Compat32',
|
|
15
|
+
'compat32',
|
|
16
|
+
'Policy',
|
|
17
|
+
'EmailPolicy',
|
|
18
|
+
'default',
|
|
19
|
+
'strict',
|
|
20
|
+
'SMTP',
|
|
21
|
+
'HTTP',
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
linesep_splitter = re.compile(r'\n|\r\n?')
|
|
25
|
+
|
|
26
|
+
@_extend_docstrings
|
|
27
|
+
class EmailPolicy(Policy):
|
|
28
|
+
|
|
29
|
+
"""+
|
|
30
|
+
PROVISIONAL
|
|
31
|
+
|
|
32
|
+
The API extensions enabled by this policy are currently provisional.
|
|
33
|
+
Refer to the documentation for details.
|
|
34
|
+
|
|
35
|
+
This policy adds new header parsing and folding algorithms. Instead of
|
|
36
|
+
simple strings, headers are custom objects with custom attributes
|
|
37
|
+
depending on the type of the field. The folding algorithm fully
|
|
38
|
+
implements RFCs 2047 and 5322.
|
|
39
|
+
|
|
40
|
+
In addition to the settable attributes listed above that apply to
|
|
41
|
+
all Policies, this policy adds the following additional attributes:
|
|
42
|
+
|
|
43
|
+
utf8 -- if False (the default) message headers will be
|
|
44
|
+
serialized as ASCII, using encoded words to encode
|
|
45
|
+
any non-ASCII characters in the source strings. If
|
|
46
|
+
True, the message headers will be serialized using
|
|
47
|
+
utf8 and will not contain encoded words (see RFC
|
|
48
|
+
6532 for more on this serialization format).
|
|
49
|
+
|
|
50
|
+
refold_source -- if the value for a header in the Message object
|
|
51
|
+
came from the parsing of some source, this attribute
|
|
52
|
+
indicates whether or not a generator should refold
|
|
53
|
+
that value when transforming the message back into
|
|
54
|
+
stream form. The possible values are:
|
|
55
|
+
|
|
56
|
+
none -- all source values use original folding
|
|
57
|
+
long -- source values that have any line that is
|
|
58
|
+
longer than max_line_length will be
|
|
59
|
+
refolded
|
|
60
|
+
all -- all values are refolded.
|
|
61
|
+
|
|
62
|
+
The default is 'long'.
|
|
63
|
+
|
|
64
|
+
header_factory -- a callable that takes two arguments, 'name' and
|
|
65
|
+
'value', where 'name' is a header field name and
|
|
66
|
+
'value' is an unfolded header field value, and
|
|
67
|
+
returns a string-like object that represents that
|
|
68
|
+
header. A default header_factory is provided that
|
|
69
|
+
understands some of the RFC5322 header field types.
|
|
70
|
+
(Currently address fields and date fields have
|
|
71
|
+
special treatment, while all other fields are
|
|
72
|
+
treated as unstructured. This list will be
|
|
73
|
+
completed before the extension is marked stable.)
|
|
74
|
+
|
|
75
|
+
content_manager -- an object with at least two methods: get_content
|
|
76
|
+
and set_content. When the get_content or
|
|
77
|
+
set_content method of a Message object is called,
|
|
78
|
+
it calls the corresponding method of this object,
|
|
79
|
+
passing it the message object as its first argument,
|
|
80
|
+
and any arguments or keywords that were passed to
|
|
81
|
+
it as additional arguments. The default
|
|
82
|
+
content_manager is
|
|
83
|
+
:data:`~email.contentmanager.raw_data_manager`.
|
|
84
|
+
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
message_factory = EmailMessage
|
|
88
|
+
utf8 = False
|
|
89
|
+
refold_source = 'long'
|
|
90
|
+
header_factory = HeaderRegistry()
|
|
91
|
+
content_manager = raw_data_manager
|
|
92
|
+
|
|
93
|
+
def __init__(self, **kw):
|
|
94
|
+
# Ensure that each new instance gets a unique header factory
|
|
95
|
+
# (as opposed to clones, which share the factory).
|
|
96
|
+
if 'header_factory' not in kw:
|
|
97
|
+
object.__setattr__(self, 'header_factory', HeaderRegistry())
|
|
98
|
+
super().__init__(**kw)
|
|
99
|
+
|
|
100
|
+
def header_max_count(self, name):
|
|
101
|
+
"""+
|
|
102
|
+
The implementation for this class returns the max_count attribute from
|
|
103
|
+
the specialized header class that would be used to construct a header
|
|
104
|
+
of type 'name'.
|
|
105
|
+
"""
|
|
106
|
+
return self.header_factory[name].max_count
|
|
107
|
+
|
|
108
|
+
# The logic of the next three methods is chosen such that it is possible to
|
|
109
|
+
# switch a Message object between a Compat32 policy and a policy derived
|
|
110
|
+
# from this class and have the results stay consistent. This allows a
|
|
111
|
+
# Message object constructed with this policy to be passed to a library
|
|
112
|
+
# that only handles Compat32 objects, or to receive such an object and
|
|
113
|
+
# convert it to use the newer style by just changing its policy. It is
|
|
114
|
+
# also chosen because it postpones the relatively expensive full rfc5322
|
|
115
|
+
# parse until as late as possible when parsing from source, since in many
|
|
116
|
+
# applications only a few headers will actually be inspected.
|
|
117
|
+
|
|
118
|
+
def header_source_parse(self, sourcelines):
|
|
119
|
+
"""+
|
|
120
|
+
The name is parsed as everything up to the ':' and returned unmodified.
|
|
121
|
+
The value is determined by stripping leading whitespace off the
|
|
122
|
+
remainder of the first line joined with all subsequent lines, and
|
|
123
|
+
stripping any trailing carriage return or linefeed characters. (This
|
|
124
|
+
is the same as Compat32).
|
|
125
|
+
|
|
126
|
+
"""
|
|
127
|
+
name, value = sourcelines[0].split(':', 1)
|
|
128
|
+
value = ''.join((value, *sourcelines[1:])).lstrip(' \t\r\n')
|
|
129
|
+
return (name, value.rstrip('\r\n'))
|
|
130
|
+
|
|
131
|
+
def header_store_parse(self, name, value):
|
|
132
|
+
"""+
|
|
133
|
+
The name is returned unchanged. If the input value has a 'name'
|
|
134
|
+
attribute and it matches the name ignoring case, the value is returned
|
|
135
|
+
unchanged. Otherwise the name and value are passed to header_factory
|
|
136
|
+
method, and the resulting custom header object is returned as the
|
|
137
|
+
value. In this case a ValueError is raised if the input value contains
|
|
138
|
+
CR or LF characters.
|
|
139
|
+
|
|
140
|
+
"""
|
|
141
|
+
if hasattr(value, 'name') and value.name.lower() == name.lower():
|
|
142
|
+
return (name, value)
|
|
143
|
+
if isinstance(value, str) and len(value.splitlines())>1:
|
|
144
|
+
# XXX this error message isn't quite right when we use splitlines
|
|
145
|
+
# (see issue 22233), but I'm not sure what should happen here.
|
|
146
|
+
raise ValueError("Header values may not contain linefeed "
|
|
147
|
+
"or carriage return characters")
|
|
148
|
+
return (name, self.header_factory(name, value))
|
|
149
|
+
|
|
150
|
+
def header_fetch_parse(self, name, value):
|
|
151
|
+
"""+
|
|
152
|
+
If the value has a 'name' attribute, it is returned to unmodified.
|
|
153
|
+
Otherwise the name and the value with any linesep characters removed
|
|
154
|
+
are passed to the header_factory method, and the resulting custom
|
|
155
|
+
header object is returned. Any surrogateescaped bytes get turned
|
|
156
|
+
into the unicode unknown-character glyph.
|
|
157
|
+
|
|
158
|
+
"""
|
|
159
|
+
if hasattr(value, 'name'):
|
|
160
|
+
return value
|
|
161
|
+
# We can't use splitlines here because it splits on more than \r and \n.
|
|
162
|
+
value = ''.join(linesep_splitter.split(value))
|
|
163
|
+
return self.header_factory(name, value)
|
|
164
|
+
|
|
165
|
+
def fold(self, name, value):
|
|
166
|
+
"""+
|
|
167
|
+
Header folding is controlled by the refold_source policy setting. A
|
|
168
|
+
value is considered to be a 'source value' if and only if it does not
|
|
169
|
+
have a 'name' attribute (having a 'name' attribute means it is a header
|
|
170
|
+
object of some sort). If a source value needs to be refolded according
|
|
171
|
+
to the policy, it is converted into a custom header object by passing
|
|
172
|
+
the name and the value with any linesep characters removed to the
|
|
173
|
+
header_factory method. Folding of a custom header object is done by
|
|
174
|
+
calling its fold method with the current policy.
|
|
175
|
+
|
|
176
|
+
Source values are split into lines using splitlines. If the value is
|
|
177
|
+
not to be refolded, the lines are rejoined using the linesep from the
|
|
178
|
+
policy and returned. The exception is lines containing non-ascii
|
|
179
|
+
binary data. In that case the value is refolded regardless of the
|
|
180
|
+
refold_source setting, which causes the binary data to be CTE encoded
|
|
181
|
+
using the unknown-8bit charset.
|
|
182
|
+
|
|
183
|
+
"""
|
|
184
|
+
return self._fold(name, value, refold_binary=True)
|
|
185
|
+
|
|
186
|
+
def fold_binary(self, name, value):
|
|
187
|
+
"""+
|
|
188
|
+
The same as fold if cte_type is 7bit, except that the returned value is
|
|
189
|
+
bytes.
|
|
190
|
+
|
|
191
|
+
If cte_type is 8bit, non-ASCII binary data is converted back into
|
|
192
|
+
bytes. Headers with binary data are not refolded, regardless of the
|
|
193
|
+
refold_header setting, since there is no way to know whether the binary
|
|
194
|
+
data consists of single byte characters or multibyte characters.
|
|
195
|
+
|
|
196
|
+
If utf8 is true, headers are encoded to utf8, otherwise to ascii with
|
|
197
|
+
non-ASCII unicode rendered as encoded words.
|
|
198
|
+
|
|
199
|
+
"""
|
|
200
|
+
folded = self._fold(name, value, refold_binary=self.cte_type=='7bit')
|
|
201
|
+
charset = 'utf8' if self.utf8 else 'ascii'
|
|
202
|
+
return folded.encode(charset, 'surrogateescape')
|
|
203
|
+
|
|
204
|
+
def _fold(self, name, value, refold_binary=False):
|
|
205
|
+
if hasattr(value, 'name'):
|
|
206
|
+
return value.fold(policy=self)
|
|
207
|
+
maxlen = self.max_line_length if self.max_line_length else sys.maxsize
|
|
208
|
+
# We can't use splitlines here because it splits on more than \r and \n.
|
|
209
|
+
lines = linesep_splitter.split(value)
|
|
210
|
+
refold = (self.refold_source == 'all' or
|
|
211
|
+
self.refold_source == 'long' and
|
|
212
|
+
(lines and len(lines[0])+len(name)+2 > maxlen or
|
|
213
|
+
any(len(x) > maxlen for x in lines[1:])))
|
|
214
|
+
|
|
215
|
+
if not refold:
|
|
216
|
+
if not self.utf8:
|
|
217
|
+
refold = not value.isascii()
|
|
218
|
+
elif refold_binary:
|
|
219
|
+
refold = _has_surrogates(value)
|
|
220
|
+
if refold:
|
|
221
|
+
return self.header_factory(name, ''.join(lines)).fold(policy=self)
|
|
222
|
+
|
|
223
|
+
return name + ': ' + self.linesep.join(lines) + self.linesep
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
default = EmailPolicy()
|
|
227
|
+
# Make the default policy use the class default header_factory
|
|
228
|
+
del default.header_factory
|
|
229
|
+
strict = default.clone(raise_on_defect=True)
|
|
230
|
+
SMTP = default.clone(linesep='\r\n')
|
|
231
|
+
HTTP = default.clone(linesep='\r\n', max_line_length=None)
|
|
232
|
+
SMTPUTF8 = SMTP.clone(utf8=True)
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
# Copyright (C) 2001-2006 Python Software Foundation
|
|
2
|
+
# Author: Ben Gertzfield
|
|
3
|
+
# Contact: email-sig@python.org
|
|
4
|
+
|
|
5
|
+
"""Quoted-printable content transfer encoding per RFCs 2045-2047.
|
|
6
|
+
|
|
7
|
+
This module handles the content transfer encoding method defined in RFC 2045
|
|
8
|
+
to encode US ASCII-like 8-bit data called `quoted-printable'. It is used to
|
|
9
|
+
safely encode text that is in a character set similar to the 7-bit US ASCII
|
|
10
|
+
character set, but that includes some 8-bit characters that are normally not
|
|
11
|
+
allowed in email bodies or headers.
|
|
12
|
+
|
|
13
|
+
Quoted-printable is very space-inefficient for encoding binary files; use the
|
|
14
|
+
email.base64mime module for that instead.
|
|
15
|
+
|
|
16
|
+
This module provides an interface to encode and decode both headers and bodies
|
|
17
|
+
with quoted-printable encoding.
|
|
18
|
+
|
|
19
|
+
RFC 2045 defines a method for including character set information in an
|
|
20
|
+
`encoded-word' in a header. This method is commonly used for 8-bit real names
|
|
21
|
+
in To:/From:/Cc: etc. fields, as well as Subject: lines.
|
|
22
|
+
|
|
23
|
+
This module does not do the line wrapping or end-of-line character
|
|
24
|
+
conversion necessary for proper internationalized headers; it only
|
|
25
|
+
does dumb encoding and decoding. To deal with the various line
|
|
26
|
+
wrapping issues, use the email.header module.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
__all__ = [
|
|
30
|
+
'body_decode',
|
|
31
|
+
'body_encode',
|
|
32
|
+
'body_length',
|
|
33
|
+
'decode',
|
|
34
|
+
'decodestring',
|
|
35
|
+
'header_decode',
|
|
36
|
+
'header_encode',
|
|
37
|
+
'header_length',
|
|
38
|
+
'quote',
|
|
39
|
+
'unquote',
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
import re
|
|
43
|
+
|
|
44
|
+
from string import ascii_letters, digits, hexdigits
|
|
45
|
+
|
|
46
|
+
CRLF = '\r\n'
|
|
47
|
+
NL = '\n'
|
|
48
|
+
EMPTYSTRING = ''
|
|
49
|
+
|
|
50
|
+
# Build a mapping of octets to the expansion of that octet. Since we're only
|
|
51
|
+
# going to have 256 of these things, this isn't terribly inefficient
|
|
52
|
+
# space-wise. Remember that headers and bodies have different sets of safe
|
|
53
|
+
# characters. Initialize both maps with the full expansion, and then override
|
|
54
|
+
# the safe bytes with the more compact form.
|
|
55
|
+
_QUOPRI_MAP = ['=%02X' % c for c in range(256)]
|
|
56
|
+
_QUOPRI_HEADER_MAP = _QUOPRI_MAP[:]
|
|
57
|
+
_QUOPRI_BODY_MAP = _QUOPRI_MAP[:]
|
|
58
|
+
|
|
59
|
+
# Safe header bytes which need no encoding.
|
|
60
|
+
for c in b'-!*+/' + ascii_letters.encode('ascii') + digits.encode('ascii'):
|
|
61
|
+
_QUOPRI_HEADER_MAP[c] = chr(c)
|
|
62
|
+
# Headers have one other special encoding; spaces become underscores.
|
|
63
|
+
_QUOPRI_HEADER_MAP[ord(' ')] = '_'
|
|
64
|
+
|
|
65
|
+
# Safe body bytes which need no encoding.
|
|
66
|
+
for c in (b' !"#$%&\'()*+,-./0123456789:;<>'
|
|
67
|
+
b'?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`'
|
|
68
|
+
b'abcdefghijklmnopqrstuvwxyz{|}~\t'):
|
|
69
|
+
_QUOPRI_BODY_MAP[c] = chr(c)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# Helpers
|
|
74
|
+
def header_check(octet):
|
|
75
|
+
"""Return True if the octet should be escaped with header quopri."""
|
|
76
|
+
return chr(octet) != _QUOPRI_HEADER_MAP[octet]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def body_check(octet):
|
|
80
|
+
"""Return True if the octet should be escaped with body quopri."""
|
|
81
|
+
return chr(octet) != _QUOPRI_BODY_MAP[octet]
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def header_length(bytearray):
|
|
85
|
+
"""Return a header quoted-printable encoding length.
|
|
86
|
+
|
|
87
|
+
Note that this does not include any RFC 2047 chrome added by
|
|
88
|
+
`header_encode()`.
|
|
89
|
+
|
|
90
|
+
:param bytearray: An array of bytes (a.k.a. octets).
|
|
91
|
+
:return: The length in bytes of the byte array when it is encoded with
|
|
92
|
+
quoted-printable for headers.
|
|
93
|
+
"""
|
|
94
|
+
return sum(len(_QUOPRI_HEADER_MAP[octet]) for octet in bytearray)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def body_length(bytearray):
|
|
98
|
+
"""Return a body quoted-printable encoding length.
|
|
99
|
+
|
|
100
|
+
:param bytearray: An array of bytes (a.k.a. octets).
|
|
101
|
+
:return: The length in bytes of the byte array when it is encoded with
|
|
102
|
+
quoted-printable for bodies.
|
|
103
|
+
"""
|
|
104
|
+
return sum(len(_QUOPRI_BODY_MAP[octet]) for octet in bytearray)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _max_append(L, s, maxlen, extra=''):
|
|
108
|
+
if not isinstance(s, str):
|
|
109
|
+
s = chr(s)
|
|
110
|
+
if not L:
|
|
111
|
+
L.append(s.lstrip())
|
|
112
|
+
elif len(L[-1]) + len(s) <= maxlen:
|
|
113
|
+
L[-1] += extra + s
|
|
114
|
+
else:
|
|
115
|
+
L.append(s.lstrip())
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def unquote(s):
|
|
119
|
+
"""Turn a string in the form =AB to the ASCII character with value 0xab"""
|
|
120
|
+
return chr(int(s[1:3], 16))
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def quote(c):
|
|
124
|
+
return _QUOPRI_MAP[ord(c)]
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def header_encode(header_bytes, charset='iso-8859-1'):
|
|
128
|
+
"""Encode a single header line with quoted-printable (like) encoding.
|
|
129
|
+
|
|
130
|
+
Defined in RFC 2045, this `Q' encoding is similar to quoted-printable, but
|
|
131
|
+
used specifically for email header fields to allow charsets with mostly 7
|
|
132
|
+
bit characters (and some 8 bit) to remain more or less readable in non-RFC
|
|
133
|
+
2045 aware mail clients.
|
|
134
|
+
|
|
135
|
+
charset names the character set to use in the RFC 2046 header. It
|
|
136
|
+
defaults to iso-8859-1.
|
|
137
|
+
"""
|
|
138
|
+
# Return empty headers as an empty string.
|
|
139
|
+
if not header_bytes:
|
|
140
|
+
return ''
|
|
141
|
+
# Iterate over every byte, encoding if necessary.
|
|
142
|
+
encoded = header_bytes.decode('latin1').translate(_QUOPRI_HEADER_MAP)
|
|
143
|
+
# Now add the RFC chrome to each encoded chunk and glue the chunks
|
|
144
|
+
# together.
|
|
145
|
+
return '=?%s?q?%s?=' % (charset, encoded)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
_QUOPRI_BODY_ENCODE_MAP = _QUOPRI_BODY_MAP[:]
|
|
149
|
+
for c in b'\r\n':
|
|
150
|
+
_QUOPRI_BODY_ENCODE_MAP[c] = chr(c)
|
|
151
|
+
del c
|
|
152
|
+
|
|
153
|
+
def body_encode(body, maxlinelen=76, eol=NL):
|
|
154
|
+
"""Encode with quoted-printable, wrapping at maxlinelen characters.
|
|
155
|
+
|
|
156
|
+
Each line of encoded text will end with eol, which defaults to "\\n". Set
|
|
157
|
+
this to "\\r\\n" if you will be using the result of this function directly
|
|
158
|
+
in an email.
|
|
159
|
+
|
|
160
|
+
Each line will be wrapped at, at most, maxlinelen characters before the
|
|
161
|
+
eol string (maxlinelen defaults to 76 characters, the maximum value
|
|
162
|
+
permitted by RFC 2045). Long lines will have the 'soft line break'
|
|
163
|
+
quoted-printable character "=" appended to them, so the decoded text will
|
|
164
|
+
be identical to the original text.
|
|
165
|
+
|
|
166
|
+
The minimum maxlinelen is 4 to have room for a quoted character ("=XX")
|
|
167
|
+
followed by a soft line break. Smaller values will generate a
|
|
168
|
+
ValueError.
|
|
169
|
+
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
if maxlinelen < 4:
|
|
173
|
+
raise ValueError("maxlinelen must be at least 4")
|
|
174
|
+
if not body:
|
|
175
|
+
return body
|
|
176
|
+
|
|
177
|
+
# quote special characters
|
|
178
|
+
body = body.translate(_QUOPRI_BODY_ENCODE_MAP)
|
|
179
|
+
|
|
180
|
+
soft_break = '=' + eol
|
|
181
|
+
# leave space for the '=' at the end of a line
|
|
182
|
+
maxlinelen1 = maxlinelen - 1
|
|
183
|
+
|
|
184
|
+
encoded_body = []
|
|
185
|
+
append = encoded_body.append
|
|
186
|
+
|
|
187
|
+
for line in body.splitlines():
|
|
188
|
+
# break up the line into pieces no longer than maxlinelen - 1
|
|
189
|
+
start = 0
|
|
190
|
+
laststart = len(line) - 1 - maxlinelen
|
|
191
|
+
while start <= laststart:
|
|
192
|
+
stop = start + maxlinelen1
|
|
193
|
+
# make sure we don't break up an escape sequence
|
|
194
|
+
if line[stop - 2] == '=':
|
|
195
|
+
append(line[start:stop - 1])
|
|
196
|
+
start = stop - 2
|
|
197
|
+
elif line[stop - 1] == '=':
|
|
198
|
+
append(line[start:stop])
|
|
199
|
+
start = stop - 1
|
|
200
|
+
else:
|
|
201
|
+
append(line[start:stop] + '=')
|
|
202
|
+
start = stop
|
|
203
|
+
|
|
204
|
+
# handle rest of line, special case if line ends in whitespace
|
|
205
|
+
if line and line[-1] in ' \t':
|
|
206
|
+
room = start - laststart
|
|
207
|
+
if room >= 3:
|
|
208
|
+
# It's a whitespace character at end-of-line, and we have room
|
|
209
|
+
# for the three-character quoted encoding.
|
|
210
|
+
q = quote(line[-1])
|
|
211
|
+
elif room == 2:
|
|
212
|
+
# There's room for the whitespace character and a soft break.
|
|
213
|
+
q = line[-1] + soft_break
|
|
214
|
+
else:
|
|
215
|
+
# There's room only for a soft break. The quoted whitespace
|
|
216
|
+
# will be the only content on the subsequent line.
|
|
217
|
+
q = soft_break + quote(line[-1])
|
|
218
|
+
append(line[start:-1] + q)
|
|
219
|
+
else:
|
|
220
|
+
append(line[start:])
|
|
221
|
+
|
|
222
|
+
# add back final newline if present
|
|
223
|
+
if body[-1] in CRLF:
|
|
224
|
+
append('')
|
|
225
|
+
|
|
226
|
+
return eol.join(encoded_body)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
# BAW: I'm not sure if the intent was for the signature of this function to be
|
|
231
|
+
# the same as base64MIME.decode() or not...
|
|
232
|
+
def decode(encoded, eol=NL):
|
|
233
|
+
"""Decode a quoted-printable string.
|
|
234
|
+
|
|
235
|
+
Lines are separated with eol, which defaults to \\n.
|
|
236
|
+
"""
|
|
237
|
+
if not encoded:
|
|
238
|
+
return encoded
|
|
239
|
+
# BAW: see comment in encode() above. Again, we're building up the
|
|
240
|
+
# decoded string with string concatenation, which could be done much more
|
|
241
|
+
# efficiently.
|
|
242
|
+
decoded = ''
|
|
243
|
+
|
|
244
|
+
for line in encoded.splitlines():
|
|
245
|
+
line = line.rstrip()
|
|
246
|
+
if not line:
|
|
247
|
+
decoded += eol
|
|
248
|
+
continue
|
|
249
|
+
|
|
250
|
+
i = 0
|
|
251
|
+
n = len(line)
|
|
252
|
+
while i < n:
|
|
253
|
+
c = line[i]
|
|
254
|
+
if c != '=':
|
|
255
|
+
decoded += c
|
|
256
|
+
i += 1
|
|
257
|
+
# Otherwise, c == "=". Are we at the end of the line? If so, add
|
|
258
|
+
# a soft line break.
|
|
259
|
+
elif i+1 == n:
|
|
260
|
+
i += 1
|
|
261
|
+
continue
|
|
262
|
+
# Decode if in form =AB
|
|
263
|
+
elif i+2 < n and line[i+1] in hexdigits and line[i+2] in hexdigits:
|
|
264
|
+
decoded += unquote(line[i:i+3])
|
|
265
|
+
i += 3
|
|
266
|
+
# Otherwise, not in form =AB, pass literally
|
|
267
|
+
else:
|
|
268
|
+
decoded += c
|
|
269
|
+
i += 1
|
|
270
|
+
|
|
271
|
+
if i == n:
|
|
272
|
+
decoded += eol
|
|
273
|
+
# Special case if original string did not end with eol
|
|
274
|
+
if encoded[-1] not in '\r\n' and decoded.endswith(eol):
|
|
275
|
+
decoded = decoded[:-len(eol)]
|
|
276
|
+
return decoded
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
# For convenience and backwards compatibility w/ standard base64 module
|
|
280
|
+
body_decode = decode
|
|
281
|
+
decodestring = decode
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def _unquote_match(match):
|
|
286
|
+
"""Turn a match in the form =AB to the ASCII character with value 0xab"""
|
|
287
|
+
s = match.group(0)
|
|
288
|
+
return unquote(s)
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
# Header decoding is done a bit differently
|
|
292
|
+
def header_decode(s):
|
|
293
|
+
"""Decode a string encoded with RFC 2045 MIME header `Q' encoding.
|
|
294
|
+
|
|
295
|
+
This function does not parse a full MIME header value encoded with
|
|
296
|
+
quoted-printable (like =?iso-8859-1?q?Hello_World?=) -- please use
|
|
297
|
+
the high level email.header class for that functionality.
|
|
298
|
+
"""
|
|
299
|
+
s = s.replace('_', ' ')
|
|
300
|
+
return re.sub(r'=[a-fA-F0-9]{2}', _unquote_match, s, flags=re.ASCII)
|