diff --git a/BuildAutomation/BuildCloudbaseInitSetup.ps1 b/BuildAutomation/BuildCloudbaseInitSetup.ps1 index a69d9a34c..5c973d5a3 100644 --- a/BuildAutomation/BuildCloudbaseInitSetup.ps1 +++ b/BuildAutomation/BuildCloudbaseInitSetup.ps1 @@ -28,7 +28,7 @@ $platformVCVarsRequired = "x86_amd64" # On Visual Studio 2019, the mixed x86_amd64 VC variables # make compilation for x86 use the x64 functions if ($platform -eq "x86") { - $platformVCVarsRequired = "x86" + throw "Platform x86 is no longer supported. See https://github.com/cloudbase/cloudbase-init/issues/213" } # Fix required to allow for >= 255 characters paths. Required for Python folder bundling. diff --git a/Python314_4_x86_Template/DLLs/_asyncio.pyd b/Python314_4_x86_Template/DLLs/_asyncio.pyd deleted file mode 100644 index a3a6fe5ff..000000000 Binary files a/Python314_4_x86_Template/DLLs/_asyncio.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_bz2.pyd b/Python314_4_x86_Template/DLLs/_bz2.pyd deleted file mode 100644 index 6f75125f6..000000000 Binary files a/Python314_4_x86_Template/DLLs/_bz2.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_ctypes.pyd b/Python314_4_x86_Template/DLLs/_ctypes.pyd deleted file mode 100644 index 57c0a75b2..000000000 Binary files a/Python314_4_x86_Template/DLLs/_ctypes.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_decimal.pyd b/Python314_4_x86_Template/DLLs/_decimal.pyd deleted file mode 100644 index e0590bbfc..000000000 Binary files a/Python314_4_x86_Template/DLLs/_decimal.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_elementtree.pyd b/Python314_4_x86_Template/DLLs/_elementtree.pyd deleted file mode 100644 index 63bfe0976..000000000 Binary files a/Python314_4_x86_Template/DLLs/_elementtree.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_hashlib.pyd b/Python314_4_x86_Template/DLLs/_hashlib.pyd deleted file mode 100644 index bd85c5989..000000000 Binary files a/Python314_4_x86_Template/DLLs/_hashlib.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_lzma.pyd b/Python314_4_x86_Template/DLLs/_lzma.pyd deleted file mode 100644 index 138d6f749..000000000 Binary files a/Python314_4_x86_Template/DLLs/_lzma.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_multiprocessing.pyd b/Python314_4_x86_Template/DLLs/_multiprocessing.pyd deleted file mode 100644 index 15267ce4b..000000000 Binary files a/Python314_4_x86_Template/DLLs/_multiprocessing.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_overlapped.pyd b/Python314_4_x86_Template/DLLs/_overlapped.pyd deleted file mode 100644 index 59c179031..000000000 Binary files a/Python314_4_x86_Template/DLLs/_overlapped.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_queue.pyd b/Python314_4_x86_Template/DLLs/_queue.pyd deleted file mode 100644 index 32a55017a..000000000 Binary files a/Python314_4_x86_Template/DLLs/_queue.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_remote_debugging.pyd b/Python314_4_x86_Template/DLLs/_remote_debugging.pyd deleted file mode 100644 index 1abffb6d7..000000000 Binary files a/Python314_4_x86_Template/DLLs/_remote_debugging.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_socket.pyd b/Python314_4_x86_Template/DLLs/_socket.pyd deleted file mode 100644 index 92958a9b4..000000000 Binary files a/Python314_4_x86_Template/DLLs/_socket.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_sqlite3.pyd b/Python314_4_x86_Template/DLLs/_sqlite3.pyd deleted file mode 100644 index 65a28b3b1..000000000 Binary files a/Python314_4_x86_Template/DLLs/_sqlite3.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_ssl.pyd b/Python314_4_x86_Template/DLLs/_ssl.pyd deleted file mode 100644 index 46f3cd22d..000000000 Binary files a/Python314_4_x86_Template/DLLs/_ssl.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_uuid.pyd b/Python314_4_x86_Template/DLLs/_uuid.pyd deleted file mode 100644 index 0e83509b3..000000000 Binary files a/Python314_4_x86_Template/DLLs/_uuid.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_wmi.pyd b/Python314_4_x86_Template/DLLs/_wmi.pyd deleted file mode 100644 index 2f35f8b11..000000000 Binary files a/Python314_4_x86_Template/DLLs/_wmi.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_zoneinfo.pyd b/Python314_4_x86_Template/DLLs/_zoneinfo.pyd deleted file mode 100644 index fdc0bbbf5..000000000 Binary files a/Python314_4_x86_Template/DLLs/_zoneinfo.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/_zstd.pyd b/Python314_4_x86_Template/DLLs/_zstd.pyd deleted file mode 100644 index 02786fcd4..000000000 Binary files a/Python314_4_x86_Template/DLLs/_zstd.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/libcrypto-3.dll b/Python314_4_x86_Template/DLLs/libcrypto-3.dll deleted file mode 100644 index eb01f1f2a..000000000 Binary files a/Python314_4_x86_Template/DLLs/libcrypto-3.dll and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/libffi-8.dll b/Python314_4_x86_Template/DLLs/libffi-8.dll deleted file mode 100644 index bc405e2b0..000000000 Binary files a/Python314_4_x86_Template/DLLs/libffi-8.dll and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/libssl-3.dll b/Python314_4_x86_Template/DLLs/libssl-3.dll deleted file mode 100644 index b7bf15315..000000000 Binary files a/Python314_4_x86_Template/DLLs/libssl-3.dll and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/py.ico b/Python314_4_x86_Template/DLLs/py.ico deleted file mode 100644 index 1d8a79bfb..000000000 Binary files a/Python314_4_x86_Template/DLLs/py.ico and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/pyc.ico b/Python314_4_x86_Template/DLLs/pyc.ico deleted file mode 100644 index 74dde81b6..000000000 Binary files a/Python314_4_x86_Template/DLLs/pyc.ico and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/pyd.ico b/Python314_4_x86_Template/DLLs/pyd.ico deleted file mode 100644 index 9f6cb601a..000000000 Binary files a/Python314_4_x86_Template/DLLs/pyd.ico and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/pyexpat.pyd b/Python314_4_x86_Template/DLLs/pyexpat.pyd deleted file mode 100644 index 3a42a5e14..000000000 Binary files a/Python314_4_x86_Template/DLLs/pyexpat.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/python_lib.cat b/Python314_4_x86_Template/DLLs/python_lib.cat deleted file mode 100644 index 4f777b62b..000000000 Binary files a/Python314_4_x86_Template/DLLs/python_lib.cat and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/select.pyd b/Python314_4_x86_Template/DLLs/select.pyd deleted file mode 100644 index fcb6037b0..000000000 Binary files a/Python314_4_x86_Template/DLLs/select.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/sqlite3.dll b/Python314_4_x86_Template/DLLs/sqlite3.dll deleted file mode 100644 index 28310f415..000000000 Binary files a/Python314_4_x86_Template/DLLs/sqlite3.dll and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/unicodedata.pyd b/Python314_4_x86_Template/DLLs/unicodedata.pyd deleted file mode 100644 index 65e60f805..000000000 Binary files a/Python314_4_x86_Template/DLLs/unicodedata.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/DLLs/winsound.pyd b/Python314_4_x86_Template/DLLs/winsound.pyd deleted file mode 100644 index 88c9a70c3..000000000 Binary files a/Python314_4_x86_Template/DLLs/winsound.pyd and /dev/null differ diff --git a/Python314_4_x86_Template/LICENSE.txt b/Python314_4_x86_Template/LICENSE.txt deleted file mode 100644 index 4059c1609..000000000 --- a/Python314_4_x86_Template/LICENSE.txt +++ /dev/null @@ -1,676 +0,0 @@ -A. HISTORY OF THE SOFTWARE -========================== - -Python was created in the early 1990s by Guido van Rossum at Stichting -Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands -as a successor of a language called ABC. Guido remains Python's -principal author, although it includes many contributions from others. - -In 1995, Guido continued his work on Python at the Corporation for -National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) -in Reston, Virginia where he released several versions of the -software. - -In May 2000, Guido and the Python core development team moved to -BeOpen.com to form the BeOpen PythonLabs team. In October of the same -year, the PythonLabs team moved to Digital Creations, which became -Zope Corporation. In 2001, the Python Software Foundation (PSF, see -https://www.python.org/psf/) was formed, a non-profit organization -created specifically to own Python-related Intellectual Property. -Zope Corporation was a sponsoring member of the PSF. - -All Python releases are Open Source (see https://opensource.org for -the Open Source Definition). Historically, most, but not all, Python -releases have also been GPL-compatible; the table below summarizes -the various releases. - - Release Derived Year Owner GPL- - from compatible? (1) - - 0.9.0 thru 1.2 1991-1995 CWI yes - 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes - 1.6 1.5.2 2000 CNRI no - 2.0 1.6 2000 BeOpen.com no - 1.6.1 1.6 2001 CNRI yes (2) - 2.1 2.0+1.6.1 2001 PSF no - 2.0.1 2.0+1.6.1 2001 PSF yes - 2.1.1 2.1+2.0.1 2001 PSF yes - 2.1.2 2.1.1 2002 PSF yes - 2.1.3 2.1.2 2002 PSF yes - 2.2 and above 2.1.1 2001-now PSF yes - -Footnotes: - -(1) GPL-compatible doesn't mean that we're distributing Python under - the GPL. All Python licenses, unlike the GPL, let you distribute - a modified version without making your changes open source. The - GPL-compatible licenses make it possible to combine Python with - other software that is released under the GPL; the others don't. - -(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, - because its license has a choice of law clause. According to - CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 - is "not incompatible" with the GPL. - -Thanks to the many outside volunteers who have worked under Guido's -direction to make these releases possible. - - -B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON -=============================================================== - -Python software and documentation are licensed under the -Python Software Foundation License Version 2. - -Starting with Python 3.8.6, examples, recipes, and other code in -the documentation are dual licensed under the PSF License Version 2 -and the Zero-Clause BSD license. - -Some software incorporated into Python is under different licenses. -The licenses are listed with code falling under that license. - - -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- - -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001 Python Software Foundation; All Rights Reserved" -are retained in Python alone or in any derivative version prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. - -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -------------------------------------------- - -BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 - -1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -Individual or Organization ("Licensee") accessing and otherwise using -this software in source or binary form and its associated -documentation ("the Software"). - -2. Subject to the terms and conditions of this BeOpen Python License -Agreement, BeOpen hereby grants Licensee a non-exclusive, -royalty-free, world-wide license to reproduce, analyze, test, perform -and/or display publicly, prepare derivative works, distribute, and -otherwise use the Software alone or in any derivative version, -provided, however, that the BeOpen Python License is retained in the -Software, alone or in any derivative version prepared by Licensee. - -3. BeOpen is making the Software available to Licensee on an "AS IS" -basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -5. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -6. This License Agreement shall be governed by and interpreted in all -respects by the law of the State of California, excluding conflict of -law provisions. Nothing in this License Agreement shall be deemed to -create any relationship of agency, partnership, or joint venture -between BeOpen and Licensee. This License Agreement does not grant -permission to use BeOpen trademarks or trade names in a trademark -sense to endorse or promote products or services of Licensee, or any -third party. As an exception, the "BeOpen Python" logos available at -http://www.pythonlabs.com/logos.html may be used according to the -permissions granted on that web page. - -7. By copying, installing or otherwise using the software, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 ---------------------------------------- - -1. This LICENSE AGREEMENT is between the Corporation for National -Research Initiatives, having an office at 1895 Preston White Drive, -Reston, VA 20191 ("CNRI"), and the Individual or Organization -("Licensee") accessing and otherwise using Python 1.6.1 software in -source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, CNRI -hereby grants Licensee a nonexclusive, royalty-free, world-wide -license to reproduce, analyze, test, perform and/or display publicly, -prepare derivative works, distribute, and otherwise use Python 1.6.1 -alone or in any derivative version, provided, however, that CNRI's -License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -1995-2001 Corporation for National Research Initiatives; All Rights -Reserved" are retained in Python 1.6.1 alone or in any derivative -version prepared by Licensee. Alternately, in lieu of CNRI's License -Agreement, Licensee may substitute the following text (omitting the -quotes): "Python 1.6.1 is made available subject to the terms and -conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the internet using the following -unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the internet -using the following URL: http://hdl.handle.net/1895.22/1013". - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python 1.6.1 or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python 1.6.1. - -4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. This License Agreement shall be governed by the federal -intellectual property law of the United States, including without -limitation the federal copyright law, and, to the extent such -U.S. federal law does not apply, by the law of the Commonwealth of -Virginia, excluding Virginia's conflict of law provisions. -Notwithstanding the foregoing, with regard to derivative works based -on Python 1.6.1 that incorporate non-separable material that was -previously distributed under the GNU General Public License (GPL), the -law of the Commonwealth of Virginia shall govern this License -Agreement only as to issues arising under or with respect to -Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -License Agreement shall be deemed to create any relationship of -agency, partnership, or joint venture between CNRI and Licensee. This -License Agreement does not grant permission to use CNRI trademarks or -trade name in a trademark sense to endorse or promote products or -services of Licensee, or any third party. - -8. By clicking on the "ACCEPT" button where indicated, or by copying, -installing or otherwise using Python 1.6.1, Licensee agrees to be -bound by the terms and conditions of this License Agreement. - - ACCEPT - - -CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 --------------------------------------------------- - -Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -The Netherlands. All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM 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. - -ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION ----------------------------------------------------------------------- - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -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. - - - -Additional Conditions for this Windows binary build ---------------------------------------------------- - -This program is linked with and uses Microsoft Distributable Code, -copyrighted by Microsoft Corporation. The Microsoft Distributable Code -is embedded in each .exe, .dll and .pyd file as a result of running -the code through a linker. - -If you further distribute programs that include the Microsoft -Distributable Code, you must comply with the restrictions on -distribution specified by Microsoft. In particular, you must require -distributors and external end users to agree to terms that protect the -Microsoft Distributable Code at least as much as Microsoft's own -requirements for the Distributable Code. See Microsoft's documentation -(included in its developer tools and on its website at microsoft.com) -for specific details. - -Redistribution of the Windows binary build of the Python interpreter -complies with this agreement, provided that you do not: - -- alter any copyright, trademark or patent notice in Microsoft's -Distributable Code; - -- use Microsoft's trademarks in your programs' names or in a way that -suggests your programs come from or are endorsed by Microsoft; - -- distribute Microsoft's Distributable Code to run on a platform other -than Microsoft operating systems, run-time technologies or application -platforms; or - -- include Microsoft Distributable Code in malicious, deceptive or -unlawful programs. - -These restrictions apply only to the Microsoft Distributable Code as -defined above, not to Python itself or any programs running on the -Python interpreter. The redistribution of the Python interpreter and -libraries is governed by the Python Software License included with this -file, or by other licenses as marked. - - - --------------------------------------------------------------------------- - -This program, "bzip2", the associated library "libbzip2", and all -documentation, are copyright (C) 1996-2019 Julian R Seward. All -rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - -3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - -4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - -Julian Seward, jseward@acm.org -bzip2/libbzip2 version 1.0.8 of 13 July 2019 - --------------------------------------------------------------------------- - -libffi - Copyright (c) 1996-2022 Anthony Green, Red Hat, Inc and others. -See source files for details. - -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. - -BSD License - -For Zstandard software - -Copyright (c) Meta Platforms, Inc. and affiliates. 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 Facebook, nor Meta, 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 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. - - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - -This software is copyrighted by the Regents of the University of -California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState -Corporation and other parties. The following terms apply to all files -associated with the software unless explicitly disclaimed in -individual files. - -The authors hereby grant permission to use, copy, modify, distribute, -and license this software and its documentation for any purpose, provided -that existing copyright notices are retained in all copies and that this -notice is included verbatim in any distributions. No written agreement, -license, or royalty fee is required for any of the authorized uses. -Modifications to this software may be copyrighted by their authors -and need not follow the licensing terms described here, provided that -the new terms are clearly indicated on the first page of each file where -they apply. - -IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -MODIFICATIONS. - -GOVERNMENT USE: If you are acquiring this software on behalf of the -U.S. government, the Government shall have only "Restricted Rights" -in the software and related documentation as defined in the Federal -Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you -are acquiring the software on behalf of the Department of Defense, the -software shall be classified as "Commercial Computer Software" and the -Government shall have only "Restricted Rights" as defined in Clause -252.227-7014 (b) (3) of DFARs. Notwithstanding the foregoing, the -authors grant the U.S. Government and others acting in its behalf -permission to use and distribute the software in accordance with the -terms specified in this license. - -This software is copyrighted by the Regents of the University of -California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState -Corporation, Apple Inc. and other parties. The following terms apply to -all files associated with the software unless explicitly disclaimed in -individual files. - -The authors hereby grant permission to use, copy, modify, distribute, -and license this software and its documentation for any purpose, provided -that existing copyright notices are retained in all copies and that this -notice is included verbatim in any distributions. No written agreement, -license, or royalty fee is required for any of the authorized uses. -Modifications to this software may be copyrighted by their authors -and need not follow the licensing terms described here, provided that -the new terms are clearly indicated on the first page of each file where -they apply. - -IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -MODIFICATIONS. - -GOVERNMENT USE: If you are acquiring this software on behalf of the -U.S. government, the Government shall have only "Restricted Rights" -in the software and related documentation as defined in the Federal -Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you -are acquiring the software on behalf of the Department of Defense, the -software shall be classified as "Commercial Computer Software" and the -Government shall have only "Restricted Rights" as defined in Clause -252.227-7013 (b) (3) of DFARs. Notwithstanding the foregoing, the -authors grant the U.S. Government and others acting in its behalf -permission to use and distribute the software in accordance with the -terms specified in this license. - diff --git a/Python314_4_x86_Template/Lib/__future__.py b/Python314_4_x86_Template/Lib/__future__.py deleted file mode 100644 index 39720a5e4..000000000 --- a/Python314_4_x86_Template/Lib/__future__.py +++ /dev/null @@ -1,147 +0,0 @@ -"""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 or that the release version is undetermined. - -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/cpython/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 = 0x20000 # division -CO_FUTURE_ABSOLUTE_IMPORT = 0x40000 # perform absolute imports by default -CO_FUTURE_WITH_STATEMENT = 0x80000 # with statement -CO_FUTURE_PRINT_FUNCTION = 0x100000 # print function -CO_FUTURE_UNICODE_LITERALS = 0x200000 # unicode string literals -CO_FUTURE_BARRY_AS_BDFL = 0x400000 -CO_FUTURE_GENERATOR_STOP = 0x800000 # StopIteration becomes RuntimeError in generators -CO_FUTURE_ANNOTATIONS = 0x1000000 # 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, or the release date is undetermined, 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), - (4, 0, 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), - None, - CO_FUTURE_ANNOTATIONS) diff --git a/Python314_4_x86_Template/Lib/__hello__.py b/Python314_4_x86_Template/Lib/__hello__.py deleted file mode 100644 index c09d6a4f5..000000000 --- a/Python314_4_x86_Template/Lib/__hello__.py +++ /dev/null @@ -1,16 +0,0 @@ -initialized = True - -class TestFrozenUtf8_1: - """\u00b6""" - -class TestFrozenUtf8_2: - """\u03c0""" - -class TestFrozenUtf8_4: - """\U0001f600""" - -def main(): - print("Hello world!") - -if __name__ == '__main__': - main() diff --git a/Python314_4_x86_Template/Lib/__phello__/__init__.py b/Python314_4_x86_Template/Lib/__phello__/__init__.py deleted file mode 100644 index d37bd2766..000000000 --- a/Python314_4_x86_Template/Lib/__phello__/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -initialized = True - -def main(): - print("Hello world!") - -if __name__ == '__main__': - main() diff --git a/Python314_4_x86_Template/Lib/__phello__/ham/__init__.py b/Python314_4_x86_Template/Lib/__phello__/ham/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Python314_4_x86_Template/Lib/__phello__/ham/eggs.py b/Python314_4_x86_Template/Lib/__phello__/ham/eggs.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Python314_4_x86_Template/Lib/__phello__/spam.py b/Python314_4_x86_Template/Lib/__phello__/spam.py deleted file mode 100644 index d37bd2766..000000000 --- a/Python314_4_x86_Template/Lib/__phello__/spam.py +++ /dev/null @@ -1,7 +0,0 @@ -initialized = True - -def main(): - print("Hello world!") - -if __name__ == '__main__': - main() diff --git a/Python314_4_x86_Template/Lib/__pycache__/__future__.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/__future__.cpython-314.pyc deleted file mode 100644 index 32f570b2d..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/__future__.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/_colorize.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/_colorize.cpython-314.pyc deleted file mode 100644 index ecf889941..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/_colorize.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/_compat_pickle.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/_compat_pickle.cpython-314.pyc deleted file mode 100644 index 9299ced96..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/_compat_pickle.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/_markupbase.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/_markupbase.cpython-314.pyc deleted file mode 100644 index 5a59965e9..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/_markupbase.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/_opcode_metadata.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/_opcode_metadata.cpython-314.pyc deleted file mode 100644 index f7a690c08..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/_opcode_metadata.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/_py_warnings.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/_py_warnings.cpython-314.pyc deleted file mode 100644 index c30b37fd6..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/_py_warnings.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/_weakrefset.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/_weakrefset.cpython-314.pyc deleted file mode 100644 index b9eab25d8..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/_weakrefset.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/annotationlib.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/annotationlib.cpython-314.pyc deleted file mode 100644 index 6a246cb51..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/annotationlib.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/argparse.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/argparse.cpython-314.pyc deleted file mode 100644 index 72302ed9d..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/argparse.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/ast.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/ast.cpython-314.pyc deleted file mode 100644 index a2c5c828e..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/ast.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/base64.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/base64.cpython-314.pyc deleted file mode 100644 index 0f057fe7d..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/base64.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/bisect.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/bisect.cpython-314.pyc deleted file mode 100644 index e49e4336f..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/bisect.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/bz2.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/bz2.cpython-314.pyc deleted file mode 100644 index ee0408498..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/bz2.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/calendar.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/calendar.cpython-314.pyc deleted file mode 100644 index 9427c2dda..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/calendar.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/codeop.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/codeop.cpython-314.pyc deleted file mode 100644 index 63ff9dbb9..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/codeop.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/colorsys.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/colorsys.cpython-314.pyc deleted file mode 100644 index 26d39a8bb..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/colorsys.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/compileall.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/compileall.cpython-314.pyc deleted file mode 100644 index c7e9e1863..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/compileall.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/configparser.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/configparser.cpython-314.pyc deleted file mode 100644 index f1a6755f0..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/configparser.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/contextlib.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/contextlib.cpython-314.pyc deleted file mode 100644 index 87f52dc67..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/contextlib.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/copy.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/copy.cpython-314.pyc deleted file mode 100644 index fe1e55817..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/copy.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/copyreg.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/copyreg.cpython-314.pyc deleted file mode 100644 index 2b78ba613..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/copyreg.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/csv.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/csv.cpython-314.pyc deleted file mode 100644 index f2f52977a..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/csv.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/dataclasses.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/dataclasses.cpython-314.pyc deleted file mode 100644 index 994802ceb..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/dataclasses.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/datetime.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/datetime.cpython-314.pyc deleted file mode 100644 index 820312628..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/datetime.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/decimal.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/decimal.cpython-314.pyc deleted file mode 100644 index eed0fa4ff..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/decimal.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/dis.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/dis.cpython-314.pyc deleted file mode 100644 index a56a98a62..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/dis.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/enum.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/enum.cpython-314.pyc deleted file mode 100644 index 69f6615d7..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/enum.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/filecmp.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/filecmp.cpython-314.pyc deleted file mode 100644 index 1bbdc5b2f..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/filecmp.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/fnmatch.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/fnmatch.cpython-314.pyc deleted file mode 100644 index 29a99a8c2..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/fnmatch.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/fractions.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/fractions.cpython-314.pyc deleted file mode 100644 index fa6f5e559..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/fractions.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/functools.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/functools.cpython-314.pyc deleted file mode 100644 index ce34ddd58..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/functools.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/getpass.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/getpass.cpython-314.pyc deleted file mode 100644 index dbd0343d9..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/getpass.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/gettext.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/gettext.cpython-314.pyc deleted file mode 100644 index 4687de57e..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/gettext.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/glob.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/glob.cpython-314.pyc deleted file mode 100644 index 45634ecc1..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/glob.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/gzip.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/gzip.cpython-314.pyc deleted file mode 100644 index a3bd16fec..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/gzip.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/hashlib.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/hashlib.cpython-314.pyc deleted file mode 100644 index d1e9a7d9b..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/hashlib.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/heapq.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/heapq.cpython-314.pyc deleted file mode 100644 index fde48f03b..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/heapq.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/hmac.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/hmac.cpython-314.pyc deleted file mode 100644 index ab6670908..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/hmac.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/inspect.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/inspect.cpython-314.pyc deleted file mode 100644 index 3499a648d..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/inspect.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/ipaddress.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/ipaddress.cpython-314.pyc deleted file mode 100644 index 57a215f37..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/ipaddress.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/keyword.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/keyword.cpython-314.pyc deleted file mode 100644 index 5fd131075..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/keyword.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/linecache.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/linecache.cpython-314.pyc deleted file mode 100644 index ae5866ca4..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/linecache.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/locale.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/locale.cpython-314.pyc deleted file mode 100644 index 3eae95264..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/locale.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/lzma.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/lzma.cpython-314.pyc deleted file mode 100644 index be1dcd40e..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/lzma.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/mimetypes.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/mimetypes.cpython-314.pyc deleted file mode 100644 index 493faa241..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/mimetypes.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/numbers.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/numbers.cpython-314.pyc deleted file mode 100644 index c73ed870c..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/numbers.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/opcode.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/opcode.cpython-314.pyc deleted file mode 100644 index dc23767ac..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/opcode.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/operator.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/operator.cpython-314.pyc deleted file mode 100644 index ce14bc533..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/operator.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/optparse.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/optparse.cpython-314.pyc deleted file mode 100644 index c89354104..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/optparse.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/pickle.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/pickle.cpython-314.pyc deleted file mode 100644 index b0da31c8d..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/pickle.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/pkgutil.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/pkgutil.cpython-314.pyc deleted file mode 100644 index 82f9281c8..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/pkgutil.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/platform.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/platform.cpython-314.pyc deleted file mode 100644 index bd3dbba47..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/platform.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/py_compile.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/py_compile.cpython-314.pyc deleted file mode 100644 index 1489678c1..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/py_compile.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/queue.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/queue.cpython-314.pyc deleted file mode 100644 index 68298504b..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/queue.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/quopri.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/quopri.cpython-314.pyc deleted file mode 100644 index 1ac12990d..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/quopri.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/random.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/random.cpython-314.pyc deleted file mode 100644 index 2f7958de8..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/random.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/reprlib.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/reprlib.cpython-314.pyc deleted file mode 100644 index c5814f075..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/reprlib.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/selectors.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/selectors.cpython-314.pyc deleted file mode 100644 index 2add510cb..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/selectors.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/shlex.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/shlex.cpython-314.pyc deleted file mode 100644 index 9d7b5b510..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/shlex.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/shutil.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/shutil.cpython-314.pyc deleted file mode 100644 index d823f4366..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/shutil.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/signal.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/signal.cpython-314.pyc deleted file mode 100644 index f0c1aee97..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/signal.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/socket.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/socket.cpython-314.pyc deleted file mode 100644 index 260ac7f91..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/socket.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/socketserver.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/socketserver.cpython-314.pyc deleted file mode 100644 index abd8b9846..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/socketserver.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/ssl.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/ssl.cpython-314.pyc deleted file mode 100644 index 9904f447e..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/ssl.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/stringprep.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/stringprep.cpython-314.pyc deleted file mode 100644 index ef73a8119..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/stringprep.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/struct.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/struct.cpython-314.pyc deleted file mode 100644 index 460ac2657..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/struct.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/subprocess.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/subprocess.cpython-314.pyc deleted file mode 100644 index c7153554f..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/subprocess.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/tarfile.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/tarfile.cpython-314.pyc deleted file mode 100644 index f4ad494c7..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/tarfile.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/tempfile.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/tempfile.cpython-314.pyc deleted file mode 100644 index 3fd019d92..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/tempfile.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/textwrap.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/textwrap.cpython-314.pyc deleted file mode 100644 index 39b2fa732..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/textwrap.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/threading.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/threading.cpython-314.pyc deleted file mode 100644 index a55eba7dc..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/threading.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/token.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/token.cpython-314.pyc deleted file mode 100644 index 567776b88..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/token.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/tokenize.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/tokenize.cpython-314.pyc deleted file mode 100644 index d3b156052..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/tokenize.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/traceback.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/traceback.cpython-314.pyc deleted file mode 100644 index 035fe780c..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/traceback.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/types.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/types.cpython-314.pyc deleted file mode 100644 index 6309772f1..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/types.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/typing.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/typing.cpython-314.pyc deleted file mode 100644 index f5e0b484b..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/typing.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/uuid.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/uuid.cpython-314.pyc deleted file mode 100644 index 4c7648151..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/uuid.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/warnings.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/warnings.cpython-314.pyc deleted file mode 100644 index 6e5e4697b..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/warnings.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/__pycache__/weakref.cpython-314.pyc b/Python314_4_x86_Template/Lib/__pycache__/weakref.cpython-314.pyc deleted file mode 100644 index 76965b6a0..000000000 Binary files a/Python314_4_x86_Template/Lib/__pycache__/weakref.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/_aix_support.py b/Python314_4_x86_Template/Lib/_aix_support.py deleted file mode 100644 index dadc75c2b..000000000 --- a/Python314_4_x86_Template/Lib/_aix_support.py +++ /dev/null @@ -1,108 +0,0 @@ -"""Shared AIX support functions.""" - -import sys -import sysconfig - - -# Taken from _osx_support _read_output function -def _read_cmd_output(commandstring, capture_stderr=False): - """Output from successful command execution or None""" - # Similar to os.popen(commandstring, "r").read(), - # but without actually using os.popen because that - # function is not usable during python bootstrap. - import os - import contextlib - fp = open("/tmp/_aix_support.%s"%( - os.getpid(),), "w+b") - - with contextlib.closing(fp) as fp: - if capture_stderr: - cmd = "%s >'%s' 2>&1" % (commandstring, fp.name) - else: - cmd = "%s 2>/dev/null >'%s'" % (commandstring, fp.name) - return fp.read() if not os.system(cmd) else None - - -def _aix_tag(vrtl, bd): - # type: (List[int], int) -> str - # Infer the ABI bitwidth from maxsize (assuming 64 bit as the default) - _sz = 32 if sys.maxsize == (2**31-1) else 64 - _bd = bd if bd != 0 else 9988 - # vrtl[version, release, technology_level] - return "aix-{:1x}{:1d}{:02d}-{:04d}-{}".format(vrtl[0], vrtl[1], vrtl[2], _bd, _sz) - - -# extract version, release and technology level from a VRMF string -def _aix_vrtl(vrmf): - # type: (str) -> List[int] - v, r, tl = vrmf.split(".")[:3] - return [int(v[-1]), int(r), int(tl)] - - -def _aix_bos_rte(): - # type: () -> Tuple[str, int] - """ - Return a Tuple[str, int] e.g., ['7.1.4.34', 1806] - The fileset bos.rte represents the current AIX run-time level. It's VRMF and - builddate reflect the current ABI levels of the runtime environment. - If no builddate is found give a value that will satisfy pep425 related queries - """ - # All AIX systems to have lslpp installed in this location - # subprocess may not be available during python bootstrap - try: - import subprocess - out = subprocess.check_output(["/usr/bin/lslpp", "-Lqc", "bos.rte"]) - except ImportError: - out = _read_cmd_output("/usr/bin/lslpp -Lqc bos.rte") - out = out.decode("utf-8") - out = out.strip().split(":") # type: ignore - _bd = int(out[-1]) if out[-1] != '' else 9988 - return (str(out[2]), _bd) - - -def aix_platform(): - # type: () -> str - """ - AIX filesets are identified by four decimal values: V.R.M.F. - V (version) and R (release) can be retrieved using ``uname`` - Since 2007, starting with AIX 5.3 TL7, the M value has been - included with the fileset bos.rte and represents the Technology - Level (TL) of AIX. The F (Fix) value also increases, but is not - relevant for comparing releases and binary compatibility. - For binary compatibility the so-called builddate is needed. - Again, the builddate of an AIX release is associated with bos.rte. - AIX ABI compatibility is described as guaranteed at: https://www.ibm.com/\ - support/knowledgecenter/en/ssw_aix_72/install/binary_compatability.html - - For pep425 purposes the AIX platform tag becomes: - "aix-{:1x}{:1d}{:02d}-{:04d}-{}".format(v, r, tl, builddate, bitsize) - e.g., "aix-6107-1415-32" for AIX 6.1 TL7 bd 1415, 32-bit - and, "aix-6107-1415-64" for AIX 6.1 TL7 bd 1415, 64-bit - """ - vrmf, bd = _aix_bos_rte() - return _aix_tag(_aix_vrtl(vrmf), bd) - - -# extract vrtl from the BUILD_GNU_TYPE as an int -def _aix_bgt(): - # type: () -> List[int] - gnu_type = sysconfig.get_config_var("BUILD_GNU_TYPE") - if not gnu_type: - raise ValueError("BUILD_GNU_TYPE is not defined") - return _aix_vrtl(vrmf=gnu_type) - - -def aix_buildtag(): - # type: () -> str - """ - Return the platform_tag of the system Python was built on. - """ - # AIX_BUILDDATE is defined by configure with: - # lslpp -Lcq bos.rte | awk -F: '{ print $NF }' - build_date = sysconfig.get_config_var("AIX_BUILDDATE") - try: - build_date = int(build_date) - except (ValueError, TypeError): - raise ValueError(f"AIX_BUILDDATE is not defined or invalid: " - f"{build_date!r}") - return _aix_tag(_aix_bgt(), build_date) diff --git a/Python314_4_x86_Template/Lib/_android_support.py b/Python314_4_x86_Template/Lib/_android_support.py deleted file mode 100644 index 320dab52a..000000000 --- a/Python314_4_x86_Template/Lib/_android_support.py +++ /dev/null @@ -1,192 +0,0 @@ -import io -import sys -from threading import RLock -from time import sleep, time - -# The maximum length of a log message in bytes, including the level marker and -# tag, is defined as LOGGER_ENTRY_MAX_PAYLOAD at -# https://cs.android.com/android/platform/superproject/+/android-14.0.0_r1:system/logging/liblog/include/log/log.h;l=71. -# Messages longer than this will be truncated by logcat. This limit has already -# been reduced at least once in the history of Android (from 4076 to 4068 between -# API level 23 and 26), so leave some headroom. -MAX_BYTES_PER_WRITE = 4000 - -# UTF-8 uses a maximum of 4 bytes per character, so limiting text writes to this -# size ensures that we can always avoid exceeding MAX_BYTES_PER_WRITE. -# However, if the actual number of bytes per character is smaller than that, -# then we may still join multiple consecutive text writes into binary -# writes containing a larger number of characters. -MAX_CHARS_PER_WRITE = MAX_BYTES_PER_WRITE // 4 - - -# When embedded in an app on current versions of Android, there's no easy way to -# monitor the C-level stdout and stderr. The testbed comes with a .c file to -# redirect them to the system log using a pipe, but that wouldn't be convenient -# or appropriate for all apps. So we redirect at the Python level instead. -def init_streams(android_log_write, stdout_prio, stderr_prio): - if sys.executable: - return # Not embedded in an app. - - global logcat - logcat = Logcat(android_log_write) - sys.stdout = TextLogStream(stdout_prio, "python.stdout", sys.stdout) - sys.stderr = TextLogStream(stderr_prio, "python.stderr", sys.stderr) - - -class TextLogStream(io.TextIOWrapper): - def __init__(self, prio, tag, original=None, **kwargs): - # Respect the -u option. - if original: - kwargs.setdefault("write_through", original.write_through) - fileno = original.fileno() - else: - fileno = None - - # The default is surrogateescape for stdout and backslashreplace for - # stderr, but in the context of an Android log, readability is more - # important than reversibility. - kwargs.setdefault("encoding", "UTF-8") - kwargs.setdefault("errors", "backslashreplace") - - super().__init__(BinaryLogStream(prio, tag, fileno), **kwargs) - self._lock = RLock() - self._pending_bytes = [] - self._pending_bytes_count = 0 - - def __repr__(self): - return f"" - - def write(self, s): - if not isinstance(s, str): - raise TypeError( - f"write() argument must be str, not {type(s).__name__}") - - # In case `s` is a str subclass that writes itself to stdout or stderr - # when we call its methods, convert it to an actual str. - s = str.__str__(s) - - # We want to emit one log message per line wherever possible, so split - # the string into lines first. Note that "".splitlines() == [], so - # nothing will be logged for an empty string. - with self._lock: - for line in s.splitlines(keepends=True): - while line: - chunk = line[:MAX_CHARS_PER_WRITE] - line = line[MAX_CHARS_PER_WRITE:] - self._write_chunk(chunk) - - return len(s) - - # The size and behavior of TextIOWrapper's buffer is not part of its public - # API, so we handle buffering ourselves to avoid truncation. - def _write_chunk(self, s): - b = s.encode(self.encoding, self.errors) - if self._pending_bytes_count + len(b) > MAX_BYTES_PER_WRITE: - self.flush() - - self._pending_bytes.append(b) - self._pending_bytes_count += len(b) - if ( - self.write_through - or b.endswith(b"\n") - or self._pending_bytes_count > MAX_BYTES_PER_WRITE - ): - self.flush() - - def flush(self): - with self._lock: - self.buffer.write(b"".join(self._pending_bytes)) - self._pending_bytes.clear() - self._pending_bytes_count = 0 - - # Since this is a line-based logging system, line buffering cannot be turned - # off, i.e. a newline always causes a flush. - @property - def line_buffering(self): - return True - - -class BinaryLogStream(io.RawIOBase): - def __init__(self, prio, tag, fileno=None): - self.prio = prio - self.tag = tag - self._fileno = fileno - - def __repr__(self): - return f"" - - def writable(self): - return True - - def write(self, b): - if type(b) is not bytes: - try: - b = bytes(memoryview(b)) - except TypeError: - raise TypeError( - f"write() argument must be bytes-like, not {type(b).__name__}" - ) from None - - # Writing an empty string to the stream should have no effect. - if b: - logcat.write(self.prio, self.tag, b) - return len(b) - - # This is needed by the test suite --timeout option, which uses faulthandler. - def fileno(self): - if self._fileno is None: - raise io.UnsupportedOperation("fileno") - return self._fileno - - -# When a large volume of data is written to logcat at once, e.g. when a test -# module fails in --verbose3 mode, there's a risk of overflowing logcat's own -# buffer and losing messages. We avoid this by imposing a rate limit using the -# token bucket algorithm, based on a conservative estimate of how fast `adb -# logcat` can consume data. -MAX_BYTES_PER_SECOND = 1024 * 1024 - -# The logcat buffer size of a device can be determined by running `logcat -g`. -# We set the token bucket size to half of the buffer size of our current minimum -# API level, because other things on the system will be producing messages as -# well. -BUCKET_SIZE = 128 * 1024 - -# https://cs.android.com/android/platform/superproject/+/android-14.0.0_r1:system/logging/liblog/include/log/log_read.h;l=39 -PER_MESSAGE_OVERHEAD = 28 - - -class Logcat: - def __init__(self, android_log_write): - self.android_log_write = android_log_write - self._lock = RLock() - self._bucket_level = 0 - self._prev_write_time = time() - - def write(self, prio, tag, message): - # Encode null bytes using "modified UTF-8" to avoid them truncating the - # message. - message = message.replace(b"\x00", b"\xc0\x80") - - # On API level 30 and higher, Logcat will strip any number of leading - # newlines. This is visible in all `logcat` modes, even --binary. Work - # around this by adding a leading space, which shouldn't make any - # difference to the log's usability. - if message.startswith(b"\n"): - message = b" " + message - - with self._lock: - now = time() - self._bucket_level += ( - (now - self._prev_write_time) * MAX_BYTES_PER_SECOND) - - # If the bucket level is still below zero, the clock must have gone - # backwards, so reset it to zero and continue. - self._bucket_level = max(0, min(self._bucket_level, BUCKET_SIZE)) - self._prev_write_time = now - - self._bucket_level -= PER_MESSAGE_OVERHEAD + len(tag) + len(message) - if self._bucket_level < 0: - sleep(-self._bucket_level / MAX_BYTES_PER_SECOND) - - self.android_log_write(prio, tag, message) diff --git a/Python314_4_x86_Template/Lib/_apple_support.py b/Python314_4_x86_Template/Lib/_apple_support.py deleted file mode 100644 index 92febdcf5..000000000 --- a/Python314_4_x86_Template/Lib/_apple_support.py +++ /dev/null @@ -1,66 +0,0 @@ -import io -import sys - - -def init_streams(log_write, stdout_level, stderr_level): - # Redirect stdout and stderr to the Apple system log. This method is - # invoked by init_apple_streams() (initconfig.c) if config->use_system_logger - # is enabled. - sys.stdout = SystemLog(log_write, stdout_level, errors=sys.stderr.errors) - sys.stderr = SystemLog(log_write, stderr_level, errors=sys.stderr.errors) - - -class SystemLog(io.TextIOWrapper): - def __init__(self, log_write, level, **kwargs): - kwargs.setdefault("encoding", "UTF-8") - kwargs.setdefault("line_buffering", True) - super().__init__(LogStream(log_write, level), **kwargs) - - def __repr__(self): - return f"" - - def write(self, s): - if not isinstance(s, str): - raise TypeError( - f"write() argument must be str, not {type(s).__name__}") - - # In case `s` is a str subclass that writes itself to stdout or stderr - # when we call its methods, convert it to an actual str. - s = str.__str__(s) - - # We want to emit one log message per line, so split - # the string before sending it to the superclass. - for line in s.splitlines(keepends=True): - super().write(line) - - return len(s) - - -class LogStream(io.RawIOBase): - def __init__(self, log_write, level): - self.log_write = log_write - self.level = level - - def __repr__(self): - return f"" - - def writable(self): - return True - - def write(self, b): - if type(b) is not bytes: - try: - b = bytes(memoryview(b)) - except TypeError: - raise TypeError( - f"write() argument must be bytes-like, not {type(b).__name__}" - ) from None - - # Writing an empty string to the stream should have no effect. - if b: - # Encode null bytes using "modified UTF-8" to avoid truncating the - # message. This should not affect the return value, as the caller - # may be expecting it to match the length of the input. - self.log_write(self.level, b.replace(b"\x00", b"\xc0\x80")) - - return len(b) diff --git a/Python314_4_x86_Template/Lib/_ast_unparse.py b/Python314_4_x86_Template/Lib/_ast_unparse.py deleted file mode 100644 index 1c8741b5a..000000000 --- a/Python314_4_x86_Template/Lib/_ast_unparse.py +++ /dev/null @@ -1,1161 +0,0 @@ -# This module contains ``ast.unparse()``, defined here -# to improve the import time for the ``ast`` module. -import sys -from _ast import * -from ast import NodeVisitor -from contextlib import contextmanager, nullcontext -from enum import IntEnum, auto, _simple_enum - -# Large float and imaginary literals get turned into infinities in the AST. -# We unparse those infinities to INFSTR. -_INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1) - -@_simple_enum(IntEnum) -class _Precedence: - """Precedence table that originated from python grammar.""" - - NAMED_EXPR = auto() # := - TUPLE = auto() # , - YIELD = auto() # 'yield', 'yield from' - TEST = auto() # 'if'-'else', 'lambda' - OR = auto() # 'or' - AND = auto() # 'and' - NOT = auto() # 'not' - CMP = auto() # '<', '>', '==', '>=', '<=', '!=', - # 'in', 'not in', 'is', 'is not' - EXPR = auto() - BOR = EXPR # '|' - BXOR = auto() # '^' - BAND = auto() # '&' - SHIFT = auto() # '<<', '>>' - ARITH = auto() # '+', '-' - TERM = auto() # '*', '@', '/', '%', '//' - FACTOR = auto() # unary '+', '-', '~' - POWER = auto() # '**' - AWAIT = auto() # 'await' - ATOM = auto() - - def next(self): - try: - return self.__class__(self + 1) - except ValueError: - return self - - -_SINGLE_QUOTES = ("'", '"') -_MULTI_QUOTES = ('"""', "'''") -_ALL_QUOTES = (*_SINGLE_QUOTES, *_MULTI_QUOTES) - -class Unparser(NodeVisitor): - """Methods in this class recursively traverse an AST and - output source code for the abstract syntax; original formatting - is disregarded.""" - - def __init__(self): - self._source = [] - self._precedences = {} - self._type_ignores = {} - self._indent = 0 - self._in_try_star = False - self._in_interactive = False - - def interleave(self, inter, f, seq): - """Call f on each item in seq, calling inter() in between.""" - seq = iter(seq) - try: - f(next(seq)) - except StopIteration: - pass - else: - for x in seq: - inter() - f(x) - - def items_view(self, traverser, items): - """Traverse and separate the given *items* with a comma and append it to - the buffer. If *items* is a single item sequence, a trailing comma - will be added.""" - if len(items) == 1: - traverser(items[0]) - self.write(",") - else: - self.interleave(lambda: self.write(", "), traverser, items) - - def maybe_newline(self): - """Adds a newline if it isn't the start of generated source""" - if self._source: - self.write("\n") - - def maybe_semicolon(self): - """Adds a "; " delimiter if it isn't the start of generated source""" - if self._source: - self.write("; ") - - def fill(self, text="", *, allow_semicolon=True): - """Indent a piece of text and append it, according to the current - indentation level, or only delineate with semicolon if applicable""" - if self._in_interactive and not self._indent and allow_semicolon: - self.maybe_semicolon() - self.write(text) - else: - self.maybe_newline() - self.write(" " * self._indent + text) - - def write(self, *text): - """Add new source parts""" - self._source.extend(text) - - @contextmanager - def buffered(self, buffer = None): - if buffer is None: - buffer = [] - - original_source = self._source - self._source = buffer - yield buffer - self._source = original_source - - @contextmanager - def block(self, *, extra = None): - """A context manager for preparing the source for blocks. It adds - the character':', increases the indentation on enter and decreases - the indentation on exit. If *extra* is given, it will be directly - appended after the colon character. - """ - self.write(":") - if extra: - self.write(extra) - self._indent += 1 - yield - self._indent -= 1 - - @contextmanager - def delimit(self, start, end): - """A context manager for preparing the source for expressions. It adds - *start* to the buffer and enters, after exit it adds *end*.""" - - self.write(start) - yield - self.write(end) - - def delimit_if(self, start, end, condition): - if condition: - return self.delimit(start, end) - else: - return nullcontext() - - def require_parens(self, precedence, node): - """Shortcut to adding precedence related parens""" - return self.delimit_if("(", ")", self.get_precedence(node) > precedence) - - def get_precedence(self, node): - return self._precedences.get(node, _Precedence.TEST) - - def set_precedence(self, precedence, *nodes): - for node in nodes: - self._precedences[node] = precedence - - def get_raw_docstring(self, node): - """If a docstring node is found in the body of the *node* parameter, - return that docstring node, None otherwise. - - Logic mirrored from ``_PyAST_GetDocString``.""" - if not isinstance( - node, (AsyncFunctionDef, FunctionDef, ClassDef, Module) - ) or len(node.body) < 1: - return None - node = node.body[0] - if not isinstance(node, Expr): - return None - node = node.value - if isinstance(node, Constant) and isinstance(node.value, str): - return node - - def get_type_comment(self, node): - comment = self._type_ignores.get(node.lineno) or node.type_comment - if comment is not None: - return f" # type: {comment}" - - def traverse(self, node): - if isinstance(node, list): - for item in node: - self.traverse(item) - else: - super().visit(node) - - # Note: as visit() resets the output text, do NOT rely on - # NodeVisitor.generic_visit to handle any nodes (as it calls back in to - # the subclass visit() method, which resets self._source to an empty list) - def visit(self, node): - """Outputs a source code string that, if converted back to an ast - (using ast.parse) will generate an AST equivalent to *node*""" - self._source = [] - self.traverse(node) - return "".join(self._source) - - def _write_docstring_and_traverse_body(self, node): - if (docstring := self.get_raw_docstring(node)): - self._write_docstring(docstring) - self.traverse(node.body[1:]) - else: - self.traverse(node.body) - - def visit_Module(self, node): - self._type_ignores = { - ignore.lineno: f"ignore{ignore.tag}" - for ignore in node.type_ignores - } - try: - self._write_docstring_and_traverse_body(node) - finally: - self._type_ignores.clear() - - def visit_Interactive(self, node): - self._in_interactive = True - try: - self._write_docstring_and_traverse_body(node) - finally: - self._in_interactive = False - - def visit_FunctionType(self, node): - with self.delimit("(", ")"): - self.interleave( - lambda: self.write(", "), self.traverse, node.argtypes - ) - - self.write(" -> ") - self.traverse(node.returns) - - def visit_Expr(self, node): - self.fill() - self.set_precedence(_Precedence.YIELD, node.value) - self.traverse(node.value) - - def visit_NamedExpr(self, node): - with self.require_parens(_Precedence.NAMED_EXPR, node): - self.set_precedence(_Precedence.ATOM, node.target, node.value) - self.traverse(node.target) - self.write(" := ") - self.traverse(node.value) - - def visit_Import(self, node): - self.fill("import ") - self.interleave(lambda: self.write(", "), self.traverse, node.names) - - def visit_ImportFrom(self, node): - self.fill("from ") - self.write("." * (node.level or 0)) - if node.module: - self.write(node.module) - self.write(" import ") - self.interleave(lambda: self.write(", "), self.traverse, node.names) - - def visit_Assign(self, node): - self.fill() - for target in node.targets: - self.set_precedence(_Precedence.TUPLE, target) - self.traverse(target) - self.write(" = ") - self.traverse(node.value) - if type_comment := self.get_type_comment(node): - self.write(type_comment) - - def visit_AugAssign(self, node): - self.fill() - self.traverse(node.target) - self.write(" " + self.binop[node.op.__class__.__name__] + "= ") - self.traverse(node.value) - - def visit_AnnAssign(self, node): - self.fill() - with self.delimit_if("(", ")", not node.simple and isinstance(node.target, Name)): - self.traverse(node.target) - self.write(": ") - self.traverse(node.annotation) - if node.value: - self.write(" = ") - self.traverse(node.value) - - def visit_Return(self, node): - self.fill("return") - if node.value: - self.write(" ") - self.traverse(node.value) - - def visit_Pass(self, node): - self.fill("pass") - - def visit_Break(self, node): - self.fill("break") - - def visit_Continue(self, node): - self.fill("continue") - - def visit_Delete(self, node): - self.fill("del ") - self.interleave(lambda: self.write(", "), self.traverse, node.targets) - - def visit_Assert(self, node): - self.fill("assert ") - self.traverse(node.test) - if node.msg: - self.write(", ") - self.traverse(node.msg) - - def visit_Global(self, node): - self.fill("global ") - self.interleave(lambda: self.write(", "), self.write, node.names) - - def visit_Nonlocal(self, node): - self.fill("nonlocal ") - self.interleave(lambda: self.write(", "), self.write, node.names) - - def visit_Await(self, node): - with self.require_parens(_Precedence.AWAIT, node): - self.write("await") - if node.value: - self.write(" ") - self.set_precedence(_Precedence.ATOM, node.value) - self.traverse(node.value) - - def visit_Yield(self, node): - with self.require_parens(_Precedence.YIELD, node): - self.write("yield") - if node.value: - self.write(" ") - self.set_precedence(_Precedence.ATOM, node.value) - self.traverse(node.value) - - def visit_YieldFrom(self, node): - with self.require_parens(_Precedence.YIELD, node): - self.write("yield from ") - if not node.value: - raise ValueError("Node can't be used without a value attribute.") - self.set_precedence(_Precedence.ATOM, node.value) - self.traverse(node.value) - - def visit_Raise(self, node): - self.fill("raise") - if not node.exc: - if node.cause: - raise ValueError(f"Node can't use cause without an exception.") - return - self.write(" ") - self.traverse(node.exc) - if node.cause: - self.write(" from ") - self.traverse(node.cause) - - def do_visit_try(self, node): - self.fill("try", allow_semicolon=False) - with self.block(): - self.traverse(node.body) - for ex in node.handlers: - self.traverse(ex) - if node.orelse: - self.fill("else", allow_semicolon=False) - with self.block(): - self.traverse(node.orelse) - if node.finalbody: - self.fill("finally", allow_semicolon=False) - with self.block(): - self.traverse(node.finalbody) - - def visit_Try(self, node): - prev_in_try_star = self._in_try_star - try: - self._in_try_star = False - self.do_visit_try(node) - finally: - self._in_try_star = prev_in_try_star - - def visit_TryStar(self, node): - prev_in_try_star = self._in_try_star - try: - self._in_try_star = True - self.do_visit_try(node) - finally: - self._in_try_star = prev_in_try_star - - def visit_ExceptHandler(self, node): - self.fill("except*" if self._in_try_star else "except", allow_semicolon=False) - if node.type: - self.write(" ") - self.traverse(node.type) - if node.name: - self.write(" as ") - self.write(node.name) - with self.block(): - self.traverse(node.body) - - def visit_ClassDef(self, node): - self.maybe_newline() - for deco in node.decorator_list: - self.fill("@", allow_semicolon=False) - self.traverse(deco) - self.fill("class " + node.name, allow_semicolon=False) - if hasattr(node, "type_params"): - self._type_params_helper(node.type_params) - with self.delimit_if("(", ")", condition = node.bases or node.keywords): - comma = False - for e in node.bases: - if comma: - self.write(", ") - else: - comma = True - self.traverse(e) - for e in node.keywords: - if comma: - self.write(", ") - else: - comma = True - self.traverse(e) - - with self.block(): - self._write_docstring_and_traverse_body(node) - - def visit_FunctionDef(self, node): - self._function_helper(node, "def") - - def visit_AsyncFunctionDef(self, node): - self._function_helper(node, "async def") - - def _function_helper(self, node, fill_suffix): - self.maybe_newline() - for deco in node.decorator_list: - self.fill("@", allow_semicolon=False) - self.traverse(deco) - def_str = fill_suffix + " " + node.name - self.fill(def_str, allow_semicolon=False) - if hasattr(node, "type_params"): - self._type_params_helper(node.type_params) - with self.delimit("(", ")"): - self.traverse(node.args) - if node.returns: - self.write(" -> ") - self.traverse(node.returns) - with self.block(extra=self.get_type_comment(node)): - self._write_docstring_and_traverse_body(node) - - def _type_params_helper(self, type_params): - if type_params is not None and len(type_params) > 0: - with self.delimit("[", "]"): - self.interleave(lambda: self.write(", "), self.traverse, type_params) - - def visit_TypeVar(self, node): - self.write(node.name) - if node.bound: - self.write(": ") - self.traverse(node.bound) - if node.default_value: - self.write(" = ") - self.traverse(node.default_value) - - def visit_TypeVarTuple(self, node): - self.write("*" + node.name) - if node.default_value: - self.write(" = ") - self.traverse(node.default_value) - - def visit_ParamSpec(self, node): - self.write("**" + node.name) - if node.default_value: - self.write(" = ") - self.traverse(node.default_value) - - def visit_TypeAlias(self, node): - self.fill("type ") - self.traverse(node.name) - self._type_params_helper(node.type_params) - self.write(" = ") - self.traverse(node.value) - - def visit_For(self, node): - self._for_helper("for ", node) - - def visit_AsyncFor(self, node): - self._for_helper("async for ", node) - - def _for_helper(self, fill, node): - self.fill(fill, allow_semicolon=False) - self.set_precedence(_Precedence.TUPLE, node.target) - self.traverse(node.target) - self.write(" in ") - self.traverse(node.iter) - with self.block(extra=self.get_type_comment(node)): - self.traverse(node.body) - if node.orelse: - self.fill("else", allow_semicolon=False) - with self.block(): - self.traverse(node.orelse) - - def visit_If(self, node): - self.fill("if ", allow_semicolon=False) - self.traverse(node.test) - with self.block(): - self.traverse(node.body) - # collapse nested ifs into equivalent elifs. - while node.orelse and len(node.orelse) == 1 and isinstance(node.orelse[0], If): - node = node.orelse[0] - self.fill("elif ", allow_semicolon=False) - self.traverse(node.test) - with self.block(): - self.traverse(node.body) - # final else - if node.orelse: - self.fill("else", allow_semicolon=False) - with self.block(): - self.traverse(node.orelse) - - def visit_While(self, node): - self.fill("while ", allow_semicolon=False) - self.traverse(node.test) - with self.block(): - self.traverse(node.body) - if node.orelse: - self.fill("else", allow_semicolon=False) - with self.block(): - self.traverse(node.orelse) - - def visit_With(self, node): - self.fill("with ", allow_semicolon=False) - self.interleave(lambda: self.write(", "), self.traverse, node.items) - with self.block(extra=self.get_type_comment(node)): - self.traverse(node.body) - - def visit_AsyncWith(self, node): - self.fill("async with ", allow_semicolon=False) - self.interleave(lambda: self.write(", "), self.traverse, node.items) - with self.block(extra=self.get_type_comment(node)): - self.traverse(node.body) - - def _str_literal_helper( - self, string, *, quote_types=_ALL_QUOTES, escape_special_whitespace=False - ): - """Helper for writing string literals, minimizing escapes. - Returns the tuple (string literal to write, possible quote types). - """ - def escape_char(c): - # \n and \t are non-printable, but we only escape them if - # escape_special_whitespace is True - if not escape_special_whitespace and c in "\n\t": - return c - # Always escape backslashes and other non-printable characters - if c == "\\" or not c.isprintable(): - return c.encode("unicode_escape").decode("ascii") - return c - - escaped_string = "".join(map(escape_char, string)) - possible_quotes = quote_types - if "\n" in escaped_string: - possible_quotes = [q for q in possible_quotes if q in _MULTI_QUOTES] - possible_quotes = [q for q in possible_quotes if q not in escaped_string] - if not possible_quotes: - # If there aren't any possible_quotes, fallback to using repr - # on the original string. Try to use a quote from quote_types, - # e.g., so that we use triple quotes for docstrings. - string = repr(string) - quote = next((q for q in quote_types if string[0] in q), string[0]) - return string[1:-1], [quote] - if escaped_string: - # Sort so that we prefer '''"''' over """\"""" - possible_quotes.sort(key=lambda q: q[0] == escaped_string[-1]) - # If we're using triple quotes and we'd need to escape a final - # quote, escape it - if possible_quotes[0][0] == escaped_string[-1]: - assert len(possible_quotes[0]) == 3 - escaped_string = escaped_string[:-1] + "\\" + escaped_string[-1] - return escaped_string, possible_quotes - - def _write_str_avoiding_backslashes(self, string, *, quote_types=_ALL_QUOTES): - """Write string literal value with a best effort attempt to avoid backslashes.""" - string, quote_types = self._str_literal_helper(string, quote_types=quote_types) - quote_type = quote_types[0] - self.write(f"{quote_type}{string}{quote_type}") - - def _ftstring_helper(self, parts): - new_parts = [] - quote_types = list(_ALL_QUOTES) - fallback_to_repr = False - for value, is_constant in parts: - if is_constant: - value, new_quote_types = self._str_literal_helper( - value, - quote_types=quote_types, - escape_special_whitespace=True, - ) - if set(new_quote_types).isdisjoint(quote_types): - fallback_to_repr = True - break - quote_types = new_quote_types - else: - if "\n" in value: - quote_types = [q for q in quote_types if q in _MULTI_QUOTES] - assert quote_types - - new_quote_types = [q for q in quote_types if q not in value] - if new_quote_types: - quote_types = new_quote_types - new_parts.append(value) - - if fallback_to_repr: - # If we weren't able to find a quote type that works for all parts - # of the JoinedStr, fallback to using repr and triple single quotes. - quote_types = ["'''"] - new_parts.clear() - for value, is_constant in parts: - if is_constant: - value = repr('"' + value) # force repr to use single quotes - expected_prefix = "'\"" - assert value.startswith(expected_prefix), repr(value) - value = value[len(expected_prefix):-1] - new_parts.append(value) - - value = "".join(new_parts) - quote_type = quote_types[0] - self.write(f"{quote_type}{value}{quote_type}") - - def _write_ftstring(self, values, prefix): - self.write(prefix) - fstring_parts = [] - for value in values: - with self.buffered() as buffer: - self._write_ftstring_inner(value) - fstring_parts.append( - ("".join(buffer), isinstance(value, Constant)) - ) - self._ftstring_helper(fstring_parts) - - def visit_JoinedStr(self, node): - self._write_ftstring(node.values, "f") - - def visit_TemplateStr(self, node): - self._write_ftstring(node.values, "t") - - def _write_ftstring_inner(self, node, is_format_spec=False): - if isinstance(node, JoinedStr): - # for both the f-string itself, and format_spec - for value in node.values: - self._write_ftstring_inner(value, is_format_spec=is_format_spec) - elif isinstance(node, Constant) and isinstance(node.value, str): - value = node.value.replace("{", "{{").replace("}", "}}") - - if is_format_spec: - value = value.replace("\\", "\\\\") - value = value.replace("'", "\\'") - value = value.replace('"', '\\"') - value = value.replace("\n", "\\n") - self.write(value) - elif isinstance(node, FormattedValue): - self.visit_FormattedValue(node) - elif isinstance(node, Interpolation): - self.visit_Interpolation(node) - else: - raise ValueError(f"Unexpected node inside JoinedStr, {node!r}") - - def _unparse_interpolation_value(self, inner): - unparser = type(self)() - unparser.set_precedence(_Precedence.TEST.next(), inner) - return unparser.visit(inner) - - def _write_interpolation(self, node, use_str_attr=False): - with self.delimit("{", "}"): - if use_str_attr: - expr = node.str - else: - expr = self._unparse_interpolation_value(node.value) - if expr.startswith("{"): - # Separate pair of opening brackets as "{ {" - self.write(" ") - self.write(expr) - if node.conversion != -1: - self.write(f"!{chr(node.conversion)}") - if node.format_spec: - self.write(":") - self._write_ftstring_inner(node.format_spec, is_format_spec=True) - - def visit_FormattedValue(self, node): - self._write_interpolation(node) - - def visit_Interpolation(self, node): - # If `str` is set to `None`, use the `value` to generate the source code. - self._write_interpolation(node, use_str_attr=node.str is not None) - - def visit_Name(self, node): - self.write(node.id) - - def _write_docstring(self, node): - self.fill(allow_semicolon=False) - if node.kind == "u": - self.write("u") - self._write_str_avoiding_backslashes(node.value, quote_types=_MULTI_QUOTES) - - def _write_constant(self, value): - if isinstance(value, (float, complex)): - # Substitute overflowing decimal literal for AST infinities, - # and inf - inf for NaNs. - self.write( - repr(value) - .replace("inf", _INFSTR) - .replace("nan", f"({_INFSTR}-{_INFSTR})") - ) - else: - self.write(repr(value)) - - def visit_Constant(self, node): - value = node.value - if isinstance(value, tuple): - with self.delimit("(", ")"): - self.items_view(self._write_constant, value) - elif value is ...: - self.write("...") - else: - if node.kind == "u": - self.write("u") - self._write_constant(node.value) - - def visit_List(self, node): - with self.delimit("[", "]"): - self.interleave(lambda: self.write(", "), self.traverse, node.elts) - - def visit_ListComp(self, node): - with self.delimit("[", "]"): - self.traverse(node.elt) - for gen in node.generators: - self.traverse(gen) - - def visit_GeneratorExp(self, node): - with self.delimit("(", ")"): - self.traverse(node.elt) - for gen in node.generators: - self.traverse(gen) - - def visit_SetComp(self, node): - with self.delimit("{", "}"): - self.traverse(node.elt) - for gen in node.generators: - self.traverse(gen) - - def visit_DictComp(self, node): - with self.delimit("{", "}"): - self.traverse(node.key) - self.write(": ") - self.traverse(node.value) - for gen in node.generators: - self.traverse(gen) - - def visit_comprehension(self, node): - if node.is_async: - self.write(" async for ") - else: - self.write(" for ") - self.set_precedence(_Precedence.TUPLE, node.target) - self.traverse(node.target) - self.write(" in ") - self.set_precedence(_Precedence.TEST.next(), node.iter, *node.ifs) - self.traverse(node.iter) - for if_clause in node.ifs: - self.write(" if ") - self.traverse(if_clause) - - def visit_IfExp(self, node): - with self.require_parens(_Precedence.TEST, node): - self.set_precedence(_Precedence.TEST.next(), node.body, node.test) - self.traverse(node.body) - self.write(" if ") - self.traverse(node.test) - self.write(" else ") - self.set_precedence(_Precedence.TEST, node.orelse) - self.traverse(node.orelse) - - def visit_Set(self, node): - if node.elts: - with self.delimit("{", "}"): - self.interleave(lambda: self.write(", "), self.traverse, node.elts) - else: - # `{}` would be interpreted as a dictionary literal, and - # `set` might be shadowed. Thus: - self.write('{*()}') - - def visit_Dict(self, node): - def write_key_value_pair(k, v): - self.traverse(k) - self.write(": ") - self.traverse(v) - - def write_item(item): - k, v = item - if k is None: - # for dictionary unpacking operator in dicts {**{'y': 2}} - # see PEP 448 for details - self.write("**") - self.set_precedence(_Precedence.EXPR, v) - self.traverse(v) - else: - write_key_value_pair(k, v) - - with self.delimit("{", "}"): - self.interleave( - lambda: self.write(", "), write_item, zip(node.keys, node.values) - ) - - def visit_Tuple(self, node): - with self.delimit_if( - "(", - ")", - len(node.elts) == 0 or self.get_precedence(node) > _Precedence.TUPLE - ): - self.items_view(self.traverse, node.elts) - - unop = {"Invert": "~", "Not": "not", "UAdd": "+", "USub": "-"} - unop_precedence = { - "not": _Precedence.NOT, - "~": _Precedence.FACTOR, - "+": _Precedence.FACTOR, - "-": _Precedence.FACTOR, - } - - def visit_UnaryOp(self, node): - operator = self.unop[node.op.__class__.__name__] - operator_precedence = self.unop_precedence[operator] - with self.require_parens(operator_precedence, node): - self.write(operator) - # factor prefixes (+, -, ~) shouldn't be separated - # from the value they belong, (e.g: +1 instead of + 1) - if operator_precedence is not _Precedence.FACTOR: - self.write(" ") - self.set_precedence(operator_precedence, node.operand) - self.traverse(node.operand) - - binop = { - "Add": "+", - "Sub": "-", - "Mult": "*", - "MatMult": "@", - "Div": "/", - "Mod": "%", - "LShift": "<<", - "RShift": ">>", - "BitOr": "|", - "BitXor": "^", - "BitAnd": "&", - "FloorDiv": "//", - "Pow": "**", - } - - binop_precedence = { - "+": _Precedence.ARITH, - "-": _Precedence.ARITH, - "*": _Precedence.TERM, - "@": _Precedence.TERM, - "/": _Precedence.TERM, - "%": _Precedence.TERM, - "<<": _Precedence.SHIFT, - ">>": _Precedence.SHIFT, - "|": _Precedence.BOR, - "^": _Precedence.BXOR, - "&": _Precedence.BAND, - "//": _Precedence.TERM, - "**": _Precedence.POWER, - } - - binop_rassoc = frozenset(("**",)) - def visit_BinOp(self, node): - operator = self.binop[node.op.__class__.__name__] - operator_precedence = self.binop_precedence[operator] - with self.require_parens(operator_precedence, node): - if operator in self.binop_rassoc: - left_precedence = operator_precedence.next() - right_precedence = operator_precedence - else: - left_precedence = operator_precedence - right_precedence = operator_precedence.next() - - self.set_precedence(left_precedence, node.left) - self.traverse(node.left) - self.write(f" {operator} ") - self.set_precedence(right_precedence, node.right) - self.traverse(node.right) - - cmpops = { - "Eq": "==", - "NotEq": "!=", - "Lt": "<", - "LtE": "<=", - "Gt": ">", - "GtE": ">=", - "Is": "is", - "IsNot": "is not", - "In": "in", - "NotIn": "not in", - } - - def visit_Compare(self, node): - with self.require_parens(_Precedence.CMP, node): - self.set_precedence(_Precedence.CMP.next(), node.left, *node.comparators) - self.traverse(node.left) - for o, e in zip(node.ops, node.comparators): - self.write(" " + self.cmpops[o.__class__.__name__] + " ") - self.traverse(e) - - boolops = {"And": "and", "Or": "or"} - boolop_precedence = {"and": _Precedence.AND, "or": _Precedence.OR} - - def visit_BoolOp(self, node): - operator = self.boolops[node.op.__class__.__name__] - operator_precedence = self.boolop_precedence[operator] - - def increasing_level_traverse(node): - nonlocal operator_precedence - operator_precedence = operator_precedence.next() - self.set_precedence(operator_precedence, node) - self.traverse(node) - - with self.require_parens(operator_precedence, node): - s = f" {operator} " - self.interleave(lambda: self.write(s), increasing_level_traverse, node.values) - - def visit_Attribute(self, node): - self.set_precedence(_Precedence.ATOM, node.value) - self.traverse(node.value) - # Special case: 3.__abs__() is a syntax error, so if node.value - # is an integer literal then we need to either parenthesize - # it or add an extra space to get 3 .__abs__(). - if isinstance(node.value, Constant) and isinstance(node.value.value, int): - self.write(" ") - self.write(".") - self.write(node.attr) - - def visit_Call(self, node): - self.set_precedence(_Precedence.ATOM, node.func) - self.traverse(node.func) - with self.delimit("(", ")"): - comma = False - for e in node.args: - if comma: - self.write(", ") - else: - comma = True - self.traverse(e) - for e in node.keywords: - if comma: - self.write(", ") - else: - comma = True - self.traverse(e) - - def visit_Subscript(self, node): - def is_non_empty_tuple(slice_value): - return ( - isinstance(slice_value, Tuple) - and slice_value.elts - ) - - self.set_precedence(_Precedence.ATOM, node.value) - self.traverse(node.value) - with self.delimit("[", "]"): - if is_non_empty_tuple(node.slice): - # parentheses can be omitted if the tuple isn't empty - self.items_view(self.traverse, node.slice.elts) - else: - self.traverse(node.slice) - - def visit_Starred(self, node): - self.write("*") - self.set_precedence(_Precedence.EXPR, node.value) - self.traverse(node.value) - - def visit_Ellipsis(self, node): - self.write("...") - - def visit_Slice(self, node): - if node.lower: - self.traverse(node.lower) - self.write(":") - if node.upper: - self.traverse(node.upper) - if node.step: - self.write(":") - self.traverse(node.step) - - def visit_Match(self, node): - self.fill("match ", allow_semicolon=False) - self.traverse(node.subject) - with self.block(): - for case in node.cases: - self.traverse(case) - - def visit_arg(self, node): - self.write(node.arg) - if node.annotation: - self.write(": ") - self.traverse(node.annotation) - - def visit_arguments(self, node): - first = True - # normal arguments - all_args = node.posonlyargs + node.args - defaults = [None] * (len(all_args) - len(node.defaults)) + node.defaults - for index, elements in enumerate(zip(all_args, defaults), 1): - a, d = elements - if first: - first = False - else: - self.write(", ") - self.traverse(a) - if d: - self.write("=") - self.traverse(d) - if index == len(node.posonlyargs): - self.write(", /") - - # varargs, or bare '*' if no varargs but keyword-only arguments present - if node.vararg or node.kwonlyargs: - if first: - first = False - else: - self.write(", ") - self.write("*") - if node.vararg: - self.write(node.vararg.arg) - if node.vararg.annotation: - self.write(": ") - self.traverse(node.vararg.annotation) - - # keyword-only arguments - if node.kwonlyargs: - for a, d in zip(node.kwonlyargs, node.kw_defaults): - self.write(", ") - self.traverse(a) - if d: - self.write("=") - self.traverse(d) - - # kwargs - if node.kwarg: - if first: - first = False - else: - self.write(", ") - self.write("**" + node.kwarg.arg) - if node.kwarg.annotation: - self.write(": ") - self.traverse(node.kwarg.annotation) - - def visit_keyword(self, node): - if node.arg is None: - self.write("**") - else: - self.write(node.arg) - self.write("=") - self.traverse(node.value) - - def visit_Lambda(self, node): - with self.require_parens(_Precedence.TEST, node): - self.write("lambda") - with self.buffered() as buffer: - self.traverse(node.args) - if buffer: - self.write(" ", *buffer) - self.write(": ") - self.set_precedence(_Precedence.TEST, node.body) - self.traverse(node.body) - - def visit_alias(self, node): - self.write(node.name) - if node.asname: - self.write(" as " + node.asname) - - def visit_withitem(self, node): - self.traverse(node.context_expr) - if node.optional_vars: - self.write(" as ") - self.traverse(node.optional_vars) - - def visit_match_case(self, node): - self.fill("case ", allow_semicolon=False) - self.traverse(node.pattern) - if node.guard: - self.write(" if ") - self.traverse(node.guard) - with self.block(): - self.traverse(node.body) - - def visit_MatchValue(self, node): - self.traverse(node.value) - - def visit_MatchSingleton(self, node): - self._write_constant(node.value) - - def visit_MatchSequence(self, node): - with self.delimit("[", "]"): - self.interleave( - lambda: self.write(", "), self.traverse, node.patterns - ) - - def visit_MatchStar(self, node): - name = node.name - if name is None: - name = "_" - self.write(f"*{name}") - - def visit_MatchMapping(self, node): - def write_key_pattern_pair(pair): - k, p = pair - self.traverse(k) - self.write(": ") - self.traverse(p) - - with self.delimit("{", "}"): - keys = node.keys - self.interleave( - lambda: self.write(", "), - write_key_pattern_pair, - zip(keys, node.patterns, strict=True), - ) - rest = node.rest - if rest is not None: - if keys: - self.write(", ") - self.write(f"**{rest}") - - def visit_MatchClass(self, node): - self.set_precedence(_Precedence.ATOM, node.cls) - self.traverse(node.cls) - with self.delimit("(", ")"): - patterns = node.patterns - self.interleave( - lambda: self.write(", "), self.traverse, patterns - ) - attrs = node.kwd_attrs - if attrs: - def write_attr_pattern(pair): - attr, pattern = pair - self.write(f"{attr}=") - self.traverse(pattern) - - if patterns: - self.write(", ") - self.interleave( - lambda: self.write(", "), - write_attr_pattern, - zip(attrs, node.kwd_patterns, strict=True), - ) - - def visit_MatchAs(self, node): - name = node.name - pattern = node.pattern - if name is None: - self.write("_") - elif pattern is None: - self.write(node.name) - else: - with self.require_parens(_Precedence.TEST, node): - self.set_precedence(_Precedence.BOR, node.pattern) - self.traverse(node.pattern) - self.write(f" as {node.name}") - - def visit_MatchOr(self, node): - with self.require_parens(_Precedence.BOR, node): - self.set_precedence(_Precedence.BOR.next(), *node.patterns) - self.interleave(lambda: self.write(" | "), self.traverse, node.patterns) diff --git a/Python314_4_x86_Template/Lib/_collections_abc.py b/Python314_4_x86_Template/Lib/_collections_abc.py deleted file mode 100644 index 241d40d57..000000000 --- a/Python314_4_x86_Template/Lib/_collections_abc.py +++ /dev/null @@ -1,1167 +0,0 @@ -# Copyright 2007 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Abstract Base Classes (ABCs) for collections, according to PEP 3119. - -Unit tests are in test_collections. -""" - -############ Maintenance notes ######################################### -# -# ABCs are different from other standard library modules in that they -# specify compliance tests. In general, once an ABC has been published, -# new methods (either abstract or concrete) cannot be added. -# -# Though classes that inherit from an ABC would automatically receive a -# new mixin method, registered classes would become non-compliant and -# violate the contract promised by ``isinstance(someobj, SomeABC)``. -# -# Though irritating, the correct procedure for adding new abstract or -# mixin methods is to create a new ABC as a subclass of the previous -# ABC. For example, union(), intersection(), and difference() cannot -# be added to Set but could go into a new ABC that extends Set. -# -# Because they are so hard to change, new ABCs should have their APIs -# carefully thought through prior to publication. -# -# Since ABCMeta only checks for the presence of methods, it is possible -# to alter the signature of a method by adding optional arguments -# or changing parameters names. This is still a bit dubious but at -# least it won't cause isinstance() to return an incorrect result. -# -# -####################################################################### - -from abc import ABCMeta, abstractmethod -import sys - -GenericAlias = type(list[int]) -EllipsisType = type(...) -def _f(): pass -FunctionType = type(_f) -del _f - -__all__ = ["Awaitable", "Coroutine", - "AsyncIterable", "AsyncIterator", "AsyncGenerator", - "Hashable", "Iterable", "Iterator", "Generator", "Reversible", - "Sized", "Container", "Callable", "Collection", - "Set", "MutableSet", - "Mapping", "MutableMapping", - "MappingView", "KeysView", "ItemsView", "ValuesView", - "Sequence", "MutableSequence", - "ByteString", "Buffer", - ] - -# This module has been renamed from collections.abc to _collections_abc to -# speed up interpreter startup. Some of the types such as MutableMapping are -# required early but collections module imports a lot of other modules. -# See issue #19218 -__name__ = "collections.abc" - -# Private list of types that we want to register with the various ABCs -# so that they will pass tests like: -# it = iter(somebytearray) -# assert isinstance(it, Iterable) -# Note: in other implementations, these types might not be distinct -# and they may have their own implementation specific types that -# are not included on this list. -bytes_iterator = type(iter(b'')) -bytearray_iterator = type(iter(bytearray())) -#callable_iterator = ??? -dict_keyiterator = type(iter({}.keys())) -dict_valueiterator = type(iter({}.values())) -dict_itemiterator = type(iter({}.items())) -list_iterator = type(iter([])) -list_reverseiterator = type(iter(reversed([]))) -range_iterator = type(iter(range(0))) -longrange_iterator = type(iter(range(1 << 1000))) -set_iterator = type(iter(set())) -str_iterator = type(iter("")) -tuple_iterator = type(iter(())) -zip_iterator = type(iter(zip())) -## views ## -dict_keys = type({}.keys()) -dict_values = type({}.values()) -dict_items = type({}.items()) -## misc ## -mappingproxy = type(type.__dict__) -def _get_framelocalsproxy(): - return type(sys._getframe().f_locals) -framelocalsproxy = _get_framelocalsproxy() -del _get_framelocalsproxy -generator = type((lambda: (yield))()) -## coroutine ## -async def _coro(): pass -_coro = _coro() -coroutine = type(_coro) -_coro.close() # Prevent ResourceWarning -del _coro -## asynchronous generator ## -async def _ag(): yield -_ag = _ag() -async_generator = type(_ag) -del _ag - - -### ONE-TRICK PONIES ### - -def _check_methods(C, *methods): - mro = C.__mro__ - for method in methods: - for B in mro: - if method in B.__dict__: - if B.__dict__[method] is None: - return NotImplemented - break - else: - return NotImplemented - return True - -class Hashable(metaclass=ABCMeta): - - __slots__ = () - - @abstractmethod - def __hash__(self): - return 0 - - @classmethod - def __subclasshook__(cls, C): - if cls is Hashable: - return _check_methods(C, "__hash__") - return NotImplemented - - -class Awaitable(metaclass=ABCMeta): - - __slots__ = () - - @abstractmethod - def __await__(self): - yield - - @classmethod - def __subclasshook__(cls, C): - if cls is Awaitable: - return _check_methods(C, "__await__") - return NotImplemented - - __class_getitem__ = classmethod(GenericAlias) - - -class Coroutine(Awaitable): - - __slots__ = () - - @abstractmethod - def send(self, value): - """Send a value into the coroutine. - Return next yielded value or raise StopIteration. - """ - raise StopIteration - - @abstractmethod - def throw(self, typ, val=None, tb=None): - """Raise an exception in the coroutine. - Return next yielded value or raise StopIteration. - """ - if val is None: - if tb is None: - raise typ - val = typ() - if tb is not None: - val = val.with_traceback(tb) - raise val - - def close(self): - """Raise GeneratorExit inside coroutine. - """ - try: - self.throw(GeneratorExit) - except (GeneratorExit, StopIteration): - pass - else: - raise RuntimeError("coroutine ignored GeneratorExit") - - @classmethod - def __subclasshook__(cls, C): - if cls is Coroutine: - return _check_methods(C, '__await__', 'send', 'throw', 'close') - return NotImplemented - - -Coroutine.register(coroutine) - - -class AsyncIterable(metaclass=ABCMeta): - - __slots__ = () - - @abstractmethod - def __aiter__(self): - return AsyncIterator() - - @classmethod - def __subclasshook__(cls, C): - if cls is AsyncIterable: - return _check_methods(C, "__aiter__") - return NotImplemented - - __class_getitem__ = classmethod(GenericAlias) - - -class AsyncIterator(AsyncIterable): - - __slots__ = () - - @abstractmethod - async def __anext__(self): - """Return the next item or raise StopAsyncIteration when exhausted.""" - raise StopAsyncIteration - - def __aiter__(self): - return self - - @classmethod - def __subclasshook__(cls, C): - if cls is AsyncIterator: - return _check_methods(C, "__anext__", "__aiter__") - return NotImplemented - - -class AsyncGenerator(AsyncIterator): - - __slots__ = () - - async def __anext__(self): - """Return the next item from the asynchronous generator. - When exhausted, raise StopAsyncIteration. - """ - return await self.asend(None) - - @abstractmethod - async def asend(self, value): - """Send a value into the asynchronous generator. - Return next yielded value or raise StopAsyncIteration. - """ - raise StopAsyncIteration - - @abstractmethod - async def athrow(self, typ, val=None, tb=None): - """Raise an exception in the asynchronous generator. - Return next yielded value or raise StopAsyncIteration. - """ - if val is None: - if tb is None: - raise typ - val = typ() - if tb is not None: - val = val.with_traceback(tb) - raise val - - async def aclose(self): - """Raise GeneratorExit inside coroutine. - """ - try: - await self.athrow(GeneratorExit) - except (GeneratorExit, StopAsyncIteration): - pass - else: - raise RuntimeError("asynchronous generator ignored GeneratorExit") - - @classmethod - def __subclasshook__(cls, C): - if cls is AsyncGenerator: - return _check_methods(C, '__aiter__', '__anext__', - 'asend', 'athrow', 'aclose') - return NotImplemented - - -AsyncGenerator.register(async_generator) - - -class Iterable(metaclass=ABCMeta): - - __slots__ = () - - @abstractmethod - def __iter__(self): - while False: - yield None - - @classmethod - def __subclasshook__(cls, C): - if cls is Iterable: - return _check_methods(C, "__iter__") - return NotImplemented - - __class_getitem__ = classmethod(GenericAlias) - - -class Iterator(Iterable): - - __slots__ = () - - @abstractmethod - def __next__(self): - 'Return the next item from the iterator. When exhausted, raise StopIteration' - raise StopIteration - - def __iter__(self): - return self - - @classmethod - def __subclasshook__(cls, C): - if cls is Iterator: - return _check_methods(C, '__iter__', '__next__') - return NotImplemented - - -Iterator.register(bytes_iterator) -Iterator.register(bytearray_iterator) -#Iterator.register(callable_iterator) -Iterator.register(dict_keyiterator) -Iterator.register(dict_valueiterator) -Iterator.register(dict_itemiterator) -Iterator.register(list_iterator) -Iterator.register(list_reverseiterator) -Iterator.register(range_iterator) -Iterator.register(longrange_iterator) -Iterator.register(set_iterator) -Iterator.register(str_iterator) -Iterator.register(tuple_iterator) -Iterator.register(zip_iterator) - - -class Reversible(Iterable): - - __slots__ = () - - @abstractmethod - def __reversed__(self): - while False: - yield None - - @classmethod - def __subclasshook__(cls, C): - if cls is Reversible: - return _check_methods(C, "__reversed__", "__iter__") - return NotImplemented - - -class Generator(Iterator): - - __slots__ = () - - def __next__(self): - """Return the next item from the generator. - When exhausted, raise StopIteration. - """ - return self.send(None) - - @abstractmethod - def send(self, value): - """Send a value into the generator. - Return next yielded value or raise StopIteration. - """ - raise StopIteration - - @abstractmethod - def throw(self, typ, val=None, tb=None): - """Raise an exception in the generator. - Return next yielded value or raise StopIteration. - """ - if val is None: - if tb is None: - raise typ - val = typ() - if tb is not None: - val = val.with_traceback(tb) - raise val - - def close(self): - """Raise GeneratorExit inside generator. - """ - try: - self.throw(GeneratorExit) - except (GeneratorExit, StopIteration): - pass - else: - raise RuntimeError("generator ignored GeneratorExit") - - @classmethod - def __subclasshook__(cls, C): - if cls is Generator: - return _check_methods(C, '__iter__', '__next__', - 'send', 'throw', 'close') - return NotImplemented - - -Generator.register(generator) - - -class Sized(metaclass=ABCMeta): - - __slots__ = () - - @abstractmethod - def __len__(self): - return 0 - - @classmethod - def __subclasshook__(cls, C): - if cls is Sized: - return _check_methods(C, "__len__") - return NotImplemented - - -class Container(metaclass=ABCMeta): - - __slots__ = () - - @abstractmethod - def __contains__(self, x): - return False - - @classmethod - def __subclasshook__(cls, C): - if cls is Container: - return _check_methods(C, "__contains__") - return NotImplemented - - __class_getitem__ = classmethod(GenericAlias) - - -class Collection(Sized, Iterable, Container): - - __slots__ = () - - @classmethod - def __subclasshook__(cls, C): - if cls is Collection: - return _check_methods(C, "__len__", "__iter__", "__contains__") - return NotImplemented - - -class Buffer(metaclass=ABCMeta): - - __slots__ = () - - @abstractmethod - def __buffer__(self, flags: int, /) -> memoryview: - raise NotImplementedError - - @classmethod - def __subclasshook__(cls, C): - if cls is Buffer: - return _check_methods(C, "__buffer__") - return NotImplemented - - -class _CallableGenericAlias(GenericAlias): - """ Represent `Callable[argtypes, resulttype]`. - - This sets ``__args__`` to a tuple containing the flattened ``argtypes`` - followed by ``resulttype``. - - Example: ``Callable[[int, str], float]`` sets ``__args__`` to - ``(int, str, float)``. - """ - - __slots__ = () - - def __new__(cls, origin, args): - if not (isinstance(args, tuple) and len(args) == 2): - raise TypeError( - "Callable must be used as Callable[[arg, ...], result].") - t_args, t_result = args - if isinstance(t_args, (tuple, list)): - args = (*t_args, t_result) - elif not _is_param_expr(t_args): - raise TypeError(f"Expected a list of types, an ellipsis, " - f"ParamSpec, or Concatenate. Got {t_args}") - return super().__new__(cls, origin, args) - - def __repr__(self): - if len(self.__args__) == 2 and _is_param_expr(self.__args__[0]): - return super().__repr__() - from annotationlib import type_repr - return (f'collections.abc.Callable' - f'[[{", ".join([type_repr(a) for a in self.__args__[:-1]])}], ' - f'{type_repr(self.__args__[-1])}]') - - def __reduce__(self): - args = self.__args__ - if not (len(args) == 2 and _is_param_expr(args[0])): - args = list(args[:-1]), args[-1] - return _CallableGenericAlias, (Callable, args) - - def __getitem__(self, item): - # Called during TypeVar substitution, returns the custom subclass - # rather than the default types.GenericAlias object. Most of the - # code is copied from typing's _GenericAlias and the builtin - # types.GenericAlias. - if not isinstance(item, tuple): - item = (item,) - - new_args = super().__getitem__(item).__args__ - - # args[0] occurs due to things like Z[[int, str, bool]] from PEP 612 - if not isinstance(new_args[0], (tuple, list)): - t_result = new_args[-1] - t_args = new_args[:-1] - new_args = (t_args, t_result) - return _CallableGenericAlias(Callable, tuple(new_args)) - -def _is_param_expr(obj): - """Checks if obj matches either a list of types, ``...``, ``ParamSpec`` or - ``_ConcatenateGenericAlias`` from typing.py - """ - if obj is Ellipsis: - return True - if isinstance(obj, list): - return True - obj = type(obj) - names = ('ParamSpec', '_ConcatenateGenericAlias') - return obj.__module__ == 'typing' and any(obj.__name__ == name for name in names) - - -class Callable(metaclass=ABCMeta): - - __slots__ = () - - @abstractmethod - def __call__(self, *args, **kwds): - return False - - @classmethod - def __subclasshook__(cls, C): - if cls is Callable: - return _check_methods(C, "__call__") - return NotImplemented - - __class_getitem__ = classmethod(_CallableGenericAlias) - - -### SETS ### - - -class Set(Collection): - """A set is a finite, iterable container. - - This class provides concrete generic implementations of all - methods except for __contains__, __iter__ and __len__. - - To override the comparisons (presumably for speed, as the - semantics are fixed), redefine __le__ and __ge__, - then the other operations will automatically follow suit. - """ - - __slots__ = () - - def __le__(self, other): - if not isinstance(other, Set): - return NotImplemented - if len(self) > 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 >> 11) ^ (h >> 25) - 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): - """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__. - """ - - __slots__ = () - - # Tell ABCMeta.__new__ that this class should have TPFLAGS_MAPPING set. - __abc_tpflags__ = 1 << 6 # Py_TPFLAGS_MAPPING - - @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) -Mapping.register(framelocalsproxy) - - -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_getitem__ = classmethod(GenericAlias) - - -class KeysView(MappingView, Set): - - __slots__ = () - - @classmethod - def _from_iterable(cls, 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(cls, 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): - """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__. - """ - - __slots__ = () - - @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(self, other=(), /, **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.keys(): 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 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__ = () - - # Tell ABCMeta.__new__ that this class should have TPFLAGS_SEQUENCE set. - __abc_tpflags__ = 1 << 5 # Py_TPFLAGS_SEQUENCE - - @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] - except IndexError: - break - if v is value or v == value: - return i - 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(bytes) -Sequence.register(range) -Sequence.register(memoryview) - -class _DeprecateByteStringMeta(ABCMeta): - def __new__(cls, name, bases, namespace, **kwargs): - if name != "ByteString": - import warnings - - warnings._deprecated( - "collections.abc.ByteString", - remove=(3, 17), - ) - return super().__new__(cls, name, bases, namespace, **kwargs) - - def __instancecheck__(cls, instance): - import warnings - - warnings._deprecated( - "collections.abc.ByteString", - remove=(3, 17), - ) - return super().__instancecheck__(instance) - -class ByteString(Sequence, metaclass=_DeprecateByteStringMeta): - """Deprecated ABC serving as a common supertype of ``bytes`` and ``bytearray``. - - This ABC is scheduled for removal in Python 3.17. - Use ``isinstance(obj, collections.abc.Buffer)`` to test if ``obj`` - implements the buffer protocol at runtime. For use in type annotations, - either use ``Buffer`` or a union that explicitly specifies the types your - code supports (e.g., ``bytes | bytearray | memoryview``). - """ - - __slots__ = () - -ByteString.register(bytes) -ByteString.register(bytearray) - - -class MutableSequence(Sequence): - """All the operations on a read-write sequence. - - Concrete subclasses must provide __new__ or __init__, - __getitem__, __setitem__, __delitem__, __len__, and insert(). - """ - - __slots__ = () - - @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' - if values is self: - values = list(values) - 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) diff --git a/Python314_4_x86_Template/Lib/_colorize.py b/Python314_4_x86_Template/Lib/_colorize.py deleted file mode 100644 index d6673f669..000000000 --- a/Python314_4_x86_Template/Lib/_colorize.py +++ /dev/null @@ -1,355 +0,0 @@ -import os -import sys - -from collections.abc import Callable, Iterator, Mapping -from dataclasses import dataclass, field, Field - -COLORIZE = True - - -# types -if False: - from typing import IO, Self, ClassVar - _theme: Theme - - -class ANSIColors: - RESET = "\x1b[0m" - - BLACK = "\x1b[30m" - BLUE = "\x1b[34m" - CYAN = "\x1b[36m" - GREEN = "\x1b[32m" - GREY = "\x1b[90m" - MAGENTA = "\x1b[35m" - RED = "\x1b[31m" - WHITE = "\x1b[37m" # more like LIGHT GRAY - YELLOW = "\x1b[33m" - - BOLD = "\x1b[1m" - BOLD_BLACK = "\x1b[1;30m" # DARK GRAY - BOLD_BLUE = "\x1b[1;34m" - BOLD_CYAN = "\x1b[1;36m" - BOLD_GREEN = "\x1b[1;32m" - BOLD_MAGENTA = "\x1b[1;35m" - BOLD_RED = "\x1b[1;31m" - BOLD_WHITE = "\x1b[1;37m" # actual WHITE - BOLD_YELLOW = "\x1b[1;33m" - - # intense = like bold but without being bold - INTENSE_BLACK = "\x1b[90m" - INTENSE_BLUE = "\x1b[94m" - INTENSE_CYAN = "\x1b[96m" - INTENSE_GREEN = "\x1b[92m" - INTENSE_MAGENTA = "\x1b[95m" - INTENSE_RED = "\x1b[91m" - INTENSE_WHITE = "\x1b[97m" - INTENSE_YELLOW = "\x1b[93m" - - BACKGROUND_BLACK = "\x1b[40m" - BACKGROUND_BLUE = "\x1b[44m" - BACKGROUND_CYAN = "\x1b[46m" - BACKGROUND_GREEN = "\x1b[42m" - BACKGROUND_MAGENTA = "\x1b[45m" - BACKGROUND_RED = "\x1b[41m" - BACKGROUND_WHITE = "\x1b[47m" - BACKGROUND_YELLOW = "\x1b[43m" - - INTENSE_BACKGROUND_BLACK = "\x1b[100m" - INTENSE_BACKGROUND_BLUE = "\x1b[104m" - INTENSE_BACKGROUND_CYAN = "\x1b[106m" - INTENSE_BACKGROUND_GREEN = "\x1b[102m" - INTENSE_BACKGROUND_MAGENTA = "\x1b[105m" - INTENSE_BACKGROUND_RED = "\x1b[101m" - INTENSE_BACKGROUND_WHITE = "\x1b[107m" - INTENSE_BACKGROUND_YELLOW = "\x1b[103m" - - -ColorCodes = set() -NoColors = ANSIColors() - -for attr, code in ANSIColors.__dict__.items(): - if not attr.startswith("__"): - ColorCodes.add(code) - setattr(NoColors, attr, "") - - -# -# Experimental theming support (see gh-133346) -# - -# - Create a theme by copying an existing `Theme` with one or more sections -# replaced, using `default_theme.copy_with()`; -# - create a theme section by copying an existing `ThemeSection` with one or -# more colors replaced, using for example `default_theme.syntax.copy_with()`; -# - create a theme from scratch by instantiating a `Theme` data class with -# the required sections (which are also dataclass instances). -# -# Then call `_colorize.set_theme(your_theme)` to set it. -# -# Put your theme configuration in $PYTHONSTARTUP for the interactive shell, -# or sitecustomize.py in your virtual environment or Python installation for -# other uses. Your applications can call `_colorize.set_theme()` too. -# -# Note that thanks to the dataclasses providing default values for all fields, -# creating a new theme or theme section from scratch is possible without -# specifying all keys. -# -# For example, here's a theme that makes punctuation and operators less prominent: -# -# try: -# from _colorize import set_theme, default_theme, Syntax, ANSIColors -# except ImportError: -# pass -# else: -# theme_with_dim_operators = default_theme.copy_with( -# syntax=Syntax(op=ANSIColors.INTENSE_BLACK), -# ) -# set_theme(theme_with_dim_operators) -# del set_theme, default_theme, Syntax, ANSIColors, theme_with_dim_operators -# -# Guarding the import ensures that your .pythonstartup file will still work in -# Python 3.13 and older. Deleting the variables ensures they don't remain in your -# interactive shell's global scope. - -class ThemeSection(Mapping[str, str]): - """A mixin/base class for theme sections. - - It enables dictionary access to a section, as well as implements convenience - methods. - """ - - # The two types below are just that: types to inform the type checker that the - # mixin will work in context of those fields existing - __dataclass_fields__: ClassVar[dict[str, Field[str]]] - _name_to_value: Callable[[str], str] - - def __post_init__(self) -> None: - name_to_value = {} - for color_name in self.__dataclass_fields__: - name_to_value[color_name] = getattr(self, color_name) - super().__setattr__('_name_to_value', name_to_value.__getitem__) - - def copy_with(self, **kwargs: str) -> Self: - color_state: dict[str, str] = {} - for color_name in self.__dataclass_fields__: - color_state[color_name] = getattr(self, color_name) - color_state.update(kwargs) - return type(self)(**color_state) - - @classmethod - def no_colors(cls) -> Self: - color_state: dict[str, str] = {} - for color_name in cls.__dataclass_fields__: - color_state[color_name] = "" - return cls(**color_state) - - def __getitem__(self, key: str) -> str: - return self._name_to_value(key) - - def __len__(self) -> int: - return len(self.__dataclass_fields__) - - def __iter__(self) -> Iterator[str]: - return iter(self.__dataclass_fields__) - - -@dataclass(frozen=True, kw_only=True) -class Argparse(ThemeSection): - usage: str = ANSIColors.BOLD_BLUE - prog: str = ANSIColors.BOLD_MAGENTA - prog_extra: str = ANSIColors.MAGENTA - heading: str = ANSIColors.BOLD_BLUE - summary_long_option: str = ANSIColors.CYAN - summary_short_option: str = ANSIColors.GREEN - summary_label: str = ANSIColors.YELLOW - summary_action: str = ANSIColors.GREEN - long_option: str = ANSIColors.BOLD_CYAN - short_option: str = ANSIColors.BOLD_GREEN - label: str = ANSIColors.BOLD_YELLOW - action: str = ANSIColors.BOLD_GREEN - reset: str = ANSIColors.RESET - - -@dataclass(frozen=True) -class Syntax(ThemeSection): - prompt: str = ANSIColors.BOLD_MAGENTA - keyword: str = ANSIColors.BOLD_BLUE - keyword_constant: str = ANSIColors.BOLD_BLUE - builtin: str = ANSIColors.CYAN - comment: str = ANSIColors.RED - string: str = ANSIColors.GREEN - number: str = ANSIColors.YELLOW - op: str = ANSIColors.RESET - definition: str = ANSIColors.BOLD - soft_keyword: str = ANSIColors.BOLD_BLUE - reset: str = ANSIColors.RESET - - -@dataclass(frozen=True) -class Traceback(ThemeSection): - type: str = ANSIColors.BOLD_MAGENTA - message: str = ANSIColors.MAGENTA - filename: str = ANSIColors.MAGENTA - line_no: str = ANSIColors.MAGENTA - frame: str = ANSIColors.MAGENTA - error_highlight: str = ANSIColors.BOLD_RED - error_range: str = ANSIColors.RED - reset: str = ANSIColors.RESET - - -@dataclass(frozen=True) -class Unittest(ThemeSection): - passed: str = ANSIColors.GREEN - warn: str = ANSIColors.YELLOW - fail: str = ANSIColors.RED - fail_info: str = ANSIColors.BOLD_RED - reset: str = ANSIColors.RESET - - -@dataclass(frozen=True) -class Theme: - """A suite of themes for all sections of Python. - - When adding a new one, remember to also modify `copy_with` and `no_colors` - below. - """ - argparse: Argparse = field(default_factory=Argparse) - syntax: Syntax = field(default_factory=Syntax) - traceback: Traceback = field(default_factory=Traceback) - unittest: Unittest = field(default_factory=Unittest) - - def copy_with( - self, - *, - argparse: Argparse | None = None, - syntax: Syntax | None = None, - traceback: Traceback | None = None, - unittest: Unittest | None = None, - ) -> Self: - """Return a new Theme based on this instance with some sections replaced. - - Themes are immutable to protect against accidental modifications that - could lead to invalid terminal states. - """ - return type(self)( - argparse=argparse or self.argparse, - syntax=syntax or self.syntax, - traceback=traceback or self.traceback, - unittest=unittest or self.unittest, - ) - - @classmethod - def no_colors(cls) -> Self: - """Return a new Theme where colors in all sections are empty strings. - - This allows writing user code as if colors are always used. The color - fields will be ANSI color code strings when colorization is desired - and possible, and empty strings otherwise. - """ - return cls( - argparse=Argparse.no_colors(), - syntax=Syntax.no_colors(), - traceback=Traceback.no_colors(), - unittest=Unittest.no_colors(), - ) - - -def get_colors( - colorize: bool = False, *, file: IO[str] | IO[bytes] | None = None -) -> ANSIColors: - if colorize or can_colorize(file=file): - return ANSIColors() - else: - return NoColors - - -def decolor(text: str) -> str: - """Remove ANSI color codes from a string.""" - for code in ColorCodes: - text = text.replace(code, "") - return text - - -def can_colorize(*, file: IO[str] | IO[bytes] | None = None) -> bool: - - def _safe_getenv(k: str, fallback: str | None = None) -> str | None: - """Exception-safe environment retrieval. See gh-128636.""" - try: - return os.environ.get(k, fallback) - except Exception: - return fallback - - if file is None: - file = sys.stdout - - if not sys.flags.ignore_environment: - if _safe_getenv("PYTHON_COLORS") == "0": - return False - if _safe_getenv("PYTHON_COLORS") == "1": - return True - if _safe_getenv("NO_COLOR"): - return False - if not COLORIZE: - return False - if _safe_getenv("FORCE_COLOR"): - return True - if _safe_getenv("TERM") == "dumb": - return False - - if not hasattr(file, "fileno"): - return False - - if sys.platform == "win32": - try: - import nt - - if not nt._supports_virtual_terminal(): - return False - except (ImportError, AttributeError): - return False - - try: - return os.isatty(file.fileno()) - except OSError: - return hasattr(file, "isatty") and file.isatty() - - -default_theme = Theme() -theme_no_color = default_theme.no_colors() - - -def get_theme( - *, - tty_file: IO[str] | IO[bytes] | None = None, - force_color: bool = False, - force_no_color: bool = False, -) -> Theme: - """Returns the currently set theme, potentially in a zero-color variant. - - In cases where colorizing is not possible (see `can_colorize`), the returned - theme contains all empty strings in all color definitions. - See `Theme.no_colors()` for more information. - - It is recommended not to cache the result of this function for extended - periods of time because the user might influence theme selection by - the interactive shell, a debugger, or application-specific code. The - environment (including environment variable state and console configuration - on Windows) can also change in the course of the application life cycle. - """ - if force_color or (not force_no_color and - can_colorize(file=tty_file)): - return _theme - return theme_no_color - - -def set_theme(t: Theme) -> None: - global _theme - - if not isinstance(t, Theme): - raise ValueError(f"Expected Theme object, found {t}") - - _theme = t - - -set_theme(default_theme) diff --git a/Python314_4_x86_Template/Lib/_compat_pickle.py b/Python314_4_x86_Template/Lib/_compat_pickle.py deleted file mode 100644 index 439f8c02f..000000000 --- a/Python314_4_x86_Template/Lib/_compat_pickle.py +++ /dev/null @@ -1,251 +0,0 @@ -# This module is used to map the old Python 2 names to the new names used in -# Python 3 for the pickle module. This needed to make pickle streams -# generated with Python 2 loadable by Python 3. - -# This is a copy of lib2to3.fixes.fix_imports.MAPPING. We cannot import -# lib2to3 and use the mapping defined there, because lib2to3 uses pickle. -# Thus, this could cause the module to be imported recursively. -IMPORT_MAPPING = { - '__builtin__' : 'builtins', - 'copy_reg': 'copyreg', - 'Queue': 'queue', - 'SocketServer': 'socketserver', - 'ConfigParser': 'configparser', - 'repr': 'reprlib', - 'tkFileDialog': 'tkinter.filedialog', - 'tkSimpleDialog': 'tkinter.simpledialog', - 'tkColorChooser': 'tkinter.colorchooser', - 'tkCommonDialog': 'tkinter.commondialog', - 'Dialog': 'tkinter.dialog', - 'Tkdnd': 'tkinter.dnd', - 'tkFont': 'tkinter.font', - 'tkMessageBox': 'tkinter.messagebox', - 'ScrolledText': 'tkinter.scrolledtext', - 'Tkconstants': 'tkinter.constants', - 'ttk': 'tkinter.ttk', - 'Tkinter': 'tkinter', - 'markupbase': '_markupbase', - '_winreg': 'winreg', - 'thread': '_thread', - 'dummy_thread': '_dummy_thread', - 'dbhash': 'dbm.bsd', - 'dumbdbm': 'dbm.dumb', - 'dbm': 'dbm.ndbm', - 'gdbm': 'dbm.gnu', - 'xmlrpclib': 'xmlrpc.client', - 'SimpleXMLRPCServer': 'xmlrpc.server', - 'httplib': 'http.client', - 'htmlentitydefs' : 'html.entities', - 'HTMLParser' : 'html.parser', - 'Cookie': 'http.cookies', - 'cookielib': 'http.cookiejar', - 'BaseHTTPServer': 'http.server', - 'test.test_support': 'test.support', - 'commands': 'subprocess', - 'urlparse' : 'urllib.parse', - 'robotparser' : 'urllib.robotparser', - 'urllib2': 'urllib.request', - 'anydbm': 'dbm', - '_abcoll' : 'collections.abc', -} - - -# This contains rename rules that are easy to handle. We ignore the more -# complex stuff (e.g. mapping the names in the urllib and types modules). -# These rules should be run before import names are fixed. -NAME_MAPPING = { - ('__builtin__', 'xrange'): ('builtins', 'range'), - ('__builtin__', 'reduce'): ('functools', 'reduce'), - ('__builtin__', 'intern'): ('sys', 'intern'), - ('__builtin__', 'unichr'): ('builtins', 'chr'), - ('__builtin__', 'unicode'): ('builtins', 'str'), - ('__builtin__', 'long'): ('builtins', 'int'), - ('itertools', 'izip'): ('builtins', 'zip'), - ('itertools', 'imap'): ('builtins', 'map'), - ('itertools', 'ifilter'): ('builtins', 'filter'), - ('itertools', 'ifilterfalse'): ('itertools', 'filterfalse'), - ('itertools', 'izip_longest'): ('itertools', 'zip_longest'), - ('UserDict', 'IterableUserDict'): ('collections', 'UserDict'), - ('UserList', 'UserList'): ('collections', 'UserList'), - ('UserString', 'UserString'): ('collections', 'UserString'), - ('whichdb', 'whichdb'): ('dbm', 'whichdb'), - ('_socket', 'fromfd'): ('socket', 'fromfd'), - ('_multiprocessing', 'Connection'): ('multiprocessing.connection', 'Connection'), - ('multiprocessing.process', 'Process'): ('multiprocessing.context', 'Process'), - ('multiprocessing.forking', 'Popen'): ('multiprocessing.popen_fork', 'Popen'), - ('urllib', 'ContentTooShortError'): ('urllib.error', 'ContentTooShortError'), - ('urllib', 'getproxies'): ('urllib.request', 'getproxies'), - ('urllib', 'pathname2url'): ('urllib.request', 'pathname2url'), - ('urllib', 'quote_plus'): ('urllib.parse', 'quote_plus'), - ('urllib', 'quote'): ('urllib.parse', 'quote'), - ('urllib', 'unquote_plus'): ('urllib.parse', 'unquote_plus'), - ('urllib', 'unquote'): ('urllib.parse', 'unquote'), - ('urllib', 'url2pathname'): ('urllib.request', 'url2pathname'), - ('urllib', 'urlcleanup'): ('urllib.request', 'urlcleanup'), - ('urllib', 'urlencode'): ('urllib.parse', 'urlencode'), - ('urllib', 'urlopen'): ('urllib.request', 'urlopen'), - ('urllib', 'urlretrieve'): ('urllib.request', 'urlretrieve'), - ('urllib2', 'HTTPError'): ('urllib.error', 'HTTPError'), - ('urllib2', 'URLError'): ('urllib.error', 'URLError'), -} - -PYTHON2_EXCEPTIONS = ( - "ArithmeticError", - "AssertionError", - "AttributeError", - "BaseException", - "BufferError", - "BytesWarning", - "DeprecationWarning", - "EOFError", - "EnvironmentError", - "Exception", - "FloatingPointError", - "FutureWarning", - "GeneratorExit", - "IOError", - "ImportError", - "ImportWarning", - "IndentationError", - "IndexError", - "KeyError", - "KeyboardInterrupt", - "LookupError", - "MemoryError", - "NameError", - "NotImplementedError", - "OSError", - "OverflowError", - "PendingDeprecationWarning", - "ReferenceError", - "RuntimeError", - "RuntimeWarning", - # StandardError is gone in Python 3, so we map it to Exception - "StopIteration", - "SyntaxError", - "SyntaxWarning", - "SystemError", - "SystemExit", - "TabError", - "TypeError", - "UnboundLocalError", - "UnicodeDecodeError", - "UnicodeEncodeError", - "UnicodeError", - "UnicodeTranslateError", - "UnicodeWarning", - "UserWarning", - "ValueError", - "Warning", - "ZeroDivisionError", -) - -try: - WindowsError -except NameError: - pass -else: - PYTHON2_EXCEPTIONS += ("WindowsError",) - -for excname in PYTHON2_EXCEPTIONS: - NAME_MAPPING[("exceptions", excname)] = ("builtins", excname) - -MULTIPROCESSING_EXCEPTIONS = ( - 'AuthenticationError', - 'BufferTooShort', - 'ProcessError', - 'TimeoutError', -) - -for excname in MULTIPROCESSING_EXCEPTIONS: - NAME_MAPPING[("multiprocessing", excname)] = ("multiprocessing.context", excname) - -# Same, but for 3.x to 2.x -REVERSE_IMPORT_MAPPING = dict((v, k) for (k, v) in IMPORT_MAPPING.items()) -assert len(REVERSE_IMPORT_MAPPING) == len(IMPORT_MAPPING) -REVERSE_NAME_MAPPING = dict((v, k) for (k, v) in NAME_MAPPING.items()) -assert len(REVERSE_NAME_MAPPING) == len(NAME_MAPPING) - -# Non-mutual mappings. - -IMPORT_MAPPING.update({ - 'cPickle': 'pickle', - '_elementtree': 'xml.etree.ElementTree', - 'FileDialog': 'tkinter.filedialog', - 'SimpleDialog': 'tkinter.simpledialog', - 'DocXMLRPCServer': 'xmlrpc.server', - 'SimpleHTTPServer': 'http.server', - 'CGIHTTPServer': 'http.server', - # For compatibility with broken pickles saved in old Python 3 versions - 'UserDict': 'collections', - 'UserList': 'collections', - 'UserString': 'collections', - 'whichdb': 'dbm', - 'StringIO': 'io', - 'cStringIO': 'io', -}) - -REVERSE_IMPORT_MAPPING.update({ - '_bz2': 'bz2', - '_dbm': 'dbm', - '_functools': 'functools', - '_gdbm': 'gdbm', - '_pickle': 'pickle', -}) - -NAME_MAPPING.update({ - ('__builtin__', 'basestring'): ('builtins', 'str'), - ('exceptions', 'StandardError'): ('builtins', 'Exception'), - ('UserDict', 'UserDict'): ('collections', 'UserDict'), - ('socket', '_socketobject'): ('socket', 'SocketType'), -}) - -REVERSE_NAME_MAPPING.update({ - ('_functools', 'reduce'): ('__builtin__', 'reduce'), - ('tkinter.filedialog', 'FileDialog'): ('FileDialog', 'FileDialog'), - ('tkinter.filedialog', 'LoadFileDialog'): ('FileDialog', 'LoadFileDialog'), - ('tkinter.filedialog', 'SaveFileDialog'): ('FileDialog', 'SaveFileDialog'), - ('tkinter.simpledialog', 'SimpleDialog'): ('SimpleDialog', 'SimpleDialog'), - ('xmlrpc.server', 'ServerHTMLDoc'): ('DocXMLRPCServer', 'ServerHTMLDoc'), - ('xmlrpc.server', 'XMLRPCDocGenerator'): - ('DocXMLRPCServer', 'XMLRPCDocGenerator'), - ('xmlrpc.server', 'DocXMLRPCRequestHandler'): - ('DocXMLRPCServer', 'DocXMLRPCRequestHandler'), - ('xmlrpc.server', 'DocXMLRPCServer'): - ('DocXMLRPCServer', 'DocXMLRPCServer'), - ('xmlrpc.server', 'DocCGIXMLRPCRequestHandler'): - ('DocXMLRPCServer', 'DocCGIXMLRPCRequestHandler'), - ('http.server', 'SimpleHTTPRequestHandler'): - ('SimpleHTTPServer', 'SimpleHTTPRequestHandler'), - ('http.server', 'CGIHTTPRequestHandler'): - ('CGIHTTPServer', 'CGIHTTPRequestHandler'), - ('_socket', 'socket'): ('socket', '_socketobject'), -}) - -PYTHON3_OSERROR_EXCEPTIONS = ( - 'BrokenPipeError', - 'ChildProcessError', - 'ConnectionAbortedError', - 'ConnectionError', - 'ConnectionRefusedError', - 'ConnectionResetError', - 'FileExistsError', - 'FileNotFoundError', - 'InterruptedError', - 'IsADirectoryError', - 'NotADirectoryError', - 'PermissionError', - 'ProcessLookupError', - 'TimeoutError', -) - -for excname in PYTHON3_OSERROR_EXCEPTIONS: - REVERSE_NAME_MAPPING[('builtins', excname)] = ('exceptions', 'OSError') - -PYTHON3_IMPORTERROR_EXCEPTIONS = ( - 'ModuleNotFoundError', -) - -for excname in PYTHON3_IMPORTERROR_EXCEPTIONS: - REVERSE_NAME_MAPPING[('builtins', excname)] = ('exceptions', 'ImportError') -del excname diff --git a/Python314_4_x86_Template/Lib/_ios_support.py b/Python314_4_x86_Template/Lib/_ios_support.py deleted file mode 100644 index 20467a7c2..000000000 --- a/Python314_4_x86_Template/Lib/_ios_support.py +++ /dev/null @@ -1,71 +0,0 @@ -import sys -try: - from ctypes import cdll, c_void_p, c_char_p, util -except ImportError: - # ctypes is an optional module. If it's not present, we're limited in what - # we can tell about the system, but we don't want to prevent the module - # from working. - print("ctypes isn't available; iOS system calls will not be available", file=sys.stderr) - objc = None -else: - # ctypes is available. Load the ObjC library, and wrap the objc_getClass, - # sel_registerName methods - lib = util.find_library("objc") - if lib is None: - # Failed to load the objc library - raise ImportError("ObjC runtime library couldn't be loaded") - - objc = cdll.LoadLibrary(lib) - objc.objc_getClass.restype = c_void_p - objc.objc_getClass.argtypes = [c_char_p] - objc.sel_registerName.restype = c_void_p - objc.sel_registerName.argtypes = [c_char_p] - - -def get_platform_ios(): - # Determine if this is a simulator using the multiarch value - is_simulator = sys.implementation._multiarch.endswith("simulator") - - # We can't use ctypes; abort - if not objc: - return None - - # Most of the methods return ObjC objects - objc.objc_msgSend.restype = c_void_p - # All the methods used have no arguments. - objc.objc_msgSend.argtypes = [c_void_p, c_void_p] - - # Equivalent of: - # device = [UIDevice currentDevice] - UIDevice = objc.objc_getClass(b"UIDevice") - SEL_currentDevice = objc.sel_registerName(b"currentDevice") - device = objc.objc_msgSend(UIDevice, SEL_currentDevice) - - # Equivalent of: - # device_systemVersion = [device systemVersion] - SEL_systemVersion = objc.sel_registerName(b"systemVersion") - device_systemVersion = objc.objc_msgSend(device, SEL_systemVersion) - - # Equivalent of: - # device_systemName = [device systemName] - SEL_systemName = objc.sel_registerName(b"systemName") - device_systemName = objc.objc_msgSend(device, SEL_systemName) - - # Equivalent of: - # device_model = [device model] - SEL_model = objc.sel_registerName(b"model") - device_model = objc.objc_msgSend(device, SEL_model) - - # UTF8String returns a const char*; - SEL_UTF8String = objc.sel_registerName(b"UTF8String") - objc.objc_msgSend.restype = c_char_p - - # Equivalent of: - # system = [device_systemName UTF8String] - # release = [device_systemVersion UTF8String] - # model = [device_model UTF8String] - system = objc.objc_msgSend(device_systemName, SEL_UTF8String).decode() - release = objc.objc_msgSend(device_systemVersion, SEL_UTF8String).decode() - model = objc.objc_msgSend(device_model, SEL_UTF8String).decode() - - return system, release, model, is_simulator diff --git a/Python314_4_x86_Template/Lib/_markupbase.py b/Python314_4_x86_Template/Lib/_markupbase.py deleted file mode 100644 index 614f0cd16..000000000 --- a/Python314_4_x86_Template/Lib/_markupbase.py +++ /dev/null @@ -1,396 +0,0 @@ -"""Shared support for scanning document type declarations in HTML and XHTML. - -This module is used as a foundation for the html.parser module. It has no -documented public API and should not be used directly. - -""" - -import re - -_declname_match = re.compile(r'[a-zA-Z][-_.a-zA-Z0-9]*\s*').match -_declstringlit_match = re.compile(r'(\'[^\']*\'|"[^"]*")\s*').match -_commentclose = re.compile(r'--\s*>') -_markedsectionclose = re.compile(r']\s*]\s*>') - -# An analysis of the MS-Word extensions is available at -# http://web.archive.org/web/20060321153828/http://www.planetpublish.com/xmlarena/xap/Thursday/WordtoXML.pdf - -_msmarkedsectionclose = re.compile(r']\s*>') - -del re - - -class ParserBase: - """Parser base class which provides some common support methods used - by the SGML/HTML and XHTML parsers.""" - - def __init__(self): - if self.__class__ is ParserBase: - raise RuntimeError( - "_markupbase.ParserBase must be subclassed") - - def reset(self): - self.lineno = 1 - self.offset = 0 - - def getpos(self): - """Return current line number and offset.""" - return self.lineno, self.offset - - # Internal -- update line number and offset. This should be - # called for each piece of data exactly once, in order -- in other - # words the concatenation of all the input strings to this - # function should be exactly the entire input. - def updatepos(self, i, j): - if i >= j: - return j - rawdata = self.rawdata - nlines = rawdata.count("\n", i, j) - if nlines: - self.lineno = self.lineno + nlines - pos = rawdata.rindex("\n", i, j) # Should not fail - self.offset = j-(pos+1) - else: - self.offset = self.offset + j-i - return j - - _decl_otherchars = '' - - # Internal -- parse declaration (for use by subclasses). - def parse_declaration(self, i): - # This is some sort of declaration; in "HTML as - # deployed," this should only be the document type - # declaration (""). - # ISO 8879:1986, however, has more complex - # declaration syntax for elements in , including: - # --comment-- - # [marked section] - # name in the following list: ENTITY, DOCTYPE, ELEMENT, - # ATTLIST, NOTATION, SHORTREF, USEMAP, - # LINKTYPE, LINK, IDLINK, USELINK, SYSTEM - rawdata = self.rawdata - j = i + 2 - assert rawdata[i:j] == "": - # the empty comment - return j + 1 - if rawdata[j:j+1] in ("-", ""): - # Start of comment followed by buffer boundary, - # or just a buffer boundary. - return -1 - # A simple, practical version could look like: ((name|stringlit) S*) + '>' - n = len(rawdata) - if rawdata[j:j+2] == '--': #comment - # Locate --.*-- as the body of the comment - return self.parse_comment(i) - elif rawdata[j] == '[': #marked section - # Locate [statusWord [...arbitrary SGML...]] as the body of the marked section - # Where statusWord is one of TEMP, CDATA, IGNORE, INCLUDE, RCDATA - # Note that this is extended by Microsoft Office "Save as Web" function - # to include [if...] and [endif]. - return self.parse_marked_section(i) - else: #all other declaration elements - decltype, j = self._scan_name(j, i) - if j < 0: - return j - if decltype == "doctype": - self._decl_otherchars = '' - while j < n: - c = rawdata[j] - if c == ">": - # end of declaration syntax - data = rawdata[i+2:j] - if decltype == "doctype": - self.handle_decl(data) - else: - # According to the HTML5 specs sections "8.2.4.44 Bogus - # comment state" and "8.2.4.45 Markup declaration open - # state", a comment token should be emitted. - # Calling unknown_decl provides more flexibility though. - self.unknown_decl(data) - return j + 1 - if c in "\"'": - m = _declstringlit_match(rawdata, j) - if not m: - return -1 # incomplete - j = m.end() - elif c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ": - name, j = self._scan_name(j, i) - elif c in self._decl_otherchars: - j = j + 1 - elif c == "[": - # this could be handled in a separate doctype parser - if decltype == "doctype": - j = self._parse_doctype_subset(j + 1, i) - elif decltype in {"attlist", "linktype", "link", "element"}: - # must tolerate []'d groups in a content model in an element declaration - # also in data attribute specifications of attlist declaration - # also link type declaration subsets in linktype declarations - # also link attribute specification lists in link declarations - raise AssertionError("unsupported '[' char in %s declaration" % decltype) - else: - raise AssertionError("unexpected '[' char in declaration") - else: - raise AssertionError("unexpected %r char in declaration" % rawdata[j]) - if j < 0: - return j - return -1 # incomplete - - # Internal -- parse a marked section - # Override this to handle MS-word extension syntax content - def parse_marked_section(self, i, report=1): - rawdata= self.rawdata - assert rawdata[i:i+3] == ' ending - match= _markedsectionclose.search(rawdata, i+3) - elif sectName in {"if", "else", "endif"}: - # look for MS Office ]> ending - match= _msmarkedsectionclose.search(rawdata, i+3) - else: - raise AssertionError( - 'unknown status keyword %r in marked section' % rawdata[i+3:j] - ) - if not match: - return -1 - if report: - j = match.start(0) - self.unknown_decl(rawdata[i+3: j]) - return match.end(0) - - # Internal -- parse comment, return length or -1 if not terminated - def parse_comment(self, i, report=1): - rawdata = self.rawdata - if rawdata[i:i+4] != ' a, b, c - abc_to_rgb(a, b, c) --> r, g, b - -All inputs and outputs are triples of floats in the range [0.0...1.0] -(with the exception of I and Q, which covers a slightly larger range). -Inputs outside the valid range may cause exceptions or invalid outputs. - -Supported color systems: -RGB: Red, Green, Blue components -YIQ: Luminance, Chrominance (used by composite video signals) -HLS: Hue, Luminance, Saturation -HSV: Hue, Saturation, Value -""" - -# References: -# http://en.wikipedia.org/wiki/YIQ -# http://en.wikipedia.org/wiki/HLS_color_space -# http://en.wikipedia.org/wiki/HSV_color_space - -__all__ = ["rgb_to_yiq","yiq_to_rgb","rgb_to_hls","hls_to_rgb", - "rgb_to_hsv","hsv_to_rgb"] - -# Some floating-point constants - -ONE_THIRD = 1.0/3.0 -ONE_SIXTH = 1.0/6.0 -TWO_THIRD = 2.0/3.0 - -# YIQ: used by composite video signals (linear combinations of RGB) -# Y: perceived grey level (0.0 == black, 1.0 == white) -# I, Q: color components -# -# There are a great many versions of the constants used in these formulae. -# The ones in this library uses constants from the FCC version of NTSC. - -def rgb_to_yiq(r, g, b): - y = 0.30*r + 0.59*g + 0.11*b - i = 0.74*(r-y) - 0.27*(b-y) - q = 0.48*(r-y) + 0.41*(b-y) - return (y, i, q) - -def yiq_to_rgb(y, i, q): - # r = y + (0.27*q + 0.41*i) / (0.74*0.41 + 0.27*0.48) - # b = y + (0.74*q - 0.48*i) / (0.74*0.41 + 0.27*0.48) - # g = y - (0.30*(r-y) + 0.11*(b-y)) / 0.59 - - r = y + 0.9468822170900693*i + 0.6235565819861433*q - g = y - 0.27478764629897834*i - 0.6356910791873801*q - b = y - 1.1085450346420322*i + 1.7090069284064666*q - - if r < 0.0: - r = 0.0 - if g < 0.0: - g = 0.0 - if b < 0.0: - b = 0.0 - if r > 1.0: - r = 1.0 - if g > 1.0: - g = 1.0 - if b > 1.0: - b = 1.0 - return (r, g, b) - - -# HLS: Hue, Luminance, Saturation -# H: position in the spectrum -# L: color lightness -# S: color saturation - -def rgb_to_hls(r, g, b): - maxc = max(r, g, b) - minc = min(r, g, b) - sumc = (maxc+minc) - rangec = (maxc-minc) - l = sumc/2.0 - if minc == maxc: - return 0.0, l, 0.0 - if l <= 0.5: - s = rangec / sumc - else: - s = rangec / (2.0-maxc-minc) # Not always 2.0-sumc: gh-106498. - rc = (maxc-r) / rangec - gc = (maxc-g) / rangec - bc = (maxc-b) / rangec - if r == maxc: - h = bc-gc - elif g == maxc: - h = 2.0+rc-bc - else: - h = 4.0+gc-rc - h = (h/6.0) % 1.0 - return h, l, s - -def hls_to_rgb(h, l, s): - if s == 0.0: - return l, l, l - if l <= 0.5: - m2 = l * (1.0+s) - else: - m2 = l+s-(l*s) - m1 = 2.0*l - m2 - return (_v(m1, m2, h+ONE_THIRD), _v(m1, m2, h), _v(m1, m2, h-ONE_THIRD)) - -def _v(m1, m2, hue): - hue = hue % 1.0 - if hue < ONE_SIXTH: - return m1 + (m2-m1)*hue*6.0 - if hue < 0.5: - return m2 - if hue < TWO_THIRD: - return m1 + (m2-m1)*(TWO_THIRD-hue)*6.0 - return m1 - - -# HSV: Hue, Saturation, Value -# H: position in the spectrum -# S: color saturation ("purity") -# V: color brightness - -def rgb_to_hsv(r, g, b): - maxc = max(r, g, b) - minc = min(r, g, b) - rangec = (maxc-minc) - v = maxc - if minc == maxc: - return 0.0, 0.0, v - s = rangec / maxc - rc = (maxc-r) / rangec - gc = (maxc-g) / rangec - bc = (maxc-b) / rangec - if r == maxc: - h = bc-gc - elif g == maxc: - h = 2.0+rc-bc - else: - h = 4.0+gc-rc - h = (h/6.0) % 1.0 - return h, s, v - -def hsv_to_rgb(h, s, v): - if s == 0.0: - return v, v, v - i = int(h*6.0) # XXX assume int() truncates! - f = (h*6.0) - i - p = v*(1.0 - s) - q = v*(1.0 - s*f) - t = v*(1.0 - s*(1.0-f)) - i = i%6 - if i == 0: - return v, t, p - if i == 1: - return q, v, p - if i == 2: - return p, v, t - if i == 3: - return p, q, v - if i == 4: - return t, p, v - if i == 5: - return v, p, q - # Cannot get here diff --git a/Python314_4_x86_Template/Lib/compileall.py b/Python314_4_x86_Template/Lib/compileall.py deleted file mode 100644 index 67fe37045..000000000 --- a/Python314_4_x86_Template/Lib/compileall.py +++ /dev/null @@ -1,472 +0,0 @@ -"""Module/script to byte-compile all .py files to .pyc files. - -When called as a script with arguments, this compiles the directories -given as arguments recursively; the -l option prevents it from -recursing into directories. - -Without arguments, it compiles all modules on sys.path, without -recursing into subdirectories. (Even though it should do so for -packages -- for now, you'll have to deal with packages separately.) - -See module py_compile for details of the actual byte-compilation. -""" -import os -import sys -import importlib.util -import py_compile -import struct -import filecmp - -from functools import partial -from pathlib import Path - -__all__ = ["compile_dir","compile_file","compile_path"] - -def _walk_dir(dir, maxlevels, quiet=0): - if quiet < 2 and isinstance(dir, os.PathLike): - dir = os.fspath(dir) - if not quiet: - print('Listing {!r}...'.format(dir)) - try: - names = os.listdir(dir) - except OSError: - if quiet < 2: - print("Can't list {!r}".format(dir)) - names = [] - names.sort() - for name in names: - if name == '__pycache__': - continue - fullname = os.path.join(dir, name) - if not os.path.isdir(fullname): - yield fullname - elif (maxlevels > 0 and name != os.curdir and name != os.pardir and - os.path.isdir(fullname) and not os.path.islink(fullname)): - yield from _walk_dir(fullname, maxlevels=maxlevels - 1, - quiet=quiet) - -def compile_dir(dir, maxlevels=None, ddir=None, force=False, - rx=None, quiet=0, legacy=False, optimize=-1, workers=1, - invalidation_mode=None, *, stripdir=None, - prependdir=None, limit_sl_dest=None, hardlink_dupes=False): - """Byte-compile all modules in the given directory tree. - - Arguments (only dir is required): - - dir: the directory to byte-compile - maxlevels: maximum recursion level (default `sys.getrecursionlimit()`) - ddir: the directory that will be prepended to the path to the - file as it is compiled into each byte-code file. - force: if True, force compilation, even if timestamps are up-to-date - quiet: full output with False or 0, errors only with 1, - no output with 2 - legacy: if True, produce legacy pyc paths instead of PEP 3147 paths - optimize: int or list of optimization levels or -1 for level of - the interpreter. Multiple levels leads to multiple compiled - files each with one optimization level. - workers: maximum number of parallel workers - invalidation_mode: how the up-to-dateness of the pyc will be checked - stripdir: part of path to left-strip from source file path - prependdir: path to prepend to beginning of original file path, applied - after stripdir - limit_sl_dest: ignore symlinks if they are pointing outside of - the defined path - hardlink_dupes: hardlink duplicated pyc files - """ - ProcessPoolExecutor = None - if ddir is not None and (stripdir is not None or prependdir is not None): - raise ValueError(("Destination dir (ddir) cannot be used " - "in combination with stripdir or prependdir")) - if ddir is not None: - stripdir = dir - prependdir = ddir - ddir = None - if workers < 0: - raise ValueError('workers must be greater or equal to 0') - if workers != 1: - # Check if this is a system where ProcessPoolExecutor can function. - from concurrent.futures.process import _check_system_limits - try: - _check_system_limits() - except NotImplementedError: - workers = 1 - else: - from concurrent.futures import ProcessPoolExecutor - if maxlevels is None: - maxlevels = sys.getrecursionlimit() - files = _walk_dir(dir, quiet=quiet, maxlevels=maxlevels) - success = True - if workers != 1 and ProcessPoolExecutor is not None: - import multiprocessing - if multiprocessing.get_start_method() == 'fork': - mp_context = multiprocessing.get_context('forkserver') - else: - mp_context = None - # If workers == 0, let ProcessPoolExecutor choose - workers = workers or None - with ProcessPoolExecutor(max_workers=workers, - mp_context=mp_context) as executor: - results = executor.map(partial(compile_file, - ddir=ddir, force=force, - rx=rx, quiet=quiet, - legacy=legacy, - optimize=optimize, - invalidation_mode=invalidation_mode, - stripdir=stripdir, - prependdir=prependdir, - limit_sl_dest=limit_sl_dest, - hardlink_dupes=hardlink_dupes), - files, - chunksize=4) - success = min(results, default=True) - else: - for file in files: - if not compile_file(file, ddir, force, rx, quiet, - legacy, optimize, invalidation_mode, - stripdir=stripdir, prependdir=prependdir, - limit_sl_dest=limit_sl_dest, - hardlink_dupes=hardlink_dupes): - success = False - return success - -def compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, - legacy=False, optimize=-1, - invalidation_mode=None, *, stripdir=None, prependdir=None, - limit_sl_dest=None, hardlink_dupes=False): - """Byte-compile one file. - - Arguments (only fullname is required): - - fullname: the file to byte-compile - ddir: if given, the directory name compiled in to the - byte-code file. - force: if True, force compilation, even if timestamps are up-to-date - quiet: full output with False or 0, errors only with 1, - no output with 2 - legacy: if True, produce legacy pyc paths instead of PEP 3147 paths - optimize: int or list of optimization levels or -1 for level of - the interpreter. Multiple levels leads to multiple compiled - files each with one optimization level. - invalidation_mode: how the up-to-dateness of the pyc will be checked - stripdir: part of path to left-strip from source file path - prependdir: path to prepend to beginning of original file path, applied - after stripdir - limit_sl_dest: ignore symlinks if they are pointing outside of - the defined path. - hardlink_dupes: hardlink duplicated pyc files - """ - - if ddir is not None and (stripdir is not None or prependdir is not None): - raise ValueError(("Destination dir (ddir) cannot be used " - "in combination with stripdir or prependdir")) - - success = True - fullname = os.fspath(fullname) - stripdir = os.fspath(stripdir) if stripdir is not None else None - name = os.path.basename(fullname) - - dfile = None - - if ddir is not None: - dfile = os.path.join(ddir, name) - - if stripdir is not None: - fullname_parts = fullname.split(os.path.sep) - stripdir_parts = stripdir.split(os.path.sep) - - if stripdir_parts != fullname_parts[:len(stripdir_parts)]: - if quiet < 2: - print("The stripdir path {!r} is not a valid prefix for " - "source path {!r}; ignoring".format(stripdir, fullname)) - else: - dfile = os.path.join(*fullname_parts[len(stripdir_parts):]) - - if prependdir is not None: - if dfile is None: - dfile = os.path.join(prependdir, fullname) - else: - dfile = os.path.join(prependdir, dfile) - - if isinstance(optimize, int): - optimize = [optimize] - - # Use set() to remove duplicates. - # Use sorted() to create pyc files in a deterministic order. - optimize = sorted(set(optimize)) - - if hardlink_dupes and len(optimize) < 2: - raise ValueError("Hardlinking of duplicated bytecode makes sense " - "only for more than one optimization level") - - if rx is not None: - mo = rx.search(fullname) - if mo: - return success - - if limit_sl_dest is not None and os.path.islink(fullname): - if Path(limit_sl_dest).resolve() not in Path(fullname).resolve().parents: - return success - - opt_cfiles = {} - - if os.path.isfile(fullname): - for opt_level in optimize: - if legacy: - opt_cfiles[opt_level] = fullname + 'c' - else: - if opt_level >= 0: - opt = opt_level if opt_level >= 1 else '' - cfile = (importlib.util.cache_from_source( - fullname, optimization=opt)) - opt_cfiles[opt_level] = cfile - else: - cfile = importlib.util.cache_from_source(fullname) - opt_cfiles[opt_level] = cfile - - head, tail = name[:-3], name[-3:] - if tail == '.py': - if not force: - try: - mtime = int(os.stat(fullname).st_mtime) - expect = struct.pack('<4sLL', importlib.util.MAGIC_NUMBER, - 0, mtime & 0xFFFF_FFFF) - for cfile in opt_cfiles.values(): - with open(cfile, 'rb') as chandle: - actual = chandle.read(12) - if expect != actual: - break - else: - return success - except OSError: - pass - if not quiet: - print('Compiling {!r}...'.format(fullname)) - try: - for index, opt_level in enumerate(optimize): - cfile = opt_cfiles[opt_level] - ok = py_compile.compile(fullname, cfile, dfile, True, - optimize=opt_level, - invalidation_mode=invalidation_mode) - if index > 0 and hardlink_dupes: - previous_cfile = opt_cfiles[optimize[index - 1]] - if filecmp.cmp(cfile, previous_cfile, shallow=False): - os.unlink(cfile) - os.link(previous_cfile, cfile) - except py_compile.PyCompileError as err: - success = False - if quiet >= 2: - return success - elif quiet: - print('*** Error compiling {!r}...'.format(fullname)) - else: - print('*** ', end='') - # escape non-printable characters in msg - encoding = sys.stdout.encoding or sys.getdefaultencoding() - msg = err.msg.encode(encoding, errors='backslashreplace').decode(encoding) - print(msg) - except (SyntaxError, UnicodeError, OSError) as e: - success = False - if quiet >= 2: - return success - elif quiet: - print('*** Error compiling {!r}...'.format(fullname)) - else: - print('*** ', end='') - print(e.__class__.__name__ + ':', e) - else: - if ok == 0: - success = False - return success - -def compile_path(skip_curdir=1, maxlevels=0, force=False, quiet=0, - legacy=False, optimize=-1, - invalidation_mode=None): - """Byte-compile all module on sys.path. - - Arguments (all optional): - - skip_curdir: if true, skip current directory (default True) - maxlevels: max recursion level (default 0) - force: as for compile_dir() (default False) - quiet: as for compile_dir() (default 0) - legacy: as for compile_dir() (default False) - optimize: as for compile_dir() (default -1) - invalidation_mode: as for compiler_dir() - """ - success = True - for dir in sys.path: - if (not dir or dir == os.curdir) and skip_curdir: - if quiet < 2: - print('Skipping current directory') - else: - success = success and compile_dir( - dir, - maxlevels, - None, - force, - quiet=quiet, - legacy=legacy, - optimize=optimize, - invalidation_mode=invalidation_mode, - ) - return success - - -def main(): - """Script main program.""" - import argparse - - parser = argparse.ArgumentParser( - description='Utilities to support installing Python libraries.', - color=True, - ) - parser.add_argument('-l', action='store_const', const=0, - default=None, dest='maxlevels', - help="don't recurse into subdirectories") - parser.add_argument('-r', type=int, dest='recursion', - help=('control the maximum recursion level. ' - 'if `-l` and `-r` options are specified, ' - 'then `-r` takes precedence.')) - parser.add_argument('-f', action='store_true', dest='force', - help='force rebuild even if timestamps are up to date') - parser.add_argument('-q', action='count', dest='quiet', default=0, - help='output only error messages; -qq will suppress ' - 'the error messages as well.') - parser.add_argument('-b', action='store_true', dest='legacy', - help='use legacy (pre-PEP3147) compiled file locations') - parser.add_argument('-d', metavar='DESTDIR', dest='ddir', default=None, - help=('directory to prepend to file paths for use in ' - 'compile-time tracebacks and in runtime ' - 'tracebacks in cases where the source file is ' - 'unavailable')) - parser.add_argument('-s', metavar='STRIPDIR', dest='stripdir', - default=None, - help=('part of path to left-strip from path ' - 'to source file - for example buildroot. ' - '`-d` and `-s` options cannot be ' - 'specified together.')) - parser.add_argument('-p', metavar='PREPENDDIR', dest='prependdir', - default=None, - help=('path to add as prefix to path ' - 'to source file - for example / to make ' - 'it absolute when some part is removed ' - 'by `-s` option. ' - '`-d` and `-p` options cannot be ' - 'specified together.')) - parser.add_argument('-x', metavar='REGEXP', dest='rx', default=None, - help=('skip files matching the regular expression; ' - 'the regexp is searched for in the full path ' - 'of each file considered for compilation')) - parser.add_argument('-i', metavar='FILE', dest='flist', - help=('add all the files and directories listed in ' - 'FILE to the list considered for compilation; ' - 'if "-", names are read from stdin')) - parser.add_argument('compile_dest', metavar='FILE|DIR', nargs='*', - help=('zero or more file and directory names ' - 'to compile; if no arguments given, defaults ' - 'to the equivalent of -l sys.path')) - parser.add_argument('-j', '--workers', default=1, - type=int, help='Run compileall concurrently') - invalidation_modes = [mode.name.lower().replace('_', '-') - for mode in py_compile.PycInvalidationMode] - parser.add_argument('--invalidation-mode', - choices=sorted(invalidation_modes), - help=('set .pyc invalidation mode; defaults to ' - '"checked-hash" if the SOURCE_DATE_EPOCH ' - 'environment variable is set, and ' - '"timestamp" otherwise.')) - parser.add_argument('-o', action='append', type=int, dest='opt_levels', - help=('Optimization levels to run compilation with. ' - 'Default is -1 which uses the optimization level ' - 'of the Python interpreter itself (see -O).')) - parser.add_argument('-e', metavar='DIR', dest='limit_sl_dest', - help='Ignore symlinks pointing outsite of the DIR') - parser.add_argument('--hardlink-dupes', action='store_true', - dest='hardlink_dupes', - help='Hardlink duplicated pyc files') - - args = parser.parse_args() - compile_dests = args.compile_dest - - if args.rx: - import re - args.rx = re.compile(args.rx) - - if args.limit_sl_dest == "": - args.limit_sl_dest = None - - if args.recursion is not None: - maxlevels = args.recursion - else: - maxlevels = args.maxlevels - - if args.opt_levels is None: - args.opt_levels = [-1] - - if len(args.opt_levels) == 1 and args.hardlink_dupes: - parser.error(("Hardlinking of duplicated bytecode makes sense " - "only for more than one optimization level.")) - - if args.ddir is not None and ( - args.stripdir is not None or args.prependdir is not None - ): - parser.error("-d cannot be used in combination with -s or -p") - - # if flist is provided then load it - if args.flist: - try: - with (sys.stdin if args.flist=='-' else - open(args.flist, encoding="utf-8")) as f: - for line in f: - compile_dests.append(line.strip()) - except OSError: - if args.quiet < 2: - print("Error reading file list {}".format(args.flist)) - return False - - if args.invalidation_mode: - ivl_mode = args.invalidation_mode.replace('-', '_').upper() - invalidation_mode = py_compile.PycInvalidationMode[ivl_mode] - else: - invalidation_mode = None - - success = True - try: - if compile_dests: - for dest in compile_dests: - if os.path.isfile(dest): - if not compile_file(dest, args.ddir, args.force, args.rx, - args.quiet, args.legacy, - invalidation_mode=invalidation_mode, - stripdir=args.stripdir, - prependdir=args.prependdir, - optimize=args.opt_levels, - limit_sl_dest=args.limit_sl_dest, - hardlink_dupes=args.hardlink_dupes): - success = False - else: - if not compile_dir(dest, maxlevels, args.ddir, - args.force, args.rx, args.quiet, - args.legacy, workers=args.workers, - invalidation_mode=invalidation_mode, - stripdir=args.stripdir, - prependdir=args.prependdir, - optimize=args.opt_levels, - limit_sl_dest=args.limit_sl_dest, - hardlink_dupes=args.hardlink_dupes): - success = False - return success - else: - return compile_path(legacy=args.legacy, force=args.force, - quiet=args.quiet, - invalidation_mode=invalidation_mode) - except KeyboardInterrupt: - if args.quiet < 2: - print("\n[interrupted]") - return False - return True - - -if __name__ == '__main__': - exit_status = int(not main()) - sys.exit(exit_status) diff --git a/Python314_4_x86_Template/Lib/compression/__init__.py b/Python314_4_x86_Template/Lib/compression/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Python314_4_x86_Template/Lib/compression/__pycache__/__init__.cpython-314.pyc b/Python314_4_x86_Template/Lib/compression/__pycache__/__init__.cpython-314.pyc deleted file mode 100644 index 6abf3f746..000000000 Binary files a/Python314_4_x86_Template/Lib/compression/__pycache__/__init__.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/compression/_common/__init__.py b/Python314_4_x86_Template/Lib/compression/_common/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Python314_4_x86_Template/Lib/compression/_common/__pycache__/__init__.cpython-314.pyc b/Python314_4_x86_Template/Lib/compression/_common/__pycache__/__init__.cpython-314.pyc deleted file mode 100644 index c0ee4e63b..000000000 Binary files a/Python314_4_x86_Template/Lib/compression/_common/__pycache__/__init__.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/compression/_common/__pycache__/_streams.cpython-314.pyc b/Python314_4_x86_Template/Lib/compression/_common/__pycache__/_streams.cpython-314.pyc deleted file mode 100644 index ab1feb293..000000000 Binary files a/Python314_4_x86_Template/Lib/compression/_common/__pycache__/_streams.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/compression/_common/_streams.py b/Python314_4_x86_Template/Lib/compression/_common/_streams.py deleted file mode 100644 index 9f367d4e3..000000000 --- a/Python314_4_x86_Template/Lib/compression/_common/_streams.py +++ /dev/null @@ -1,162 +0,0 @@ -"""Internal classes used by compression modules""" - -import io -import sys - -BUFFER_SIZE = io.DEFAULT_BUFFER_SIZE # Compressed data read chunk size - - -class BaseStream(io.BufferedIOBase): - """Mode-checking helper functions.""" - - def _check_not_closed(self): - if self.closed: - raise ValueError("I/O operation on closed file") - - def _check_can_read(self): - if not self.readable(): - raise io.UnsupportedOperation("File not open for reading") - - def _check_can_write(self): - if not self.writable(): - raise io.UnsupportedOperation("File not open for writing") - - def _check_can_seek(self): - if not self.readable(): - raise io.UnsupportedOperation("Seeking is only supported " - "on files open for reading") - if not self.seekable(): - raise io.UnsupportedOperation("The underlying file object " - "does not support seeking") - - -class DecompressReader(io.RawIOBase): - """Adapts the decompressor API to a RawIOBase reader API""" - - def readable(self): - return True - - def __init__(self, fp, decomp_factory, trailing_error=(), **decomp_args): - self._fp = fp - self._eof = False - self._pos = 0 # Current offset in decompressed stream - - # Set to size of decompressed stream once it is known, for SEEK_END - self._size = -1 - - # Save the decompressor factory and arguments. - # If the file contains multiple compressed streams, each - # stream will need a separate decompressor object. A new decompressor - # object is also needed when implementing a backwards seek(). - self._decomp_factory = decomp_factory - self._decomp_args = decomp_args - self._decompressor = self._decomp_factory(**self._decomp_args) - - # Exception class to catch from decompressor signifying invalid - # trailing data to ignore - self._trailing_error = trailing_error - - def close(self): - self._decompressor = None - return super().close() - - def seekable(self): - return self._fp.seekable() - - def readinto(self, b): - with memoryview(b) as view, view.cast("B") as byte_view: - data = self.read(len(byte_view)) - byte_view[:len(data)] = data - return len(data) - - def read(self, size=-1): - if size < 0: - return self.readall() - - if not size or self._eof: - return b"" - data = None # Default if EOF is encountered - # Depending on the input data, our call to the decompressor may not - # return any data. In this case, try again after reading another block. - while True: - if self._decompressor.eof: - rawblock = (self._decompressor.unused_data or - self._fp.read(BUFFER_SIZE)) - if not rawblock: - break - # Continue to next stream. - self._decompressor = self._decomp_factory( - **self._decomp_args) - try: - data = self._decompressor.decompress(rawblock, size) - except self._trailing_error: - # Trailing data isn't a valid compressed stream; ignore it. - break - else: - if self._decompressor.needs_input: - rawblock = self._fp.read(BUFFER_SIZE) - if not rawblock: - raise EOFError("Compressed file ended before the " - "end-of-stream marker was reached") - else: - rawblock = b"" - data = self._decompressor.decompress(rawblock, size) - if data: - break - if not data: - self._eof = True - self._size = self._pos - return b"" - self._pos += len(data) - return data - - def readall(self): - chunks = [] - # sys.maxsize means the max length of output buffer is unlimited, - # so that the whole input buffer can be decompressed within one - # .decompress() call. - while data := self.read(sys.maxsize): - chunks.append(data) - - return b"".join(chunks) - - # Rewind the file to the beginning of the data stream. - def _rewind(self): - self._fp.seek(0) - self._eof = False - self._pos = 0 - self._decompressor = self._decomp_factory(**self._decomp_args) - - def seek(self, offset, whence=io.SEEK_SET): - # Recalculate offset as an absolute file position. - if whence == io.SEEK_SET: - pass - elif whence == io.SEEK_CUR: - offset = self._pos + offset - elif whence == io.SEEK_END: - # Seeking relative to EOF - we need to know the file's size. - if self._size < 0: - while self.read(io.DEFAULT_BUFFER_SIZE): - pass - offset = self._size + offset - else: - raise ValueError("Invalid value for whence: {}".format(whence)) - - # Make it so that offset is the number of bytes to skip forward. - if offset < self._pos: - self._rewind() - else: - offset -= self._pos - - # Read and discard data until we reach the desired position. - while offset > 0: - data = self.read(min(io.DEFAULT_BUFFER_SIZE, offset)) - if not data: - break - offset -= len(data) - - return self._pos - - def tell(self): - """Return the current file position.""" - return self._pos diff --git a/Python314_4_x86_Template/Lib/compression/bz2.py b/Python314_4_x86_Template/Lib/compression/bz2.py deleted file mode 100644 index 16815d6cd..000000000 --- a/Python314_4_x86_Template/Lib/compression/bz2.py +++ /dev/null @@ -1,5 +0,0 @@ -import bz2 -__doc__ = bz2.__doc__ -del bz2 - -from bz2 import * diff --git a/Python314_4_x86_Template/Lib/compression/gzip.py b/Python314_4_x86_Template/Lib/compression/gzip.py deleted file mode 100644 index 552f48f94..000000000 --- a/Python314_4_x86_Template/Lib/compression/gzip.py +++ /dev/null @@ -1,5 +0,0 @@ -import gzip -__doc__ = gzip.__doc__ -del gzip - -from gzip import * diff --git a/Python314_4_x86_Template/Lib/compression/lzma.py b/Python314_4_x86_Template/Lib/compression/lzma.py deleted file mode 100644 index b4bc7ccb1..000000000 --- a/Python314_4_x86_Template/Lib/compression/lzma.py +++ /dev/null @@ -1,5 +0,0 @@ -import lzma -__doc__ = lzma.__doc__ -del lzma - -from lzma import * diff --git a/Python314_4_x86_Template/Lib/compression/zlib.py b/Python314_4_x86_Template/Lib/compression/zlib.py deleted file mode 100644 index 3aa7e2db9..000000000 --- a/Python314_4_x86_Template/Lib/compression/zlib.py +++ /dev/null @@ -1,5 +0,0 @@ -import zlib -__doc__ = zlib.__doc__ -del zlib - -from zlib import * diff --git a/Python314_4_x86_Template/Lib/compression/zstd/__init__.py b/Python314_4_x86_Template/Lib/compression/zstd/__init__.py deleted file mode 100644 index 84b25914b..000000000 --- a/Python314_4_x86_Template/Lib/compression/zstd/__init__.py +++ /dev/null @@ -1,242 +0,0 @@ -"""Python bindings to the Zstandard (zstd) compression library (RFC-8878).""" - -__all__ = ( - # compression.zstd - 'COMPRESSION_LEVEL_DEFAULT', - 'compress', - 'CompressionParameter', - 'decompress', - 'DecompressionParameter', - 'finalize_dict', - 'get_frame_info', - 'Strategy', - 'train_dict', - - # compression.zstd._zstdfile - 'open', - 'ZstdFile', - - # _zstd - 'get_frame_size', - 'zstd_version', - 'zstd_version_info', - 'ZstdCompressor', - 'ZstdDecompressor', - 'ZstdDict', - 'ZstdError', -) - -import _zstd -import enum -from _zstd import (ZstdCompressor, ZstdDecompressor, ZstdDict, ZstdError, - get_frame_size, zstd_version) -from compression.zstd._zstdfile import ZstdFile, open, _nbytes - -# zstd_version_number is (MAJOR * 100 * 100 + MINOR * 100 + RELEASE) -zstd_version_info = (*divmod(_zstd.zstd_version_number // 100, 100), - _zstd.zstd_version_number % 100) -"""Version number of the runtime zstd library as a tuple of integers.""" - -COMPRESSION_LEVEL_DEFAULT = _zstd.ZSTD_CLEVEL_DEFAULT -"""The default compression level for Zstandard, currently '3'.""" - - -class FrameInfo: - """Information about a Zstandard frame.""" - - __slots__ = 'decompressed_size', 'dictionary_id' - - def __init__(self, decompressed_size, dictionary_id): - super().__setattr__('decompressed_size', decompressed_size) - super().__setattr__('dictionary_id', dictionary_id) - - def __repr__(self): - return (f'FrameInfo(decompressed_size={self.decompressed_size}, ' - f'dictionary_id={self.dictionary_id})') - - def __setattr__(self, name, _): - raise AttributeError(f"can't set attribute {name!r}") - - -def get_frame_info(frame_buffer): - """Get Zstandard frame information from a frame header. - - *frame_buffer* is a bytes-like object. It should start from the beginning - of a frame, and needs to include at least the frame header (6 to 18 bytes). - - The returned FrameInfo object has two attributes. - 'decompressed_size' is the size in bytes of the data in the frame when - decompressed, or None when the decompressed size is unknown. - 'dictionary_id' is an int in the range (0, 2**32). The special value 0 - means that the dictionary ID was not recorded in the frame header, - the frame may or may not need a dictionary to be decoded, - and the ID of such a dictionary is not specified. - """ - return FrameInfo(*_zstd.get_frame_info(frame_buffer)) - - -def train_dict(samples, dict_size): - """Return a ZstdDict representing a trained Zstandard dictionary. - - *samples* is an iterable of samples, where a sample is a bytes-like - object representing a file. - - *dict_size* is the dictionary's maximum size, in bytes. - """ - if not isinstance(dict_size, int): - ds_cls = type(dict_size).__qualname__ - raise TypeError(f'dict_size must be an int object, not {ds_cls!r}.') - - samples = tuple(samples) - chunks = b''.join(samples) - chunk_sizes = tuple(_nbytes(sample) for sample in samples) - if not chunks: - raise ValueError("samples contained no data; can't train dictionary.") - dict_content = _zstd.train_dict(chunks, chunk_sizes, dict_size) - return ZstdDict(dict_content) - - -def finalize_dict(zstd_dict, /, samples, dict_size, level): - """Return a ZstdDict representing a finalized Zstandard dictionary. - - Given a custom content as a basis for dictionary, and a set of samples, - finalize *zstd_dict* by adding headers and statistics according to the - Zstandard dictionary format. - - You may compose an effective dictionary content by hand, which is used as - basis dictionary, and use some samples to finalize a dictionary. The basis - dictionary may be a "raw content" dictionary. See *is_raw* in ZstdDict. - - *samples* is an iterable of samples, where a sample is a bytes-like object - representing a file. - *dict_size* is the dictionary's maximum size, in bytes. - *level* is the expected compression level. The statistics for each - compression level differ, so tuning the dictionary to the compression level - can provide improvements. - """ - - if not isinstance(zstd_dict, ZstdDict): - raise TypeError('zstd_dict argument should be a ZstdDict object.') - if not isinstance(dict_size, int): - raise TypeError('dict_size argument should be an int object.') - if not isinstance(level, int): - raise TypeError('level argument should be an int object.') - - samples = tuple(samples) - chunks = b''.join(samples) - chunk_sizes = tuple(_nbytes(sample) for sample in samples) - if not chunks: - raise ValueError("The samples are empty content, can't finalize the " - "dictionary.") - dict_content = _zstd.finalize_dict(zstd_dict.dict_content, chunks, - chunk_sizes, dict_size, level) - return ZstdDict(dict_content) - - -def compress(data, level=None, options=None, zstd_dict=None): - """Return Zstandard compressed *data* as bytes. - - *level* is an int specifying the compression level to use, defaulting to - COMPRESSION_LEVEL_DEFAULT ('3'). - *options* is a dict object that contains advanced compression - parameters. See CompressionParameter for more on options. - *zstd_dict* is a ZstdDict object, a pre-trained Zstandard dictionary. See - the function train_dict for how to train a ZstdDict on sample data. - - For incremental compression, use a ZstdCompressor instead. - """ - comp = ZstdCompressor(level=level, options=options, zstd_dict=zstd_dict) - return comp.compress(data, mode=ZstdCompressor.FLUSH_FRAME) - - -def decompress(data, zstd_dict=None, options=None): - """Decompress one or more frames of Zstandard compressed *data*. - - *zstd_dict* is a ZstdDict object, a pre-trained Zstandard dictionary. See - the function train_dict for how to train a ZstdDict on sample data. - *options* is a dict object that contains advanced compression - parameters. See DecompressionParameter for more on options. - - For incremental decompression, use a ZstdDecompressor instead. - """ - results = [] - while True: - decomp = ZstdDecompressor(options=options, zstd_dict=zstd_dict) - results.append(decomp.decompress(data)) - if not decomp.eof: - raise ZstdError('Compressed data ended before the ' - 'end-of-stream marker was reached') - data = decomp.unused_data - if not data: - break - return b''.join(results) - - -class CompressionParameter(enum.IntEnum): - """Compression parameters.""" - - compression_level = _zstd.ZSTD_c_compressionLevel - window_log = _zstd.ZSTD_c_windowLog - hash_log = _zstd.ZSTD_c_hashLog - chain_log = _zstd.ZSTD_c_chainLog - search_log = _zstd.ZSTD_c_searchLog - min_match = _zstd.ZSTD_c_minMatch - target_length = _zstd.ZSTD_c_targetLength - strategy = _zstd.ZSTD_c_strategy - - enable_long_distance_matching = _zstd.ZSTD_c_enableLongDistanceMatching - ldm_hash_log = _zstd.ZSTD_c_ldmHashLog - ldm_min_match = _zstd.ZSTD_c_ldmMinMatch - ldm_bucket_size_log = _zstd.ZSTD_c_ldmBucketSizeLog - ldm_hash_rate_log = _zstd.ZSTD_c_ldmHashRateLog - - content_size_flag = _zstd.ZSTD_c_contentSizeFlag - checksum_flag = _zstd.ZSTD_c_checksumFlag - dict_id_flag = _zstd.ZSTD_c_dictIDFlag - - nb_workers = _zstd.ZSTD_c_nbWorkers - job_size = _zstd.ZSTD_c_jobSize - overlap_log = _zstd.ZSTD_c_overlapLog - - def bounds(self): - """Return the (lower, upper) int bounds of a compression parameter. - - Both the lower and upper bounds are inclusive. - """ - return _zstd.get_param_bounds(self.value, is_compress=True) - - -class DecompressionParameter(enum.IntEnum): - """Decompression parameters.""" - - window_log_max = _zstd.ZSTD_d_windowLogMax - - def bounds(self): - """Return the (lower, upper) int bounds of a decompression parameter. - - Both the lower and upper bounds are inclusive. - """ - return _zstd.get_param_bounds(self.value, is_compress=False) - - -class Strategy(enum.IntEnum): - """Compression strategies, listed from fastest to strongest. - - Note that new strategies might be added in the future. - Only the order (from fast to strong) is guaranteed, - the numeric value might change. - """ - - fast = _zstd.ZSTD_fast - dfast = _zstd.ZSTD_dfast - greedy = _zstd.ZSTD_greedy - lazy = _zstd.ZSTD_lazy - lazy2 = _zstd.ZSTD_lazy2 - btlazy2 = _zstd.ZSTD_btlazy2 - btopt = _zstd.ZSTD_btopt - btultra = _zstd.ZSTD_btultra - btultra2 = _zstd.ZSTD_btultra2 - - -# Check validity of the CompressionParameter & DecompressionParameter types -_zstd.set_parameter_types(CompressionParameter, DecompressionParameter) diff --git a/Python314_4_x86_Template/Lib/compression/zstd/__pycache__/__init__.cpython-314.pyc b/Python314_4_x86_Template/Lib/compression/zstd/__pycache__/__init__.cpython-314.pyc deleted file mode 100644 index 814b308cc..000000000 Binary files a/Python314_4_x86_Template/Lib/compression/zstd/__pycache__/__init__.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/compression/zstd/__pycache__/_zstdfile.cpython-314.pyc b/Python314_4_x86_Template/Lib/compression/zstd/__pycache__/_zstdfile.cpython-314.pyc deleted file mode 100644 index 751cddcd1..000000000 Binary files a/Python314_4_x86_Template/Lib/compression/zstd/__pycache__/_zstdfile.cpython-314.pyc and /dev/null differ diff --git a/Python314_4_x86_Template/Lib/compression/zstd/_zstdfile.py b/Python314_4_x86_Template/Lib/compression/zstd/_zstdfile.py deleted file mode 100644 index d709f5efc..000000000 --- a/Python314_4_x86_Template/Lib/compression/zstd/_zstdfile.py +++ /dev/null @@ -1,345 +0,0 @@ -import io -from os import PathLike -from _zstd import ZstdCompressor, ZstdDecompressor, ZSTD_DStreamOutSize -from compression._common import _streams - -__all__ = ('ZstdFile', 'open') - -_MODE_CLOSED = 0 -_MODE_READ = 1 -_MODE_WRITE = 2 - - -def _nbytes(dat, /): - if isinstance(dat, (bytes, bytearray)): - return len(dat) - with memoryview(dat) as mv: - return mv.nbytes - - -class ZstdFile(_streams.BaseStream): - """A file-like object providing transparent Zstandard (de)compression. - - A ZstdFile can act as a wrapper for an existing file object, or refer - directly to a named file on disk. - - ZstdFile provides a *binary* file interface. Data is read and returned as - bytes, and may only be written to objects that support the Buffer Protocol. - """ - - FLUSH_BLOCK = ZstdCompressor.FLUSH_BLOCK - FLUSH_FRAME = ZstdCompressor.FLUSH_FRAME - - def __init__(self, file, /, mode='r', *, - level=None, options=None, zstd_dict=None): - """Open a Zstandard compressed file in binary mode. - - *file* can be either an file-like object, or a file name to open. - - *mode* can be 'r' for reading (default), 'w' for (over)writing, 'x' for - creating exclusively, or 'a' for appending. These can equivalently be - given as 'rb', 'wb', 'xb' and 'ab' respectively. - - *level* is an optional int specifying the compression level to use, - or COMPRESSION_LEVEL_DEFAULT if not given. - - *options* is an optional dict for advanced compression parameters. - See CompressionParameter and DecompressionParameter for the possible - options. - - *zstd_dict* is an optional ZstdDict object, a pre-trained Zstandard - dictionary. See train_dict() to train ZstdDict on sample data. - """ - self._fp = None - self._close_fp = False - self._mode = _MODE_CLOSED - self._buffer = None - - if not isinstance(mode, str): - raise ValueError('mode must be a str') - if options is not None and not isinstance(options, dict): - raise TypeError('options must be a dict or None') - mode = mode.removesuffix('b') # handle rb, wb, xb, ab - if mode == 'r': - if level is not None: - raise TypeError('level is illegal in read mode') - self._mode = _MODE_READ - elif mode in {'w', 'a', 'x'}: - if level is not None and not isinstance(level, int): - raise TypeError('level must be int or None') - self._mode = _MODE_WRITE - self._compressor = ZstdCompressor(level=level, options=options, - zstd_dict=zstd_dict) - self._pos = 0 - else: - raise ValueError(f'Invalid mode: {mode!r}') - - if isinstance(file, (str, bytes, PathLike)): - self._fp = io.open(file, f'{mode}b') - self._close_fp = True - elif ((mode == 'r' and hasattr(file, 'read')) - or (mode != 'r' and hasattr(file, 'write'))): - self._fp = file - else: - raise TypeError('file must be a file-like object ' - 'or a str, bytes, or PathLike object') - - if self._mode == _MODE_READ: - raw = _streams.DecompressReader( - self._fp, - ZstdDecompressor, - zstd_dict=zstd_dict, - options=options, - ) - self._buffer = io.BufferedReader(raw) - - def close(self): - """Flush and close the file. - - May be called multiple times. Once the file has been closed, - any other operation on it will raise ValueError. - """ - if self._fp is None: - return - try: - if self._mode == _MODE_READ: - if getattr(self, '_buffer', None): - self._buffer.close() - self._buffer = None - elif self._mode == _MODE_WRITE: - self.flush(self.FLUSH_FRAME) - self._compressor = None - finally: - self._mode = _MODE_CLOSED - try: - if self._close_fp: - self._fp.close() - finally: - self._fp = None - self._close_fp = False - - def write(self, data, /): - """Write a bytes-like object *data* to the file. - - Returns the number of uncompressed bytes written, which is - always the length of data in bytes. Note that due to buffering, - the file on disk may not reflect the data written until .flush() - or .close() is called. - """ - self._check_can_write() - - length = _nbytes(data) - - compressed = self._compressor.compress(data) - self._fp.write(compressed) - self._pos += length - return length - - def flush(self, mode=FLUSH_BLOCK): - """Flush remaining data to the underlying stream. - - The mode argument can be FLUSH_BLOCK or FLUSH_FRAME. Abuse of this - method will reduce compression ratio, use it only when necessary. - - If the program is interrupted afterwards, all data can be recovered. - To ensure saving to disk, also need to use os.fsync(fd). - - This method does nothing in reading mode. - """ - if self._mode == _MODE_READ: - return - self._check_not_closed() - if mode not in {self.FLUSH_BLOCK, self.FLUSH_FRAME}: - raise ValueError('Invalid mode argument, expected either ' - 'ZstdFile.FLUSH_FRAME or ' - 'ZstdFile.FLUSH_BLOCK') - if self._compressor.last_mode == mode: - return - # Flush zstd block/frame, and write. - data = self._compressor.flush(mode) - self._fp.write(data) - if hasattr(self._fp, 'flush'): - self._fp.flush() - - def read(self, size=-1): - """Read up to size uncompressed bytes from the file. - - If size is negative or omitted, read until EOF is reached. - Returns b'' if the file is already at EOF. - """ - if size is None: - size = -1 - self._check_can_read() - return self._buffer.read(size) - - def read1(self, size=-1): - """Read up to size uncompressed bytes, while trying to avoid - making multiple reads from the underlying stream. Reads up to a - buffer's worth of data if size is negative. - - Returns b'' if the file is at EOF. - """ - self._check_can_read() - if size < 0: - # Note this should *not* be io.DEFAULT_BUFFER_SIZE. - # ZSTD_DStreamOutSize is the minimum amount to read guaranteeing - # a full block is read. - size = ZSTD_DStreamOutSize - return self._buffer.read1(size) - - def readinto(self, b): - """Read bytes into b. - - Returns the number of bytes read (0 for EOF). - """ - self._check_can_read() - return self._buffer.readinto(b) - - def readinto1(self, b): - """Read bytes into b, while trying to avoid making multiple reads - from the underlying stream. - - Returns the number of bytes read (0 for EOF). - """ - self._check_can_read() - return self._buffer.readinto1(b) - - def readline(self, size=-1): - """Read a line of uncompressed bytes from the file. - - The terminating newline (if present) is retained. If size is - non-negative, no more than size bytes will be read (in which - case the line may be incomplete). Returns b'' if already at EOF. - """ - self._check_can_read() - return self._buffer.readline(size) - - def seek(self, offset, whence=io.SEEK_SET): - """Change the file position. - - The new position is specified by offset, relative to the - position indicated by whence. Possible values for whence are: - - 0: start of stream (default): offset must not be negative - 1: current stream position - 2: end of stream; offset must not be positive - - Returns the new file position. - - Note that seeking is emulated, so depending on the arguments, - this operation may be extremely slow. - """ - self._check_can_read() - - # BufferedReader.seek() checks seekable - return self._buffer.seek(offset, whence) - - def peek(self, size=-1): - """Return buffered data without advancing the file position. - - Always returns at least one byte of data, unless at EOF. - The exact number of bytes returned is unspecified. - """ - # Relies on the undocumented fact that BufferedReader.peek() always - # returns at least one byte (except at EOF) - self._check_can_read() - return self._buffer.peek(size) - - def __next__(self): - if ret := self._buffer.readline(): - return ret - raise StopIteration - - def tell(self): - """Return the current file position.""" - self._check_not_closed() - if self._mode == _MODE_READ: - return self._buffer.tell() - elif self._mode == _MODE_WRITE: - return self._pos - - def fileno(self): - """Return the file descriptor for the underlying file.""" - self._check_not_closed() - return self._fp.fileno() - - @property - def name(self): - self._check_not_closed() - return self._fp.name - - @property - def mode(self): - return 'wb' if self._mode == _MODE_WRITE else 'rb' - - @property - def closed(self): - """True if this file is closed.""" - return self._mode == _MODE_CLOSED - - def seekable(self): - """Return whether the file supports seeking.""" - return self.readable() and self._buffer.seekable() - - def readable(self): - """Return whether the file was opened for reading.""" - self._check_not_closed() - return self._mode == _MODE_READ - - def writable(self): - """Return whether the file was opened for writing.""" - self._check_not_closed() - return self._mode == _MODE_WRITE - - -def open(file, /, mode='rb', *, level=None, options=None, zstd_dict=None, - encoding=None, errors=None, newline=None): - """Open a Zstandard compressed file in binary or text mode. - - file can be either a file name (given as a str, bytes, or PathLike object), - in which case the named file is opened, or it can be an existing file object - to read from or write to. - - The mode parameter can be 'r', 'rb' (default), 'w', 'wb', 'x', 'xb', 'a', - 'ab' for binary mode, or 'rt', 'wt', 'xt', 'at' for text mode. - - The level, options, and zstd_dict parameters specify the settings the same - as ZstdFile. - - When using read mode (decompression), the options parameter is a dict - representing advanced decompression options. The level parameter is not - supported in this case. When using write mode (compression), only one of - level, an int representing the compression level, or options, a dict - representing advanced compression options, may be passed. In both modes, - zstd_dict is a ZstdDict instance containing a trained Zstandard dictionary. - - For binary mode, this function is equivalent to the ZstdFile constructor: - ZstdFile(filename, mode, ...). In this case, the encoding, errors and - newline parameters must not be provided. - - For text mode, an ZstdFile object is created, and wrapped in an - io.TextIOWrapper instance with the specified encoding, error handling - behavior, and line ending(s). - """ - - text_mode = 't' in mode - mode = mode.replace('t', '') - - if text_mode: - if 'b' in mode: - raise ValueError(f'Invalid mode: {mode!r}') - else: - if encoding is not None: - raise ValueError('Argument "encoding" not supported in binary mode') - if errors is not None: - raise ValueError('Argument "errors" not supported in binary mode') - if newline is not None: - raise ValueError('Argument "newline" not supported in binary mode') - - binary_file = ZstdFile(file, mode, level=level, options=options, - zstd_dict=zstd_dict) - - if text_mode: - return io.TextIOWrapper(binary_file, encoding, errors, newline) - else: - return binary_file diff --git a/Python314_4_x86_Template/Lib/concurrent/__init__.py b/Python314_4_x86_Template/Lib/concurrent/__init__.py deleted file mode 100644 index 196d37885..000000000 --- a/Python314_4_x86_Template/Lib/concurrent/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# This directory is a Python package. diff --git a/Python314_4_x86_Template/Lib/concurrent/futures/__init__.py b/Python314_4_x86_Template/Lib/concurrent/futures/__init__.py deleted file mode 100644 index d6ac4b3e0..000000000 --- a/Python314_4_x86_Template/Lib/concurrent/futures/__init__.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2009 Brian Quinlan. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Execute computations asynchronously using threads or processes.""" - -__author__ = 'Brian Quinlan (brian@sweetapp.com)' - -from concurrent.futures._base import (FIRST_COMPLETED, - FIRST_EXCEPTION, - ALL_COMPLETED, - CancelledError, - TimeoutError, - InvalidStateError, - BrokenExecutor, - Future, - Executor, - wait, - as_completed) - -__all__ = [ - 'FIRST_COMPLETED', - 'FIRST_EXCEPTION', - 'ALL_COMPLETED', - 'CancelledError', - 'TimeoutError', - 'InvalidStateError', - 'BrokenExecutor', - 'Future', - 'Executor', - 'wait', - 'as_completed', - 'ProcessPoolExecutor', - 'ThreadPoolExecutor', -] - - -try: - import _interpreters -except ImportError: - _interpreters = None - -if _interpreters: - __all__.append('InterpreterPoolExecutor') - - -def __dir__(): - return __all__ + ['__author__', '__doc__'] - - -def __getattr__(name): - global ProcessPoolExecutor, ThreadPoolExecutor, InterpreterPoolExecutor - - if name == 'ProcessPoolExecutor': - from .process import ProcessPoolExecutor - return ProcessPoolExecutor - - if name == 'ThreadPoolExecutor': - from .thread import ThreadPoolExecutor - return ThreadPoolExecutor - - if _interpreters and name == 'InterpreterPoolExecutor': - from .interpreter import InterpreterPoolExecutor - return InterpreterPoolExecutor - - raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/Python314_4_x86_Template/Lib/concurrent/futures/_base.py b/Python314_4_x86_Template/Lib/concurrent/futures/_base.py deleted file mode 100644 index d98b1ebdd..000000000 --- a/Python314_4_x86_Template/Lib/concurrent/futures/_base.py +++ /dev/null @@ -1,674 +0,0 @@ -# Copyright 2009 Brian Quinlan. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -__author__ = 'Brian Quinlan (brian@sweetapp.com)' - -import collections -import logging -import threading -import time -import types -import weakref -from itertools import islice - -FIRST_COMPLETED = 'FIRST_COMPLETED' -FIRST_EXCEPTION = 'FIRST_EXCEPTION' -ALL_COMPLETED = 'ALL_COMPLETED' -_AS_COMPLETED = '_AS_COMPLETED' - -# Possible future states (for internal use by the futures package). -PENDING = 'PENDING' -RUNNING = 'RUNNING' -# The future was cancelled by the user... -CANCELLED = 'CANCELLED' -# ...and _Waiter.add_cancelled() was called by a worker. -CANCELLED_AND_NOTIFIED = 'CANCELLED_AND_NOTIFIED' -FINISHED = 'FINISHED' - -_STATE_TO_DESCRIPTION_MAP = { - PENDING: "pending", - RUNNING: "running", - CANCELLED: "cancelled", - CANCELLED_AND_NOTIFIED: "cancelled", - FINISHED: "finished" -} - -# Logger for internal use by the futures package. -LOGGER = logging.getLogger("concurrent.futures") - -class Error(Exception): - """Base class for all future-related exceptions.""" - pass - -class CancelledError(Error): - """The Future was cancelled.""" - pass - -TimeoutError = TimeoutError # make local alias for the standard exception - -class InvalidStateError(Error): - """The operation is not allowed in this state.""" - pass - -class _Waiter(object): - """Provides the event that wait() and as_completed() block on.""" - def __init__(self): - self.event = threading.Event() - self.finished_futures = [] - - def add_result(self, future): - self.finished_futures.append(future) - - def add_exception(self, future): - self.finished_futures.append(future) - - def add_cancelled(self, future): - self.finished_futures.append(future) - -class _AsCompletedWaiter(_Waiter): - """Used by as_completed().""" - - def __init__(self): - super(_AsCompletedWaiter, self).__init__() - self.lock = threading.Lock() - - def add_result(self, future): - with self.lock: - super(_AsCompletedWaiter, self).add_result(future) - self.event.set() - - def add_exception(self, future): - with self.lock: - super(_AsCompletedWaiter, self).add_exception(future) - self.event.set() - - def add_cancelled(self, future): - with self.lock: - super(_AsCompletedWaiter, self).add_cancelled(future) - self.event.set() - -class _FirstCompletedWaiter(_Waiter): - """Used by wait(return_when=FIRST_COMPLETED).""" - - def add_result(self, future): - super().add_result(future) - self.event.set() - - def add_exception(self, future): - super().add_exception(future) - self.event.set() - - def add_cancelled(self, future): - super().add_cancelled(future) - self.event.set() - -class _AllCompletedWaiter(_Waiter): - """Used by wait(return_when=FIRST_EXCEPTION and ALL_COMPLETED).""" - - def __init__(self, num_pending_calls, stop_on_exception): - self.num_pending_calls = num_pending_calls - self.stop_on_exception = stop_on_exception - self.lock = threading.Lock() - super().__init__() - - def _decrement_pending_calls(self): - with self.lock: - self.num_pending_calls -= 1 - if not self.num_pending_calls: - self.event.set() - - def add_result(self, future): - super().add_result(future) - self._decrement_pending_calls() - - def add_exception(self, future): - super().add_exception(future) - if self.stop_on_exception: - self.event.set() - else: - self._decrement_pending_calls() - - def add_cancelled(self, future): - super().add_cancelled(future) - self._decrement_pending_calls() - -class _AcquireFutures(object): - """A context manager that does an ordered acquire of Future conditions.""" - - def __init__(self, futures): - self.futures = sorted(futures, key=id) - - def __enter__(self): - for future in self.futures: - future._condition.acquire() - - def __exit__(self, *args): - for future in self.futures: - future._condition.release() - -def _create_and_install_waiters(fs, return_when): - if return_when == _AS_COMPLETED: - waiter = _AsCompletedWaiter() - elif return_when == FIRST_COMPLETED: - waiter = _FirstCompletedWaiter() - else: - pending_count = sum( - f._state not in [CANCELLED_AND_NOTIFIED, FINISHED] for f in fs) - - if return_when == FIRST_EXCEPTION: - waiter = _AllCompletedWaiter(pending_count, stop_on_exception=True) - elif return_when == ALL_COMPLETED: - waiter = _AllCompletedWaiter(pending_count, stop_on_exception=False) - else: - raise ValueError("Invalid return condition: %r" % return_when) - - for f in fs: - f._waiters.append(waiter) - - return waiter - - -def _yield_finished_futures(fs, waiter, ref_collect): - """ - Iterate on the list *fs*, yielding finished futures one by one in - reverse order. - Before yielding a future, *waiter* is removed from its waiters - and the future is removed from each set in the collection of sets - *ref_collect*. - - The aim of this function is to avoid keeping stale references after - the future is yielded and before the iterator resumes. - """ - while fs: - f = fs[-1] - for futures_set in ref_collect: - futures_set.remove(f) - with f._condition: - f._waiters.remove(waiter) - del f - # Careful not to keep a reference to the popped value - yield fs.pop() - - -def as_completed(fs, timeout=None): - """An iterator over the given futures that yields each as it completes. - - Args: - fs: The sequence of Futures (possibly created by different Executors) to - iterate over. - timeout: The maximum number of seconds to wait. If None, then there - is no limit on the wait time. - - Returns: - An iterator that yields the given Futures as they complete (finished or - cancelled). If any given Futures are duplicated, they will be returned - once. - - Raises: - TimeoutError: If the entire result iterator could not be generated - before the given timeout. - """ - if timeout is not None: - end_time = timeout + time.monotonic() - - fs = set(fs) - total_futures = len(fs) - with _AcquireFutures(fs): - finished = set( - f for f in fs - if f._state in [CANCELLED_AND_NOTIFIED, FINISHED]) - pending = fs - finished - waiter = _create_and_install_waiters(fs, _AS_COMPLETED) - finished = list(finished) - try: - yield from _yield_finished_futures(finished, waiter, - ref_collect=(fs,)) - - while pending: - if timeout is None: - wait_timeout = None - else: - wait_timeout = end_time - time.monotonic() - if wait_timeout < 0: - raise TimeoutError( - '%d (of %d) futures unfinished' % ( - len(pending), total_futures)) - - waiter.event.wait(wait_timeout) - - with waiter.lock: - finished = waiter.finished_futures - waiter.finished_futures = [] - waiter.event.clear() - - # reverse to keep finishing order - finished.reverse() - yield from _yield_finished_futures(finished, waiter, - ref_collect=(fs, pending)) - - finally: - # Remove waiter from unfinished futures - for f in fs: - with f._condition: - f._waiters.remove(waiter) - -DoneAndNotDoneFutures = collections.namedtuple( - 'DoneAndNotDoneFutures', 'done not_done') -def wait(fs, timeout=None, return_when=ALL_COMPLETED): - """Wait for the futures in the given sequence to complete. - - Args: - fs: The sequence of Futures (possibly created by different Executors) to - wait upon. - timeout: The maximum number of seconds to wait. If None, then there - is no limit on the wait time. - return_when: Indicates when this function should return. The options - are: - - FIRST_COMPLETED - Return when any future finishes or is - cancelled. - FIRST_EXCEPTION - Return when any future finishes by raising an - exception. If no future raises an exception - then it is equivalent to ALL_COMPLETED. - ALL_COMPLETED - Return when all futures finish or are cancelled. - - Returns: - A named 2-tuple of sets. The first set, named 'done', contains the - futures that completed (is finished or cancelled) before the wait - completed. The second set, named 'not_done', contains uncompleted - futures. Duplicate futures given to *fs* are removed and will be - returned only once. - """ - fs = set(fs) - with _AcquireFutures(fs): - done = {f for f in fs - if f._state in [CANCELLED_AND_NOTIFIED, FINISHED]} - not_done = fs - done - if (return_when == FIRST_COMPLETED) and done: - return DoneAndNotDoneFutures(done, not_done) - elif (return_when == FIRST_EXCEPTION) and done: - if any(f for f in done - if not f.cancelled() and f.exception() is not None): - return DoneAndNotDoneFutures(done, not_done) - - if len(done) == len(fs): - return DoneAndNotDoneFutures(done, not_done) - - waiter = _create_and_install_waiters(fs, return_when) - - waiter.event.wait(timeout) - for f in fs: - with f._condition: - f._waiters.remove(waiter) - - done.update(waiter.finished_futures) - return DoneAndNotDoneFutures(done, fs - done) - - -def _result_or_cancel(fut, timeout=None): - try: - try: - return fut.result(timeout) - finally: - fut.cancel() - finally: - # Break a reference cycle with the exception in self._exception - del fut - - -class Future(object): - """Represents the result of an asynchronous computation.""" - - def __init__(self): - """Initializes the future. Should not be called by clients.""" - self._condition = threading.Condition() - self._state = PENDING - self._result = None - self._exception = None - self._waiters = [] - self._done_callbacks = [] - - def _invoke_callbacks(self): - for callback in self._done_callbacks: - try: - callback(self) - except Exception: - LOGGER.exception('exception calling callback for %r', self) - - def __repr__(self): - with self._condition: - if self._state == FINISHED: - if self._exception: - return '<%s at %#x state=%s raised %s>' % ( - self.__class__.__name__, - id(self), - _STATE_TO_DESCRIPTION_MAP[self._state], - self._exception.__class__.__name__) - else: - return '<%s at %#x state=%s returned %s>' % ( - self.__class__.__name__, - id(self), - _STATE_TO_DESCRIPTION_MAP[self._state], - self._result.__class__.__name__) - return '<%s at %#x state=%s>' % ( - self.__class__.__name__, - id(self), - _STATE_TO_DESCRIPTION_MAP[self._state]) - - def cancel(self): - """Cancel the future if possible. - - Returns True if the future was cancelled, False otherwise. A future - cannot be cancelled if it is running or has already completed. - """ - with self._condition: - if self._state in [RUNNING, FINISHED]: - return False - - if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]: - return True - - self._state = CANCELLED - self._condition.notify_all() - - self._invoke_callbacks() - return True - - def cancelled(self): - """Return True if the future was cancelled.""" - with self._condition: - return self._state in [CANCELLED, CANCELLED_AND_NOTIFIED] - - def running(self): - """Return True if the future is currently executing.""" - with self._condition: - return self._state == RUNNING - - def done(self): - """Return True if the future was cancelled or finished executing.""" - with self._condition: - return self._state in [CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED] - - def __get_result(self): - if self._exception is not None: - try: - raise self._exception - finally: - # Break a reference cycle with the exception in self._exception - self = None - else: - return self._result - - def add_done_callback(self, fn): - """Attaches a callable that will be called when the future finishes. - - Args: - fn: A callable that will be called with this future as its only - argument when the future completes or is cancelled. The callable - will always be called by a thread in the same process in which - it was added. If the future has already completed or been - cancelled then the callable will be called immediately. These - callables are called in the order that they were added. - """ - with self._condition: - if self._state not in [CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED]: - self._done_callbacks.append(fn) - return - try: - fn(self) - except Exception: - LOGGER.exception('exception calling callback for %r', self) - - def result(self, timeout=None): - """Return the result of the call that the future represents. - - Args: - timeout: The number of seconds to wait for the result if the future - isn't done. If None, then there is no limit on the wait time. - - Returns: - The result of the call that the future represents. - - Raises: - CancelledError: If the future was cancelled. - TimeoutError: If the future didn't finish executing before the given - timeout. - Exception: If the call raised then that exception will be raised. - """ - try: - with self._condition: - if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]: - raise CancelledError() - elif self._state == FINISHED: - return self.__get_result() - - self._condition.wait(timeout) - - if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]: - raise CancelledError() - elif self._state == FINISHED: - return self.__get_result() - else: - raise TimeoutError() - finally: - # Break a reference cycle with the exception in self._exception - self = None - - def exception(self, timeout=None): - """Return the exception raised by the call that the future represents. - - Args: - timeout: The number of seconds to wait for the exception if the - future isn't done. If None, then there is no limit on the wait - time. - - Returns: - The exception raised by the call that the future represents or None - if the call completed without raising. - - Raises: - CancelledError: If the future was cancelled. - TimeoutError: If the future didn't finish executing before the given - timeout. - """ - - with self._condition: - if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]: - raise CancelledError() - elif self._state == FINISHED: - return self._exception - - self._condition.wait(timeout) - - if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]: - raise CancelledError() - elif self._state == FINISHED: - return self._exception - else: - raise TimeoutError() - - # The following methods should only be used by Executors and in tests. - def set_running_or_notify_cancel(self): - """Mark the future as running or process any cancel notifications. - - Should only be used by Executor implementations and unit tests. - - If the future has been cancelled (cancel() was called and returned - True) then any threads waiting on the future completing (though calls - to as_completed() or wait()) are notified and False is returned. - - If the future was not cancelled then it is put in the running state - (future calls to running() will return True) and True is returned. - - This method should be called by Executor implementations before - executing the work associated with this future. If this method returns - False then the work should not be executed. - - Returns: - False if the Future was cancelled, True otherwise. - - Raises: - RuntimeError: if this method was already called or if set_result() - or set_exception() was called. - """ - with self._condition: - if self._state == CANCELLED: - self._state = CANCELLED_AND_NOTIFIED - for waiter in self._waiters: - waiter.add_cancelled(self) - # self._condition.notify_all() is not necessary because - # self.cancel() triggers a notification. - return False - elif self._state == PENDING: - self._state = RUNNING - return True - else: - LOGGER.critical('Future %s in unexpected state: %s', - id(self), - self._state) - raise RuntimeError('Future in unexpected state') - - def set_result(self, result): - """Sets the return value of work associated with the future. - - Should only be used by Executor implementations and unit tests. - """ - with self._condition: - if self._state in {CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED}: - raise InvalidStateError('{}: {!r}'.format(self._state, self)) - self._result = result - self._state = FINISHED - for waiter in self._waiters: - waiter.add_result(self) - self._condition.notify_all() - self._invoke_callbacks() - - def set_exception(self, exception): - """Sets the result of the future as being the given exception. - - Should only be used by Executor implementations and unit tests. - """ - with self._condition: - if self._state in {CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED}: - raise InvalidStateError('{}: {!r}'.format(self._state, self)) - self._exception = exception - self._state = FINISHED - for waiter in self._waiters: - waiter.add_exception(self) - self._condition.notify_all() - self._invoke_callbacks() - - __class_getitem__ = classmethod(types.GenericAlias) - -class Executor(object): - """This is an abstract base class for concrete asynchronous executors.""" - - def submit(self, fn, /, *args, **kwargs): - """Submits a callable to be executed with the given arguments. - - Schedules the callable to be executed as fn(*args, **kwargs) and returns - a Future instance representing the execution of the callable. - - Returns: - A Future representing the given call. - """ - raise NotImplementedError() - - def map(self, fn, *iterables, timeout=None, chunksize=1, buffersize=None): - """Returns an iterator equivalent to map(fn, iter). - - Args: - fn: A callable that will take as many arguments as there are - passed iterables. - timeout: The maximum number of seconds to wait. If None, then there - is no limit on the wait time. - chunksize: The size of the chunks the iterable will be broken into - before being passed to a child process. This argument is only - used by ProcessPoolExecutor; it is ignored by - ThreadPoolExecutor. - buffersize: The number of submitted tasks whose results have not - yet been yielded. If the buffer is full, iteration over the - iterables pauses until a result is yielded from the buffer. - If None, all input elements are eagerly collected, and a task is - submitted for each. - - Returns: - An iterator equivalent to: map(func, *iterables) but the calls may - be evaluated out-of-order. - - Raises: - TimeoutError: If the entire result iterator could not be generated - before the given timeout. - Exception: If fn(*args) raises for any values. - """ - if buffersize is not None and not isinstance(buffersize, int): - raise TypeError("buffersize must be an integer or None") - if buffersize is not None and buffersize < 1: - raise ValueError("buffersize must be None or > 0") - - if timeout is not None: - end_time = timeout + time.monotonic() - - zipped_iterables = zip(*iterables) - if buffersize: - fs = collections.deque( - self.submit(fn, *args) for args in islice(zipped_iterables, buffersize) - ) - else: - fs = [self.submit(fn, *args) for args in zipped_iterables] - - # Use a weak reference to ensure that the executor can be garbage - # collected independently of the result_iterator closure. - executor_weakref = weakref.ref(self) - - # Yield must be hidden in closure so that the futures are submitted - # before the first iterator value is required. - def result_iterator(): - try: - # reverse to keep finishing order - fs.reverse() - while fs: - if ( - buffersize - and (executor := executor_weakref()) - and (args := next(zipped_iterables, None)) - ): - fs.appendleft(executor.submit(fn, *args)) - # Careful not to keep a reference to the popped future - if timeout is None: - yield _result_or_cancel(fs.pop()) - else: - yield _result_or_cancel(fs.pop(), end_time - time.monotonic()) - finally: - for future in fs: - future.cancel() - return result_iterator() - - def shutdown(self, wait=True, *, cancel_futures=False): - """Clean-up the resources associated with the Executor. - - It is safe to call this method several times. Otherwise, no other - methods can be called after this one. - - Args: - wait: If True then shutdown will not return until all running - futures have finished executing and the resources used by the - executor have been reclaimed. - cancel_futures: If True then shutdown will cancel all pending - futures. Futures that are completed or running will not be - cancelled. - """ - pass - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.shutdown(wait=True) - return False - - -class BrokenExecutor(RuntimeError): - """ - Raised when a executor has become non-functional after a severe failure. - """ diff --git a/Python314_4_x86_Template/Lib/concurrent/futures/interpreter.py b/Python314_4_x86_Template/Lib/concurrent/futures/interpreter.py deleted file mode 100644 index 85c1da2c7..000000000 --- a/Python314_4_x86_Template/Lib/concurrent/futures/interpreter.py +++ /dev/null @@ -1,123 +0,0 @@ -"""Implements InterpreterPoolExecutor.""" - -from concurrent import interpreters -import sys -from . import thread as _thread -import traceback - - -def do_call(results, func, args, kwargs): - try: - return func(*args, **kwargs) - except BaseException as exc: - # Send the captured exception out on the results queue, - # but still leave it unhandled for the interpreter to handle. - try: - results.put(exc) - except interpreters.NotShareableError: - # The exception is not shareable. - print('exception is not shareable:', file=sys.stderr) - traceback.print_exception(exc) - results.put(None) - raise # re-raise - - -class WorkerContext(_thread.WorkerContext): - - @classmethod - def prepare(cls, initializer, initargs): - def resolve_task(fn, args, kwargs): - if isinstance(fn, str): - # XXX Circle back to this later. - raise TypeError('scripts not supported') - else: - task = (fn, args, kwargs) - return task - - if initializer is not None: - try: - initdata = resolve_task(initializer, initargs, {}) - except ValueError: - if isinstance(initializer, str) and initargs: - raise ValueError(f'an initializer script does not take args, got {initargs!r}') - raise # re-raise - else: - initdata = None - def create_context(): - return cls(initdata) - return create_context, resolve_task - - def __init__(self, initdata): - self.initdata = initdata - self.interp = None - self.results = None - - def __del__(self): - if self.interp is not None: - self.finalize() - - def initialize(self): - assert self.interp is None, self.interp - self.interp = interpreters.create() - try: - maxsize = 0 - self.results = interpreters.create_queue(maxsize) - - if self.initdata: - self.run(self.initdata) - except BaseException: - self.finalize() - raise # re-raise - - def finalize(self): - interp = self.interp - results = self.results - self.results = None - self.interp = None - if results is not None: - del results - if interp is not None: - interp.close() - - def run(self, task): - try: - return self.interp.call(do_call, self.results, *task) - except interpreters.ExecutionFailed as wrapper: - # Wait for the exception data to show up. - exc = self.results.get() - if exc is None: - # The exception must have been not shareable. - raise # re-raise - raise exc from wrapper - - -class BrokenInterpreterPool(_thread.BrokenThreadPool): - """ - Raised when a worker thread in an InterpreterPoolExecutor failed initializing. - """ - - -class InterpreterPoolExecutor(_thread.ThreadPoolExecutor): - - BROKEN = BrokenInterpreterPool - - @classmethod - def prepare_context(cls, initializer, initargs): - return WorkerContext.prepare(initializer, initargs) - - def __init__(self, max_workers=None, thread_name_prefix='', - initializer=None, initargs=()): - """Initializes a new InterpreterPoolExecutor instance. - - Args: - max_workers: The maximum number of interpreters that can be used to - execute the given calls. - thread_name_prefix: An optional name prefix to give our threads. - initializer: A callable or script used to initialize - each worker interpreter. - initargs: A tuple of arguments to pass to the initializer. - """ - thread_name_prefix = (thread_name_prefix or - (f"InterpreterPoolExecutor-{self._counter()}")) - super().__init__(max_workers, thread_name_prefix, - initializer, initargs) diff --git a/Python314_4_x86_Template/Lib/concurrent/futures/process.py b/Python314_4_x86_Template/Lib/concurrent/futures/process.py deleted file mode 100644 index a14650bf5..000000000 --- a/Python314_4_x86_Template/Lib/concurrent/futures/process.py +++ /dev/null @@ -1,939 +0,0 @@ -# Copyright 2009 Brian Quinlan. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Implements ProcessPoolExecutor. - -The following diagram and text describe the data-flow through the system: - -|======================= In-process =====================|== Out-of-process ==| - -+----------+ +----------+ +--------+ +-----------+ +---------+ -| | => | Work Ids | | | | Call Q | | Process | -| | +----------+ | | +-----------+ | Pool | -| | | ... | | | | ... | +---------+ -| | | 6 | => | | => | 5, call() | => | | -| | | 7 | | | | ... | | | -| Process | | ... | | Local | +-----------+ | Process | -| Pool | +----------+ | Worker | | #1..n | -| Executor | | Thread | | | -| | +----------- + | | +-----------+ | | -| | <=> | Work Items | <=> | | <= | Result Q | <= | | -| | +------------+ | | +-----------+ | | -| | | 6: call() | | | | ... | | | -| | | future | | | | 4, result | | | -| | | ... | | | | 3, except | | | -+----------+ +------------+ +--------+ +-----------+ +---------+ - -Executor.submit() called: -- creates a uniquely numbered _WorkItem and adds it to the "Work Items" dict -- adds the id of the _WorkItem to the "Work Ids" queue - -Local worker thread: -- reads work ids from the "Work Ids" queue and looks up the corresponding - WorkItem from the "Work Items" dict: if the work item has been cancelled then - it is simply removed from the dict, otherwise it is repackaged as a - _CallItem and put in the "Call Q". New _CallItems are put in the "Call Q" - until "Call Q" is full. NOTE: the size of the "Call Q" is kept small because - calls placed in the "Call Q" can no longer be cancelled with Future.cancel(). -- reads _ResultItems from "Result Q", updates the future stored in the - "Work Items" dict and deletes the dict entry - -Process #1..n: -- reads _CallItems from "Call Q", executes the calls, and puts the resulting - _ResultItems in "Result Q" -""" - -__author__ = 'Brian Quinlan (brian@sweetapp.com)' - -import os -from concurrent.futures import _base -import queue -import multiprocessing as mp -# This import is required to load the multiprocessing.connection submodule -# so that it can be accessed later as `mp.connection` -import multiprocessing.connection -from multiprocessing.queues import Queue -import threading -import weakref -from functools import partial -import itertools -import sys -from traceback import format_exception - - -_threads_wakeups = weakref.WeakKeyDictionary() -_global_shutdown = False - - -class _ThreadWakeup: - def __init__(self): - self._closed = False - self._lock = threading.Lock() - self._reader, self._writer = mp.Pipe(duplex=False) - - def close(self): - # Please note that we do not take the self._lock when - # calling clear() (to avoid deadlocking) so this method can - # only be called safely from the same thread as all calls to - # clear() even if you hold the lock. Otherwise we - # might try to read from the closed pipe. - with self._lock: - if not self._closed: - self._closed = True - self._writer.close() - self._reader.close() - - def wakeup(self): - with self._lock: - if not self._closed: - self._writer.send_bytes(b"") - - def clear(self): - if self._closed: - raise RuntimeError('operation on closed _ThreadWakeup') - while self._reader.poll(): - self._reader.recv_bytes() - - -def _python_exit(): - global _global_shutdown - _global_shutdown = True - items = list(_threads_wakeups.items()) - for _, thread_wakeup in items: - # call not protected by ProcessPoolExecutor._shutdown_lock - thread_wakeup.wakeup() - for t, _ in items: - t.join() - -# Register for `_python_exit()` to be called just before joining all -# non-daemon threads. This is used instead of `atexit.register()` for -# compatibility with subinterpreters, which no longer support daemon threads. -# See bpo-39812 for context. -threading._register_atexit(_python_exit) - -# Controls how many more calls than processes will be queued in the call queue. -# A smaller number will mean that processes spend more time idle waiting for -# work while a larger number will make Future.cancel() succeed less frequently -# (Futures in the call queue cannot be cancelled). -EXTRA_QUEUED_CALLS = 1 - - -# On Windows, WaitForMultipleObjects is used to wait for processes to finish. -# It can wait on, at most, 63 objects. There is an overhead of two objects: -# - the result queue reader -# - the thread wakeup reader -_MAX_WINDOWS_WORKERS = 63 - 2 - -# Hack to embed stringification of remote traceback in local traceback - -class _RemoteTraceback(Exception): - def __init__(self, tb): - self.tb = tb - def __str__(self): - return self.tb - -class _ExceptionWithTraceback: - def __init__(self, exc, tb): - tb = ''.join(format_exception(type(exc), exc, tb)) - self.exc = exc - # Traceback object needs to be garbage-collected as its frames - # contain references to all the objects in the exception scope - self.exc.__traceback__ = None - self.tb = '\n"""\n%s"""' % tb - def __reduce__(self): - return _rebuild_exc, (self.exc, self.tb) - -def _rebuild_exc(exc, tb): - exc.__cause__ = _RemoteTraceback(tb) - return exc - -class _WorkItem(object): - def __init__(self, future, fn, args, kwargs): - self.future = future - self.fn = fn - self.args = args - self.kwargs = kwargs - -class _ResultItem(object): - def __init__(self, work_id, exception=None, result=None, exit_pid=None): - self.work_id = work_id - self.exception = exception - self.result = result - self.exit_pid = exit_pid - -class _CallItem(object): - def __init__(self, work_id, fn, args, kwargs): - self.work_id = work_id - self.fn = fn - self.args = args - self.kwargs = kwargs - - -class _SafeQueue(Queue): - """Safe Queue set exception to the future object linked to a job""" - def __init__(self, max_size=0, *, ctx, pending_work_items, thread_wakeup): - self.pending_work_items = pending_work_items - self.thread_wakeup = thread_wakeup - super().__init__(max_size, ctx=ctx) - - def _on_queue_feeder_error(self, e, obj): - if isinstance(obj, _CallItem): - tb = format_exception(type(e), e, e.__traceback__) - e.__cause__ = _RemoteTraceback('\n"""\n{}"""'.format(''.join(tb))) - work_item = self.pending_work_items.pop(obj.work_id, None) - self.thread_wakeup.wakeup() - # work_item can be None if another process terminated. In this - # case, the executor_manager_thread fails all work_items - # with BrokenProcessPool - if work_item is not None: - work_item.future.set_exception(e) - else: - super()._on_queue_feeder_error(e, obj) - - -def _process_chunk(fn, chunk): - """ Processes a chunk of an iterable passed to map. - - Runs the function passed to map() on a chunk of the - iterable passed to map. - - This function is run in a separate process. - - """ - return [fn(*args) for args in chunk] - - -def _sendback_result(result_queue, work_id, result=None, exception=None, - exit_pid=None): - """Safely send back the given result or exception""" - try: - result_queue.put(_ResultItem(work_id, result=result, - exception=exception, exit_pid=exit_pid)) - except BaseException as e: - exc = _ExceptionWithTraceback(e, e.__traceback__) - result_queue.put(_ResultItem(work_id, exception=exc, - exit_pid=exit_pid)) - - -def _process_worker(call_queue, result_queue, initializer, initargs, max_tasks=None): - """Evaluates calls from call_queue and places the results in result_queue. - - This worker is run in a separate process. - - Args: - call_queue: A ctx.Queue of _CallItems that will be read and - evaluated by the worker. - result_queue: A ctx.Queue of _ResultItems that will written - to by the worker. - initializer: A callable initializer, or None - initargs: A tuple of args for the initializer - """ - if initializer is not None: - try: - initializer(*initargs) - except BaseException: - _base.LOGGER.critical('Exception in initializer:', exc_info=True) - # The parent will notice that the process stopped and - # mark the pool broken - return - num_tasks = 0 - exit_pid = None - while True: - call_item = call_queue.get(block=True) - if call_item is None: - # Wake up queue management thread - result_queue.put(os.getpid()) - return - - if max_tasks is not None: - num_tasks += 1 - if num_tasks >= max_tasks: - exit_pid = os.getpid() - - try: - r = call_item.fn(*call_item.args, **call_item.kwargs) - except BaseException as e: - exc = _ExceptionWithTraceback(e, e.__traceback__) - _sendback_result(result_queue, call_item.work_id, exception=exc, - exit_pid=exit_pid) - else: - _sendback_result(result_queue, call_item.work_id, result=r, - exit_pid=exit_pid) - del r - - # Liberate the resource as soon as possible, to avoid holding onto - # open files or shared memory that is not needed anymore - del call_item - - if exit_pid is not None: - return - - -class _ExecutorManagerThread(threading.Thread): - """Manages the communication between this process and the worker processes. - - The manager is run in a local thread. - - Args: - executor: A reference to the ProcessPoolExecutor that owns - this thread. A weakref will be own by the manager as well as - references to internal objects used to introspect the state of - the executor. - """ - - def __init__(self, executor): - # Store references to necessary internals of the executor. - - # A _ThreadWakeup to allow waking up the queue_manager_thread from the - # main Thread and avoid deadlocks caused by permanently locked queues. - self.thread_wakeup = executor._executor_manager_thread_wakeup - self.shutdown_lock = executor._shutdown_lock - - # A weakref.ref to the ProcessPoolExecutor that owns this thread. Used - # to determine if the ProcessPoolExecutor has been garbage collected - # and that the manager can exit. - # When the executor gets garbage collected, the weakref callback - # will wake up the queue management thread so that it can terminate - # if there is no pending work item. - def weakref_cb(_, - thread_wakeup=self.thread_wakeup, - mp_util_debug=mp.util.debug): - mp_util_debug('Executor collected: triggering callback for' - ' QueueManager wakeup') - thread_wakeup.wakeup() - - self.executor_reference = weakref.ref(executor, weakref_cb) - - # A list of the ctx.Process instances used as workers. - self.processes = executor._processes - - # A ctx.Queue that will be filled with _CallItems derived from - # _WorkItems for processing by the process workers. - self.call_queue = executor._call_queue - - # A ctx.SimpleQueue of _ResultItems generated by the process workers. - self.result_queue = executor._result_queue - - # A queue.Queue of work ids e.g. Queue([5, 6, ...]). - self.work_ids_queue = executor._work_ids - - # Maximum number of tasks a worker process can execute before - # exiting safely - self.max_tasks_per_child = executor._max_tasks_per_child - - # A dict mapping work ids to _WorkItems e.g. - # {5: <_WorkItem...>, 6: <_WorkItem...>, ...} - self.pending_work_items = executor._pending_work_items - - super().__init__() - - def run(self): - # Main loop for the executor manager thread. - - while True: - # gh-109047: During Python finalization, self.call_queue.put() - # creation of a thread can fail with RuntimeError. - try: - self.add_call_item_to_queue() - except BaseException as exc: - cause = format_exception(exc) - self.terminate_broken(cause) - return - - result_item, is_broken, cause = self.wait_result_broken_or_wakeup() - - if is_broken: - self.terminate_broken(cause) - return - if result_item is not None: - self.process_result_item(result_item) - - process_exited = result_item.exit_pid is not None - if process_exited: - p = self.processes.pop(result_item.exit_pid) - p.join() - - # Delete reference to result_item to avoid keeping references - # while waiting on new results. - del result_item - - if executor := self.executor_reference(): - if process_exited: - with self.shutdown_lock: - executor._adjust_process_count() - else: - executor._idle_worker_semaphore.release() - del executor - - if self.is_shutting_down(): - self.flag_executor_shutting_down() - - # When only canceled futures remain in pending_work_items, our - # next call to wait_result_broken_or_wakeup would hang forever. - # This makes sure we have some running futures or none at all. - self.add_call_item_to_queue() - - # Since no new work items can be added, it is safe to shutdown - # this thread if there are no pending work items. - if not self.pending_work_items: - self.join_executor_internals() - return - - def add_call_item_to_queue(self): - # Fills call_queue with _WorkItems from pending_work_items. - # This function never blocks. - while True: - if self.call_queue.full(): - return - try: - work_id = self.work_ids_queue.get(block=False) - except queue.Empty: - return - else: - work_item = self.pending_work_items[work_id] - - if work_item.future.set_running_or_notify_cancel(): - self.call_queue.put(_CallItem(work_id, - work_item.fn, - work_item.args, - work_item.kwargs), - block=True) - else: - del self.pending_work_items[work_id] - continue - - def wait_result_broken_or_wakeup(self): - # Wait for a result to be ready in the result_queue while checking - # that all worker processes are still running, or for a wake up - # signal send. The wake up signals come either from new tasks being - # submitted, from the executor being shutdown/gc-ed, or from the - # shutdown of the python interpreter. - result_reader = self.result_queue._reader - assert not self.thread_wakeup._closed - wakeup_reader = self.thread_wakeup._reader - readers = [result_reader, wakeup_reader] - worker_sentinels = [p.sentinel for p in list(self.processes.values())] - ready = mp.connection.wait(readers + worker_sentinels) - - cause = None - is_broken = True - result_item = None - if result_reader in ready: - try: - result_item = result_reader.recv() - is_broken = False - except BaseException as exc: - cause = format_exception(exc) - - elif wakeup_reader in ready: - is_broken = False - - self.thread_wakeup.clear() - - return result_item, is_broken, cause - - def process_result_item(self, result_item): - # Process the received a result_item. This can be either the PID of a - # worker that exited gracefully or a _ResultItem - - # Received a _ResultItem so mark the future as completed. - work_item = self.pending_work_items.pop(result_item.work_id, None) - # work_item can be None if another process terminated (see above) - if work_item is not None: - if result_item.exception is not None: - work_item.future.set_exception(result_item.exception) - else: - work_item.future.set_result(result_item.result) - - def is_shutting_down(self): - # Check whether we should start shutting down the executor. - executor = self.executor_reference() - # No more work items can be added if: - # - The interpreter is shutting down OR - # - The executor that owns this worker has been collected OR - # - The executor that owns this worker has been shutdown. - return (_global_shutdown or executor is None - or executor._shutdown_thread) - - def _terminate_broken(self, cause): - # Terminate the executor because it is in a broken state. The cause - # argument can be used to display more information on the error that - # lead the executor into becoming broken. - - # Mark the process pool broken so that submits fail right now. - executor = self.executor_reference() - if executor is not None: - executor._broken = ('A child process terminated ' - 'abruptly, the process pool is not ' - 'usable anymore') - executor._shutdown_thread = True - executor = None - - # All pending tasks are to be marked failed with the following - # BrokenProcessPool error - bpe = BrokenProcessPool("A process in the process pool was " - "terminated abruptly while the future was " - "running or pending.") - if cause is not None: - bpe.__cause__ = _RemoteTraceback( - f"\n'''\n{''.join(cause)}'''") - - # Mark pending tasks as failed. - for work_id, work_item in self.pending_work_items.items(): - try: - work_item.future.set_exception(bpe) - except _base.InvalidStateError: - # set_exception() fails if the future is cancelled: ignore it. - # Trying to check if the future is cancelled before calling - # set_exception() would leave a race condition if the future is - # cancelled between the check and set_exception(). - pass - # Delete references to object. See issue16284 - del work_item - self.pending_work_items.clear() - - # Terminate remaining workers forcibly: the queues or their - # locks may be in a dirty state and block forever. - for p in self.processes.values(): - p.terminate() - - self.call_queue._terminate_broken() - - # clean up resources - self._join_executor_internals(broken=True) - - def terminate_broken(self, cause): - with self.shutdown_lock: - self._terminate_broken(cause) - - def flag_executor_shutting_down(self): - # Flag the executor as shutting down and cancel remaining tasks if - # requested as early as possible if it is not gc-ed yet. - executor = self.executor_reference() - if executor is not None: - executor._shutdown_thread = True - # Cancel pending work items if requested. - if executor._cancel_pending_futures: - # Cancel all pending futures and update pending_work_items - # to only have futures that are currently running. - new_pending_work_items = {} - for work_id, work_item in self.pending_work_items.items(): - if not work_item.future.cancel(): - new_pending_work_items[work_id] = work_item - self.pending_work_items = new_pending_work_items - # Drain work_ids_queue since we no longer need to - # add items to the call queue. - while True: - try: - self.work_ids_queue.get_nowait() - except queue.Empty: - break - # Make sure we do this only once to not waste time looping - # on running processes over and over. - executor._cancel_pending_futures = False - - def shutdown_workers(self): - n_children_to_stop = self.get_n_children_alive() - n_sentinels_sent = 0 - # Send the right number of sentinels, to make sure all children are - # properly terminated. - while (n_sentinels_sent < n_children_to_stop - and self.get_n_children_alive() > 0): - for i in range(n_children_to_stop - n_sentinels_sent): - try: - self.call_queue.put_nowait(None) - n_sentinels_sent += 1 - except queue.Full: - break - - def join_executor_internals(self): - with self.shutdown_lock: - self._join_executor_internals() - - def _join_executor_internals(self, broken=False): - # If broken, call_queue was closed and so can no longer be used. - if not broken: - self.shutdown_workers() - - # Release the queue's resources as soon as possible. - self.call_queue.close() - self.call_queue.join_thread() - self.thread_wakeup.close() - - # If .join() is not called on the created processes then - # some ctx.Queue methods may deadlock on Mac OS X. - for p in self.processes.values(): - if broken: - p.terminate() - p.join() - - def get_n_children_alive(self): - # This is an upper bound on the number of children alive. - return sum(p.is_alive() for p in self.processes.values()) - - -_system_limits_checked = False -_system_limited = None - - -def _check_system_limits(): - global _system_limits_checked, _system_limited - if _system_limits_checked: - if _system_limited: - raise NotImplementedError(_system_limited) - _system_limits_checked = True - try: - import multiprocessing.synchronize # noqa: F401 - except ImportError: - _system_limited = ( - "This Python build lacks multiprocessing.synchronize, usually due " - "to named semaphores being unavailable on this platform." - ) - raise NotImplementedError(_system_limited) - try: - nsems_max = os.sysconf("SC_SEM_NSEMS_MAX") - except (AttributeError, ValueError): - # sysconf not available or setting not available - return - if nsems_max == -1: - # indetermined limit, assume that limit is determined - # by available memory only - return - if nsems_max >= 256: - # minimum number of semaphores available - # according to POSIX - return - _system_limited = ("system provides too few semaphores (%d" - " available, 256 necessary)" % nsems_max) - raise NotImplementedError(_system_limited) - - -def _chain_from_iterable_of_lists(iterable): - """ - Specialized implementation of itertools.chain.from_iterable. - Each item in *iterable* should be a list. This function is - careful not to keep references to yielded objects. - """ - for element in iterable: - element.reverse() - while element: - yield element.pop() - - -class BrokenProcessPool(_base.BrokenExecutor): - """ - Raised when a process in a ProcessPoolExecutor terminated abruptly - while a future was in the running state. - """ - -_TERMINATE = "terminate" -_KILL = "kill" - -_SHUTDOWN_CALLBACK_OPERATION = { - _TERMINATE, - _KILL -} - - -class ProcessPoolExecutor(_base.Executor): - def __init__(self, max_workers=None, mp_context=None, - initializer=None, initargs=(), *, max_tasks_per_child=None): - """Initializes a new ProcessPoolExecutor instance. - - Args: - max_workers: The maximum number of processes that can be used to - execute the given calls. If None or not given then as many - worker processes will be created as the machine has processors. - mp_context: A multiprocessing context to launch the workers created - using the multiprocessing.get_context('start method') API. This - object should provide SimpleQueue, Queue and Process. - initializer: A callable used to initialize worker processes. - initargs: A tuple of arguments to pass to the initializer. - max_tasks_per_child: The maximum number of tasks a worker process - can complete before it will exit and be replaced with a fresh - worker process. The default of None means worker process will - live as long as the executor. Requires a non-'fork' mp_context - start method. When given, we default to using 'spawn' if no - mp_context is supplied. - """ - _check_system_limits() - - if max_workers is None: - self._max_workers = os.process_cpu_count() or 1 - if sys.platform == 'win32': - self._max_workers = min(_MAX_WINDOWS_WORKERS, - self._max_workers) - else: - if max_workers <= 0: - raise ValueError("max_workers must be greater than 0") - elif (sys.platform == 'win32' and - max_workers > _MAX_WINDOWS_WORKERS): - raise ValueError( - f"max_workers must be <= {_MAX_WINDOWS_WORKERS}") - - self._max_workers = max_workers - - if mp_context is None: - if max_tasks_per_child is not None: - mp_context = mp.get_context("spawn") - else: - mp_context = mp.get_context() - self._mp_context = mp_context - - # https://github.com/python/cpython/issues/90622 - self._safe_to_dynamically_spawn_children = ( - self._mp_context.get_start_method(allow_none=False) != "fork") - - if initializer is not None and not callable(initializer): - raise TypeError("initializer must be a callable") - self._initializer = initializer - self._initargs = initargs - - if max_tasks_per_child is not None: - if not isinstance(max_tasks_per_child, int): - raise TypeError("max_tasks_per_child must be an integer") - elif max_tasks_per_child <= 0: - raise ValueError("max_tasks_per_child must be >= 1") - if self._mp_context.get_start_method(allow_none=False) == "fork": - # https://github.com/python/cpython/issues/90622 - raise ValueError("max_tasks_per_child is incompatible with" - " the 'fork' multiprocessing start method;" - " supply a different mp_context.") - self._max_tasks_per_child = max_tasks_per_child - - # Management thread - self._executor_manager_thread = None - - # Map of pids to processes - self._processes = {} - - # Shutdown is a two-step process. - self._shutdown_thread = False - self._shutdown_lock = threading.Lock() - self._idle_worker_semaphore = threading.Semaphore(0) - self._broken = False - self._queue_count = 0 - self._pending_work_items = {} - self._cancel_pending_futures = False - - # _ThreadWakeup is a communication channel used to interrupt the wait - # of the main loop of executor_manager_thread from another thread (e.g. - # when calling executor.submit or executor.shutdown). We do not use the - # _result_queue to send wakeup signals to the executor_manager_thread - # as it could result in a deadlock if a worker process dies with the - # _result_queue write lock still acquired. - # - # Care must be taken to only call clear and close from the - # executor_manager_thread, since _ThreadWakeup.clear() is not protected - # by a lock. - self._executor_manager_thread_wakeup = _ThreadWakeup() - - # Create communication channels for the executor - # Make the call queue slightly larger than the number of processes to - # prevent the worker processes from idling. But don't make it too big - # because futures in the call queue cannot be cancelled. - queue_size = self._max_workers + EXTRA_QUEUED_CALLS - self._call_queue = _SafeQueue( - max_size=queue_size, ctx=self._mp_context, - pending_work_items=self._pending_work_items, - thread_wakeup=self._executor_manager_thread_wakeup) - # Killed worker processes can produce spurious "broken pipe" - # tracebacks in the queue's own worker thread. But we detect killed - # processes anyway, so silence the tracebacks. - self._call_queue._ignore_epipe = True - self._result_queue = mp_context.SimpleQueue() - self._work_ids = queue.Queue() - - def _start_executor_manager_thread(self): - if self._executor_manager_thread is None: - # Start the processes so that their sentinels are known. - if not self._safe_to_dynamically_spawn_children: # ie, using fork. - self._launch_processes() - self._executor_manager_thread = _ExecutorManagerThread(self) - self._executor_manager_thread.start() - _threads_wakeups[self._executor_manager_thread] = \ - self._executor_manager_thread_wakeup - - def _adjust_process_count(self): - # gh-132969: avoid error when state is reset and executor is still running, - # which will happen when shutdown(wait=False) is called. - if self._processes is None: - return - - # if there's an idle process, we don't need to spawn a new one. - if self._idle_worker_semaphore.acquire(blocking=False): - return - - process_count = len(self._processes) - if process_count < self._max_workers: - # Assertion disabled as this codepath is also used to replace a - # worker that unexpectedly dies, even when using the 'fork' start - # method. That means there is still a potential deadlock bug. If a - # 'fork' mp_context worker dies, we'll be forking a new one when - # we know a thread is running (self._executor_manager_thread). - #assert self._safe_to_dynamically_spawn_children or not self._executor_manager_thread, 'https://github.com/python/cpython/issues/90622' - self._spawn_process() - - def _launch_processes(self): - # https://github.com/python/cpython/issues/90622 - assert not self._executor_manager_thread, ( - 'Processes cannot be fork()ed after the thread has started, ' - 'deadlock in the child processes could result.') - for _ in range(len(self._processes), self._max_workers): - self._spawn_process() - - def _spawn_process(self): - p = self._mp_context.Process( - target=_process_worker, - args=(self._call_queue, - self._result_queue, - self._initializer, - self._initargs, - self._max_tasks_per_child)) - p.start() - self._processes[p.pid] = p - - def submit(self, fn, /, *args, **kwargs): - with self._shutdown_lock: - if self._broken: - raise BrokenProcessPool(self._broken) - if self._shutdown_thread: - raise RuntimeError('cannot schedule new futures after shutdown') - if _global_shutdown: - raise RuntimeError('cannot schedule new futures after ' - 'interpreter shutdown') - - f = _base.Future() - w = _WorkItem(f, fn, args, kwargs) - - self._pending_work_items[self._queue_count] = w - self._work_ids.put(self._queue_count) - self._queue_count += 1 - # Wake up queue management thread - self._executor_manager_thread_wakeup.wakeup() - - if self._safe_to_dynamically_spawn_children: - self._adjust_process_count() - self._start_executor_manager_thread() - return f - submit.__doc__ = _base.Executor.submit.__doc__ - - def map(self, fn, *iterables, timeout=None, chunksize=1, buffersize=None): - """Returns an iterator equivalent to map(fn, iter). - - Args: - fn: A callable that will take as many arguments as there are - passed iterables. - timeout: The maximum number of seconds to wait. If None, then there - is no limit on the wait time. - chunksize: If greater than one, the iterables will be chopped into - chunks of size chunksize and submitted to the process pool. - If set to one, the items in the list will be sent one at a time. - buffersize: The number of submitted tasks whose results have not - yet been yielded. If the buffer is full, iteration over the - iterables pauses until a result is yielded from the buffer. - If None, all input elements are eagerly collected, and a task is - submitted for each. - - Returns: - An iterator equivalent to: map(func, *iterables) but the calls may - be evaluated out-of-order. - - Raises: - TimeoutError: If the entire result iterator could not be generated - before the given timeout. - Exception: If fn(*args) raises for any values. - """ - if chunksize < 1: - raise ValueError("chunksize must be >= 1.") - - results = super().map(partial(_process_chunk, fn), - itertools.batched(zip(*iterables), chunksize), - timeout=timeout, - buffersize=buffersize) - return _chain_from_iterable_of_lists(results) - - def shutdown(self, wait=True, *, cancel_futures=False): - with self._shutdown_lock: - self._cancel_pending_futures = cancel_futures - self._shutdown_thread = True - if self._executor_manager_thread_wakeup is not None: - # Wake up queue management thread - self._executor_manager_thread_wakeup.wakeup() - - if self._executor_manager_thread is not None and wait: - self._executor_manager_thread.join() - # To reduce the risk of opening too many files, remove references to - # objects that use file descriptors. - self._executor_manager_thread = None - self._call_queue = None - if self._result_queue is not None and wait: - self._result_queue.close() - self._result_queue = None - self._processes = None - self._executor_manager_thread_wakeup = None - - shutdown.__doc__ = _base.Executor.shutdown.__doc__ - - def _force_shutdown(self, operation): - """Attempts to terminate or kill the executor's workers based off the - given operation. Iterates through all of the current processes and - performs the relevant task if the process is still alive. - - After terminating workers, the pool will be in a broken state - and no longer usable (for instance, new tasks should not be - submitted). - """ - if operation not in _SHUTDOWN_CALLBACK_OPERATION: - raise ValueError(f"Unsupported operation: {operation!r}") - - processes = {} - if self._processes: - processes = self._processes.copy() - - # shutdown will invalidate ._processes, so we copy it right before - # calling. If we waited here, we would deadlock if a process decides not - # to exit. - self.shutdown(wait=False, cancel_futures=True) - - if not processes: - return - - for proc in processes.values(): - try: - if not proc.is_alive(): - continue - except ValueError: - # The process is already exited/closed out. - continue - - try: - if operation == _TERMINATE: - proc.terminate() - elif operation == _KILL: - proc.kill() - except ProcessLookupError: - # The process just ended before our signal - continue - - def terminate_workers(self): - """Attempts to terminate the executor's workers. - Iterates through all of the current worker processes and terminates - each one that is still alive. - - After terminating workers, the pool will be in a broken state - and no longer usable (for instance, new tasks should not be - submitted). - """ - return self._force_shutdown(operation=_TERMINATE) - - def kill_workers(self): - """Attempts to kill the executor's workers. - Iterates through all of the current worker processes and kills - each one that is still alive. - - After killing workers, the pool will be in a broken state - and no longer usable (for instance, new tasks should not be - submitted). - """ - return self._force_shutdown(operation=_KILL) diff --git a/Python314_4_x86_Template/Lib/concurrent/futures/thread.py b/Python314_4_x86_Template/Lib/concurrent/futures/thread.py deleted file mode 100644 index 909359b64..000000000 --- a/Python314_4_x86_Template/Lib/concurrent/futures/thread.py +++ /dev/null @@ -1,274 +0,0 @@ -# Copyright 2009 Brian Quinlan. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Implements ThreadPoolExecutor.""" - -__author__ = 'Brian Quinlan (brian@sweetapp.com)' - -from concurrent.futures import _base -import itertools -import queue -import threading -import types -import weakref -import os - - -_threads_queues = weakref.WeakKeyDictionary() -_shutdown = False -# Lock that ensures that new workers are not created while the interpreter is -# shutting down. Must be held while mutating _threads_queues and _shutdown. -_global_shutdown_lock = threading.Lock() - -def _python_exit(): - global _shutdown - with _global_shutdown_lock: - _shutdown = True - items = list(_threads_queues.items()) - for t, q in items: - q.put(None) - for t, q in items: - t.join() - -# Register for `_python_exit()` to be called just before joining all -# non-daemon threads. This is used instead of `atexit.register()` for -# compatibility with subinterpreters, which no longer support daemon threads. -# See bpo-39812 for context. -threading._register_atexit(_python_exit) - -# At fork, reinitialize the `_global_shutdown_lock` lock in the child process -if hasattr(os, 'register_at_fork'): - os.register_at_fork(before=_global_shutdown_lock.acquire, - after_in_child=_global_shutdown_lock._at_fork_reinit, - after_in_parent=_global_shutdown_lock.release) - os.register_at_fork(after_in_child=_threads_queues.clear) - - -class WorkerContext: - - @classmethod - def prepare(cls, initializer, initargs): - if initializer is not None: - if not callable(initializer): - raise TypeError("initializer must be a callable") - def create_context(): - return cls(initializer, initargs) - def resolve_task(fn, args, kwargs): - return (fn, args, kwargs) - return create_context, resolve_task - - def __init__(self, initializer, initargs): - self.initializer = initializer - self.initargs = initargs - - def initialize(self): - if self.initializer is not None: - self.initializer(*self.initargs) - - def finalize(self): - pass - - def run(self, task): - fn, args, kwargs = task - return fn(*args, **kwargs) - - -class _WorkItem: - def __init__(self, future, task): - self.future = future - self.task = task - - def run(self, ctx): - if not self.future.set_running_or_notify_cancel(): - return - - try: - result = ctx.run(self.task) - except BaseException as exc: - self.future.set_exception(exc) - # Break a reference cycle with the exception 'exc' - self = None - else: - self.future.set_result(result) - - __class_getitem__ = classmethod(types.GenericAlias) - - -def _worker(executor_reference, ctx, work_queue): - try: - ctx.initialize() - except BaseException: - _base.LOGGER.critical('Exception in initializer:', exc_info=True) - executor = executor_reference() - if executor is not None: - executor._initializer_failed() - return - try: - while True: - try: - work_item = work_queue.get_nowait() - except queue.Empty: - # attempt to increment idle count if queue is empty - executor = executor_reference() - if executor is not None: - executor._idle_semaphore.release() - del executor - work_item = work_queue.get(block=True) - - if work_item is not None: - work_item.run(ctx) - # Delete references to object. See GH-60488 - del work_item - continue - - executor = executor_reference() - # Exit if: - # - The interpreter is shutting down OR - # - The executor that owns the worker has been collected OR - # - The executor that owns the worker has been shutdown. - if _shutdown or executor is None or executor._shutdown: - # Flag the executor as shutting down as early as possible if it - # is not gc-ed yet. - if executor is not None: - executor._shutdown = True - # Notice other workers - work_queue.put(None) - return - del executor - except BaseException: - _base.LOGGER.critical('Exception in worker', exc_info=True) - finally: - ctx.finalize() - - -class BrokenThreadPool(_base.BrokenExecutor): - """ - Raised when a worker thread in a ThreadPoolExecutor failed initializing. - """ - - -class ThreadPoolExecutor(_base.Executor): - - BROKEN = BrokenThreadPool - - # Used to assign unique thread names when thread_name_prefix is not supplied. - _counter = itertools.count().__next__ - - @classmethod - def prepare_context(cls, initializer, initargs): - return WorkerContext.prepare(initializer, initargs) - - def __init__(self, max_workers=None, thread_name_prefix='', - initializer=None, initargs=(), **ctxkwargs): - """Initializes a new ThreadPoolExecutor instance. - - Args: - max_workers: The maximum number of threads that can be used to - execute the given calls. - thread_name_prefix: An optional name prefix to give our threads. - initializer: A callable used to initialize worker threads. - initargs: A tuple of arguments to pass to the initializer. - ctxkwargs: Additional arguments to cls.prepare_context(). - """ - if max_workers is None: - # ThreadPoolExecutor is often used to: - # * CPU bound task which releases GIL - # * I/O bound task (which releases GIL, of course) - # - # We use process_cpu_count + 4 for both types of tasks. - # But we limit it to 32 to avoid consuming surprisingly large resource - # on many core machine. - max_workers = min(32, (os.process_cpu_count() or 1) + 4) - if max_workers <= 0: - raise ValueError("max_workers must be greater than 0") - - (self._create_worker_context, - self._resolve_work_item_task, - ) = type(self).prepare_context(initializer, initargs, **ctxkwargs) - - self._max_workers = max_workers - self._work_queue = queue.SimpleQueue() - self._idle_semaphore = threading.Semaphore(0) - self._threads = set() - self._broken = False - self._shutdown = False - self._shutdown_lock = threading.Lock() - self._thread_name_prefix = (thread_name_prefix or - ("ThreadPoolExecutor-%d" % self._counter())) - - def submit(self, fn, /, *args, **kwargs): - with self._shutdown_lock, _global_shutdown_lock: - if self._broken: - raise self.BROKEN(self._broken) - - if self._shutdown: - raise RuntimeError('cannot schedule new futures after shutdown') - if _shutdown: - raise RuntimeError('cannot schedule new futures after ' - 'interpreter shutdown') - - f = _base.Future() - task = self._resolve_work_item_task(fn, args, kwargs) - w = _WorkItem(f, task) - - self._work_queue.put(w) - self._adjust_thread_count() - return f - submit.__doc__ = _base.Executor.submit.__doc__ - - def _adjust_thread_count(self): - # if idle threads are available, don't spin new threads - if self._idle_semaphore.acquire(timeout=0): - return - - # When the executor gets lost, the weakref callback will wake up - # the worker threads. - def weakref_cb(_, q=self._work_queue): - q.put(None) - - num_threads = len(self._threads) - if num_threads < self._max_workers: - thread_name = '%s_%d' % (self._thread_name_prefix or self, - num_threads) - t = threading.Thread(name=thread_name, target=_worker, - args=(weakref.ref(self, weakref_cb), - self._create_worker_context(), - self._work_queue)) - t.start() - self._threads.add(t) - _threads_queues[t] = self._work_queue - - def _initializer_failed(self): - with self._shutdown_lock: - self._broken = ('A thread initializer failed, the thread pool ' - 'is not usable anymore') - # Drain work queue and mark pending futures failed - while True: - try: - work_item = self._work_queue.get_nowait() - except queue.Empty: - break - if work_item is not None: - work_item.future.set_exception(self.BROKEN(self._broken)) - - def shutdown(self, wait=True, *, cancel_futures=False): - with self._shutdown_lock: - self._shutdown = True - if cancel_futures: - # Drain all work items from the queue, and then cancel their - # associated futures. - while True: - try: - work_item = self._work_queue.get_nowait() - except queue.Empty: - break - if work_item is not None: - work_item.future.cancel() - - # Send a wake-up to prevent threads calling - # _work_queue.get(block=True) from permanently blocking. - self._work_queue.put(None) - if wait: - for t in self._threads: - t.join() - shutdown.__doc__ = _base.Executor.shutdown.__doc__ diff --git a/Python314_4_x86_Template/Lib/concurrent/interpreters/__init__.py b/Python314_4_x86_Template/Lib/concurrent/interpreters/__init__.py deleted file mode 100644 index ea4147ee9..000000000 --- a/Python314_4_x86_Template/Lib/concurrent/interpreters/__init__.py +++ /dev/null @@ -1,247 +0,0 @@ -"""Subinterpreters High Level Module.""" - -import threading -import weakref -import _interpreters - -# aliases: -from _interpreters import ( - InterpreterError, InterpreterNotFoundError, NotShareableError, - is_shareable, -) -from ._queues import ( - create as create_queue, - Queue, QueueEmpty, QueueFull, -) - - -__all__ = [ - 'get_current', 'get_main', 'create', 'list_all', 'is_shareable', - 'Interpreter', - 'InterpreterError', 'InterpreterNotFoundError', 'ExecutionFailed', - 'NotShareableError', - 'create_queue', 'Queue', 'QueueEmpty', 'QueueFull', -] - - -_EXEC_FAILURE_STR = """ -{superstr} - -Uncaught in the interpreter: - -{formatted} -""".strip() - -class ExecutionFailed(InterpreterError): - """An unhandled exception happened during execution. - - This is raised from Interpreter.exec() and Interpreter.call(). - """ - - def __init__(self, excinfo): - msg = excinfo.formatted - if not msg: - if excinfo.type and excinfo.msg: - msg = f'{excinfo.type.__name__}: {excinfo.msg}' - else: - msg = excinfo.type.__name__ or excinfo.msg - super().__init__(msg) - self.excinfo = excinfo - - def __str__(self): - try: - formatted = self.excinfo.errdisplay - except Exception: - return super().__str__() - else: - return _EXEC_FAILURE_STR.format( - superstr=super().__str__(), - formatted=formatted, - ) - - -def create(): - """Return a new (idle) Python interpreter.""" - id = _interpreters.create(reqrefs=True) - return Interpreter(id, _ownsref=True) - - -def list_all(): - """Return all existing interpreters.""" - return [Interpreter(id, _whence=whence) - for id, whence in _interpreters.list_all(require_ready=True)] - - -def get_current(): - """Return the currently running interpreter.""" - id, whence = _interpreters.get_current() - return Interpreter(id, _whence=whence) - - -def get_main(): - """Return the main interpreter.""" - id, whence = _interpreters.get_main() - assert whence == _interpreters.WHENCE_RUNTIME, repr(whence) - return Interpreter(id, _whence=whence) - - -_known = weakref.WeakValueDictionary() - -class Interpreter: - """A single Python interpreter. - - Attributes: - - "id" - the unique process-global ID number for the interpreter - "whence" - indicates where the interpreter was created - - If the interpreter wasn't created by this module - then any method that modifies the interpreter will fail, - i.e. .close(), .prepare_main(), .exec(), and .call() - """ - - _WHENCE_TO_STR = { - _interpreters.WHENCE_UNKNOWN: 'unknown', - _interpreters.WHENCE_RUNTIME: 'runtime init', - _interpreters.WHENCE_LEGACY_CAPI: 'legacy C-API', - _interpreters.WHENCE_CAPI: 'C-API', - _interpreters.WHENCE_XI: 'cross-interpreter C-API', - _interpreters.WHENCE_STDLIB: '_interpreters module', - } - - def __new__(cls, id, /, _whence=None, _ownsref=None): - # There is only one instance for any given ID. - if not isinstance(id, int): - raise TypeError(f'id must be an int, got {id!r}') - id = int(id) - if _whence is None: - if _ownsref: - _whence = _interpreters.WHENCE_STDLIB - else: - _whence = _interpreters.whence(id) - assert _whence in cls._WHENCE_TO_STR, repr(_whence) - if _ownsref is None: - _ownsref = (_whence == _interpreters.WHENCE_STDLIB) - try: - self = _known[id] - assert hasattr(self, '_ownsref') - except KeyError: - self = super().__new__(cls) - _known[id] = self - self._id = id - self._whence = _whence - self._ownsref = _ownsref - if _ownsref: - # This may raise InterpreterNotFoundError: - _interpreters.incref(id) - return self - - def __repr__(self): - return f'{type(self).__name__}({self.id})' - - def __hash__(self): - return hash(self._id) - - def __del__(self): - self._decref() - - # for pickling: - def __reduce__(self): - return (type(self), (self._id,)) - - # gh-135729: Globals might be destroyed by the time this is called, so we - # need to keep references ourself - def _decref(self, *, - InterpreterNotFoundError=InterpreterNotFoundError, - _interp_decref=_interpreters.decref, - ): - if not self._ownsref: - return - self._ownsref = False - try: - _interp_decref(self._id) - except InterpreterNotFoundError: - pass - - @property - def id(self): - return self._id - - @property - def whence(self): - return self._WHENCE_TO_STR[self._whence] - - def is_running(self): - """Return whether or not the identified interpreter is running.""" - return _interpreters.is_running(self._id) - - # Everything past here is available only to interpreters created by - # interpreters.create(). - - def close(self): - """Finalize and destroy the interpreter. - - Attempting to destroy the current interpreter results - in an InterpreterError. - """ - return _interpreters.destroy(self._id, restrict=True) - - def prepare_main(self, ns=None, /, **kwargs): - """Bind the given values into the interpreter's __main__. - - The values must be shareable. - """ - ns = dict(ns, **kwargs) if ns is not None else kwargs - _interpreters.set___main___attrs(self._id, ns, restrict=True) - - def exec(self, code, /): - """Run the given source code in the interpreter. - - This is essentially the same as calling the builtin "exec" - with this interpreter, using the __dict__ of its __main__ - module as both globals and locals. - - There is no return value. - - If the code raises an unhandled exception then an ExecutionFailed - exception is raised, which summarizes the unhandled exception. - The actual exception is discarded because objects cannot be - shared between interpreters. - - This blocks the current Python thread until done. During - that time, the previous interpreter is allowed to run - in other threads. - """ - excinfo = _interpreters.exec(self._id, code, restrict=True) - if excinfo is not None: - raise ExecutionFailed(excinfo) - - def _call(self, callable, args, kwargs): - res, excinfo = _interpreters.call(self._id, callable, args, kwargs, restrict=True) - if excinfo is not None: - raise ExecutionFailed(excinfo) - return res - - def call(self, callable, /, *args, **kwargs): - """Call the object in the interpreter with given args/kwargs. - - Nearly all callables, args, kwargs, and return values are - supported. All "shareable" objects are supported, as are - "stateless" functions (meaning non-closures that do not use - any globals). This method will fall back to pickle. - - If the callable raises an exception then the error display - (including full traceback) is sent back between the interpreters - and an ExecutionFailed exception is raised, much like what - happens with Interpreter.exec(). - """ - return self._call(callable, args, kwargs) - - def call_in_thread(self, callable, /, *args, **kwargs): - """Return a new thread that calls the object in the interpreter. - - The return value and any raised exception are discarded. - """ - t = threading.Thread(target=self._call, args=(callable, args, kwargs)) - t.start() - return t diff --git a/Python314_4_x86_Template/Lib/concurrent/interpreters/_crossinterp.py b/Python314_4_x86_Template/Lib/concurrent/interpreters/_crossinterp.py deleted file mode 100644 index a5f46b20f..000000000 --- a/Python314_4_x86_Template/Lib/concurrent/interpreters/_crossinterp.py +++ /dev/null @@ -1,107 +0,0 @@ -"""Common code between queues and channels.""" - - -class ItemInterpreterDestroyed(Exception): - """Raised when trying to get an item whose interpreter was destroyed.""" - - -class classonly: - """A non-data descriptor that makes a value only visible on the class. - - This is like the "classmethod" builtin, but does not show up on - instances of the class. It may be used as a decorator. - """ - - def __init__(self, value): - self.value = value - self.getter = classmethod(value).__get__ - self.name = None - - def __set_name__(self, cls, name): - if self.name is not None: - raise TypeError('already used') - self.name = name - - def __get__(self, obj, cls): - if obj is not None: - raise AttributeError(self.name) - # called on the class - return self.getter(None, cls) - - -class UnboundItem: - """Represents a cross-interpreter item no longer bound to an interpreter. - - An item is unbound when the interpreter that added it to the - cross-interpreter container is destroyed. - """ - - __slots__ = () - - @classonly - def singleton(cls, kind, module, name='UNBOUND'): - doc = cls.__doc__ - if doc: - doc = doc.replace( - 'cross-interpreter container', kind, - ).replace( - 'cross-interpreter', kind, - ) - subclass = type( - f'Unbound{kind.capitalize()}Item', - (cls,), - { - "_MODULE": module, - "_NAME": name, - "__doc__": doc, - }, - ) - return object.__new__(subclass) - - _MODULE = __name__ - _NAME = 'UNBOUND' - - def __new__(cls): - raise Exception(f'use {cls._MODULE}.{cls._NAME}') - - def __repr__(self): - return f'{self._MODULE}.{self._NAME}' -# return f'interpreters._queues.UNBOUND' - - -UNBOUND = object.__new__(UnboundItem) -UNBOUND_ERROR = object() -UNBOUND_REMOVE = object() - -_UNBOUND_CONSTANT_TO_FLAG = { - UNBOUND_REMOVE: 1, - UNBOUND_ERROR: 2, - UNBOUND: 3, -} -_UNBOUND_FLAG_TO_CONSTANT = {v: k - for k, v in _UNBOUND_CONSTANT_TO_FLAG.items()} - - -def serialize_unbound(unbound): - op = unbound - try: - flag = _UNBOUND_CONSTANT_TO_FLAG[op] - except KeyError: - raise NotImplementedError(f'unsupported unbound replacement op {op!r}') - return flag, - - -def resolve_unbound(flag, exctype_destroyed): - try: - op = _UNBOUND_FLAG_TO_CONSTANT[flag] - except KeyError: - raise NotImplementedError(f'unsupported unbound replacement op {flag!r}') - if op is UNBOUND_REMOVE: - # "remove" not possible here - raise NotImplementedError - elif op is UNBOUND_ERROR: - raise exctype_destroyed("item's original interpreter destroyed") - elif op is UNBOUND: - return UNBOUND - else: - raise NotImplementedError(repr(op)) diff --git a/Python314_4_x86_Template/Lib/concurrent/interpreters/_queues.py b/Python314_4_x86_Template/Lib/concurrent/interpreters/_queues.py deleted file mode 100644 index 81ea1098d..000000000 --- a/Python314_4_x86_Template/Lib/concurrent/interpreters/_queues.py +++ /dev/null @@ -1,289 +0,0 @@ -"""Cross-interpreter Queues High Level Module.""" - -import pickle -import queue -import time -import weakref -import _interpqueues as _queues -from . import _crossinterp - -# aliases: -from _interpqueues import ( - QueueError, QueueNotFoundError, -) -from ._crossinterp import ( - UNBOUND_ERROR, UNBOUND_REMOVE, -) - -__all__ = [ - 'UNBOUND', 'UNBOUND_ERROR', 'UNBOUND_REMOVE', - 'create', 'list_all', - 'Queue', - 'QueueError', 'QueueNotFoundError', 'QueueEmpty', 'QueueFull', - 'ItemInterpreterDestroyed', -] - - -class QueueEmpty(QueueError, queue.Empty): - """Raised from get_nowait() when the queue is empty. - - It is also raised from get() if it times out. - """ - - -class QueueFull(QueueError, queue.Full): - """Raised from put_nowait() when the queue is full. - - It is also raised from put() if it times out. - """ - - -class ItemInterpreterDestroyed(QueueError, - _crossinterp.ItemInterpreterDestroyed): - """Raised from get() and get_nowait().""" - - -_SHARED_ONLY = 0 -_PICKLED = 1 - - -UNBOUND = _crossinterp.UnboundItem.singleton('queue', __name__) - - -def _serialize_unbound(unbound): - if unbound is UNBOUND: - unbound = _crossinterp.UNBOUND - return _crossinterp.serialize_unbound(unbound) - - -def _resolve_unbound(flag): - resolved = _crossinterp.resolve_unbound(flag, ItemInterpreterDestroyed) - if resolved is _crossinterp.UNBOUND: - resolved = UNBOUND - return resolved - - -def create(maxsize=0, *, unbounditems=UNBOUND): - """Return a new cross-interpreter queue. - - The queue may be used to pass data safely between interpreters. - - "unbounditems" sets the default for Queue.put(); see that method for - supported values. The default value is UNBOUND, which replaces - the unbound item. - """ - unbound = _serialize_unbound(unbounditems) - unboundop, = unbound - qid = _queues.create(maxsize, unboundop, -1) - self = Queue(qid) - self._set_unbound(unboundop, unbounditems) - return self - - -def list_all(): - """Return a list of all open queues.""" - queues = [] - for qid, unboundop, _ in _queues.list_all(): - self = Queue(qid) - if not hasattr(self, '_unbound'): - self._set_unbound(unboundop) - else: - assert self._unbound[0] == unboundop - queues.append(self) - return queues - - -_known_queues = weakref.WeakValueDictionary() - -class Queue: - """A cross-interpreter queue.""" - - def __new__(cls, id, /): - # There is only one instance for any given ID. - if isinstance(id, int): - id = int(id) - else: - raise TypeError(f'id must be an int, got {id!r}') - try: - self = _known_queues[id] - except KeyError: - self = super().__new__(cls) - self._id = id - _known_queues[id] = self - _queues.bind(id) - return self - - def __del__(self): - try: - _queues.release(self._id) - except QueueNotFoundError: - pass - try: - del _known_queues[self._id] - except KeyError: - pass - - def __repr__(self): - return f'{type(self).__name__}({self.id})' - - def __hash__(self): - return hash(self._id) - - # for pickling: - def __reduce__(self): - return (type(self), (self._id,)) - - def _set_unbound(self, op, items=None): - assert not hasattr(self, '_unbound') - if items is None: - items = _resolve_unbound(op) - unbound = (op, items) - self._unbound = unbound - return unbound - - @property - def id(self): - return self._id - - @property - def unbounditems(self): - try: - _, items = self._unbound - except AttributeError: - op, _ = _queues.get_queue_defaults(self._id) - _, items = self._set_unbound(op) - return items - - @property - def maxsize(self): - try: - return self._maxsize - except AttributeError: - self._maxsize = _queues.get_maxsize(self._id) - return self._maxsize - - def empty(self): - return self.qsize() == 0 - - def full(self): - return _queues.is_full(self._id) - - def qsize(self): - return _queues.get_count(self._id) - - def put(self, obj, block=True, timeout=None, *, - unbounditems=None, - _delay=10 / 1000, # 10 milliseconds - ): - """Add the object to the queue. - - If "block" is true, this blocks while the queue is full. - - For most objects, the object received through Queue.get() will - be a new one, equivalent to the original and not sharing any - actual underlying data. The notable exceptions include - cross-interpreter types (like Queue) and memoryview, where the - underlying data is actually shared. Furthermore, some types - can be sent through a queue more efficiently than others. This - group includes various immutable types like int, str, bytes, and - tuple (if the items are likewise efficiently shareable). See interpreters.is_shareable(). - - "unbounditems" controls the behavior of Queue.get() for the given - object if the current interpreter (calling put()) is later - destroyed. - - If "unbounditems" is None (the default) then it uses the - queue's default, set with create_queue(), - which is usually UNBOUND. - - If "unbounditems" is UNBOUND_ERROR then get() will raise an - ItemInterpreterDestroyed exception if the original interpreter - has been destroyed. This does not otherwise affect the queue; - the next call to put() will work like normal, returning the next - item in the queue. - - If "unbounditems" is UNBOUND_REMOVE then the item will be removed - from the queue as soon as the original interpreter is destroyed. - Be aware that this will introduce an imbalance between put() - and get() calls. - - If "unbounditems" is UNBOUND then it is returned by get() in place - of the unbound item. - """ - if not block: - return self.put_nowait(obj, unbounditems=unbounditems) - if unbounditems is None: - unboundop = -1 - else: - unboundop, = _serialize_unbound(unbounditems) - if timeout is not None: - timeout = int(timeout) - if timeout < 0: - raise ValueError(f'timeout value must be non-negative') - end = time.time() + timeout - while True: - try: - _queues.put(self._id, obj, unboundop) - except QueueFull as exc: - if timeout is not None and time.time() >= end: - raise # re-raise - time.sleep(_delay) - else: - break - - def put_nowait(self, obj, *, unbounditems=None): - if unbounditems is None: - unboundop = -1 - else: - unboundop, = _serialize_unbound(unbounditems) - _queues.put(self._id, obj, unboundop) - - def get(self, block=True, timeout=None, *, - _delay=10 / 1000, # 10 milliseconds - ): - """Return the next object from the queue. - - If "block" is true, this blocks while the queue is empty. - - If the next item's original interpreter has been destroyed - then the "next object" is determined by the value of the - "unbounditems" argument to put(). - """ - if not block: - return self.get_nowait() - if timeout is not None: - timeout = int(timeout) - if timeout < 0: - raise ValueError(f'timeout value must be non-negative') - end = time.time() + timeout - while True: - try: - obj, unboundop = _queues.get(self._id) - except QueueEmpty as exc: - if timeout is not None and time.time() >= end: - raise # re-raise - time.sleep(_delay) - else: - break - if unboundop is not None: - assert obj is None, repr(obj) - return _resolve_unbound(unboundop) - return obj - - def get_nowait(self): - """Return the next object from the channel. - - If the queue is empty then raise QueueEmpty. Otherwise this - is the same as get(). - """ - try: - obj, unboundop = _queues.get(self._id) - except QueueEmpty as exc: - raise # re-raise - if unboundop is not None: - assert obj is None, repr(obj) - return _resolve_unbound(unboundop) - return obj - - -_queues._register_heap_types(Queue, QueueEmpty, QueueFull) diff --git a/Python314_4_x86_Template/Lib/configparser.py b/Python314_4_x86_Template/Lib/configparser.py deleted file mode 100644 index d435a5c2f..000000000 --- a/Python314_4_x86_Template/Lib/configparser.py +++ /dev/null @@ -1,1415 +0,0 @@ -"""Configuration file parser. - -A configuration file consists of sections, lead by a "[section]" header, -and followed by "name: value" entries, with continuations and such in -the style of RFC 822. - -Intrinsic defaults can be specified by passing them into the -ConfigParser constructor as a dictionary. - -class: - -ConfigParser -- responsible for parsing a list of - configuration files, and managing the parsed database. - - methods: - - __init__(defaults=None, dict_type=_default_dict, allow_no_value=False, - delimiters=('=', ':'), comment_prefixes=('#', ';'), - inline_comment_prefixes=None, strict=True, - empty_lines_in_values=True, default_section='DEFAULT', - interpolation=, converters=, - allow_unnamed_section=False): - Create the parser. When `defaults` is given, it is initialized into the - dictionary or intrinsic defaults. The keys must be strings, the values - must be appropriate for %()s string interpolation. - - When `dict_type` is given, it will be used to create the dictionary - objects for the list of sections, for the options within a section, and - for the default values. - - When `delimiters` is given, it will be used as the set of substrings - that divide keys from values. - - When `comment_prefixes` is given, it will be used as the set of - substrings that prefix comments in empty lines. Comments can be - indented. - - When `inline_comment_prefixes` is given, it will be used as the set of - substrings that prefix comments in non-empty lines. - - When `strict` is True, the parser won't allow for any section or option - duplicates while reading from a single source (file, string or - dictionary). Default is True. - - When `empty_lines_in_values` is False (default: True), each empty line - marks the end of an option. Otherwise, internal empty lines of - a multiline option are kept as part of the value. - - When `allow_no_value` is True (default: False), options without - values are accepted; the value presented for these is None. - - When `default_section` is given, the name of the special section is - named accordingly. By default it is called ``"DEFAULT"`` but this can - be customized to point to any other valid section name. Its current - value can be retrieved using the ``parser_instance.default_section`` - attribute and may be modified at runtime. - - When `interpolation` is given, it should be an Interpolation subclass - instance. It will be used as the handler for option value - pre-processing when using getters. RawConfigParser objects don't do - any sort of interpolation, whereas ConfigParser uses an instance of - BasicInterpolation. The library also provides a ``zc.buildout`` - inspired ExtendedInterpolation implementation. - - When `converters` is given, it should be a dictionary where each key - represents the name of a type converter and each value is a callable - implementing the conversion from string to the desired datatype. Every - converter gets its corresponding get*() method on the parser object and - section proxies. - - When `allow_unnamed_section` is True (default: False), options - without section are accepted: the section for these is - ``configparser.UNNAMED_SECTION``. - - sections() - Return all the configuration section names, sans DEFAULT. - - has_section(section) - Return whether the given section exists. - - has_option(section, option) - Return whether the given option exists in the given section. - - options(section) - Return list of configuration options for the named section. - - read(filenames, encoding=None) - Read and parse the iterable of named configuration files, given by - name. A single filename is also allowed. Non-existing files - are ignored. Return list of successfully read files. - - read_file(f, filename=None) - Read and parse one configuration file, given as a file object. - The filename defaults to f.name; it is only used in error - messages (if f has no `name` attribute, the string `` is used). - - read_string(string) - Read configuration from a given string. - - read_dict(dictionary) - Read configuration from a dictionary. Keys are section names, - values are dictionaries with keys and values that should be present - in the section. If the used dictionary type preserves order, sections - and their keys will be added in order. Values are automatically - converted to strings. - - get(section, option, raw=False, vars=None, fallback=_UNSET) - Return a string value for the named option. All % interpolations are - expanded in the return values, based on the defaults passed into the - constructor and the DEFAULT section. Additional substitutions may be - provided using the `vars` argument, which must be a dictionary whose - contents override any pre-existing defaults. If `option` is a key in - `vars`, the value from `vars` is used. - - getint(section, options, raw=False, vars=None, fallback=_UNSET) - Like get(), but convert value to an integer. - - getfloat(section, options, raw=False, vars=None, fallback=_UNSET) - Like get(), but convert value to a float. - - getboolean(section, options, raw=False, vars=None, fallback=_UNSET) - Like get(), but convert value to a boolean (currently case - insensitively defined as 0, false, no, off for False, and 1, true, - yes, on for True). Returns False or True. - - items(section=_UNSET, raw=False, vars=None) - If section is given, return a list of tuples with (name, value) for - each option in the section. Otherwise, return a list of tuples with - (section_name, section_proxy) for each section, including DEFAULTSECT. - - remove_section(section) - Remove the given file section and all its options. - - remove_option(section, option) - Remove the given option from the given section. - - set(section, option, value) - Set the given option. - - write(fp, space_around_delimiters=True) - Write the configuration state in .ini format. If - `space_around_delimiters` is True (the default), delimiters - between keys and values are surrounded by spaces. -""" - -# Do not import dataclasses; overhead is unacceptable (gh-117703) - -from collections.abc import Iterable, MutableMapping -from collections import ChainMap as _ChainMap -import contextlib -import functools -import io -import itertools -import os -import re -import sys - -__all__ = ("NoSectionError", "DuplicateOptionError", "DuplicateSectionError", - "NoOptionError", "InterpolationError", "InterpolationDepthError", - "InterpolationMissingOptionError", "InterpolationSyntaxError", - "ParsingError", "MissingSectionHeaderError", - "MultilineContinuationError", "UnnamedSectionDisabledError", - "InvalidWriteError", "ConfigParser", "RawConfigParser", - "Interpolation", "BasicInterpolation", "ExtendedInterpolation", - "SectionProxy", "ConverterMapping", - "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH", "UNNAMED_SECTION") - -_default_dict = dict -DEFAULTSECT = "DEFAULT" - -MAX_INTERPOLATION_DEPTH = 10 - - - -# exception classes -class Error(Exception): - """Base class for ConfigParser exceptions.""" - - def __init__(self, msg=''): - self.message = msg - Exception.__init__(self, msg) - - def __repr__(self): - return self.message - - __str__ = __repr__ - - -class NoSectionError(Error): - """Raised when no section matches a requested option.""" - - def __init__(self, section): - Error.__init__(self, 'No section: %r' % (section,)) - self.section = section - self.args = (section, ) - - -class DuplicateSectionError(Error): - """Raised when a section is repeated in an input source. - - Possible repetitions that raise this exception are: multiple creation - using the API or in strict parsers when a section is found more than once - in a single input file, string or dictionary. - """ - - def __init__(self, section, source=None, lineno=None): - msg = [repr(section), " already exists"] - if source is not None: - message = ["While reading from ", repr(source)] - if lineno is not None: - message.append(" [line {0:2d}]".format(lineno)) - message.append(": section ") - message.extend(msg) - msg = message - else: - msg.insert(0, "Section ") - Error.__init__(self, "".join(msg)) - self.section = section - self.source = source - self.lineno = lineno - self.args = (section, source, lineno) - - -class DuplicateOptionError(Error): - """Raised by strict parsers when an option is repeated in an input source. - - Current implementation raises this exception only when an option is found - more than once in a single file, string or dictionary. - """ - - def __init__(self, section, option, source=None, lineno=None): - msg = [repr(option), " in section ", repr(section), - " already exists"] - if source is not None: - message = ["While reading from ", repr(source)] - if lineno is not None: - message.append(" [line {0:2d}]".format(lineno)) - message.append(": option ") - message.extend(msg) - msg = message - else: - msg.insert(0, "Option ") - Error.__init__(self, "".join(msg)) - self.section = section - self.option = option - self.source = source - self.lineno = lineno - self.args = (section, option, source, lineno) - - -class NoOptionError(Error): - """A requested option was not found.""" - - def __init__(self, option, section): - Error.__init__(self, "No option %r in section: %r" % - (option, section)) - self.option = option - self.section = section - self.args = (option, section) - - -class InterpolationError(Error): - """Base class for interpolation-related exceptions.""" - - def __init__(self, option, section, msg): - Error.__init__(self, msg) - self.option = option - self.section = section - self.args = (option, section, msg) - - -class InterpolationMissingOptionError(InterpolationError): - """A string substitution required a setting which was not available.""" - - def __init__(self, option, section, rawval, reference): - msg = ("Bad value substitution: option {!r} in section {!r} contains " - "an interpolation key {!r} which is not a valid option name. " - "Raw value: {!r}".format(option, section, reference, rawval)) - InterpolationError.__init__(self, option, section, msg) - self.reference = reference - self.args = (option, section, rawval, reference) - - -class InterpolationSyntaxError(InterpolationError): - """Raised when the source text contains invalid syntax. - - Current implementation raises this exception when the source text into - which substitutions are made does not conform to the required syntax. - """ - - -class InterpolationDepthError(InterpolationError): - """Raised when substitutions are nested too deeply.""" - - def __init__(self, option, section, rawval): - msg = ("Recursion limit exceeded in value substitution: option {!r} " - "in section {!r} contains an interpolation key which " - "cannot be substituted in {} steps. Raw value: {!r}" - "".format(option, section, MAX_INTERPOLATION_DEPTH, - rawval)) - InterpolationError.__init__(self, option, section, msg) - self.args = (option, section, rawval) - - -class ParsingError(Error): - """Raised when a configuration file does not follow legal syntax.""" - - def __init__(self, source, *args): - super().__init__(f'Source contains parsing errors: {source!r}') - self.source = source - self.errors = [] - self.args = (source, ) - if args: - self.append(*args) - - def append(self, lineno, line): - self.errors.append((lineno, line)) - self.message += '\n\t[line %2d]: %s' % (lineno, repr(line)) - - def combine(self, others): - for other in others: - for error in other.errors: - self.append(*error) - return self - - @staticmethod - def _raise_all(exceptions: Iterable['ParsingError']): - """ - Combine any number of ParsingErrors into one and raise it. - """ - exceptions = iter(exceptions) - with contextlib.suppress(StopIteration): - raise next(exceptions).combine(exceptions) - - - -class MissingSectionHeaderError(ParsingError): - """Raised when a key-value pair is found before any section header.""" - - def __init__(self, filename, lineno, line): - Error.__init__( - self, - 'File contains no section headers.\nfile: %r, line: %d\n%r' % - (filename, lineno, line)) - self.source = filename - self.lineno = lineno - self.line = line - self.args = (filename, lineno, line) - - -class MultilineContinuationError(ParsingError): - """Raised when a key without value is followed by continuation line""" - def __init__(self, filename, lineno, line): - Error.__init__( - self, - "Key without value continued with an indented line.\n" - "file: %r, line: %d\n%r" - %(filename, lineno, line)) - self.source = filename - self.lineno = lineno - self.line = line - self.args = (filename, lineno, line) - - -class UnnamedSectionDisabledError(Error): - """Raised when an attempt to use UNNAMED_SECTION is made with the - feature disabled.""" - def __init__(self): - Error.__init__(self, "Support for UNNAMED_SECTION is disabled.") - - -class _UnnamedSection: - - def __repr__(self): - return "" - -class InvalidWriteError(Error): - """Raised when attempting to write data that the parser would read back differently. - ex: writing a key which begins with the section header pattern would read back as a - new section """ - - def __init__(self, msg=''): - Error.__init__(self, msg) - - -UNNAMED_SECTION = _UnnamedSection() - - -# Used in parser getters to indicate the default behaviour when a specific -# option is not found it to raise an exception. Created to enable `None` as -# a valid fallback value. -_UNSET = object() - - -class Interpolation: - """Dummy interpolation that passes the value through with no changes.""" - - def before_get(self, parser, section, option, value, defaults): - return value - - def before_set(self, parser, section, option, value): - return value - - def before_read(self, parser, section, option, value): - return value - - def before_write(self, parser, section, option, value): - return value - - -class BasicInterpolation(Interpolation): - """Interpolation as implemented in the classic ConfigParser. - - The option values can contain format strings which refer to other values in - the same section, or values in the special default section. - - For example: - - something: %(dir)s/whatever - - would resolve the "%(dir)s" to the value of dir. All reference - expansions are done late, on demand. If a user needs to use a bare % in - a configuration file, she can escape it by writing %%. Other % usage - is considered a user error and raises `InterpolationSyntaxError`.""" - - _KEYCRE = re.compile(r"%\(([^)]+)\)s") - - def before_get(self, parser, section, option, value, defaults): - L = [] - self._interpolate_some(parser, option, L, value, section, defaults, 1) - return ''.join(L) - - def before_set(self, parser, section, option, value): - tmp_value = value.replace('%%', '') # escaped percent signs - tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax - if '%' in tmp_value: - raise ValueError("invalid interpolation syntax in %r at " - "position %d" % (value, tmp_value.find('%'))) - return value - - def _interpolate_some(self, parser, option, accum, rest, section, map, - depth): - rawval = parser.get(section, option, raw=True, fallback=rest) - if depth > MAX_INTERPOLATION_DEPTH: - raise InterpolationDepthError(option, section, rawval) - while rest: - p = rest.find("%") - if p < 0: - accum.append(rest) - return - if p > 0: - accum.append(rest[:p]) - rest = rest[p:] - # p is no longer used - c = rest[1:2] - if c == "%": - accum.append("%") - rest = rest[2:] - elif c == "(": - m = self._KEYCRE.match(rest) - if m is None: - raise InterpolationSyntaxError(option, section, - "bad interpolation variable reference %r" % rest) - var = parser.optionxform(m.group(1)) - rest = rest[m.end():] - try: - v = map[var] - except KeyError: - raise InterpolationMissingOptionError( - option, section, rawval, var) from None - if "%" in v: - self._interpolate_some(parser, option, accum, v, - section, map, depth + 1) - else: - accum.append(v) - else: - raise InterpolationSyntaxError( - option, section, - "'%%' must be followed by '%%' or '(', " - "found: %r" % (rest,)) - - -class ExtendedInterpolation(Interpolation): - """Advanced variant of interpolation, supports the syntax used by - `zc.buildout`. Enables interpolation between sections.""" - - _KEYCRE = re.compile(r"\$\{([^}]+)\}") - - def before_get(self, parser, section, option, value, defaults): - L = [] - self._interpolate_some(parser, option, L, value, section, defaults, 1) - return ''.join(L) - - def before_set(self, parser, section, option, value): - tmp_value = value.replace('$$', '') # escaped dollar signs - tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax - if '$' in tmp_value: - raise ValueError("invalid interpolation syntax in %r at " - "position %d" % (value, tmp_value.find('$'))) - return value - - def _interpolate_some(self, parser, option, accum, rest, section, map, - depth): - rawval = parser.get(section, option, raw=True, fallback=rest) - if depth > MAX_INTERPOLATION_DEPTH: - raise InterpolationDepthError(option, section, rawval) - while rest: - p = rest.find("$") - if p < 0: - accum.append(rest) - return - if p > 0: - accum.append(rest[:p]) - rest = rest[p:] - # p is no longer used - c = rest[1:2] - if c == "$": - accum.append("$") - rest = rest[2:] - elif c == "{": - m = self._KEYCRE.match(rest) - if m is None: - raise InterpolationSyntaxError(option, section, - "bad interpolation variable reference %r" % rest) - path = m.group(1).split(':') - rest = rest[m.end():] - sect = section - opt = option - try: - if len(path) == 1: - opt = parser.optionxform(path[0]) - v = map[opt] - elif len(path) == 2: - sect = path[0] - opt = parser.optionxform(path[1]) - v = parser.get(sect, opt, raw=True) - else: - raise InterpolationSyntaxError( - option, section, - "More than one ':' found: %r" % (rest,)) - except (KeyError, NoSectionError, NoOptionError): - raise InterpolationMissingOptionError( - option, section, rawval, ":".join(path)) from None - if v is None: - continue - if "$" in v: - self._interpolate_some(parser, opt, accum, v, sect, - dict(parser.items(sect, raw=True)), - depth + 1) - else: - accum.append(v) - else: - raise InterpolationSyntaxError( - option, section, - "'$' must be followed by '$' or '{', " - "found: %r" % (rest,)) - - -class _ReadState: - elements_added : set[str] - cursect : dict[str, str] | None = None - sectname : str | None = None - optname : str | None = None - lineno : int = 0 - indent_level : int = 0 - errors : list[ParsingError] - - def __init__(self): - self.elements_added = set() - self.errors = list() - - -class _Line(str): - __slots__ = 'clean', 'has_comments' - - def __new__(cls, val, *args, **kwargs): - return super().__new__(cls, val) - - def __init__(self, val, comments): - trimmed = val.strip() - self.clean = comments.strip(trimmed) - self.has_comments = trimmed != self.clean - - -class _CommentSpec: - def __init__(self, full_prefixes, inline_prefixes): - full_patterns = ( - # prefix at the beginning of a line - fr'^({re.escape(prefix)}).*' - for prefix in full_prefixes - ) - inline_patterns = ( - # prefix at the beginning of the line or following a space - fr'(^|\s)({re.escape(prefix)}.*)' - for prefix in inline_prefixes - ) - self.pattern = re.compile('|'.join(itertools.chain(full_patterns, inline_patterns))) - - def strip(self, text): - return self.pattern.sub('', text).rstrip() - - def wrap(self, text): - return _Line(text, self) - - -class RawConfigParser(MutableMapping): - """ConfigParser that does not do interpolation.""" - - # Regular expressions for parsing section headers and options - _SECT_TMPL = r""" - \[ # [ - (?P
.+) # very permissive! - \] # ] - """ - _OPT_TMPL = r""" - (?P